<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: diek</title><link>https://news.ycombinator.com/user?id=diek</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sun, 21 Jun 2026 11:28:33 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=diek" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by diek in "The computer science degree isn’t dead"]]></title><description><![CDATA[
<p>FWIW, any accredited CS degree program in the US will have rigorous math and science requirements: <a href="https://www.abet.org/accreditation/accreditation-criteria/criteria-for-accrediting-computing-programs-2025-2026/" rel="nofollow">https://www.abet.org/accreditation/accreditation-criteria/cr...</a><p>I don't think it was worded very well, but I think the parent comment was saying, "the bulk of CS can be covered in a masters program, so take an undergrad degree that has the same overlap in math/science, but a different focus".  I'm not sure I agree, spreading the absorption of that knowledge over 4 years can be beneficial.</p>
]]></description><pubDate>Sat, 13 Jun 2026 10:13:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=48515588</link><dc:creator>diek</dc:creator><comments>https://news.ycombinator.com/item?id=48515588</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48515588</guid></item><item><title><![CDATA[New comment by diek in "CPanel's Black Week: 3 New Vulnerabilities Patched After Attack on 44k Servers"]]></title><description><![CDATA[
<p>That's a fair point, using 'interpreter' specifically was imprecise language on my part.  My main point was php-fpm is developed by the core PHP team and is often the default in how PHP projects deploy these days, and that CVE was very similar to the recent 'fail' LPE vulnerabilities in the kernel.</p>
]]></description><pubDate>Sun, 10 May 2026 01:14:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=48079991</link><dc:creator>diek</dc:creator><comments>https://news.ycombinator.com/item?id=48079991</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48079991</guid></item><item><title><![CDATA[New comment by diek in "CPanel's Black Week: 3 New Vulnerabilities Patched After Attack on 44k Servers"]]></title><description><![CDATA[
<p>CVE-2021-21703 [0] is a similar class of bug in the PHP interpreter itself that was pretty recent<p><a href="https://www.sentinelone.com/vulnerability-database/cve-2021-21703/" rel="nofollow">https://www.sentinelone.com/vulnerability-database/cve-2021-...</a></p>
]]></description><pubDate>Sat, 09 May 2026 22:20:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=48078852</link><dc:creator>diek</dc:creator><comments>https://news.ycombinator.com/item?id=48078852</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48078852</guid></item><item><title><![CDATA[New comment by diek in "Pentagon chief blocks officers from Ivy League schools and top universities"]]></title><description><![CDATA[
<p>My first reaction was, "watch, they're going to replace actual rigorous educational institutions with religious colleges" and lo and behold, "Liberty University" is at the top of the list for replacement civilian institutions.</p>
]]></description><pubDate>Sun, 01 Mar 2026 00:53:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=47202387</link><dc:creator>diek</dc:creator><comments>https://news.ycombinator.com/item?id=47202387</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47202387</guid></item><item><title><![CDATA[GitHub Is Down]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/">https://github.com/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=46252736">https://news.ycombinator.com/item?id=46252736</a></p>
<p>Points: 6</p>
<p># Comments: 1</p>
]]></description><pubDate>Sat, 13 Dec 2025 07:18:11 +0000</pubDate><link>https://github.com/</link><dc:creator>diek</dc:creator><comments>https://news.ycombinator.com/item?id=46252736</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46252736</guid></item><item><title><![CDATA[New comment by diek in "My Experience of building Bytebeat player in Zig"]]></title><description><![CDATA[
<p>From the description I thought the expression was a function of only 't', and there was no (for instance) accumulation of the previously computed byte.  Then in the image I saw the same value of 't' evaluating to different values:<p>t=1000: 168    t=1000: 80<p>Reading the source: <a href="https://github.com/KMJ-007/zigbeat/blob/main/src/evaluator.zig#L68" rel="nofollow">https://github.com/KMJ-007/zigbeat/blob/main/src/evaluator.z...</a><p>It does look like the expression is a pure function of 't', so I can only assume that's a typo.</p>
]]></description><pubDate>Fri, 07 Nov 2025 18:21:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=45849274</link><dc:creator>diek</dc:creator><comments>https://news.ycombinator.com/item?id=45849274</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45849274</guid></item><item><title><![CDATA[New comment by diek in "The future of Python web services looks GIL-free"]]></title><description><![CDATA[
<p>You're correct.  If you have:<p><pre><code>  public int someField;
 
  public void inc() {
    someField += 1;
  }
