<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: mrkeen</title><link>https://news.ycombinator.com/user?id=mrkeen</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 15 Aug 2026 16:17:17 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=mrkeen" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by mrkeen in "Firefox is now the last major browser that still supports uBlock Origin"]]></title><description><![CDATA[
<p>I just live in the world where most things are crap.<p>People put up pages because they want to express themselves and/or receive views or engagement.<p>AI kills the first half, and trying to sell my attention kills the second half.<p>I don't stick around for it.  I click into "the secret romantic lives of elephants", hit popup hell, then realise I really didn't care.  I often can't even remember what I clicked on as soon as I hit back.</p>
]]></description><pubDate>Sat, 15 Aug 2026 10:38:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=49309447</link><dc:creator>mrkeen</dc:creator><comments>https://news.ycombinator.com/item?id=49309447</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49309447</guid></item><item><title><![CDATA[New comment by mrkeen in "NP-overrated"]]></title><description><![CDATA[
<p>Not sure if this counts, but I learned Huffman coding the intuitive tree-based way.  From memory it was O(nlogn), but you can just O(n) it in-place in an array.</p>
]]></description><pubDate>Thu, 13 Aug 2026 21:47:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=49292275</link><dc:creator>mrkeen</dc:creator><comments>https://news.ycombinator.com/item?id=49292275</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49292275</guid></item><item><title><![CDATA[New comment by mrkeen in "Why Target Common Lisp for Code Generation?"]]></title><description><![CDATA[
<p>What mechanism does CL have for reducing dangerous side-effects?</p>
]]></description><pubDate>Thu, 13 Aug 2026 18:06:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=49289792</link><dc:creator>mrkeen</dc:creator><comments>https://news.ycombinator.com/item?id=49289792</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49289792</guid></item><item><title><![CDATA[New comment by mrkeen in "Why Target Common Lisp for Code Generation?"]]></title><description><![CDATA[
<p>Let's look at what TFA actually says:<p><pre><code>  Let’s be honest: Lisp is a language designed by and for elite hackers, not for the masses.
</code></pre>
What do other people say about other languages?<p><pre><code>  Python is best for novice coders, machine learning, and versatility.  [https://www.boot.dev/blog/python/c-sharp-vs-python]

  Golang: Simpler and minimalistic language with fewer features, making it easier for beginners and experienced developers to learn and use effectively.  [https://charleswan111.medium.com/java-vs-golang-a-comparative-insight-into-usage-performance-and-industry-preferences-533a24013230]

  JavaScript is also considered to be more user-friendly and easier to learn than C++.  [https://www.c-sharpcorner.com/blogs/cpp-vs-javascript-programming]
</code></pre>
If one is allowed to compare apples and oranges, then surely one is allowed to compare oranges and apples.</p>
]]></description><pubDate>Thu, 13 Aug 2026 07:08:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=49282641</link><dc:creator>mrkeen</dc:creator><comments>https://news.ycombinator.com/item?id=49282641</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49282641</guid></item><item><title><![CDATA[New comment by mrkeen in "Choral: Choreographic Programming for Java"]]></title><description><![CDATA[
<p>Unit testing:<p>Well, which is it?  Testing a function, a class, or a module?<p>I didn't give <i>my definitions</i> of testing.  I said when you go out into the OO worldview, different people will call it different things, so ignore it, it's not important.  Sometimes one person will call it two or three different things.  E.g. Unit testing is a function testing vs. unit testing is class testing.<p>Demeter:
That's the thing I called wishful thinking.<p>Encoding desired sequence of behaviors into a type doesn't prevent errors:
That's the value proposition of Choreographic programming.  If it's wrong from the outset, simply disregard it.</p>
]]></description><pubDate>Tue, 11 Aug 2026 09:27:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=49255380</link><dc:creator>mrkeen</dc:creator><comments>https://news.ycombinator.com/item?id=49255380</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49255380</guid></item><item><title><![CDATA[New comment by mrkeen in "Choral: Choreographic Programming for Java"]]></title><description><![CDATA[
<p>That's wishful OO thinking.<p>It's led to Mockito-style testing (some people call it 'unit', others call it 'integration').  You decide that the behaviour of file.read() is that it returns a string of its contents.  You judge your software correct on the basis of how it processes the returned string.  Then you launch, and in the real world, the behaviour of file.read() is to return a FileHandleNotOpen exception, so you fix your code, improve your mocks to cover the opening/closing scenario, and re-release it.  Next time you run it, it throws a FileNotFound exception.  So you fix your code, then extend your mocks to cover that scenario too.  Later still, you call read() twice in prod, and hit a FileHandleAlreadyClosed exception (apparently the first read closed the file for you).  Fix the mocks again.<p>You wanted Mockito to lead reality, but it lags it.  Rather than Mockito being a useful tool to get your prod system working well, your prod system is actually a useful tool to get your Mockito mocks working well.<p>Choreographic programming lets you specify this protocol in <i>one place</i>.  "The file will be opened, the file will be read, the file will be closed, etc."  Then the different parties can't guess/assume or come up with their own half of the protocol incorrectly.</p>
]]></description><pubDate>Tue, 11 Aug 2026 08:33:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=49254989</link><dc:creator>mrkeen</dc:creator><comments>https://news.ycombinator.com/item?id=49254989</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49254989</guid></item><item><title><![CDATA[New comment by mrkeen in "Mark Zuckerberg attacks 'closed' AI rivals as Meta returns to open models"]]></title><description><![CDATA[
<p>Checked.<p><pre><code>  The more open source software out there the better. And the more open weights or even over source AI stuff the better too right?</code></pre></p>
]]></description><pubDate>Mon, 10 Aug 2026 20:14:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=49249083</link><dc:creator>mrkeen</dc:creator><comments>https://news.ycombinator.com/item?id=49249083</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49249083</guid></item><item><title><![CDATA[New comment by mrkeen in "Banksy works cost public almost £150k"]]></title><description><![CDATA[
<p>Of course the poster has considered it, and disagrees with the message!</p>
]]></description><pubDate>Sun, 09 Aug 2026 17:55:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=49233709</link><dc:creator>mrkeen</dc:creator><comments>https://news.ycombinator.com/item?id=49233709</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49233709</guid></item><item><title><![CDATA[New comment by mrkeen in "Banksy works cost public almost £150k"]]></title><description><![CDATA[
<p>Let them apply austerity measures then.</p>
]]></description><pubDate>Sun, 09 Aug 2026 17:51:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=49233676</link><dc:creator>mrkeen</dc:creator><comments>https://news.ycombinator.com/item?id=49233676</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49233676</guid></item><item><title><![CDATA[New comment by mrkeen in "“Code was never the hard part” is an insult to all programmers"]]></title><description><![CDATA[
<p>The answer to all these "if coding is easy" questions is that coding isn't programming (to put it in Lamport's terms).<p>Encoding your ideas into a programming language is easy.   Understanding that your ideas are bad is hard.<p>You have clients with multiple devices connecting to your backend simultaneously, while you mediate their interactions with your partner systems.  Their versions might not be up to date.  It's a distributed system.  When was the last time you cracked open a distributed systems textbook?<p>When was the last time you built a system and stared reality right in face, that is:
  - can't trust your clocks
  - pick 2/3 of CAP
  - exactly-once delivery impossible
  - the code will need to be altered and released without downtime
  - hackers will try to exploit you for fun and profit
  - your manager doesn't want you wasting time getting the above right<p>Coding is the easy bit.</p>
]]></description><pubDate>Sat, 08 Aug 2026 17:52:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=49224116</link><dc:creator>mrkeen</dc:creator><comments>https://news.ycombinator.com/item?id=49224116</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49224116</guid></item><item><title><![CDATA[New comment by mrkeen in "Parsers don't have to be complicated"]]></title><description><![CDATA[
<p>In C's defence, you only have forward-compatability of string handling to the extent that your string type <i>will not change in the future</i>.  Byte arrays are great for this.  All string encodings in the foreseeable future can be encoded in bytes.  You do not need to recompile coreutils once someone invents utf8-plus.<p>If you wrote your standard lib in whatever was better-than-C at the time, you might have settled for sized strings (who needs strings longer than 65535 bytes?) instead of \0, and you might have had utf32 or some kind of wide char representation.</p>
]]></description><pubDate>Fri, 07 Aug 2026 11:32:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=49208810</link><dc:creator>mrkeen</dc:creator><comments>https://news.ycombinator.com/item?id=49208810</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49208810</guid></item><item><title><![CDATA[New comment by mrkeen in "Parsers don't have to be complicated"]]></title><description><![CDATA[
<p>If you draw a line from 'ad-hoc byte-wrangling nonsense' to 'parser combinators', this can't be more than 20% along it.<p>Looking at the linked URL parser, why <i>doesn't</i> it look like<p><pre><code>  url = do scheme
           authority
           path
           query
           fragment
  where
  scheme = ...
  authority = ...
  etc.
