The Edge of Burnout

This post is secret; you can only find it via my RSS feeds (and places which syndicate them). It's okay to talk about it or link to it, though. Thanks for being part of RSS Club!

I imagine that many people take a sabbatical or other extended break from work in an effort to avoid (or recover from) burnout.

But obviously that’s not the way I fly. Clearly my game’s a bit different.

Cropped copy of Giulio Romano's Fall of Icarus, 16th century pen and brown ink depiction of Daedelus watching in horror as his son Icarus, who flew too close to the sun, falls away from him.
Something something Icarus something something.

My project to move Three Rings servers, which I’d written about once or twice before I completed it on Wednesday, has weighed heavily in my mind my many moths, and has almost-completely occupied it since the start of my sabbatical. Even before that, the project was “owned” by a different volunteer at Three Rings from whom I took over after their progress stalled (their life got in the way – life has a habit of doing that – and it’s perhaps only because I expected to spend several months away from my “day job” that I felt confident to take over from where he left off), and I’ve had a peripheral involvement in it since… well, a long while ago.

And it turns out it’s been hard.

Dan, dressed in white, half-smiling, raises a can of Budweiser beer as he sits alongside another man, dressed in black, raising a glass of a clear liquid.
Had I fully-appreciated the scale of the “server move project” I was taking over when the reins were passed to me… I might have selected a beverage with a higher ABV…

The work… is impactful: it paves the way for the next generation of Three Rings‘ ability to grow and support more tools, more volunteers, and more voluntary organisations… as well as making a clean break with some architectural baggage we’d picked up over our last, y’know, twenty-two fucking years of providing this service. That impact might not be felt on day one (although I’m already hearing good thing about real-world performance gains), but it supports the long-term growth and stability of this wonderful system: it’ll pay off in time.

But the weight of the problem didn’t just come from the eventual benefit it’d one-day provide… it came from the risk of failing. I’m a developer first and a devops person second, and I’ve made my fair share of mistakes in getting to the point where I’m at long last as comfortable with the latter as I am with the former. But the cost of a mistake today is orders of magnitude more that what it would have been, say, one and a half to two decades ago. Three Rings isn’t just “some tool that supports volunteering”, any more: it’s become a critical part of charity infrastructure supporting multiple volunteer-years of effort every single day. There are organisations who’ve never known any other way of working, who absolutely depend upon it.

If Three Rings completely fails today then (for a hopefully-short period while they adapt to the change): soup kitchens and food banks struggle to run, suicide helplines can’t get enough counsellors onto calls, community libraries can’t coordinate their volunteers and fail to open their doors when they should, motorcyclists don’t get told which hospitals to deliver vital blood donations to… oh, and that one volunteer-run pole-dancing class that uses the system doesn’t schedule a lesson this week, I guess?

My point is: if I fucked-up the specification of a server, of the strategy for a low-downtime data transfer, or broke the DNS configuration mid-flight… and didn’t catch my mistake in time… then it’s not inconceivable that somebody could die.

Which is a strange feeling when you’re doing voluntary work on a computer system that you invented mostly to prove to yourself that you could, on a lazy weekend when you were barely into your twenties. It seems that somewhere along the journey, the stakes can change.

A collection of monitoring/uptime graphs, covering the broad topics of Application, Beta, Backups, and Supplementary, with mostly-green bars throughout.
You can have all the monitoring and notifications in the world and still sleep badly at night, it turns out.

It turns out that the pressure was getting to me for a while there. That may have been evidenced to others by the huge sigh of relief that I’m sure my fellow volunteers on our “launch party” Zoom call heard when the servers were moved and (almost) everything worked perfectly first time. But for me, the realisation came a little over a day later.

A thing came up. The specifics aren’t important, but the thing that came up – shortly after everything went so wonderfully well and the new Three Rings server architecture was deployed – fell firmly within the categories of (a) “family/home life” and (b) “this thing needs somebody to champion it for a few weeks and make sure it gets sorted out”. And as the rusty gears of project management started to turn within my brain started I began thinking about what it’d take to be the one to pick-up-and-run with this new piece of work… and I realised that I simply didn’t have enough spoons.

Even thinking about what to do next was exhausting. I simply couldn’t bring myself to do it.

That’s when I realised, yesterday afternoon, that I’d allowed myself to stray perilously close to burnout.

A matchstick, burned almost to the end.
Don’t be fooled by my tone. This is a healthy observation. Spotting when I to slow down before crashing is infinitely superior to, y’know, afterwards.

My mistake these last few weeks has been to focus on time, and the superfluity of it with which I imagined myself to have.

Being on my sabbatical, I figured that I’d temporarily gained up-to-40 hours a week for “free”, and reasoned that I could just bolt some significant portion of that on top of the up-to-10 hours a week I was already giving to Three Rings. But while time works like that, it’s not the only resource that you “spend” when you’re giving your entire focus to a deep, detailed, and complicated project. In fact, focussing on time is incredibly deceptive, because it tricks you into completely sidestepping any consideration for the mental effort your mind’s engaged in. An effort that takes place even in your “downtime”.

A critical project with high stakes and which stokes your passion can quickly grow into something that occupies your thoughts when you’re trying to unwind… and when you’re trying to socialise… and when you’re trying to sleep. I’d been burning hard at my server move project for months without letting my brain take a break, and it took until the job was complete before I stopped and thought for even a moment that “hey, that was fucking exhausting wasn’t it?”

