<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: neild</title><link>https://news.ycombinator.com/user?id=neild</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 04 Jul 2026 06:07:14 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=neild" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by neild in "IPv6 zones in URLs are a mistake"]]></title><description><![CDATA[
<p>Fair enough, but that leaves us with no way to represent zone IDs in URLs at all. Neither http://[fe80::4%eth0]/ nor http://[fe80::4%25eth0]/ is valid under RFC 3986.<p>Given that net/url has supported RFC 6874 since before RFC 9844 came along, our choices are:<p>* Keep supporting the RFC 6874 syntax.<p>* Drop support for it, require strict RFC 3986, have no support for zone IDs in URLs at all. Breaks existing users, utterly infeasible.<p>* Stop supporting RFC 6875 and start supporting an unescaped % as the zone ID separator, which conforms to no standard I know of. Also breaks existing users, infeasible.<p>* Some sort of hybrid where we try to support both %25 and % as a separator? Ugh.<p>Of these, keeping the existing support as-is until or unless a new standard comes along seems like the best option.</p>
]]></description><pubDate>Thu, 04 Jun 2026 23:55:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=48406281</link><dc:creator>neild</dc:creator><comments>https://news.ycombinator.com/item?id=48406281</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48406281</guid></item><item><title><![CDATA[New comment by neild in "IPv6 zones in URLs are a mistake"]]></title><description><![CDATA[
<p>> In theory, there is guidance for how to properly handle IPv6 zones in user interfaces in RFC 9884, but there's no such guidance for URLs.<p>RFC 6874: Representing IPv6 Zone Identifiers in Address Literals and Uniform Resource Identifiers
(<a href="https://www.rfc-editor.org/rfc/rfc6874.html" rel="nofollow">https://www.rfc-editor.org/rfc/rfc6874.html</a>)<p>Which says that, yes, you need to %-encode the %, so a URL containing a host of fe80::4%eth0 becomes http://[fe80::4%25eth0]/. Yes, that's ugly. Sorry.<p>> TL;DR: computers were a mistake.<p>I agree entirely.<p>(For what it's worth, I am a maintainer of Go's net/url package, and I believe net/url correctly handles zone ids in URLs. It's always possible there's something wrong I'm not aware of. Please let me know if there is!)</p>
]]></description><pubDate>Thu, 04 Jun 2026 22:46:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=48405709</link><dc:creator>neild</dc:creator><comments>https://news.ycombinator.com/item?id=48405709</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48405709</guid></item><item><title><![CDATA[New comment by neild in "HP trialed mandatory 15-minute support call wait times (2025)"]]></title><description><![CDATA[
<p>Mint (T-Mobile MVNO) has been great for me, $20/month/line and my one experience with international travel was good ($20 for 10 days). I used to be on Verizon and the quality of service doesn’t seem any worse while the price is dramatically lower.</p>
]]></description><pubDate>Fri, 20 Mar 2026 18:51:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=47458938</link><dc:creator>neild</dc:creator><comments>https://news.ycombinator.com/item?id=47458938</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47458938</guid></item><item><title><![CDATA[New comment by neild in "AirPods Max 2"]]></title><description><![CDATA[
<p>Sounds ridiculous, but worked on mine! So far, the fix has stuck, too.</p>
]]></description><pubDate>Mon, 16 Mar 2026 20:25:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=47404394</link><dc:creator>neild</dc:creator><comments>https://news.ycombinator.com/item?id=47404394</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47404394</guid></item><item><title><![CDATA[New comment by neild in "Losing 1½ Million Lines of Go"]]></title><description><![CDATA[
<p>Much more prosaic (if slightly embarrassing), I'm afraid: The update was non-trivial (this CL is simple, but there are some accompanying ones in x/text which are not) and it didn't hit the top of the priority list for anyone who understands x/text.<p>Go is pretty much entirely developed in public; there are some Google-internal customizations but none of them are particularly exciting and almost all changes start in the open source repo and are imported from there.</p>
]]></description><pubDate>Sat, 24 Jan 2026 05:27:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=46741317</link><dc:creator>neild</dc:creator><comments>https://news.ycombinator.com/item?id=46741317</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46741317</guid></item><item><title><![CDATA[New comment by neild in "Go.sum is not a lockfile"]]></title><description><![CDATA[
<p>To be very pedantic, there are two separate services: The module proxy (proxy.golang.org) serves cached modules and makes no guarantees about how long cache entries are kept. The sum database (sum.golang.org) serves module checksums, which are kept forever in a Merkle tree/transparency log.</p>
]]></description><pubDate>Thu, 08 Jan 2026 15:59:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=46542517</link><dc:creator>neild</dc:creator><comments>https://news.ycombinator.com/item?id=46542517</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46542517</guid></item><item><title><![CDATA[New comment by neild in "Go's Sweet 16"]]></title><description><![CDATA[
<p>0600 and 0_600 are octal literals:<p><pre><code>    octal_lit      = "0" [ "o" | "O" ] [ "_" ] octal_digits .</code></pre></p>
]]></description><pubDate>Sat, 15 Nov 2025 16:27:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=45938514</link><dc:creator>neild</dc:creator><comments>https://news.ycombinator.com/item?id=45938514</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45938514</guid></item><item><title><![CDATA[New comment by neild in "Blood oxygen monitoring returning to Apple Watch in the US"]]></title><description><![CDATA[
<p>In my experience, the Apple Watch blood oxygen monitoring was horribly inaccurate. It would report wildly variable results, often telling me that I had a blood oxygen level of 80% (which, if true, would indicate that I should be getting myself to an emergency room ASAP).<p>Regular pulse oxygen meters are cheap and reliable.</p>
]]></description><pubDate>Thu, 14 Aug 2025 16:39:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=44902552</link><dc:creator>neild</dc:creator><comments>https://news.ycombinator.com/item?id=44902552</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44902552</guid></item><item><title><![CDATA[New comment by neild in "Go 1.25 Release Notes"]]></title><description><![CDATA[
<p>It means we're not confident the API is stable yet. There might be further changes before the final, non-experimental version, depending on user feedback and further experience with the current proposal.<p>In the case of encoding/json/v2, enabling GOEXPERIMENT=jsonv2 has two major effects:<p>1. It flips encoding/json (the original, not /v2) to use the new implementation. This is supposed to be a fully backwards-compatible change, modulo some changes to the text of some errors. We're <i>very</i> interested to hear of any cases of existing programs breaking when the experiment is turned on, because (aside from the aforementioned error text, which you shouldn't be depending on) it likely indicates a bug that needs fixing. This is the "new code, please test" half of the change.<p>2. It enables the new API (encoding/json/v2, encoding/json/jsontext, some new options in encoding/json). This is the "unstable API, might change in response to feedback" half of the change.</p>
]]></description><pubDate>Wed, 13 Aug 2025 21:17:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=44893958</link><dc:creator>neild</dc:creator><comments>https://news.ycombinator.com/item?id=44893958</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44893958</guid></item><item><title><![CDATA[New comment by neild in "(On | No) Syntactic Support for Error Handling"]]></title><description><![CDATA[
<p>> I really don't like how this article claims that the primary issue with Go's error handling is that the syntax is too verbose.<p>I don't believe this claim is made anywhere.<p>We've decided that we are not going to make any further attempts to change the syntax of error handling in the foreseeable future. That frees up attention to consider other issues (with errors or otherwise).</p>
]]></description><pubDate>Tue, 03 Jun 2025 19:36:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=44173772</link><dc:creator>neild</dc:creator><comments>https://news.ycombinator.com/item?id=44173772</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44173772</guid></item><item><title><![CDATA[New comment by neild in "Car companies are in a billion-dollar software war"]]></title><description><![CDATA[
<p>I have a 2024 Kia EV6, and this is pretty much what it does: Central screen displays CarPlay, backup camera, and infrequently-used settings controls, dials and knobs for most things, one secondary touchbar (row of buttons, but it’s really a touchscreen so the buttons can change) for climate controls. Pretty much perfect, although only wired CarPlay. (The 2025 models apparently have wireless.)</p>
]]></description><pubDate>Sun, 11 May 2025 23:15:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=43958094</link><dc:creator>neild</dc:creator><comments>https://news.ycombinator.com/item?id=43958094</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43958094</guid></item><item><title><![CDATA[New comment by neild in "Japan Offers Free Daycare to Boost Tokyo's Falling Birth Rate"]]></title><description><![CDATA[
<p>> I say this not to be flippant or sarcastic but rather to ask how our ancestors seemed fine with the above but we seem less so?<p>Because by and large our female ancestors raised the children, were offered no choice in whether to raise the children, and their opinions of the situation were not recorded.</p>
]]></description><pubDate>Tue, 21 Jan 2025 03:40:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=42776335</link><dc:creator>neild</dc:creator><comments>https://news.ycombinator.com/item?id=42776335</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42776335</guid></item><item><title><![CDATA[New comment by neild in "Oh Shit, Git?"]]></title><description><![CDATA[
<p>The "move a branch from one commit to another without changing anything" command is "git reset".<p>"git reset --hard" is "...and also change all the files in the working directory to match the new branch commit".<p>"git reset --soft" is "...but leave the working directory alone".</p>
]]></description><pubDate>Thu, 16 Jan 2025 19:49:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=42729992</link><dc:creator>neild</dc:creator><comments>https://news.ycombinator.com/item?id=42729992</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42729992</guid></item><item><title><![CDATA[New comment by neild in "Cooking with black plastic is particularly crucial to avoid"]]></title><description><![CDATA[
<p>I do almost all my cooking on cast iron—no philosophical reason, it just works well and once I figured out how to use it I found that I pretty much always reach for a cast iron pan over stainless steel or non-stick. (Except non-stick for omelettes and stainless steel for anything where I want the find.)<p>My big realization was that there’s a lot of macho information there about the care of cast iron, and it’s pretty much all pointless because the stuff is indestructible and the seasoning doesn’t matter much. Every time I make tortillas in a pan the seasoning gets wrecked, and it’s just not a problem. So long as you get the pan to the right temp and have enough fat, nothing sticks regardless of the quality of the seasoning. Skimp on the oil or set the temp too low, and stuff sticks no matter how good the seasoning.<p>I wash the pans with soap and water (and not too much scrubbing), I never season them deliberately, and they work wonderfully. It’s a very forgiving cooking surface.</p>
]]></description><pubDate>Thu, 31 Oct 2024 16:19:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=42008381</link><dc:creator>neild</dc:creator><comments>https://news.ycombinator.com/item?id=42008381</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42008381</guid></item><item><title><![CDATA[New comment by neild in "Show HN: Pocache, preemptive optimistic caching for Go"]]></title><description><![CDATA[
<p>A non-blocking send doesn't work in this case. Consider: User provides DoChan an unbuffered channel, and then reads a value from it. If the send is nonblocking and occurs before the user reads from the channel, the value is lost.</p>
]]></description><pubDate>Fri, 11 Oct 2024 21:27:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=41813914</link><dc:creator>neild</dc:creator><comments>https://news.ycombinator.com/item?id=41813914</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41813914</guid></item><item><title><![CDATA[New comment by neild in "Show HN: Pocache, preemptive optimistic caching for Go"]]></title><description><![CDATA[
<p>Returning a channel avoids questions of what happens if sending to a caller-supplied channel blocks. DoChan returns a channel with a single-element buffer, so a single send to the channel will always succeed without blocking, even if the caller has lost interest in the result and discarded the channel.<p>DoChan doesn't close the channel because there isn't any reason to do so.</p>
]]></description><pubDate>Fri, 11 Oct 2024 19:32:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=41812752</link><dc:creator>neild</dc:creator><comments>https://news.ycombinator.com/item?id=41812752</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41812752</guid></item><item><title><![CDATA[New comment by neild in "Quartz: A Deterministic Time Testing Library for Go"]]></title><description><![CDATA[
<p>Of possible interest to anyone testing concurrent Go code in general and time in particular, a proposed standard library package: <a href="https://go.dev/issue/67434" rel="nofollow">https://go.dev/issue/67434</a></p>
]]></description><pubDate>Mon, 15 Jul 2024 21:05:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=40971457</link><dc:creator>neild</dc:creator><comments>https://news.ycombinator.com/item?id=40971457</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40971457</guid></item><item><title><![CDATA[New comment by neild in "Go: Sentinel errors and errors.Is() slow your code down by 3000%"]]></title><description><![CDATA[
<p>There are some interesting results in here, but the slower cases are a bit misleading. The majority of time in the slow cases is spent constructing errors, not in errors.Is.<p>Some background for anyone not familiar with Go errors:<p>A Go error is an interface value with an Error method that returns the error's text. A simple error can be constructed with the errors.New function:<p><pre><code>  var ErrNotFound = errors.New("not found")
</code></pre>
A nil error indicates success, and a non-nil error indicates some other condition. This is the infamous "if err != nil {}" check. Comparing an error to nil is pretty fast, since it's just a single pointer comparison. On my laptop, it's about 0.5ns. Comparing a bool is about 0.3ns, so "err != nil" is quite a bit slower than "!found", but it's really unlikely the 0.2ns is going to be relevant outside of extremely hot loops.<p>We can also compare an error to some value: "if err == ErrNotFound {}". In this case, we say that ErrNotFound is a "sentinel" (some error value that you compare against). This is about 2.3ns on my laptop; there are two pointer comparisons in this case and a bit more overhead in comparing interface values. (You can actually make this check almost arbitrarily expensive; you could have an error value that's a gigabyte-large array, for example.)<p>It's common to annotate an error, adding some more useful information to it. For example, we might want our "not found" error to say what was not found:<p><pre><code>  return fmt.Errorf("%q: not found", name) // "foo": not found
</code></pre>
This is quite a bit more expensive than "return ErrNotFound". The fmt.Errorf function will parse a format string, produce the error text, and make two allocations (one for the error string, one for a small struct that holds it). This is about 84ns on my laptop--168 times slower than the fast path! But 84ns is still pretty fast, and you can't get away from the need for at least one allocation if you want to return an error that's varies based on the inputs of the function that produced it. (You can get faster than fmt.Errorf if it matters, but this comment is already getting large.)<p>A problem with using fmt.Errorf in this way is that you can't test the error against a sentinel any more. This was addressed a while back in Go 1.13 with the addition of error wrapping. You can return an error that <i>wraps</i> the sentinel (note the %w format verb):<p><pre><code>  return fmt.Errorf("%q: %w", name, ErrNotFound) // "foo": not found
</code></pre>
And you can then use the errors.Is function to ask whether an error is equal to ErrNotFound, or if it wraps ErrNotFound:<p><pre><code>  if errors.Is(err, ErrNotFound) { ... }
</code></pre>
On my laptop, producing a wrapping error like this and testing it with "err != nil" is about 91ns, and testing it with "errors.Is(err, ErrNotFound)" is about 98ns. So using Is is adding 7ns of overhead, which is not nothing, but is also pretty much lost in the noise compared to creating the error in the first place.<p>The example in this blog post went a step further, though, and created an error with not just a single layer of wrapping but one with four. The error text in the wrapped error cases is:<p><pre><code>  GetValue couldn't get a value: queryValueStore couldn't get a value: queryDisk couldn't get a value: not found
</code></pre>
(That is, by the way, a very difficult error to read. Don't hand users errors that look like that.)<p>Creating a stack of four wrapped errors like this on my laptop is 396ns, and inspecting it with errors.Is is another 21ns. 21ns is waaaaay more than the 0.5ns for a simple "err != nil" check, but again the runtime here is massively dominated by the expense of creating the error--which in this case involves repeatedly creating formatted strings and throwing them away, and two allocations for each layer in the stack.<p>In general, when doing low level optimization of Go code, avoiding allocations is the biggest bang for your buck. If microseconds matter, you absolutely should pay attention to the cost of constructing error values. But the cost of <i>inspecting</i> those values doesn't usually become an issue unless nanoseconds count, and will generally be dominated by the cost of construction.<p>Also, even the slowest cases here are running about 0.5-1.5μs, which absolutely matters in some cases, but is irrelevant in many others.</p>
]]></description><pubDate>Sat, 01 Jun 2024 02:54:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=40542509</link><dc:creator>neild</dc:creator><comments>https://news.ycombinator.com/item?id=40542509</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40542509</guid></item><item><title><![CDATA[New comment by neild in "You can't just assume UTF-8"]]></title><description><![CDATA[
<p>In addition, Chinese characters encode more information than English letters, so a text written in Chinese will generally consume fewer bytes than the same text in English even when using UTF-8.<p>(Consider: Horse is five letters, but 馬 is one character. Even at three bytes per character, Chinese wins.)</p>
]]></description><pubDate>Tue, 30 Apr 2024 01:36:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=40206363</link><dc:creator>neild</dc:creator><comments>https://news.ycombinator.com/item?id=40206363</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40206363</guid></item><item><title><![CDATA[New comment by neild in "A brief, weird history of brainwashing"]]></title><description><![CDATA[
<p>The article doesn't refer to that incident, so far as I can see. It does mention Patty Hearst, who was kidnapped a year after the Stockholm bank robbery.<p>The term "Stockholm Syndrome" originates from a police consultant inventing a syndrome to diagnose a woman he had never met, in order to discredit her criticism of the largely incompetent police response to her and several other people being taken hostage by a bank robber.<p><a href="https://www.independent.co.uk/news/world/americas/stockholm-syndrome-meaning-bank-robbery-b2399531.html" rel="nofollow">https://www.independent.co.uk/news/world/americas/stockholm-...</a></p>
]]></description><pubDate>Thu, 18 Apr 2024 16:37:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=40078050</link><dc:creator>neild</dc:creator><comments>https://news.ycombinator.com/item?id=40078050</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40078050</guid></item></channel></rss>