<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: wasmperson</title><link>https://news.ycombinator.com/user?id=wasmperson</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Tue, 28 Jul 2026 04:12:52 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=wasmperson" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by wasmperson in "Introduction to Data-Oriented Design [pdf]"]]></title><description><![CDATA[
<p>One good example of DoD which isn't CPU-cache-related is relational databases.  When designing a CRUD application, the Data-Oriented way of doing it is to figure out what data you will be storing and how to organize that data to minimize access times, which is what you're doing when you design the DB schema.<p>An example of failing to follow DoD is the N+1 query problem: a programmer builds an abstraction that operates on individual DB rows, but "where there's one, there's more than one": you will inevitably be running that code in a loop so that you can process multiple rows.  If instead the programmer had abstracted over <i>groups</i> of rows, then per-item query overheads suddenly become per-batch overheads.</p>
]]></description><pubDate>Sun, 26 Jul 2026 23:36:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=49063465</link><dc:creator>wasmperson</dc:creator><comments>https://news.ycombinator.com/item?id=49063465</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49063465</guid></item><item><title><![CDATA[New comment by wasmperson in "Introduction to Data-Oriented Design [pdf]"]]></title><description><![CDATA[
<p>I feel like DoD is one of those things that only makes sense after you already believe in it.  There's a sort of KISS epiphany that you have to go through which I don't think the commonly available info on DoD helps you to reach.  It doesn't help that everything about it tends to get hung up on overly-specific C++ optimization advice.</p>
]]></description><pubDate>Sun, 26 Jul 2026 23:09:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=49063290</link><dc:creator>wasmperson</dc:creator><comments>https://news.ycombinator.com/item?id=49063290</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49063290</guid></item><item><title><![CDATA[New comment by wasmperson in "Fil-C: Garbage In, Memory Safety Out [video]"]]></title><description><![CDATA[
<p>It's hard for me to think of a definition of "exception" which doesn't include Rust's panics:<p><pre><code>  use std::panic::catch_unwind;
  fn throws_exception(){
      panic!("hello");
  }
  fn main(){
      match catch_unwind(|| {
          throws_exception();
          println!("Never reached");
      }) {
          Ok(_) => (),
          Err(e) => println!(
              "threw an exception: {:?}",
              e.downcast_ref::<&'static str>().unwrap())
      }
  }
</code></pre>
I can disable exceptions in rustc, but I can't disable the influence they have on language and library design (as detailed in the link I posted).  Exceptions are the main reason you can't temporarily move something out from behind an exclusive reference, or return an error code from a Drop impl.  Heck, Rust wouldn't even <i>need</i> destructors if it weren't for exceptions: the compiler could just tell you when you forgot to free something.</p>
]]></description><pubDate>Sat, 25 Jul 2026 15:29:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=49048402</link><dc:creator>wasmperson</dc:creator><comments>https://news.ycombinator.com/item?id=49048402</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49048402</guid></item><item><title><![CDATA[New comment by wasmperson in "Fil-C: Garbage In, Memory Safety Out [video]"]]></title><description><![CDATA[
<p>Now it's <i>your</i> example that's too simple.  I can't present a counter-example that wouldn't look totally different: if you avoid the indexing operator then trivially incorrect code like that becomes unrepresentable.  It's like if I said destructors help you avoid memory leaks and you asked how you'd avoid a leak in a single-function program that does nothing but call `Box::leak()`.<p>Again: I'm not disputing the fact that the rust index operator does a dynamic bounds check.</p>
]]></description><pubDate>Fri, 24 Jul 2026 23:15:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=49042771</link><dc:creator>wasmperson</dc:creator><comments>https://news.ycombinator.com/item?id=49042771</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49042771</guid></item><item><title><![CDATA[New comment by wasmperson in "Fil-C: Garbage In, Memory Safety Out [video]"]]></title><description><![CDATA[
<p>The worst part about rust not having exceptions is that it actually <i>does</i> have exceptions, you just shouldn't use them.  All the downsides and none of the benefits:<p><a href="https://smallcultfollowing.com/babysteps/blog/2024/05/02/unwind-considered-harmful/" rel="nofollow">https://smallcultfollowing.com/babysteps/blog/2024/05/02/unw...</a></p>
]]></description><pubDate>Fri, 24 Jul 2026 22:22:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=49042342</link><dc:creator>wasmperson</dc:creator><comments>https://news.ycombinator.com/item?id=49042342</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49042342</guid></item><item><title><![CDATA[New comment by wasmperson in "Fil-C: Garbage In, Memory Safety Out [video]"]]></title><description><![CDATA[
<p>The way I see it, as far as memory safety is concerned that's just framing.  Both Fil-C and Rust have a boundary below which the unsafe lives.  If Fil-C is only safer than rust when you don't pass the `-F unsafe_code` argument to rustc then IMO "safer" in this case is somewhat of an empty claim.</p>
]]></description><pubDate>Fri, 24 Jul 2026 22:04:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=49042178</link><dc:creator>wasmperson</dc:creator><comments>https://news.ycombinator.com/item?id=49042178</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49042178</guid></item><item><title><![CDATA[New comment by wasmperson in "Fil-C: Garbage In, Memory Safety Out [video]"]]></title><description><![CDATA[
<p>Yes, rust didn't invent the concept of an iterator, and is thus not the only language which offers a solution to statically avoid bounds checks.  Feel free to give a more "interesting" case you believe rust wouldn't be able to handle.</p>
]]></description><pubDate>Fri, 24 Jul 2026 21:54:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=49042068</link><dc:creator>wasmperson</dc:creator><comments>https://news.ycombinator.com/item?id=49042068</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49042068</guid></item><item><title><![CDATA[New comment by wasmperson in "Fil-C: Garbage In, Memory Safety Out [video]"]]></title><description><![CDATA[
<p>This isn't entirely true.  Rust's indexing operator performs a dynamic check but the language and stdlib have a number of ways to access array elements without indexing, which is effectively a form of static checking.  For example, the following loop is statically guaranteed to not go OOB, and will not emit any unnecessary bounds checks:<p><pre><code>  for i in some_arr {
    println!("{i}");
  }
