<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: epr</title><link>https://news.ycombinator.com/user?id=epr</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sun, 12 Apr 2026 18:33:41 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=epr" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by epr in "A Faster Alternative to Jq"]]></title><description><![CDATA[
<p>To fix this I recently made myself a tiny tool I called jtree that recursively walks json, spitting out one line per leaf. Each line is the jq selector and leaf value separated by "=".<p>No more fiddling around trying to figure out the damn selector by trying to track the indentation level across a huge file. Also easy to pipe into fzf, then split on "=", trim, then pass to jq</p>
]]></description><pubDate>Fri, 27 Mar 2026 18:19:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=47546329</link><dc:creator>epr</dc:creator><comments>https://news.ycombinator.com/item?id=47546329</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47546329</guid></item><item><title><![CDATA[New comment by epr in "Building a Shell"]]></title><description><![CDATA[
<p>I think there's a good one if you search around for "xv6 sh.c". Hard to tell immediately from a google search just now since there are many implementations (people do it in school) and github's currently blocking requests from my phone.<p>Also helpful may be running strace on your shell, then reviewing the output line by line to make sure you understand each. This is a VERY instructive exercise to do in general.</p>
]]></description><pubDate>Tue, 17 Mar 2026 17:52:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=47415955</link><dc:creator>epr</dc:creator><comments>https://news.ycombinator.com/item?id=47415955</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47415955</guid></item><item><title><![CDATA[New comment by epr in "Lisp from Nothing, Second Edition"]]></title><description><![CDATA[
<p>When I was a beginner, A Gentle Introduction to Symbolic Computation worked for me. As the title suggests, it gently introduces concepts in a very beginner friendly manner, so even macros are easy enough to grasp by the time you get there. The diagrams and examples are great.<p><a href="https://www.cs.cmu.edu/~dst/LispBook/book.pdf" rel="nofollow">https://www.cs.cmu.edu/~dst/LispBook/book.pdf</a></p>
]]></description><pubDate>Sat, 30 Aug 2025 11:03:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=45073643</link><dc:creator>epr</dc:creator><comments>https://news.ycombinator.com/item?id=45073643</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45073643</guid></item><item><title><![CDATA[New comment by epr in "Replacing tmux in my dev workflow"]]></title><description><![CDATA[
<p>These are all great. If you need to do something more involved, pexpect is also worth mentioning. It's a reimplementation of expect in python that's easy to be productive with quickly.<p>I used it in a previous job to automate configuring thousands of network devices</p>
]]></description><pubDate>Fri, 01 Aug 2025 11:36:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=44755419</link><dc:creator>epr</dc:creator><comments>https://news.ycombinator.com/item?id=44755419</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44755419</guid></item><item><title><![CDATA[New comment by epr in "Dwl: Dwm for Wayland"]]></title><description><![CDATA[
<p>dwm and the community around it tend to use patches for absolutely everything, unlike most other projects. For most projects/codebases, maintaining patch sets is done for security, customizations, etc., but rarely are users expected to configure their window manager by modifying the source code. dwm is well known for being very minimalist, with many features people would expect from other window managers not being included out of the box. To get something more fully featured, users are meant to cobble together their own version of dwm with multiple patches. I'm not saying this workflow doesn't work for dwm and other suckless software projects, it's just that it's pretty out of the ordinary.<p>So, having some experience with the project and how different x and wayland are, when I saw this commenter had brought up the idea of making the switch from x to wayland a patch, it made me laugh out loud. The idea of leaning even further into the borderline degenerate amount of patching already done with suckless software to the point where you're practically rewriting the majority of it was very funny, and so I was confused about the downvotes.</p>
]]></description><pubDate>Fri, 25 Jul 2025 20:44:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=44688227</link><dc:creator>epr</dc:creator><comments>https://news.ycombinator.com/item?id=44688227</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44688227</guid></item><item><title><![CDATA[New comment by epr in "Dwl: Dwm for Wayland"]]></title><description><![CDATA[
<p>I guess people downvoting this don't get the joke?</p>
]]></description><pubDate>Fri, 25 Jul 2025 16:05:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=44684755</link><dc:creator>epr</dc:creator><comments>https://news.ycombinator.com/item?id=44684755</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44684755</guid></item><item><title><![CDATA[New comment by epr in "The Big OOPs: Anatomy of a Thirty-Five Year Mistake"]]></title><description><![CDATA[
<p>Everything is an object in Python as well</p>
]]></description><pubDate>Thu, 24 Jul 2025 02:03:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=44666095</link><dc:creator>epr</dc:creator><comments>https://news.ycombinator.com/item?id=44666095</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44666095</guid></item><item><title><![CDATA[New comment by epr in "Fei-Fei Li: Spatial intelligence is the next frontier in AI [video]"]]></title><description><![CDATA[
<p>Human beings get by quite well with extremely oversimplified (low resolution) abstractions. There is no need whatsoever for something even approaching universal or perfect. Humans aren't thinking about fundamental particles or solving differential equations in their head when they're driving a car or playing sports.</p>
]]></description><pubDate>Thu, 03 Jul 2025 19:02:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=44458172</link><dc:creator>epr</dc:creator><comments>https://news.ycombinator.com/item?id=44458172</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44458172</guid></item><item><title><![CDATA[New comment by epr in "The time bomb in the tax code that's fueling mass tech layoffs"]]></title><description><![CDATA[
<p>Yes, but the main thing here is that ALL software development is now "profit" in the short term. In theory you've developed a capital good that benefits you over time, hence the amortization.<p>Simplified 2021 example before 174:<p><pre><code>    100k Revenue
    100k Software Dev Costs
    No profit or tax
