If you happen to find yourself in a sysadmin position, or a position where you just so happen to maintain someone’s infrastructure, chances are that at some point in time the topic “we need a cache” comes up.
You think for a moment and reach out for Redis, because you’re used to it, it’s fully featured, and it works! You remember it being a good, solid cache, and…
If you enjoy using the command-line, chances are you’ve wanted to send e-mails from your command line at some point. TUI clients like mutt / neomutt / aerc are often used with their own configuration file, tools like mail or other system daemons will just default to using whatever mail service you have on your host, and git-email can do a mix of both.
I figured that instead of…
In my previous two posts I talked about rrdtool and about Munin. Today I want to showcase how the two can work together using one of Munin’s more advanced features, which are virtual plugins using aggregate graphs.
Using aggregate graphs, you can instruct Munin to build a graph from multiple data sources. “Virtual” plugins are really just plugins that don’t actually…
After my previous post on Monitoring with Munin I want to shine some more light on the tool powering Munin, RRDtool. RRDtool is a command-line based time-series database that also allows you to export its data in a highly customizable graphical format. To get an idea of the graphs you can make with it, see the official gallery.
I’m going to showcase how to store and graph git repository…
The main go-to for monitoring seem to be using Prometheus and Grafana these days, and both are great at what they do. I’m using Prometheus myself - primarily for alerting - and it is amazing!
While I use Prometheus for alerting, most of my long-term metrics end up in Munin instead. Munin is a lot less “fancy” than Grafana, but you could equally say that it is a lot simpler…
What if you could enter somebody’s email, and if that person had a PGP key, your client would automatically choose it? Web Key Directory (WKD) allows you to set up exactly that.1 This blog post explains how to set it up for the case where you have access to the web server of your email domain.
First off, make sure you have no wildcard DNS entry for all your server’s subdomains.
Let’s imagine the following story:
You open a link to a website and you are greeted with a “we would like your permission for…” popup, if you’re very lucky, they may even have a way to decline it without clicking through menus, if you’re even luckier, the menus might not even have some very strange “please wait while we save your preferences”…
My main personal computer is a MacBook Air, specifically the “Early 2014” model. It’s a great device: slim, quiet, and most importantly, working on it feels good. In 9 years of heavy usage I have never had a single issue with its keyboard. On a recent MacBook Pro that I received for work, I regularly ran into issues with the keyboard, not to mention that the new keyboards just…
If you have a large list of things in Elixir and then want to sort them in order to get the top n for something, chances are that your existing sort using Enum.sort may be relatively slow, as it rebuilds the entire list. We can do it more efficiently by simply accumulating the top n in an optimized data structure.
Erlang provides this optimized data structure for us, namely :gb_trees. We…
Updated 2026: Use Site.Params.Author instead of the deprecated Site.Author.
We’re not all running our blogs on ActivityPub yet, so how do we allow people to comment on our posts? The most straightforward way for me was to simply add a link to email me about a post to the posts, with an automatically populated Subject: header based on the title of the post.
The below snippet can be…
When this blog post goes live, my new e-mail setup is live. Try sending me a mail, my postfix service will happily accept it, if you look legit enough :-)
Managed e-mail seems a solved problem these days. You can rent cheap managed mail services, add their MX, SPF and DKIM entries to your DNS, and you’re done. Why bother selfhosting it?
For one, curiosity. I wanted to learn about…
If this post goes live, I have ported my blog to use Hugo. I liked my pandoc setup, and I still love the entire make-with-pandoc setup purely for the simplicity of it, but kind of wanted to give Hugo a second try. Don’t worry, Cool URIs don’t change, so aliases for the old locations (except for the RSS feed, please port those from /blog.rss to /index.xml or /blog/index.xml) are in…
Updated 2023-03-20: the “Recents” tab in Finder will also clear as a result of changing this.
Are you using the Spotlight or Recents feature on your Mac? If not, here’s a quick way to extend battery life and speed up your system.
Spotlight uses a background process called mdworker to index your disk. Especially on older Macs, and especially after changing lots of files on…
Debian’s postgresql-common package supplies the pg_virtualenv tool, which spins up a PostgreSQL database which can be used for running tests that require a database, testing upgrades, and other purposes. The tool is configured to spin up a database quickly (e.g. using fsync=off) and is thus ideal for these usecases. The database is wiped as soon as the command supplied to pg_virtualenv…
After seeing numerous Python web applications here and there, each with their own custom migrations framework(s), ORMs, view implementation, authentication, and unit testing standard, I have been led to formulate Christ’s First Rule of Programming:
Any sufficiently complicated concurrent web application built with Python contains an ad hoc informally-specified bug-ridden slow…
Elixir has been my go-to language for fun side projects for a while now. Most of the times I’m not using it, I start thinking “this would not have been a problem in Elixir”. But how do I deploy it?
As with everything else, I deploy my Elixir apps with Ansible, taking roughly the following steps:
Installing Elixir, Erlang and other system package dependencies Get source…
My MacBook Air had a 128 GB SD card to expand its storage for quite some time. I use this partially as a second backup storage in addition to my main server, but I’ve also put my Downloads folder there for a long time to save space on the main drive.
Back when APFS came out, I formatted the SD card with it along with encryption (with a long password, stored in Keychain).
If you want to host a simple and lightweight git server along with a pretty web interface, Gitea is the way to go. After setting up blog deployment via Ansible, I set out to write a deployment for a personal Gitea server.
All .yaml files of the final deployment role can be found at the end of this page.
Since Gitea is contained within a single binary, deployment for the server itself will…
Recently I’ve gotten a new server and I wanted to move my blog on there. The blog more or less runs entirely on NGINX, should be served via HTTPS, and should be set up entirely via Ansible (including certificates), so I started wiring up my Ansible roles.
The overall procedure is the following:
install nginx configure nginx together with certbot ask Let’s Encrypt for…
After letting it sit there for a while, I figured that it’s time to brush up my website from the odd setup that I had on there. Namely, the old tech stack was:
Python & Django to serve posts and provide an Admin interface to edit posts on gunicorn as the WSGI application server Docker for deployment nginx as the reverse proxy If you think about it, three of the four components here are…