[syndicated profile] flak_feed

I haven’t had much use for Windows for a while, but I like to keep abreast of whatever fuckery Redmond has in store for everyone else. I picked up a new laptop with the dreaded Copilot key, and thus had to figure out how to make it useful. And along the way, found a bunch of other settings to adjust. The plan is that I won’t need any of this knowledge until it becomes obsolete, but the only way to ensure that outcome is to write it all down; thus by being available it will never be necessary.

copilot key

First up we have the Copilot key which has eaten the right control key. Turns out I use the right control key a lot. Actually, having the key taken away led me to observe my typing habits more closely. I use opposite side shift keys (left shift and L, right shift and A) but same side control (left control A and right control L). Thank you keyboard for affording me this opportunity for self reflection, but now I’d like control back.

The obvious thing to do is to search the internet. Unfortunately, we’re in a war against Big Basilisk and conscientious objectors have flooded the forums with resistance. (I’m trying to put a positive spin on things.) Do not believe the lies about using PowerToys to remap the key. It doesn’t work. Also, the next version of Windows will not include a setting to change it either, at least not to anything useful.

What does work is installing PowerToys and creating a new keyboard shortcut. This is actually pretty straightforward once you know the possibilty exists and to not waste time on a keymap. It comes with some caveats, though.

Sometimes PowerToys crashes and then the shortcut disappears. Quality. In more than twenty years of using xmodmap to map the windows key to something useful, it has not once ever forgotten its mapping.

Apparently because the Copilot key is some weird ctrl shift F23 hybrid, the shortcut doesn’t always play nice if you also press shift. This primarily seems to affect WSL. Pressing copilot tab would advance tabs in my terminal. Pressing shift copilot tab to move back would return to the previous tab, but also leave the shift key stuck down, CAPSLOCK style. It was weeks of frustration until I figured out it depends on the precise order I chord the keys. If I lift copilot first, then lifting shift generates the proper event. If I lift shift first, somehow the key up event gets lost.

wsl

To make the system a little more useful, I installed WSL. Find a buntu in the store, click install, click run. This creates a little terminal window that says it needs to install WSL. Okay, let that go. But the ubuntu window still says it can’t run. Whatever the WSL installer does, it doesn’t actually install the WSL Windows feature. You still have to go into control panel to add Windows features, and check WSL. It’s literally one line of powershell, but the installer can’t run it.

At some point since I last used WSL, I believe they changed the virtual framebuffer size. It’s only half the resolution of my screen, and scaled up with blocky pixel doubling. Apparently, somebody ran their linux app and it was too tiny, so instead of telling them to fix their config, the WSL team just force scaled the framebuffer. So now I, who know how to set an appropriate scale for applications, am forced to look at grotesque aliasing until I get frustrated enough to find the secret WSL settings.

[system-distro-env]
WESTON_RDP_HI_DPI_SCALING=false
WESTON_RDP_FRACTIONAL_HI_DPI_SCALING=false
WESTON_RDP_DEBUG_DESKTOP_SCALING_FACTOR=100

That goes into a %HOME%/.wslgconfig. Note that the filename has an extra G; it is not the .wslconfig file that already exists. (Also make sure you don’t accidentally create a .wslgconfig.txt file.)

Drawing to the front buffer in an OpenGL program doesn’t work. To avoid unnecessary buffer swapping, I will draw to just the front buffer. The WSL virtgl or whatever doesn’t appear to notice this and fails to update the display. Have to use full double buffering for everything.

I think vsync is broken. If you want a serene frame rate, you have to insert your own pauses.

I could not figure out how to set the keyboard repeat rate. Nothing I changed would slow it down. I like to set it just right for me to hold j and scroll through a file while reading. Fortunately, I own the terminal and was able to insert my own key repeat rate limiter.

edge

Figured I should use edge and bing while we’re here to see what’s what.

Go to Settings > System > Show tabs from apps if you want alt tab to be useful.

The setting to disable saving passwords is buried in the wallet settings.

Need to disable elastic overscroll in edge flags or pages bounce around wildly. I’m fortunate to have fairly good fine motor control, but I still can’t execute a two finger vertical scroll with zero horizontal movement. Somebody on the edge team decided to interpret this to mean I want the content to vibrate back and forth as well. No thanks. There are remnants of forum posts talking about scrolling personality, but that option has been removed.

Edge has a feature called efficiency mode. The help says the settings are balanced or maximum, but the status indicators says it’s currently moderate.

misc

Pleased to report sticky keys appears off by default, and I’m no longer hounded by beeps after tapping the shift key a few times.

Pleased to report there is finally a setting to reverse mouse wheel scroll direction without installing a vendor app per mouse.

Failed search: how to disable wifi when sleeping. Microsoft may have figured out how to do low power always connected not really sleeping mode without draining the laptop battery, but it’s murder on my phone battery. They’ve finally invented an iPhone killer that works. The only way to get it to disconnect is to disable tethering on the phone.

Touchpad settings: Three finger gesture: tap -> middle click. Four fingers -> nothing or it opens notifications. Took me a week of the notifications panel popping open randomly before I was able to figure this out.

If the weather app is wide enough to display three panels, it shows a bunch of ads, but they are hidden if it’s only two panels wide.

Turn off all audio enhancements in system > sound > speakers. Sounds like constant crackling static. This only affects some programs, so I’m speculating it has something to do with buffer sizes and consuming data faster than the program expects. No idea really.

Now that we’ve installed PowerToys, turn off the mouse finder or it will draw weird circles when you press control.

Stopping OneDrive backup ate my endless legend saves. Dozens of hours of progress lost, like tears in the rain. I read the prompt pretty carefully, and I was fairly sure that I was only turning off backups, but apparently doing so causes the system to delete everything in the documents folder. So make sure you get to that early, before you have anything to lose.

Find Windows compatibility telemetry in task manager. Kill it before it kills your CPU.

Renaming something pinned in the start menu is not at all obvious. The right click open file location takes you to the folder in the start menu hierarchy, where you can rename the shortcut. I didn’t click it at first because I thought it would open the application folder.

Window now has an attention feature, where it’s always watching and will lock the screen if you walk away. I guess this could be useful if you struggle to press win L. The implementation isn’t great. In particular, the option to dim the screen when you look away doesn’t restore the screen when you look back. I’m always looking around, so this was pretty annoying.

Unboxing a new computer still requires hours of updates and reboots. And this is after the hour long first time setup. The initial setup took forever because whatever it was downloading stalled many times. I can see on my router that no packets were flowing, then it would download a little more, then stall, then trickle in some more.

The worst part is I turn on performance mode so that the never ending updates will finish before I turn into a pumpkin, and then Windows hounds me with popups about wasting electricity. The cherry on top is the little notice that Windows Update is dedicated to reducing carbon footprint by using green power. Maybe we could try just using less power? I’m pretty sure half the power consumption of this system has come from installing updates.

I was typing up the first draft of these notes in OneNote. At some point I installed Visual Studio and the color scheme in OneNote changed. Great.

Copilot itself

Figured since they’ve gone to all the trouble to take over my keyboard, I should at least try out this miracle software. I gave it a very serious business task of helping me OCR a sign I saw at a business. This is real work, right?

Without prompting, it offers up its own commentary on the sign. Then when I ask what the sign says, copilot has forgotten how to read. How can something this dumb help you with your job? What is your job?

Can’t wait until I get the Recall update.

[syndicated profile] bruce_schneier_feed

Posted by Bruce Schneier

Interesting research: “Guillotine: Hypervisors for Isolating Malicious AIs.”

Abstract:As AI models become more embedded in critical sectors like finance, healthcare, and the military, their inscrutable behavior poses ever-greater risks to society. To mitigate this risk, we propose Guillotine, a hypervisor architecture for sandboxing powerful AI models—models that, by accident or malice, can generate existential threats to humanity. Although Guillotine borrows some well-known virtualization techniques, Guillotine must also introduce fundamentally new isolation mechanisms to handle the unique threat model posed by existential-risk AIs. For example, a rogue AI may try to introspect upon hypervisor software or the underlying hardware substrate to enable later subversion of that control plane; thus, a Guillotine hypervisor requires careful co-design of the hypervisor software and the CPUs, RAM, NIC, and storage devices that support the hypervisor software, to thwart side channel leakage and more generally eliminate mechanisms for AI to exploit reflection-based vulnerabilities. Beyond such isolation at the software, network, and microarchitectural layers, a Guillotine hypervisor must also provide physical fail-safes more commonly associated with nuclear power plants, avionic platforms, and other types of mission critical systems. Physical fail-safes, e.g., involving electromechanical disconnection of network cables, or the flooding of a datacenter which holds a rogue AI, provide defense in depth if software, network, and microarchitectural isolation is compromised and a rogue AI must be temporarily shut down or permanently destroyed.

The basic idea is that many of the AI safety policies proposed by the AI community lack robust technical enforcement mechanisms. The worry is that, as models get smarter, they will be able to avoid those safety policies. The paper proposes a set technical enforcement mechanisms that could work against these malicious AIs.

[syndicated profile] metafilter_feed

Posted by rory

Googling a made-up phrase and appending "meaning" delivers confident wrongness from Google AI [Bluesky thread]. You can't lick a badger twice, but if you stare at the sea you'll eat your beans.

My personal favourite:
The saying "Never eat a pink Weetabix" is a mnemonic device used to remember the compass directions. It stands for North, East, East, Terrible (as a way to make it easier to remember) bix, and Bix is for South West. It's a common way to help students remember the compass directions.
Could this be what finally gets through to people that they can't trust the "facts" spouted by LLMs? Probably not. You can't make a nun do somersaults, and you can't catch a mosquito with your left hand.
[syndicated profile] the_daily_wtf_feed

Posted by Remy Porter

It takes a lot of time and effort to build a code base that exceeds 100kloc. Rome wasn't built in a day; it just burned down in one.

Liza was working in a Python shop. They had a mildly successful product that ran on Linux. The sales team wanted better sales software to help them out, and instead of buying something off the shelf, they hired a C# developer to make something entirely custom.

Within a few months, that developer had produced a codebase of 320kloc I say "produced" and not "wrote" because who knows how much of it was copy/pasted, stolen from Stack Overflow, or otherwise not the developer's own work.

You have to wonder, how do you get such a large codebase so quickly?

private String getDatum()
{
    DateTime datum = new DateTime();
    datum = DateTime.Now;
    return datum.ToShortDateString();
}

public int getTag()
{
    int tag;
    DateTime datum = new DateTime();
    datum = DateTime.Today;
    tag = datum.Day;
    return tag;
}

private int getMonat()
{
    int monat;
    DateTime datum = new DateTime();
    datum = DateTime.Today;
    monat = datum.Month;
    return monat;
}

private int getJahr()
{
    int monat;
    DateTime datum = new DateTime();
    datum = DateTime.Today;
    monat = datum.Year;
    return monat;
}

private int getStunde()
{
    int monat;
    DateTime datum = new DateTime();
    datum = DateTime.Now;
    monat = datum.Hour;
    return monat;
}

private int getMinute()
{
    int monat;
    DateTime datum = new DateTime();
    datum = DateTime.Now;
    monat = datum.Minute;
    return monat;
}

Instead of our traditional "bad date handling code" which eschews the built-in libraries, this just wraps the built in libraries with a less useful set of wrappers. Each of these could be replaced with some version of DateTime.Now.Minute.

You'll notice that most of the methods are private, but one is public. That seems strange, doesn't it? Well this set of methods was pulled from one random class which implements them in the codebase, but many classes have these methods copy/pasted in. At some point, the developer realized that duplicating that much code was a bad idea, and started marking them as public, so that you could just call them as needed. Note, said developer never learned to use the keyword static, so you end up calling the method on whatever random instance of whatever random class you happen to have handy. The idea of putting it into a common base class, or dedicated date-time utility class never occurred to the developer, but I guess that's because they were already part of a dedicated date-time utility class.

[Advertisement] BuildMaster allows you to create a self-service release management platform that allows different teams to manage their applications. Explore how!
[syndicated profile] metafilter_feed

Posted by subdee

DOGE Just Took Over National Parks Elon Musk and his evil minions just achieved a coup at the Department of the Interior, taking over control of National Parks, and other public lands

Secretary of the Interior Doug Burgum just issued an order ceding oversight of the Department of the Interior to the so-called Department of Government Efficiency (which is not a government department at all), and handing to it total authority over DOI's workforce and budget. DOI manages the National Park Service, the Bureau of Land Management, the U.S. Fish and Wildlife Service, Bureau of Indian Affairs and more. Its operations cover 20 percent of the nation's total land area. Happy Earth Day, everyone.

Side eye

2025-04-23 07:48
[syndicated profile] metafilter_feed

Posted by chavenet

If you use language at all, you belong in what we might call the Lethem Sea (in the spirit of the idea of the Dirac Sea in physics). Your "original" thoughts, ideas, and creations, in a very deep sense, aren't, in the sense that copyright-obsessed industrial modernity understands originality, attribution, provenance, and credit. They are original in the sense that you bring something of your individual lived uniqueness to how you transform what you suck up from the Lethem sea, and regurgitate into it. You're "original" in the sense a drop of water thrown up waves on the surface of the sea is "original." from The Ecstasy of Deep Influence by Venkatesh Rao
[syndicated profile] ianwelsh_feed
Fiscal Failure & The French Revolution

(Post by Bruce Wilder, Elevated from the Comments)

The French Revolution is in many ways, it is the prime historical example of state failure related to fiscal failure (the inability to tax the rich in particular) leading to revolution (and post-revolution, to the unleashing of state capacity in Napoleonic empire building)

Ancien Régime France at the end of the 18th century had an underdeveloped financial sector, was overpopulated relative to its agricultural productivity, had lost a big chunk of its colonial empire and despite the theoretical advantages of its 17th century legacy of centralizing absolutism, was a litigious society of particularism, privilege, and resentment.

The crisis when it came found many fissures in the fiscal firmament of the state. The privileged often enjoyed exemptions from certain taxes, sometimes purchased with office by some ancestor. The collection of certain taxes was in private hands. At the time of the revolution, an extensive wall around Paris was being built by a consortium of private “tax farmers” expecting to grow rich on their role in colltecting such taxes. So, it wasn’t just that the rich and powerful avoided paying taxes, key figures were also skimming from the tax revenue collected.

The expedients of a fiat money and a central bank had been tainted fatally by John Law and the Mississippi Bubble. The Paris financial sector was entirely in the hands of Swiss and Dutch bankers and speculators. One of these, Necker, followed in the tradition of Colbert, and was quite popular in part because he created a system of State pawn shops, which relieved some of the inconvenience.

The political parallels and contrasts with the UK were stark. The UK had had its own South Sea Bubble at the same time as the Mississippi Bubble, but in the UK, the South Seas Company was folded into the Bank of England and the national debt was serviced ever after at a “risk-free” rate, a floor for other rates. The French Treasury paid rates to the Dutch and Swiss bankers that reflected the increasing risk of default. State finances in France were obscure. Necker would publish the first accounts in what historians now regard as a propaganda exercise. Once the French state was borrowing to meet its obligations to repay earlier loans, it almost didn’t matter how tax revenues were trending, because the debt began to compound and the servicing cost was escalating.

The UK had used its fiscal capacity and central bank to outspend France in a series of wars beginning at the end of the 17th century. There had been a pause, but the rivalry had resumed, culminating in the Seven Years’ War, with Britain subsidizing its continental ally, Prussia.

The inability of the UK to tax their 13 American colonies to finance the war debt caused the American Revolution before the French Revolution. And the example taught the French.

The UK had experienced an agricultural revolution of sorts in the late 17th and early 18th century as Adam Smith’s “improving landlords” began very fine calculations on the advantages of Jethro Tull’s inventions, turnips and forage in crop rotation and the profit from further enclosing the commons, a process underway since the Tudors. The gains in land and labor productivity were small but significant and fed a growing urban population. The population of England nearly doubled in the course of the 18th century.

France was not so fortunate. French agriculture was notoriously backward and resisted the promotional efforts of royal reformers and intendants. Feudal dues were collected in large areas by the church or impoverished nobles with no power to manage or improve the properties.

