RE: https://famichiki.jp/@Haikyoneko/117484910584591920
There is a reasonable chance Vidarr is the prettiest cat in the Fediverse. Such a pretty little face and long floofy fur.
I might be wrong though, so please feel free to post counterexamples.
RE: https://famichiki.jp/@Haikyoneko/117484910584591920
There is a reasonable chance Vidarr is the prettiest cat in the Fediverse. Such a pretty little face and long floofy fur.
I might be wrong though, so please feel free to post counterexamples.
I have had a lot of discussions over the last decade on correct handling for out-of-memory conditions. There are two very distinct philosophical camps.
The Windows kernel has a policy of 'don't make promises you can't keep'. This means that a call to malloc will either return memory that is already available or the result of a new call to VirtualAlloc2, with committed memory. When the NT kernel says it has 'committed' memory, it means it promises that memory will be available when you try to access it. There is space reserved either in RAM or in swap to permit something else to be moved from RAM to make space for the thing that you need.
The other extreme says that you should assume that sometimes components fail. Erlang embodies this as the 'let it crash' philosophy. Google discovered fairly early on that, when you're looking at jobs distributed across large fleets of machines, a single node experiencing hardware failure is basically unavoidable. Mainframes deal with this by duplicating all of the hardware (often multiple times) so a hardware failure can be transparently worked around. But clouds built from consumer hardware don't do that: sometimes VMs die and you deal with it.
In the 'let it crash' model, you already need to build resilience at a higher level. Your individual jobs may fail because the hardware that runs on them fails. You need to be able to roll back any partially committed transactions that they started and restart them from the beginning. For things like web servers, that's usually easy: This HTTP request failed? The client can retry.
Once you have that mechanism, you rapidly realise that you can use it for other infrequent operations. Memory allocation almost never fails. If it does, let the program crash. Systems like iOS and macOS encourage programs to persist any user-visible state frequently, so a program crashing is fine - you may lose a couple of seconds work. In exchange for this, you get much simpler code. Rather than every allocation having to come with error handling (and there are tens of thousands of individual allocation points in a typical non-trivial program), you just assume it works and crash if it failed.
Some kernels, such as Linux and FreeBSD, lean into this even further. If the kernel claims it's given you memory, that isn't a promise, it's a best-effort guarantee. When you actually use it, they'll either ensure it's there or deliver a signal. It turns out most programs ask for memory that they'll need in their worst case, but this mechanism gives them the memory that they actually need. And this means that fewer allocations fail. You can't easily handle the allocation failure locally, but you're now less likely to hit allocation failure.
And this is a big win for overall reliability and performance. Because it turns out that gracefully handling out-of-memory conditions is really hard. Often, good error recovery requires allocating memory, but you can't do that if you've hit an out-of-memory condition. And these errors propagate outwards. Every function that allocates memory not may fail due to memory exhaustion. So it's not just routines that allocate memory that need to handle out-of-memory errors, it's everything that calls them. And you have to get it right at every place that needs to do any kind of cleanup if memory is exhausted.
This is one of the biggest reasons that embedded development is harder than application development: you can't assume memory exhaustion is rare and you don't always have an outer layer that can handle component-level failures. But in every other situation, the correct approach is to assume that memory is infinite and allocations never fail, and to assume that the component making that assumption will crash periodically.
This is a post about PHP.
The thing I'd really like to see is the time between the PHP fix being released and the binary packages being available to install across different operating systems and distributions.
EDIT: In the absence of anything more formal, post below when your favourite platform gets the update! Boost for visibility!
Any #FreeBSD folks using vm-bhyve with NAT? It appears that the built-in support was removed in 2016 and never reintroduced. It's not clear to me how to set up the NAT between the bridged interface that vm-bhyve creates and the host network interface. I've found a bunch of articles that claim to cover this and either use the command that hasn't existed for 10 years or skip over network configuration.
#ZFS folks:
I have a dataset.
When I do zfs list -t snapshot -o space {dataset}, I get a list of a small number of snapshots that add up to about 50G in their USED column.
When I do zfs list -o space {dataset}, it says 1.45T in the USEDSNAP column.
How do I find out which snapshots are actually using this space?
I’ve been trying something recently on platforms that support emoji reactions for countering trolls: using Poe’s Law against them.
Poe’s Law says that, without clear expression of intent, extreme views and satire of those views are indistinguishable. But reaction emoji let other people provide a hint about that intent.
When someone writes a rage-bait troll, they want engagement. If you reply, they’re happy. If you put a thumb-down or angry-face reaction, they’re less happy but they know they’ve got to you.
But what happens if you do a laughing-face emoji? Minimal engagement (one or two clicks) and they haven’t upset you.
And then the next person seeing the post sees it framed by the laughing reaction. So their reaction is likely to be ‘oh, I guess this is meant as satire’ and they either add a laughing reaction or they just decide it’s satire in poor taste and ignore it. And no one engages in the comments because they’ve seen the laugh reactions and don’t take the post seriously.
And, after a while, the trolls get bored and go somewhere else.
I’m quite surprised at how well this works.
One of the patterns I’ve seen with people using Claude for programming is:
A programmer in the past looked at a tradeoff space and decided to make a common operation fast and an uncommon operation slow.
Claude lacks proper context of the use of the software but spots a pattern that looks like things it’s training set has flagged as slow and so points to the slow path as a bottleneck.
The user asks for a test case and Claude provides a simple microbenchmark that triggers the slow path.
Now that it’s confirmed as slow, the user asks a ‘agentic’ harness to explore the design space and optimise for the benchmark. The swarm of Claude instances makes plausible changes to the code and reports back with a modified version that passes the test suite and improves the microbenchmark.
The test suite doesn’t exhaustively cover all possible race conditions and so the new version may include subtle concurrency bugs. It also probably makes the common case slower and so is a regression overall.
I don’t know if other LLMs encourage this flow, but I’ve seen it several times from people using Claude.
I suspect Linus’ recent embarrassing interaction with his kernel’s virtual memory code may have been an example of this pattern. It’s very easy to do with an LLM because each step appears to be a demonstrable improvement. It comes with an objective benchmark, it passes all of the tests. Unfortunately, software often depends on a load of extrinsic knowledge that the LLM is trying to infer from a load of likely misleading data points.
RE: https://mastodon.world/@Captain_Jack_Sparrow/117452220340776725
It looks like Anthropic is learning that, when you spend years publishing nonsense ‘annualised’ revenue figures[1], showing growth becomes increasing hard. And it’s unfortunate when this happens just before IPO.
[1] Pick some day/week/month when you had a lot of revenue, scale it up as if you got that revenue for each time period in a year.
Wow, SwiftUI and all of the competent designers retiring has made #Apple so bad at UIs. I helped my mother set up a MacBook Air yesterday. We set the UI size to the maximum so she could see it easily. Around half of the setup boxes then had buttons that were either off the bottom of the screen or obscured by the dock (and therefore not clickable).
Almost all of them had huge amounts of empty space in the middle and so could easily have fitted if some idiots private aesthetic had been considered less important than accessibility at Apple.
All of them were either modal or app-modal (hey, Apple folks: you might like to read your own Human Interface Guidelines, they explain in detail why this is stupid). You couldn’t progress or go back until you’d hit the button that was off the screen and, because some were system-wide global, you couldn’t go to settings and change UI size without killing the thing that produced the box.
All completely preventable if anyone in QA had bothered to try the first-time setup flow on an Apple device using each of the five UI-size options.
Oh, honourable mention for #Microsoft if you install Word or Excel, the first launch window is a massive thing (which, at least, can be scrolled, unlike the Apple ones) giving you a bunch of options to buy an M356 subscription. There is no option anywhere in that window for logging in with your existing subscription. There is an option in the app menu, but it’s greyed out. If you close this window, the app exits. In your next release testing, try asking someone on your team to figure out how to log in from a fresh install. I eventually figured out the flow, but I was very close to the point of saying ‘let’s just put LibreOffice, Pages, and Numbers on this and not bother with the M365 stuff’. And I have a PhD in computer science and worked at Microsoft for five years: how do you think a vaguely normal human will do?
I just fixed a bug where someone had sent an LLM-generated fix. At first glance, the LLM fix was mostly right, except for a redundant atomic fence (LLMs seem to love __atomic_thread_fence in this codebase, no idea why).
But then I went to fix the bug. The problem was that a lock was initialised too late and so could end up being initialised twice. Ooops, locks are not meant to introduce concurrency problems!
And the LLM fix moved it earlier, so that's fine.
Except... there's another way that the object containing the lock might be reached via a global pointer and that didn't have any guards. I don't think it's possible to trigger the bug that way, but some of the future changes that I'd considered might introduce that as a path.
And there's no real reason for anyone to want the object without the initialised lock, so moving the initialisation to just before the point where any other thread might reach the object is a simple fix.
But that isn't what the LLM proposed. Instead, it fixed the immediate issue without any reference to the long-term impact and maintainability of the codebase.
My fix was a fairly simple change: one new line of code, four new lines of comment, and six deleted lines of code (so worth doing for code readability even if the bug hadn't been real). And even a change that small, if you accepted the LLM recommendation (three new lines of code, no new comments, and six deleted lines), would have made the code less maintainable and more subtly broken.
And that's why I refer to these things as Technical Debt as a Service.
Wow, the bugginess of Dune Awakening is amazing. Finished the last (maybe? The story doesn’t conclude but the Internet suggests it’s the last?) story mission and I’m teleported back from Arrakeen to the main game map. Only the Ornithopter I used to fly to Arrakeen is gone. The one I had just collected everything I needed to build and had flown for the first time to start this quest.
When I search for this bug, I find a Steam thread reporting it from June. 2025. So it’s been a known bug for over a year and the developers still can’t be bothered to fix it.
Oh, and the most recent autosave was an hour ago, back before I started the long story mission. Apparently the work around is to hire someone else to fly you to the final bit of the mission. Ugh.
The game is full of things like this. Sometimes when you arrive at Arrakeen, you spawn below the floor and fall forever. There are a bunch of places you can fall through the map, including one that you will encounter every time that you try to go around the back of the cultist’s area.
If this were a game that had just been released, I might cut it some slack, but though the console port is new, all of these bugs appear to have been there since the start. They’ve had a year to fix them and just haven’t bothered.
Oh, and there’s no pause button, which is just rude. I guess it’s aimed mostly at multiplayer, but there’s just no attention to detail.
They also made a weird choice to base a load of plot elements on the awful prequel books. Casual Dune fans will know about Dune mostly from the films and so won’t know any of this nonsense. Almost everyone who read the books loathes the prequels. So the only people who will understand the context will hate it.
RE: https://mastodon.sdf.org/@netbsd/117396625341557692
Hey #FreeBSD folks, NetBSD hit more than double their funding target after adopting a strong no-LLMs policy. Something to think about while you draft yours, perhaps?
I really hate the access control on Fediverse quote posts. If you have a public post and you opt out of quotes, the following are possible:
The following are not possible:
For private and follower-only posts, controls over quoting should be limited to options that extend the permitted access (for example: my followers can post this follower-only post as a follower-only quote post and then the transitive closure of my followers will be granted access). The current model added a load of code churn to ActivityPub implementations with zero benefit.
Yesterday I filled up the 2 TB disk on my laptop. While looking for things to delete, I discovered that, last year, when I’d been debugging mail server issues, Mail.app had created a log file that was over 100 GiB. And then just left it there. Nothing in the UI to tell me it was enormous. Nothing to say ‘you created this a few months ago, do you still need it?’ And this was deep inside a directory structure that users aren’t supposed to look at.
When the kittens were small, I thought my fist was roughly cat-head sized and shaped and so might be easier for them to relate to than an entire human, so I’d hold out my fist for them to investigate and get comfortable with. And it worked. Except friendlykitten has developed a habit of not just sniffing it but full-on headbutting my finger with his nose. Walks up, sniffs fist, hits closest finger as hard as he can with his nose, then consents to scritches. This cannot be good for his nose.
He’s also basically full cat sized now. I might have to stop calling him a kitten.
One of our SaaS providers sent out a marketing email to all of their customers about new AI features. I replied saying that we used them as a secure solution and integrating things that add no value for our use case but add significant attack surface undermines our trust in their product and will cause us to consider alternatives.
It turns out that the reply-to header was the CEO’s email address and I initially got an out-of-office auto responder then a worried reply saying that of course the AI nonsense that they’d been talking about would be opt in and would not be given access to anything without explicit consent.
But now their CEO has one data point that jumping on the bandwagon will lose sales.
I’d recommend doing the same for any such marketing emails you get. The replies may go to /dev/null, but normally they have a ‘contact sales’ link. The more replies they get saying that incorporating ‘AI’ features undermines your trust in their product and makes you less likely to buy even the non-‘AI’ versions, the more they’ll consider these things high risk to ship.
Relative to my age the Fediverse is full of...
Ah, apparently it is the time of the year when we identify and honour the best self publicists among hundreds of people who contributed to scientific discoveries.
The Digital Markets Act is a nice idea but it's ignoring how these platforms became so powerful. The problem is that other big entities use them as their sole (or primary) means of communication.
How about defining a set of rules that apply to:
Where the rules are, by the end of 2027:
Where 'independent' means: does not depend on any approvals from the same vendor.
This would mean that no big organisation in these places would be able to ship apps via the Apple App Store. None of them would be able to ship Android apps that depended on Google Play Services and none of them would be able to ship Android apps at all with Google's proposed lock down mechanism.
And then, suddenly, you have compliance departments in a bunch of companies with deep pockets lobbying Google and Apple to provide an alternative mechanism for distribution.
Note: These are exactly the same as the rules I proposed 20 years ago. If they had been enacted back then, I suspect the DMA would not have been necessary.
RE: https://fosstodon.org/@TomSeppert/117387085601828071
This is basically me. Fortunately, I married someone who will distract the human while I talk to their dog.