<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>Sat, 13 Jun 2026 06:34:57 +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 "Building an HTML-first site doubled our users overnight"]]></title><description><![CDATA[
<p>As a non-web dev, I have a question about this part:<p>> There was a sad coda; as is the way of contract work, I moved on. I explained what I had built to my replacement, that it always worked even without javascript. He was appalled and said, “but that’s a lot more work for us.”<p>Why is it more work? The approach described in the article seems honestly reasonably simple: just write the standard <input> components for the form, have a submit button at the bottom. When I was making my own websites many years ago now, that's how it worked, and it wasn't that hard. Maybe it's reflecting my ignorance in this field, but doing fancy front-ends seems much harder to me.</p>
]]></description><pubDate>Wed, 10 Jun 2026 15:37:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=48478007</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=48478007</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48478007</guid></item><item><title><![CDATA[New comment by OskarS in "MacBook Neo is so popular that Apple doubled production"]]></title><description><![CDATA[
<p>Not even young people: I have a very expensive MacBook Pro M5 i got from work, but my personal laptop is old and needs replacing. I’m a well-paid senior software developer and could afford any computer I wanted. But the MacBook Neo is a top contender even for me. I mostly need something for like editing documents, hobby coding and watching YouTube videos. It runs Codex or Gemini-CLI fine. For the price point, it seems perfect for a second computer. I could pay premium prices for something better, but honestly: I don’t think I need to.</p>
]]></description><pubDate>Wed, 03 Jun 2026 17:38:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=48387084</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=48387084</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48387084</guid></item><item><title><![CDATA[New comment by OskarS in "Why Janet? (2023)"]]></title><description><![CDATA[
<p>Sure! The main formats are VST3 (from Steinberg, the most popular format), AU (from Apple, supported by most macOS hosts, and Logic only uses AU), AAX (for Avid Pro Tools) and CLAP (an open source variant, that's the best of all of them but is having trouble getting market share). Then there is also "Standalone", which is when you just run your plugin as a standalone app.<p>Because of this plethora of standards, most plugin developers (including us, I work at XLN Audio) use the JUCE C++ framework, which provides a uniform interface to all these formats and more. It's available on GitHub under a GPL license if you just want to play with it (it has excellent tutorials and example projects). If you're just curious about development thing, I recommend using Reaper as a host to test in, both because it's essentially free (it's free like WinRAR is free), and it has tons of options for how to run plugins (all in the main process, all in a bridged process, every plugin in a dedicated process, etc.).<p>Audio plugins are essentially dynamic libraries loaded at runtime, and a common way to run them (used to be universal, but some hosts are changing) is that the dynamic library is just loaded in the main process address space and the host communicates with it by calling functions on it. That means that if a single plugin (out of maybe dozens in a project) crashes, it takes the entire host down. In addition, if you have multiple instances of the same plugin (very common, you might have the same effect on multiple tracks, for instance), all global and thread_local variables are shared between them, which makes global variables a total nightmare, and raises the thread_local problem I mentioned earlier.<p>Our products use JUCE for the unified interface, but then we have an entirely custom Lua codebase for the GUIs and scripting the products themselves (with lots of connections to the audio engine, which is of course C++). There are very limited languages you can embed this way, because of the requirements I mentioned above. The ones I've looked at which you could possibly do it with is Lua, Python (3.12+), JavaScript and Tcl. I haven't done a lot of testing outside of Lua though, this is just me looking at the embedding APIs. You could also do it with web views, and recent versions of JUCE provides nice ways to do that.<p>I wouldn't do it with Janet if it uses thread local state this way, but maybe it works. It would definitely work if you spun up dedicated threads for each instance and communicated the events back and forth, but that seems like a bad idea.<p>Let me know if you have more questions, this is a very weird field of programming that most developers are not exposed to.</p>
]]></description><pubDate>Wed, 03 Jun 2026 13:35:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=48383862</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=48383862</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48383862</guid></item><item><title><![CDATA[New comment by OskarS in "Can the stockmarket swallow Anthropic, SpaceX and OpenAI?"]]></title><description><![CDATA[
<p>That’s a really great explanation, I think I more or less followed all of it. Thanks for taking the time to write it out!</p>
]]></description><pubDate>Wed, 03 Jun 2026 08:27:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=48381384</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=48381384</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48381384</guid></item><item><title><![CDATA[New comment by OskarS in "Why Janet? (2023)"]]></title><description><![CDATA[
<p>The UI for audio plugins generally work in an event driven manner: you get events like mouseMove, keyDown, repaint, etc. from your host. In response to those events, you run your script to figure out what you need to do. You have no control over which thread calls these things, it can be the GUI thread that runs all of them, it can be run on background threads in parallel, etc. Different hosts do it differently. If Janet using thread-local state, this just doesn't work: the state for one instance is completely different from another, and there's even no guarantee they're running the same scripts.<p>Consider the most famous embedded language, JavaScript in browsers: you can have any number of tabs open at the same time, and if the JavaScript interpreters for each of those used a bunch of thread-local storage, it would place huge restrictions on how the browsers could schedule and parallelize the callbacks for the JavaScript in those tabs.<p>The only way I can see this working is if you spin up a thread for each instance, and when these events come in, you wake up those threads, send over the event information, block until the interpreter thread finishes. But that's both inefficient and a real architectural hassle.<p>All I want is an object that's like `janet_interpreter *interpreter = janet_make_interpreter();` and then you pass that to the functions instead of doing all these magic things with global variables and thread local state. That's it.</p>
]]></description><pubDate>Wed, 03 Jun 2026 07:57:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=48381193</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=48381193</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48381193</guid></item><item><title><![CDATA[New comment by OskarS in "Why Janet? (2023)"]]></title><description><![CDATA[
<p>So you can't execute a Janet script on a different thread than it was created on? Still not good: if you're making audio plugins, you don't control the threads which your program runs on. It's just not good enough, IMHO.</p>
]]></description><pubDate>Tue, 02 Jun 2026 18:31:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=48374257</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=48374257</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48374257</guid></item><item><title><![CDATA[New comment by OskarS in "Why Janet? (2023)"]]></title><description><![CDATA[
<p>My first question too, and I checked out the linked book [1], and sure seems like it! There's global functions like `janet_init()` and `janet_loop()` all over the place.<p>A language shouldn't advertise itself as "embeddable" if it does this. It means you can't have multiple interpreters, you can't use it on multiple threads, etc. GNU Guile does this too, and it's a baffling decision! For my field (audio plugins like VSTs), it means it's absolutely a no-go, because hosts can load any number of instances of your plugins and potentially run them in parallel in the same address space, they <i>can't</i> rely on global state like this. Each interpreter has to be separate.<p>Lua does this right, as does Python (as of 3.12, when they made the GIL local to each interpreter) and I think most of the JavaScript engines. And it's not hard, instead of a global `janet_init()`, just have an opaque pointer bundle all the state, like `janet_init(interpreter)`. If you want a global interpreter, just stick it in a global variable.<p>[1]: <a href="https://janet.guide/embedding-janet/" rel="nofollow">https://janet.guide/embedding-janet/</a></p>
]]></description><pubDate>Tue, 02 Jun 2026 14:49:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=48371020</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=48371020</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48371020</guid></item><item><title><![CDATA[New comment by OskarS in "Can the stockmarket swallow Anthropic, SpaceX and OpenAI?"]]></title><description><![CDATA[
<p>> and with short selling in public markets being possible, an accurate price will be established very quickly.<p>I know very little about markets, but: aren't the short-sellers just going to provide liquidity for the big index funds? Like, if the funds HAVE to buy SpaceX, and the funds are enormous, wont every single stock sold short be immediately gobbled up, as well as pretty much anyone else wanting to sell? Even if everyone else is selling like mad, it wont affect price much at all?<p>Maybe this is naive, but if these enormous funds are more or less forced to buy SpaceX, it seems impossible that "actual price discovery" is going to happen in any reasonable amount of time, and the short-sellers will be screwed.</p>
]]></description><pubDate>Tue, 02 Jun 2026 11:56:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=48369062</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=48369062</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48369062</guid></item><item><title><![CDATA[New comment by OskarS in "Let's compile Quake like it's 1997"]]></title><description><![CDATA[
<p>I would guess that the 1998 era Microsoft compiler didn't have nearly as many warnings as modern compilers do.</p>
]]></description><pubDate>Fri, 29 May 2026 11:42:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=48321883</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=48321883</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48321883</guid></item><item><title><![CDATA[New comment by OskarS in "Bambu Lab is abusing the open source social contract"]]></title><description><![CDATA[
<p>That is how I (a non-lawyer) understand it as well, but I wonder if it's so simple when you combine it with the GPLness of it all. Like, releasing something under the (A)GPL is a license to use and modify the code how you see fit, and that goes "virally" through the forks. This fork is just using their own GPL-licensed code, and it seems unreasonable (for some definition of "unreasonable") to limit forks in this way. I think it's plausible you can make an argument that if you make this kind of restriction in your GPL codebase, you're violating the GPL license of the original ("upstream") authors.</p>
]]></description><pubDate>Wed, 13 May 2026 10:31:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=48120127</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=48120127</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48120127</guid></item><item><title><![CDATA[New comment by OskarS in "The Los Angeles Aqueduct Is Wild"]]></title><description><![CDATA[
<p>Certainly that’s part of it, but also just NIMBYism. Los Angeles were able to defeat the Owen’s Valley farmers back then, I don’t think they would be now.</p>
]]></description><pubDate>Fri, 20 Mar 2026 16:34:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=47456991</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=47456991</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47456991</guid></item><item><title><![CDATA[New comment by OskarS in "How many branches can your CPU predict?"]]></title><description><![CDATA[
<p>Yeah, the "two-bit saturating counter" thing is pretty much exactly how I thought it worked (which would be terrible for the example in the article), but I had no idea about the fact that it also kept track of the branch history thing, and how that maps to different branch predictor entries. Thanks for the link, that's really fascinating!</p>
]]></description><pubDate>Fri, 20 Mar 2026 10:23:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=47452690</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=47452690</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47452690</guid></item><item><title><![CDATA[New comment by OskarS in "How many branches can your CPU predict?"]]></title><description><![CDATA[
<p>Hmm, that's interesting. The code as written only has one branch, the if statement (well, two, the while loop exit clause as well). My mental model of the branch predictor was that for each branch, the CPU maintained some internal state like "probably taken/not taken" or "indeterminate", and it "learned" by executing the branch many times.<p>But that's clearly not right, because apparently the specific data it's branching off matters too? Like, "test memory location X, and branch at location Y", and it remembers <i>both</i> the specific memory location and which specific branch branches off of it? That's really impressive, I didn't think branch predictors worked like that.<p>Or does it learn the exact pattern? "After the pattern ...0101101011000 (each 0/1 representing the branch not taken/taken), it's probably 1 next time"?</p>
]]></description><pubDate>Thu, 19 Mar 2026 14:42:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=47440371</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=47440371</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47440371</guid></item><item><title><![CDATA[New comment by OskarS in "Newcomb's Paradox Needs a Demon"]]></title><description><![CDATA[
<p>> Two boxes is the only choice that makes sense. It is always better than one box.<p>Congratulations on your $1,000. I'll use some of my $1,000,000 I got by nonsensically picking one box to toast in your honor and dedication to logic.</p>
]]></description><pubDate>Thu, 12 Mar 2026 13:06:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=47350033</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=47350033</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47350033</guid></item><item><title><![CDATA[New comment by OskarS in "Type resolution redesign, with language changes to taste"]]></title><description><![CDATA[
<p>Conceptually it's quite similar to how C++ templates work (not including C++20 concepts, which is the kind of constraining you're talking about).<p>I quite like it when writing C++ code. Makes it dead easy to write code like `min` that works for any type in a generic way. It is, however, arguably the main culprit behind C++s terrible compiler-errors, because you'll have standard library functions which have like a stack of fifteen generic calls, and it fails really deeply on some obscure inner thing which has some kind of type requirement, and it's really hard to trace back what you actually did wrong.<p>In my (quite limited) experience, Zig largely avoids this by having a MUCH simpler type system than C++, and the standard library written by a sane person. Zig seems "best of both worlds" in this regard.</p>
]]></description><pubDate>Wed, 11 Mar 2026 09:55:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=47333597</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=47333597</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47333597</guid></item><item><title><![CDATA[New comment by OskarS in "Unlocking Python's Cores:Energy Implications of Removing the GIL"]]></title><description><![CDATA[
<p>It was an essentially pointless platitude about the GIL from a very new account not really related to the article, and all comments from this account are the same: top level comments with lots of em-dashes that are just a vague piece of pablum somewhat related to the subject. If it was just this comment, sure, it could be possible it's a rather uninteresting human. But given the history, this account is pure AI slop.</p>
]]></description><pubDate>Mon, 09 Mar 2026 16:28:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=47311239</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=47311239</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47311239</guid></item><item><title><![CDATA[New comment by OskarS in "Unlocking Python's Cores:Energy Implications of Removing the GIL"]]></title><description><![CDATA[
<p>Yep. Real "dead internet theory" vibes, really sad to see.</p>
]]></description><pubDate>Mon, 09 Mar 2026 11:34:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=47307695</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=47307695</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47307695</guid></item><item><title><![CDATA[New comment by OskarS in "Unlocking Python's Cores:Energy Implications of Removing the GIL"]]></title><description><![CDATA[
<p>Thanks ChatGPT, good of you to let us know.</p>
]]></description><pubDate>Mon, 09 Mar 2026 11:19:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=47307584</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=47307584</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47307584</guid></item><item><title><![CDATA[New comment by OskarS in "Guido van Rossum Interviews Thomas Wouters (Python Core Dev)"]]></title><description><![CDATA[
<p>Great interview, really fun to read. I love that they were both so technically involved, the section of the great interview where they just start discussing how a range literal would work and why it's a good/bad idea is just great. A wonderful example of how really talented and smart engineers talk to each other.</p>
]]></description><pubDate>Tue, 03 Mar 2026 10:20:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=47230489</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=47230489</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47230489</guid></item><item><title><![CDATA[New comment by OskarS in "Get free Claude max 20x for open-source maintainers"]]></title><description><![CDATA[
<p>For 6 months? So it's just a fancy, "first one is free" trial?</p>
]]></description><pubDate>Fri, 27 Feb 2026 14:05:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=47180595</link><dc:creator>OskarS</dc:creator><comments>https://news.ycombinator.com/item?id=47180595</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47180595</guid></item></channel></rss>