So yeah. I’mma thinking I’ll take a few days off of doing “projects”. Quick wins, tasks that take less than a day and can be put down at any time… those are fine. But anything that can’t be set aside and forgotten about probably doesn’t belong in my head until at least next week.

Tomorrow Later today, but after I’ve slept… I’m going to try to have a day in which I do very little: some childwrangling, of course, some fun activities, some socialising with friends in the evening. And then see if I can carry on that vibe throughout the weekend. For once in my life, to stop picking up new things, and just coast for a while with the things I’m already carrying.

I’ve learned the hard way that trying to power-on through this particular kind of tiredness is a recipe for disaster. I’m proud that I’ve (at long last!) gained a level of self-awareness to spot that I was on a path to burnout without actually reaching that place of total uselessness. So now it’s time to stop, recharge, and then start moving again.

Nice work, me.

× × × ×

NextPress is a Forking Awful Idea

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

This post is secret; you can only find it via my RSS feeds (and places which syndicate them). It's okay to talk about it or link to it, though. Thanks for being part of RSS Club!

We’re in the process of  replicating all of WordPress to a modern tech stack (Node.js & Next.js) called NextPress.

🤨 Wow.

I get that forking WordPress is hip right now because of, y’know, drama. (But it needn’t be, because there’s already a great fork in the form of ClassicPress, if that’s your jam.) Forking’s fine.

I even get the idea behind making semi-compatible alternatives that aren’t forks: I’ve kinda done myself on a couple of occasions! That’s what OpenPress is trying to do, and they seem to be going in a reasonable direction, except for the whole “designed for AI integration” thing, whatever that means. Interestingly: NextPress, like OpenPress, seems to use a .ai TLD?

Anyway: NextPress seems to be… something else entirely. Apparently their effort is to reimplement WordPress as-is… but in JavaScript instead of PHP. Their principle argument for doing so seems to be performance… to which I’d say: why not Go then?

NodeJS isn’t significantly faster than PHP at this kind of task; the bottleneck is rarely the language but the implementation (and the database); a high-performance site should be using static caching regardless of the language, etc. etc. Reimplementing an application in a functionally-identical way but in a different language is an arduous job, and in this case it doesn’t even seem like it’ll provide anything more than the tiniest benefit! It’s like winning the battle to lose all the wars.

There’s lots of ways in which WordPress can be improved. But I’m not convinced that NextPress or OpenPress represent good approaches to doing that, and I’m not sure about AspirePress either: right now these projects seem to have produced very little, with the possible exception of OpenPress which is moving along slowly. I’m not entirely sure what FreeWP is trying to achieve (I watched the video – man, I’d have preferred text – and I agree with many of Kellie Peterson’s points… but I still don’t have a clue what she’s trying to achieve!).

That all sounds like I’m dumping on forks. That’s not the case. Did I mention that ClassicPress is great? I’d be using it myself if it weren’t for the fact that I use one plugin that’s incompatible with it! Maybe some day.

I guess what I’m dumping on is the idea that the best way – or even a tolerable way – to fix WordPress’s shortcomings involves re-writing it in a different programming language. If you’re going to start over, you might as well start over better: I’ve long been impressed by Kirby, for example. NextPress, though? I’ll pass.

WordStress

This post is secret; you can only find it via my RSS feeds (and places which syndicate them). It's okay to talk about it or link to it, though. Thanks for being part of RSS Club!

Ugh, I’ve had enough of the WordPress community drama that’s going on right now. I appreciate that I’ve contributed and amplified, and you can call me a hypocrite if you like, but sometimes you just need to step away and get on with things.

  • I love WordPress. I’ve been blogging since 1998 and on WordPress since 2004. There are few or no pieces of software I’ve used as long. It’s got some sharp edges and smells1, but it’s still a great CMS and an excellent blogging platform.
  • I love open source. About once every 4 years I contemplate switching platforms for this blog. I often try out a few; sometimes I’ve even implemented like-for-like themes and functionality only to throw them away. The closest I’ve got to switching has been when I tried ClassicPress2, Kirby3, and a homegrown toolchain that eventually grew into Bloq (which I must open source the rest of some day). But it’s always to an open source solution.
  • I love Automattic. I’ve worked there for five years, this week4, and that’s primarily because I get to work on cool open source things that help the world, alongside smart and principled folks I get to learn from all the time. And I truly believe that Matt has the best interests of both Automattic and WordPress at heart, even when he sometimes trips over his own tongue and courts controversy5 by choosing his words, or his timing, badly.
Modified screengrab from Futurama; Fry walks towards a sign that reads "0 Hours Since Last WP Drama"
In this metaphor, Fry is played by Matt, but his understudy is, y’know, everybody else who’s made a scene. Me included.

But man, the drama’s gotten out of control. It’s at the point where it’s gone from a niggle to a distraction. It’s stressful.

And I’ve got colleagues who’ve been affected by it much more than me: just today, a colleague announced that he’d be departing from his role at Automattic after close to nine years, and among the reasons he cited was a mention of the stress and uncertainty created by, y’know, recent stuff. He’s clearly not the only one.

I just want to get back to writing blog posts about whatever random shit I’m thinking of when I’m not at work, and making awesome (and often open source) WordPress-adjacent software when I am at work. But right now, I can only achieve that if I put my fingers in my ears and close my eyes and sing “la la la la la” at the top of my lungs.

Ugh.

