A row of 17 books, mainly hardback fiction, on a wooden sideboard top
My 2023 (physical) “TBR” shelf

For the first time in a long time, I have a physical shelf of books that form my “to be read” list. (aka TBR in bookish circles)

Over the last few years I’ve fallen out of the habit of reading regularly for fun. Which is odd, given I live with someone who has their own book review blog, YouTube channel, and read 210 books last year. This year I want to make a concerted effort to try and be more consistent, so I’ve put the books I want to read sometime soon front and centre in my office – they’re on top of the sideboard that sits to my right when I’m at my computer desk, or left when I’m at my hobby desk, and within arms-reach of both.

The list itself is a mix of old favourites I haven’t read in years, new fiction reads I’m sure I’ll like, some new authors or genres I’m not familiar with, and a couple of non-fiction books to round things out. I still have 3 books I’m waiting on physical copies of to arrive. The full list, in no particular order, is:

  1. Hallowed Ground – Richard Strachan
  2. The Hollow King – John French
  3. Rogal Dorn: The Emperor’s Crusader – Gav Thorpe
  4. The Hobbit – J.R.R. Tolkien
  5. The Fellowship of the Ring – J.R.R. Tolkien
  6. The Two Towers – J.R.R. Tolkien
  7. The Return of the King – J.R.R. Tolkien
  8. The Triumph of Saint Katherine – Danie Ware
  9. Helbrecht: Knight of the Throne – Marc Collins
  10. Reaper Man – Terry Pratchett
  11. Mort – Terry Pratchett
  12. Soul Music – Terry Pratchett
  13. Dune – Frank Herbert
  14. Dead Lies Dreaming – Charles Stross
  15. Miss Marple: The Complete Short Stories – Agatha Christie
  16. Hercule Poirot: The Complete Short Stories – Agatha Christie
  17. Briardark – C. L. Werner
  18. Haven’t You Heard? – Marie Le Conte
  19. Escape – Marie Le Conte

Hopefully these won’t be the only books I read through the year; I’m giving myself permission to pick up new books throughout the year as they pique my interest.

In terms of keeping track, I might use Micro.Blog, as it’s added several book-related features over the last couple of years, and has a nice and simple companion app for iOS, called Epilogue. Another option, that my partner recommended, is The Storygraph. Naturally, I’ll be posting updates to this blog too!

A 3D printed prototype of my 'MagPuck' jig for adding magnets beneath wargaming bases. It is a grey plastic block with a recess for a base. At the bottom of the recess is a further recess which holds a 6mm x 2mm magnet. A small area has been carved away at the edge of the base recess to allow for levering the base out

One of the things I hoped to do when I bought my FDM 3D printer was to use it to solve small problems I was having. Today I designed and printed my first prototype. It’s not much to look at, but it is just the first iteration!

Glueing small magnets under the bases of miniatures is a common job I have to do, as it’s useful for storage, transportation, and adding some weight. Unfortunately, it’s a job that can be unnecessarily fiddly and messy. Getting the magnet to stay in place while the glue dries is a pain. Recently I hit upon a trick of using a magnet on the other side of the base to help with this issue, but making sure everything was in the right place could be made easier.

Enter what I’m nicknaming the “MagPuck” – a simple jig that will align a base with a magnet that ensures that the base magnet is held perfectly centred while glue dries. It’s simple but effective – with the prototype I was able to magnetise a batch of ten bases in just a minute or two.

No first attempt is perfect though – no doubt you’ve noticed where I had to carve out an indentation to let me lever out the base. The next iteration will have that built-in. Another change will be to make the MagPuck modular, so as to make it more efficient to print, while supporting multiple base sizes and magnet configuration. Below is a sneak peek at the next iteration, which I’ll be printing out as soon as the printer finishes some terrain I kicked off before I’d had my ideas on how to improve on the prototype.

A screenshot of some Laravel user authentication boilerplate code

The festive break seems to be one of the times I manage to sit down and try something new. This year I’m taking the time to learn a little of the PHP framework Laravel, by way of re-writing an app I made last year with React and Firebase. That app always felt a little fragile to me, even though it succeeded at its basic functions – probably why I haven’t gone back to update it at any point in the last year. In my defence, that app was a learning exercise too, as I wanted to brush up on React for my day job before starting on a project at the start of 2022.