</code></pre>
It looks totally ad-hoc.</p>
]]></description><pubDate>Fri, 07 Aug 2026 08:38:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=49207509</link><dc:creator>mrkeen</dc:creator><comments>https://news.ycombinator.com/item?id=49207509</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49207509</guid></item><item><title><![CDATA[New comment by mrkeen in "The Valley of Webhooks"]]></title><description><![CDATA[
<p>Yep!  And since your partner will be unlikely to build a new architecture on the request of one customer, you should 'do the Kafka thing' on your end, capture everything (double-sends and all), then smartly query your events, rather than try to program correct double-send-friendly db updates.</p>
]]></description><pubDate>Thu, 06 Aug 2026 20:42:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=49202244</link><dc:creator>mrkeen</dc:creator><comments>https://news.ycombinator.com/item?id=49202244</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49202244</guid></item><item><title><![CDATA[New comment by mrkeen in "The Valley of Webhooks"]]></title><description><![CDATA[
<p>I usually preach that a big blob of mutable state in the middle of your system (the db) is the problem, and events are the solution, and this seems like its most obvious case.<p>All your problems start when you try to modify your current state representation in response to hearing the USER_ADDED or USER_BLOCKED events.  Just don't.  Leave them as events.  Any time you have a new stupid edge case (double send, out-of-order, add-then-delete-then-add), this becomes one new unit test, where you can soberly decide what it means, and update your read path to understand it.<p>If you bake the nonsense into the <i>current db state</i> every time a new event arrives, your first step in any debug or reasoning scenario is to unbake it: what <i>events</i> led to this mess?  If you don't throw away the events, your debugging is done for you.</p>
]]></description><pubDate>Thu, 06 Aug 2026 20:37:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=49202169</link><dc:creator>mrkeen</dc:creator><comments>https://news.ycombinator.com/item?id=49202169</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49202169</guid></item><item><title><![CDATA[New comment by mrkeen in "Mars dust is toxic. How will future astronauts deal with it?"]]></title><description><![CDATA[
<p>Build MarsX and hope they can one day get over to Earth</p>
]]></description><pubDate>Thu, 06 Aug 2026 13:37:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=49196502</link><dc:creator>mrkeen</dc:creator><comments>https://news.ycombinator.com/item?id=49196502</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49196502</guid></item><item><title><![CDATA[New comment by mrkeen in "Celld: Self-hosted, distributed Durable Objects"]]></title><description><![CDATA[
<p>I think you might be asking too much when it comes to correctness.<p>It's like fixing all the problems with democracy by putting everyone in charge of their own 1-person election.</p>
]]></description><pubDate>Thu, 06 Aug 2026 13:01:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=49196084</link><dc:creator>mrkeen</dc:creator><comments>https://news.ycombinator.com/item?id=49196084</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49196084</guid></item><item><title><![CDATA[New comment by mrkeen in ""Clean" Code, Horrible Performance (2023)"]]></title><description><![CDATA[
<p>Maybe give shape another try.<p><a href="https://www.youtube.com/watch?v=zHiWqnTWsn4" rel="nofollow">https://www.youtube.com/watch?v=zHiWqnTWsn4</a><p>1:00:00 - Open/closed principle and 1:13:52 - Liskov substitution principle.<p>Both are given in terms of Shape, but it's to paint the picture that things are more complicated than you thought, even with something that should have been as simple as shapes.  (As opposed to "shapes are easy, just model the world like that and it will be easy too")</p>
]]></description><pubDate>Tue, 04 Aug 2026 21:55:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=49175743</link><dc:creator>mrkeen</dc:creator><comments>https://news.ycombinator.com/item?id=49175743</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49175743</guid></item><item><title><![CDATA[The Math Behind "Water-Efficient AI Data Centres" Is Laughably Wrong [video]]]></title><description><![CDATA[
<p>Article URL: <a href="https://www.youtube.com/watch?v=8bbe-Ev-Yns">https://www.youtube.com/watch?v=8bbe-Ev-Yns</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=49171243">https://news.ycombinator.com/item?id=49171243</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Tue, 04 Aug 2026 16:33:36 +0000</pubDate><link>https://www.youtube.com/watch?v=8bbe-Ev-Yns</link><dc:creator>mrkeen</dc:creator><comments>https://news.ycombinator.com/item?id=49171243</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49171243</guid></item><item><title><![CDATA[New comment by mrkeen in "Understanding Raft Leader Election by building from scratch"]]></title><description><![CDATA[
<p>Paxos is extremely hard to understand and implement. So Raft is a simple and easy-to-understand alternative to Paxos.<p>This is one of the most uncritically parroted memes in these parts.</p>
]]></description><pubDate>Mon, 03 Aug 2026 10:16:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=49153717</link><dc:creator>mrkeen</dc:creator><comments>https://news.ycombinator.com/item?id=49153717</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49153717</guid></item><item><title><![CDATA[New comment by mrkeen in "Show HN: Fuse – statically typed functional programming language"]]></title><description><![CDATA[
<p>I'm not sure most languages get a vote here.<p>They can't even represent Fuse's Functor example, i.e.<p><pre><code>  f: A -> B, x: F[A]
</code></pre>
so maybe they don't get any points for syntax.</p>
]]></description><pubDate>Sun, 02 Aug 2026 20:21:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=49147935</link><dc:creator>mrkeen</dc:creator><comments>https://news.ycombinator.com/item?id=49147935</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49147935</guid></item></channel></rss>