Drone CI’s when
for deciding in which cases to run steps/pipelines targets the merge target branch for PRs and not the actual PR’s, also it pulls from refs/pull/<num>/head
instead of refs/heads/<branch>
so you can’t target the branch itself using the pull_request
event (use push
on the pipeline and then branch
for the step instead).
02 August, 2025
In shell scripts if you do "$@"
it will actually expand “quoted sentences” correctly, and if you just do $@
it will always unwrap them into single words, I thought that if you did "$@"
it would combine all arguments into a single argument, and what it does is do what I thought $@
alone did.
I.e., with "$@"
the arguments "one two" three
will be 2 arguments, the first being "one two"
, and without it will become three arguments, all separated by space.
The <link rel="canonical" href="…">
is a bit like a correlation ID between services and I need also to have it on my canonical page, because if someone sends it with ?utm_source=foo
it could be a different page than the one without the query string.
Python doesn’t require typing.Dict
and typing.List
for those types since Python 3.9, you can just do dict[]
and list[]
.
The scripts/commands inside a shell script inherit access to STDIN when you call them, so if you have a shells script that only has cat
and you do ./script.sh < script.sh
then it’ll output the content of itself
You can view the webhooks that GitHub sends in your project settings, so for example Drone CI getting notified and exactly what information that goes into the payload, and when/if it was sent, is available there.
Go to Settings
-> Webhooks
and then click on the integration you want to look at.
01 August, 2025
You can enable the fingerprint reader for sudo on macOS, and pressing my finger on a button beats having to type the password, steps:
cp /etc/pam.d/sudo_local{.template,}
- Edit
/etc/pam.d/sudo_local
and uncommentauth sufficient pam_tid.so
.
The reason for doing this in sudo_local
is that this file will not get reset with system changes from Apple.
More frequent, smaller posts
I’m trying something new here. Instead of waiting for fully-formed thoughts, I’m going to share more as I go: quick things I’ve learned, half-baked ideas, useful links. I’ve added some structure to keep things findable, but the main goal is just to share more often.
The main feed will give you everything I post, if you only want certain types of posts, I’ve also made section-specific feeds. The blog feed is what you’ve been getting if you were already subscribed.
[… more]24 July, 2025
Your name is still on it
learning to ride the AI motorcycle without crashing
A colleague recently said something that’s been rattling around in my head: “AI gives you speed, but it doesn’t give you direction.” And the more I use these tools, the more I think that undersells the danger.
I have been wondering how to think about AIs (or genies) and how computers are like bicycles for the mind, as Steve Jobs put it, and I think these tools take it further. They are more like motorcycles for the mind. They go really fast, and you better not treat them like a bike, because you need to know what you’re doing. How to handle that thing. You need to make sure you don’t try to go too fast too soon, or for too long, because you’ll get speed blind and… things will happen.
[… more]12 July, 2025
Which hat are you wearing?
...you wouldn't wear a beanie to the beach
I was in an incident review recently where one of the problems was a human going too fast. This process is very manual, repetitive, and boring, and it rarely fails, so we skip some steps. That mostly works (see Why Do Things Go right?), except when it doesn’t. Ripe for occasional issues and likely in need of automation.
I believe we often skip steps because we don’t know why we do them. It’s not tedious for tediousness sake, it’s often there because it’s important. And until we have the automation, or maybe we’ve intentionally chosen not to automate it, we need to find some way of helping the human ’live the situation.'
[… more]07 July, 2025
Working with Go's test cache on CI
be fast by avoiding work, while doing the important work
I was trying to speed up our slow CI by caching Go builds. The easy win was caching Go’s module downloads (via GOPATH
), but when I added GOCACHE
for the build cache, I got a pleasant surprise: the tests were caching too. 🥳
I shared the change for review, and a colleague raised a great point: “What about our black box integration tests?” These tests hit APIs and external services that Go can’t track as dependencies. If they cache when they shouldn’t, we might miss real failures: the tests would pass because they didn’t re-run, not because the code actually works.
[… more]03 May, 2025
Running effective meetings uses the same skills as running successful projects
From meeting minutes to project milestones
You’ve probably sat through your fair share of meetings where time slips away as conversations wander aimlessly, not unlike being dropped into an unfamiliar codebase, with twisting branches all alike.
A colleague asked for feedback on a meeting they ran, and after sharing my thoughts, I realized my advice about meetings sounded exactly like how I talk about planning projects. This got me thinking: the skills for running good meetings and successful projects are nearly identical.
[… more]15 April, 2024
Day-to-day automation using Alfred on your Mac
reducing TOIL outside of your DevOps practice
I try to be aware of where I have friction in my day-to-day when working at my computer, keeping an eye out for TOIL to remove. Whether it’s from manually repeated actions, or from differing behaviors across apps and services I use. When I identify any of these I try to spend some small amount of time automating or changing how I work to improve.
All of these things don’t necessarily make a lot of sense from how much time I save, but, it also makes me happy to spend a bit of time improving my environment, and spending a bit of time to make me happy is good enough for me.
[… more]01 February, 2024
How to make Docker resume downloads
…download that final 100KB and not 200MB again
In the Docker Desktop app you can go into Features in Development
and check
Use containerd for pulling and storing images
.
Or you can do add the following to Docker’s daemon.json
file:
{
"features": {
"containerd-snapshotter": true
}
}
This comes from a comment in a ticket for resuming downloads when they fail.
[… more]05 February, 2022
Sticky blocks in Roam
floating along in your sidebar
I use Roam Research as my primary way of thinking and keeping track of
tasks. My current workflow has me creating a list of all tasks I want
to get done, and then I drag them to either Done
or some follow-up/waiting
area for future action. So I only see things I can act on now.
My list of things to action can get quite long, and when I’m processing
follow-up items, I would have a hard time dragging them to Done
because it
was too far away in the sidebar. So I wished I would make the Done
float
with me, so I could always have a quick way of pulling it there.
14 November, 2015
How to find your Apple Watch when you've misplaced it
How I ended up being a sonar bear
I just misplaced my Apple Watch in my apartment. Walking around looking for it, and getting frustrated, I was thinking, “There ought to be a way to make it make some sound, then I can play Marco Polo with the watch”. But my Google-fu failed me: no obvious way to “ping my watch”. There’s functionality for pinging the phone from the watch though.
But there’s a way to make some noise: testing out the alert volume in the companion app on the phone.
[… more]27 October, 2015
Using multiple versions of Python on Snap CI
Why just play with one snake?
I’m running an open source project called gocd-cli which is, well, a command line interface for Go continuous delivery. The intention is to make it easier to handle common tasks around Go. But this post isn’t really about that.
This project is supposed to be as portable as I can make it, becuse the original need I felt for it was born on RHEL6. Which is blessed with Python 2.6 by default. And we should definitely be looking to the future, meaning supporting Python 3, and I luckily got a pull request for just that. Since I couldn’t find any free hosted Go around I went for the next best thing, Snap CI, which is also built by ThoughtWorks.
[… more]18 January, 2013
Python and its included batteries
I’ve for almost a year now been using Python as my day to day language as it’s what is used at my job. I’m starting to come around to really liking most parts of Python now, although there is definitely parts that are way more clunky than I would expect from a language so popular. And especially given how much talk there’s about the included batteries and to a small extent how there seems to bit of dickishness involved with hard core Python people. For an example of the latter just:
[… more]07 January, 2011
Keeping your Varnish farms configuration in sync
I spend some of my free time helping out with server administration and programming for the Swedish Pirate Party, Piratpartiet (look ma, X-Varnish), and we use Varnish for our caches. At the moment it’s just used on some of our projects, but we’re going to migrate most of our projects to be behind our Varnish caches.
The thing is though that we got two hosts running the exact same configuration, and we’d like to keep those hosts in sync. A quick search on Google gave me nothing for syncing varnish configuration over several hosts, or a farm as it were. So I took matters into my own hands and wrote varnishsync, a little bash script that uses rsync and ssh to sync the configuration folder and then to load and use the new configuration.
[… more]05 December, 2010
How to: Setting up a Wikileaks mirror
Yesterday I wrote a quick step-by-step guide for installing apache and setting your system up for Wikileaks mass-mirror project in Swedish and I’ve had requests for it to be translated into English.
This guide assumes you’re running Ubuntu or a Debian based system.
I’ve made a script that does all the steps below, feel free to use it!
The script: http://sanitarium.se/files/wikileaks-mirror.sh
Usage: wget http://sanitarium.se/files/wikileaks-mirror.sh && chmod +x wikileaks-mirror.sh && ./wikileaks-mirror.sh
Installing Apache and adding the wikileaks user
#
is the prompt as root: