2025

    A service I’m partly responsible for at work has had a number of core issues that have been plaguing us for more than a year now. We’ve been making fixes round the edge, but have left much of the core intact, lest it ties us up in a large refactor. Today I got the green light to start addressing these core issues directly. I feel so happy: I get to put away my scalpel and finally take out my sledgehammer.

    It’s finally happened: the local pigeons have discovered bagels and coffee.

    Auto-generated description: A small bird is walking on the floor inside a store near the entrance. Auto-generated description: A pigeon stands on the floor in front of a wooden counter inside a store or cafe.

    Had a go at integrating Keycloak in a personal project. Got to the point where it kinda-sorta worked, but I’m not sure what I’m trying to prove by continuing. That I can integrate an auth service? Well yeah, but it’s a lot of work, and probably not worth it for a project where I’d be the sole user.

    New ground stickers telling people not to ride on the path. We’ll see how well these work, since the sign has been such a “success”. Maybe the police emblem will help. 😏

    A circular sign on the ground prohibits riding bicycles and scooters on the footpath, featuring symbols of both with red slashes through them.

    Okay, I think I know why I stopped playing Wordle.

    Auto-generated description: A screenshot of a word-guessing game shows the word TOCK in progress with several guessed words, color-coded hints, and navigation buttons.

    I never imagined that my software development job would someday involve reading legalisation on Indonesian tax law.

    Galah’s letting anyone who cares to know that it’s on this pole, it’s their pole, and don’t you forget that.

    A bird with outstretched wings is perched atop a tall wooden structure against a cloudy sky.

    Trying out DeepSeek’s chat model. Started with a pretty tame session, but it was something I needed from ChatGTP a week ago. DeepSeek seems to do pretty well here: I like how terse the answers are. I’d be curious to try out the API too.

    Auto-generated description: A conversation about generating clues for words like INVALIDATE and PERMEATE is displayed with attempts to provide definitions and corrections.

    Hitchhiker. One of two today.

    Auto-generated description: A beetle is walking on a person's finger.

    Finding that styling a page with min-height: 100vh causes the need to scroll when I open the page in Vivaldi Mobile, as vh does not recognise vertical space taken up by toolbars. What I actually want is 100dvh (i.e. dynamic view-height) which does. Found this slide helpful (source and via).

    Auto-generated description: Three smartphones display different viewport height measurements labeled as dynamic, largest, and smallest, with Google's branding in the corner.

    This week’s distraction: building a Wordle clone. No particular reason for doing this other than I felt like building one, although I did miss the small time waster of the original Wordle, and watching a game show with my parents that had a similar concept just made those feelings stronger. Main difference between this and Wordle classic: board randomly selects between 4-letter, 5-letter, and 6-letter words; no daily limit or social-media sharing when you guessed the word correctly; and the biggest one: UK English spelling.

    Auto-generated description: A word puzzle game interface shows a grid with the words HOUSE, ALTAR, and POINT, with colour-coded tiles indicating correct and incorrect letter guesses.

    Some remarks on how this was built: I used 11ty to build the static site. It originally started as just a HTML page with some JavaScript, but I wanted to leave the option open for bundling and minifying the JS with Stimulus. The dictionary I got from Hunspell, which is apparently the spell checker Apple has based their work on. There is a little bit of Go to filter and sort the dictionary of words. The words are in sorted order for the binary search algorithm to check if a word exists or not. The puzzle order is predetermined and was done by “shuffling” the indices in a separate array. Base styles are, of course, from simple.css.

    If you’re interested in checking it out, you can find it here. Just be aware that it may not be as polished as much of the other stuff you find out there. Turns out that I can tolerate a fair few shortcomings in things that I build for my own amusement.

    “Get out more” goal for January achieved. βœ…

    Just a small one this month though, as I was a little unorganised: just work drinks and coffee with a team I don’t usually work with. Baby steps I suppose.

    Discovered new street art this morning. Took a photo of my favourites.

    Auto-generated description: Graffiti art on a wooden fence features abstract designs and cartoonish characters. Auto-generated description: Vibrant street art featuring abstract designs and colourful graffiti is displayed on panels attached to a wooden fence.

    Was talking with a coworker at lunch today about his Twich streaming setup, and how he was using Unreal to produce backgrounds that’ll be composited with his webcam feed. He was clearly excited about it all. Streaming’s not my thing, but it was great talking with someone so enthusiastic about doing something like this.

    It’s so strange how Hugo doesn’t configure Goldmark with unsafe enabled by default. Having it off makes sense for the Goldmark library, but the whole point of Hugo is to make a website. And websites, generally, contain HTML. You can turn it on, but it’s always a bit of a hassle.

    How do I get an email about a support ticket, saying that they’re waiting for me to respond, without providing me a link or instructions I can follow to actually respond? Not even a link to the support page. Hmm.

    The conspiratorial side of me is thinking that running shoes are getting more expensive and lasting half as long. The shoes I had have worn out considerably so I bought a new pair, which arrived today. So I’m officially marking the date.

    Auto-generated description: A pair of gray Brooks running shoes with yellow accents is displayed in an open shoebox with blue printed graphics and text on the inside lid. Auto-generated description: Two pairs of grey running shoes are placed side by side on a carpeted floor, with one pair appearing more worn than the other.

    I did not think I would continue to use an evaporative cooler, but given the price I was quoted to replace the unit I got, I figured it’s worth a try. If it doesn’t work out, then I’m happy to have paid the sunk cost. But if it does, then that saves me significant modifications to my home.

    My tolerance for seeing anything regarding US politics is pretty low right now. I’m going to be pretty liberal with my mute, block, and hide boost options for the foreseeable future.

    Learnt a very import thing about Stimulus outlets this evening: the outlet name must match the controller name of the outlet target. If this is not the case, the outlet will not bind and you’d be beside yourself struggling to find out why the outlet target cannot be found.

    From the docs:

    The outlet identifier in the host controller must be the same as the target controller’s identifier.

    Took me 30 minutes and stepping through with code with the debugger to find this out.

← Newer Posts Older Posts β†’