</code></pre>
Simplified 2022 example after 174:<p><pre><code>    100k Revenue
    100k Software Dev Costs
    90k "profit"
    18.9k taxes
</code></pre>
Above example is year one of suddenly having these taxes, because if your software costs are the same or lower over time it gets easier. It's just extremely painful for smaller and especially fast growing companies like startups without a lot of cash, especially when interest rates are so high.<p>Accountants: If I am wrong about the above, please correct me</p>
]]></description><pubDate>Sat, 07 Jun 2025 14:12:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=44209776</link><dc:creator>epr</dc:creator><comments>https://news.ycombinator.com/item?id=44209776</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44209776</guid></item><item><title><![CDATA[New comment by epr in "TIL: timeout in Bash scripts"]]></title><description><![CDATA[
<p>My bad on that typo. I write "$@" so often in shell scripts that I should know better. Also would've been caught by shellcheck. Outside the hn edit window though, so my mistake is permanent :(</p>
]]></description><pubDate>Tue, 27 May 2025 11:11:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=44105781</link><dc:creator>epr</dc:creator><comments>https://news.ycombinator.com/item?id=44105781</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44105781</guid></item><item><title><![CDATA[New comment by epr in "TIL: timeout in Bash scripts"]]></title><description><![CDATA[
<p>I'm generally not a huge fan of inlining the command or cluttering up my local directory with little scripts to get around the fact that it must be a subprocess you can send a signal to. I use a wrapper like this, which exports a function containing whatever complex logic I want to time out. The funky quoting in the timeout bash -c argument is a generalized version of what aidenn0 mentioned in another comment here (passing in args safely to subproc).<p><pre><code>    #!/usr/bin/env bash

    long_fn () { # this can contain anything, like OPs until curl loop
      sleep $1
    }

    # to TIMEOUT_DURATION BASH_FN_NAME BASH_FN_ARGS...
    to () {
      local duration="$1"; shift
      local fn_name="$1"; shift
      export -f "$fn_name"
      timeout "$duration" bash -c "$fn_name"'  "$@"' _ $@
    }

    time to 1s long_fn 5 # will report it ran 1 second</code></pre></p>
]]></description><pubDate>Mon, 26 May 2025 16:38:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=44099022</link><dc:creator>epr</dc:creator><comments>https://news.ycombinator.com/item?id=44099022</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44099022</guid></item><item><title><![CDATA[New comment by epr in "John Carmack talk at Upper Bound 2025"]]></title><description><![CDATA[
<p>A bit confusing for sure, but I think (not sure) I get what they're saying. Training a nn (for visual tasks at least) consists of training a model with much more dimensions (params) than the input space (eg: controller inputs + atari pixels). This contrasts with a lot of what humans do, which is take higher dimensional information (tons of data per second combining visual, audio, touch/vibration, etc) and synthesizing much lower dimensional models / heuristics / rules of thumb, like the example they give of the 5 second per mile rule for thunder.</p>
]]></description><pubDate>Fri, 23 May 2025 13:07:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=44072526</link><dc:creator>epr</dc:creator><comments>https://news.ycombinator.com/item?id=44072526</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44072526</guid></item><item><title><![CDATA[New comment by epr in "John Carmack talk at Upper Bound 2025"]]></title><description><![CDATA[
<p>Actually no, it's not interesting at all. Vague dismissal of an outsider is a pretty standard response by insecure academic types. It could have been interesting and/or helpful to the conversation if they went into specifics or explained anything at all. Since none of that's provided, it's "OpenAI insider" vs John Carmack AND Richard Sutton. I know who I would bet on.</p>
]]></description><pubDate>Fri, 23 May 2025 11:34:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=44071880</link><dc:creator>epr</dc:creator><comments>https://news.ycombinator.com/item?id=44071880</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44071880</guid></item><item><title><![CDATA[New comment by epr in "An epic treatise on error models for systems programming languages"]]></title><description><![CDATA[
<p>> We studied 198 randomly sampled, real world fail- ures reported on five popular distributed data-analytic and storage systems, including HDFS, a distributed file system [27]; Hadoop MapReduce, a distributed data- analytic framework [28]; HBase and Cassandra, two NoSQL distributed databases [2, 3]; and Redis, an in- memory key-value store supporting master/slave replica- tion [54]<p>So, analyzing databases, we picked Java, Java, Java, Java, and one in C. This does not seem very random. I suppose this may provide insight into failure modes in Java codebases in particular, but I'm not sure I'd be in a hurry to generalize.</p>
]]></description><pubDate>Sat, 08 Mar 2025 13:38:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=43300165</link><dc:creator>epr</dc:creator><comments>https://news.ycombinator.com/item?id=43300165</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43300165</guid></item><item><title><![CDATA[New comment by epr in "FFmpeg School of Assembly Language"]]></title><description><![CDATA[
<p>The best answer to your question is some variant of "write more assembly".<p>When someone indicates to me they want to learn programming for example, I ask them how many programs they've written. The answer is usually zero, and in fact I've never even heard greater than 10. No one will answer a larger number because that selects out people who would even ask the question. If you write 1000 programs that solve real problems, you'll be at least okay. 10k and you'll be pretty damn good. 100k and you might be better than the guy who wrote the assembly manual.<p>For a fun answer, this is a $20 nand2tetris-esque game that holds your hand through creating multiple cpu architectures from scratch with verification (similarly to prolog/vhdl), plus your own assembly language. I admittedly always end up writing an assembler outside of the game that copies to my clipboard, but I'm pretty fussy about ux and prefer my normal tools.<p><a href="https://store.steampowered.com/app/1444480/Turing_Complete/" rel="nofollow">https://store.steampowered.com/app/1444480/Turing_Complete/</a></p>
]]></description><pubDate>Sun, 23 Feb 2025 12:49:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=43148901</link><dc:creator>epr</dc:creator><comments>https://news.ycombinator.com/item?id=43148901</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43148901</guid></item><item><title><![CDATA[New comment by epr in "FFmpeg School of Assembly Language"]]></title><description><![CDATA[
<p>For what's written in assembly,  lack of portability is a given. The only exceptions would presumably be high level entry points called to from C, etc. If you wanted to support multiple targets, you have completely separate assembly modules for each architecture at least. You'd even need to bifurcate further for each simd generation (within x64 for example).</p>
]]></description><pubDate>Sun, 23 Feb 2025 12:11:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=43148724</link><dc:creator>epr</dc:creator><comments>https://news.ycombinator.com/item?id=43148724</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43148724</guid></item><item><title><![CDATA[New comment by epr in "We were wrong about GPUs"]]></title><description><![CDATA[
<p>If someone doesn't understand "container", I'm supposed to expect them to understand all the namespaces and their uses, cgroups, and the nitty gritty of the wimpy security isolation? You are proving my point that it's tough to summarize by using a bunch more terms that are difficult to summarize.<p>Once you recursively expand all the concepts, you will have multiple dense paragraphs, which don't "summarize" anything, but instead provide full explanations.</p>
]]></description><pubDate>Sat, 15 Feb 2025 16:00:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=43059462</link><dc:creator>epr</dc:creator><comments>https://news.ycombinator.com/item?id=43059462</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43059462</guid></item><item><title><![CDATA[New comment by epr in "We were wrong about GPUs"]]></title><description><![CDATA[
<p>> Having multiple processes under one user in an operating system is more akin to having multiple threads in one process than you think.<p>Not than I think. I'm well aware of how "tasks" work in Linux specifically, and am pretty comfortable working directly with clone.<p>Your explanation is great, but I intentionally went out of my way to not explain it and instead give a simple analogy. The entire point was that it's difficult to summarize.</p>
]]></description><pubDate>Sat, 15 Feb 2025 15:56:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=43059426</link><dc:creator>epr</dc:creator><comments>https://news.ycombinator.com/item?id=43059426</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43059426</guid></item><item><title><![CDATA[New comment by epr in "We were wrong about GPUs"]]></title><description><![CDATA[
<p>If a container is "a process", then an entire linux/unix os (pid 1) is simply "a process"</p>
]]></description><pubDate>Sat, 15 Feb 2025 15:52:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=43059377</link><dc:creator>epr</dc:creator><comments>https://news.ycombinator.com/item?id=43059377</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43059377</guid></item><item><title><![CDATA[New comment by epr in "We were wrong about GPUs"]]></title><description><![CDATA[
<p>No, they are not. I'm not sure who started this whole container is just a process thing, but it's not a good analogy. Quite a lot of things you spin up containers for have multiple processes (databases, web servers, etc).<p>Containers are inherently difficult to sum up in a sentence. Perhaps the most reasonable comparison is to liken them to a "lightweight" vm, but the reasons people use them are so drastically different than vms at this point. The most common usecase for containers is having a decent toolchain for simple, somewhat reproducible software environments. Containers are mostly a hack to get around the mess we've made in software.</p>
]]></description><pubDate>Sat, 15 Feb 2025 03:58:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=43055778</link><dc:creator>epr</dc:creator><comments>https://news.ycombinator.com/item?id=43055778</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43055778</guid></item></channel></rss>