<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: rav</title><link>https://news.ycombinator.com/user?id=rav</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Wed, 26 Aug 2026 19:22:04 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=rav" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by rav in "Ghost Font: A font that humans can read but AI cannot"]]></title><description><![CDATA[
<p>> For example, it would be interesting to incorporate Ghost Font into CAPTCHA systems, as most systems are easily solved by AI today.<p>It seems to me like it should be easy enough to take Ghost Font, apply normal video compression techniques, and analyze the compressed signal to recover the visual outline of the letters, which you would then analyze with OCR (or an AI I guess ...). In other words, a novel CAPTCHA technique but not necessarily "fundamentally more difficult" than existing CAPTCHA techniques, once the cat-and-mouse game gets going.</p>
]]></description><pubDate>Sat, 11 Jul 2026 15:43:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=48873015</link><dc:creator>rav</dc:creator><comments>https://news.ycombinator.com/item?id=48873015</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48873015</guid></item><item><title><![CDATA[New comment by rav in "A stray "j" ruined my evening"]]></title><description><![CDATA[
<p>Today I learned that jq -Rrj is a shorter command line for doing the same as tr -d '\n'.</p>
]]></description><pubDate>Sun, 28 Jun 2026 10:18:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=48706060</link><dc:creator>rav</dc:creator><comments>https://news.ycombinator.com/item?id=48706060</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48706060</guid></item><item><title><![CDATA[New comment by rav in "Boffin claims Microsoft’s “quantum leap” is invalid due to “basic Python errors”"]]></title><description><![CDATA[
<p>Not the first time that a Nature publication's "too good to be true" results turn out to be based on simple programming errors... Nature 532, 210 (2016) was retracted after it was shown that a hand-coded gradient function, used in gradient descent, had a simple sign error (details in arXiv 2003.05808).</p>
]]></description><pubDate>Wed, 24 Jun 2026 19:33:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=48664674</link><dc:creator>rav</dc:creator><comments>https://news.ycombinator.com/item?id=48664674</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48664674</guid></item><item><title><![CDATA[New comment by rav in "The truth about being a manager"]]></title><description><![CDATA[
<p>There's a note at the end:<p>> As always, this blog post is written by me, without any AI, so all errors are my own.<p>However, the illustrations in the post are clearly made by generative AI, are they not?</p>
]]></description><pubDate>Tue, 23 Jun 2026 18:06:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=48648880</link><dc:creator>rav</dc:creator><comments>https://news.ycombinator.com/item?id=48648880</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48648880</guid></item><item><title><![CDATA[New comment by rav in "The Traditional Vi (2007)"]]></title><description><![CDATA[
<p>> Of course, if you're implementing POSIX vi, there are quite a few features that have aged poorly, like roff/troff macros and line-editing<p>What do you mean by "roff/troff macros"?<p>EDIT: Ah, you're probably talking about the "section-wise" movements, defined in POSIX with language like "A line whose first character is a <period> and whose second and third characters match a two-character pair in the 'sections' edit option (see ex)" - that's the first time I've stumbled upon the 'sections' and 'paragraphs' options in the Vim manual ... Very quaint!</p>
]]></description><pubDate>Tue, 23 Jun 2026 17:23:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=48648258</link><dc:creator>rav</dc:creator><comments>https://news.ycombinator.com/item?id=48648258</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48648258</guid></item><item><title><![CDATA[New comment by rav in "Is my blue your blue? (2024)"]]></title><description><![CDATA[
<p>Looking in dev console reveals that the issue is an error response from <a href="https://cdn.skypack.dev/canvas-confetti" rel="nofollow">https://cdn.skypack.dev/canvas-confetti</a> - at the moment that URL returns:<p><pre><code>        A server error has occurred

        FUNCTION_INVOCATION_FAILED

        sfo1::qcpj5-1777386477345-b792e22509f4</code></pre></p>
]]></description><pubDate>Tue, 28 Apr 2026 17:06:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=47937288</link><dc:creator>rav</dc:creator><comments>https://news.ycombinator.com/item?id=47937288</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47937288</guid></item><item><title><![CDATA[New comment by rav in "A Git helper tool that breaks large merges into parallelizable tasks"]]></title><description><![CDATA[
<p>Given a commit that both refactors (A) and adds a feature (B), you can go into the codebase and remove the new feature by hand (B^-1), commit the feature removal, and immediately revert the feature removal. This leads to three commits: (A B), B^-1, and B. Squash the first two commits to obtain a commit that only refactors, and another commit that only adds the new feature. I've written more about this technique ("the Hammer") here: <a href="https://github.com/Mortal/gittalk" rel="nofollow">https://github.com/Mortal/gittalk</a></p>
]]></description><pubDate>Fri, 17 Apr 2026 15:06:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=47806748</link><dc:creator>rav</dc:creator><comments>https://news.ycombinator.com/item?id=47806748</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47806748</guid></item><item><title><![CDATA[New comment by rav in "High-Level Rust: Getting 80% of the Benefits with 20% of the Pain"]]></title><description><![CDATA[
<p>In TypeScript it's called "bivariance", which sounds very programming language theory like, but is not a term typically used in academic contexts, since it is unsound almost by default. It's described here: <a href="https://www.typescriptlang.org/docs/handbook/type-compatibility.html#function-parameter-bivariance" rel="nofollow">https://www.typescriptlang.org/docs/handbook/type-compatibil...</a></p>
]]></description><pubDate>Sun, 12 Apr 2026 12:07:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=47738730</link><dc:creator>rav</dc:creator><comments>https://news.ycombinator.com/item?id=47738730</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47738730</guid></item><item><title><![CDATA[New comment by rav in "Show HN: Llmswap – Python package to reduce LLM API costs by 50-90% with caching"]]></title><description><![CDATA[
<p>How is it "50-90%" savings? If a given application doesn't repeat its queries, surely there's nothing to save by caching the responses?</p>
]]></description><pubDate>Sun, 10 Aug 2025 17:58:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=44856978</link><dc:creator>rav</dc:creator><comments>https://news.ycombinator.com/item?id=44856978</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44856978</guid></item><item><title><![CDATA[New comment by rav in "Don't unwrap options: There are better ways (2024)"]]></title><description><![CDATA[
<p>You can rewrite it using let-or-else to get rid of the unwrap, which some would find to be more idiomatic.<p><pre><code>    let value = Some(param.as_ref()) else {
      // Handle, and continue, return an error etc
    }
    // Use `value` as normal.</code></pre></p>
]]></description><pubDate>Tue, 13 May 2025 19:27:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=43976661</link><dc:creator>rav</dc:creator><comments>https://news.ycombinator.com/item?id=43976661</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43976661</guid></item><item><title><![CDATA[New comment by rav in "Ask HN: Do you still use search engines?"]]></title><description><![CDATA[
<p>At the moment it seems like you can avoid AI search results by either including swear words, or by using 'minus' to exclude terms (e.g. append -elephant to your search query).</p>
]]></description><pubDate>Tue, 08 Apr 2025 18:45:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=43625192</link><dc:creator>rav</dc:creator><comments>https://news.ycombinator.com/item?id=43625192</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43625192</guid></item><item><title><![CDATA[New comment by rav in "When you deleted /lib on Linux while still connected via SSH (2022)"]]></title><description><![CDATA[
<p>I often run rm -rf as part of operations (for reasons), and my habit is to first run "sudo du -csh" on the paths to be deleted, check that the total size makes sense, and then up-arrow and replace "du -csh" with "rm -rf".</p>
]]></description><pubDate>Sat, 22 Mar 2025 18:01:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=43447454</link><dc:creator>rav</dc:creator><comments>https://news.ycombinator.com/item?id=43447454</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43447454</guid></item><item><title><![CDATA[New comment by rav in "AI Blindspots – Blindspots in LLMs I've noticed while AI coding"]]></title><description><![CDATA[
<p>My suggestion: Change the color of visited links! Adding a "visited" color for links will make it easier for visitors to see which posts they have already read.</p>
]]></description><pubDate>Wed, 19 Mar 2025 19:52:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=43416552</link><dc:creator>rav</dc:creator><comments>https://news.ycombinator.com/item?id=43416552</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43416552</guid></item><item><title><![CDATA[New comment by rav in "Show HN: "Git who" – A new CLI tool for industrial-scale Git blaming"]]></title><description><![CDATA[
<p>On a small team I usually already know who wrote the code I'm reading, but it's nice to see if a block of code is all from the same point in time, or if some of the lines are the result of later bugfixing. It's also useful to find the associated pull request for a block of code, to see what issues were considered in code review, to know whether something that seems odd was discussed or glossed over when the code was merged in the first place.</p>
]]></description><pubDate>Tue, 18 Mar 2025 22:23:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=43405874</link><dc:creator>rav</dc:creator><comments>https://news.ycombinator.com/item?id=43405874</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43405874</guid></item><item><title><![CDATA[New comment by rav in "Hk, a new Git hook manager"]]></title><description><![CDATA[
<p>Ooh, core.hooksPath is quite nifty. I usually use something like<p><pre><code>         ln -sf ../../scripts/git-pre-commit-hook .git/hooks/pre-commit
</code></pre>
which simply adds a pre-commit symlink to a script in the repo's scripts/ dir. But hooksPath seems better.</p>
]]></description><pubDate>Mon, 17 Feb 2025 22:14:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=43083810</link><dc:creator>rav</dc:creator><comments>https://news.ycombinator.com/item?id=43083810</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43083810</guid></item><item><title><![CDATA[New comment by rav in "It's OK to hardcode feature flags"]]></title><description><![CDATA[
<p>I don't understand what a dedicated "completely open source offering" provides or what your "five nines feature flag system" provides. If you're running on a simple system architecture, then you can sync some text files around, and if you have a more scalable distributed architecture, then you're probably already handling some kind of slowly-changing, centrally-managed system state at runtime (e.g. authentication/authorization, or in-app news updates, ...) where you can easily add another slowly-changing, centrally-managed bit of data to be synchronised. How do you measure the nines on a feature flag system, if you're not just listing the nines on your system as a whole?</p>
]]></description><pubDate>Sat, 01 Feb 2025 18:21:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=42900678</link><dc:creator>rav</dc:creator><comments>https://news.ycombinator.com/item?id=42900678</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42900678</guid></item><item><title><![CDATA[New comment by rav in "Using uv as your shebang line"]]></title><description><![CDATA[
<p>It seems to me that macOS has env -S as well, but the shebang parsing is different. The result is that shebang lines using env -S are portable if they don't contain any quotes or other characters. The reason is that, running env -S 'echo a b c' has the same behavior as running env -S 'echo' 'a' 'b' 'c' - so simple command lines like the one with uv are still portable, regardless of whether the OS splits on space (macOS) or not (Linux).</p>
]]></description><pubDate>Tue, 28 Jan 2025 22:11:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=42858744</link><dc:creator>rav</dc:creator><comments>https://news.ycombinator.com/item?id=42858744</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42858744</guid></item><item><title><![CDATA[New comment by rav in "Using uv as your shebang line"]]></title><description><![CDATA[
<p>Oh wow, today I learned about env -S - when I saw the shebang line in the article, I immediately thought "that doesn't work on Linux, shebang lines can only pass a single argument". Basically, running foo.py starting with<p><pre><code>    #!/usr/bin/env -S uv run --script
</code></pre>
causes the OS run really run env with only two arguments, namely the shebang line as one argument and the script's filename as the second argument, i.e.:<p><pre><code>    /usr/bin/env '-S uv run --script' foo.py
</code></pre>
However, the -S flag of env causes env to split everything back into separate arguments! Very cool, very useful.</p>
]]></description><pubDate>Tue, 28 Jan 2025 19:13:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=42856610</link><dc:creator>rav</dc:creator><comments>https://news.ycombinator.com/item?id=42856610</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42856610</guid></item><item><title><![CDATA[New comment by rav in "Every HTML Element"]]></title><description><![CDATA[
<p>No love for the <plaintext> tag? "The <plaintext> HTML element renders everything following the start tag as raw text, ignoring any following HTML. There is no closing tag, since everything after it is considered raw text." - it's my favorite obscure deprecated HTML tag.</p>
]]></description><pubDate>Sun, 26 Jan 2025 13:52:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=42830105</link><dc:creator>rav</dc:creator><comments>https://news.ycombinator.com/item?id=42830105</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42830105</guid></item><item><title><![CDATA[New comment by rav in "Llama.vim – Local LLM-assisted text completion"]]></title><description><![CDATA[
<p>FIM is "fill in middle", i.e. completion in a text editor using context on both sides of the cursor.</p>
]]></description><pubDate>Thu, 23 Jan 2025 21:56:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=42808479</link><dc:creator>rav</dc:creator><comments>https://news.ycombinator.com/item?id=42808479</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42808479</guid></item></channel></rss>