<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: jkrejcha</title><link>https://news.ycombinator.com/user?id=jkrejcha</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 13 Jun 2026 10:25:31 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=jkrejcha" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by jkrejcha in "Solar generates more energy in US than coal for first time"]]></title><description><![CDATA[
<p>Worth noting that in the US mains is split phase so we get in 240 V with 2 supply lines (large appliances can use 240 V) that give us 2 120 V lines</p>
]]></description><pubDate>Sat, 13 Jun 2026 05:24:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=48513594</link><dc:creator>jkrejcha</dc:creator><comments>https://news.ycombinator.com/item?id=48513594</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48513594</guid></item><item><title><![CDATA[New comment by jkrejcha in "CSS: Unavoidable Bad Parts"]]></title><description><![CDATA[
<p>Eh. HTML in its recent iterations made it very clear to try and separate itself from layout concerns. It's why <font> was deprecated.<p>With that: <table> is really only meant for actual tabular data and not about layout. It really isn't about the layout. It got abused for layout because it was the only thing that worked in a lot of cases (especially amusingly enough, email)<p><b> and <i> I think I'd agree, even if they did eventually get retconned to be "<i>b</i>ring attention to" and "<i>i</i>diomatic text". Same with <strong> and friends. This happened with other elements too.<p>I think it's fair to acknowledge the realities (people who are writing HTML a lot of times use <b> to mean "bold") of usages but ideally the semantic meanings are useful. I have seen cases where "<strong>" emphasizes it by doing something other than bold for example</p>
]]></description><pubDate>Sat, 13 Jun 2026 04:59:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=48513413</link><dc:creator>jkrejcha</dc:creator><comments>https://news.ycombinator.com/item?id=48513413</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48513413</guid></item><item><title><![CDATA[New comment by jkrejcha in "Raspberry Pi 5 – 16GB RAM"]]></title><description><![CDATA[
<p>USB A? That's very much not legacy<p>If anything, it's probably like an order of magnitude more common, even for new designs</p>
]]></description><pubDate>Fri, 12 Jun 2026 23:32:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=48510619</link><dc:creator>jkrejcha</dc:creator><comments>https://news.ycombinator.com/item?id=48510619</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48510619</guid></item><item><title><![CDATA[New comment by jkrejcha in "Raspberry Pi 5 – 16GB RAM"]]></title><description><![CDATA[
<p>Pis/other SBCs and ESPs/STMs/etc are effectively a different subclass of embedded<p>Firstly, Pis and SBCs like it tend to be fully functional OOBE on their own. This has useful properties but also means that hooking them up and testing their use is a little bit simpler even compared to a microcontroller dev board<p>Secondly, it's a full Linux ecosystem and all of that that it entails. This ecosystem has more in it than these ecosystems (especially in the FOSS world) and it's also useful for projects that exceed a few MB of RAM. Sure if I want to do a few things a microcontroller like this is a very very good and probably the better option (it isn't that difficult to write a lil C to control these things) but SBCs can do  lot more than that while still keeping many of the advantages, which may be the difference in some cases</p>
]]></description><pubDate>Fri, 12 Jun 2026 23:25:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=48510558</link><dc:creator>jkrejcha</dc:creator><comments>https://news.ycombinator.com/item?id=48510558</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48510558</guid></item><item><title><![CDATA[New comment by jkrejcha in "Raspberry Pi 5 – 16GB RAM"]]></title><description><![CDATA[
<p>I've seen this sentiment a bit and while I don't dispute that you can get a better SBC for cheaper, there are still a lot of issues and it tends to be around software support primarily that allows it to occupy a very sweet spot. It's a significant factor in deciding to use them. 
There are a lot of embedded use cases that can be solved by hooking up to an ESP32 but there are a bunch that need a little bit more than that. If you want to run a web server for example, you do have options on the ESP32 but also writing C/C++ for a web backend is both a little fraught and kinda miserable compared to Python or Go or something. I mean it's certainly doable, but it certainly isn't the first language I'd reach for. If you want to work a little bit with streaming video, same deal<p>So this is the embedded Linux usecase. And... the embedded Linux ecosystem seems kinda... hacked together? You a lot of the times get Yocto Linux which is its own can of worms because you tend to invariably get meta-vendor packages that patch everything from U-Boot to the kernel to random userspace utilities. There are better cases and it depends on how much the vendor works upstream. Sometimes the vendor doesn't even bother with maintaining the meta layer and it ends up getting into a "maintained mostly by one guy in Nebraska" scenario<p>Some other vendors seem to take U-Boot and a copy of the Ubuntu LTS sources from 10 years ago and hacked it until it was possible to get a root shell without the thing going into a kernel panic then put the resulting image on a Google Drive or FTP server somewhere but didn't go much further than that<p>What ends up being is that there is like a U-Boot and Linux kernel variant for either each different SBC (or sometimes vendor thereof) duck taped together. Support, even for the peripherals included, can be spotty at best, and there are many times where you have to patch the kernel or userspace to get it to work right. I've seen boards which run the weirdest stuff, ones whose kernel patches run into the megabytes with poor (if any) documentation, boards which apparently don't want to run anything but Android, etc. There are certainly vendors that work well and upstream and make everything nice and easy but they tend to be rarer and/or more expensive<p>Compared that with the Pis and the difference is night and day enough that the raw specs matter less. Yes RasPi has their own kernel fork, but iirc they do work a bit upstream and the versions maintained are like 6.12 and not like 5 (which I've seen). They are also relatively easy to procure where more specialized vendors tend to be... less so. Flashing them is pretty simple and if you want to create your own image you can do that as well easily without Yocto or whatever. The HAT ecosystem is a nice way to add extensibility, the headers basically allow you to do a lot of ESPy type things as well (since Linux has native specific userspace support for GPIO, I2C, SPI, PWM, LED, hwmon, etc). And so on and so forth. And it all just kinda works<p>This in of itself, makes it a pretty decent option for industry, especially if it's like either n <= 1000 units or a relatively small part of the BOM itself. It often is very much the economically sensible option to stick a Pi in it rather than put many man hours into fixing problems that really shouldn't require me to open up menuconfig or apply a kernel patch again.<p>People like Geerling tend to come at it from the hobbyist or maker side of things but it does apply to the industrial side too. Yes in many cases knowing part XYZ will still be manufactured in 30 years is more important than the dev experience or some other factor is at play (power draw being another) but in a lot of cases its not (e.g. more portable code, stuff not requiring recertification) and the Pis also do have a relatively reasonable time guarantee too. It shouldn't be a bad experience to develop on these boards! But regardless, there are a lot of times that it is, and that's why I think the RasPi continues to do as well as it does.<p>This is also why I think, despite the price, it continues to do well in the hobbyist community. I can hook it up using the headers to anything SPI, I2C, etc, and start making it do things with very little software trouble and regardless if I want to do it in C or if I want to do it in Python</p>
]]></description><pubDate>Fri, 12 Jun 2026 22:28:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=48510158</link><dc:creator>jkrejcha</dc:creator><comments>https://news.ycombinator.com/item?id=48510158</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48510158</guid></item><item><title><![CDATA[New comment by jkrejcha in "A €0.01 bank transfer could compromise a banking AI agent"]]></title><description><![CDATA[
<p>The main reason is that a lot of the reason comes around that it is incredibly difficult to do this in a general case just because of the grammar of SQL. Especially with the very different dialects, in the worst case you can get unintended remote code execution[1]<p>There's an incidental performance benefit on some database engines as well. When you write a SQL query, in general the database engine has to compile this to a form it can use<p>If you use raw string concatenation, "SELECT USERS FROM table WHERE id=1" might compile to something like (pseudocode below)<p><pre><code>    def prepstatement1():
        ...
