Hammocking with the Dog

Finished work. Figured I’d chill in the hammock for a bit as it’s so nice out.

The dog decided she wanted to lie in it too.

So now I am a pillow for a dog.

Dan, a middle-aged white man with long hair and a goatee beard, lies on a striped hammock in a verdant garden. He's wearing a t-shirt which says "love" over a ribbon in pride colours, and on his chest lies a contented-looking champagne-coloured French Bulldog.

×

Part of the Internet, or connecting to the Internet?

Some time in the last 25 years, ISPs stopped saying they made you “part of” the Internet, just that they’d help you “connect to” the Internet.

Most people don’t need a static IP, sure. But when ISPs stopped offering FTP and WWW hosting as a standard feature (shit though it often was), they became part of the tragic process by which the Internet became centralised, and commoditised, and corporate, and just generally watered-down.

The amount of effort to “put something online” didn’t increase by a lot, but it increased by enough that millions probably missed-out on the opportunity to create their first homepage.

Note #26999

In my first few weeks at my new employer, my code contributions have added 218 lines of code, deleted 2,663. Only one of my PRs has resulted in a net increase in the size of their codebases (by two lines).

GitHub change summary showing +218 lines added, -2,663 lines removed.

I need to pick up the pace if I’m going to reach the ultimate goal of deleting ALL of the code within my lifetime. (That’s the ultimate aim, right?)

×

You MUST listen to RFC 2119

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

With thanks to Ruth for sharing this with me:

RFC 2119 establishes language around requirement levels. Terms like “MUST”, “MUST NOT”, “SHOULD”, and “SHOULD NOT” are helpful when coordinating with engineers. I reference it a lot for work, as I create a lot of accessible component specifications.

Because of this familiarity—and because I’m an ass—I fired back in Discord:

I want to hire a voice actor to read 2119 in the most over the top, passive-aggressive way possible
wait, this is an achievable goal oh no

It turns out you can just pay people to do things.

I found a voice actor and hired them with the task of “Reading this very dry technical document in the most over-the-top sarcastic, passive-aggressive, condescending way possible. Like, if you think it’s too much, take that feeling, ignore it, and crank things up one more notch.”

RFC 2119 is one of few RFCs I can identify by number alone, too. That and RFCs 1945 and 1866, for some reason, and RFC 2822 (and I guess, by proxy, 822) because I’ve had to implement its shitty date format more times than I’d like to count.

But anyway: if you’ve ever wanted to hear a (sarcastic, passive aggressive) dramatic reading of RFC 2119, Eric – and the actor he found – have got you covered!

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!