<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: jamii</title><link>https://news.ycombinator.com/user?id=jamii</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 16 Jul 2026 05:43:08 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=jamii" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[Artificial Adventures]]></title><description><![CDATA[
<p>Article URL: <a href="https://www.scattered-thoughts.net/writing/artificial-adventures/">https://www.scattered-thoughts.net/writing/artificial-adventures/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=48755184">https://news.ycombinator.com/item?id=48755184</a></p>
<p>Points: 25</p>
<p># Comments: 2</p>
]]></description><pubDate>Thu, 02 Jul 2026 01:14:35 +0000</pubDate><link>https://www.scattered-thoughts.net/writing/artificial-adventures/</link><dc:creator>jamii</dc:creator><comments>https://news.ycombinator.com/item?id=48755184</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48755184</guid></item><item><title><![CDATA[I'm Not a Cat]]></title><description><![CDATA[
<p>Article URL: <a href="https://www.scattered-thoughts.net/writing/im-not-a-cat/">https://www.scattered-thoughts.net/writing/im-not-a-cat/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=48666512">https://news.ycombinator.com/item?id=48666512</a></p>
<p>Points: 5</p>
<p># Comments: 1</p>
]]></description><pubDate>Wed, 24 Jun 2026 22:47:53 +0000</pubDate><link>https://www.scattered-thoughts.net/writing/im-not-a-cat/</link><dc:creator>jamii</dc:creator><comments>https://news.ycombinator.com/item?id=48666512</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48666512</guid></item><item><title><![CDATA[New comment by jamii in "Borrow-checking without type-checking"]]></title><description><![CDATA[
<p>> It seems like either one evaluates the contents of the `box`, and would only make a difference if you tried to use `x` afterwards?<p>More or less. x^ moves the whole box whereas x* copies the contents of the box.<p>> Awkwardly, it also hasn't been assigned so I'm not sure the box is accessible anymore?<p>Yes, if you move something and don't assign it then it gets dropped, same as rust.</p>
]]></description><pubDate>Thu, 23 Apr 2026 16:21:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=47877645</link><dc:creator>jamii</dc:creator><comments>https://news.ycombinator.com/item?id=47877645</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47877645</guid></item><item><title><![CDATA[New comment by jamii in "Borrow-checking without type-checking"]]></title><description><![CDATA[
<p>> The goal is that most of your code can have the assurances of static typing, but you can still opt in to dynamically-typed glue code to handle repls, live code reloading, runtime code generation, malleable software etc.</p>
]]></description><pubDate>Thu, 23 Apr 2026 05:23:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=47872498</link><dc:creator>jamii</dc:creator><comments>https://news.ycombinator.com/item?id=47872498</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47872498</guid></item><item><title><![CDATA[Borrow-checking without type-checking]]></title><description><![CDATA[
<p>Article URL: <a href="https://www.scattered-thoughts.net/writing/borrow-checking-without-type-checking/">https://www.scattered-thoughts.net/writing/borrow-checking-without-type-checking/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47871817">https://news.ycombinator.com/item?id=47871817</a></p>
<p>Points: 91</p>
<p># Comments: 32</p>
]]></description><pubDate>Thu, 23 Apr 2026 02:55:17 +0000</pubDate><link>https://www.scattered-thoughts.net/writing/borrow-checking-without-type-checking/</link><dc:creator>jamii</dc:creator><comments>https://news.ycombinator.com/item?id=47871817</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47871817</guid></item><item><title><![CDATA[Borrow-Checking Surprises]]></title><description><![CDATA[
<p>Article URL: <a href="https://www.scattered-thoughts.net/writing/borrow-checking-surprises/">https://www.scattered-thoughts.net/writing/borrow-checking-surprises/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47713964">https://news.ycombinator.com/item?id=47713964</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 10 Apr 2026 05:21:28 +0000</pubDate><link>https://www.scattered-thoughts.net/writing/borrow-checking-surprises/</link><dc:creator>jamii</dc:creator><comments>https://news.ycombinator.com/item?id=47713964</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47713964</guid></item><item><title><![CDATA[New comment by jamii in "Show HN: Tiny VM sandbox in C with apps in Rust, C and Zig"]]></title><description><![CDATA[
<p>Wasm-mvp is very simple, especially if you drop the floating point instructions. But WAMR supports a lot of extensions - <a href="https://github.com/bytecodealliance/wasm-micro-runtime?tab=readme-ov-file#wasm-post-mvp-features" rel="nofollow">https://github.com/bytecodealliance/wasm-micro-runtime?tab=r...</a>. There is a garbage collector, jit, WASI, threads, debugger support etc.</p>
]]></description><pubDate>Sat, 13 Dec 2025 21:14:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=46258136</link><dc:creator>jamii</dc:creator><comments>https://news.ycombinator.com/item?id=46258136</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46258136</guid></item><item><title><![CDATA[Do We Understand SQL?]]></title><description><![CDATA[
<p>Article URL: <a href="https://www.youtube.com/watch?v=qiVUf9X6ItM">https://www.youtube.com/watch?v=qiVUf9X6ItM</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=46156023">https://news.ycombinator.com/item?id=46156023</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 05 Dec 2025 02:02:21 +0000</pubDate><link>https://www.youtube.com/watch?v=qiVUf9X6ItM</link><dc:creator>jamii</dc:creator><comments>https://news.ycombinator.com/item?id=46156023</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46156023</guid></item><item><title><![CDATA[New comment by jamii in "Is Zig's new writer unsafe?"]]></title><description><![CDATA[
<p>My bad :)</p>
]]></description><pubDate>Sat, 20 Sep 2025 22:43:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=45318264</link><dc:creator>jamii</dc:creator><comments>https://news.ycombinator.com/item?id=45318264</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45318264</guid></item><item><title><![CDATA[New comment by jamii in "Is Zig's new writer unsafe?"]]></title><description><![CDATA[
<p>EDIT I totally missed the context</p>
]]></description><pubDate>Sat, 20 Sep 2025 21:01:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=45317491</link><dc:creator>jamii</dc:creator><comments>https://news.ycombinator.com/item?id=45317491</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45317491</guid></item><item><title><![CDATA[New comment by jamii in "WASM 3.0 Completed"]]></title><description><![CDATA[
<p>I've tried using binaryen, and I've also tried emitting raw wasm by hand, and the latter was far easier. It only took ~200 lines of wasm-specific code.</p>
]]></description><pubDate>Wed, 17 Sep 2025 21:57:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=45281864</link><dc:creator>jamii</dc:creator><comments>https://news.ycombinator.com/item?id=45281864</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45281864</guid></item><item><title><![CDATA[New comment by jamii in "SQL needed structure"]]></title><description><![CDATA[
<p>Yeah, json is annoying because of the limited types, but postgres arrays/rows are annoying because of the lack of sum/union types (if your UI has a heterogenous list of elements).<p>The OLAP world has much nicer type systems eg <a href="https://duckdb.org/docs/stable/sql/data_types/union.html" rel="nofollow">https://duckdb.org/docs/stable/sql/data_types/union.html</a>.</p>
]]></description><pubDate>Sat, 06 Sep 2025 08:20:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=45147545</link><dc:creator>jamii</dc:creator><comments>https://news.ycombinator.com/item?id=45147545</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45147545</guid></item><item><title><![CDATA[New comment by jamii in "Evidence that AI is destroying jobs for young people"]]></title><description><![CDATA[
<p>One of the dynamics is that people get older so they move into different buckets.<p>We can make the model way simpler to make it clearer. Say in 2020 we hired 1000 20-24yo, 1000 25-29yo etc and then we didn't hire anyone since then. That was five years ago, so now we have 0 20-24yo, 1000 25-29yo, 1000 30-34yo etc and 1000 retirees who don't show up in the graph.<p>Each individual year we hired the exact same number of people in each age bracket, and yet we still end up with fewer young people total whenever hiring goes down, because all the people that got hired during the big hiring spike are now older.</p>
]]></description><pubDate>Thu, 04 Sep 2025 04:34:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=45123617</link><dc:creator>jamii</dc:creator><comments>https://news.ycombinator.com/item?id=45123617</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45123617</guid></item><item><title><![CDATA[New comment by jamii in "Evidence that AI is destroying jobs for young people"]]></title><description><![CDATA[
<p>I made a stupid simple model where hiring in all age brackets rose slowly until 2021 and then fell slowly. That produces very similar looking graphs, because the many engineers that were hired at the peak move up the demographic curve over time. Normalizing the graph to 2022 levels, as the paper seems to do, hides the fact that the actual hiring ratios didn't change at all.<p><a href="https://docs.google.com/spreadsheets/d/1z0l0rNebCTVWLk77_7HAwVzL7QtTjlrllAMH2lxhnes/edit?usp=sharing" rel="nofollow">https://docs.google.com/spreadsheets/d/1z0l0rNebCTVWLk77_7HA...</a></p>
]]></description><pubDate>Thu, 04 Sep 2025 01:20:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=45122357</link><dc:creator>jamii</dc:creator><comments>https://news.ycombinator.com/item?id=45122357</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45122357</guid></item><item><title><![CDATA[New comment by jamii in "Go allocation probe"]]></title><description><![CDATA[
<p>The ... is the useful part. We actually want that string, so we can't avoid allocating it.<p>But the &str at the end is an additional heap allocation and causes an additional pointer hop when using the string. The only reason the function returns a pointer to a string in the first place is so that the nil check at the beginning can return nil. The calling code always checks if the result is nil and then immediately dereferences the string pointer. A better interface would be to panic if the argument is nil, or if that's too scary then:<p><pre><code>    func (thing *Thing) String() (string, bool) {
        if thing == nil {
            return "", false
        }
        str := ...
        return str, true
    }</code></pre></p>
]]></description><pubDate>Tue, 22 Jul 2025 21:03:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=44652972</link><dc:creator>jamii</dc:creator><comments>https://news.ycombinator.com/item?id=44652972</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44652972</guid></item><item><title><![CDATA[Store Tags After Payloads]]></title><description><![CDATA[
<p>Article URL: <a href="https://www.scattered-thoughts.net/writing/store-tags-after-payloads/">https://www.scattered-thoughts.net/writing/store-tags-after-payloads/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=44566710">https://news.ycombinator.com/item?id=44566710</a></p>
<p>Points: 3</p>
<p># Comments: 0</p>
]]></description><pubDate>Tue, 15 Jul 2025 00:26:51 +0000</pubDate><link>https://www.scattered-thoughts.net/writing/store-tags-after-payloads/</link><dc:creator>jamii</dc:creator><comments>https://news.ycombinator.com/item?id=44566710</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44566710</guid></item><item><title><![CDATA[New comment by jamii in "Store Tags After Payloads"]]></title><description><![CDATA[
<p>I'm curious if any languages other than swift do this.</p>
]]></description><pubDate>Mon, 14 Jul 2025 06:28:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=44557048</link><dc:creator>jamii</dc:creator><comments>https://news.ycombinator.com/item?id=44557048</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44557048</guid></item><item><title><![CDATA[New comment by jamii in "Austral: A Systems Language with Linear Types and Capabilities (2022)"]]></title><description><![CDATA[
<p>I don't think Austral uses second-class references. Even the page you linked says:<p>> But is it worth it? Again, the tradeoff is expressivity vs. simplicity... Austral’s linear types and borrowing is already so simple. Austral’s equivalent of a borrow checker is ~700 lines of OCaml. The only downside of Austral is right now you have to write the lifetimes of the references you pass to functions, but I will probably implement lifetime (region) elision.</p>
]]></description><pubDate>Thu, 20 Mar 2025 20:56:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=43428862</link><dc:creator>jamii</dc:creator><comments>https://news.ycombinator.com/item?id=43428862</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43428862</guid></item><item><title><![CDATA[New comment by jamii in "The program is the database is the interface"]]></title><description><![CDATA[
<p>> it solves the actual problem perfectly<p>The whole post was about how that doesn't solve the problem perfectly - there is no way to interactively edit the output.<p>> by embracing LISP principles directly<p>This could just as easily have been javascript+json or erlang+bert. There's no lisp magic. The core idea in the post was just finding a way for code to edit it's own constants so that I don't need a separate datastore.<p>Eventually I couldn't get this working the way I wanted with clojure and I had to write a simple language from scratch to embed provenance in values - <a href="https://news.ycombinator.com/item?id=43303314">https://news.ycombinator.com/item?id=43303314</a>.</p>
]]></description><pubDate>Sat, 08 Mar 2025 20:42:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=43303325</link><dc:creator>jamii</dc:creator><comments>https://news.ycombinator.com/item?id=43303325</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43303325</guid></item><item><title><![CDATA[New comment by jamii in "The program is the database is the interface"]]></title><description><![CDATA[
<p>This is an old prototype. I ended up making a language for it from scratch so that I could attach provenance metadata to values, making them directly editable even when far removed from their original source.<p><a href="https://www.scattered-thoughts.net/log/0027#preimp" rel="nofollow">https://www.scattered-thoughts.net/log/0027#preimp</a><p><a href="https://x.com/sc13ts/status/1564759255198351360/video/1" rel="nofollow">https://x.com/sc13ts/status/1564759255198351360/video/1</a><p>I never wrote up most of that work. I still like the ideas though.<p>Also if I had ever finished editing this I wouldn't have buried the lede quite so much.</p>
]]></description><pubDate>Sat, 08 Mar 2025 20:39:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=43303314</link><dc:creator>jamii</dc:creator><comments>https://news.ycombinator.com/item?id=43303314</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43303314</guid></item></channel></rss>