A Castle Built From Random Rooms

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

A Castle Built From Random Rooms is a work in progress/early access/demo version of a full game that’ll probably never exist. But if it does exist, it will be basically the same as this, but on a grander scale, and include the following features:

   – over a hundred random rooms instead of about ten
   – character jobs and descriptions that actually add individualised effects/skills/starting equipment and so on
   – special pre-chosen characters with particulalrly challenging stats levels for extra difficult challenges
   – more stats! more items! more use of the stats and items within different rooms to create different outcomes!
   – high scores and loot rankings and possibly even achievements of some kind
   – less bugs (aspiration)
   – decent endings (stretch goal)

What the game almost certainly won’t ever have:

   – any semblance of quality or coherence
   – sound and/or music
   – monetary success

I saw and first played this ages ago, after its initial release was mentioned on Metafilter Projects last year. In case you missed it first time around, you can give it a go now!

It’s a Twine-like choose-your-own-adventure, but with the rooms randomly shuffled each time, in sort-of a semi-rougelite way. Some imaginative work in this. And the art style is wonderful!

Quesapizza-pizza

A quesapizza is a quesadilla, but made using pizza ingredients: not just cheese, but also a tomato sauce and maybe some toppings.

A quesapizza-pizza is a pizza… constructed using a quesapizza as its base. Quick to make and pretty delicious, it’s among my go-to working lunches.

The one you see above (and in the YouTube version of this video) is topped with a baked egg and chilli flakes. It might not be everybody’s idea of a great quesapizza-pizza, but I love mopping up the remainder of the egg yolk with the thick-stuffed cheese and tomato wraps. Mmm!

Heterophonic Homonyms

The elder of our two cars is starting to exhibit a few minor, but annoying, technical faults. Like: sometimes the Bluetooth connection to your phone will break and instead of music, you just get a non-stop high-pitched screaming sound which you can suppress by turning off the entertainment system… but can’t fix without completely rebooting the entire car.

A car dashboard with five amber and one red warning lights lit.
There’ve been other “this car is getting a bit older” technical faults too. One of his tyre pressure sensors broke the other month and caused a cascade of unrelated errors that disabled the traction control, ABS, auto-handbrake, parking sensors, and reversing camera… but replacing the pressure sensor fixed everything. Cars are weird, and that’s coming from somebody working in an industry that fully embraces knock-on regression bugs as a fact of life.

The “wouldn’t you rather listen to screaming” problem occurred this morning. At the time, I was driving the kids to an activity camp, and because they’d been quite enjoying singing along to a bangin’ playlist I’d set up, they pivoted into their next-most-favourite car journey activity of trying to snipe at one another1. So I needed a distraction. I asked:

We’ve talked about homonyms and homophones before, haven’t we? I wonder: can anybody think of a pair of words that are homonyms that are not homophones? So: two words that are spelled the same, but mean different things and sound different when you say them?

This was sufficiently distracting that it not only kept the kids from fighting for the entire remainder of the journey, but it also distracted me enough that I missed the penultimate turning of our journey and had to double-back2

…in English

With a little prompting and hints, each of the kids came up with one pair each, both of which exploit the pronunciation ambiguity of English’s “ea” phoneme:

  1. Lead, as in:
    • /lɛd/ The pipes are made of lead.
    • /liːd/ Take the dog by her lead.
  2. Read, as in:
    • /ɹɛd/read a great book last month.
    • /ɹiːd/ I will read it after you finish.

These are heterophonic homonyms: words that sound different and mean different things, but are spelled the same way. The kids and I only came up with the two on our car journey, but I found many more later in the day. Especially, as you might see from the phonetic patterns in this list, once I started thinking about which other sounds are ambiguous when written:

  1. Tear (/tɛr/ | /tɪr/): she tears off some paper to wipe her tears away.
  2. Wind (/waɪnd/ | /wɪnd/): don’t forget to wind your watch before you wind your horn.
  3. Live (/laɪv/ | /lɪv/): I’d like to see that band live if only I could live near where they play.
  4. Bass (/beɪs/ | /bæs/): I play my bass for the bass in the lake.
  5. Bow (/baʊ/ | /boʊ/): take a bow before you notch an arrow into your bow.
  6. Sow (/saʊ/ | /soʊ/): the pig and sow ate the seeds as fast as I could sow them.
  7. Does (/dʌz/ | /doʊz/): does she know about the bucks and does in the forest?

(If you’ve got more of these, I’d love to hear read them!)

…in other Languages?

I’m interested in whether heterophonic homonyms are common in any other languages than English? English has a profound advantage for this kind of wordplay3, because it has weakly phonetics (its orthography is irregular: things aren’t often spelled like they’re said) and because it has diverse linguistic roots (bits of Latin, bits of Greek, some Romance languages, some Germanic languages, and a smattering of Celtic and Nordic languages).