</code></pre>
So if you use an explicit prepared statement[1], something like "SELECT USERS FROM table WHERE id=?" might compile to something like<p><pre><code>    def prepstatement2(id: int):  # <--- notice the new parameter here
       ...
</code></pre>
Some database engines also have the ability to cache a prepared statement and so these are a lil bit faster. Remember, your database has to still compile the string concatenated case, it's just a little bit hidden.<p>[1]: For example SQL Server has xp_cmdshell: <a href="https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/xp-cmdshell-transact-sql?view=sql-server-ver17" rel="nofollow">https://learn.microsoft.com/en-us/sql/relational-databases/s...</a><p>[2]: <a href="https://en.wikipedia.org/wiki/Prepared_statement" rel="nofollow">https://en.wikipedia.org/wiki/Prepared_statement</a></p>
]]></description><pubDate>Wed, 10 Jun 2026 19:10:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=48481172</link><dc:creator>jkrejcha</dc:creator><comments>https://news.ycombinator.com/item?id=48481172</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48481172</guid></item><item><title><![CDATA[New comment by jkrejcha in "Moving beyond fork() + exec()"]]></title><description><![CDATA[
<p>Iirc Cygwin used to use it but iirc they moved away from it because they said that it was pretty slow<p>Though actually iirc werfault uses NtCreateUserProcess() to clone processes when writing out crash dumps to this day</p>
]]></description><pubDate>Sat, 06 Jun 2026 22:47:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=48429805</link><dc:creator>jkrejcha</dc:creator><comments>https://news.ycombinator.com/item?id=48429805</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48429805</guid></item><item><title><![CDATA[New comment by jkrejcha in "Moving beyond fork() + exec()"]]></title><description><![CDATA[
<p>> But how often would one actually need this?<p>Well, the idea is that it'd probably be close to the default API for spawning processes (and could even be the bedrock for posix_spawn and friends in libc (and potentially even "simple" fork cases[1])). fork/clone would be the special case<p>In most cases, most programs don't need special setup. Something like `ptrace_syscall` would also work for this and would be probably the way to do it with the backwards compat limitations of nowadays<p>ptrace-ability seems to be generally how permissions for this sort of thing are handled in general (see also procfs, process_vm_writev, ptrace, etc). The complication is a little bit around setuid programs but either you could special case execve to imply SIGCONT for setuid or have execve also imply a SIGCONT as well<p>[1]: Probably would be rare for a compiler to optimize it though</p>
]]></description><pubDate>Sat, 06 Jun 2026 22:40:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=48429749</link><dc:creator>jkrejcha</dc:creator><comments>https://news.ycombinator.com/item?id=48429749</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48429749</guid></item><item><title><![CDATA[New comment by jkrejcha in "Moving beyond fork() + exec()"]]></title><description><![CDATA[
<p>I kinda disagree, though I do see the usefulness here. While fork/exec can be useful in some cases, it'd be honestly pretty neat if the APIs took a pidfd argument (maybe with 0 meaning current process). Only program is setuid/setgid binaries I suppose but maybe this case is better handled by special casing `exec`.<p>For example<p><pre><code>   pidfd_t ps = spawn(); // creates a process stopped (kernel does this anyway by default)
   setuid(ps, 33);
   capset(ps, ...);
   socket(ps, ...);
   mmap(ps, ...);
   process_vm_writev(ps, ...);
   exec(ps, ...);
   signal(ps, SIGCONT);
   // error handling elided