I look forward to a time with less WordPress drama. But, sadly, I don’t think that’s coming any time soon.

Footnotes

1 Naming structures, legacy hooks, 50% of all plugins, fucking wpautop, etc.

2 I don’t use Gutenberg functionality on this blog anyway, and I like their media library, but I can’t make VaultPress JetPack Backup – which has saved my bacon a few times – work on it.

3 I’m not impressed with the plugins for commenting and webmention integration in Kirby, yet. I’m also not a huge fan of their licensing model; I’m happy to pay for a license (I have paid for one, though I’m not actively using it!), but I don’t want to feel forced to pay for one. That said, I’m contemplating trying it out on my family intranet as a P2-like tool.

4 Which means I’m eligible for my first sabbatical – that’s crazy! – more on that later.

5 Hey, we’ve all done it. Well, any of us with enough influence and attention in our field, anyway. It’s only a matter of time; that’s part of being human!

×

Thanks, RSS Readers

This post is secret; you can only find it via my RSS feeds (and places which syndicate them). It's okay to talk about it or link to it, though. Thanks for being part of RSS Club!

Fellow Automattician and RSS Club member Matthias Pfefferle wrote a post yesterday (in German, but automatic translation clearly gets the gist of it), observing that Kev Quirk‘s RSS feed contains

<p class="feed-email-link">
  Thanks for reading this post via RSS. RSS is great, and you're great for using it. ❤️
</p>
Kev’s RSS feed contains this message appended to the content of each post

Matthias went on to mention a snippet of WordPress code shared by Jeremy Herves, which he uses to achieve a similar thing but with a randomly-selected one of eight different messages of thanks:

/**
 * Display a nice welcoming message to folks reading posts via RSS.
 *
 * Kudos Kev Quirk for the idea!
 *
 * @param string $content The current post content.
 *
 * @return string
 */
function jeherve_welcome_rss_readers( $content ) {
        $welcome_messages = array(
                'Thanks for reading this post via RSS. RSS is great, and you’re great for using it. ♥️',
                'Congratulations on being an RSS reader! You are part of an elite group of people who know how to stay updated in style.',
                'Hey there, RSS reader! You’re one of a special few, choosing this old-school yet awesome way of staying informed. Kudos!',
                'You are a true RSS aficionado! While others are drowning in social media noise, you enjoy the simplicity and control of RSS. Congrats!',
                'RSS readers like you are the unsung heroes of the internet. Keep up the good work!',
                'You are a master of efficiency! By using RSS, you save time and avoid distractions. 👏',
                'RSS readers like you are the secret sauce of the internet. Keep rocking and staying informed!',
                'Hey there, RSS reader! You’re cool. Keep being awesome! 😎',
        );

        $welcome_message = $welcome_messages[ wp_rand( 0, count( $welcome_messages ) - 1 ) ];

        return sprintf(
                '%1$s<p>%2$s</p>',
                $content,
                $welcome_message
        );
}
add_filter( 'the_content_feed', 'jeherve_welcome_rss_readers' );
Jeremy’s solution.

Like Jeremy, I was inspired by Kev Quirk and have been appending a message onto my posts in RSS feeds for a while. My approach is a little different, though:

  1. Rather than a random number, I use the post ID modulus the number of random messages to choose which “random” message to select. This means that a given post has a consistent message, which minimises the risk that a post will be detected as having been “changed” by a feed reader, and it also helps to reduce “runs” of the same message after multiple posts in a row. I have a prime number of random messages to reduce the risk that patterns in my posting (e.g. a series of posts, without drafts, each with exactly one image, like my recent and ongoing Bleptember series) end up introducing a predictable pattern to the messages.
  2. I only use the random message if a specific one is not provided via postmeta. I’ve got a metadata field in my editing interface which, if filled, overrides the random message. This lets me put a specific or targetted message in, usually/especially if I’m talking specifically about RSS-related things!
WordPress postmeta field for "RSS Thanks".
When I author a post, sometimes I’ll override the message that appears for that post.

Here’s the code I use to inject the messages into my RSS feed:

function q23_rss_thanks_default( $post ) {
  $rss_thanks_messages = [
    "💖 RSS is fantastic, and so are you for using it. 🎆",
    "👏 Congratulations on being an RSS user. 🎉",
    "🥰 You're reading this post via the RSS feed. That makes you one of the best people on the Internet! 🏆",
    "📰 Using a feed reader is the best way to read my blog posts. How clever you are to know that! 🚀",
    "🌟 You're reading this post via the RSS feed, you star! 🌠",
    "🪄 Feeds are wonderful, and you're a wonderful person for using them. 🔮",
    "❤️‍🔥 You're reading this post via the RSS feed. You're on fire! 🔥",
    "🧨 RSS is dynamite! Thanks for subscribing to my blog. 💥",
    "🤘 You're subscribed to DanQ.me using the RSS feed. You rock! 🎸",
    "🕵️ Subscribing to DanQ.me's RSS feeds means that you'll get to see secret bonus posts not publicised on the main site. Clever you! 🧠",
    "🧡 I love RSS feeds. And I love you for using them. 💙",
    "🎗️ Using RSS feeds is a great way to keep up-to-date with my blog. Thanks for subscribing! 🤗",
    "🦸 You're my hero! (For using RSS to follow my blog.) 🥇",
  ];
  $post_id = intval( $post ? $post->ID : 0 );
  return $rss_thanks_messages[ $post_id % count( $rss_thanks_messages ) ];
}