The nascent “business cycle” of 18th century France was an agrarian cycle of boom and famine: a good harvest could feed an expansion of mercantile and artisanal sectors. A famine would drive France into a business depression. The Physiocrats observed the pattern and made a theory out of it. And, from the Physiocrats came the liberalism of Turgot.

The same Dutch and Swiss bankers took liberalism and fashioned an argument for a laissez faire response to famine: let the price of grain be what the market will bear. Very appealing argument to grain speculators financed by Dutch and Swiss bankers.

Failing to control the price of bread or the distribution of grain stores had a profound effect on the course of the Revolution, motivating the common people of Paris to march and riot and so forth even as their betters debated the Rights of Man.

[syndicated profile] cks_techblog_feed

Posted by cks

We are almost all of the way to the end of a multi-month process of upgrading our ZFS fileservers from Ubuntu 22.04 to 24.04 by also moving to more recent hardware. This involved migrating all of our pools and filesystems, involving terabytes of data. Our traditional way of doing this sort of migration (which we used, for example, when going from our OmniOS fileservers to our Linux fileservers was the good old reliable 'zfs send | zfs receive' approach of sending snapshots over. This sort of migration is fast, reliable, and straightforward. However, it has one drawback, which is that it preserves all of the old filesystem's history, including things like the possibility of panics and possibly other things.

We've been running ZFS for long enough that we had some ZFS filesystems that were still at ZFS filesystem version 4. In late 2023, we upgraded them all to ZFS filesystem version 5, and after that we got some infrequent kernel panics. We could never reproduce the kernel panics and they were very infrequent, but 'infrequent' is not the same as 'never' (the previous state of affairs), and it seemed likely that they were in some way related to upgrading our filesystem versions, which in turn was related to us having some number of very old filesystems. So in this migration, we deliberately decided to 'migrate' filesystems the hard way. Which is to say, rather than migrating the filesystems, we migrated the data with user level tools, moving it into pools and filesystems that were created from scratch on our new Ubuntu 24.04 fileservers (which led us to discover that default property values sometimes change in ways that we care about).

(The filesystems reused the same names as their old versions, because that keeps things easier for our people and for us.)

It's possible that this user level rewriting of all data has wound up laying things out in a better way (although all of this is on SSDs), and it's certainly insured that everything has modern metadata associated with it and so on. The 'fragmentation' value of the new pools on the new fileservers is certainly rather lower than the value for most old pools, although what that means is a bit complicated.

There's a bit of me that misses the deep history of our old filesystems, some of which dated back to our first generation Solaris ZFS fileservers. However, on the whole I'm happy that we're now using filesystems that don't have ancient historical relics and peculiarities that may not be well supported by OpenZFS's code any more (and which were only likely to get less tested and more obscure over time).

(Our pools were all (re)created from scratch as part of our migration from OmniOS to Linux, and anyway would have been remade from scratch again in this migration even if we moved the filesystems with 'zfs send'.)

[syndicated profile] metafilter_feed

Posted by Xurando

Willy Ley was the face of science and space travel for many young people growing up in the forties, fifties, and sixties.He was omnipresent in books, television and movie scripts

Willy Ley died in 1969. His ashes were recently found in the basement of a coop in Queens, NYC.
[syndicated profile] metafilter_feed

Posted by ChurchHatesTucker

Patrick (H) Willems explains why The Wachowskis' Speed Racer (2008) is The Most Important Movie of the 21st Century

Willems (previously and previouslier) is a video essayist (and, recently, filmmaker) who releases on Nebula and YouTube. He also sells Authentic YouTube Props (a real store.)
[syndicated profile] muckypaws_blog_feed

Posted by MuckyPaws

TL;DR:

This post explores a part of grief few people talk about — Widow’s Fire, the unexpected craving for intimacy after losing a spouse. It’s raw, honest, and written from lived experience. If you’ve ever felt guilt, confusion, or shame for needing connection while grieving — you’re not alone.

No One Warned Me About This Part

They don’t talk about this part. Not in grief books. Not at funerals. Not in awkward conversations with friends who don’t know what to say but say it anyway.

And certainly not in the early days of losing someone — when you’re still in shock, when you’re crying in public for no reason, when you’re forgetting how to eat, when sleep becomes a stranger.

But it came.

Not immediately. Not even in a way I understood at first. But it came — a deep, almost primal craving. For touch. For closeness. For intimacy. For something — anything — that made me feel alive in a world that suddenly felt hollow.

And I thought I was broken.

The Guilt of Feeling Human Again

I loved my wife with everything I had. I knew she was the one within thirty seconds of seeing her walk into the place I worked. Even now, eight years on, I still miss her. I still love her. That hasn’t changed.

So when that craving came — the need to be close to someone again — it felt like a betrayal. When I finally acted on it, with someone who had also been widowed and understood the grief I carried, I was overwhelmed by guilt.

Not just guilt… shame.

I felt like I had cheated. I remember lying there, afterwards, not basking in connection, but drowning in self-reproach. I’d honoured my vows — until death us do part — and yet, here I was, tangled in grief and flesh, wondering if I’d failed her.

But I hadn’t failed. I was just trying to survive.

No One Prepares You For Widow’s Fire

I didn’t know “Widow’s Fire” was a thing. I thought I was weird. Damaged. Disrespectful. I thought the endless tears were grief… but this desire? This aching loneliness and hunger for contact? That had to be something else, right?

Wrong.

It was grief too. Just in a different form.

But there was no map for it. No conversation. No support group pamphlet. Just a silence filled with judgement. Including my own.

And when I started dating again — when I entered a relationship that later turned toxic — the judgement came in from others too. People said I’d moved on too quickly. Whispered that I must not have loved her enough. As if love and grief follow a calendar.

The truth? I was just trying to feel something other than loss. And for that, I was made to feel ashamed.

This Isn’t About Sex. It’s About Being Human.

It’s easy to confuse Widow’s Fire with lust. But it’s not about that — not really. It’s about warmth. Reassurance. Being seen. It’s about the body remembering what love felt like and reaching for it, even when the heart is still shattered.

Sometimes the worst part of grief isn’t the absence of the person… it’s the absence of touch. Of connection. Of being held without words.

No one tells you how physical grief can be. How it lives in your skin. How your body can mourn just as deeply as your mind.

We talk about “moving on” like it’s betrayal. But we don’t talk about what it means to stay frozen. To die in slow motion while pretending you’re still alive.

To Those Who Feel This Too

If you’re reading this and recognising any part of yourself in it, know this:

You’re not broken. You’re not doing it wrong.
You loved deeply — and that’s why this hurts.
You’re allowed to want connection again. You’re allowed to feel desire.
And you’re still honouring them, even if you reach for someone new.

Grief isn’t a rulebook. It’s a wild, uncharted landscape.
And sometimes, craving closeness is just another way the soul tries to survive the cold.

To the Woman I Still Love

You’re still with me. You always will be.
You were my great love — and still are.
What came after wasn’t about replacing you. It was about trying not to disappear without you.

I didn’t know Widow’s Fire had a name. I just knew that when I needed someone — anyone — to hold me, it wasn’t because I loved you less.
It was because I loved you that much… and didn’t know how to survive the silence that followed.

Let’s Talk About This — When You’re Ready

Widow’s Fire is something many people experience but few ever speak about — often out of fear, shame, or the worry that it somehow makes them disloyal or “wrong.”

If this piece resonates with you — whether you’ve lived through it, wrestled with it, or are still unsure what to make of it — your story matters too.

You don’t need to comment. You don’t need to explain. But if you want to share — anonymously, in safe spaces, or even just in a quiet journal — know this:

You’re not alone. And you’re not broken.

The more we speak, the more we loosen the silence around grief, intimacy, and the very real need to feel alive again.

Let this be a start — for anyone who needs it.

[syndicated profile] infectedsystems_blog_feed

If you are reading this message, the experiment below is still ongoing. This page was served to you by a real Nintendo Wii.

You can check the Wii’s live status page for system load info.

For a long time, I’ve enjoyed the idea of running general-purpose operating systems on decidedly not-general-purpose hardware.

There’s been a few good examples of this over the years, including a few which were officially sanctioned by the OEM. Back in the day, my PS3 ran Yellow Dog Linux, and I’ve been searching for a (decently priced) copy of PS2 Linux for 10+ years at this point.

There are some other good unofficial examples, such as Dreamcast Linux, or PSPLinux.

But what a lot of these systems have in common is that they’re now very outdated. Or they’re hobbyist ports that someone got running once and where longer-term support never made it upstream. The PSP Linux kernel image was last built in 2008, and Dreamcast Linux is even more retro, using a 2.4.5 kernel built in 2001.

I haven’t seen many of these projects where I’d be comfortable running one as part of an actual production workload. Until now.

While browsing the NetBSD website recently, I noticed the fact that there was a ‘Wii’ option listed right there on the front page in the ‘Install Media’ section, nestled right next to the other first-class targets like the Raspberry Pi, and generic x86 machines.

Unlike the other outdated and unmaintained examples above, clicking through to the NetBSD Wii port takes you to the latest stable NetBSD 10.1 release from Dec 2024. Even the daily HEAD builds are composed for the Wii.

As soon as I discovered this was fully supported and maintained, I knew I had to try deploying an actual production workload on it. That workload is the blog you’re reading now.

Finding a sacrificial Wii

Our story begins at the EMF Camp 2024 Swap Shop - your premier source for pre-loved game consoles, cardboard boxes full of 56k modems, and radioactive orphan sources.

The EMF Wii being rescued from the Swap Shop

I picked this up expecting to use it for homebrew games and emulation mostly, but I don’t think it expected this fate.

Is it fast enough?

So we have a spare Wii. And an OS with mainline support. But is a Wii actually fast enough to handle this as a production workload?

The single-core ‘Broadway’ CPU in the Wii is part of IBM’s continued evolution of the PowerPC 750 lineup, dating all the way back to Apple’s iconic 1998 Bondi Blue fishtank iMac. Although Broadway is one of the later 750 revisions, the commercially-available equivalent chip - the PowerPC 750CL - has a maximum TDP of only 9.8 W, and clocks about 33% higher than the version in the Wii.

So with a single-core chip based on a late-90s architecture and a TDP well under 10 W, it’s clear that we’re probably fairly contstrained here in terms of compute performance.

With that said, one of the other PowerPC 750 deployments you might be familiar with is currently floating 1,500,000 km from Earth mapping the deepest reaches of the universe in more detail than humanity has ever seen before. So if I can’t get this thing serving a static website, then I think it’s probably time to execute on my long-term plan of retiring from tech and opening a cat cafe.

James Wii Space Telescope

On a more serious note, you can read about the James Wii Space Telescope’s use of the PowerPC 750 in this NASA presentation. The 750 actually gets a lot of use in spaceflight and satellite applications because there is a radiation-hardened version available, known as the RAD750. Some other recent uses of the chip include both the Mars Curiosity and Perseverance rovers.

Installing NetBSD on the Wii

Okay, Nintendo lawyers avert your eyes.

It had been a long time since I softmodded a Wii. I remember the Twilight Hack, which involved exploiting a buffer overflow in the Twilight Princess save game handler to run unsigned code.

Things are much easier these days. The Wilbrand exploit seems to be what people generally recommend now. Like some other exploits, it takes advantage of the fact that an SD card can be used to store and retrieve messages from the Wii Message Board. Exploting this allows unsigned code execution, which allows us to boot the HackMii tool that installs the Homebrew Channel.

It’s an easy mod which just requires knowing the MAC address of the console and generating a few files to load from an SD card. There’s a handy browser-based tool here which does all of the hard work for you.

I did have some issues using a larger SDHC card to run the Wilbrand exploit, but had the best luck with a 1GB non-SDHC card. SD card compatibility seems to be a known issue for Wii homebrew, but overall I’d still call the process fairly painless.

Once we’ve hacked the console, we should have the Homebrew Channel available in our Wii Menu:

The Homebrew Channel now available on the Wii Menu

Now we can prepare our NetBSD SD card. We do this by downloading the wii.img.gz image from the front page of the NetBSD site.

For this card, I opted to use a fairly speedy 32GB SDHC card. The Wii doesn’t support SDXC or newer cards, which means we’re limited to 32GB. Larger flash devices also generally tend to be faster and more resilient than smaller ones. And NetBSD seems a lot less bothered by living on a larger card than the Wilbrand exploit was. So overall I’d recommend getting a decent quality fast 32GB card if you want to try this.

We can unpack and write this image however we please, but I’m a fan of using the Raspberry Pi Imager because it’ll do the work of extracting the image and verifying it post-write for us:

Using the Raspberry Pi Imager to write and verify the image

At this point, things are very easy. The NetBSD Wii image has all the necessary metadata & structure needed to boot directly from the Homebrew Channel as if it were any other kind of homebrew app. I think there’s a lot of credit due here to NetBSD developer Jared McNeill, who seems to be the main author of the Wii port.

Placing our SD card in the console and launching the Homebrew Channel is all we need to do to prepare ourselves to launch NetBSD:

NetBSD, ready to launch

Once booted into NetBSD, we can use a USB keyboard just fine, but it will be easiest to get SSH working so we can manage the system remotely. The SSH daemon is already running out-of-the-box, so the only changes we need to make are to set a password for the root user and then enable logging in as root by adding PermitRootLogin yes to the sshd_config.

You could set up an unprivileged user or do anything else you fancy here but I was keen to get SSH going ASAP, as due to the absence of HDMI-enabled screens in my server-area laziness I was doing this bit using a capture card and Photo Booth on macOS which doesn’t actually support disabling the image-flip on the video feed:

If you thought it was hard to exit Vim, try doing it back to front

If you thought it was hard to exit Vim, try doing it back to front.

After installation, I set a static network config by editing /etc/ifconfig.axe0 and restarted the host.

On that note, I’m using the official RVL-015 Wii LAN Adapter. I went to great lengths to track down one of these for a decent price for the best chance of compatibility. On reflection, this probably wasn’t needed as by the time we’re booted into NetBSD we should have all of NetBSD’s drivers available to us, so I expect most generic USB adapters would probably work (in theory!).

If anyone is wondering though, here are the specifics of the adapter and chipset, taken from dmesg:

[     2.089988] axe0 at uhub2 port 1
[     2.089988] axe0: ASIX Electronics (0x0b95) AX88772 USB 2.0 10/100 ethernet controller (0x7720), rev 2.00/0.01, addr 2
[     2.549988] ukphy0 at axe0 phy 16: Asix Semiconductor AX88772 internal PHY (OUI 0x007063, model 0x0001), rev. 1
[     2.559992] ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
[     2.559992] axe0: Ethernet address 9c:e6:35:73:f0:44

Package management

After restarting, I installed NetBSD’s pkgin package manager by setting some env vars and then using pkg_add pkgin:

export PATH="/usr/pkg/sbin:/usr/pkg/bin:$PATH"
export PKG_PATH="https://cdn.NetBSD.org/pub/pkgsrc/packages/NetBSD/evbppc/10.1/All/"
pkg_add pkgin

After this, I was able to use pkgin to install a bunch of useful packages - most importantly including our lighttpd web server, which I’ve picked due to it being slim and well-suited for resource constrained environments:

pkgin install bsdfetch iperf3 lighttpd nano rsync

After that, I copied the basic lighttpd sample config, and enabled and started it:

cp -fv /usr/pkg/share/examples/rc.d/lighttpd /etc/rc.d
echo 'lighttpd=YES' >> /etc/rc.conf
/etc/rc.d/lighttpd start

By default, lighttpd is set up to serve static content from /srv/www/htdocs. Since my blog is a collection of static pages built with Hugo, I was able to simply rsync these files over and within seconds I had the system serving my site over standard HTTP.

Is it fast enough? (addendum)

Alright, you got me. It turns out that while a PPC 750 might be enough to map the futhest reaches of the universe, a bit of soak testing suggests it does struggle a bit when trying to concurrently serve a lot of pages encrypted with modern TLS.

I tried freeing up resources by disabling a bunch of services I don’t need that are running out of the box on NetBSD:

sed -i 's/^dhcpcd=.*/dhcpcd=NO/' /etc/rc.conf || echo 'dhcpcd=NO' >> /etc/rc.conf
sed -i 's/^inetd=.*/inetd=NO/' /etc/rc.conf || echo 'inetd=NO' >> /etc/rc.conf
sed -i 's/^mdnsd=.*/mdnsd=NO/' /etc/rc.conf || echo 'mdnsd=NO' >> /etc/rc.conf
sed -i 's/^postfix=.*/postfix=NO/' /etc/rc.conf || echo 'postfix=NO' >> /etc/rc.conf

I also disabled ntpd, which was using a staggering 15% of the whole system’s RAM:

USER PID  %CPU %MEM COMMAND
root 9161  0.0 15.6 /usr/sbin/ntpd -p /var/run/ntpd.pid -g

Unfortunately it seems ntpd is definitely necessary to keep the system clock in-check. I’m not sure whether the Wii just drifts a lot, whether it’s specific to NetBSD on the Wii, or whether the clock battery in what may be a nearly 20 year old console has given up but I got some interesting and quite indignant sounding error messages after disabling this:

The world needs more indignant sounding error messages like this

To compensate, I cheated by adding ntpd -q -g to the main crontab, so the system would run it hourly at :42 min past the hour. We still get timesync, but we don’t need to sacrifice a sixth of our RAM keeping it resident:

42    *       *       *       *       /usr/sbin/ntpd -q -g

Even after freeing up the resources above, it seems like serving multiple encrypted requests in parallel was a struggle for the 750, so I opted to move the TLS termination for the blog to a Caddy instance sitting in front of the Wii.

I have Caddy acting as a reverse proxy to the Wii, handling encryption and cert management with ACME. Importantly, there are no caching options enabled in Caddy. Every request the site serves is being serviced directly by the Wii - including the large number of images on this post which I’ll almost certainly regret adding. I optimised as much as I could, but this page is still almost exactly 1 MB when all of the content is loaded.

Shitpost diagram of Caddy reverse proxy

Through this method, I’ve also been able to sinkhole LLM slop-scrapers at Caddy’s level, by dropping requests from known scraper User Agents before they’re forwarded to the Wii. Hopefully that might help to keep our single core chugging along without too much distress.

Status monitoring

Moving the SSL termination to Caddy also gives me the advantage of enabling Caddy’s Prometheus exporter, so I can load it into my InfluxDB + Grafana stack and monitor site load without putting a bunch of additional stress on the Wii.

But I’m still interested (and I’m sure you are too) in monitoring the general state of the Wii resources as this post goes live.

Considering I had to disable the NTP client for using too much RAM, I think running something like a Prometheus exporter directly on the Wii is right out of the window to begin with. So I put together a simple shell script that runs from the crontab every 15 min, outputting some system stats to a basic HTML file in the webroot.

⣤⣤⣤⠀⠀⠀⠀⠀⣀⣤⣄⠀⠀⠀⠀⠀⣠⣤⣤⠀⠀⣴⣿⣦⠀⠀⢀⣶⣿⣦
⢸⣿⣿⡇⠀⠀⠀⢠⣿⣿⣿⣇⠀⠀⠀⠀⣿⣿⡿⠀⠀⠻⣿⠟⠀⠀⠈⠿⣿⠟
⠀⢿⣿⣷⠀⠀⠀⣼⣿⡿⣿⣿⡀⠀⠀⢸⣿⣿⠇⠀⠀⣀⣀⡀⠀⠀⠀⣀⣀⡀
⠀⠸⣿⣿⡆⠀⢠⣿⣿⠃⢿⣿⣇⠀⠀⣿⣿⡟⠀⠀⠀⣿⣿⣿⠀⠀⠀⣿⣿⣿
⠀⠀⢿⣿⣷⠀⣸⣿⡟⠀⠘⣿⣿⠀⢸⣿⣿⠇⠀⠀⠀⣿⣿⣿⠀⠀⠀⣿⣿⣿
⠀⠀⠸⣿⣿⣄⣿⣿⠃⠀⠀⢿⣿⣇⣿⣿⡿⠀⠀⠀⠀⣿⣿⣿⠀⠀⠀⣿⣿⣿
⠀⠀⠀⢿⣿⣿⣿⡟⠀⠀⠀⠸⣿⣿⣿⣿⠃⠀⠀⠀⠀⣿⣿⣿⠀⠀⠀⣿⣿⣿
⠀⠀⠀⠘⢿⣿⡿⠁⠀⠀⠀⠀⠻⣿⣿⠟⠀⠀⠀⠀⠀⣿⣿⣿⠀⠀⠀⣿⣿⣿

blog.infected.systems NetBSD Wii Status
Generated on: Mon Apr 21 16:30:00 UTC 2025

=== uname -a ===
NetBSD wii 10.1 NetBSD 10.1 (WII) #0: Mon Dec 16 13:08:11 UTC 2024  mkrepro@mkre
pro.NetBSD.org:/usr/src/sys/arch/evbppc/compile/WII evbppc

=== uptime ===
 4:30PM  up 25 mins, 1 user, load averages: 0.00, 0.00, 0.00
[...]

You can view the full status page at blog.infected.systems/status.

Final observations

Honestly, this worked way better and was far easier than I was expecting. Naturally, there are some downsides to the setup here though.

Rebooting NetBSD reboots the whole console, and not just the NetBSD ‘app’, so you’ll find yourself back at the Wii Menu after any kernel patch or system upgrade. Yes, this does mean that the Wiimote and sensor bar in your server cupboard are now a vital component of the production infrastructure.

I was reasonably pleased with the power consumption too. Some testing based on stats from my UPS monitoring suggest that when idling, the Wii is adding a fairly consistent ~18 W to my overall homelab usage.

By my calculations, that means I can expect the Wii to use ~13.2 kWh/month, which on my fairly expensive UK power tariff comes out to around £3.47/month - which does actually make this cheaper than most of the VPSes I can find around the obvious cloud providers. So when you’re looking for your next VPS… you know what to consider.

This was a fun experiment for a rainy day over a long weekend. I’ll probably keep it going for a while if it actually continues to work as well as it started. I’m often interested in applying artificial constraints to the things I deploy, as I find that’s when I learn best.

Who knows, maybe I’ll have been forced to become an expert in NetBSD TCP kernel tunables by this time next week…

Against Horizontal Scroll

2025-04-22 00:00
[syndicated profile] matklad_feed

Posted by Alex Kladov

Against Horizontal Scroll

What’s in common between these two blog posts (pardon me, my fellow crustaceans of lobster variety)?

They both have horizontal scroll on mobile! Horizontal scroll is very distracting – when you scroll vertically with your thumb, you necessarily scroll horizontally as well. Any amount of horizontal scroll clips the left edge of the screen, chopping of begging of every sentence!

This is a hard problem to fix, or at least I don’t know a reliable simple solution. Still, I think this site should not have overflows, so let me share some things I’ve learned about the width of things!

Code Blocks

In general, you want your main text to be pretty narrow, about 50-60 characters. This creates a problem for coding blogs — code, unlike prose, wants to be a bit wider. While its a good idea to keep most of the examples narrow, an occasional line still wants to be longer than 60. My suggested solution here is to accept this, and allow code samples to be wider than the main text. This is not super trivial to achieve with CSS, but I borrowed a solution from https://blog.xoria.org.

My HTML structure looks roughly like this, body > main > article > section? > p:

<body>
  <main>
    <article>
    <h1>
      Against Horizontal Scroll <time class="meta" datetime="2025-04-22">Apr 22, 2025</time>
    </h1>
    <p>
      What’s in common between these two blog posts (pardon me, my fellow
      crustaceans of lobster variety)?
    </p>
    <figure class="code-block">
      <pre><code>A bunch of code here.</code></pre>
    </figure>
    </article>
  </main>
</body>

And I use the following CSS for narrow main text width and moderately wide code:

/* Set the body width to how wide you want the code to be */
body {
    max-width: 80ch;
    padding: 2ch;
    margin-left: auto;
    margin-right: auto;
}

/* Then, limit every "paragraph" of article to be narrower.
 * Paragraph is just any descendant of the main article tag.
 */
article > *,
article > section > *
{ max-width: 55ch; }

/* Finally, opt-out of narrow width for figures with code */
article > section,
article > figure,
article > section > figure
{ max-width: 80ch; }

Still, it is hard to enforce that all code samples fit within the limit, and there are narrow screens where they can’t physically fit.

To solve this, you need to make sure that, when a horizontal scroll-bar appears due to a wide code block, it only appears on the code block, and not on the entire website:

figure.code-block > pre > code {
    overflow-x: auto;
}

Code blocks are the primary cause of horizontal scroll, so it’s great that this is fixed now! Two more left!

Word Breaking

The browser can reflow your article to make it narrower by breaking text over multiple lines. This requires that your words are not too wide. This is usually not a problem, unless you are a German, but there are certain technical “words” that are, in fact, wide. For example, I like to use bare URLs in my writing, and, because urls typically do not contain spaces, they can’t be broken over multiple lines and cause scrollbars. For such cases, you need to inform the browser that it is okay to break the thing anywhere:

p { hyphens: auto; }
a.url { word-break: break-all; }

Flexbox

The final issue that hit me relates to flexbox. Specifically, its min-width semantics. If you don’t specify min-width of a flex item explicitly, it gets defaulted to min-width: auto. This means that the minimum width that the item can occupy is determined by not breaking paragraphs in lines! This way, the computed minimal width of the element ends up being much wider than what you would naturally expect. To fix it, manually override it:

aside.admn > div { flex: 1; min-width: 0; }

That’s all for today. To underscore my point, and in solidarity with the authors of the two blogs that started this, let me include an url without word-break to make sure this article itself has the problem it talks about:

https://matklad.github.io/2025/04/22/horizontal-scroll.html

A history of the Big Dig

2025-04-22 18:48
[syndicated profile] metafilter_feed

Posted by The Ardship of Cambry

There is a strange irony behind the Big Dig: the most expensive highway project ever built in America began with a man who hated highways.
From WGBH, a nine-part audio history of one of the biggest infrastructure projects in U.S. history, starting with its roots in neighborhood activism, through its many controversies and several major leadership changes, to its aftermath for Boston in particular and large public works projects in the U.S. in general. Listen directly at the WBGH website, which also has links to listen on Apple Podcasts, Spotify, or Amazon Music.
[syndicated profile] metafilter_feed

Posted by wittgenstein

Many of us are familiar with Edouard de Pomiane and his book French Cooking in Ten Minutes. You may not know that in 1995, the BBC made it into a six part TV series starring Christopher Rozycki as de Pomiane and Marilyn Taylerson as the mysterious Madame X. You can watch them all here.

Poster's Log: Hat tip to mumimor who mentioned this series in their answer to this AskMefi question. I thought it deserved to be a separate front page post.