</code></pre>
that still compiles down to:<p><pre><code>  GETFIELD [someField]
  ICONST_1
  IADD
  PUTFIELD [somefield]
</code></pre>
whether 'someField' is volatile or not.  The volatile just affects the load/store semantics of the GETFIELD/PUTFIELD ops.  For atomic increment you have to go through something like AtomicInteger that will internally use an Unsafe instance to ensure it emits a platform-specific atomic increment instruction.</p>
]]></description><pubDate>Sun, 26 Oct 2025 01:27:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=45708348</link><dc:creator>diek</dc:creator><comments>https://news.ycombinator.com/item?id=45708348</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45708348</guid></item><item><title><![CDATA[New comment by diek in "How GM Made the $35,000 Chevrolet Equinox EV into a 319-Mile Range Champ"]]></title><description><![CDATA[
<p>They made the Bolt EV from 2016-2023, and they're revamping it to use the new Ultium platform.<p>You could buy a 2023 Bolt starting at $26,500, and they're great cars.</p>
]]></description><pubDate>Sun, 19 May 2024 06:17:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=40404637</link><dc:creator>diek</dc:creator><comments>https://news.ycombinator.com/item?id=40404637</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40404637</guid></item><item><title><![CDATA[New comment by diek in "Postgres as queue"]]></title><description><![CDATA[
<p>For my use cases the aim is really to not deal with events, but deal with the rows in the tables themselves.<p>Say you have a `thing` table, and backend workers that know how to process a `thing` in status 'new', put it in status 'pending' while it's being worked on, and when it's done put it in status 'active'.<p>The only thing the backend needs to know is "thing id:7 is now in status:'new'", and it knows what to do from there.<p>The way I generally build the backends, the first thing they do is LISTEN to the relevant channels they care about, then they can query/build whatever understanding they need for the current state.  If the connection drops for whatever reason, you have to start from scratch with the new connection (LISTEN, rebuild state, etc).</p>
]]></description><pubDate>Sat, 10 Feb 2024 12:17:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=39325614</link><dc:creator>diek</dc:creator><comments>https://news.ycombinator.com/item?id=39325614</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39325614</guid></item><item><title><![CDATA[New comment by diek in "Postgres as queue"]]></title><description><![CDATA[
<p>Admittedly I used SQL Server pretty heavily in the mid-to-late-2000s but haven't kept up with it in recent years so my dig may have been a little unfair.<p>Agree on READPAST being similar to SKIP_LOCKED, and filtered indexes are equivalent to partial indexes (I remember filtered indexes being in SQL Server 2008 when I used it).<p>Reading through the docs on Event Notifications they seem to be a little heavier and have different deliver semantics.  Correct me if I'm wrong, but Event Notifications seem to be more similar to a consumable queue (where a consumer calling RECEIVE removes events in the queue), whereas LISTEN/NOTIFY is more pubsub, where every client LISTENing to a channel gets every NOTIFY message.</p>
]]></description><pubDate>Sat, 10 Feb 2024 12:00:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=39325530</link><dc:creator>diek</dc:creator><comments>https://news.ycombinator.com/item?id=39325530</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39325530</guid></item><item><title><![CDATA[New comment by diek in "Postgres as queue"]]></title><description><![CDATA[
<p>In a large application you may have dozens of tables that different backends may be operating on.  Each worker pool polling on tables it may be interested on every couple seconds can add up, and it's really not necessary.<p>Another factor is polling frequency and processing latency.  All things equal, the delay from when a new task lands in a table to the time a backend is working on it should be as small as possible.  Single digit milliseconds, ideally.<p>A NOTIFY event is sent from the server-side as the transaction commits, and you can have a thread blocking waiting on that message to process it as soon as it arrives on the worker side.<p>So with NOTIFY you reduce polling load and also reduce latency.  The only time you need to actually query for tasks is to take over any expired leases, and since there is a 'lease_expire' column you know when that's going to happen so you don't have to continually check in.<p>As far as documentation, I got a simple java LISTEN/NOTIFY implementation working initially (2013?-ish) just from the excellent postgres docs: <a href="https://www.postgresql.org/docs/current/sql-notify.html" rel="nofollow">https://www.postgresql.org/docs/current/sql-notify.html</a></p>
]]></description><pubDate>Sat, 10 Feb 2024 11:46:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=39325470</link><dc:creator>diek</dc:creator><comments>https://news.ycombinator.com/item?id=39325470</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39325470</guid></item><item><title><![CDATA[New comment by diek in "Postgres as queue"]]></title><description><![CDATA[
<p>Postgres is great as a queue, but this post doesn't really get into the features that differentiate it from just polling, say SQL Server for tasks.<p>For me, the best features are:<p><pre><code>  * use LISTEN to be notified of rows that have changed that the backend needs to take action on (so you're not actively polling for new work)
  * use NOTIFY from a trigger so all you need to do is INSERT/UPDATE a table to send an event to listeners
  * you can select using SKIP LOCKED (as the article points out)
  * you can use partial indexes to efficiently select rows in a particular state
