🧑💻 New post on TIL Computer: A Way To Resolve Redelivered Messages Stuck In A NATS Jetstream
For anyone else interested in the trackside signage of Victorian railways. What got me looking was learning about coast boards. Seems to be instructions to the driver on what to set the train’s power output.
Solved Mini 287 on lex.games in 2 minutes, 29 seconds. No reveals.
⬜⬜⬜⬜⬛
⬜⬜⬜⬜⬜
⬜⬜⬜⬜⬜
⬜⬜⬜⬜⬜
⬛⬜⬜⬜⬛
Manuel Moreale wrote about Spotify:
[T]hey keep adding all these bizarre new things that I’m always left wondering if I’m a very odd user and other people’s use of Spotify is so much different than mine. Like who watches video podcasts on Spotify? Why is a music app getting into videos?
I’ve not used any feature built by Spotify that didn’t directly relate to playing music as audio, nor do I know anyone that does. They’re more likely to get in my way, making them less than useless to me. And yes, this includes podcasts1.
Who knows, maybe 2025 is the year I jump off the Spotify ship.
I’ve said this before, but now that I’ve got the means of (legally) acquiring DRM-free music from mainstream artists, I may aim to do likewise.
-
I consider myself awesome for introducing everyone I know to Pocket Casts and the open podcast ecosystem. 😛 ↩︎
I recently got a new phone, a Pixel 9 Pro, which meant I needed to bring Alto Player up to date. I probably could’ve gotten away using the version I was using on my Pixel 6. But I didn’t have a binary build, and I needed to upgrade Gradle anyway, so I decided to spend a bit of time bringing it up to date to API version 35, the version used in Android 15.0. Fortunately it was only a few hours in total, and once I got it running in the simulator, I side-loaded it onto my phone and started using it.
It worked, but there were some significant UI issues. The title-bar bled into the status bar, the album image in the Now Playing widget was cropped by the curved corners of the phone, and the media notification didn’t display playback controls.

I set about fixing these issues today, starting with the title-bar and Now Playing widget. These was an issue with the views not respecting the window insets, and after a quick Google search, I found this article showing how one could resolve this by adding a ViewCompat.setOnApplyWindowInsetsListener and reacting to it by adjusting the margins of the view.
val topLevelLayout = findViewById(R.id.top_level_layout) as CoordinatorLayout
ViewCompat.setOnApplyWindowInsetsListener(topLevelLayout) { v, windowInsets ->
val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
v.updateLayoutParams<ViewGroup.MarginLayoutParams> {
leftMargin = insets.left
bottomMargin = insets.bottom
rightMargin = insets.right
// applying a top margin here would work, but will not have the toolbar
// background colour "bleed" into the status bar, which is what I want.
}
val t = v.findViewById<Toolbar>(R.id.toolbar)
t.updateLayoutParams<ViewGroup.MarginLayoutParams> {
// make the toolbar a little "narrower" than full height
topMargin = insets.top * 3 / 4
}
WindowInsetsCompat.CONSUMED
}
It took a few attempts, but I managed to get this working. Just using the top inset for the toolbar margin made it a little larger than I liked, so I adjusted the height to be 75% of the inset. This means the toolbar will actually encroach into the area reserved for cut-outs like the front-facing camera. This is arguably not something a “real” Android apps should do, but this is just for me and my phone so it’s fine.
I went through a few iterations of the album artwork cutoff on the bottom right corner trying to find something I liked. I tried bringing in the horizontal margins a little, but I didn’t like the alignment of the album art in the player, particularly compared to the covers that appear in the track list screen. One thing I didn’t try was raising the bottom margin so that it would fit “above” the curve. But those corners curve in quite a bit, and doing this would sacrifice a lot of vertical space. So I settled on hiding the album art altogether. It’s a bit of a shame to loose it, but at least it looks neater now.
The next thing I looked at was fixing the playback controls in the media notification. After some investigating, I found that this was because I was not setting the available actions in the PlaybackStateCompat builder. This, if I understand correctly, is used to communicate to various systems the current state of the playing media: what the track name is, whether it’s playing, whether one can skip forward or back. I have my own types for tracking this information — which is probably not correct but I wasn’t completely sure as to what I was doing at the time with Android’s media stack1 — and when I needed to convert this to a type understood by the framework, I made instances of this builder without setting the available actions. Earlier versions of Android seemed not to care, and the controls always appeared on the notification. But I guess they changed that.

