<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: clappski</title><link>https://news.ycombinator.com/user?id=clappski</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 25 Apr 2026 21:30:13 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=clappski" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by clappski in "I dumped Windows 11 for Linux, and you should too"]]></title><description><![CDATA[
<p>The mistake is that you did a system update when you wanted to use the computer. Not implying that  system updates should be a dangerous thing to do, but just something learnt from experience - I’ve had similar issues, especially with Nvidea drivers and kernel versions getting updated at the same time. The take away is keep the updates to when you have an hour to debug or get comfortable rolling back updates.</p>
]]></description><pubDate>Sun, 11 Jan 2026 12:27:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=46575165</link><dc:creator>clappski</dc:creator><comments>https://news.ycombinator.com/item?id=46575165</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46575165</guid></item><item><title><![CDATA[New comment by clappski in "Golang's big miss on memory arenas"]]></title><description><![CDATA[
<p>I like the priorities.<p>I think a core thing that's missing is that code that performs well is (IME) also the simplest version of the thing. By that, I mean you'll be;<p>- Avoiding virtual/dynamic dispatch<p>- Moving what you can up to compile time<p>- Setting limits on sizing (e.g. if you know that you only need to handle N requests, you can allocate the right size at start up rather than dynamically sizing)<p>Realistically for a GC language these points are irrelevant w.r.t. performance, but by following them you'll still end up with a simpler application than one that has no constraints and hides everything behind a runtime-resolved interface.</p>
]]></description><pubDate>Thu, 11 Dec 2025 11:34:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=46230132</link><dc:creator>clappski</dc:creator><comments>https://news.ycombinator.com/item?id=46230132</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46230132</guid></item><item><title><![CDATA[New comment by clappski in "Stdio(3) change: FILE is now opaque"]]></title><description><![CDATA[
<p>You'd have an error about an incomplete type - see <a href="https://godbolt.org/z/G4Gsfn7MT" rel="nofollow">https://godbolt.org/z/G4Gsfn7MT</a><p>> a pointer, whose size is always known<p>Yeah, this is exactly how it works. You work with a pointer that acts like a void* in your code, and the library with the definition is allowed to reach into the fields of that pointer. Normally you'd have a C API like<p><pre><code>    struct Op;
    Op* init_op();
    void free_op( Op* );
    void do_something_with_op( Op* );

