<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: nh2</title><link>https://news.ycombinator.com/user?id=nh2</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Wed, 13 May 2026 22:52:01 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=nh2" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by nh2 in "Space Cadet Pinball on Linux"]]></title><description><![CDATA[
<p>I wish somebody had as a passion project or company to build Space Cadet into a real physical pinball table.</p>
]]></description><pubDate>Sun, 10 May 2026 12:04:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=48083284</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=48083284</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48083284</guid></item><item><title><![CDATA[New comment by nh2 in "Removing fsync from our local storage engine"]]></title><description><![CDATA[
<p>Even then, I also share the confusion of the poster you're replying to.<p>I don't see how a virtualised NVMe disk is different from a physical one.<p><i>Especially</i> if you don't have control over the underlying hardware (so you don't know if it has power-loss-protection PLP SSDs), you should send the FUA.<p>> O_DATA_SYNC<p>You mean `O_DSYNC`?<p>Why would you need `O_DSYNC` on-premise, but not on cloud VMs? (Or are you saying you'd include it everywhere?) Similar to my above point, surely it is the task of the VM to pass through any FUA commands the VM guest issues to the actual storage?<p>Further: Is `O_DSYNC` actually substantially different from writing and then `fdatasync()`ing yourself?<p>My understand is that no, it's the same. In particular, the same amount of data gets written. So if you believe that to avoid the "can trigger an order of magnitude more I/O" by avoiding `fdatasync()`, you would re-introduce it with `O_DSYNC`.<p>However, I suspect that that whole consideration is pointless:<p>The only thing that makes your O_DIRECT+preallocated-only-overwrites writes safe are enterprise SSDs with Power Loss Protection (PLP), usually capacitors.<p>On those SSDs, NVMe Flush/FUA are no-ops [1]. So you might as well `fdatasync()`/`O_DSYNC`, always. This is simpler, and also better because you do not need to assume/hope that your underlying SSDs have PLP: Doing the safe thing is fast on PLP [2], and safe on non-PLP.<p><pre><code>    [1] https://news.ycombinator.com/item?id=46532675
    [2] https://tanelpoder.com/posts/using-pg-test-fsync-for-testing-low-latency-writes/
</code></pre>
So the only remaining benefit of `O_DSYNC` over `fdatasync()` is that you save a syscall. That's an OK optimisation given they are equivalent, but it would surprise me if it had any noticeable impact at the latencies you are reporting ("413 us"), because [2] reports the difference beting 6 us.<p>Let me know if I got anything wrong.<p>The only remaining question is: Why do you then see any difference in your benchmark?<p><pre><code>    Configuration            Throughput (obj/s)
    -------------------------------------------
    ext4 + O_DIRECT + fsync             116,041
    Our engine                          190,985
</code></pre>
That is what I'd find very valuable to investigate.<p>The first suspicion I have is: Shouldn't you be measuring `+ fdatasync` instead?<p>So I'd be interested in:<p><pre><code>    ext4 + O_DIRECT + fdatasync
    ext4 + O_DIRECT + O_DSYNC
    Our engine + O_DSYNC (which you're suggesting above)
</code></pre>
Also I don't fully understand what the remaining diference between "ext4 + O_DIRECT + O_DSYNC" and "Our engine + O_DSYNC" would be.</p>
]]></description><pubDate>Sat, 09 May 2026 18:00:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=48076873</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=48076873</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48076873</guid></item><item><title><![CDATA[New comment by nh2 in "Removing fsync from our local storage engine"]]></title><description><![CDATA[
<p>> fsync doesn’t just sync the file’s data, it syncs every piece of metadata the file depends on: ...  directory entry<p>Famously not, as the man page says.<p>It is also said later in the article:<p>> POSIX strictly requires a parent-directory fsync to make a newly created file’s existence durable.<p>So I'm not sure why the dirent sync is claimed earlier.</p>
]]></description><pubDate>Sat, 09 May 2026 14:41:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=48075373</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=48075373</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48075373</guid></item><item><title><![CDATA[Thunderbird donation page consumes CPU/GPU due to animation]]></title><description><![CDATA[
<p>Article URL: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2038287">https://bugzilla.mozilla.org/show_bug.cgi?id=2038287</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=48069535">https://news.ycombinator.com/item?id=48069535</a></p>
<p>Points: 4</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 08 May 2026 22:28:03 +0000</pubDate><link>https://bugzilla.mozilla.org/show_bug.cgi?id=2038287</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=48069535</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48069535</guid></item><item><title><![CDATA[New comment by nh2 in "Hardening Firefox with Claude Mythos Preview"]]></title><description><![CDATA[
<p>Given the commit is 4 weeks old, will it eventually get comments?<p>The code before the patch does not look obviously wrong. Now, some more lines were added, but would you now say it now looks less obviously wrong, or more obviously correct?<p>It seems that the invariants needed here are either in some person's heads, or in some document that is not referenced.<p>Reading the code for the first time, the immediate question is: "What other lines might be missing? How can I figure?"<p>If the "obviously correct" level of the code does not increase for a human reviewer, how is it ensured that a similar problem will not arise in the future? Or do we need more LLM to tell us which other lines need to be added?</p>
]]></description><pubDate>Fri, 08 May 2026 10:19:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=48061103</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=48061103</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48061103</guid></item><item><title><![CDATA[New comment by nh2 in "Batteries Not Included, or Required, for These Smart Home Sensors"]]></title><description><![CDATA[
<p>A big benefit of piezo-powered electronics is that they can do all the usual stuff, such storing state, or cryptography to prevent spoofing, which the ultrasonic approach from the article cannot do.</p>
]]></description><pubDate>Wed, 06 May 2026 14:27:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=48036689</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=48036689</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48036689</guid></item><item><title><![CDATA[New comment by nh2 in "Ubuntu Chromium Snap prevents encrypted storage of passwords by default"]]></title><description><![CDATA[
<p>To see whether there are plain text passwords on your non-Snap chromium, change this line in the linked password dumper script:<p><pre><code>    -    db_path = os.path.expanduser("~/snap/chromium/common/chromium/Default/Login Data")
    +    db_path = os.path.expanduser("~/.config/chromium/Default/Login Data")</code></pre></p>
]]></description><pubDate>Tue, 05 May 2026 15:06:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=48023538</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=48023538</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48023538</guid></item><item><title><![CDATA[New comment by nh2 in "Ubuntu Chromium Snap prevents encrypted storage of passwords by default"]]></title><description><![CDATA[
<p>Ubuntu ships a Chromium browser that has its abilitiy to store passwords safely sandboxed/containerized away.<p>I did not expect that, given that Ubuntu comes with a full GUI and thus safe password storage backend available <i>in theory</i>.<p>Because this issue is open since 2022, I wrote a repro that proves its existence:<p><a href="https://bugs.launchpad.net/ubuntu/+source/chromium-browser/+bug/1996267/comments/12" rel="nofollow">https://bugs.launchpad.net/ubuntu/+source/chromium-browser/+...</a><p>All credit goes to user "Erlenmayr" who reported this.</p>
]]></description><pubDate>Tue, 05 May 2026 14:38:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=48023099</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=48023099</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48023099</guid></item><item><title><![CDATA[Ubuntu Chromium Snap prevents encrypted storage of passwords by default]]></title><description><![CDATA[
<p>Article URL: <a href="https://bugs.launchpad.net/ubuntu/+source/chromium-browser/+bug/1996267">https://bugs.launchpad.net/ubuntu/+source/chromium-browser/+bug/1996267</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=48023098">https://news.ycombinator.com/item?id=48023098</a></p>
<p>Points: 4</p>
<p># Comments: 3</p>
]]></description><pubDate>Tue, 05 May 2026 14:38:52 +0000</pubDate><link>https://bugs.launchpad.net/ubuntu/+source/chromium-browser/+bug/1996267</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=48023098</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48023098</guid></item><item><title><![CDATA[New comment by nh2 in "Haskell: Debugging"]]></title><description><![CDATA[
<p>This community wiki page is somewhere between 10 and 20 years out-of-date.<p><a href="https://wiki.haskell.org/index.php?title=Debugging&action=history" rel="nofollow">https://wiki.haskell.org/index.php?title=Debugging&action=hi...</a><p>In particular, it has no mention about the new actual ... debugger:<p><a href="https://well-typed.github.io/haskell-debugger/" rel="nofollow">https://well-typed.github.io/haskell-debugger/</a><p><a href="https://discourse.haskell.org/t/the-haskell-debugger-for-ghc-9-14/13499/2" rel="nofollow">https://discourse.haskell.org/t/the-haskell-debugger-for-ghc...</a></p>
]]></description><pubDate>Sun, 03 May 2026 15:40:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=47998048</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=47998048</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47998048</guid></item><item><title><![CDATA[New comment by nh2 in "Zed 1.0"]]></title><description><![CDATA[
<p>That does not really matter though: Even immediate-mode approach programs should just not be drawing new frames when the program logic says that there are no new inputs that can result in different pixels (e.g. no user inputs, animations, notifications, text content changes, etc.). One does not need to "poll" for input.</p>
]]></description><pubDate>Thu, 30 Apr 2026 15:43:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=47964201</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=47964201</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47964201</guid></item><item><title><![CDATA[New comment by nh2 in "Copy Fail"]]></title><description><![CDATA[
<p>Indeed, no modprobe.d will help when the feature is compiled into the kernel ("=y") instead of compiled into a runtime-loadable module.</p>
]]></description><pubDate>Thu, 30 Apr 2026 12:02:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=47961200</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=47961200</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47961200</guid></item><item><title><![CDATA[New comment by nh2 in "Copy Fail"]]></title><description><![CDATA[
<p>If you want to use the suggested mitigation (disabling kernel module `algif_aead` with a modprobe config), and you do not want to run that whole obfuscated shell code to get an actual root shell, but only check if the module can be loaded, here is a readable version of its first few lines:<p><pre><code>    python3 -c 'import socket; s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0); s.bind(("aead","authencesn(hmac(sha256),cbc(aes))")); print("algif_aead probably successfully loaded, mitigation not effective; remove again with: rmmod algif_aead")'
</code></pre>
Similarly, when the mitigation is in place,<p><pre><code>    modprobe algif_aead
</code></pre>
should fail with an error.</p>
]]></description><pubDate>Wed, 29 Apr 2026 20:30:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=47954159</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=47954159</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47954159</guid></item><item><title><![CDATA[New comment by nh2 in "Zed 1.0"]]></title><description><![CDATA[
<p>Can you repro my finding?<p>I'm running on a Zed with only 1 empty text file in it. So language servers should not be in use.<p>How do you measure "pretty lightweight"?</p>
]]></description><pubDate>Wed, 29 Apr 2026 20:02:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=47953768</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=47953768</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47953768</guid></item><item><title><![CDATA[New comment by nh2 in "Copy Fail"]]></title><description><![CDATA[
<p>On a git repo that has as remotes<p><pre><code>    https://github.com/torvalds/linux.git
    https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git as remotes:
</code></pre>
running a search for commit a664bf3d603d's commit message:<p><pre><code>    git log --all --grep 'crypto: algif_aead - Revert to operating out-of-place' '--format=%H' | xargs -I '{}' git tag --contains '{}' | sort -u
</code></pre>
outputs these tags as having the fix:<p><pre><code>    v6.18.22
    v6.18.23
    v6.18.24
    v6.18.25
    v6.19.12
    v6.19.13
    v6.19.14
    v7.0
    v7.0.1
    v7.0.2
    v7.0-rc7
    v7.1-rc1</code></pre></p>
]]></description><pubDate>Wed, 29 Apr 2026 19:52:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=47953600</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=47953600</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47953600</guid></item><item><title><![CDATA[New comment by nh2 in "Zed 1.0"]]></title><description><![CDATA[
<p>I have not lost any Sublime tab in 15 years (I have tabs this old).<p>Sublime also saves a backup of its state files next to the state files in your home dir, so you can restore in case anything ever goes wrong (e.g. bugs in the new version).<p>The .sublime_session state files are JSON, easy to read for a human.<p>> spending an hour making up names for random junk files<p>That is completely unnecessary. You can just backup the '.sublime_session' file that contains all that before an upgrade if you are worried. Sublime already stores all its state in 1 file; manually spreading that across N files seems unfun busywork. A quick web search reveals that by the way.<p>(I perpetually have 40 Sublime windows open, each one with tens to hundreds of tabs. My 'Auto Save Session.sublime_session' is 70 MB.)</p>
]]></description><pubDate>Wed, 29 Apr 2026 17:17:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=47951412</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=47951412</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47951412</guid></item><item><title><![CDATA[New comment by nh2 in "Zed 1.0"]]></title><description><![CDATA[
<p>Syscall spamming is one of the main reasons why computers get slow when many apps are running.<p>Good software does not do that; when idle, it should only consume RAM, not CPU.<p>Aside: Browsers, and Electron, seem to always syscall-spam no matter what, which is probably a key reason why people feel that all Electron apps bog down their computers. When your computer gets faster, the software just does more syscall loops per second, for unchanged misery.</p>
]]></description><pubDate>Wed, 29 Apr 2026 17:10:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=47951310</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=47951310</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47951310</guid></item><item><title><![CDATA[New comment by nh2 in "Zed 1.0"]]></title><description><![CDATA[
<p>I tried Zed last month but found that it uses high CPU usage even when idle (up to 50% of 1 core of my i7-7500U).<p>This is even higher CPU usage than my vscode causes.<p>Sublime does not do that; in fact it has 0% CPU usage when idle:<p><pre><code>    sudo strace -fyp "$(pidof sublime_text)"
</code></pre>
shows that Sublime issues no syscalls when idle, as it should be.<p>(Note, you need to either unfocus it so that the caret stops flashing, or switch from fading caret to fixed / non-fading caret, otherwise it necessarily has to do syscalls to draw itself.)<p>Zed spams syscalls even when its screen is entirely still:<p><pre><code>    strace -fyp "$(pidof zed-editor)"
</code></pre>
In fact Zed makes 800 syscalls <i>per second</i> when completely idle and unfocused.</p>
]]></description><pubDate>Wed, 29 Apr 2026 17:05:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=47951240</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=47951240</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47951240</guid></item><item><title><![CDATA[New comment by nh2 in "Zed 1.0"]]></title><description><![CDATA[
<p>> Software update deletes this memory.<p>Are you sure? I believe Sublime preserves all your unsaved tabs even on update.</p>
]]></description><pubDate>Wed, 29 Apr 2026 16:44:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=47950913</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=47950913</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47950913</guid></item><item><title><![CDATA[New comment by nh2 in "Bugs Rust won't catch"]]></title><description><![CDATA[
<p>But those are all unsafe, taking raw strings.<p>Why can I easily use "*at" functions from Python's stdlib, but not Rust's?<p>They are much safer against path traversal and symlink attacks.<p>Working safely with files should not require *const c_char.<p>This should be fixed .</p>
]]></description><pubDate>Wed, 29 Apr 2026 10:29:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=47946386</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=47946386</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47946386</guid></item></channel></rss>