function q23_rss_thanks( $content ) {
  global $post;
  $rss_thanks_message = get_post_meta( $post->ID , 'rss_thanks_message', true );
  $rss_thanks_message = empty( $rss_thanks_message ) ? q23_rss_thanks_default( $post ) : $rss_thanks_message;
  return $content . "<p style=\"margin-top: 0.5ch; padding-top: 0.5ch; border-top: 1px solid #ccc;\">$rss_thanks_message</p>";
}

add_action( 'the_content_feed', 'q23_rss_thanks' );
Note my use of intval( $post ? $post->ID : 0 ) to get the post ID, % count( $rss_thanks_messages ) to get it-modulus-the number of messages, and my get_post_meta and empty( ... ) check to allow post metadata to override it. Oh, and that code is CC0/public domain, if you want it.

Regardless of whether or not you love RSS as much as I do, thanks for reading my blog via RSS!

×

RSS Club: Draw Me A Comment!

This post is secret; you can only find it via my RSS feeds (and places which syndicate them). It's okay to talk about it or link to it, though. Thanks for being part of RSS Club!

One rainy weekend a few weeks ago I wrote a really, really stupid WordPress extension, and I think it might finally be time to show it to the world (and open-source it, in case anybody wants a copy of their own).

But before I do that, I’d like you – yes, you – to help me test it out and check that it doesn’t break my blog too much! 🤞

WordPress dropdown box 'Allow Drawn Comments?' with options 'No', 'Yes', and 'No, but retain historical'. 'Yes' is selected.
This might be a bad idea. 🍆

The extension replaces the comments form’s <textarea>, on selected posts, with a <canvas> and some code1 to let you draw me a picture instead of typing a comment. You’ll be assigned a random palette of colours2: perhaps see if you can think of something to draw that makes use of the colours you have available?

Draw me something you can see. Draw me something abstract. Draw me something thoughtful. Draw me something scrappy. Just scrawl your thoughts in your own handwriting. Draw whatever you like3.

Comment by Dan Q with grey rainclouds and the message everybody is an artist.
The tools I’ve provided are neither good nor easy-to-use, and that’s deliberate: it helps level the playing field between the talented artists and us regular Joes.

Naturally, the comments section below might be NSFW. That’s always true, I suppose, but perhaps doubly-so today.

Anyway: I hope that you’ll scroll down and draw me a picture. Everything should get piped through my usual moderation queue so if you’re not a regular commenter you might find that your drawing doesn’t appear rightaway.

Comment by Dan Q an RSS logo and the words 'RSS Club'
You’re among the people who get to see this thing first. Grab your paintbrush!

I might copy some of the drawings below to my upcoming blog post publicly announcing the feature. If you don’t want me to do that with your drawing, put a note in the “Name” field – e.g. put “(private)” at the end of your name! – so I know not to.

Now! Scroll down and draw me something!4 🎨🖌️

Update: I’ve made a public release including sharing the source code, and there’s more community pictures on it!

Footnotes

1 Obviously this silliness requires JavaScript, but in the spirit of progressive enhancement you’ll still get a classic comment form if you don’t.

2 Don’t like the colours you’ve been assigned? Wait until somebody else comments, or 20 minutes, and it’ll change. You can’t just change it client-side though, you sneaky hacker: the colours are generated server-side and signed with a salted hash to prevent tampering!

3 I appreciate that when I try this out with a wider audience I’ll probably see a lot of penises. If you want to draw a penis, I suppose you can, but please don’t.

4 If you really want to send me some text, maybe turn off JavaScript for a few minutes, drop me a Webmention, or reach out by email, Fediverse, or whatever.

× × ×

Recovering from Childhood Sexual Trauma

This post is secret; you can only find it via my RSS feeds (and places which syndicate them). It's okay to talk about it or link to it, though. Thanks for being part of RSS Club!

Three decades ago, as a child, I was a victim of sexual abuse.1

For most of those decades, I wouldn’t have told you about it. I couldn’t have. By a variety of denials, distortions, and disassociations, for the vast majority of my life I repressed, rationalised, and reframed what happened to me; hiding the truth behind a series of psychological defences.

At one point, for example, I’d internalised the events as both consensual2 and unimportant… to the extent that I intellectualised the fact that I wasn’t seeking nor receiving help for a clearly-traumatic experience as evidence that it wasn’t really wasn’t a big deal.

Silhouette photograph of the head of a plain wooden mannequin, wearing a blindfold improvised from a strap of red cloth wrapped repeatedly around its head. Adapted from a photograph by David Underland.

By a later point – and for most of my adult life – the mental wound was wrapped in so many overlapping layers of shielding it became nearly impossible for me to reach the memories at all. And where I could, it felt like a half-remembered dream.3

Without going into detail about what precipitated it, suffice to say: I ended up in therapy. I’ve seen several rounds of therapy over the last few years, punctuated by “homework” periods of exploration by myself, or with on-demand help from specialised services. My initial goal was to find a safe environment in which to unwrap that long-hidden psychic injury, to allow myself to grieve and, perhaps, begin to heal.

A challenge I faced right from the start was a nagging doubt that I really had made the whole thing up. That none of it was real. That I was wasting my time and everybody else’s, chasing the tail of a dream.

My journey of proving to myself that my recollection could be trusted was an odyssey in itself:

