<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: twic</title><link>https://news.ycombinator.com/user?id=twic</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Tue, 14 Apr 2026 22:15:53 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=twic" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by twic in "How Passive Radar Works"]]></title><description><![CDATA[
<p>Knowing where the transmitters are is vital. So wonder if you build in a positioning system to them. Each transmitter transmits a signal, but also rebroadcasts the signals it receives from the other transmitters on separate bands (these can be at lower power). If you can pick up a few transmitters, is that enough to build a model of where they are relative to each other, and then where they are relative to you?<p>If each transmitter picks up the rebroadcasts if its own signals, then with some assumptions about the rebroadcast lag (or measurements of it added to the signal!), that's enough to know the range to each other transmitter, right? So maybe they do that and then just broadcast the ranges (tagged on to their main signal), then any remote receiver can work it all out from there.</p>
]]></description><pubDate>Sat, 11 Apr 2026 14:21:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=47730882</link><dc:creator>twic</dc:creator><comments>https://news.ycombinator.com/item?id=47730882</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47730882</guid></item><item><title><![CDATA[New comment by twic in "Tesla Is Sitting on a Record 50k Unsold EVs"]]></title><description><![CDATA[
<p>You're completely right. I've got an idea for an investment strategy. We start a company, and issue shares. We use the money to buy Teslas, and hold them as assets. As the value goes up, the value of the company will rise. Then we issue more shares, at a higher valuation, and use the money to buy <i>more</i> Teslas. Infinite money glitch. I call it a Drivable Asset Treasury company.</p>
]]></description><pubDate>Sat, 04 Apr 2026 13:02:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=47638718</link><dc:creator>twic</dc:creator><comments>https://news.ycombinator.com/item?id=47638718</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47638718</guid></item><item><title><![CDATA[New comment by twic in "Model Collapse Is Happening, We Just Pretend It Isn't"]]></title><description><![CDATA[
<p>Oh, so this isn't about the Modell's collapse? <a href="https://www.nytimes.com/2020/03/11/business/modells-bankruptcy.html" rel="nofollow">https://www.nytimes.com/2020/03/11/business/modells-bankrupt...</a></p>
]]></description><pubDate>Thu, 26 Mar 2026 21:41:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=47536160</link><dc:creator>twic</dc:creator><comments>https://news.ycombinator.com/item?id=47536160</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47536160</guid></item><item><title><![CDATA[New comment by twic in "I quit editing photos"]]></title><description><![CDATA[
<p>My version of this workflow is, i take digital photos, and don't edit them.<p>Turns out, it's fine! The photos aren't perfect, but no amount of editing could make them perfect anyway. They look like the thing they're a picture of. That does the job. And with the time i save by not doing any editing, i have time to take more photos! Or read a book! Or sleep!</p>
]]></description><pubDate>Tue, 24 Mar 2026 20:11:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=47508434</link><dc:creator>twic</dc:creator><comments>https://news.ycombinator.com/item?id=47508434</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47508434</guid></item><item><title><![CDATA[New comment by twic in "Microservices and the First Law of Distributed Objects (2014)"]]></title><description><![CDATA[
<p>Having gone from multi-repo to monorepo recently, I'd say the opposite. A multi-repo lets you do those things incrementally. A monorepo forces you to do them in one go.</p>
]]></description><pubDate>Tue, 24 Mar 2026 15:11:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=47503848</link><dc:creator>twic</dc:creator><comments>https://news.ycombinator.com/item?id=47503848</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47503848</guid></item><item><title><![CDATA[New comment by twic in "iBook Clamshell"]]></title><description><![CDATA[
<p>A wise laptop manufacturer would choose a logo which looks the same both ways up.</p>
]]></description><pubDate>Sun, 22 Mar 2026 16:31:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=47479218</link><dc:creator>twic</dc:creator><comments>https://news.ycombinator.com/item?id=47479218</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47479218</guid></item><item><title><![CDATA[New comment by twic in "A case against currying"]]></title><description><![CDATA[
<p>I think we need to see a few non-contrived examples, because i think in every case where you might take advantage of currying like this, you actually want to make it explicit, as you say.<p>The flip side of your example is that people see a function signature like getClosest, and think it's fine to call it many times with a set and a point, and now you're building a fresh quadtree on each call. Making the staging explicit steers them away from this.</p>
]]></description><pubDate>Sun, 22 Mar 2026 15:46:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=47478725</link><dc:creator>twic</dc:creator><comments>https://news.ycombinator.com/item?id=47478725</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47478725</guid></item><item><title><![CDATA[New comment by twic in "A case against currying"]]></title><description><![CDATA[
<p>I couldn't agree more. Having spent a lot of time with a language with currying like this recently, it seems very obviously a misfeature.<p>1. Looking at a function call, you can't tell if it's returning data, or a function from some unknown number of arguments to data, without carefully examining both its declaration and its call site<p>2. Writing a function call, you can accidentally get a function rather than data if you leave off an argument; coupled with pervasive type inference, this can lead to some really tiresome compiler errors<p>3. Functions which return functions look just like functions which take more arguments and return data (card-carrying functional programmers might argue these are really the same thing, but semantically, they aren't at all - in what sense is make_string_comparator_for_locale "really" a function which takes a locale and a string and returns a function from string to ordering?)<p>3a. Because of point 3, our codebase has a trivial wrapper to put round functions when your function actually returns a function (so make_string_comparator_for_locale has type like Locale -> Function<string -> string -> order>), so now if you actually want to return a function, there's boilerplate at the return and call sites that wouldn't be there in a less 'concise' language!<p>I think programming languages have a tendency to pick up cute features that give you a little dopamine kick when you use them, but that aren't actually good for the health of a substantial codebase. I think academic and hobby languages, and so functional languages, are particularly prone to this. I think implicit currying is one of these features.</p>
]]></description><pubDate>Sun, 22 Mar 2026 15:32:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=47478561</link><dc:creator>twic</dc:creator><comments>https://news.ycombinator.com/item?id=47478561</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47478561</guid></item><item><title><![CDATA[New comment by twic in "A Case Against Currying"]]></title><description><![CDATA[
<p>OCaml has a neat little feature where it elides the parameter and variable name if they're the same:<p><pre><code>  let warn_user ~message = ... (* the ~ makes this a named parameter *)

  let error = "fatal error!!" in
  warn_user ~message:error; (* different names, have to specify both *)

  let message = "fatal error!!" in
  warn_user ~message; (* same names, elided *)