But safe to say, I’m much more comfortable with “the old ways” of PHP. I’ve been writing PHP in one form or another for close to 25 years, and even though I wouldn’t ever call myself an expert due to my on-off usage of it over the last decade, I do still have the basics of the language in my head. I can follow along and debug most code I’ve encountered just fine. PHP 8.x is different enough that I definitely need to follow some tutorials to write it, but there’s still a lot I recognise. Laravel itself has a lot of similar concepts to frameworks I’ve used in the past, it just does them with modern practices and architecture. Again, lots I’m unfamiliar with, but plenty that I recognise.

Apart from making I Painted This! more robust and supportable (in my view), one of the primary drivers for this exercise – other than as a convenient excuse for learning – is that the app primarily uses Twitter for authentication. That’s not something I’m comfortable with any more, so it’s got to go – and if I needed to do that change, I’d be as well giving it a complete overhaul!

With the news that Amazon Studios, in partnership with Henry Cavill and Vertigo Pictures, are buying the film and TV rights to the Warhammer 40,000 IP, I have a couple of initial thoughts:

  • I can’t wait for a whole new audience to miss the point that the fascists are not the good guys, in much the same way as Judge Dredd, The Boys, Starship Troopers, Robocop, and many others…
  • I really hope they focus on telling stories in the Warhammer 40,000 setting, and not the story of the Warhammer 40,000 setting. A larger-scale, bigger budget Hammer & Bolter or Interrogator would probably work quite well, in my opinion… Possibly even something like Angels of Death, although I’m not convinced Space Marine stories will work well without 1) watering down many aspects of what makes them interesting, 2) spending a lot of money to get the look right.

With those worries stated, Cavill is a massive fan, and takes sticking to the heart of source material seriously – as seen in his disputes with the direction of The Witcher, so if anyone can help steer the ship correctly, he’s probably one of the best picks out there.

This review of the Microsoft Surface Studio Laptop, by Bill Bennett, largely matches my own experiences with it. I’ve been using the Studio for the last couple of months, having bought it as a replacement for my aging self-built desktop, and it’s easily one of the best laptops I’ve ever used. Definitely the best Windows laptop.