Photograph showing a suburban street in a Northern town, shortly after sunrise. The belittered street is worn and the decrepit husk of a telephone box stands outside an abandoned store front.

It involved revisiting places from my childhood, physically walking in the footsteps of my younger self: one foot firmly in the safety of adulthood while the other stepped tentatively into a childhood reverie.

It involved Subject Access Requests to the NHS followed by hours of poring over ancient notes, handwritten by doctors4, faxed, partially-censored5, then re-scanned for delivery to me.

Scanned, partially-censored NHS letter addressed to Dr A Payne, 26 November 1991, from Dr Stickle. Regarding "Daniel Huntley", it reads: I saw this boy with [redacted], Social Worker, at Bickerstaff House on 2 October 1991. The appointment was arranged at [redacted] request. The remainer of the letter has been cropped away.

It involved awkward and tearful conversations with people whose circumstantial recollections of events on the fringes of my memories helped narrow down a timeline. Helped show me what was real. Helped me to at last be able to say out loud the truth:

Three decades ago, as a child, I was a victim of sexual abuse.

Since then, my recovery has had a different focus: “joining the dots”. Even though I spent my teens, twenties, and most of my thirties unable to consciously comprehend what happened to me6, it seems inconceivable that my experience won’t have unconsciously shaped my later life.

Being unable to conclusively say how it did so – or rule out how it didn’t – is uncomfortable. I’m working on that.

Was my vulnerability to falling into an abusive relationship as an adult foreshadowed by my experience as a victim of sexual abuse as a child? What other connections can be found in my life, my personality, my presentation, my sexuality, my identity, my outlook…?

Not to go all Sliding Doors, but: who would I be had one pivotal moment in 1991 gone differently? And would that be a more… authentic “me”?

Two abstract constellations of stars drawn onto a picture of stars over the hills as the last of the sunlight begins to vanish.

You might rightly ask why I’m blogging this. The answer is integrity.

I’ve been blogging for more than half my life, and it simply feels inauthentic to avoid writing about this. I want there to exist a post – this post – that one day, maybe, I can link back to. From a post, perhaps, in which future-me recontextualises this point in my life through the lens of hindsight. I’d feel dishonest to conceal one of the most-significant things I’ve been up to these last few years!

But this post’s publication is artificially limited. It won’t appear on my recent posts lists, nor get syndicated to a half dozen different social channels. You can share it or linking to it or talk about it – those things are all fine – but I just don’t want it to be dominate my homepage, overshadowing whatever I write next. People who just casually drop by my site don’t need this post in their face!

You chose to pass the content warning. You chose to read this far. And I’m really grateful that you did. Because now you get to be part of the story of my recovery, too. If hypothetical future-Dan links back here one day, you’ll know that you were a small part of the journey I took to get there. So: thanks.

I’m still “recovering”. But I’ve come a long way over the last four or so years, and the hardest parts are, I’m confident, now behind me.

Footnotes

1 Don’t get hung up on terminology. Even legally-speaking, definitions vary: today, it might be described as kidnapping and sexual assault, but these are terms whose meaning has changed in the interim. Again, though: the terminology’s not important.

2 Again, I’m not interested in getting hung up on terminology. But in the unlikely event that it needs stating: a ten-year-old is neither legally nor developmentally competent to consent to sexual activity with an adult. Fucking obviously.

3 I spent the longest time in a state of cyclical reasoning: I must have completely imagined it, because if it had really happened, then I’d be traumatised, and if it was that big I’d be able to remember it clearly, right? This outermost line of psychological defence stood impenetrable for twenty years.

4 The oft-told joke about doctors’ handwriting becomes significantly less-funny when each sentence deciphered is a fragment of a story a child was too hurt to give voice to himself, too scared to share in a way that he would be understood.

5 Over-zealous data handlers, fresh from their GDPR compliance courses, for some reason saw fit to black out my parents’ names from some (but not all) of the documents I received in response to my SAR. Like I wouldn’t know who was meant when they wrote, for example, “Daniel was brought in by his mother, [redacted], on 19 June 1991”!

6 Perhaps-unsurprisingly, my memories “around” the period during which I was victimised have long been shaky, too, compared to my earlier and later childhood.

× × × ×

Not-stalgia

This post is secret; you can only find it via my RSS feeds (and places which syndicate them). It's okay to talk about it or link to it, though. Thanks for being part of RSS Club!

I first met my now-metamour JTA 19½ years ago (the week after next).

For most of that time I’ve been aware of, and have ocassionally mocked, his capacity for nostalgia, which is so strong that he’s able to look back on things that he never even experienced in the first place: he still wants his eleven days back, for example.

Screenshot of the game Last Call BBS, showing a fictional operating system initiating a dial-up connection to a BBS; a game of Solitaire can be seen in the background.
This post might have been inspired by Last Call BBS, which incidentally is on sale on GOG and Steam this week…

But his demonstrable nostalgia for technology (even from before his time) is something I really appreciated when it gave me a “buddy” with whom to watch BBS: The Documentary (and Get Lamp) many years ago. Despite having missed out on the BBS scene and only brushed the edges of text based adventures, he can really “get” the enthusiasm for it. And that’s awesome.

Anyway: if you’ve not tried Zachtronicsfinal game Last Call BBS yet, it’s worth a look. At least: it is if you either have fond memories of trading warez on clandestine dial-in microcomputer systems or else have a love for that whole BeOS aesthetic and want to experience the 90s dial-up world one last time (in a rose-tinted way)!