With a little exploration I was able to find only two examples in other languages, but I’d love to find more if you know of any. Here are the two I know of already:

  1. In French I found couvent, which works only thanks to a very old-fashioned word:
    • /ku.vɑ̃/ means convent, as in – where you keep your nuns, and
    • /ku.və/ means sit on, but specifically in the manner that a bird does on its egg, although apparently this usage is considered archaic and the word couver is now preferred.
  2. In Portugese I cound pelo, which works only because modern dialects of Portugese have simplified or removed the diacritics that used to differentiate the spellings of some words:
    • /ˈpe.lu/ means hair, like that which grows on your head, and
    • /ˈpɛ.lu/ means to peel, as you would with an orange.

If you speak more or different languages than me and can find others for me to add to my collection of words that are spelled the same but that are pronounced differently, I’d love to hear them.

Special Bonus Internet Points for anybody who can find such a word that can reasonably be translated into another language as a word which also exhibits the same phenomenon. A pun that can only be fully understood and enjoyed by bilingual speakers would be an especially exciting thing to behold!

Footnotes

1 I guess close siblings are just gonna go through phases where they fight a lot, right? But if you’d like to reassure me that for most it’s just a phase and it’ll pass, that’d be nice.

2 In my defence, I was navigating from memory because my satnav was on my phone and it was still trying to talk over Bluetooth to the car… which was turning all of its directions into a high-pitched scream.

3 If by “advantage” you mean “is incredibly difficult for non-native speakers to ever learn fluently”.

×

Regions Unlocked

Thanks to the community’s invention of a “Region unlocked” achievement, I’ve been able to instantly (and retroactively!) tick another one off my geohashing list, for my expedition on Trinidad early this year!

(Possibly I’ve achieved it other times, too: I haven’t yet determined whether anybody successfully hashed in County Mayo or County Galway before I did last year, on account of both counties spanning multiple graticules and so requiring more research!)

Citing Lobachevsky

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

The recent death of Tom Lehrer has resulted in all manner of interesting facts and anecdotes about the man being published around the Internet, but perhaps my favourite was the tale about how, while working for the NSA in 1957, he snuck an Easter Egg into a research paper… that went undetected for nearly 60 years:

I worked as a mathematician at the NSA during the second Obama administration and the first half of the first Trump administration. I had long enjoyed Tom Lehrer’s music, and I knew he had worked for the NSA during the Korean War era.

The NSA’s research directorate has an electronic library, so I eventually figured, what the heck, let’s see if we can find anything he published internally!And I found a few articles I can’t comment on. But there was one unclassified article– “Gambler’s Ruin With Soft-Hearted Adversary”.

The paper was co-written by Lehrer and R. E. Fagen, published in January, 1957. The mathematical content is pretty interesting, but that’s not what stuck out to me when I read it. See, the paper cites FIVE sources throughout its body. But the bibliography lists SIX sources. What’s the leftover?

Academic bibliography, citing six papers related principally to probability. The third paper, highlighted for the picture, is: Lobachevsky, "Analytic and Algebraic Topology of Locally Euclidean Metrizations of Infinitely Differentiable Remannian Manifolds" (Unpublished)

So I sent an email to the NSA historians. And I asked them: hey, when was this first noticed, and how much of a gas did people think it was? Did he get in trouble for it? That sort of stuff.

The answer came back: “We’ve never heard of this before. It’s news to us.”

In November of 2016, nearly 60 years after the paper was published internally, I had discovered the joke.

Bozhe moi!

Very Tom Lehrer to hide a joke so well that nobody would even notice it for most of six decades, while undermining and subverting bureaucratic government processes.

And if you somehow don’t “get” the joke, Wikipedia can both explain and let you listen to the relevant song

Clapham South Deep Shelter

At the weekend, JTA and I – along with our eldest child – explored the Clapham South Deep Shelter as part of one of Hidden London‘s underground tours, and it was pretty great!

A circular tunnel with a flat floor and low ceiling, wrapped in white-painted iron and concrete, with exposed wiring and WWII-era signage, leads deeper into a subterranean bunker past a small guard post in which a figure can barely be seen, reading a book.
Anybody else get Fallout vibes from this place?

I’ve done a couple of bits of exploration of subterranean London before: in the service tunnels around Euston, and into the abandoned station on the Aldwych branch line. But I was especially impressed by the care and attention that had gone into making this particular tour fun and engaging.

Broad staircase reminiscent of those found around the London Underground, but sparsely lit and decorated. Looking up the stairs, it ends in a brick wall.
Had this deep shelter gained a second life as a new tube station, as was originally hoped, this staircase would have connected it to the Northern Line platforms. Instead, it ends at a brick wall.