One other thing I needed to do was to explicitly ask the user permission to show a notification before I could publish one. This is also relatively new: my experience with Android goes back to the early days where these permissions were disclosed up front when the app was installed. But I can completely understand why they changed it, as it was easy to simply tap through those screens with reading them. I am wondering whether media playback notifications are in some way exempt from these permission checks, as I was actually getting one to appear before I made this changes. But I figured it was probably worth doing anyway, so I added this permission request on first launch. Arguably I should be asking for this permission when playback starts, but again, this is just for me.
One final thing I needed to address were long album titles. The text view displaying the the album title had a width that autosized to the title itself, and the start and end constraints were set such that it appears centred in the view. This worked for “normal” length titles but when the length became excessive, the text view would fill the entire width of the screen and the title will appear left justified.

The fix for this was to set the text width to be calculated by the start and end constraints (setting layout_width
to 0dp
), bringing in the margins a little, and making the label text centre justified. I did this already for the track title, so it was easy to do this here too. Not sure why I didn’t do it earlier, or why I haven’t done it for the artist’s name yet.

This was all rushed, and I’ll admit I wasn’t 100% sure what I was doing. I was going down the route of trial-and-error to get this working, mixed in with web searches and a trip to ChatGPT. And yeah, the methods I used won’t make this a portable Android app that would work on every phone out there. But I’m reasonably happy with how it turned out.
-
This is still true to this day. ↩︎
📺 Wallace & Gromit: Vengeance Most Fowl (2024)

Seems like Substack is not giving up on their Twitter clone. I only just discovered that if you tap on a post’s author, it goes to their Notes page. Not sure what I was expecting (maybe an About page, but would that make sense given their target market?) but I wasn’t expecting this.
Thanks for my new found fondness of buying mainstream music instead of streaming it, I needed a way to get these albums into Alto Catalogue. There exists a feature for fetching and importing tracks from a Zip referenced by a URL. This works great for albums bought in Bandcamp, but less so for any tracks I may have on my local machine.

I’ve managed to get Alto Catalogue building again after updating Webpack and a few NPM packages, so in theory, I could add an Upload Zip file action. But there’s more to this than simply accepting and unpacking a Zip file. I have to read the metadata, maybe even preview the tracks that will be imported, just in case I’m importing something I rather not (I did see this once, where zipping a bunch of tracks in the Finder introduced duplicates). This already exists for Zip files that are downloadable online.
I had a though about what my options are, until I remembered that I had a Gokapi instance running in Pikapods. So I tried using that to temporarily host the Zip file with a publicly available URL that could be read by Alto Catalouge.
The only problem is my internet upload speed is sooooo sloooooow. The Gokapi instance is hosted in Europe, and I suspect the instance itself is a little underpowered. So uploading 100 MB Zip files would take a fair bit of time: maybe 15-30 minutes. When I tried doing this via the web frontend, the connection timed out.
Fortunately, Gokapi has an API and one of the methods allows you to upload a file in “chunks,” which Gokapi will assemble back into the original file. Even better is that this chunking can be uploaded in parallel.
So I built a CLI tool which made of this chunking API to upload the Zip files. Once the upload is complete, the tool will display the hot-link URL, which I can copy-and-paste into Alto Catalogue.
The whole process isn’t fast (again, slow upload speeds). But it works, and I can use this tool to queue a bunch of uploads and let it do its thing while I’m doing something else. I really like tools that do this, where you’re not forced to babysitting them through the process.
There are a few limitations with it. It doesn’t allow for an awful lot of customisations on the lifecycle of the uploaded file. And the tool stalled out once when my computer went to sleep, and I had to start the upload from scratch. I could probably add something to track the chunks that were successful, allowing one to continue a stalled upload. If this happens frequently, I may look more into adding this.
But even so, this could be a useful addition to my use of Gokapi for transferring temporary files. If you think this might be useful to you, you can find the tool here.
Bit surprised to see this appear in my washing machine after washing some new clothes I bought this week.


I’ve started buying music via Qobuz, which offers DRM-free MP3 and FLACS of mainstream albums. So far it’s been really good, although I wish they offered a way to download an album as a Zip file, rather than require you to do so track by track (they have a download manager but, come on: it’s 2025).
One thing I absolutely must do in 2025 is get out more: attend meetups, join a club, anything to get me around other people. I generally hate these sort of things, but I think it would be good for me. If I start with one social gathering a month, I think that’s manageable.
Learnt a valuable lesson today, which I will share with you via another King DerpCats most wondrous meme gen’rat’r.