</code></pre>
I guess this is a little bit me being a bit of critical of the usual syscall APIs for not thinking about "what if I want to do this to another process I have access to" but...<p>It also makes things like thread safety even reasonably doable with fork. I do agree though that stuff like CreateProcess which take in a gazillion parameters don't really make for the greatest of userspace APIs</p>
]]></description><pubDate>Sat, 06 Jun 2026 21:50:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=48429349</link><dc:creator>jkrejcha</dc:creator><comments>https://news.ycombinator.com/item?id=48429349</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48429349</guid></item><item><title><![CDATA[New comment by jkrejcha in "Preparing for KDE Plasma's Last X11-Supported Release"]]></title><description><![CDATA[
<p>Windows has had native support for always on top windows for over 25 years</p>
]]></description><pubDate>Wed, 03 Jun 2026 12:22:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=48383031</link><dc:creator>jkrejcha</dc:creator><comments>https://news.ycombinator.com/item?id=48383031</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48383031</guid></item><item><title><![CDATA[New comment by jkrejcha in "Re: [PATCH] OOM_pardon, a.k.a. don't kill my xlock (2004)"]]></title><description><![CDATA[
<p>I've mentioned this elsewhere in the thread, but I think it's a difference of view on what malloc represents. Operating systems do have "reserve this part of the address space" APIs and these reservations don't get charged against your commit because you're simply reserving the space, not committing to using it, and so the operating system doesn't need to back it with anything.<p>In this worldview, malloc is like me buying a plane ticket at the counter for a specific flight that's going to leave soon. I'd be really annoyed if I were bumped off a flight I just paid for (and would've rather been told "that flight is full, try again later" (malloc returns NULL)). This is, for example what Windows does. Under memory pressure, it'll say to applications, "hey no I'm not in a giving mood for memory right now" (and will sometimes bump the size of the pagefile if configured to do this, but only up to a point).<p>The thought behind this is that well... applications have to handle malloc returning NULL anyway. Whether that's calling abort and giving up is one matter, another might be to retry the allocation at a later time (maybe after Windows has bumped the pagefile size), another might be to handle an error using some preallocated buffer or whatever.</p>
]]></description><pubDate>Tue, 02 Jun 2026 00:47:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=48364456</link><dc:creator>jkrejcha</dc:creator><comments>https://news.ycombinator.com/item?id=48364456</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48364456</guid></item><item><title><![CDATA[New comment by jkrejcha in "Re: [PATCH] OOM_pardon, a.k.a. don't kill my xlock (2004)"]]></title><description><![CDATA[
<p>malloc can just return NULL (in specific, mmap returns -ENOMEM and your libc translates that). Applications need to check for success anyway</p>
]]></description><pubDate>Tue, 02 Jun 2026 00:36:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=48364380</link><dc:creator>jkrejcha</dc:creator><comments>https://news.ycombinator.com/item?id=48364380</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48364380</guid></item><item><title><![CDATA[New comment by jkrejcha in "Re: [PATCH] OOM_pardon, a.k.a. don't kill my xlock (2004)"]]></title><description><![CDATA[
<p>To be 100% fair, it's rare that processes are cloned on Windows, if only because it's part of the Native API that applications generally don't use directly, and CreateProcess is easier and does all the housekeeping stuff, etc, that people writing Windows applications generally come to expect (or don't even know happens)<p>I do think overcommit was a poor design choice, but I think it probably mostly does logically follow from the fact that fork and friends are the only ways available to create a process that's available to userspace. It's quite unfortunate though.<p>Part of the problem is that some applications wanted to reserve lots of address space but didn't necessarily want to touch it right away (such as when they were using it sparsely). Something that VirtualAlloc(x, MEM_RESERVE) (or mmap(..., MAP_NORESERVE)) would be suited for. But while malloc exists, mreserve doesn't in libc, and I think it was pretty uncommon to use it.</p>
]]></description><pubDate>Tue, 02 Jun 2026 00:33:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=48364359</link><dc:creator>jkrejcha</dc:creator><comments>https://news.ycombinator.com/item?id=48364359</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48364359</guid></item><item><title><![CDATA[New comment by jkrejcha in "Re: [PATCH] OOM_pardon, a.k.a. don't kill my xlock (2004)"]]></title><description><![CDATA[
<p>Windows doesn't use fork/exec for process creation in any relevant way today<p>There are Native APIs for implementing fork (needed for the obsolete POSIX subsystem, primarily), but even on the Native API side, processes are usually spawned through NtCreateProcess or RtlCreateUserProcess, though there is a bunch of setup with regards to the Csr APIs for the Win32 CreateProcess[1]).<p>[1]: <a href="https://stackoverflow.com/a/69605729/2805120" rel="nofollow">https://stackoverflow.com/a/69605729/2805120</a></p>
]]></description><pubDate>Mon, 01 Jun 2026 15:28:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=48358150</link><dc:creator>jkrejcha</dc:creator><comments>https://news.ycombinator.com/item?id=48358150</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48358150</guid></item><item><title><![CDATA[New comment by jkrejcha in "Re: [PATCH] OOM_pardon, a.k.a. don't kill my xlock (2004)"]]></title><description><![CDATA[
<p>It has also created this unfortunate assumption a lot of the time that malloc and friends are (infallible OR crash) and, separately, can sometimes have potentially weird tendencies to force undefined behaviors on otherwise well-defined programs (I think primarily around mmap, although I'm not remembering the details super well).<p>Agreed though, overcommit is the culprit here. I get <i>why</i> it happened (unfortunate consequences of fork and friends existing as <i>the</i> way to spawn tasks and wanting those to be both performant and not fail in frustrating conditions), but I don't think it was a design that aged particularly well.<p>I actually like somewhat the notion of how Windows handles these two things<p>1. For address space reservations, you can <i>reserve</i> address space but in order to touch it you have to <i>commit</i> it. Commits have to be backed by something (RAM, a file, pagefiles if they exist) and if a commit fails, they'll get NULL back from malloc. It allows code to be more correct in the face of low-memory conditions or to try again later (Firefox for example, does this[1] on Windows).<p>2. Process creation is done with a specific API to create processes. The only problem with this I think is that you have to specify everything at creation time, but you could augment this by creating processes in a stopped state (iirc Linux has to do this anyway to set up some stuff before it can hand over control back to userland) and having the parent send FDs to the child or whatnot. Windows... doesn't do this, it has a couple of kitchen sink APIs for creating processes and setting up stuff like the standard streams... in any case I'm getting off topic.<p>Don't think there's much about that design that can be changed now though<p>[1]: <a href="https://hacks.mozilla.org/2022/11/improving-firefox-stability-with-this-one-weird-trick/" rel="nofollow">https://hacks.mozilla.org/2022/11/improving-firefox-stabilit...</a></p>
]]></description><pubDate>Mon, 01 Jun 2026 15:24:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=48358085</link><dc:creator>jkrejcha</dc:creator><comments>https://news.ycombinator.com/item?id=48358085</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48358085</guid></item><item><title><![CDATA[New comment by jkrejcha in "Re: [PATCH] OOM_pardon, a.k.a. don't kill my xlock (2004)"]]></title><description><![CDATA[
<p>> These days you can do oom score adjusting, which is not as strong as a pardon.<p>Writing -1000 to /proc/<pid>/oom_score_adj will cause the OOM killer not to consider the process at all :)<p>From the man page proc_pid_oom_score_adj(5)<p>> The value of oom_score_adj is added to the badness score before it is used to determine which task to kill. Acceptable values range from -1000 (OOM_SCORE_ADJ_MIN) to +1000 (OOM_SCORE_ADJ_MAX). [...].  The lowest possible value, -1000, is equivalent to disabling OOM-killing entirely for that task, since it will always report a badness score of 0.</p>
]]></description><pubDate>Mon, 01 Jun 2026 15:07:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=48357844</link><dc:creator>jkrejcha</dc:creator><comments>https://news.ycombinator.com/item?id=48357844</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48357844</guid></item><item><title><![CDATA[New comment by jkrejcha in "My audio interface has SSH enabled by default"]]></title><description><![CDATA[
<p>I'm not sure if it was what OP meant, but it's arguably a good availability technique (as long as you can generate the checksum, that is). Like, if I want to run custom firmware and flash it, having a checksum which verifies that the firmware isn't corrupted may help prevent bricking.</p>
]]></description><pubDate>Sat, 25 Apr 2026 08:44:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=47899805</link><dc:creator>jkrejcha</dc:creator><comments>https://news.ycombinator.com/item?id=47899805</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47899805</guid></item><item><title><![CDATA[New comment by jkrejcha in "GitHub's fake star economy"]]></title><description><![CDATA[
<p>"Unable to reproduce" is a fair enough explicit close reason. This is more about those "stale" bots that exist that just kinda close the issues because there hasn't been any response for X days. The annoyance with the practice usually stems from the fact that many of the victims of this comes from a lack of <i>maintainer</i> response.<p>This sort of bot punishes users for making even valid reports that aren't fixed immediately or missed by the maintainers for whatever reason including transitory ones, etc.<p>Constantly bumping threads/issues/whatever is generally considered rude, so this is why issue reporters generally don't do it, plus generally the reporter isn't solely focused on that particular issue</p>
]]></description><pubDate>Mon, 20 Apr 2026 22:05:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=47841614</link><dc:creator>jkrejcha</dc:creator><comments>https://news.ycombinator.com/item?id=47841614</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47841614</guid></item><item><title><![CDATA[New comment by jkrejcha in "I just want simple S3"]]></title><description><![CDATA[
<p>Aside from the fact that you can do this statelessly (you could stuff a JWT or moral equivalent in the header as a Bearer token), if you were okay with server-side state, you can have the token be related to a principal or have permissions in of itself.</p>
]]></description><pubDate>Tue, 14 Apr 2026 16:43:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=47767980</link><dc:creator>jkrejcha</dc:creator><comments>https://news.ycombinator.com/item?id=47767980</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47767980</guid></item><item><title><![CDATA[New comment by jkrejcha in "CVE-2026-3888: Important Snap Flaw Enables Local Privilege Escalation to Root"]]></title><description><![CDATA[
<p>In general, I think it's because it tends to be an XY problem. If you're on a service account or something, you generally have SeBackupPrivilege (override read ACLs) and SeRestorePrivilege (override write ACLs) and other relevant privileges so like if you're changing files that's less needed since you can overwrite the ACLs to the necessary files as needed</p>
]]></description><pubDate>Thu, 19 Mar 2026 23:05:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=47447659</link><dc:creator>jkrejcha</dc:creator><comments>https://news.ycombinator.com/item?id=47447659</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47447659</guid></item></channel></rss>