</code></pre>
I suspect most techniques you could think of to statically avoid bounds checks are possible in rust's type system.</p>
]]></description><pubDate>Fri, 24 Jul 2026 20:19:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=49041116</link><dc:creator>wasmperson</dc:creator><comments>https://news.ycombinator.com/item?id=49041116</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49041116</guid></item><item><title><![CDATA[New comment by wasmperson in "Fil-C: Garbage In, Memory Safety Out [video]"]]></title><description><![CDATA[
<p>> For example you can call mmap in Fil-C and it is still guaranteed to be memory safe, while in Rust you can easily violate memory safety by calling mmap.<p>That's the thing, though.  Your Fil-C code isn't calling mmap, it's calling the Fil-C wrapper for mmap.  In neither Fil-C nor Rust('s safe subset) can you call the actual system mmap.</p>
]]></description><pubDate>Fri, 24 Jul 2026 20:13:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=49041042</link><dc:creator>wasmperson</dc:creator><comments>https://news.ycombinator.com/item?id=49041042</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49041042</guid></item><item><title><![CDATA[New comment by wasmperson in "Fil-C: Garbage In, Memory Safety Out [video]"]]></title><description><![CDATA[
<p>He claims that all syscalls are safe because they're implemented by his custom libc, but that libc then calls out to the system libc, where the system calls are unsafe.  He then claims that this is unlike rust, where making a syscall is unsafe.  If you stick to the rust standard library in the same way that fil-c programs stick to the fil-c standard library, then all of your rust "system calls" are safe, too.<p>Someone in the audience also pointed out that a tool like this could be used to compile rust programs, not just C programs, in which case it's odd to hear Fil-C repeatedly framed as a language in opposition to rust rather than as a tool which might complement it.</p>
]]></description><pubDate>Thu, 23 Jul 2026 22:43:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=49029053</link><dc:creator>wasmperson</dc:creator><comments>https://news.ycombinator.com/item?id=49029053</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49029053</guid></item><item><title><![CDATA[New comment by wasmperson in "Measuring Input Latency on Linux: X11 vs. Wayland, VRR, and DXVK"]]></title><description><![CDATA[
<p>> Its their time to spend as they see fit.<p>I'm complaining on these developers' behalf, not bemoaning them doing what they were more or less forced to do.  If glibc decided tomorrow to remove the `malloc` function from their library and every C project suddenly had to implement its own allocator, that would be a massive waste of everybody's time, no?</p>
]]></description><pubDate>Wed, 15 Jul 2026 20:38:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=48926746</link><dc:creator>wasmperson</dc:creator><comments>https://news.ycombinator.com/item?id=48926746</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48926746</guid></item><item><title><![CDATA[New comment by wasmperson in "How I use HTMX with Go"]]></title><description><![CDATA[
<p>> If you're curious, and you too aren't in love with the "Modern frontend" philosophy<p>I'm also going to hesitantly mention sveltekit.  From the outside it looks like yet another JS front-end framework but having been forced to use it recently I've learned it actually has great support for the more hypertext-focused design philosophy promoted by HTMX and friends.</p>
]]></description><pubDate>Tue, 14 Jul 2026 22:34:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=48913790</link><dc:creator>wasmperson</dc:creator><comments>https://news.ycombinator.com/item?id=48913790</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48913790</guid></item><item><title><![CDATA[New comment by wasmperson in "Measuring Input Latency on Linux: X11 vs. Wayland, VRR, and DXVK"]]></title><description><![CDATA[
<p>Sure Wayland works fine.  What you're not seeing is the hours and hours of volunteer labor wasted to get it to that point.  Time that <i>could</i> have been spent working on features users actually cared about, now wasted "adding wayland support" to your favorite applications.  If you could quantify it, the waste would be borderline criminal:<p>- Effort spent writing sway that could have been spent improving i3<p>- Effort spent writing GNOME-Wayland that could have been spent improving GNOME<p>- Effort spent writing KDE-Wayland that could have been spent improving KDE (much of this work duplicated effort with GNOME-Wayland)<p>- Effort spent writing wlroots to try and mitigate the effort being wasted by people writing bespoke compositors<p>- Wine/Proton devs needing to waste time getting every windows application to work in Wayland<p>- Firefox needing to target both Wayland and X<p>- A bunch of graphical toolkits and window managers that were working perfectly fine but will now be "left behind" since they lack the maintainers to support a porting effort<p>- low-level toolkits like SDL needing to implement their own window decorations now that they're not guaranteed to be provided by the OS (what?!)<p>What Wayland proves to me is just how easy it is for a small number of developers to unintentionally sabotage productivity in a much larger project.</p>
]]></description><pubDate>Tue, 14 Jul 2026 19:33:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=48911912</link><dc:creator>wasmperson</dc:creator><comments>https://news.ycombinator.com/item?id=48911912</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48911912</guid></item><item><title><![CDATA[New comment by wasmperson in "How the FSF sysadmins block botnets with reaction"]]></title><description><![CDATA[
<p>I indeed did not know about this.  There seem to be some caveats:<p><a href="https://anubis.techaro.lol/docs/admin/configuration/challenges/metarefresh" rel="nofollow">https://anubis.techaro.lol/docs/admin/configuration/challeng...</a><p>I guess for the meta refresh challenge it's less "proof of work" and more "proof of patience".</p>
]]></description><pubDate>Tue, 14 Jul 2026 16:40:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=48909493</link><dc:creator>wasmperson</dc:creator><comments>https://news.ycombinator.com/item?id=48909493</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48909493</guid></item><item><title><![CDATA[New comment by wasmperson in "How the FSF sysadmins block botnets with reaction"]]></title><description><![CDATA[
<p>It's somewhat interesting to see the FSF's approach to this.  From what I understand they can't really use something like anubis since they want their websites to be accessible without javascript:<p><a href="https://www.gnu.org/philosophy/javascript-trap.html" rel="nofollow">https://www.gnu.org/philosophy/javascript-trap.html</a><p>Users can't consent to running a page's javascript the way they can consent to running a program they've intentionally downloaded, so it's effectively "non-free" regardless of license.</p>
]]></description><pubDate>Tue, 14 Jul 2026 16:15:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=48909087</link><dc:creator>wasmperson</dc:creator><comments>https://news.ycombinator.com/item?id=48909087</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48909087</guid></item><item><title><![CDATA[New comment by wasmperson in "Why Vanilla JavaScript"]]></title><description><![CDATA[
<p>> but then product introduces a business rule where some fields need to be hidden when another option is selected somewhere<p><pre><code>  function initWidget(root){
    // Or a bunch of calls to document.createElement, whatever you want.
    const inp = root.querySelector('.input');
    const check = root.querySelector('.check');

    function update(){
      inp.style.display = check.checked ? 'none' : 'block';
    }
    check.onchange = update;
  }
