<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: wfleming</title><link>https://news.ycombinator.com/user?id=wfleming</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Wed, 15 Apr 2026 09:23:33 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=wfleming" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by wfleming in "Industrial design files for Keychron keyboards and mice"]]></title><description><![CDATA[
<p>Stores, no, but there are meetups of keyboard nerds where people bring a bunch of them. There’s one in NYC run by a former coworker of mine: <a href="https://nyckeyboardmeetup.com/" rel="nofollow">https://nyckeyboardmeetup.com/</a>. Schedule is somewhat sporadic, and unfortunately you just missed the most recent one, but you might enjoy checking out their next event.</p>
]]></description><pubDate>Sat, 11 Apr 2026 02:29:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=47726701</link><dc:creator>wfleming</dc:creator><comments>https://news.ycombinator.com/item?id=47726701</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47726701</guid></item><item><title><![CDATA[New comment by wfleming in "Tell HN: Firefox is being slowly deprecated by the industry"]]></title><description><![CDATA[
<p>I'm with you, but I do think the situation can be characterized differently in a couple important ways:<p>1. IE was the default browser for many users (i.e. anybody using Windows who didn't know better).<p>2. IE had a lot of bugs and and was often non-compliant with standards.<p>Those two things combined meant that supporting IE required additional work, and if you didn't put in that work you were going to get users from IE anyway they'd just get frustrated and confused when things broke. So "detect IE and tell them use something else" was at least a reasonable fixed-cost approach to not having users get totally stuck. (And IE went down to 2-3% at least in part <i>because</i> devs revolted against IE earlier and started serving those "don't use IE" messages when its usage was still higher.)<p>Neither factor is really true of FF. It's not the default for any major platform, its user-base at this point is largely power users who won't be easily confused, and outside of some non-standard APIs most sites don't need and some fairly edge-casey stuff, most sites that work on Chrome will work fine on FF as well without alteration. If anything, IME Safari is more likely to need special attention than FF (but of course Safari has much higher market share so it merits that effort).<p>So I totally get not wanting to spend QA budget on FF, and I could understand  showing a small banner suggesting you use a different browser, but erroring/completely blocking usage of the site does feel excessive to me, and even a bit mean-spirited since it takes extra effort to detect FF to show the message and prevent using the site! I don't think these sites are going out of their way to block usage of other low-usage browsers (some of which can alter behavior that could break some sites even if they are Chromium-based).</p>
]]></description><pubDate>Sat, 28 Mar 2026 04:25:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=47551616</link><dc:creator>wfleming</dc:creator><comments>https://news.ycombinator.com/item?id=47551616</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47551616</guid></item><item><title><![CDATA[New comment by wfleming in "Suicide Linux (2009)"]]></title><description><![CDATA[
<p>There is also a JS pkg with similar behavior: <a href="https://github.com/mattdiamond/fuckitjs" rel="nofollow">https://github.com/mattdiamond/fuckitjs</a></p>
]]></description><pubDate>Mon, 16 Feb 2026 23:39:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=47041831</link><dc:creator>wfleming</dc:creator><comments>https://news.ycombinator.com/item?id=47041831</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47041831</guid></item><item><title><![CDATA[New comment by wfleming in "Toyotas and Terrorists: "Why are ISIS's trucks better than ours?" (2023)"]]></title><description><![CDATA[
<p>For folks who have never seen it, these are the referenced Top Gear segments:<p>- part 1: <a href="https://youtu.be/xnWKz7Cthkk" rel="nofollow">https://youtu.be/xnWKz7Cthkk</a><p>- part 2: <a href="https://youtu.be/xnWKz7Cthkk" rel="nofollow">https://youtu.be/xnWKz7Cthkk</a><p>- part 3: <a href="https://youtu.be/kFnVZXQD5_k" rel="nofollow">https://youtu.be/kFnVZXQD5_k</a></p>
]]></description><pubDate>Tue, 10 Feb 2026 20:24:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=46966324</link><dc:creator>wfleming</dc:creator><comments>https://news.ycombinator.com/item?id=46966324</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46966324</guid></item><item><title><![CDATA[New comment by wfleming in "The state of SIMD in Rust in 2025"]]></title><description><![CDATA[
<p>We’re in very nitpicky terminology weeds here (and I’m not the person you’re replying to), but my understanding is “commutative” is specifically about reordering operands of <i>one</i> binary op (4+3 == 3+4), while “associative” is about reordering a longer chain of the same operation (1+2+3 == 1+3+2).<p>Edit: Wikipedia actually says associativity is definitionally about changing parens[0]. Mostly amounts to the same thing for standard arithmetic operators, but it’s an interesting distinction.<p>[0]: <a href="https://en.wikipedia.org/wiki/Associative_property" rel="nofollow">https://en.wikipedia.org/wiki/Associative_property</a></p>
]]></description><pubDate>Thu, 06 Nov 2025 00:04:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=45829769</link><dc:creator>wfleming</dc:creator><comments>https://news.ycombinator.com/item?id=45829769</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45829769</guid></item><item><title><![CDATA[New comment by wfleming in "OpenAI says over a million people talk to ChatGPT about suicide weekly"]]></title><description><![CDATA[
<p>If a therapist helped 99/100 patients but tacitly encouraged the 100th to commit suicide* they would still lose their license.<p>* ignoring the case of ethical assisted suicide for reasons of terminal illness and such, which doesn’t seem relevant to the case discussed here.</p>
]]></description><pubDate>Tue, 28 Oct 2025 15:01:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=45733745</link><dc:creator>wfleming</dc:creator><comments>https://news.ycombinator.com/item?id=45733745</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45733745</guid></item><item><title><![CDATA[New comment by wfleming in "Pass: Unix Password Manager"]]></title><description><![CDATA[
<p>What kind of mobile functionality were you looking for? The (unofficial) iOS app is pretty good IMHO and integrates with iOS’s OS-level password filling, and also supports the pass-otp plugin’s format for 2fa codes if you use that plugin. There was a decent Android client I used a while back as well, though I don’t recall the name.<p>[1]: <a href="https://apps.apple.com/us/app/pass-password-store/id1205820573">https://apps.apple.com/us/app/pass-password-store/id12058205...</a></p>
]]></description><pubDate>Sun, 14 Sep 2025 02:37:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=45236962</link><dc:creator>wfleming</dc:creator><comments>https://news.ycombinator.com/item?id=45236962</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45236962</guid></item><item><title><![CDATA[New comment by wfleming in "Pig lung transplanted into a human"]]></title><description><![CDATA[
<p>18 days is how long the first human-to-human heart transplant recipient lived post-op. The more recent first pig heart recipient made it two months.</p>
]]></description><pubDate>Sat, 30 Aug 2025 22:43:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=45078623</link><dc:creator>wfleming</dc:creator><comments>https://news.ycombinator.com/item?id=45078623</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45078623</guid></item><item><title><![CDATA[New comment by wfleming in "The Useless UseCallback"]]></title><description><![CDATA[
<p>> Adding non-primitive props you get passed into your component to internal dependency arrays is rarely right, because this component has no control over the referential stability of those props.<p>I think this is wrong? If you memoize a callback with useCallback and that callback uses something from props <i>without</i> putting it in the dependency array, and then the props change & the callback runs, the callback will use the original/stale value from the props and that's almost certainly a bug.<p>They might be trying to say you just shouldn't use useCallback in that situation, but at best it's very confusingly written there because it sure sounds like it's saying using useCallback but omitting a dependency is acceptable.<p>IMHO useCallback is still a good idea in those situations presuming you care about the potential needless re-renders (which for a lot of smaller apps probably aren't really a perf issue, so maybe you don't). If component A renders component B and does not memoize its <i>own</i> callback that it passes to B as a prop, that is A's problem, not B's. Memoization is easy to get wrong by forgetting to memoize one spot which cascades downwards like the screenshots example, but that doesn't mean memoization is never helpful or components shouldn't do their best to optimize for performance.</p>
]]></description><pubDate>Mon, 28 Jul 2025 22:00:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=44716227</link><dc:creator>wfleming</dc:creator><comments>https://news.ycombinator.com/item?id=44716227</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44716227</guid></item><item><title><![CDATA[New comment by wfleming in "Only on Nantucket: The Curious Case of the "Stolen" Mercedes"]]></title><description><![CDATA[
<p>The “stolen” one is a 1991 model according to the article, so not that new (just kept in immaculate condition as the photos show, I was surprised when I saw it was a ‘91), and only 6 years between the two vehicles involved. Given those  ages, it’s not shocking Mercedes was using the same key patterns.</p>
]]></description><pubDate>Sat, 12 Jul 2025 13:41:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=44542004</link><dc:creator>wfleming</dc:creator><comments>https://news.ycombinator.com/item?id=44542004</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44542004</guid></item><item><title><![CDATA[New comment by wfleming in "Jane Street barred from Indian markets as regulator freezes $566M"]]></title><description><![CDATA[
<p>I look forward to the Matt Levine's section on this in tomorrow's Money Stuff.</p>
]]></description><pubDate>Sun, 06 Jul 2025 21:20:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=44484152</link><dc:creator>wfleming</dc:creator><comments>https://news.ycombinator.com/item?id=44484152</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44484152</guid></item><item><title><![CDATA[New comment by wfleming in "No One Is in Charge at the US Copyright Office"]]></title><description><![CDATA[
<p><a href="https://archive.ph/MF378" rel="nofollow">https://archive.ph/MF378</a></p>
]]></description><pubDate>Sat, 28 Jun 2025 18:10:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=44406834</link><dc:creator>wfleming</dc:creator><comments>https://news.ycombinator.com/item?id=44406834</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44406834</guid></item><item><title><![CDATA[New comment by wfleming in "Amazon’s delivery drones are grounded in College Station, Texas"]]></title><description><![CDATA[
<p>I can think of multiple “corner stores” that are the only business within a single-family home residential area within a few minutes drive of the house I grew up in in suburban NY. I’m pretty sure they all got grandfathered in and would not be permitted as new construction with the zoning, but they’ve all been in business since before I was born and are still going. These are mostly neighborhoods without sidewalks, and the stores have parking for only a handful of cars.<p>You’re right that “most” houses can’t be within walking distance of a corner store outside cities, but my anecdata experience is those residential communities can definitely support those businesses. They might require a short drive, but they’re still a lot closer than the shopping center, and a mix of “ran out of one thing”, deli/breakfast sandwiches, and beer keeps them in business.</p>
]]></description><pubDate>Mon, 03 Mar 2025 17:41:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=43244457</link><dc:creator>wfleming</dc:creator><comments>https://news.ycombinator.com/item?id=43244457</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43244457</guid></item><item><title><![CDATA[New comment by wfleming in "The Gambler Who Cracked the Horse-Racing Code (2018)"]]></title><description><![CDATA[
<p>Vlovich is describing the very last race only, where he did place the final bet. He takes her 4k and tells her he’s going to place the bet for her so how much she’ll win is a surprise. The horse he <i>said</i> he would bet on loses the race and then he reveals he <i>actually</i> bet on the winner. So for that race and that race only I do think he just bet on every horse and sleight-of-handed the right ticket to her. Timestamp 35:20 in the video you linked earlier. Right after that he explains how the “trick” worked for all the earlier races, which is what you’re referring to.</p>
]]></description><pubDate>Sun, 29 Dec 2024 19:39:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=42542369</link><dc:creator>wfleming</dc:creator><comments>https://news.ycombinator.com/item?id=42542369</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42542369</guid></item><item><title><![CDATA[New comment by wfleming in "Django and Postgres for the Busy Rails Developer"]]></title><description><![CDATA[
<p>Our Django app was still 1.x when I joined, I’ve gotten us up to 3.2 and hope to be on 4.0 in January. It looks like this was added in 4.1, so this’ll be a nice QOL improvement to look forward to, thanks.</p>
]]></description><pubDate>Thu, 12 Dec 2024 14:18:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=42399295</link><dc:creator>wfleming</dc:creator><comments>https://news.ycombinator.com/item?id=42399295</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42399295</guid></item><item><title><![CDATA[New comment by wfleming in "Django and Postgres for the Busy Rails Developer"]]></title><description><![CDATA[
<p>I believe `makemigrations` builds up its conception of "what the schema is" from the `CreateModel`, `AddField`, `AlterField`, etc. ops in the migrations files. But it doesn't incorporate `RunSQL` ops into building that model of the schema. If my migrations were just a bunch of `RunSQL` ops, I think `makemigrations --dry-run` would basically just see <i>everything</i> from models.py as always needing to be added.<p>This behavior is why `SeparateDatabaseAndState` is a necessary hack in Django: sometimes you need to do an `AlterField` where the SQL Django would generate is really bad, so you need to write your own `RunSQL` to do the right thing, but you also need Django to see the `AlterField` as applied or you'll have problems with future migrations.<p>I suppose I could modify my preference to "run makemigrations and then wrap every single op in SeparateDatabaseAndState", but that does not sound fun :).</p>
]]></description><pubDate>Thu, 12 Dec 2024 04:31:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=42396231</link><dc:creator>wfleming</dc:creator><comments>https://news.ycombinator.com/item?id=42396231</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42396231</guid></item><item><title><![CDATA[New comment by wfleming in "Django and Postgres for the Busy Rails Developer"]]></title><description><![CDATA[
<p>I prefer null as a clear “no value” marker to handle rather than special-casing handling of an empty string vs other strings, and if “empty string” isn’t considered valid that should be validation logic and that should never get stored in the database. But it’s certainly a matter of opinion and either can work as long as you’re consistent.<p>The point about Django’s choices about default and not-null though is that it can easily lead to crashes while you’re adding fields. If you add a string field with default=“” and don’t specify null=False, the generated schema will be a non-null field without a default value in SQL, but Django will backfill “” into all existing rows. To avoid downtime, you need to deploy migrations & apply them, then deploy the models.py/other code changes. But if anyone tries to write a new row before the new code finishes deploying after applying the migration, it will crash.</p>
]]></description><pubDate>Wed, 11 Dec 2024 20:58:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=42392892</link><dc:creator>wfleming</dc:creator><comments>https://news.ycombinator.com/item?id=42392892</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42392892</guid></item><item><title><![CDATA[New comment by wfleming in "Django and Postgres for the Busy Rails Developer"]]></title><description><![CDATA[
<p>> Migrations in Django
> 
> The Django approach has noteworthy differences and a slightly different workflow<p>My explanation of Django's approach to migrations would involve a lot more expletives. It is by far my least favorite thing about the framework.<p>- Fields are not-null by default, the opposite of SQL itself<p>- Field declarations use argument names that <i>sound</i> like the SQL equivalents (default, on delete cascade/restrict), but they're fully enforced in python and don't make it into the SQL schema at all by default. I get that not every DB supports these features, and there are sometimes good reasons for doing something like a delete cascade in process (if you need to implement custom on-delete logic or something), but the DSL shouldn't read like SQL if it's not going to change the SQL schema. The default value thing combined with not-null by default is particularly easy to get bitten by adding a new field with default if you deploy migrations separately from deploying code (which you must do to avoid downtime): if you add a new field with a default value believing it's safe, you will probably get crashes in the interval between applying the migration & the new code deploying because you've got not-null column without a default value in the schema. They did finally add db_default recently, thankfully, but it took years!<p>- Django migrations cannot be understood in isolation, the sql a generated migration containing something like an AlterField operation will run depends on what <i>earlier</i> migrations say. You have to check with the sqlmigrate command and/or actually read earlier migrations to be sure you understand what the migration will do. Compared to Rails, where each migration can be read and understood in isolation (though you may still need to understand how a Rails migration DSL will translate to actual SQL of course). This also has a performance impact making Django migrations slower because Django has an in-memory model of what the schema should be at each migration point, so running a migration is not just "load the file and run the commands", it's "determine the schema that should exist after running this migration, diff that with the schema we think exists before this point, magically generate SQL for that diff, then run that".<p>- The makemigrations command to auto-generate pending migrations is very aggressive and will detect things as "changed" that don't impact the schema. If you changed some help text on a field, or a localization string, or the aforementioned only-in-python default value, makemigrations will see that as requiring a migration that does nothing. Leads to lots of cruft.<p>- Related to both of the above points, AlterField's auto-generated SQL can be dangerous and bad. Particularly, I've seen cases where very minor changes to a ForeignKey (like changing from nullable to not-nullable, or even not-schema-impacting changes like above) would, by default, have dropped the foreign key constraint & index, and then re-created them. Completely unnecessary and potentially dangerous since it could be locking a large table. I'm not positive, but in some cases I think these have been generated purely because of a django upgrade leading to it deciding the names of the indexes/constraints need to be changed for some reason.<p>- AlterField will <i>also</i> tend to stomp all over any tweaks you manually made to the schema to work around all these issues. If you manually wrote a SQL statement in an earlier migration to add a default value to a column, and then that column's definition gets tweaked months or years later the generated AlterField is gonna remove your default value. At a technical level this isn't surprising when you understand how Django is modeling the schema internally & generating the SQL changes, but it's definitely a bad user experience downstream of a lot of these design decisions.<p>Generally the field declaration/migrations system in Django feels to me designed to lead people down a garden path towards bad and dangerous behavior. If I had my druthers I'd enforce a policy in our Django app of "never run makemigrations, all migrations must be manually written SQL".</p>
]]></description><pubDate>Wed, 11 Dec 2024 18:30:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=42391048</link><dc:creator>wfleming</dc:creator><comments>https://news.ycombinator.com/item?id=42391048</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42391048</guid></item><item><title><![CDATA[New comment by wfleming in "Show HN: Tinder, but to Decide What to Eat"]]></title><description><![CDATA[
<p>The trouble is the justification of a subscription is evaluated differently by businesses and customers, and both perspectives are rational. If you’ve got servers to pay for, subscriptions are a very appealing model since it makes the “is this business sustainable” math very easy (and less charitably lots of businesses are after that sweet sweet subscription revenue because it tends to be sticky). As a customer, I think it’s also very reasonable to get annoyed that “everything is becoming a subscription” and say “why would I pay this much for something I might need once in a blue moon.”</p>
]]></description><pubDate>Sun, 03 Nov 2024 23:55:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=42037147</link><dc:creator>wfleming</dc:creator><comments>https://news.ycombinator.com/item?id=42037147</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42037147</guid></item><item><title><![CDATA[New comment by wfleming in "Bankrupt Trucker Yellow Loses Ruling over $6.5B in Pension Debts"]]></title><description><![CDATA[
<p>It seems appropriate that a company's <i>own</i> pensions should be senior claims over shareholders which might indirectly be responsible for part of other pensions or retirement funds somewhere down the line.</p>
]]></description><pubDate>Wed, 18 Sep 2024 17:05:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=41582512</link><dc:creator>wfleming</dc:creator><comments>https://news.ycombinator.com/item?id=41582512</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41582512</guid></item></channel></rss>