<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: gsliepen</title><link>https://news.ycombinator.com/user?id=gsliepen</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 27 Aug 2026 14:18:36 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=gsliepen" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by gsliepen in "Picophysics: Single file physics for games on platforms like N64, PSX, DC"]]></title><description><![CDATA[
<p>> Everything being static inline makes it hostile to these older systems which have limited RAM.<p>Compilers can un-inline as well. In fact, since every function is defined in the header file, the static inline annotation means very little, it's more of a hint; the functions that were not marked static inline can be inlined just as well by the compiler.</p>
]]></description><pubDate>Mon, 10 Aug 2026 08:13:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=49240807</link><dc:creator>gsliepen</dc:creator><comments>https://news.ycombinator.com/item?id=49240807</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49240807</guid></item><item><title><![CDATA[New comment by gsliepen in "ESP32-C6 Power Consumption: Arduino vs. Zephyr vs. ESP-IDF Comparison"]]></title><description><![CDATA[
<p>> execute instructions faster (via -O3)<p>One problem with -O3 is that it disregards any effects of the cache (and yes, ESP32s have a bit of cache memory). I recommend using -Os as the default optimization level, as it often has the same or almost the same performance benefits as -O3. Less cache pressure is beneficial, especially for bigger applications, and the smaller code size is of course nice on embedded systems that have limited amounts of flash storage. If you know some specific functions or source files are performance sensitive, you can use pragmas to change optimization for those:<p><pre><code>    #pragma GCC optimize("O3")
</code></pre>
See <a href="https://gcc.gnu.org/onlinedocs/gcc/Function-Specific-Option-Pragmas.html" rel="nofollow">https://gcc.gnu.org/onlinedocs/gcc/Function-Specific-Option-...</a>. Clang has a similar pragma, see <a href="https://clang.llvm.org/docs/LanguageExtensions.html#extensions-for-selectively-disabling-optimization" rel="nofollow">https://clang.llvm.org/docs/LanguageExtensions.html#extensio...</a>.</p>
]]></description><pubDate>Thu, 30 Jul 2026 09:06:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=49107567</link><dc:creator>gsliepen</dc:creator><comments>https://news.ycombinator.com/item?id=49107567</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49107567</guid></item><item><title><![CDATA[New comment by gsliepen in "LLM Usage in Debian: Three Proposals"]]></title><description><![CDATA[
<p>We'll see how much people like it once the cheap subscriptions end and the actual cost of LLMs (+ profit margin) is asked of them. Although I'm suspecting that eventually, machines that are good enough to run reasonably useful models will become cheap enought that most developers will have those, but that might be some years from now.<p>Debian is run by volunteers, and I think Debian Developers would not like it if they would have to pay to work on it, thus there will be some aversion to (at least frontier) LLMs.</p>
]]></description><pubDate>Sun, 26 Jul 2026 11:05:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=49056846</link><dc:creator>gsliepen</dc:creator><comments>https://news.ycombinator.com/item?id=49056846</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49056846</guid></item><item><title><![CDATA[New comment by gsliepen in "LLM Usage in Debian: Three Proposals"]]></title><description><![CDATA[
<p>> Notable are the endorsements, which are balanced over all three options, perhaps indicating only 1/3 are supportive of a more permissive position.<p>That's not the case. First, you can't really extrapolate from endorsers to all of the Debian Developers. Second, endorsers might not have looked at the other proposals at all, and the fact that they only endorsed one option doesn't mean they don't support the others. And you can also endorse an option if you believe it is a valid, useful proposal to add to the GR, even if you don't agree with it personally.<p>But most importantly, when Debian votes, you don't vote for a single option, instead you rank the choices, and apart from the given options, another option "further discussion" is always added to the list of choices. It's likely that many who rank the most permissive option first will rank the lesser permissive option second, above "further discussion", or they could even give options the same rank (if they really don't think one is better than the other).</p>
]]></description><pubDate>Sun, 26 Jul 2026 10:56:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=49056776</link><dc:creator>gsliepen</dc:creator><comments>https://news.ycombinator.com/item?id=49056776</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49056776</guid></item><item><title><![CDATA[New comment by gsliepen in "Git rebase -I is not that scary"]]></title><description><![CDATA[
<p>If you do a rebase -i because you want to squash or fix some commits, then there's git commit --squash and git commit --fixup commands which will mark commits as intending to squash or fixup another commit, and then you can use git rebase --autosquash <base> to automatically do what you want in one go. Of course, often you forget to use the --squash/--fixup options or you can't be bothered to lookup the hash of the commit you want to fix, so you'll end up using git rebase -i anyway.</p>
]]></description><pubDate>Sun, 26 Jul 2026 10:38:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=49056671</link><dc:creator>gsliepen</dc:creator><comments>https://news.ycombinator.com/item?id=49056671</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49056671</guid></item><item><title><![CDATA[New comment by gsliepen in "PartialString – A finite-difference time-domain physical modelling synthesiser"]]></title><description><![CDATA[
<p>I actually tried doing it as a Vulkan compute shader, continuously simulating 128 strings (all possible MIDI notes). It didn't work very well. While the latency was tolerable, it was slower than doing the same on the CPU (although this was with an integrated GPU, not a dedicated card).</p>
]]></description><pubDate>Sat, 25 Jul 2026 21:27:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=49051765</link><dc:creator>gsliepen</dc:creator><comments>https://news.ycombinator.com/item?id=49051765</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49051765</guid></item><item><title><![CDATA[New comment by gsliepen in "PartialString – A finite-difference time-domain physical modelling synthesiser"]]></title><description><![CDATA[
<p>The simplest form of string synthesis is perhaps the Karplus-Strong algorithm (<a href="https://en.wikipedia.org/wiki/Karplus%E2%80%93Strong_string_synthesis" rel="nofollow">https://en.wikipedia.org/wiki/Karplus%E2%80%93Strong_string_...</a>). Instead of simulating the motion of all parts of the string for each timestep, it simplifies it to a perfect transmission of motion, except at the end of the string where some function will be applied that captures the losses from the motion, typically by performing a simple low-pass filter. Computationally it is very efficient: just a few FMA operations per sample. The drawback is that you need a buffer to store the state of the string, which can be quite large (especially for low frequencies which correspond to long strings), and you need to read and write to different parts of this buffer. Thus, if you are simulating multiple strings, it's more likely that memory bandwidth will be the bottleneck instead of raw compute power.</p>
]]></description><pubDate>Sat, 25 Jul 2026 09:42:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=49046116</link><dc:creator>gsliepen</dc:creator><comments>https://news.ycombinator.com/item?id=49046116</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49046116</guid></item><item><title><![CDATA[New comment by gsliepen in "How we can reduce traffic congestion"]]></title><description><![CDATA[
<p>> However, I have to wonder about the cost of these projects.<p>A very good way to deal with this is to recognize that all infrastructure needs maintenance and periodic replacement. Once it is time to replace a road, that is when you change it to include bike paths, bus lanes and so on.<p>You need some foresight, planning, make new road designs part of law, and political will. Some countries have made this work very well.</p>
]]></description><pubDate>Mon, 13 Jul 2026 07:16:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=48889009</link><dc:creator>gsliepen</dc:creator><comments>https://news.ycombinator.com/item?id=48889009</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48889009</guid></item><item><title><![CDATA[New comment by gsliepen in "Bootimus – A Self-Contained PXE and HTTP Boot Server"]]></title><description><![CDATA[
<p>Nice, although if you already are running your own DHCP and web server, it's very easy to add a TFTP server and configure everything to serve whatever you want. So it does feel a bit like reinventing the wheel to me.<p>A PXE boot server has many uses. The project already mentions using it for tools like GParted, Memtest86+ and so on. Booting live OS or OS installers via netboot.xyz is also great. But you can automate things even further; at a previous job (~18 years ago) I used PXE to serve a debian installer image with a preseed file to add user accounts with SSH keys, apt install all the dependencies, and install local binaries to get machines up and running useful stuff without needing to do any manual configuration. Nowadays you'd probably just have it do a minimal install + add just an SSH key, and then let another tool like Ansible take over the rest of the provisioning.</p>
]]></description><pubDate>Sat, 20 Jun 2026 15:33:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=48609966</link><dc:creator>gsliepen</dc:creator><comments>https://news.ycombinator.com/item?id=48609966</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48609966</guid></item><item><title><![CDATA[New comment by gsliepen in "Ask HN: Will programmers write more efficient code during the memory shortage?"]]></title><description><![CDATA[
<p>It's definitely possible, but I agree with many other commenters it probably will not happen.<p>I wrote an encrypted mesh networking library that runs on normal operating systems. A customer asked me if I could make it run on an ESP32 with 520 kiB of RAM. At first this seemed impossible, but it turned out that it was, and not even that hard. While the original library was not memory hungry at all for a desktop CPU, it still wasted space on unnecessarily large buffers. Cutting those out made the library run on an ESP32 while leaving plenty of room for an application.<p>Also, my first PC was a 200 MHz single-core 32-bit AMD k6 with 32 MiB of RAM. This ran a graphical OS with browsers, word processors, 3D games and so on. Nowadays you can get a CPU with more than that amount of RAM as just built-in cache.<p>So a good place to start optimizing code would be to actually get a "severely resource constrained" computer and start making your code work on it.</p>
]]></description><pubDate>Sat, 20 Jun 2026 09:23:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=48607740</link><dc:creator>gsliepen</dc:creator><comments>https://news.ycombinator.com/item?id=48607740</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48607740</guid></item><item><title><![CDATA[New comment by gsliepen in "Let's Encrypt had a higher error rate for 90 minutes today"]]></title><description><![CDATA[
<p>Ok, but that would just be your own website having a single point of failure, not that Let's Encrypt is a single point of failure. Otherwise you could call every certificate authority a single point of failure.</p>
]]></description><pubDate>Sat, 20 Jun 2026 09:11:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=48607657</link><dc:creator>gsliepen</dc:creator><comments>https://news.ycombinator.com/item?id=48607657</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48607657</guid></item><item><title><![CDATA[New comment by gsliepen in "Let's Encrypt had a higher error rate for 90 minutes today"]]></title><description><![CDATA[
<p>No, it's not. You can always switch to a different SSL provider. There are other free ones (as mentioned in other comments).<p>However, thinking about how to make your own setup more robust without having to manually change configuration when one SSL provider stops working is a good exercise. I wonder if you can just get your server's private key signed by multiple SSL providers, and serve multiple certificates to clients, and whether all browsers handle that correctly.</p>
]]></description><pubDate>Fri, 19 Jun 2026 07:48:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=48595963</link><dc:creator>gsliepen</dc:creator><comments>https://news.ycombinator.com/item?id=48595963</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48595963</guid></item><item><title><![CDATA[New comment by gsliepen in "Show HN: We built an 8-bit CPU as 2nd year EE students"]]></title><description><![CDATA[
<p>Very nice. I wonder if implementing a one-instruction set computer (for example something that implements Adrian Cable's subleq VM, see <a href="https://www.ioccc.org/2025/cable/" rel="nofollow">https://www.ioccc.org/2025/cable/</a>) would be educational and whether it can make the design of a computer from discrete logic chips simpler or more complex. Though it would very likely not be as efficient.</p>
]]></description><pubDate>Thu, 18 Jun 2026 07:51:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=48582194</link><dc:creator>gsliepen</dc:creator><comments>https://news.ycombinator.com/item?id=48582194</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48582194</guid></item><item><title><![CDATA[New comment by gsliepen in "The 29th International Obfuscated C Code Contest (IOCCC) 2025 Winners"]]></title><description><![CDATA[
<p>Nice! What surprised my about the IOCCC submission though was how fast it ran. Sure, subleq can at least do some useful arithmetic in one instructions, but it still requires a lot of instructions to do an integer multiplication, let alone a floating point operation. But DOOM was actually playable with a decent FPS.</p>
]]></description><pubDate>Mon, 08 Jun 2026 10:48:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=48443668</link><dc:creator>gsliepen</dc:creator><comments>https://news.ycombinator.com/item?id=48443668</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48443668</guid></item><item><title><![CDATA[New comment by gsliepen in "WriteUp: 16 Bytes of x86 that turn Matrix rain into sound"]]></title><description><![CDATA[
<p>Seems like this does the reverse of the C64 demo "A Mind Is Born" (<a href="https://linusakesson.net/scene/a-mind-is-born/" rel="nofollow">https://linusakesson.net/scene/a-mind-is-born/</a>): that one is making music first, and simultaneously interprets it as graphics. Of course that C64 demo is huge compared to this x86 one :)</p>
]]></description><pubDate>Mon, 18 May 2026 07:51:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=48176635</link><dc:creator>gsliepen</dc:creator><comments>https://news.ycombinator.com/item?id=48176635</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48176635</guid></item><item><title><![CDATA[New comment by gsliepen in "Boriel BASIC"]]></title><description><![CDATA[
<p>There was a wild range in capabilities in the various BASIC implementations of that time. I grew up with an Amstrad CPC6128, it came with Locomotive BASIC (<a href="https://en.wikipedia.org/wiki/Locomotive_BASIC" rel="nofollow">https://en.wikipedia.org/wiki/Locomotive_BASIC</a>), which was very capable: at one point I had written a multiplayer game with background music in it, without needing a single PEEK, POKE or CALL. The few times I saw Commodore BASIC programs it was littered with those three.</p>
]]></description><pubDate>Tue, 12 May 2026 07:36:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=48105328</link><dc:creator>gsliepen</dc:creator><comments>https://news.ycombinator.com/item?id=48105328</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48105328</guid></item><item><title><![CDATA[New comment by gsliepen in "Hardware Attestation as Monopoly Enabler"]]></title><description><![CDATA[
<p>I'm happy that my bank (still) allows me to have both a stand-alone reader and a mobile app to authenticate. Because if you lose your authentication device, a lot of things suddenly get a lot harder.<p>I also tried to use an old phone as a backup device. However, most authentication apps only allow it to be installed on a single device.</p>
]]></description><pubDate>Mon, 11 May 2026 08:08:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=48092310</link><dc:creator>gsliepen</dc:creator><comments>https://news.ycombinator.com/item?id=48092310</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48092310</guid></item><item><title><![CDATA[New comment by gsliepen in "Show HN: Building a web server in assembly to give my life (a lack of) meaning"]]></title><description><![CDATA[
<p>And even if you avoid external libraries, you still need to interact with the kernel to do I/O, and that involves system calls that are also non-portable.</p>
]]></description><pubDate>Sun, 10 May 2026 10:22:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=48082625</link><dc:creator>gsliepen</dc:creator><comments>https://news.ycombinator.com/item?id=48082625</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48082625</guid></item><item><title><![CDATA[New comment by gsliepen in "If I could make my own GitHub"]]></title><description><![CDATA[
<p>I would use RFC2822 as the underlying format to store any kind of message (pull request, review comment, issue etc.), and of course when displaying messages use CommonMark to style them. Any metadata goes into headers, and Message-ID/In-Reply-To/References headers can be used to link them all together. Using this well defined format you can then decide how to best store and transport all the messages, maybe in a git repo as well, use email, or whatever else works.<p>I personally think Gerrit works much better than whatever GitHub et al. have for code reviews. As for CI, I would try to keep that out of it as much as possible; just hooks to start a pipeline and to display the result and decide whether to allow a merge or not.</p>
]]></description><pubDate>Fri, 01 May 2026 12:20:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=47973950</link><dc:creator>gsliepen</dc:creator><comments>https://news.ycombinator.com/item?id=47973950</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47973950</guid></item><item><title><![CDATA[New comment by gsliepen in ""Parse, don't validate" through the years with C++"]]></title><description><![CDATA[
<p>Rust's FromStr only deals with parsing a single object. However, ideally std::scan() would be an exact counterpart of std::print() and would be able to parse multiple objects. I totally agree that the C way of passing references to already existing variables is not great. Ideally you return a tuple of objects, but then it becomes very annoying to specify the types. Maybe something like this?<p><pre><code>    auto [value, text, goose] = std::scan<int, std::string, Goose>(input, "{} {} {}");
</code></pre>
A halfway solution would be to have the hypothetical std::scan() take references to std::optional<>s or std::expected<>s:<p><pre><code>    std::optional<int> value;
    std::optional<std::string> text;
    std::optional<Goose> goose;
    /* auto result = */ std::scan(input, "{} {} {}", value, text, goose);
</code></pre>
The latter would be type safe, close to how scanf() works, but less satisfying from a functional programming standpoint.<p>Orthogonal to that, adding support for scanning a Goose would be just like how you add a formatter for it, and would be quite similar to a Rust trait. One could imagine having to define something like this:<p><pre><code>    template<>
    struct std::scanner<Goose> {
        constexpr auto parse(std::format_parse_context& ctx) {…}
        auto scan(std::format_context& ctx) const -> std::optional<Goose> {…}
    };</code></pre></p>
]]></description><pubDate>Thu, 30 Apr 2026 19:52:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=47967393</link><dc:creator>gsliepen</dc:creator><comments>https://news.ycombinator.com/item?id=47967393</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47967393</guid></item></channel></rss>