<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: OskarS</title><link>https://news.ycombinator.com/user?id=OskarS</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 29 Oct 2026 21:52:59 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=OskarS" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by OskarS in "Nixpkgs for the frontend impaired"]]></title><description><![CDATA[
<p>Yes, you're absolutely right, but you're also illustrating the author's broader point a little bit. For someone not very deeply familiar with Nix (the language), that is a very difficult one-liner to parse. You have to be pretty hard-core nix-pilled to understand what that one is doing just reading it straight-on (my NAS is using NixOS, so I've written some amount of Nix). On the other hand, the TypeScript code the author provides is reasonably straight-forward, you don't have to be particularly familiar with either TypeScript or Nix to understand what it is doing.<p>You're correct in that the article is wrong in saying you can't use a nix repl this way, but I took the broader point of it to be "Nix-the-language gets in the way of the Nix-the-model". Which is something that I personally agree with 100% and I think the article illustrates beautifully.</p>
]]></description><pubDate>Thu, 29 Oct 2026 14:30:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=50289720</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=50289720</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50289720</guid></item><item><title><![CDATA[New comment by OskarS in "How Google determines the names for bodies of water in Google Earth (2008)"]]></title><description><![CDATA[
<p>It's a very lawyerly distinction you're making here that's willfully blind to what's really going on. The common-sense reading "primary, common, local name" is that it should be called the Gulf of Mexico, as that is what it is called in the USA.<p>If the nutso president of Turkmenistan decided one day that the Caspian Sea's real name was the Turkmen Sea, there's absolutely no way that Google Maps would rename it on their maps. The reason they renamed it in this case is not because "well, the government said so, so we have no choice!". It's (obviously!) done to not piss of Trump, and pissing off Trump would be bad for their business. They can hide behind lawyerly arguing all they want, but that is the real reason.</p>
]]></description><pubDate>Thu, 29 Oct 2026 14:00:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=50289197</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=50289197</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50289197</guid></item><item><title><![CDATA[New comment by OskarS in "Composite objects and C++26 the std:polymorphic type"]]></title><description><![CDATA[
<p>I agree. The comment is correct in that it sort-of violates the "purity" of std::indirect that it has this pathological in moved-from state, but it's only an issue when directly using moved-from objects, which is something you essentially never do. Exactly what you say, "in practice" this never happens. Throwing the move constructor out because of it would be throwing out the baby with the bathwater.<p>std::variant has a similar issue with valueless_after_exception, which given the semantics of the language, it has to have. But similarly, this essentially never happens in practice, and I've never encountered a bug with a valueless std::variant.</p>
]]></description><pubDate>Wed, 21 Oct 2026 09:07:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=50177909</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=50177909</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50177909</guid></item><item><title><![CDATA[New comment by OskarS in "Composite objects and C++26 the std:polymorphic type"]]></title><description><![CDATA[
<p>> Which the version I showed has none of.<p>No, it has something much worse, it has a memory leak. The nested types inside the union allocate memory, and they don't get destructed when Event gets destructed. Don't do this in modern C++, it's a terrible terrible idea, these kinds of constructs are very hard to get correct manually. Just use std::variant.</p>
]]></description><pubDate>Wed, 21 Oct 2026 08:42:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=50177728</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=50177728</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50177728</guid></item><item><title><![CDATA[New comment by OskarS in "Composite objects and C++26 the std:polymorphic type"]]></title><description><![CDATA[
<p>Yes, though in modern C++, don't do this, use std::variant instead. It has better type-safety (nothing stops you from writing to one member of the union but reading from another, causing UB) and handles lifetimes much better. Your version leaks, because struct Event wont destruct any of the nested types inside the union, and in the example, they have heap-allocated data (std::strings and the like). In order to that properly with a tagged union, you need to define the destructor of Event yourself (which is not done in your example) and call the correct destructor manually of the active union member.<p>Tagged unions (especially with resource-managing types) is hard to implement correctly in C++ (and not trivial in C either). Don't do it, use std::variant.</p>
]]></description><pubDate>Wed, 21 Oct 2026 08:36:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=50177684</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=50177684</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50177684</guid></item><item><title><![CDATA[New comment by OskarS in "Writing Efficient C++ Code (2013)"]]></title><description><![CDATA[
<p>> One in a trillion times.<p>This is wildly overstating it. Yeah, I agree, they're much less often the right choice compared to a good-ol' growable array, but they have lots of uses in high-performance code and concurrent code, and they're building blocks in lots of other data structures. Like, in a bucket hash-table, the buckets are linked lists, in a LRU cache you interleave a hash table and linked list, std::hive is a linked list of chunks of elements, etc. Anything that has ever had to deal with memory pooling/allocation uses free-lists which are linked lists. And on and on and on.</p>
]]></description><pubDate>Mon, 28 Sep 2026 14:51:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=49878947</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=49878947</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49878947</guid></item><item><title><![CDATA[New comment by OskarS in "A Necessary History of the Oddest Letter: W"]]></title><description><![CDATA[
<p>I remember vividly being so annoyed when they added W to the Swedish alphabet in 2006. The alphabet I learned to recite in first grade is suddenly wrong?! I still don't say it correctly unless I concentrate, if I have to recite the alphabet, I always skip over W.<p>The argument at the time was that no "native" Swedish words are spelled with a W, so it shouldn't be part of our alphabet. However, but 2006, enough loan-words had been imported to Swedish with W's (like "webben", "the web") and it was in enough brand names (like "Volkswagen") that it should be included.<p>But I'm still mad about it! This is my tiny ridiculous hill to die on, W should not be part of the Swedish alphabet!</p>
]]></description><pubDate>Mon, 21 Sep 2026 14:20:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=49787656</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=49787656</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49787656</guid></item><item><title><![CDATA[New comment by OskarS in "High-performance garbage collection for C++"]]></title><description><![CDATA[
<p>It's interesting reading this, wondering how much C++26 static reflection could improve the ergonomics of a system like this. Like, if you tag the class with a specific attribute, can you have have it generate the Trace() function automatically? Can you have it automatically wrap the other GC classes using the Member<> template? I think implementing the Trace() function might be doable (you'd do it in the GarbageCollected<> base class that uses CRTP, right?), but maybe not wrapping the types, I'm not sure if reflection allows you to modify types of fields in that way.</p>
]]></description><pubDate>Tue, 15 Sep 2026 10:30:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=49710314</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=49710314</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49710314</guid></item><item><title><![CDATA[New comment by OskarS in "Move in C++ without a std:move"]]></title><description><![CDATA[
<p>Fair enough, I don't know the C++ ABI to this extent.</p>
]]></description><pubDate>Thu, 03 Sep 2026 08:35:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=49547443</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=49547443</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49547443</guid></item><item><title><![CDATA[New comment by OskarS in "Using jq to format JSON on the clipboard"]]></title><description><![CDATA[
<p>Lovely little alias, but I much prefer fracjson[0] pretty printing to jq, so I might go with that instead!<p>[0]: <a href="https://github.com/j-brooke/FracturedJson" rel="nofollow">https://github.com/j-brooke/FracturedJson</a></p>
]]></description><pubDate>Wed, 02 Sep 2026 14:25:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=49536758</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=49536758</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49536758</guid></item><item><title><![CDATA[New comment by OskarS in "Move in C++ without a std:move"]]></title><description><![CDATA[
<p>Yes, it works exactly like this, this is a demo on godbolt [0]. rdi stores the pointer in both cases, makeS1() uses RVO, makeS2() takes it explicitly and constructs with placement new.<p>I will say before testing this i didn't realize the RVO calling convention was to return the pointer you pass in, but apparently so. If makeS2() returned void, it's just a tail call to the constructor, but makeS1() has to spill rbx and use it to save the pointer.<p>[0]: <a href="https://godbolt.org/z/ovd1n99P8" rel="nofollow">https://godbolt.org/z/ovd1n99P8</a></p>
]]></description><pubDate>Wed, 02 Sep 2026 13:52:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=49536244</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=49536244</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49536244</guid></item><item><title><![CDATA[New comment by OskarS in "DoltLite: A SQLite fork with Git-style version control, built with 2k agent PRs"]]></title><description><![CDATA[
<p>That's what I'm saying, if you have a CoW filesystem, backing up with atomic snapshots is almost certainly fine, SQLite's advice against copying probably doesn't apply to that. But just typing `cp` in a terminal is probably not a good idea if a transaction is active (even if you're on a CoW filesystem, `cp` in experience usually isn't atomic without some flags).</p>
]]></description><pubDate>Wed, 02 Sep 2026 08:51:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=49533619</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=49533619</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49533619</guid></item><item><title><![CDATA[New comment by OskarS in "DoltLite: A SQLite fork with Git-style version control, built with 2k agent PRs"]]></title><description><![CDATA[
<p>> The simple way to fork a sqlite db is just to copy it<p>SQLite recommends against doing that [1] while a transaction is active, because the copy might have some pre/post data in it which could potentially cause corruption. Presumably this isn't an issue with copy-on-write filesystems assuming they copy atomically, but I probably still wouldn't do it, instead use the backup API or VACUUM INTO (if nothing else, because VACUUM INTO will also obviously VACUUM the copy).<p>If you're not attached/writing to it, then of course it's fine.<p>[1]: <a href="https://www.sqlite.org/howtocorrupt.html#_backup_or_restore_while_a_transaction_is_active" rel="nofollow">https://www.sqlite.org/howtocorrupt.html#_backup_or_restore_...</a></p>
]]></description><pubDate>Tue, 01 Sep 2026 11:33:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=49520558</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=49520558</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49520558</guid></item><item><title><![CDATA[New comment by OskarS in "uv: Deduplicate all files in the wheel cache"]]></title><description><![CDATA[
<p>I think it's reasonable for a DB like SQLite to delegate that to the filesystem. There is an overhead for doing it on the DB level, and since SQLite is just a file on the filesystem which, presumably, is serving many <i>other</i> files as well, why would you trust anything else on the filesystem if you don't trust SQLite? Like, your PHP script (or nginx server executable, or whatever) that is calling SQLite, that's not going to be check-summed either. Either you trust your filesystem or you don't, and if you don't, checksum and error correct on the filesystem level.<p>Though fair enough, it could offer it as an opt-in thing.</p>
]]></description><pubDate>Mon, 31 Aug 2026 11:25:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=49508371</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=49508371</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49508371</guid></item><item><title><![CDATA[New comment by OskarS in "Nebula Sans"]]></title><description><![CDATA[
<p>I think that's totally fair, it's just different people come to youtube for different things. Nebula is just a different value proposition.</p>
]]></description><pubDate>Thu, 27 Aug 2026 09:34:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=49462052</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=49462052</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49462052</guid></item><item><title><![CDATA[New comment by OskarS in "Nebula Sans"]]></title><description><![CDATA[
<p>Obviously YMMV, but I haven't had any issues like that, the quality of the videos is the same I get in the YouTube app. They take a few seconds longer to start though.</p>
]]></description><pubDate>Wed, 26 Aug 2026 16:30:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=49451866</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=49451866</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49451866</guid></item><item><title><![CDATA[New comment by OskarS in "Nebula Sans"]]></title><description><![CDATA[
<p>Yes, of course you can, but this sense of always having to curate your watch history and hide from the algorithm is just not there for Nebula. I guess it's different from person to person, but it's remarkable how freeing it feels to me to use a service where that isn't a concern. I'm watching what I want to watch, not what the algorithm is manipulating me to click on.<p>Maybe it will enshittify like most everything else, but it hasn't so far, and for now I'm a very happy customer.</p>
]]></description><pubDate>Wed, 26 Aug 2026 16:27:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=49451802</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=49451802</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49451802</guid></item><item><title><![CDATA[New comment by OskarS in "Nebula Sans"]]></title><description><![CDATA[
<p>It's a little beside the point of the post, but I just want to fly a flag for Nebula: I subscribed solely to get early versions of Jet Lag: The Game, but I'm finding myself watching it more and more! It has many of the channels I would go to YouTube for, but I've also discovered several really good ones that I had never heard of. And it has a similar feel to Kagi, in the sense of "freeing" yourself from the algorithm. It happens so often on YouTube that I see a video recommended but think to myself "if I click this, am I going to get recommendations for terrible stuff for the next month? What does this tell Google about me?". Same thing with all the big streaming services.<p>With Nebula, no such worry. The homepage and app isn't creepily algorithmically designed to optimize my engagement with the platform, it's just a bunch of high-quality videos and channels that I can watch with no fuss. It's remarkable how nice that feels in 2026. Really highly recommended.</p>
]]></description><pubDate>Wed, 26 Aug 2026 15:43:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=49451112</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=49451112</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49451112</guid></item><item><title><![CDATA[New comment by OskarS in "GIMP Development Update"]]></title><description><![CDATA[
<p>The obvious alternative is SQLite, and it has many advantages. If you want to do a "zipped list of files", SQLite does that just fine (that's what SQLar is), but it can do so much richer data. Even if you don't want that, it still offers resiliency that "zipped XML" can't match: if your software or computer crashes in the middle of saving your file, it'll almost certainly corrupt it. With SQLite, not an issue: all transactions are atomic, they either happen entirely or not at all.<p>I don't know what "mature tooling" you're talking about for zipped XML, but I guarantee you it's not going to be better (or more mature) than SQLite and its ecosystem.</p>
]]></description><pubDate>Mon, 17 Aug 2026 08:48:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=49327999</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=49327999</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49327999</guid></item><item><title><![CDATA[New comment by OskarS in "Rust project goals: Immobile types and guaranteed destructors"]]></title><description><![CDATA[
<p>mem::forget isn’t the only way you can safely leak a value, you can do it with reference cycles too, right? And there is no way for the compiler to detect that?<p>Isn’t that why mem::forget is safe, because you can always implement it yourself safely? How do you get around that?</p>
]]></description><pubDate>Mon, 03 Aug 2026 07:29:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=49152382</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=49152382</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49152382</guid></item></channel></rss>