</code></pre>
> O, but not when this checked, etc.<p><pre><code>  function initWidget(root){
    // Or a bunch of calls to document.createElement, whatever you want.
    const inp = root.querySelector('.input');
    const check = root.querySelector('.check');
    const check2 = root.querySelector('.check2');

    function update(){
      inp.style.display = check.checked && !check2.checked ? 'none' : 'block';
    }
    check.onchange = update;
    check2.onchange = update;
  }
</code></pre>
Compare to React:<p><pre><code>  function Widget(){
    const [check1, setCheck1] = useState(false);
    const [check2, setCheck2] = useState(false);

    return <>
      <input type="checkbox"
        checked={check1} onChange={e => setCheck1(e.target.checked)}/>
      <input type="checkbox"
        checked={check2} onChange={e => setCheck2(e.target.checked)}/>
      {check1 && !check2 && <input type="text" />}
    </>;
  }
</code></pre>
Compare to Svelte:<p><pre><code>  <script>
    let check1 = $state(false);
    let check2 = $state(false);
  </script>

  <input type="checkbox" bind:checked={check1}>
  <input type="checkbox" bind:checked={check2}>
  {#if check1 && !check2}
    <input type="text">
  {/if}
</code></pre>
IME almost none of the complexity in any of the web applications I've worked with has been mitigated by the front-end framework in use.  You still need to write the code to do the thing, whatever that thing is.  You might as well write it in the framework that gives you the smallest bundle size and the best possible backwards compatibility, and that's vanilla JS + the standard web APIs.</p>
]]></description><pubDate>Tue, 14 Jul 2026 00:26:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=48900799</link><dc:creator>wasmperson</dc:creator><comments>https://news.ycombinator.com/item?id=48900799</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48900799</guid></item><item><title><![CDATA[New comment by wasmperson in "Understanding the Odin programming language"]]></title><description><![CDATA[
<p>Agreed.  IME the main reason to choose arena allocators is for correctness, not speed.  They make similar time/space tradeoffs to garbage collectors in that they grant higher allocation throughput in exchange for more memory usage.<p>The perf argument against RAII is very abstract and is less "RAII causes bad performance" and more "the kind of design that leads you to reach for RAII is the kind of design that's bad for performance."  There exist similar hand-wavy arguments against many other C++/Rust features.<p>More generally, "you shouldn't even want that" is basically a meme at this point in programming language design.  Every new-ish language has some version of it.</p>
]]></description><pubDate>Sun, 12 Jul 2026 17:01:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=48882617</link><dc:creator>wasmperson</dc:creator><comments>https://news.ycombinator.com/item?id=48882617</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48882617</guid></item><item><title><![CDATA[New comment by wasmperson in "Almost Always Unsigned"]]></title><description><![CDATA[
<p>Thinking of it as a "stopping condition" is backwards, that part of the loop is called the invariant:<p><a href="https://en.wikipedia.org/wiki/Loop_invariant" rel="nofollow">https://en.wikipedia.org/wiki/Loop_invariant</a><p>You should think of it as the condition that's true for all iterations, not a one-time event that halts the loop.  The loop is short for this:<p><pre><code>  for(size_t i = size - 1; 0 <= i && i < size; i--){
  
  }