The site itself is deep: trains on the Northern Line – already one of the deepest lines on the London Underground – can be heard passing above you, and any noise from street level is completely gone (even the sounds of bombing couldn’t be heard down here, WWII residents reported). It’s also huge: long interconnected tunnels provided space for 8,000 beds, plus canteens, offices, toilets, medical bays, and other supporting architecture.

Table with basins, kidney bowl, old-style medical vials, kettle, jug, and WWII-era shrapnel dressing kit, in an iron-framed subterranean tunnel.
Significant parts of the bunker contain original furniture, including the metal-frames triple-bunk-beds (some of which show signs of being temporarily repurposed as archival storage shelves). But other bits have been restored to make them feel contemporaneous with the era of its construction.

To extend the immersion of the theme even further, there’s a “warden” on-site who – after your 179-step descent – welcomes you and checks your (replica) night admission ticket, identifying which bed’s bed assigned to you. The warden accompanies your group around, staying in-character as you step through different eras of the history of the place! By the time you get to the interpretative space about the final days of its use for human habitation – as a budget hotel for the “Festival of Britain” national exhibition in 1951 – he speaks fondly of his time as its warden here and wonders about what will become of the place.

In an extremely long semicircular concrete tunnel, a tween girl wearing a green hoodie stands near signage made to look like 1940s newspapers.
The long, long double-helix staircases that brought us deep into the earth represented only a fraction of the distance we walked on the tour, through these long networks of tunnels.

All of which is to say that this was a highly-enjoyable opportunity to explore yet another hidden place sprawling beneath London. The Hidden London folks continue to impress.

Small pink replica ticket reading 'Clapham South Shelter: Admit One Person for One Night Only', ticket number L0281.
I’m glad I’ve got a bed of my own in a house of my own that’s not being bombed by the Luftwaffe, actually, thanks.

If you want to see a little more, they’ve released a video just yesterday: or for the full experience, see if there are any slots you can make to visit the place for yourself.

× × × × ×

Order of the Beast

Went to Wagamama. Accidentally made the “Order of the Beast”.

(Plus a similar side, for those who read binary.)

Wagamama restaturant placemat on which the waitstaff has written my order item numbers: 110, and 666.

×

Note #26938

Seventy years ago, residents of this part of London would take shelter from V1 and V2 bombs in a tunnel beneath my feet. And today, I’m going down there to take a look!

Dan, a white man wearing a Goo Goo Dolls t-shirt, stands in front of a sign describing the history of The Drum in South Clapham.

×

ArtificialCast

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

Type-safe transformation powered by inference.

ArtificialCast is a lightweight, type-safe casting and transformation utility powered by large language models. It allows seamless conversion between strongly typed objects using only type metadata, JSON schema inference, and prompt-driven reasoning.

Imagine a world where Convert.ChangeType() could transform entire object graphs, infer missing values, and adapt between unrelated types – without manual mapping or boilerplate.

ArtificialCast makes that possible.

Features

  • Zero config – Just define your types.
  • Bidirectional casting – Cast any type to any other.
  • Schema-aware inference – Auto-generates JSON Schema for the target type.
  • LLM-powered transformation – Uses AI to “fill in the blanks” between input and output.
  • Testable & deterministic-ish – Works beautifully until it doesn’t.

As beautiful as it is disgusting, this C# is fully-functional and works exactly as described… and yet you really, really should never use it (which its author will tell you, too).

Casting is the process of transforming a variable of one type into one of another. So for example you might cast the number 3 into a string and get "3" (though of course this isn’t the only possible result: "00000011" might also be a valid representation, depending on the circumstances1).

Casting between complex types defined by developers is harder and requires some work. Suppose you have a User model with attributes like “username”, “full name”, “hashed password”, “email address” etc., and you want to convert your users into instances of a new model called Customer. Some of the attributes will be the same, some will be absent, and some will be… different (e.g. perhaps a Customer has a “first name” and “last name” instead of a “full name”, and it’s probably implemented wrong to boot).

The correct approach is to implement a way to cast one as the other.

The very-definitely incorrect approach is to have an LLM convert the data for you. And that’s what this library provides.

ArtificialCast is a demonstration of what happens when overhyped AI ideas are implemented exactly as proposed – with no shortcuts, no mocking, and no jokes.

It is fully functional. It passes tests. It integrates into modern .NET workflows. And it is fundamentally unsafe.

This project exists because:

  • AI-generated “logic” is rapidly being treated as production-ready.
  • Investors are funding AI frameworks that operate entirely on structure and prompts.
  • Developers deserve to see what happens when you follow that philosophy to its logical conclusion.