My Surface Studo Laptop, with a sticker saying `#include <everyone>' in rainbow text stuck to the top right corner
My Surface Studio Laptop

I’ve gone for the “middle of the road” spec – i7 + 16GB RAM, as I couldn’t justify the jump in cost of the 32GB option – like Bill notes, these devices are expensive compared to available offerings from other PC manufacturers, but for me the following helped mitigate the price:

  • Solid build quality.
  • Great screen.
  • Really good laptop keyboard.
  • Similarly good trackpad – easily the best I’ve used outside of a MacBook.
  • No bloatware.
  • It’s in what I consider my “sweet spot” for laptop size.
  • I have just enough non-Apple needs to make a MacBook Pro (which has a similar price) not quite the best choice.

I wouldn’t say I’ve managed to really push the Studio very hard yet. I’ve mostly been using it for exam study and light “tinkering” in a WSL development environment, but I’ve also done a little bit of gaming in World of Warcraft. Playing WoW is pretty much the only time I’ve heard the fans make any real sort of noise, and with a little lowering of settings I was getting 4K on my external monitor at ~60fps from the 3050m GPU. For my needs I’d be happy to trade some resolution for higher settings at the same fps, but it’s not something I’ve devoted much time to.

In terms of noise outside gaming – I basically never hear it. Sometimes it will ramp up to a low-level “woosh” that’s barely noticeable above ambient, but most of the time it’s dead silent. Especially compared to my similarly specified (but 3 years old) work Dell – that sounds like a leaf blower from the moment it’s turned on, rising to jet engine as the day wears on.

The Studio’s signature folded tablet mode is “fine”; as Bill notes, it’s heavy, so you won’t use it on-the-go. In my limited use of it, the tablet mode is pretty nice for browsing/reading on the sofa as it’s more comfortable and balanced on your lap in tablet mode. I’m less concerned the whole thing is going to tip back off my knees and crash to the floor. It’s one of those features I’m not going to need 98% of the time, but on that rare 2% I’ll be glad I can make use of it.

Speaking of the fold – I don’t know if it’s just the way I lift the lid on the Studio, but I do find the double-hinge mechanism quite prone to opening up as if I were switching to tablet mode when I’m just trying to open up as a laptop. It’s not a big deal, but it’s happened enough I thought it worth mentioning.

Overall though, yeah, I’m really happy with the Surface Studio Laptop. It’s a very good laptop wrapped up in a premium-feeling package. As an aside, between this and the Xbox Series S, I’ve been very impressed with the quality of devices Microsoft is creating these days – it makes me wonder how well they’d get on in the smartphone space, if they ever decided to jump back in.

All going well – and DNS willing – this site has been migrated off of WordPress.com and back to self-hosted. That’s all well and good, but along the way, the site has picked up a couple of new tricks –

  • IndieWeb integration through microformats and Webmention
  • Fediverse integration through ActivityPub

Fediverse support means you can now (for example) follow this blog on Mastodon, by following @chris. You might even be able to like and comment directly from Mastodon (I haven’t tested this Update: commenting via a reply works). Regular RSS options are still available.

IndieWeb features come by way of the plugins provided by the community, and the Autonomie theme by Matthias Pfefferle (who also wrote the ActivityPub plugin I’m using). I haven’t rolled out all of the possible features – I’m not using Post Kinds yet, for example – as I want to think a bit more about what I want to achieve with the site before I go overboard.

Moving everything over was relatively quick and painless, and the setup of new features was simple. There’s a couple of small things to tidy up, and more to be added to the site as time goes on. I’ll write up the process of getting things setup in another post so others can replicate on their own site if they want.

Finally, I got around to my first Associate-level Microsoft certification. I’d originally planned to sit the AZ-204 exam for the Azure Developer Associate certification in November, as a follow-on to sitting AZ-104 in September. I’d fit AZ-102 somewhere after those, as I just wanted to do that one for fun. In the end, that all turned out to be too ambitious; with work being as busy as it turned out to be, and me quickly realising I’d bitten off more than I could chew, I kicked both exams further down the road. Both were pushed into February, while I figured out how I wanted to approach things. I decided I would give myself space to pass one Associate exam before committing to any more. For whatever reason, on the day I made the decision I was more confident about the Azure Developer material (funny that, given I’m a Lead Developer!), rather than the Administrator course, so I went with that. But I still needed a deadline, preferably not too far in the future, so March 31st was picked!

The last week of February, and all of March was given over to study in the evenings and some weekends. I used the official Microsoft Learn materials – both the new set linked from the certification page, and the older, more in-depth material which was previously tagged. When I started out I would do a practice test once a week to see how I was doing, and for a while it felt like I was doing pretty badly! Test scores were regularly around 65% until it started to sink in around weeks 3-4 and scores started to creep up slowly. At that point I started doing tests every day on MeasureUp – which has a nice feature where you can set the practice test to have just questions you haven’t seen in your previous N practices – and every other day on Whizlabs.

As the exam approached I was feeling really confident: I was starting to regularly score 95%, with an average score of ~85%, and practice tests under exam conditions were taking less than 30 minutes. While I didn’t think the exam would be easy, I was thinking I was in a good place.

The exam itself was… ouch. Much of it seemed at the time like it was something the learning material had only skimmed over, and I didn’t have nearly as many “I recognise that question!” moments as I did in the Fundamentals exams. It was easily the hardest Microsoft exam I’d taken, possibly one of the hardest exams I’ve ever taken. Question after question felt unfamiliar and not something I’d covered in study or practice. In my defence, a lot of the question wording left something to be desired. This is a constant complaint of mine with MS exams – the questions often feel like they are incomplete sentences, badly translated, or both. I remember one question asked me to pick a solution with barely any context to go on – I spent a good 5 minutes rereading the entire page and checking I hadn’t missed a link to an exhibit or case study that would allow me to intuit an answer! Looking back, I can see things a bit clearer-eyed and relate the questions I remember to the material, but at the time I had such a sinking feeling I would fail the exam.

But in the end, my preparation didn’t let me down. As unconfident as I felt part-way through the exam, I still passed comfortably, with a good score that was slightly above my average practice score.

So now that AZ-204 is out of the way, what’s next? I still want to do AZ-104 (Azure Administrator Associate), but I’m not in a hurry to repeat the gruelling exam experience just yet. Hopefully I can squeeze it in this year though. I’m also one step closer to reaching my ultimate goal – Microsoft Certified: DevOps Engineer Expert (AZ-400) – of which, Azure Developer Associate is one of the pre-requisites.

More importantly – I want to actually use more of what I learned! I feel like I’ve still only barely scratched the surface of Azure. While much of it is overkill for the simple side projects like I do in my spare time, I still have a few ideas in my head for what I could be using it for.

This post will fall into the “well duh…” category for a lot of people, but sometimes we need a reminder.

rsync in action

I got myself a new laptop recently (more on that another day), and wanted to back up filesfrom my old desktop to a portable drive, potentially for loading onto the new device. The main thing I wanted to back up was my photo library; most of the rest of my files are in the cloud/git repos, but I have a large “pre-cloud” library of family photos and consolidated backups from old computers that I’ve not managed to sort through and upload anywhere yet, so I wanted to make sure I had a copy of it. The library is hundreds of GB of various file types, from media to all sorts of metadata files used by the likes of iPhoto.

Try as I might, I could not get the library to transfer using the Windows 10 file explorer. Transfer speeds were abysmal (less than 20Kb/s for a USB-C drive capable of ~1Gb/s), and it would keep hanging on various files. When this happened, it would with a retry/skip action, so needed human interaction to keep going. At the speeds I was seeing it would’ve taken several days to copy over – and if the copy failed I had to start from scratch. Basically, Explorer it wasn’t a viable solution.

Last night, as I was dozing off to sleep, my brain reminded me that rsync exists to synchronise two directories, and WSL makes it easy to use on Windows. There are probably a billion Windows utilities that will do the same job, but I already have rsync in my WSL setup, so why complicate things further?

My source folder is E:\Pictures, and the destination drive is D:\. In WSL, this translates to /mnt/e/Pictures and /mnt/d/ respectively. There are a great many options in rsync, but I find -avz is a useful starting point for most jobs, and tend to only deviate from that if an initial run fails or I have a specific need. All in all the command I used to backup my photos was:

rsync -avz /mnt/e/Pictures /mnt/d/

Simplicity in itself. A few hours later – instead of days – and my library is safely backed up to the external drive and ready for its future home.

I ran into an issue last night where I couldn’t generate a new React application template using npx create-react-app my-app. Annoyingly, this was only broken in the WSL environment of my personal PC, where it had been a while since I’d had to use the command. On Windows, where I’d never run the command before, it worked fine. The error I received was:

You are running create-react-app 4.0.2, which is behind the latest release (5.0.0).
We no longer support global installation of Create React App.

This was odd, as I’d never globally installed create-react-app. Never the less, I followed the error’s suggested fix of running npm uninstall -g create-react-app. Unsurprisingly, it didn’t work. What followed was an hour of trying various other “fixes” from around the internet – update NPM/clear the NPM cache/update NPX… none of which worked for me.

In the end I resorted to fixing the issue through brute force – finding wherever this mystery instance of create-react-app was lurking and purging it from my system with good old rm. Using a combination of find and rm I found 2 places containing binaries. Removing these directly didn’t fix the problem either, but working my way further up the diectory tree to their common parent directory did.

As it turns out, I’d accidentally stumbled on the NPX cache, which is kept hidden away from the usual NPM cache. Mine was in a slightly odd place because I use NVM to manage my NodeJS versions, but you can find yours using npm config get cache, then looking for an _npx directory within the returned path. Delete the contents in there, and npx create-react-app my-app should start working again.

Or, to make it really easy, run npx clear-npx-cache.

A few of us at work might be moving to a project that uses React more heavily than anything we’ve done before, so I wanted to make a list of any interesting links which might be useful to share with the group. Some might not be specifically about React, but were useful for me getting up and running on my home PC, or are worth storing for future reading:

Much like my development environment notes, this post is pretty much just for me – but if you find it useful, I’m glad!