DIY Smart home project: Restoring the wall switch
Background
In a previous post, I wrote about building a presence sensor to automatically turn my bedroom lights on and off (smart bulbs connected to ...
Background
In a previous post, I wrote about building a presence sensor to automatically turn my bedroom lights on and off (smart bulbs connected to ...
Integrating with external services is a pain. The technical challenges—reliability, performance, caching, downtime, and so on—are well-known and ...
Everything is fucked, no systems are sound, all decisions are wrong, and we should destroy all software.
I've noticed this recurring trend at my last...
Context
At a previous job, we built a service we called our operations platform. Its aim was to unify the SaaS tooling used by our ops teams with dom...
Background
I got these Antela smart bulbs a while ago. They connect to my home network, and I control them from my phone via either the Tuya Smart ap...
I noticed a pattern when I join a new company. I'm being onboarded, someone is explaining their systems to me, and they make a joke about how it's un...
I've finally completed the first year (of three) of my Bachelor's degree in Engineering at IU Hochschule. Technically speaking, it's my second first ...
As practice in thinking and talking about practical software design approaches (at the high and low level), I want to explore some scenarios from fir...
With the AI hype going around, you may have come across the phrase 'vector search', 'vector database', or 'embeddings' lately. Here's an exploration ...



Watching Dawn of the Planet of the Apes gave me some thoughts about dictatorship, and more broadly, leadership. Mostly regarding at work, but also...
How SVG works
The common way of representing digital images is via pixels. Take an image and break it down into small squares ('pixels'), where each ...
We have the low-level tools for connecting to the Faktory server, executing commands, fetching data, logging, and so on. Now, I'll work on the high-l...
This is a dump of my learnings and experiments while going down a little rabbit hole.
Concurrent rate limiters
I was studying Sidekiq's page on rate ...
Let's talk about cardinality. Can we talk about cardinality please, Mac? I've been dying to talk about cardinality with you all day.

In maths, cardi...
Goal: A brief exploration of what it means to 'pack' and 'unpack' bytes.
Inspiration
I've come across Ruby's Array#pack and String#unpack methods, bu...
In this part, we'll focus on supporting some more parts of the Faktory protocol.
INFO
The INFO command returns information about the Faktory instance...
Separating responsibilities
Following on from Part 3, it's time for some refactoring. Thus far, all of the code has been in the TcpClient, but it mak...
At this point, I'll take a break from Faktory-focused functionality to address the shortcomings I raised at the end of the last part. Specifically, I...
This is a re-post of an article I wrote for my company's blog.
Here's a story of how we improved our CI run times in one of our core Ruby services by...
I want to share a little algorithm I wrote to solve a puzzle. It's fairly basic computer science, but I feel a bit proud of it because I worked throu...
Now I'll turn what I did in Part 1 into code.
First, I'll set up a new Composer project. My composer.json looks like this (truncated):
{
 'require...
My recent queue foray put me on the scent of Faktory, a language-agnostic queue server made by Sidekiq's author. I noticed there wasn't a good PHP cl...
No big revelation here, just writing this as a reminder to myself next time I try curl localhost from WSL and it doesn't work:

Don't use localhost o...
This post is part 4 of a series where I build a task queue system. Other parts:

Part 1
Part 2
Part 3


Before we continue, at this point, you'd have...