🔗 How to Write Docs People Read
Some interesting ideas on documentation from Allen Pike. I know for myself I tend to turn towards how-tos when I need to reference something. I’d be curious to know how this could work with technical documentation, which is usually dry and out of date.
I somtimes wish I could remember why I subscribed to half the RSS feeds I have subscribed to. Did I hear about these site from a podcast or see it in a blog? (most likely). Why did I subscribe at all? Maybe if Feedbin remembered the top post when the subscription was created it could jog my memory.
2024 Year In Review
It’s a few minutes to 12:00 PM on the 1st January 2025 when I published this. Thanks to time-zones, that means it’s just about to turn 12:00 AM one hour to the west of Greenwich, meaning that it’s still 2024 in much to the west of the prime meridian. So I’m technically still within the window of time where I could say I got a year in review post out for 2024.
Turns out it’s not the first time I’ve used this excuse. Looking at other posts I’ve published on the 1st of January, I’ve done this twice before. And I guess this pattern of posting a year in review on the first of the next year makes some sense: it’s usually a quiet day, with nothing open, and I’m usually a little tired and listless1.
That means there’s usually a large block of time available to me, and despite what I wrote yesterday, it is a good practice to do some reflecting, however brief it may be.
So I’d figured I’d might as well drag iA Writer out and scribble out a brief review of the year that was.
Online Presence
I made a point of wanting to cut down the number of domains I acquire in my year in review for 2023. This is still an ongoing progress, but year-on-year, I’m down 2 domains on net, which is an improvement. 2024 saw the acquisition of 7 new domains, of which 2 I’m using for something, and 1 I plan to keep around:
Domains | 2024 | 2023 |
---|---|---|
Registered | 23 | 25 |
With auto-renew turned on | 17 | 16 |
Currently used for something | 15 | 13 |
Not currently for something but worth keeping | 2 | 3 |
Want to remove but stuck with it because it’s been shared by others | 0 | 1 |
I’m still trying to keep this blog alive by posting regularly here. I’ve must’ve felt more comfortable with doing so as it’s been a record breaking year, with 840 posts, beating the previous record by 594 posts. The initial fear of falling out the practice has subsided to one where I find joy in posting here. That’s probably why the post count is so much higher.
Of course the quality of a blog doesn’t correlate with one’s ability to “post the most”, and I do feel like there have been times where I felt a little blasé about what I write here. I do want to be better here, or at least be a little more conscious about it. But not at the expense of turning this into solely a soapbox/marking/punditry site: there’s plenty of those out there already. So you’ll probably continue to see the cringey, irrelevant, lame, and potentially disposable posts here. I’ll just try to make sure that it’s balanced out with posts that are actually good.
Some notable posts of the year:
- Detecting A Point In a Convex Polygon: the subject matter is a little dry, but one thing that’s notable about this one was the interactive elements. This took a few weeks to get right and I’m quite happy with how they turned out.
- Goland Debugger Not Working? Try Upgrading All The Things: notable as it seems to be the post that got the most traffic from Google.
- BASIC.HTM: notable as it was the first post of mine that appeared on Hacker News.
- A Tour Of My New Self-Hosted Code Setup: longest post to date, with probably the longest bit of spoken audio I’ve published on this site. Getting my hands dirty with editing the narration was an interesting experience.
- Micro-fiction: Get A Horse: notable in that this was my first post that was a work of fiction.
One other thing about blogs: I still have that wandering eye for other blogging CMSs. I did start three other blogs, of which two I shut-down and rolled into this one. That just leaves one new blog created this year that I’m planning to keep separate, mainly because I feel the subject matter warrants a dedicated site.
Projects
2024 didn’t feel like a big project year, probably because most of the projects I’ve started I kept to myself. But I did manage to release a couple this year:
- Sidebar For Tiny Theme: This came with the additions for recommendations to Micro.blog, and the addition of sidebars listing those recommendations in a couple of the themes. I use Tiny Theme, which didn’t have a way to do this, so what started as a blog-post eventually became a Micro.blog plugin. It’s been good seeing this adopted by other bloggers.
- Cyber Burger: A Pico-8 game, which I hoped would’ve only taken a few weeks to build. Overall it took 3 months, largely because I spent large stretches of time not working on it. But I’m glad I actually got this finished and released.
The other things I’ve worked on that I built mainly for myself:
- UCL: A tool-command language, similar to TCL, that I’ve built for work. The state of this is smack-bang in the middle of “sort-of-usable” and I’ll need to spend some effort cleaning this up and documenting this if I ever want this to see wide release. I’m not sure that I want that though. at least not yet.
- Blogging Tools: A set of tools that help me post here. What started as something to assist with making photo galleries has grown to a suite of tools dealing with images, audio and video. Really useful for my needs.
- Tape Playback Site: A private site for browsing old cassette tapes that have been digitised. I still have a pile of tapes I need to digitise though (are you getting a sense that I find it hard to finish things? 😀).
- Nano-Journal: My version of Kev Quirk’s web-based journalling app. After adding Git synchronisation and attachment support, I’ve use this now for all my journalling. It doesn’t do everything that Day One does (off-line support’s a big one) but it does enough.
Finally, some of the projects that have been abandoned:
- Photo Bucket: My third attempt at making something to publish image galleries online. I think the need for this has been made somewhat redundant with Blogging Tools.
- I also started two interactive fiction stories in Evergreen that I haven’t finished yet. One is close, and I probably should get it done. The other is about halfway finished and probably won’t see the light of day.
Books And Media
Given that I exceeded my reading goal for 2023, I thought I could push myself a bit more for 2024 and go for finishing 10 books. Sadly, I was nowhere near meeting it. I only got to finishing 4 this year:
(not pictured: Twenty Bits I Learned about Making Websites)
I think I probably started more books than I’ve finished. Not that I have to finish every book I’ve started, but I think my problem is one of focus. The books I have started could be interesting, and I have plans to finish some of them. I just need to spend more time reading.
I’m not a movie person but I did manage to watch a few this year. Here are the ones I’ve posted reviews for:
There was a period of time where I felt burnt out by scripted TV shows, favouring YouTube over much else. I eventually got back into watching a few “high production value” shows, some of which I enjoyed:
- House of the Dragon: Season 1
- House of the Dragon: Season 2
- Andor
- Reacher: Season 2
And some that I enjoyed far less:
Onwards To 2025
I know it’s cliché to look back on the last year and feel pretty crappy about it. And yeah, not every day of your life is going to be great. They’ve been some rotten days in 2024 that I haven’t included in this review (I have written about them so check out the archive if your curious).
So, was 2024 a good year? Well, I’ll start by saying that it hasn’t been wholly a remarkable year. There’s no one event that I can point to and say “this is what made 2024 great.” Maybe this past year was like that to others, but such events didn’t happen to me2. And recency bias has made it difficult for me to say there were more good days then bad (the last few months have been rough).
But I wouldn’t say 2024 was a bad year. Certainly a busy one, with a lot going on. But on balance, I’d say it’s been one of the better ones.
So that’s it, year in review for 2024 done. Have a happy new year and onwards to a great 2025.
-
I don’t do much on New Years Eve, electing to go to bed early. Yet, I usually get awaken at midnight for various reasons: fireworks, messages from people wising me a Happy New Year. Last night was no exception. ↩︎
-
Well, that’s not entirely true. Becoming an uncle was an example of such an event. But again, such personal news, is currently outside the scope of this post. ↩︎
Fixed the UI of Alto Player, plus addressed some long standing issues I’ve been having.
One was displaying the album covers for playlists instead of the generic “missing album” image. It’s technically possible to set an album cover on a playlist, but I never built the UI to do this in the web-app. So the app now uses the album cover of the first track in the playlist if one isn’t specified. Another was getting automated release builds working in GitHub, as per these instructions
But the biggest improvement was finally getting around to storing the position of the album list, so that going back up the navigation stack wouldn’t reposition the list to the top. I tried this a way back, but couldn’t get it working, probably because I was testing RecyclerView.scrollToPositionWithOffset
by passing last constant numbers, like 100, only to find the list not actually scrolling. It turns out that this method actually takes the index of the item to position at the top, not a pixel offsets. So the view wouldn’t scroll if you happen to have a list with less than 100 items. It only started working after I tried smaller numbers, like 5.
So all in all, a good day.
Only took two hours to uplift Alto Player from Android SDK version 30 to 35. Fought an upgrade to Gradle (because of-course), skirted around a migration from ExoPlayer to Media 3, and battled a NullPointerException due to my inability to properly my own navigation args. All in all, not bad.
I didn’t have a word chosen for 2024, but I think I’ve got one for 2025: discipline. As in, being a more disciplined in what I set out to do. Not to let my focus waver or go into doing something half-arsed. I feel that I’ve been lacking this recently.
Oh no, what a shame. For reasons beyond my control (but entirely my fault) I may not have enough time today to write a year in review post. Of all the rotten luck. 😉
I find them really painful to write, despite how useful the exercise can be. Maybe I’ll get to it early next year.