I have a small hobby project over at kollektivkart.arktekk.no that is for visualizing changes in public transit in Norway. For some time I’ve been wanting to do some visualizations on public transit lines. For example, plot the mean delay at each stop used by a line over time. When trying to do some concept work on this, I discovered a puzzle in the data! Many lines go in two opposite directions. Here in Trondheim, Line 3 goes from Loholt to Hallset, but also from Hallset to Loholt. The way...| Robin's blog
This post is part of the series on no-ops linux deployment. The first post covered local development of linux server configuration and essential configuration. The previous installment covers a janky podman installation and configures a reverse proxy to send traffic to a simple container deployment. This is the final post. It covers a more challenging deployment with jobs and rolling restarts, and discusses the strengths and weaknesses of this approach to hosting. After the previous post, we ...| Robin's blog
This post is part of the series on no-ops linux deployment. The previous post covered local development of linux server configuration and essential configuration. This installment covers a janky podman installation and configures a reverse proxy to send traffic to a simple container deployment. The final post covers a more challenging deployment with jobs and rolling restarts, and discusses the strengths and weaknesses of this approach to hosting. At the completion of the previous post, we ha...| Robin's blog
In Running containers on no-ops linux in 2025 I wrote about moving my hobby projects to a European cloud provider. I did an initial, manual setup in Hetzner, which I’ve now automated. This weekend, I tested the setup. It takes me a few minutes now to get everything moved to a new host, and most of that has to do with DNS. I’ve got a reproducible setup, I can quickly provision up a machine locally or in any cloud that has Ubuntu 24.04. Reproducible infrastructure is ✨liberating✨| Robin's blog
This is a note to myself about how to prioritize wisely. Or perhaps, it is an effort to commit to text a healthy mindset for myself. I have been trying to get into this mindset over a timeframe of some years now. I am making some progress, but it’s slow and not without setbacks. You can read it if you’d like, but this is my own advice for me. It may not apply to you.| Robin's blog
Working with SQL can sometimes be painful, especially when you have composite keys and many tables to join. Today I want to write a helpful tip for designing data models with such keys, to make it less painful to handwrite SQL for them. TIP: Introduce a consistent naming standard for all columns that take part in a primary key, so that the column has the same name in all tables it is used, also where it’s on the referencing side of a foreign key.| Robin's blog
When I was a kid, I thought adults knew everything there was to know. When I was a junior developer, I thought the senior developers knew everything there was to know about software. As anyone who has made some progression in life knows, nobody gives you the big manual with all the answers when you level up. You’ll still be you. Just with more responsibility and more experience. But the experience does not come from age, it comes from actually having to try. It’s okay to have no idea what...| Robin's blog
Not long ago, I wrote about running containers as part of moving my hobby projects to European cloud providers. That post was focused on running good old Linux servers. I briefly mentioned BunnyCDN but didn’t dive into the details. It’s time to dive into the details! What the flark is a CDN? A content delivery network is a geographically distributed network of servers that can deliver content to your users, close to where they are. It’s useful, because the speed of light isn’t fast en...| Robin's blog
It’s been almost a year since I last posted an update on eugene, the CLI tool I’m building to help people write safer SQL migration scripts for postgres. I announced this tool in Careful with That Lock, Eugene: Part 2. At the time, eugene would execute a single SQL script, recording all the locks acquired and warn about possible downtime due to migrations. It could produce JSON suitable for automated tooling and Markdown suitable for human reading and using in CI comments/checks. That ver...| Robin's blog
I have a few projects on my GitHub that I sometimes work on: eugene is a postgres SQL migration checker, sort of like shellcheck but for database migration scripts. It can parse SQL, or trace the effects of the scripts in a database and report about things that could lead to outages in production. It has a fancy documentation site here. pyarrowfs-adlgen2 is a connector between Apache Arrow and Azure Data Lake Gen2. It’s good for reading and writing files in storage accounts with hierarchial...| Robin's blog
I am Robin and this blog is a place where I can write about things I find interesting. I’m an experienced software engineer, living in Trondheim, Norway. I work as a consultant for Arktekk. There are lots of topics related to my work that I’d like to write about: Things I learn. In my line of work, I learn something new almost every day, and I’d like to get better at writing down some of those things. Debugging and tools for debugging complex systems. I love a good debugging story and w...| Robin's blog
Imagine entering the biggest library in the world. You peer down an incredibly long aisle with wooden bookshelves brimming with books. You can see multiple such corridors, all lit with a comfortable warm light. There’s a rich smell of old paper. You can hear some muted voices, perhaps arguing in a whisper. It’s perfect, but vast and difficult to make sense of. Just this day, it doesn’t feel like such a terrible ordeal to just wander for a while, see where your legs take you. Maybe you...| Robin's blog