</code></pre>
The elision doesn't always kick in, because sometimes you want the variable to have a different name, but in practice it kicks in a lot, and makes a real difference. In a way, cases when it doesn't kick in are also telling you something, because you're crossing some sort of context boundary where some value is called different things on either side.</p>
]]></description><pubDate>Sun, 22 Mar 2026 15:15:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=47478392</link><dc:creator>twic</dc:creator><comments>https://news.ycombinator.com/item?id=47478392</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47478392</guid></item><item><title><![CDATA[New comment by twic in "A case against currying"]]></title><description><![CDATA[
<p>Even better, this method lets you pipeline into a parameter which isn't the last one:<p><pre><code>  let result = input
    |> add_prefix_and_suffix("They said '", $, "'!")</code></pre></p>
]]></description><pubDate>Sun, 22 Mar 2026 15:08:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=47478315</link><dc:creator>twic</dc:creator><comments>https://news.ycombinator.com/item?id=47478315</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47478315</guid></item><item><title><![CDATA[New comment by twic in "Wired headphone sales are exploding"]]></title><description><![CDATA[
<p>Well, those KZ ZS10 Pro X are still fairly cheap (40 euros), and i really like them. But there is a huge range of amazing value for money earphones out there. You just have to wade through dozens of pages of forum posts and Reddit threads to find them.</p>
]]></description><pubDate>Sat, 14 Mar 2026 19:18:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=47380130</link><dc:creator>twic</dc:creator><comments>https://news.ycombinator.com/item?id=47380130</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47380130</guid></item><item><title><![CDATA[New comment by twic in "Recursive Problems Benefit from Recursive Solutions"]]></title><description><![CDATA[
<p>Right, you could use co-recursion. Or you could just use a queue.</p>
]]></description><pubDate>Sat, 14 Mar 2026 18:44:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=47379764</link><dc:creator>twic</dc:creator><comments>https://news.ycombinator.com/item?id=47379764</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47379764</guid></item><item><title><![CDATA[New comment by twic in "XML is a cheap DSL"]]></title><description><![CDATA[
<p>FWIW you can do a better job with the JSON structure than in the article:<p><pre><code>    {"GreaterOf": [
        {"Value": [0, "Dollar"]},
        {"Subtract": [
            {"Dependency": ["/totalTentativeTax"]},
            {"Dependency": ["/totalNonRefundableCredits"]}
        ]}
    ]}
</code></pre>
Basically, a node is an object with one entry, whose key is the type and whose value is an array. It's a rather S-expressiony approach. if you really don't like using arrays for all the contents, you could always use more normal values at the leaves:<p><pre><code>    {"GreaterOf": [
        {"Value": {"value": 0, "kind": "Dollar"}},
        {"Subtract": {
            "minuend": {"Dependency": "/totalTentativeTax"},
            "subtrahend": {"Dependency": "/totalNonRefundableCredits"}
        }}
    ]}