Update: I suppose if I’m talking about nostalgic tech, I should point out that this post is available over Gemini (gemini://danq.me/posts/not-stalgia), Gopher (gopher://danq.me:70/0/not-stalgia), and even Finger (run finger not-stalgia@danq.me at your favourite terminal…).

×

A Little Redesign

This post is secret; you can only find it via my RSS feeds (and places which syndicate them). It's okay to talk about it or link to it, though. Thanks for being part of RSS Club!

I’ve soft-launched a bit of a redesign on DanQ.me: the old one was getting a little stale, and I wanted space to try out some new ideas!

Screenshot showing the homepage of DanQ.me. The headline post is "How cool are Silo's credits?"
The new design is squarer, flatter, and fluidly-responsive (without breakpoints).

A major “theme” to my new design has been technical simplicity and performance. WordPress is great as a CMS, but the fact that it’s so easy to install “just one more plugin” to solve a problem can leave some WordPress sites feeling a little bloated. Plus, heavyweight sites seem to be the norm these days, sadly!

So I’m proud to have –

  • Almost halved the number of WordPress plugins in-use from 35 to 18. (Of those 18, two are mine.)
  • Dramatically reduced the number of scripts and stylesheets injected into the frontend by plugins from 7 to 0. (Virtually all the plugins that remain are for backend functionality.)
  • Halved the total Javascript payload of a typical page from 8.3kb (compressed) to under 4kb (uncompressed, with full comments).1
  • Made the Javascript and CSS that remain so small that they can be inlined, in their entirety, into each page, and still fit into a typical TCP slow start window.2
  • Re-encoded most of the images as WebP for browsers that support it.3

What else? Lots of things that I’d been meaning to do for ages, but wanted a clean slate for:

Screenshot showing a "footer" area from a checkin post, showing links to other posts, a map showing the location (in Athens) of the checkin, tags, and syndications.
Ignoring the nice new maps for a moment: I’m pretty pleased with these <details> elements, enhanced with a little stylistic CSS.
  • Improved accessibility, especially with regard to colour contrast.
  • Switched out the maps that appear on checkin posts so they’re precached images from OpenStreetMap rather than Google Maps.
  • Made my HTML nicer to read in View Source mode.4
  • Added some new static pages: a colophon to explain how the site works, a summary of the implications of the license I publish under, etc.
  • Added a second font (oooh!), for headings. I’m still not 100% convinced by it.
  • Made it easier to see how people can reply to my posts, including by email.
  • Added code to discourage search engines from indexing “RSS Club” posts, like this one!
  • And lots more!

My aim is not to deliver this new generation of my site and have it be “complete” for a few years, like on previous ocassions.

A blurred "todo" list; about half the items, mostly towards the top, are done.
Somehow, my “things to do while redeveloping the site” list has gotten longer as I ticked items off!

Instead, part of the reason I’ve gone for a blank slate is to try to make it easier for me to do some “personal website gardening” more often. Lately I’ve written a lot of content… but I haven’t done much with my code. My digital garden has been delightful to relax in, but unruly to cultivate. A fresh start makes it easier to work on new things.

Footnotes

1 All Javascript remains optional, and the site works fine without it. Progressive enhancement for the win! Specifically, the Javascript on this site (a) launches a service worker, to enable “smarter” caching and so improve performance, (b) fires up instant.page, to start preloading links when you hover over them briefly and so improve performance, (c) make 360° photography WebGL friendly, and (d) make some disclaimer text “dismissible”. That’s all.

2 This is a Web Performance 201 thing. Here’s the skinny: while a web server is working out how much data it can dump on a user agent at once, it’ll typically send out about 14kb in the first tranche of data and then wait for guidance from the user agent before it continues. If you send 8kb of HTML in that first 14kb window, and then the browser parses the HTML and realises it needs 4kb of CSS too, then the browser it has to make a separate request for that CSS. In that instance, it would have been more-efficient to include the CSS in the initial HTML! This flies in the face of everything you learned in Web Performance 101 because that CSS now can’t be cached and re-used for subsequent page loads, but so long as most pages (by popularity) come in under the 14kb window it’s always more-efficient to bundle them with some of their resources. It reduces the length of your request chains too. Same principle applies to other dependencies – even (small) images!

3 Even my image-heavy homepage would comfortably fit twice onto a 1.44Mb 3.5″ floppy disk, with all resources, nowadays. I mean: if that’s the kind of thing you’re into.

4 I learned to code on the Web with thanks to View Source, and while I respect that the (new-fangled) Inspector tool is generally more-useful, I still think we owe it to future developers to not obfuscate the kinds of code that we ourselves learned from.

× × ×

Inspiring Leaders

This post is secret; you can only find it via my RSS feeds (and places which syndicate them). It's okay to talk about it or link to it, though. Thanks for being part of RSS Club!

Despite my best efforts, I periodically find myself running teams: usually only when anybody who could conceivably be better at it is unavailable. I’m not… terrible at it, but I’m not great either, and I get frustrated if I spend more of my time in meetings than writing code (which seems to often be the case when I take any kind of managerial position).

A conversation with my excellent coach this morning1 got me thinking about leaders I’ve worked alongside or under that I particularly admire. Especially those who’ve demonstrated skills that I don’t have, or that I’m weaker at, but that I could learn to improve. Those that came to mind include:

  • Formerly at the Bodleian, my colleague Liz, who seemed to make project management look effortless: keeping track of dozens of moving parts while promoting a relaxed, creative atmosphere. I competed with her for a management role once; I’m so glad she got it, she did a much better job than I would have.
  • Three Rings‘ head of development (who took over from me last year, allowing me to focus more on the technical aspects of my work) Beverley, who brings emotional honesty in professional environments. I admire the fact that they’ve got the courage to start a meeting by asking everybody present, for example, “what kind of weather represents how you’re feeling right now?”
  • My team lead Bero at Automattic, who’s proactive support in putting his team first means I’ve always felt safe to speak my mind.

It’s perhaps inevitable that I’ll keep ending up in leadership positions, whether ir not I desire it!

But I’m optimistic that a greater awareness of the places I’ve got potential to grow as a person will help ensure that when it happens, I’m a better leader than I was the previous time.

Footnotes

1 My coach also inspired my blog post about doing what you’re bad at and the accompanying vlog version. I always come out of sessions with her with so many ideas for blog posts, but – as always – I have less spare time for blogging than I’d like!

What is RSS Club for?

This post is secret; you can only find it via my RSS feeds (and places which syndicate them). It's okay to talk about it or link to it, though. Thanks for being part of RSS Club!

For members of RSS Club (all of whom I follow, thanks to FreshRSS‘s awesome Dynamic OPML feature), RSS Club provides varying purposes. We probably all agree that it’s a great excuse to celebrate how awesome RSS is, but beyond that we differ.

A common purpose seems to be to provide a platform that’s slightly less well-publicised, slightly more-ephemeral1 than the majority of the content that authors put on their blog, while still continuing to host and control it indefinitely. I’ve enjoyed seeing how some members choose to show content via RSS only that they might not be ready to share more-widely: weeklogs, half-finished ideas, and so on.

That’s been a big part part of the attraction for me. As my drafts folder continues to grow and half-finished ideas stagnate indefinitely, I’ve become increasingly concerned that I’m perhaps too much of a perfectionist about my blogging. Rationally, I know I needn’t be, for two big reasons:

  1. The popularity2 of a post seems to be only barely-related to the amount of time that went into it. Consider for example:
  2. My primary target audience for my blogging for the last few years remains: myself! I aspire to write content that I myself would enjoy, distribute it by appropriate channels in case it’s of interest to others, and not care one way or another about whether anybody else ever reads it3. Clearly I don’t always succeed, as I’ve demonstrated in the bullet point above, but that’s my goal and for the most part it works for me.

I’m trying to get better at publishing things when they’re “good enough”, and RSS Club is in some ways a gateway to that. In my RSS only posts, I don’t always feel like I even have to re-read them before I click “publish”. If there are mistakes, I’ll go back in and fix them later! It’s an effort to encourage a more-casual and laid-back attitude to my blogging, and I feel like it’s working.

Also; writing RSS only posts helps me feel like I don’t have to stay on-topic as much as I might otherwise. On which note: I’m really loving how the “Twitter Migration” has breathed a whole new level of energy into the Fediverse; I dusted off my old Mastodon server earlier this month, installed… umm… let’s just say a lot of patches (ahem)… and started chatting to newcomers. I’ve helped a couple of other instances manage their scaling-up, and I’m loving the fact that the old vibe still remains and the toxicity of the “birdsite” has so far been kept out. Fingers crossed for its future. If you’ve not come and said hi to me there yet, you’ll find me – of course – as @dan@danq.me.

Footnotes

1 Like Derek’s notes, where you can only see the most-recent 10 unless you already know where they are (or are, you know, willing to reverse-engineer the source code of his “random note” page: the risks of a static site implementation!).

2 I’m only really able to track popularity by direct feedback, such as comments and reshares, because I’ve been working at stripping all other analytics tools out of my infrastructure to improve the performance and privacy footprint of my personal websites.

3 Again: this is part of why I actively avoid analytics!

Note #20563

This post is secret; you can only find it via my RSS feeds (and places which syndicate them). It's okay to talk about it or link to it, though. Thanks for being part of RSS Club!

Having upgraded FreshRSS last week for the new XMLPath scraping feature, I’m also loving the dynamic OPML feature! Dave Rupert’s RSS Club publishes an OPML feed of its members and that means I’m able to instantly and dynamically subscribe to all my fellow RSS Club members. It’s been interesting – but perhaps to be expected – to see the overlapping interests that many of us share outside of the joy of RSS!

RSS Club for WordPress

This post is secret; you can only find it via my RSS feeds (and places which syndicate them). It's okay to talk about it or link to it, though. Thanks for being part of RSS Club!

I’ve started publishing posts that are only publicised on my RSS feed (and places that syndicate it, I suppose), not on the HTML pages of my blog nor via any social media channels. It’s a concept promoted by Dave Rupert as “RSS Club”. Of it, he says:

What kind of content should you post? Whatever you want. More personal, less personal, weird. It doesn’t matter.

These posts aren’t very “secret”; they’re at publicly-accessible web addresses and linked from a publicly-accessible, promoted feed. But in an era where feed readers don’t enjoy the popularity they once had (and perhaps still ought to have!), it provides a fun and quirky way to artificially reduce the audience that some of your blog posts get. So I’m enjoying playing with it a bit.

I came across the idea via Jim Nielsen‘s blog, and I’ve wanted to get in on the action for a while, but I’d been putting off getting the code in place to support it. Dave uses Jekyll, so he just had to tweak his buildchain to not include his “RSS only” posts. I assume Jim’s process was similar (he’s powered by Metalsmith). But me? I’ve got multiple decades of history in WordPress format, and I can’t see that changing anytime soon, so I needed to roll my sleeves up and get hacky before I could join the club.

I tried Lutz Schröer‘s plugin, which should have “just worked”, but it didn’t: probably because of the huge stack of custom code I’m already running on this site! So instead I came up with my own. My goals were:

  1. Posts with the “rss club” tag should not appear on listing pages, blog search results, previous/next post links, the homepage, or in the “related posts” section.
  2. But these posts should be visible if you go directly to their URL, as well as in RSS feeds, and if you go to the listing page that specifically shows all posts with that tag (incidentally, WordPress takes this setup and ensures I have an RSS feed of just the “RSS only” posts!).

My resulting code turned out tiny – much smaller than the plugin I couldn’t make work – so I just dumped it into my theme’s functions.php. In case it’s any use to you, here it is:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Posts tagged "rss-club" shouldn't appear outside of RSS, so:
// 1. Prevent main queries from returning such posts, except in RSS feeds:
function rss_club_pre_get_posts($query){
  if ( is_admin() ) return; // always see rss club posts in the admin interface
  if ( is_feed() ) return; // always see rss club posts in RSS feeds, duh
  if ( is_tag( 'rss-club' ) ) return; // if we've found the rss-club tag and we're specifically looking for things in it, show them
  $tag = get_term_by('slug', 'rss-club', 'post_tag');
  if ( ! $tag ) return; // if we don't have an rss-club tag, drop out here
  // filter the query:
  $query->set( 'tag__not_in', $tag->term_id );
}
add_action( 'pre_get_posts', 'rss_club_pre_get_posts' );

// 2. Previous prev/next links "skip over" such posts:
function rss_club_prev_next_where($where){
  global $wpdb;
  $secret_post_ids = array_map('array_shift', $wpdb->get_results('SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id=1137', ARRAY_N)); // need to use wpdb so we don't hit our own hook above!
  $secret_post_ids[] = -1; // add a dummy item to ensure the SQL is valid even if there are no secret posts
  $secret_post_ids_list = implode(',', $secret_post_ids);
  // Append our filter onto the query:
  return $where . " AND p.id NOT IN ($secret_post_ids_list)";
}
add_action( 'get_previous_post_where', 'rss_club_prev_next_where' );
add_action( 'get_next_post_where', 'rss_club_prev_next_where' );

The Shape Of Depression

This post is secret; you can only find it via my RSS feeds (and places which syndicate them). It's okay to talk about it or link to it, though. Thanks for being part of RSS Club!

My mental health has good days and bad days. Most days are good days, but bad days tend to cluster together, 2±1 times a year, into a significant low spell. Because I’m keen on developing coping strategies for when I’m not doing so well – and because I’m a nerd – I’ve been trying to understand what a depressive episode looks like. Let’s draw a curve:

Graph showing mood dipping over time, and then climbing again. A point just before the lowest ebb is labelled "A". A point just after that is labelled "B", a point most of the way back up the side is labelled "C".
When life’s a rollercoaster, you make rollercaosterade graphs.

For most of my life, I’ve often only been able to see the shape of the curve as I come out of it; about point “C” on the graph, or even later on. One time, about 12 years ago, I had a bad winter that I couldn’t identify as depression until months after it ended. I just sort-of internalised my sadness and lethargy as “just who I am”; it took a lot of distance before I could say “oh wow; I was really low back then”.

Nowadays I do a lot better: I tend to spot that I’m depressed at about point “A” on the curve. That’s before I hit the bottom, which helps with taking steps to mitigate the worst of it (talk, diet, mindfulness, exercise, sunlight, etc. as applicable).

It’s still not as soon as I’d like, but better self-awareness will, I hope, keep pushing point “A” earlier and earlier. The challenge is, of course – as any data scientist can tell you – not getting distracted by false maxima/minima:

Graph showing a portion of the "downhill" section of the earlier graph, but instead of going down across its entire length, it goes down, then up again, then plunges down once more, creating a local maxima.
Zoom and enhance! The smooth ride downhill at point “A” might be bumpier up-close.

Getting to point “A”, making positive steps to try to course-correct, and then feeling better for a few days doesn’t necessarily mean I’m on the up-and-up, and that’s dispiriting. But still: having the full curve to-hand serves as a reassuing reminder that, in the end, I’ll come “up” the other side, as I have time and again. This too shall pass, and all that.

Point “B” is where I often get sick, as a reminder that psychological and physical health so often go hand-in-hand. It’s a bit disheartening that I’m usually right at the point where I’m thinking “hey, things are getting better” and then the next day come down with a cold or something, but at least it’s on the right hand side of the curve. I’m acutely aware of this part of the process because I got sick early this week and I’m still not quite feeling myself again, but still: at least I’m on the up-swing of the curve.

I’ve gotten to be moderately good at spotting the whys that act as harbingers to upcoming low spells. So now I’m focussed on understanding the hows of what it’s like to enter and leave them. Maybe someday I’ll be good enough at making course-corrections, early enough, that I can flatten out these graphs. But for now, I’m going to get back to my point-“B”-to-“C” self-care.

Update: turns out that what I was coming down with at point “B” this time was Covid. Delightful.

× ×