This form dynamically changes the labels for the Surname and Forename field based on the value of the Gender field. Wut?
Because a Male Surname is totally distinct and nothing like a Female Surname, I guess?!?
This form dynamically changes the labels for the Surname and Forename field based on the value of the Gender field. Wut?
Because a Male Surname is totally distinct and nothing like a Female Surname, I guess?!?
This is a repost promoting content originally published elsewhere. See more things Dan's reposted.
The moving image below is only 49Kb and has an incredibly high resolution.
It’s similar to a GIF but instead of showing moving images, it shows moving SVGs! The best part: Github supports these in their README.md files!
…
Got to admit, this is really cool and something I can see myself using a lot. So I installed the prerequisites:
brew install asciinemanpm install -g svg-term-cli
Then I gave it a go. I needed to use asciinema rec -f asciicast-v2 myfile.cast to record my screen into Asciinema‘s version 2 format,
because the new version 3 format isn’t yet supported by svg-term-cli (but there is at least an asciinema
convert command if you record in the “wrong” one).
Then I ran cat myfile.cast | svg-term --out myfile.cast.svg to convert that terminal recording into an SVG: I happened to be in a directory containing the source code of FreeDeedPoll.org.uk, so recorded myself running an 11ty development server with npm serve:
Amazing stuff.
Happy Polyamory Day y’all. (Plus max props to Petra without whom I’d have forgotten about it, like most years.)
Closest thing I did to celebrating it was going out to the pub last night for beer and food with my metamour, while our partner-in-common took our kids to see a film. Polyfam life isn’t always glamorous; but it is full of love.
I’m always keen to experiment with new ways to subscribe to my blog. Obviously RSS is the best and everybody who can use it should. But some people, for their own reasons1, prefer to learn about updates to their favourite sites via the Fediverse, or Facebook, or Telegram, or… I don’t know… LiveJournal or something (yes, those are all places you can follow this blog, if you really wanted to).
But I’m pretty sure there are some people who’d rather receive updates to my blog via WhatsApp. And now, they can. Here’s how I set up an RSS-to-WhatsApp gateway, in case you want to run one of your own2.
You will need:
Dan-Q/rss-to-whapi.cloud repository into your own GitHub account.
WHATSAPP_API_TOKEN: set to the token on your Whapi dashboard
WHATSAPP_CHANNEL: set to your newsletter ID (will look like 123456789012345678@newsletter) or group ID (will look
like 123456789012345678@g.us): you can get this from the Newsletters or Groups section of Whapi by executing a test GET /newsletters or GET /groups request4.
feeds.json file (a feeds.json.example is provided as a guide)
containing the URLs of the RSS feeds you’d like to subscribe to.
By default, the processor will run on-demand and every 30 minutes, but you can modify that in .github/workflows/process-feeds.yml. It’s configured to send the single oldest
un-sent item in any of the RSS feeds it’s subscribed to, on each run (it tracks which ones it’s sent already by their guids, in a "seen": [...] array in
feeds.json): sending a single link per run ensures that WhatsApp’s link previews work as expected. At that rate, you could theoretically run it once every 10 minutes and
never hit the 150-messages-per-day limit of Whapi’s free tier5), but you’ll want to work out your own optimal rate based on the
anticipated update frequency of your feeds and the number of RSS-to-WhatsApp channels you’re running.
You can, of course, run it on your own infrastructure in a similar way. Just check out the repository to your local system with Ruby 3.2+ running, run bundle to install the
dependencies, then set up a cron job or some other automation to run ./process_feeds.rb. Doing this could be used to hook it up to your RSS feed updating pipeline, for
example, to check for new feed items right after a new post is published.
1 Their own incomprehensible, illogical, weird reasons.
2 I hope that the title gives it away, but you can do this completely for free. So long as you keep your fork of the GitHub repository open-source then you can run GitHub Actions for free, and so long as you’re pushing out no more than 150 updates per day to no more than 5 different channels in a month then you can do it within Whapi’s free tier: that’s probably fine for a personal blogger, and there’s a reasonable pricing structure (plus some value-added extras) for companies that want to use this same workflow as part of a grander WhatsApp offering.
3 Setting this up requires giving Whapi access to your WhatsApp account. If you don’t like the security implications of that, you could get a cheap eSIM, set that up with WhatsApp, and use that account: if you do this, just remember to “warm up” your new WhatsApp account with some conversations with yourself so it doesn’t look so much like a spammer! Also note that the way Whapi works “uses up” one of the ~4 devices on which you can simultaneously use WhatsApp Web/WhatsApp Desktop etc.
4 Prefer the command-line? So long as you’ve got curl and jq
then you can get a list of your newsletters (or groups) and their IDs with curl -H 'Authorization: Bearer YOUR_API_TOKEN' -H 'accept: application/json'
https://gate.whapi.cloud/newsletters?count=100 | jq '.newsletters[] | { id: .id, name: .name }' or curl -H 'Authorization: Bearer YOUR_API_TOKEN' -H 'accept:
application/json' https://gate.whapi.cloud/groups?count=100 | jq '.groups[] | { id: .id, name: .name }', respectively.
5 Going beyond the free tier would require sending one message, on average, every 9 minutes and 36 seconds.
A couple of weeks ago I blogged about setting up a PO Box and adding postal mail to the ways you can contact me. I went for a “pay as you go” PO Box because I didn’t know if anybody would actually use it, but I’ve already received two delightful postcards and I couldn’t be more thrilled.
The first postcard came from Florence, whom I’d met on a forum where I’d helped them repair a troublesome RSS feed1.
The second postcard was from Rhys, whose guestbook I dropped a comment into after spotting that his 50 Before I’m 50 list contained a wish to learn a “genuinely cool magic trick”, for which I had a suggestion2.
The PO Box worked very well: I’m using UK Postbox principally because of their “pay as you go” rate (with a free tier in case you don’t receive any mail at all, which I figured was a risk) but I was later pleased to discover they’re a nice company in other ways, too. They scan the outside/one side of my mail as it arrives and I can optionally pay to scan the whole thing and/or to bundle and forward it on to me3.
I’ve started a new page to collect all the cards, including a (hopefully pretty-accessible) CSS-powered interactive “flipper” so you can turn them over, and I’m hopeful that I might attract a few more as time goes on. Getting physical mail from “Internet friends” helps make the digital world feel a little bit smaller, and I love it.
(If you’d like to send me a postcard too, I’d be so very grateful!)
1 Florence’s RSS feed was missing a <![CDATA[ ... ]]> block around some
embedded HTML, which was causing the HTML to be evaluated “as if” it were XML, which – not being XHTML – it failed to do.
2 My suggestion was a variation of Derek Dingle’s Too Many Cards that I’ve been performing all over the place: it’s an immensely satisfying trick to perform, requiring a challenging but achievable set of sleights and suitable to do without preparation and using a borrowed deck, which is pretty much the gold standard in card magic.
3 I’ve opted to have it forwarded: I’m wondering if I can combine all the postcards I get into a single poster frame or something: maybe a double-sided one so the whole thing can be flipped to show the text, not just the fronts?
This is a repost promoting content originally published elsewhere. See more things Dan's reposted.
…
In the 1980s and 1990s, when I was a kid, smoking was everywhere. Restaurants, bars, and a little before my time, airplanes!
The idea that people would smoke was treated as inevitable, and the idea that you could get them to stop was viewed as wildly unrealistic.
Sound familiar? But in the early 2000’s, people did stop smoking!
…
But a few years ago, the trend started to reverse. You know why?
Vaping.
Vape pens were pushed as a “safer alternative to smoking,” just like Anil is suggesting with Firefox AI. And as a result, not only did people who would have smoked anyways start up again, but people who previously wouldn’t have started.
…
I know it’s been a controversial and not-for-everyone change, but I’ve personally loved that Chris Ferdinandi has branched out from simply giving weekday JavaScript tips to also providing thoughts and commentary on wider issues in tech, including political issues. I’m 100% behind it: Chris has a wealth of experience and an engaging writing style and even when I don’t 100% agree with his opinions, I appreciate that he shares them.
And he’s certainly got a point here. Pushing “less-harmful” options (like vaping… possibly…) can help wean people off something “more-harmful”… but it can also normalise a harmful behaviour that’s already on the way out by drawing newcomers to the “less-harmful” version.
My personal stance remains that GenAI may have value (though not for the vast majority of things that people market it as having value for, where – indeed – it’s possibly doing more harm than good!), but it’s possible that we’ll never know because the entire discussion space is poisoned now by the hype. That means it’ll be years before proper, unbiased conversations can take place, free of the hype, and it’s quite possible that the economy of AI will have collapsed by then. So maybe we’ll never know.
Anyway: good post by Chris; just wanted to share that, and also to add a voice of support for the direction he’s taken his blog these last few years.
About twenty years ago, after a a tumultuous life, Big.McLargeHuge – the shared server of several other Abnibbers and I – finally and fatally kicked the bucket. I spun up its replacement, New.McLargeHuge, on hosting company DreamHost, and this blog (and many other sites) moved over to it1.
I only stayed with DreamHost for a few years before switching to Bytemark, with whom I was a loyal customer right up until a few years ago2, but in that time I took advantage of DreamHost’s “Refer & Earn” program, which allowed me to create referral codes that, if redeemed by others who went on to become paying customers, would siphon off a fraction of the profits as a “kickback” against my server bills. Neat!3
A year or so after I switched to ByteMark, DreamHost decided I owed them money: probably because of a “quirk” in their systems. I disagreed with their analysis, so I ignored their request. They “suspended” my account (which I wasn’t using anyway), and that was the end of it.
Right?
But the referral fees continued to trickle in. For the last seventeen years, I’ve received a monthly email advising me that my account had been credited, off the back of a referral.
About once a year I log in and check the balance. I was quite excited to discover that, at current rates, they’d consider me “paid-up” for my (alleged) debt by around Spring 2026!
I had this whole plan that I’d write a blog post about it when the time came. It could’ve been funny!
But it’s not to be: DreamHost emailed me last night to tell me that they’re killing their “Refer & Earn” program; replacing it with something different-but-incompatible (social media’s already having a grumble about this, I gather).
So I guess this is the only blog post you’ll get about “that time DreamHost decided I owed them money and I opted to pay them back in my referral fees over the course of eighteen years”.
No big loss.
1 At about the same time I moved Three Rings over from its previous host, Easily, to DreamHost too, in order to minimise the number of systems I had to keep an eye on. Oh, how different things are now, when I’ve got servers and domain registrations and DNS providers all over the damn place!
2 Bytemark have rapidly gone downhill since their acquisition by Iomart a while back, IMHO.
3 Nowadays, this blog (and several of my other projects) is hosted by Linode, whose acquisition by Akamai seems not to have caused any problems with, so that’s fab.
Back before PCs were black, they were beige. And even further back, they’d have not only “Reset” and “Power” buttons, but also a “Turbo” button.
I’m not here to tell you what it did1. No, I’m here to show you how to re-live those glory days with a Turbo button of your very own, implemented as a reusable Web Component that you can install on your very own website:
If you’d like some beige buttons of your own, you can get them at Beige-Buttons.DanQ.dev. Two lines of code and you can pop them on any website you like. Also, it’s open-source under the Unlicense so you can take it, break it, or do what you like with it.
I’ve been slumming it in some Web Revivalist circles lately, and it might show. Best Resolution (with all its 88×31s2), which I launched last month, for example.
You might anticipate seeing more retro fun-and-weird going on here. You might be right.
Now… be honest – how many of you pressed the “reset” button even though you were told not to?
1 If you know, you know. And if you don’t, then take a look at the website for my new web component, which has an “about” section.
2 I guess that’s another “if you know, you know”, but at least you’ll get fewer conflicting answers if you search for an explanation than you will if you try to understand the turbo button.
This checkin to GC88ZY9 The Devil's Quoits reflects a geocaching.com log entry. See more of Dan's cache logs.
A local landowner has (controversially) decided to start enforcing their ownership of the land surrounding the lake at Dix Pit, and has erected new fences and private property signs to deter trespassers. So this evening, the geopup and I took a walk to the GZ to check that it’s still an achievable find.
Good news! It’s certainly still possible (though sometimes boggy, in the winter!) to get to The Devil’s Quoits and log this virtual while using only the permitted footpaths, whether coming from either the North or the South.
You might find that your map hasn’t yet been updated to reflect the approved routes, but you shouldn’t struggle to get here. Just stick to the path and you’ll find the GZ. (And once I’ve seen how the local controversy resolves itself I’ll be sure to submit updates to OpenStreetMap to accurately reflect the eventual state of the paths around here!)
This is a repost promoting content originally published elsewhere. See more things Dan's reposted.
…
“Botsplaining,” as I use the term, describes a troubling new trend on social media, whereby one person feeds comments made by another person into a large language model (like ChatGPT), asks it to provide a contrarian (often condescending) explanation for why that person is “wrong,” and then pastes the resulting response into a reply. They may occasionally add in “I asked ChatGPT to read your post, and here’s what he said,”2 but most just let the LLM speak freely on their behalf without acknowledging that they’ve used it. ChatGPT’s writing style is incredibly obvious, of course, so it doesn’t really matter if they disclose their use of it or not. When you ask them to stop speaking to you through an LLM, they often simply continue feeding your responses into ChatGPT until you stop engaging with them or you block them.
This has happened to me multiple times across various social media platforms this year, and I’m over it.
…
Stephanie hits it right on the nose in this wonderful blog post from last month.
I just don’t get it why somebody would ask an AI to reply to me on their behalf, but I see it all the time. In threads around the ‘net, I see people say “I put your question into ChatGPT, and here’s what it said…” I’ve even seen coworkers at my current and formers employer do it.
What do they think I am? Stupid? It’s not like I don’t know that LLMs exist, what they’re good at, what they’re bad at (I’ve been blogging about it for years now!), and more-importantly, what people think they’re good at but are wrong about.
If I wanted an answer from an AI (which, just sometimes, I do)… I’d have asked an AI in the first place.
If I ask a question and it’s not to an AI, then it’s safe for you to assume that it’s because what I’m looking for isn’t an answer from an AI. Because if that’s what I wanted, that’s what I would have gotten in the first place and you wouldn’t even have known. No: I asked a human a question because I wanted an answer from a human.
When you take my request, ignore this obvious truth, and ask an LLM to answer it for you… it is, as Stephanie says, disrespectful to me.
But more than that, it’s disrespectful to you. You’re telling me that your only value is to take what I say, copy-paste it to a chatbot, then copy-paste the answer back again! Your purpose in life is to do for people what they’re perfectly capable of doing for themselves, but slower.
How low an opinion must you have of yourself to volunteer, unsolicited to be the middle-man between me and a mediocre search engine?
If you don’t know the answer, say nothing. Or say you don’t know. Or tell me you’re guessing, and speculate. Or ask a clarifying question. Or talk about a related problem and see if we can find some common ground. Bring your humanity.
But don’t, don’t, don’t belittle both of us by making yourself into a pointless go-between in the middle of me and an LLM. Just… dont’t.
I really liked Only Murders in the Building. It started with a fun premise. It grew into something hilariously self-aware. I’d recommend it.
But man, the fifth season had the most-disappointing reveal/conclusion imaginable.
Hoping the promised sixth season does better.
The younger child and I were talking about maths on the school run this morning, and today’s topic was geometry. I was pleased to discover that he’s already got a reasonable comprehension of the Pythagorean Theorem1: I was telling him that I was about his age when I first came across it, but in my case I first had a practical, rather than theoretical, impetus to learn it.
It was the 1980s, and I was teaching myself Dr. Logo, Digital Research‘s implementation of the Logo programming language (possibly from this book). One day, I was writing a program to draw an indoor scene, including a window through which a mountain would be visible. My aim was to produce something like this:
My window was 300 “steps”2 tall by 200 steps wide and bisected in both directions when I came to make my first attempt at the mountain.
And so, naively, starting from the lower-left, I thought I’d need some code like this:
RIGHT 45 FORWARD 100 RIGHT 90 FORWARD 100
But what I ended up with was this:
I instantly realised my mistake: of course the sides of the mountain would need to be longer so that the peak would reach the mid-point of the window and the far side would hit its far corner. But how much longer ought it to be.
I intuited that the number I’d be looking for must be greater than 100 but less than 250: these were, logically, the bounds I was working within. 100 would be correct if my line were horizontal (a “flat” mountain?), and 250 was long enough to go the “long way” to the centrepoint of the window (100 along, and 150 up). So I took a guess at 150 and… it was pretty close… but still wrong:
So I found my mother and asked her what I was doing wrong. I’m sure it must have delighted her to dust-off some rarely-accessed knowledge from her own school years and teach me about Pythagoras’!
The correct answer, of course, is given by:
The answer, therefore, is… 141.421 (to three decimal places). So I rounded to 141 and my diagram worked!3
What made this maths lesson from my mother so memorable was that it fed a tangible goal. I had something I wanted to achieve, and I learned the maths that I needed to get there. And now it’s impermeably etched onto my brain.
I learned the quadratic equation formula and how to perform algebraic integration by rote, and I guarantee that it’s less well-established in my long-term memory than, say, the sine and cosine rules or how to solve a simultaneous equation because I’ve more-often needed to do those things outside of the classroom!
So I guess the lesson is that I should be trying to keep an eye out for practical applications of maths that I can share with my kids. Real problems that are interesting to solve, to help build the memorable grounding that latter supports the more-challenging and intangible abstract maths that they may wish to pursue later.
Both kids are sharp young mathematicians, and the younger one seems especially to enjoy it, so feeding that passion feels well-worthwhile. Perhaps I should show them TRRTL.COM so they can try their hand at Logo!
1 You know the one: the square of the triangle’s hypotenuse is equal to the sum of the squares of the other two sides. You could conceivably know it by some other mnemonic, but the essence is that if you know the lengths of two sides of any right-angled triangle, you can derive the length of the third with some moderately-simple arithmetic.
2 Just one way that Logo is/was a cute programming language was its use of “steps” – as in, turtle-steps – to measure distances. You might approximate them as pixels, but a “step” has meaning even for lines that don’t map linearly to pixels because they’re at wonky angles, for example.
3 I’d later become unstuck by rounding, while trying to make a more-complex diagram with a zig-zag pattern running along a ribbon: a small rounding error became compounded over a long time and lead to me being a couple of pixels off where I intended. But that’s another story.
This is a repost promoting content originally published elsewhere. See more things Dan's reposted.
…
I’ve found my relationships are healthier when I keep my offline-first relationships offline (e.g. not following each other on Facebook or Instagram) — following someone’s Instagram makes it feel like I know what’s going on with them without interacting. Following offline friends on social media can reduce what used to be normal friendships into parasocial relationships.
…
I suspect bringing offline relationships online is responsible for a lot of the loneliness people feel — social media looks like you have all these friends… but no one you could ask to feed your cat while you’re away, because one-to-many broadcasting replaced direct interactions 😿 Essentially, the offline relationship became an online one.
…
Tracy’s observations here are absolutely excellent, and spot-on. I’ve absolutely experienced some of the problems she’s described when trying to use social media to supplement “offline-first” relationships.
Unfortunately, unilaterally following Tracy’s segregation strategy doesn’t necessarily guarantee that you’re going to avoid the problems she’s identified. That’s especially true if you haven’t always followed her guidance!
Like many folks I know, I joined Facebook when it became available to me and used it to connect with most of the people I knew in the real world. And certainly, this caused a problematic blurring of our online and offline interactions! People in my friend group would switch to “broadcast mode”, not reaching out to query one another’s status and wellbeing, and coming to assume that anything they’d shared online would be universally known among their friends (I was definitely guilty of this myself; sometimes I still am!).
I dropped Facebook about 14 years ago, but it’s still the case that my offline-first friends will sometimes assume that I’ll know something that they posted there (or to some other platform). And it’s still the case that I’m not as good as I could be at reaching-out and checking-in. (At least that latter point is something actionable that I can work with, I suppose.)
After thirty years online, it seems to me that converting an online relationship to an offline one is a rarity. But converting one born-offline into an online one, or a “hybrid” one that somehow exhibits some of the worst characteristics of both, is distressingly easy… even when you don’t intend it.
Tracy’s post’s got much more to say, and I thoroughly recommend it. I don’t know that I’m personally ready to make as firm a distinction between my “online” and “offline” friends as she seems to – there are aspects of the hybrid model that actually work quite well for me, much of the time – but I like having a framework around which to think and talk about the differences.