ProfileMode image

Ryan Poole

Software Developer. C#, TypeScript, Vue, and more.

Exporting Google Authenticator 2FA Codes

Exporting 2FA codes from one instance of Google Authenticator to another is relatively painless, just use the export QR in the menu and import into another. However this provides no way to import into another 2FA app, effectively locking their users into the Google ecosystem. The standard format has been wrapped in a proprietary one to prevent users from making a choice of authenticator. I’ve rejected this reality and subsituted my own by creating an entirely offline way of exporting these codes into the standard format (which ironically was originally developed for the earlier versions of Google Authenticator). ...

October 15, 2024 · 1 min · 138 words

Migrating from WordPress to Hugo

Recently migrated this very site from WordPress to Hugo. Although I didn’t have many major complaints with WordPress I found it too heavy for my needs. In essence I’m just looking for a bunch of text posts that can be added and updated. There’s a dozen of plain text / markdown blogging platforms, Jekyll and Bear spring to mind but I settled on Hugo for no reason in particular. I know a little bit of Go so changing the themes and layout isn’t too much hassle. ...

October 14, 2024 · 3 min · 501 words

A Better Web: Browsing Without Influence

View counts, upvotes, likes, favourites, retweets. Metrics play a bit part in how content is perceived. This extends to thumbnails and previews for video platforms. I’ve started experimenting with removing as many visible metrics as possible, allowing myself to make my own judgement and perhaps find content that isn’t filtered to my own preconceptions and biases. Take the below, just a random snippet of trending videos. I tend to avoid videos with “loud” thumbnails and titles, very high view counts or very old content (more useful for browsing the homepage than here). ...

June 21, 2024 · 2 min · 227 words

Rethinking TDD as Feedback Driven Development

Ask a dozen developers what TDD means to them and you’ll most likely get the answer “writing the tests first, then write code that makes them pass”. This being the generally accepted definition as it makes sense in theory, but in practice is inconvenient, and more often than not impractical to pull off. This can leave a bad impression and pushes developers away. However, this isn’t what TDD is all about, and shouldn’t be seen as the go-to definition. Think of TDD as requirements driven development with verification. The test definitions are what matter most, they’re derived from the requirements and are what should be written first, not the tests themselves. ...

June 3, 2024 · 2 min · 354 words

Cool Stuff Found: StableBit DrivePool

Part of a series of cool or interesting software that I’ve recently started using. DrivePool UI I have a tendency to micromanage my harddrives, SSDs and NVME drive to squeeze optimal performance / drive use ratio out of them, juggling Steam games between drives and archiving old documents. However, as each drive is essentially identical in folder structure I end up forgetting exactly where files are. StableBit DrivePool solves this particular problem by pooling physical drives together into a single virtual drive, with customisable rules that move files around physically without you having to know the details. For example, splitting drive usage to ensure all drives are equally in use. ...

May 27, 2024 · 2 min · 386 words

Fallout Review

The much anticipated Fallout show finally dropped on Amazon Prime Video, based on the acclaimed games of the same name. Given the games particular visual style, humour and open world gameplay there was a lot interest in how this would translate to a TV series. Thankfully, the creators have done a faithful recreation of the world, full of references for players and hopefully interesting enough for those being newly introduced. It tends to fall a little flat as a constructed show, with the plot pushing the character decisions to a point of disbelief but tends to move fast enough, and with enough variety that the clunky writing can be somewhat excused. ...

April 29, 2024 · 3 min · 467 words

Demystifying SemaphoreSlim

Whenever I go to utilise SemaphoreSlim, I stare at the constructor parameters in bewilderment. What exactly is the difference between initial count and max count, do I need both and why? By way of analogy lets break it down. Analogy: The Bouncer Imagine owning a nightclub that can safely contain a number of people at any one time. To control this, you’ve enlisted a bouncer that hands out tickets. If the bouncer has a ticket, it’s handed to the next person in the queue and they’re allowed in. If the bouncer has no tickets, the queue waits until more are available. ...

April 27, 2024 · 5 min · 980 words

Grafana Custom Resolved Alert Message

Grafana templates allow generating custom alert messages based on the alert details. However by default the firing alert and resolved messages are the same, typically taking from the summary annotation. This can make for resolved alerts looking at first glance like they’re still a problem. To make it easier to distinguish between firing and resolved alerts you can use a custom annotation that only shows for resolved alerts. Let’s say we have an alert that fires on over 80% CPU, the annotations could look like this. The “Summary” is the message to send when firing. The custom “Resolution” message is to be sent when the alert is resolved. ...

April 3, 2024 · 2 min · 228 words

Isometric Tile Selection in Godot

Isometric games have a unique problem that “lower” tiles (with higher Y values) can overlap those that are higher up. Likewise, a tile texture will most likely not be fully contained within the cell that it belongs to. Because of this, when we want to select an item in a cell, we can’t rely on the local_to_map function that would typically be used for non-isometric 2D tiles. Take the following. The object we want to click on is the green cube. If we were to simply use local_to_map we might get one of the tiles that sits behind it, depending on where the object was clicked. ...

November 3, 2023 · 2 min · 416 words

Mission: Impossible – Dead Reckoning Part One

Dead Reckoning Part I continues the M:I formula of high octane action sets, questionably advanced technology and criss-crossing of loyalties, to an almost paint-by-numbers level. Our heroes find themselves against an omnipotent entity that has no clear motivation, and a villain with plot armour enough to match a tank. Although a fine action movie in it’s own right, it’s missing a certain spark from the previous instalments. Instead of breaking into some high tech facility with locks and bypasses, they’re mostly chasing a McGuffin which doesn’t lend itself well to the standard heist setup, execution and payoff. Given how the movie ended I suspect we’ll get all that in Part II. ...

July 23, 2023 · 4 min · 803 words