</code></pre>
Which works for both signed and unsigned numbers.  It just so happens that for unsigned numbers you can omit the left-hand side of the &&, and for signed numbers you can omit the right-hand side.  To support arbitrary lower bounds, you omit neither.</p>
]]></description><pubDate>Thu, 09 Jul 2026 01:00:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=48839591</link><dc:creator>wasmperson</dc:creator><comments>https://news.ycombinator.com/item?id=48839591</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48839591</guid></item><item><title><![CDATA[New comment by wasmperson in "A native graphical shell for SSH"]]></title><description><![CDATA[
<p>> without having to do any sudo commands or expose anything new to the network.<p>Again I'm not understanding the distinction.  I don't need to run sudo commands to install a web server, and depending on your definition of "exposing something new" to the network then either I don't have to do that either or your solution also does that.<p><i>Something</i> is getting downloaded and run on the remote machine, correct?  Why is it problematic for that something to be a web server (with SSH-forwarding I guess) instead of this custom thing?<p>And why install anything on the server <i>at all</i> if it'll just serve a binary that downloads and runs on your local computer anyway?  For example, if I type `sftp://username@server.domain/file/path` into my file manager's address bar, I get the nice file browsing experience you demonstrate without installing anything on my computer <i>or</i> the server.<p>EDIT: OK, after reading through your earlier posts, I think the value proposition really is just that you've implemented a slightly better UX for proxying remote web servers via ssh, and that the "run native code" thing is an independent idea you are also pursuing.  So the answer to the question "isn't this just proxying an http server over ssh" is basically yes.<p>I think I incorrectly read this as attempting to propose a radically new idea and not as an incremental improvement to the status quo.</p>
]]></description><pubDate>Tue, 30 Jun 2026 00:05:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=48726962</link><dc:creator>wasmperson</dc:creator><comments>https://news.ycombinator.com/item?id=48726962</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48726962</guid></item><item><title><![CDATA[New comment by wasmperson in "A native graphical shell for SSH"]]></title><description><![CDATA[
<p>> it requires exposing a port to the internet or using some SSH port forwarding tool<p>This sentence is bizarre to me.  Your SSH-based solution <i>also</i> requires exposing a port to the internet and installing a special tool (on both server and client!).  What's so special about SSH that using HTTPS is a problem but using SSH isn't?<p>The industry also tried the whole "use the web browser to run native binaries" thing with ActiveX (and the unity web player I guess).  The idea was thrown out along with flash and java applets for what I presume were security and portability reasons.</p>
]]></description><pubDate>Mon, 29 Jun 2026 22:44:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=48726320</link><dc:creator>wasmperson</dc:creator><comments>https://news.ycombinator.com/item?id=48726320</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48726320</guid></item></channel></rss>