</code></pre>
in the header provided by the library that you compile as part of your code, and the definition/implementation in some .a or .so/.dll that you'll link against.*</p>
]]></description><pubDate>Mon, 21 Jul 2025 13:04:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=44634638</link><dc:creator>clappski</dc:creator><comments>https://news.ycombinator.com/item?id=44634638</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44634638</guid></item><item><title><![CDATA[New comment by clappski in "Stdio(3) change: FILE is now opaque"]]></title><description><![CDATA[
<p>When we're talking about opaque it's really in relation to an individual translation unit - somewhere in the binary or its linked libraries the definition has to exist for the code that uses the opaque type.</p>
]]></description><pubDate>Mon, 21 Jul 2025 09:17:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=44633219</link><dc:creator>clappski</dc:creator><comments>https://news.ycombinator.com/item?id=44633219</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44633219</guid></item><item><title><![CDATA[New comment by clappski in "Why does unsafe multithreaded std:unordered_map crash more than std:map?"]]></title><description><![CDATA[
<p>Reminds me of the shadow paging used in LMDB, which is effectively the same but at the page level rather than the whole tree and allows each reader their own context to read from, rather than a shared reader context.</p>
]]></description><pubDate>Thu, 09 Nov 2023 11:23:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=38203647</link><dc:creator>clappski</dc:creator><comments>https://news.ycombinator.com/item?id=38203647</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38203647</guid></item><item><title><![CDATA[New comment by clappski in "Python 3.12.0rc1"]]></title><description><![CDATA[
<p><p><pre><code>     f" something { my_dict['key'] } something else "
</code></pre>
This works in Python already, allowing for nesting is a big QoL improvement</p>
]]></description><pubDate>Wed, 23 Aug 2023 14:18:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=37236330</link><dc:creator>clappski</dc:creator><comments>https://news.ycombinator.com/item?id=37236330</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37236330</guid></item><item><title><![CDATA[New comment by clappski in "A practical comparison of build and test speed between C++ and Rust"]]></title><description><![CDATA[
<p>C++ has two types of polymorphism;<p>- Templates (compile time), which are generic bits of code that are monomorphized over every combination of template parameters that they're used with.<p>- Virtualization (runtime), classic OO style polymorphism with a VTable (I think this similar to Rust's dyn trait?).</p>
]]></description><pubDate>Fri, 06 Jan 2023 08:29:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=34272360</link><dc:creator>clappski</dc:creator><comments>https://news.ycombinator.com/item?id=34272360</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=34272360</guid></item><item><title><![CDATA[New comment by clappski in "Tesla shares tank after U.S. discounts doubled on key models"]]></title><description><![CDATA[
<p>>  haven't seen depth info past the best bid/offer (maybe exists? I'm not an expert)<p>Most exchanges will provide arbitrary depth in way of a pure order feed. From that you can construct your price book, which gives you the levels of depth.<p>Some just expose the price book, some price book and order feed, some just order feed.<p>Some anonymize the order feed, some don't (I think typically in equities it's anonymized although not my asset class, but other markets e.g. power need to be de-anonymized and you can see the other buyers and sellers submissions).<p>However, that data doesn't represent the market price - I would look to constructing the fair price using the trades made on the exchange rather than the outstanding orders. From that you can create different lenses to view the fair price - e.g. volume weighted, time weighted, other types of averages.</p>
]]></description><pubDate>Fri, 23 Dec 2022 10:51:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=34104385</link><dc:creator>clappski</dc:creator><comments>https://news.ycombinator.com/item?id=34104385</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=34104385</guid></item><item><title><![CDATA[New comment by clappski in "The sinister attempts to ‘decolonise’ mathematics"]]></title><description><![CDATA[
<p>So are you arguing that genocide and slavery <i>aren't</i> objectively bad?</p>
]]></description><pubDate>Tue, 15 Nov 2022 12:40:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=33608407</link><dc:creator>clappski</dc:creator><comments>https://news.ycombinator.com/item?id=33608407</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=33608407</guid></item><item><title><![CDATA[New comment by clappski in "The Problem with Go"]]></title><description><![CDATA[
<p>By sharing the load, we have a #reviews channel that anyone can put something in to get peer review. If there's something that needs attention from a specific person then arranging a call to walk through is a good approach where both reviewee and reviewer can negotiate a time to review.</p>
]]></description><pubDate>Wed, 02 Nov 2022 17:35:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=33439801</link><dc:creator>clappski</dc:creator><comments>https://news.ycombinator.com/item?id=33439801</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=33439801</guid></item><item><title><![CDATA[New comment by clappski in "The pool of talented C++ developers is running dry"]]></title><description><![CDATA[
<p>There's much more reason to do a greenfield project in C++ than Rust - experienced C++ hiring is still considerably easier! Not everything has a purely technical motivator.</p>
]]></description><pubDate>Wed, 02 Nov 2022 15:01:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=33436925</link><dc:creator>clappski</dc:creator><comments>https://news.ycombinator.com/item?id=33436925</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=33436925</guid></item><item><title><![CDATA[New comment by clappski in "The forty-year programmer"]]></title><description><![CDATA[
<p>> Is it boring? Was I right about that?<p>> who uses programming as a problem solving tool<p>Programming can be boring, software development is much more exciting!<p>All software is solving a problem, same as the software that’s the output of the programming you do.<p>Those problems might be purely technical (like virtualising different CPU architectures) or focussed on improving the efficiency that others can solve problems (like the software running Stack Exchange) or something completely  different.<p>Solving all of those problems requires more than programming, same as the problems you’re trying to solve need more than programming to fully resolve. Building for maintainability, reliability etc. requires much more than mindlessly programming the software.<p>But even the programming itself is interesting, especially when solving difficult problems.</p>
]]></description><pubDate>Sat, 03 Sep 2022 23:00:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=32707214</link><dc:creator>clappski</dc:creator><comments>https://news.ycombinator.com/item?id=32707214</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=32707214</guid></item><item><title><![CDATA[New comment by clappski in "Developers who quit the industry. Why? And what do you do now?"]]></title><description><![CDATA[
<p>The ship had sailed on<p>> WFH is a rare, once a month kind of thing<p>years ago for tech in London, way before 2020 for most businesses.<p>You'd be better off looking outside of London in the commuter belt or further out if you actually wanted to be in an office everyday, where everyone else is also in an office everyday. Or work in a highly regulated industry - defense, something governmental. Or something that requires you to develop against physical hardware.</p>
]]></description><pubDate>Mon, 22 Aug 2022 15:33:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=32552920</link><dc:creator>clappski</dc:creator><comments>https://news.ycombinator.com/item?id=32552920</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=32552920</guid></item><item><title><![CDATA[New comment by clappski in "Building a Cloud Database from Scratch: Why We Moved from C++ to Rust"]]></title><description><![CDATA[
<p>In practise shared_ptr should only be used when you need to actually share ownership of some dynamically allocated object. You get around it by using it in the right place. You’re correct on the refcounting being a performance issue.<p>Codebases that use shared_ptr for everything because they think it ‘solves’ having to manage memory are smelly, it shows that no one has thought about the ownership model. Not to say there isn’t a solid use case for it, but some developers use it by default because they don’t fully understand the trade offs/why it’s important to think about ownership of managed memory.<p>As an example in our medium to large code base we have two places we use a shared_ptr, completely off the hot path and for long lived objects that aren’t copied more than a few times, but need to share ownership of the pointee - in a similar use case of your use of Arc.<p>Almost all of the time unique_ptr, with a single owner, is exactly what you want to replace the memory management side of a dynamically allocated object. From there you will pass around raw pointers or references to the object managed by the unique_ptr (for functions that need to ‘borrow’ the object).<p>Something interesting about shared_ptr is how it relates to weak_ptr, although I’ve never seen weak_ptr in anything out side documentation!</p>
]]></description><pubDate>Sat, 28 May 2022 08:33:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=31538645</link><dc:creator>clappski</dc:creator><comments>https://news.ycombinator.com/item?id=31538645</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=31538645</guid></item><item><title><![CDATA[New comment by clappski in "Python Standard Library changes in recent years"]]></title><description><![CDATA[
<p>Sometimes you might use bits in an integer to encode data, e.g.;<p>- A bitset index<p>- Bitflags (e.g. to represent logging levels)<p>- Feature flags<p>`bit_count` (aka `popcount`) gives you an efficient way to figure out how many bits within those structures are set and not set.</p>
]]></description><pubDate>Sat, 21 May 2022 08:17:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=31456197</link><dc:creator>clappski</dc:creator><comments>https://news.ycombinator.com/item?id=31456197</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=31456197</guid></item><item><title><![CDATA[New comment by clappski in "NY energy grid: Real-time dashboard"]]></title><description><![CDATA[
<p>Something to bare in mind when you're looking at both of those is the price is highly dependent on a number of factors;<p>- Type of generation, looking at the NY data they have a huge hydro generation, obviously the UK grid has much less of that<p>- Time of day, the Elexon graph is showing you the system price per 30 minute settlement period. You can see that some of those periods weren't anywhere near what you're quoting (there was literally a period where the system price was 0£ in the last 24h). <a href="https://www.bmreports.com/bmrs/?q=balancing/systemsellbuyprices" rel="nofollow">https://www.bmreports.com/bmrs/?q=balancing/systemsellbuypri...</a> makes the volatility much more obvious.<p>- The weather, it plays a big part in the system price due to price disparity of renewables (commonly wind in the UK grid) compared to oil based and gas generation.<p>- The interconnect, the UK grid has interconnectors to the EU grid so there's some price impact from that</p>
]]></description><pubDate>Fri, 11 Mar 2022 18:13:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=30643731</link><dc:creator>clappski</dc:creator><comments>https://news.ycombinator.com/item?id=30643731</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30643731</guid></item><item><title><![CDATA[New comment by clappski in "Python built-ins worth learning (2019)"]]></title><description><![CDATA[
<p>Wouldn't `Count` ( <a href="https://docs.microsoft.com/en-us/dotnet/api/system.collections.icollection.count?view=net-6.0#system-collections-icollection-count" rel="nofollow">https://docs.microsoft.com/en-us/dotnet/api/system.collectio...</a> ) be the preferred way to check if a collection has values? `someCollection.Any()` is the same as Python's `any`</p>
]]></description><pubDate>Thu, 10 Mar 2022 14:50:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=30627529</link><dc:creator>clappski</dc:creator><comments>https://news.ycombinator.com/item?id=30627529</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30627529</guid></item><item><title><![CDATA[New comment by clappski in "Const all the things?"]]></title><description><![CDATA[
<p>> But wouldn't the ability to restrict arbitrary changes to a struct still be important?<p>Typically immutability in C++ is at the interface scope rather than structural, e.g. prefer this<p><pre><code>    struct MyType {
        int x_;

        MyType( int x ) : x_( x ) {}
    };
   
    void do_the_thing( const MyType& mt ); // mt.x_ = 1; doesn't compile, mt is const