</code></pre>
So when a backend worker wakes up, it can:<p><pre><code>  * LISTEN for changes to the active working set it cares about
  * "select all things in status 'X'" (using a partial index predicate, so it's not churning through low cardinality 'active' statuses)
  * atomically update the status to 'processing' (using SKIP LOCKED to avoid contention/lock escalation)
  * do the work
  * update to a new status (which another worker may trigger on)
</code></pre>
So you end up with a pretty decent state machine where each worker is responsible for transitioning units of work from status X to status Y, and it's getting that from the source of truth.  You also usually want to have some sort of a per-task 'lease_expire' column so if a worker fails/goes away, other workers will pick up their task when they periodically scan for work.<p>This works for millions of units of work an hour with a moderately spec'd database server, and if the alternative is setting up SQS/SNS/ActiveMQ/etc and then _still_ having to track status in the database/manage a dead-letter-queue, etc -- it's not a hard choice at all.</p>
]]></description><pubDate>Sat, 10 Feb 2024 04:17:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=39323542</link><dc:creator>diek</dc:creator><comments>https://news.ycombinator.com/item?id=39323542</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39323542</guid></item><item><title><![CDATA[New comment by diek in "Git rebase, what can go wrong"]]></title><description><![CDATA[
<p>> EDIT: On top of that, there's usually a bit of 'related' work you need for a task, by example when you find an edge case related to your feature, and now you also needed to fix a bug, or you did a bit of refactoring on a related service, or needed to change the data on a badly formatted JSON file.<p>I agree that's related work, but I'd argue that work doesn't belong in that branch.  If you find a bug in the process of implementing a feature, create a bugfix branch that is merged separately.  If you need to refactor a service, that's also a separate branch/PR.<p>That's actually the most common pushback I get from people when I talk about squashing.  They say "but then a bunch of unrelated changes will be lumped together in the same commit", to which I respond, "why are a bunch of unrelated changes in the same branch/PR?"</p>
]]></description><pubDate>Mon, 06 Nov 2023 19:04:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=38167185</link><dc:creator>diek</dc:creator><comments>https://news.ycombinator.com/item?id=38167185</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38167185</guid></item><item><title><![CDATA[New comment by diek in "Git rebase, what can go wrong"]]></title><description><![CDATA[
<p>In general I agree with you, there are absolutely times where you want to retain commit history on a particular branch (although I try to keep the source tree from knowing about things like commit IDs).<p>I would argue that those are by far the minority of PRs that I see.  As I mentioned in another comment, _most_ PRs that I see have a ton of intermediary commits that are only useful for that branch/PR/review process (fixing tests, whitespace, etc).  Generally the advice I give teams is, "squash by default" and then figure out where the exceptions to that rule are.  That's mainly because, in my opinion, the downsides of a noisy commit graph filled with "addressing review comments" (or whatever) commits are a much bigger/frequent issue than the benefits you talk about.  It really depends on the team.</p>
]]></description><pubDate>Mon, 06 Nov 2023 19:00:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=38167101</link><dc:creator>diek</dc:creator><comments>https://news.ycombinator.com/item?id=38167101</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38167101</guid></item><item><title><![CDATA[New comment by diek in "Git rebase, what can go wrong"]]></title><description><![CDATA[
<p>What you're describing is just doing a 'squash' merge</p>
]]></description><pubDate>Mon, 06 Nov 2023 18:14:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=38166370</link><dc:creator>diek</dc:creator><comments>https://news.ycombinator.com/item?id=38166370</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38166370</guid></item><item><title><![CDATA[New comment by diek in "Git rebase, what can go wrong"]]></title><description><![CDATA[
<p>If the useful commits are the "baby" in your bathwater analogy, all the useful information in those commits is in the squashed commit.<p>This assumes a branch being merged in represents one logical change (a feature/bugfix/etc) that is "right sized" to be represented by one commit.</p>
]]></description><pubDate>Mon, 06 Nov 2023 18:10:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=38166294</link><dc:creator>diek</dc:creator><comments>https://news.ycombinator.com/item?id=38166294</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38166294</guid></item><item><title><![CDATA[New comment by diek in "Git rebase, what can go wrong"]]></title><description><![CDATA[
<p>The golden rule is "do not rewrite history of a public branch".  Rebase/squash your PR branches to your heart's content, but once it's merged that's it.<p>You get clean history by not merging branches with 50 intermediary "fiddling with X" commits in them.</p>
]]></description><pubDate>Mon, 06 Nov 2023 17:47:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=38165908</link><dc:creator>diek</dc:creator><comments>https://news.ycombinator.com/item?id=38165908</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38165908</guid></item><item><title><![CDATA[New comment by diek in "Git rebase, what can go wrong"]]></title><description><![CDATA[
<p>> destroying Commit information just to keep the graph tidy is a bad idea in my opinion<p>The commit information I see when telling teams to squash their branches on merge is not valuable.<p>* "fixing whitespace"
* "incorporate review comments"
* "fix broken test"
* "fix other broken test"<p>(note, the broken tests were broken by the changes in the PR)<p>As soon as that PR is merged those commits are worthless.  And there are branches with dozens of those "fixing X" commits that would otherwise pollute the commit graph.</p>
]]></description><pubDate>Mon, 06 Nov 2023 17:42:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=38165848</link><dc:creator>diek</dc:creator><comments>https://news.ycombinator.com/item?id=38165848</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38165848</guid></item><item><title><![CDATA[New comment by diek in "Git rebase, what can go wrong"]]></title><description><![CDATA[
<p>> I die a little bit each time I try to understand what changes were related to a line when tracking down a bug<p>A change/feature/bug is a branch, which is squashed into a commit on your main branch, right?
So your main branch should be a linear history of changes, one change per commit.<p>How does that impact the ability to git blame?</p>
]]></description><pubDate>Mon, 06 Nov 2023 17:37:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=38165763</link><dc:creator>diek</dc:creator><comments>https://news.ycombinator.com/item?id=38165763</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38165763</guid></item><item><title><![CDATA[New comment by diek in "Server Side Rendering at scale"]]></title><description><![CDATA[
<p>> Rather than waiting for the client to download a JavaScript bundle and render the page based on its contents, we render the page’s HTML on the server side and attach dynamic hooks on the client side once it’s been downloaded.<p>The fact that they don't make a reference like, "hey, ya know, how _everything_ worked just a few years ago" tells me they think this is somehow a novel idea they're just discovering.<p>They then go on to describe a convoluted rendering system with worker processes and IPC... I just don't know what to say.  They could have built this in Java, .Net, Go, really any shared memory concurrency runtime and threading, and would not run into any of these issues.</p>
]]></description><pubDate>Thu, 24 Feb 2022 07:40:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=30451842</link><dc:creator>diek</dc:creator><comments>https://news.ycombinator.com/item?id=30451842</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30451842</guid></item></channel></rss>