</code></pre>
It has the nice property that you're always guaranteed to see the type before any of the contents, even if object keys get reordered, so you can do streaming decoding without having to buffer arbitrary amounts of JSON. Probably not important when parsing a tax code, but can be useful for big datasets.</p>
]]></description><pubDate>Sat, 14 Mar 2026 14:56:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=47377326</link><dc:creator>twic</dc:creator><comments>https://news.ycombinator.com/item?id=47377326</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47377326</guid></item><item><title><![CDATA[New comment by twic in "XML Is a Cheap DSL"]]></title><description><![CDATA[
<p>You don't even need to specify a DSL to make that code declarative. It can be real code that's manipulating expression objects instead of numbers (though not in JavaScript, where there's no operator overloading), with the graph of expression objects being the result.</p>
]]></description><pubDate>Sat, 14 Mar 2026 14:41:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=47377190</link><dc:creator>twic</dc:creator><comments>https://news.ycombinator.com/item?id=47377190</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47377190</guid></item><item><title><![CDATA[New comment by twic in "Wired headphone sales are exploding"]]></title><description><![CDATA[
<p>I think you're talking about microphonics:<p><a href="https://zikman.audio/blog/cable-microphonics-what-it-is-and-how-to-minimize-it/" rel="nofollow">https://zikman.audio/blog/cable-microphonics-what-it-is-and-...</a><p>Also sometimes called the stethoscope effect.<p>I think strictly speaking, this isn't actually microphonics, because that means that mechanical noise causes electrical noise, which then results in audible noise, whereas what is happening is just transmission of vibrations up the cable into the ear.<p>Anyway, it can be fixed with better cables. They don't have to be fancy (they don't have to be the 349 euro cables that site is selling!) - i have a pair of KZ ZS10 Pro X earphones, and using the stock cables, i don't get rustling through those.<p>(more generally, i have an embarrassing number of Chi-Fi earphones, and don't get rustling with any of them)</p>
]]></description><pubDate>Sat, 14 Mar 2026 13:16:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=47376382</link><dc:creator>twic</dc:creator><comments>https://news.ycombinator.com/item?id=47376382</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47376382</guid></item><item><title><![CDATA[New comment by twic in "Recursive Problems Benefit from Recursive Solutions"]]></title><description><![CDATA[
<p>> This solution looks extremely similar to the previous one, which is a good thing. Our requirements have experienced a small change (reversing the traversal order) and our solution has responded with a small modification.<p>Now do breadth-first traversal. With the iterative approach, you just replace the stack with a queue. With the recursive approach, you have to make radical changes. You can make either approach look natural and elegant if you pick the right example.</p>
]]></description><pubDate>Sat, 14 Mar 2026 11:57:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=47375752</link><dc:creator>twic</dc:creator><comments>https://news.ycombinator.com/item?id=47375752</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47375752</guid></item><item><title><![CDATA[New comment by twic in "Recursive Problems Benefit from Recursive Solutions"]]></title><description><![CDATA[
<p>> It seems to be common knowledge that any recursive function can be transformed into an iterative function.<p>Huh. Where i work, the main problem is that everyone is hell-bent on transforming every iterative function into a recursive function. If i had a pound for every recursive function called "loop" in the codebase, i could retire.</p>
]]></description><pubDate>Sat, 14 Mar 2026 11:48:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=47375703</link><dc:creator>twic</dc:creator><comments>https://news.ycombinator.com/item?id=47375703</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47375703</guid></item><item><title><![CDATA[New comment by twic in "Digg is gone again"]]></title><description><![CDATA[
<p>Stack Overflow does this and it works far better than arbitrary tyrant style moderation.</p>
]]></description><pubDate>Sat, 14 Mar 2026 11:45:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=47375673</link><dc:creator>twic</dc:creator><comments>https://news.ycombinator.com/item?id=47375673</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47375673</guid></item><item><title><![CDATA[New comment by twic in "What is a database transaction?"]]></title><description><![CDATA[
<p>VoltDB took this to an extreme - the way you interact with it is by sending it some code which does a mix of queries and logic, and it automatically retries the code as many times as necessary if there's a conflict. Because it all happens inside the DBMS, it's transparent and fast. I thought that was really clever.<p>I'm using the past tense here, but VoltDB is still going. I don't think it's as well-known as it deserves to be.</p>
]]></description><pubDate>Sun, 22 Feb 2026 22:33:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=47115488</link><dc:creator>twic</dc:creator><comments>https://news.ycombinator.com/item?id=47115488</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47115488</guid></item><item><title><![CDATA[New comment by twic in "Don't create .gitkeep files, use .gitignore instead (2023)"]]></title><description><![CDATA[
<p>Usually, you can. But occasionally you get mildly defective tools that require some directory to exist, even though it's empty. It's easier to add a gitkeep than fix them.</p>
]]></description><pubDate>Sat, 21 Feb 2026 19:52:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=47104022</link><dc:creator>twic</dc:creator><comments>https://news.ycombinator.com/item?id=47104022</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47104022</guid></item></channel></rss>