<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: whiatp</title><link>https://news.ycombinator.com/user?id=whiatp</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sun, 24 May 2026 20:36:26 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=whiatp" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by whiatp in "Converting an Integer to a Decimal String in Under Two Nanoseconds"]]></title><description><![CDATA[
<p>Many large distributed systems are built around pushing data through web requests, and human readable request/response formats (JSON, XML) are the most popular, and require integer to string conversions for serialization.</p>
]]></description><pubDate>Sun, 24 May 2026 17:04:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=48259024</link><dc:creator>whiatp</dc:creator><comments>https://news.ycombinator.com/item?id=48259024</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48259024</guid></item><item><title><![CDATA[New comment by whiatp in "Embedded Rust or C Firmware? Lessons from an Industrial Microcontroller Use Case"]]></title><description><![CDATA[
<p>I remember a coworker having to fight with an old platform's build not working because our user/group IDs were bigger than 2^16. I can't remember which utility was causing the problem, I'd have to guess tar. This is when we learned to play the archive a VM game.</p>
]]></description><pubDate>Sun, 03 May 2026 14:59:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=47997599</link><dc:creator>whiatp</dc:creator><comments>https://news.ycombinator.com/item?id=47997599</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47997599</guid></item><item><title><![CDATA[New comment by whiatp in "Embedded Rust or C firmware? Lessons from an industrial microcontroller use case"]]></title><description><![CDATA[
<p>I'm curious what the concern is with the rust editions mechanics in place. Each crate gets to define the language edition it is compiled with. Even if dependencies up convert to later editions they can still be linked against by crates that are an older edition.<p>As for the broader crate ecosystem, if crates you depend on drop support for APIs you depend on, that could cause you to get stuck on older unsupported releases. Though that is no different of a problem than any other language.</p>
]]></description><pubDate>Sun, 03 May 2026 14:29:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=47997306</link><dc:creator>whiatp</dc:creator><comments>https://news.ycombinator.com/item?id=47997306</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47997306</guid></item><item><title><![CDATA[New comment by whiatp in "If you're going to vibe code, why not do it in C?"]]></title><description><![CDATA[
<p>Something I've noticed that I never really see called out is how easy it is to review rust code diffs. I spent a lot of my career maintaining company internal forks of large open source C programs, but recently have been working in rust. The things I spent a lot of time chasing down while reviewing C code diffs, particularly of newer team members, is if they paid attention to all the memory assumptions that were non-local to the change they made. Eg. I'd ask them "the way you called this function implies it _always_ frees the memory behind that char*. Is that the case?" If they didn't know the answer immediately I'd be worried and spend a lot more time investigating the change before approving.<p>With rust, what I see is generally what I get. I'm not worried about heisenbug gotchas lurking in innocent looking changes. If someone is going to be vibe coding, and truly doesn't care about the language the product ends up in, they might as well do it in a language that has rigid guardrails.</p>
]]></description><pubDate>Tue, 09 Dec 2025 21:44:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=46211122</link><dc:creator>whiatp</dc:creator><comments>https://news.ycombinator.com/item?id=46211122</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46211122</guid></item><item><title><![CDATA[New comment by whiatp in "When you opened a screen shot of a video in Paint, the video was playing in it"]]></title><description><![CDATA[
<p>Long time back I'd play PS2 games in a chat window in EverQuest while waiting for mobs to spawn. I had a capture card that would overlay over a particular shade of purple that I discovered while trying to screen shot something from a game. I made an empty chat window in EQ that color and where it overlapped the card's application window behind the video would render. Was super jank picture in picture, but it worked.</p>
]]></description><pubDate>Sun, 19 Oct 2025 15:16:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=45634798</link><dc:creator>whiatp</dc:creator><comments>https://news.ycombinator.com/item?id=45634798</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45634798</guid></item><item><title><![CDATA[New comment by whiatp in "Cloudflare 1.1.1.1 Incident on July 14, 2025"]]></title><description><![CDATA[
<p>CF had their route covered by RPKI, which at a high level uses certs to formalize delegation of IP address space.<p>What caused this specific behavior is the dilemma of backwards comparability when it comes to BGP security. We area long ways off from all routes being covered by rpki, (just 56% of v4 routes according to <a href="https://rpki-monitor.antd.nist.gov/ROV" rel="nofollow">https://rpki-monitor.antd.nist.gov/ROV</a> ) so invalid routes tend to be treated as less preferred, not rejected by BGP speakers that support RPKI.</p>
]]></description><pubDate>Wed, 16 Jul 2025 15:47:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=44583596</link><dc:creator>whiatp</dc:creator><comments>https://news.ycombinator.com/item?id=44583596</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44583596</guid></item><item><title><![CDATA[New comment by whiatp in "The Size of Packets"]]></title><description><![CDATA[
<p>PMTU just doesn't feel reliable to me because of poorly behaved boxes in the middle. The worst offender I've had to deal with was AWS Transit Gateway, which just doesn't bother sending ICMP too big messages. The second worst offender is, IMO (data center and ISP) routers that generate ICMP replies in their CPU, meaning large packets hit a rate limited exception punt path out of the switch ASIC over to the cheapest CPU they could find to put in the box. If too many people are hitting that path at the same time, (maybe) no reply for you.<p>More rare cases, but really frustrating to debug was when we had an L2 switch in the path with lower MTU than the routers it was joining together. Without an IP level stack, there is no generation of ICMP messages and that thing just ate larger packets. The even stranger case was when there was a Linux box doing forwarding that had segment offload left on. It was taking in several 1500 byte TCP packets from one side, smashing them into ~9000 byte monsters, and then tried to send those over a VPNish network interface that absolutely couldn't handle that. Even if the network in the middle bothered to generate the ICMP too big message, the source would have been thoroughly confused because it never sent anything over 1500.</p>
]]></description><pubDate>Fri, 18 Apr 2025 05:31:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=43725296</link><dc:creator>whiatp</dc:creator><comments>https://news.ycombinator.com/item?id=43725296</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43725296</guid></item><item><title><![CDATA[New comment by whiatp in "War rooms vs. deep investigations"]]></title><description><![CDATA[
<p>This made me think of a series of "war room" meetings I had been part of early in my career. Strangely enough, also a defect revealed when the platform was low on memory. This was also the issue where I learned the value of documenting experiments and results once an investigation has taken a non-trivial amount of time. Not just to show management what you are doing, but to keep track of all the things you have already tried rather than spinning in circles.<p>The war room meetings were full of managers and QA engineers reporting on how many times they reproduced the bug. Their repro was related to triggering a super slow memory leak in the main user UI. I had the utmost respect for the senior QA engineer who actually listened to us when we said we could repro the issue way faster, and didn't need the twice daily reports on manual repro attempts. He took the meetings from his desk, 20 feet away, visible through the glass wall of the room we were all crammed into. I unfortunately didn't have the seniority to do the same.<p>Since I can't resist telling a good bug story:<p>The symptom we were seeing is that when the system was low on memory, a process (usually the main user UI, but not always) would get either a SIGILL at a memory location containing a valid CPU instruction, or a floating point divide by zero exception at a code location that didn't contain a floating point instruction. I built a memory pressure tool that would frequently read how much memory was free and would mmap (and dirty) or munmap pages as necessary to hold the system just short of the oom kill threshold. I could repro what the slow memory leak was doing to the system in seconds, rather than wait an hour for the memory leak to do it.<p>I wanted to learn more about what was going on between code being loaded into memory and then being executed, which lead me to look into the page fault path. I added some tracing that would dump out info about recent page faults after a sigill was sent out. It turns out all of the code that was having these mysterious errors was always _very_ recently loaded into memory. I realized when Linux is low on memory, one of the ways it can get some memory back is to throw out unmodified memory mapped file pages, like the executable pages of libraries and binaries. In the extreme case, the system makes almost no forward progress and spends almost all of its time loading code, briefly executing it, and then throwing it out for another process's code.<p>I realized there was a useful looking code path in the page fault logic we would never seem to hit. This code path would check if the page was marked as having been modified (and if I recall correctly, also if it was mapped as executable.) If it passed the check, this code would instruct the CPU to flush the data cache in the address range back to the shared L2 cache, and then clear the instruction cache for the range. (The arm processor we were using didn't have any synchronization between the L1 instruction and L1 data cache, so writing out executable content requires extra synchronization, both for the kernel loading code off disk, as well as JIT compilers.) With a little more digging around. I found the kernel's implementation of scatter gather copy would set that bit. However, our SOC vendor, in their infinite wisdom, made a copy of that function that was exactly the same, except that it didn't set the bit in the page table. Of course they used it in their SDIO driver.</p>
]]></description><pubDate>Mon, 24 Feb 2025 05:09:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=43155999</link><dc:creator>whiatp</dc:creator><comments>https://news.ycombinator.com/item?id=43155999</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43155999</guid></item><item><title><![CDATA[New comment by whiatp in "Yocto, RockPi and SBOMs: Building modern embedded Linux images"]]></title><description><![CDATA[
<p>bitbake -e <recipe> is super useful for that game. It dumps out a complete history of where all variables were set/changed, and their values along the way. I also use it to do what I call "variable shopping," where I roughly know what path/name content I need, but not what the variable it is in is called.</p>
]]></description><pubDate>Sat, 22 Feb 2025 23:27:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=43144368</link><dc:creator>whiatp</dc:creator><comments>https://news.ycombinator.com/item?id=43144368</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43144368</guid></item><item><title><![CDATA[New comment by whiatp in "Crafting endless AS paths in BGP"]]></title><description><![CDATA[
<p>I spent a lot of time debugging an internal fork of an open source BGP implementation (really old quagga.) The confederation code always struck me as being nothing but weird exceptions to how BGP normally worked. I was happy to never hear a network engineer suggest confederations with a straight face.</p>
]]></description><pubDate>Fri, 02 Aug 2024 01:15:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=41135272</link><dc:creator>whiatp</dc:creator><comments>https://news.ycombinator.com/item?id=41135272</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41135272</guid></item><item><title><![CDATA[New comment by whiatp in "What is the worst AWS service? I vote for Amplify"]]></title><description><![CDATA[
<p>Someone accidentally commented the translation in another post about AWS:<p><a href="https://news.ycombinator.com/reply?id=40541919&goto=item%3Fid%3D40539172%2340541919">https://news.ycombinator.com/reply?id=40541919&goto=item%3Fi...</a></p>
]]></description><pubDate>Sat, 01 Jun 2024 02:53:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=40542503</link><dc:creator>whiatp</dc:creator><comments>https://news.ycombinator.com/item?id=40542503</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40542503</guid></item><item><title><![CDATA[New comment by whiatp in "AWS: IPv4 addresses cost too much, so you’re going to pay"]]></title><description><![CDATA[
<p>Ah, should have googled. I stand corrected.</p>
]]></description><pubDate>Mon, 31 Jul 2023 18:02:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=36946465</link><dc:creator>whiatp</dc:creator><comments>https://news.ycombinator.com/item?id=36946465</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36946465</guid></item><item><title><![CDATA[New comment by whiatp in "AWS: IPv4 addresses cost too much, so you’re going to pay"]]></title><description><![CDATA[
<p>With all that investment in addresses I'm surprised AWS is still the first cloud provider to charge for them. (As far as I know.) It will be interesting to see if other cloud providers will follow, and if the cloud providers compete over the price or just match AWS. It kind of feels like AWS charging for V4s will "give permission" to other providers to charge.<p>I'm also curious if the price will come down over time as addresses are yielded back. I guess it depends on if their goal is to recoup all the money they spent on addresses, or just to avoid running out.</p>
]]></description><pubDate>Mon, 31 Jul 2023 15:26:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=36944067</link><dc:creator>whiatp</dc:creator><comments>https://news.ycombinator.com/item?id=36944067</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36944067</guid></item><item><title><![CDATA[New comment by whiatp in "Snowflake"]]></title><description><![CDATA[
<p>I think the primary problem with domain fronting that ECH would solve is that ECH doesn't involve using a third party's domain name, potentially dragging a single third party into the censorship muck. My read of the support email signal shared is that AWS was unhappy that a domain they owned would likely become entangled. While ECH will still increase everyone else's risk that is sharing the same load balancer as a censorship target, it is at least a fully distributed risk, rather than requiring the client pick a specific domain or set of domains to pull into their fight.</p>
]]></description><pubDate>Sun, 30 Jul 2023 14:22:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=36931410</link><dc:creator>whiatp</dc:creator><comments>https://news.ycombinator.com/item?id=36931410</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36931410</guid></item></channel></rss>