ArtificialCast is the result.

It works. Until it doesn’t. And when it doesn’t, it fails in ways that look like success. That’s the danger.

I’ve played with AI in code a few times. There are some tasks it’s very good at, like summarising and explaining (when the developer before you didn’t leave a sufficiency of quality comments). There are some tasks it can be okay at, with appropriate framing and support: like knowing its way around unfamiliar-to-you but well-documented APIs2.

But if you ask an AI to implement an entire product or even just a significant feature from scratch, unsupervised, you’re at risk of rapidly hitting the realm of Heisenbugs, security vulnerabilities, and enormous redundancies.

This facetious example – of using AI as a universal typecasting engine – helps hammer that point home, and I love it.

Footnotes

1 How to cast basic types isn’t entirely standardised: PHP infamously casts the string "0" as false when it’s coerced into a boolean, which virtually no other programming language does, for example.

2 The other week, I had a GenAI help me write some code that writes to a Google Sheets document, because I was fuzzy on the API and knew the AI would pick it up faster than me while I wrote the code “around” it.

Note #26931

I got kicked off LinkedIn this week. Apparently there was “suspicious behaviour” on my account. To get back in, I needed to go through Persona’s digital ID check (this, despite the fact that I’ve got a Persona-powered verification on my LinkedIn, less than six months old).

After looping around many times identifying which way up a picture of a dog was and repeatedly photographing myself, my passport, and my driving license, I eventually got back in. Personally, I suspect they just rolled out some Online Safety Act functionality and it immediately tripped over my unusual name.

But let this be a reminder to anybody who (unlike me) depends upon their account in a social network: it can be taken away in a moment and be laborious (or impossible) to get back. If you care about your online presence, you should own your own domain name; simple as that!

Bagel Holes

I’ve eaten “doughnut holes”, but I’ve never seen anybody market “bagel holes”. Untapped opportunity? 🤔

Lock All The Computers

I wanted a way to simultaneously lock all of the computers – a mixture of Linux, MacOS and Windows boxen – on my desk, when I’m going to step away. Here’s what I came up with:

There’s optional audio in this video, if you want it.

One button. And everything locks. Nice!

Here’s how it works:

  1. The mini keyboard is just 10 cheap mechanical keys wired up to a CH552 chip. It’s configured to send CTRL+ALT+F13 through CTRL+ALT+F221 when one of its keys are pressed.
  2. The “lock” key is captured by my KVM tool Deskflow (which I migrated to when Barrier became neglected, which in turn I migrated to when I fell out of love with Synergy). It then relays this hotkey across to all currently-connected machines2.
  3. That shortcut is captured by each recipient machine in different ways:
    • The Linux computers run LXDE, so I added a line to /etc/xdg/openbox/rc.xml to set a <keybind> that executes xscreensaver-command -lock.
    • For the Macs, I created a Quick Action in Automator that runs pmset displaysleepnow as a shell script3, and then connected that via Keyboard Shortcuts > Services.
    • On the Windows box, I’ve got AutoHotKey running anyway, so I just have it run { DllCall("LockWorkStation") } when it hears the keypress.

That’s all there is to is! A magic “lock all my computers, I’m stepping away” button, that’s much faster and more-convenient than locking two to five computers individually.

Footnotes

1 F13 through F24 are absolutely valid “standard” key assignments, of course: it’s just that the vast majority of keyboards don’t have keys for them! This makes them excellent candidates for non-clashing personal-use function keys, but I like to append one or more modifier keys to the as well to be absolutely certain that I don’t interact with things I didn’t intend to!

2 Some of the other buttons on my mini keyboard are mapped to “jumping” my cursor to particular computers (if I lose it, which happens more often than I’d like to admit), and “locking” my cursor to the system it’s on.

3 These boxes are configured to lock as soon as the screen blanks; if yours don’t then you might need a more-sophisticated script.

DOGWALK

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

Well this was adorable.

Blender Studio’s official game project is a short casual interactive story. Play a big, adorable dog traversing through winter woods and help out a little kid decorate a snowman with colorful items hidden in the environment.

Animation from DOGWALK featuring a papercraft scene of a large hairy dog pulling a young child through a wintery forest.

DOGWALK is a free, open-source Godot game for Windows, MacOS and Linux, produced and given to the world by Blender Studio as a way of showcasing some of their video lessons. The beautiful, playful “papercraft” models were made by making actual hand-painted paper models of the assets, unfolding them, scanning them, and then re-folding the maps back into in-game assets, which is an amazing and imaginative approach.

It was released a little over a week ago, and it’s a short but adorable little game.

It’s also free on Steam, if that’s your preference.

×