</code></pre>
over this<p><pre><code>    struct MyType {
        const int x_;

        MyType( int x ) : x_( x ) {}
    };
   
    void do_the_thing( MyType mt ); // mt.x_ = 1; doesn't compile, x_ is const</code></pre></p>
]]></description><pubDate>Mon, 24 Jan 2022 13:39:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=30057416</link><dc:creator>clappski</dc:creator><comments>https://news.ycombinator.com/item?id=30057416</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30057416</guid></item><item><title><![CDATA[New comment by clappski in "Do Not Log"]]></title><description><![CDATA[
<p>My comment wasn’t about buffered writing in a main thread, it was about moving the work out of your threads actually executing your program and having them push raw log actions into a queue for another thread to do the formatting and writes to file from.<p>If you’re logging so much that you’re saturating a dedicated thread that just reads from a queue in shared memory, does log formatting and writes to a file then you have bigger problems than figuring out how to log because there isn’t going to be a solution that lets you log with a deterministic latency without skipping events or wrapping around your queue.<p>Of course, the approach scales fine if you can have multiple log files per process - e.g. a normal log file and a message log or transaction log, because you can give each file its own queue and thread.</p>
]]></description><pubDate>Thu, 06 Jan 2022 07:49:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=29820600</link><dc:creator>clappski</dc:creator><comments>https://news.ycombinator.com/item?id=29820600</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29820600</guid></item><item><title><![CDATA[New comment by clappski in "Do Not Log"]]></title><description><![CDATA[
<p>> logging to a synchronized output<p>There's your performance issue, logging doesn't need to be persisted or even processed by your main program thread or any thread/process actually doing the work. Who's logging straight to stdout or directly ::write'ing a file in a production application?</p>
]]></description><pubDate>Wed, 05 Jan 2022 18:17:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=29812792</link><dc:creator>clappski</dc:creator><comments>https://news.ycombinator.com/item?id=29812792</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29812792</guid></item></channel></rss>