YT channel recommendation for neovim and zsh users

I don’t think I ever copied more vim or zsh configuration from anyone than from ChrisAtMachine. Looks like I found a soulmate. 😊 His YouTube channel is well worth watching!

New year, new Linux workstation

Not counting IoT devices and the Raspberry Pi in my PiDP-11, I haven’t had a Linux machine at home for more than 10 years. End of last year, I decided to get a dedicated Linux box under my desk again so I can enjoy the full Linux experience when I do software and infrastructure engineering.

I got my Linux machine today, a Tuxedo Core One midi tower. I installed it with Manjaro, my new favourite distribution. The process took only a few minutes because I came prepared with a USB SSD that manages a selection of ISO install images using Ventoy. With the OS installed, I only had to go through my well-maintained Linux Setup checklist. A few hours of setting up projects later, the machine was pretty much ready for prime time, and so far, I’m very happy! Having everything I need for setting up a Linux machine stored in the cloud, for example on Gitlab or in Dropbox, made the whole affair a very streamlined experience. Compared to my Ubuntu installations in the past, Manjaro made things much easier as well. The AUR is an amazing package repository. As someone used to living in PPA hell, it blows my mind how much software is available from the Arch User Repository.

I did have a short panic moment, though, when I realised that I managed to order the box without a Wifi card. Somehow, these “Oh, so you actually have to…” moments keep getting more frequent for me. Maybe I’m spoilt by too many all-in-one Apple machines. Fortunately, I remembered that I still had a Netgear Wifi client “access point” in storage that I hadn’t yet put up for sale. I’m going to replace it with a more modern access point in WPS bridge mode to build an office LAN.

Even though I now have to switch monitor, mouse and keyboard between Linux box and Windows laptop, being able to quickly do so is going to make my work (and spare time) more efficient and fun. And two years into the pandemic, having more fun is important.

Making my own Nerd Font

Well-structured status lines in vim and shell prompts with version control symbols are a nice quality-of-life improvement. Unfortunately, not all monospace fonts come with the necessary PowerLine glyphs. For example, my favourite font is Operator Mono, and it too doesn’t have PowerLine symbols built in.

Thanks to the NerdFonts font patcher, I was able to generate a font variant that has the necessary symbols. I simply ran the tool as a Docker container in my fonts directory:

$ mkdir HCo_OperatorMonoSSmNF
$ docker run --rm -v $PWD/HCo_OperatorMonoSSm/OpenType:/in \
  -v $PWD/HCo_OperatorMonoSSmNF:/out \
  nerdfonts/patcher --windows --powerline --powerlineextra

Now my spaceship shell prompt sparks even more joy.

Weeknote 37/2021

A big chunk of my work time in recent weeks has been going into getting Netdata set up to monitor our server fleet. Where we already have it in place, it’s an amazing help in investigating resources issues and bottlenecks. I’m looking forward to getting alerts about issues that might occur soon. Well, I don’t look forward to getting alerts, but I’d rather be alerted about risks when they’re building up than when they already hit. And that’s what Netdata is going to make possible by extrapolating historic data.

I’ve finally managed to make the continuous integration process for our Chef cookbooks reliable by switching from Docker to VirtualBox. Before, we tried to run our tests in Docker, and that failed far too many times because of issues with iptables, systemd and similar system-level components. To be precise, we still use the Gitlab runner for Docker, but I’ve built a custom Docker image that allows test-kitchen to use VirtualBox VMs just like our development machines.

The Windows laptop that replaced my iMac works beautifully for both work and gaming but is far too heavy to lug around except for longer vacations. That’s why I got myself a lightweight companion in the Schenker VISION 14. I wanted to run it with Linux but was disappointed that that’s only possible with firmware that TUXEDO Computers keeps for themselves. I installed the Windows 11 beta instead and was again pleasantly surprised.

Despite, or maybe because of, all these accomplishments, I felt quite drained from Wednesday on. That’s why I skipped my live streams on Wednesday and Friday. I was able to recover nicely over the weekend, so I’m going to do my work in the public later today again.

Weeknote 34/2021

I’ve just returned from our summer vacation. I spent two weeks visiting friends and family in Germany; my wife and kids are staying for one week more. On one hand, it’s always nice to see people again. On the other hand, I spent even more time in between get-togethers alone in our guest room than I usually do to recharge my introvert batteries because of the ongoing pandemic and the dubious behaviour of so many people. I’m longing for a future in which I don’t have to fear for my health anymore while travelling.

Looks like the rest of this weeknote is going to be about new shiny things!

New types

I’ve been into mechanical keyboards for decades but I didn’t start really getting into custom keyboards until 2019. I started taking part in group buys where everyone chips in in advance to get a specific keyboard case or keycap set manufactured, but then COVID disrupted everything. To illustrate this point: Just recently, I received a keycap set that I ordered back in February 2020!

In the last few weeks, I got to build three new keyboards:

  • The M0lly is a design replica of the classic Apple M0110A keyboard of the Macintosh Plus. It has a 60% layout plus a separate numpad. This keyboard is quite the chonker and weighs in just below 4 kg fully built!
  • The Grid650 is a 65% keyboard that has a replaceable front module with many fun options. I built it plateless, which means that the key switches are only held by their solder joints in the PCB. I still managed to get all switches aligned properly except one that I’ll fix at a later time.
  • The Corne is a split ergonomic keyboard in a 3x6+3 layout, meaning each half has 3 rows with 6 columns of keys plus 3 thumb keys at bottom. Its standout feature, apart from colourful RGB lighting, is the two tiny OLED screens that can be programmed in the keyboard’s firmware.

Even though they’re very different, I like all three keyboards. Not only do they all have pretty high quality, I also picked the right key switches for myself. M0lly and Corne have Zealio v2 switches with 68g springs, the Grid650 is built with Boba U4 with 62g springs. Looks like I like tactile switches over the linear ones I tried back when Novelkeys Cream switches became all the rage. And all three keyboards run on the open-source firmware QMK that allows me to customise their behaviour to my individual preferences.

For example, by programming a “leader key”, I can enter German umlauts easily. I press the leader key, followed quickly by the letter (a, o, u) whose umlaut I want; once for lower case, twice for upper case. (I’m probably going to write a separate article on this topic.)

(Almost) feels like paper

I’m clearly late to the game in that I recently applied a Paperlike screen protector to my iPad Pro. It definitely makes using the Apple Pencil a better haptic experience, but I don’t get to use it much. Still, the matte and slightly rough texture of the surface makes the iPad screen easier to view in different lighting.

A broader view

My company’s fiscal year ended in July and we had a bit of money left, so I got to purchase a new monitor. Up until now, I was using my 10 year-old Apple Cinema Display with my Windows laptop. The monitor still works okay, I don’t really mind that it isn’t a Retina screen. But it gives off a lot of heat and doesn’t have any manual controls for brightness and contrast, not even an On/Off switch. It was built to run with a Mac, after all. So I treated myself with an Alienware AW3820 34” ultrawide monitor. It floats above my desk on an Amazon Basics monitor arm. With its resolution of 3440x1440, I chose screen real estate over pixel density. And with all this space I have now, the Fancy Zones feature of Windows Power Toys (window management similar to macOS tools like Moom) can really shine. It’s great!

For live-coding on Twitch, I was able to segregate a 1920x1080 region on my screen that I share with my viewers, and there is still enough room left on the screen for my streaming applications. There are now very few occasions when I have to turn my head to the laptop screen on the side (also on a monitor arm). I feel like I’ve pretty much reached perfection in terms of an ergonomic and productive workplace.

dotenv and direnv for better developer QoL

The latest RubyTapas tutorial taught me the difference between the dotenv and direnv tools. While they have significant overlap, they complement each other quite nicely. dotenv simplifies both development and production ops by importing environments variables either from a .env file or the application hosting platform. direnv on the other hand augments the dev environment even further; not only can it add dev-only variables but also modify shell settings like extending $PATH on a per-project basis.

System upgrade complete. πŸ’‰

Verify your assumptions

That’s what I keep preaching to my team but still fail at myself every so often.

This week, I wasted a whole day implementing a fix for a bug that wasn’t there. My task was to add one line to a configuration file in a Chef cookbook. When I ran its test suite, it surprisingly failed and it was clear that my simple change couldn’t be the cause. I assumed it was due to recent changes in software packages installed by the cookbook. So I started adapting our old code to these changes, and one change led to another, and another, until I finally realised that over the course of multiple hours, my one-line bugfix had turned into a full code overhaul. How did I get here?

I decided to start from scratch. git reset --hard HEAD. I quickly fixed my config file and ran the tests. When they failed again, closer inspection revealed that it was actually just the same test failing twice. The cause was a bug that had found its way into the main branch without breaking the CI pipeline (finding the reason for this will be interesting). It had been there all along! After another one-line fix, my change was ready for review. Round 2 had taken me less than half an hour.

The lesson: Don’t rush into battle blindly. Look closely. Identify assumptions and verify them. It might just be windmills!

Switching keyboard layouts easily on Windows 10

It’s fun to follow in the footsteps of @isotopp getting acquainted with Windows 10. In a recent post, he explained how to set up multiple keyboard layouts, a necessary task when you’re switching between ANSI for coding and German for writing.

I’ll add a nifty shortcut for reconfiguring your keyboard with your keyboard: You can switch between layouts by holding the Windows key and pressing Space.

After all these years, it still doesn’t stop being fun when articles like “How I navigate tmux in 2021” teach me a few tiny bits to improve my setup.

Challenged by a blogging challenge

Friend and colleague Markus inspired me to join him in the Daily Blogging Challenge. Since my wife got ill two weeks ago, I didn’t get to deliver a single substantial work result. The clear objective of publishing an article every day seemed like a good way to get a sense of achievement back.

Alas, this new ambition might end right where it started. The writing prompt for today, “routine”, got me thinking how my daily routine fell apart when I had to take over running our household.

Which, in hindsight, I did not. All I did was add a few household tasks to my existing, functioning home-office routine. Underestimating the effort required to run a family home left me in constant firefighting mode preparing meals, helping my kids in remote learning, keeping the fridge stocked, intervening in fights to the death, picking up medication from the pharmacy, and making sure the house didn’t drown in dirt.

The amount of distractions generated by four people confined to their own home made getting some decent length of focus time impossible. Far too many interruptions ranging from “Can I please have another cup of tea?” over “Did you bring X from the supermarket?” (narrator: “He didn’t.”) to “Dad, he keeps kicking me!” later, I resigned and gave up on planning my day altogether.

Unsurprisingly, abandoning my routine didn’t improve things. “I’ll be unproductive again today” became a self-fulfilling prophesy sponsored by Youtube and Netflix.

I should just have taken time off work. Even if you have a robust daily routine like mine, you can’t just dump another day job on top of it and expect it to survive. This week, I’m going to clear my day for a “family routine” in the hopes of both increasing my chances of achieving my new goals, and eliminating the frustration over not meeting my old ones.

It remains to be seen if there’s any space left for daily blogging, though…

It’s far too cold to even consider buying a barbecue set. But it’s a good time to think about reclaiming the web.

➑ Why the Indieweb?

Automating my desktop with Hammerspoon

After my unsuccessful attempt at adopting a tiling window manager, I was looking for a more flexible way to arrange my windows efficiently on macOS.

In the past, I had tried dedicated apps like Mosaic or more generic ones like Keyboard Maestro and BetterTouchTool to assign window movements to hotkeys. The problem with this approach is that you’re going to run out of key combinations quickly even if you set up a special Hyper key.

A good way to avoid this issue is a modal approach where a single key combo switches you to window management mode. In this context, you then have the full keyboard available for all kinds of stuff. I had forgotten that Moom actually works this way, so I decided to finally give Hammerspoon a try. Up until that point, I was afraid that coding your own desktop automation in LUA would be too deep of a rabbit hole. But it’s actually not too bad. You can find the results of only a few hours of procrastination in my dotfiles repository.

Another fear of mine was that an open-source tool that interacts with the macOS GUI as closely as Hammerspoon would be prone to be broken by Apple every other week. I’m positively surprised that this doesn’t seem to be the case. Its authors seem to handle even OS upgrades very well.

This makes window management pretty much a solved problem for me. Fortunately, Hammerspoon offers many more possibilities to spend my time not getting things done…

Weeknote W5 2021

To tile or not to tile

Looking at Twitch streams and Youtube videos around Linux, it seemed to me that everyone was into tiling window managers. This week, I decided to finally try this approach of filling and subdividing the whole screen area. On macOS, I installed yabai, and on Linux (more on that below), I chose the popular i3.

After a few days of the tiling life, my conclusion is that I don’t see much benefit in forcing my application windows to fill up all the available screen real estate. Maybe it’s because I already have a habit of tiling my windows manually – when it makes sense. However, often it just doesn’t make sense. Some windows really don’t like to be squeezed into a tiny space, and even on a 13” screen, a full-size terminal window isn’t of much use to me. I’ll keep my windows floating. If I really want to tile them, there’s always BetterTouchTool.

Linux on Apple hardware

Another item of curiosity this week (is this some kind of lockdown syndrome?) was if 2021 could be the year of Linux on the Desktop for me. While I still enjoy the stability and user-friendliness of the macOS ecosystem, some of its constraints do annoy me from time to time. I have an unused Macbook Pro 13” from 2015, and it’s now running Ubuntu 20.04. My go-to applications like Brave, VS Code and Obsidian worked fine out of the box. But when it came to more specialised use cases, I quickly realised how much macOS spoils me with its choice of well-polished applications.

Maybe I will pursue a “best of both worlds” approach, where I do my management work on the Mac and my DevOps work on Linux. That is, if the hardware issues that drove me into Apple’s arms more than a decade ago don’t spoil it for me again. For example, there’s a 50:50 chance that after powering up the laptop, Bluetooth doesn’t work, preventing me from using a proper mouse and keyboard. Sigh.

Weeknote W2 2021

Re-launching my live stream

This week, I started live coding on Twitch again. I had planned to get going on Tuesday but didn’t have the energy; more on this later. On Thursday, I was ready to launch. It took only a few minutes of being online until many familiar names started popping up in chat. It felt so good. This year, I’m trying a different strategy. I’m going to focus on an area in which I have lots of experience: IT training, starting with a Ruby course. In simple terms, it’ll work like a book club where the participants work through a chapter of the training material, and we’ll talk it through on a weekly basis. I’m excited to see how it goes!

VS Code dev containers

Until now, I didn’t need a dedicated website for my live coding stream. I simply referred people to my personal blog. But with the Ruby course coming up, I need to have a permanent space where people find information. As always, I’m going to use Jekyll to build the site for FullStackLive.

I’ve been using Docker to run test instances of my Ruby projects for a long time because it makes separating their resources (the app, its database, other services…) so much easier. However, I always used scripts to interact with the containers. This time, I wanted to try a closer integration with my coding tools and set up a VS Code dev container. Thanks to Microsoft providing a big library of pre-built language images, setting up a dev container for Ruby development was painless. However, I had to invest a bit more time to get my dotfiles installed automatically after I realised that I didn’t have any of my familiar commands and shell aliases available inside the dev container. I’m happy with the result and am looking forward to build a more complex setup for Rails development.


In weeknote W1, I explained how I’m using the Sorted app for time-boxing my daily work. It’s helping me a lot to keep my focus on what I want to get done. Its auto-scheduling feature also is a great reality check that prevents me from expecting too much from the time I have available in between calendar events.

Where I took a wrong turn was when I added time tracking to mix. I had discovered the Session app that comes with my Setapp subscription and thought that it would increase my focus even more, and on the other hand make sure that I took frequent breaks as well. What happened instead was that I started to feel burnt out. That’s why I didn’t start streaming on Tuesday. I think that there were multiple reasons for this energy drain:

  • The Pomodoro periods in Session didn’t align well with my task slots in Sorted that are usually multiples of 30 minutes.
  • Getting interrupted every 25 minutes kept me from getting into a flow state.
  • I often ended up ignoring the timer completely, leaving me with frustratingly few tasks actually tracked.

This is not the first time that a new tool created more frustration instead of more productivity. Sorted stays, Session goes. I’m a slow learner sometimes.

Time to leave WhatsApp

If you're using WhatsApp, you've probably received a notification that the messaging service is updating its terms of service, notably their privacy policy, effective February 8th and with no option to opt out. It has prompted me, like thousands of other WhatsApp users, to switch to a more privacy-oriented service.

Since WhatsApp was acquired by Facebook in 2014, it was to be expected that eventually, the internet behemoth known for its gluttony of personal information would extend its tendrils to WhatsApp user data. This point is now. I don't want Facebook to know more about me, my preferences and behaviours than I do myself. I will not support its practices of influencing its user base and deciding who gets to see what information. That's why I deleted my Facebook account months ago. And now I'm joining thousands of WhatsApp users in moving my messaging over to Signal.

Signal has a flawless reputation for data privacy and transparency. There are other alternatives, for example Apple Messages. Mike Butcher's thread on Twitter is a good read. He also posted a comparison of the amount of data these services track of their users; the difference is stark.

If you're concerned about which information about you corporate giants track and use to their advantage (and I think you should be concerned), then use this opportunity to make a difference and help make the internet a safer space for human communication! Here's how. Say hello to me over on Signal. πŸ˜‰

Update 2021-01-11: I removed the mention of Telegram as a secure alternative because its app leaks unencrypted chat data to Telegram servers.

Weeknote W1 2021

It's the new year, and look, already COVID-19 is not dominating the headlines anymore! πŸ˜†πŸ˜­

This week, I've started to use my home office for work again, not only for fighting bosses in Castle Nathria.

Getting myself Sorted

Back in October, I mentioned that I was using TickTick for time-boxing my work. Since I didn't like the apps's UI, I returned to using Things for tracking my tasks, and manually blocked time slots for each of them in my calendar. In his recent newsletter, David Sparks mentioned the app Sorted, and for me it hits the sweet spot in terms of design and functionality. What I enjoy the most is its auto-scheduling feature which allows me to quickly recover from unplanned work or getting distracted. It assigns new time slots to my remaining tasks and shows me the fallout of what needs to be pushed to another day.

My modifiers went home

Inspired by t00mietum's keyboard layout, I gave "home row mods" another try. The home row is the row of keys where the fingers rest on ASDF and JKL;. "Home row mods" is a keyboard layout hack that puts the modifier keys (e.g. Shift, Control) on the home row. This is made possible by using the "mod tap" feature available in firmware like QMK where quickly tapping a key will trigger its usual function, but holding it will turn it into a modifier. For example, holding "D" now functions as my Shift key, and for symmetry, holding "K" does the same. First, this improves ergonomics: Having to stretch out my fingers less, especially the pinkies, feels substantially more comfortable. I'm actually using my new right Shift key for a change! Second, it frees up all thumb keys of my Lily58 for layer switching. I even put numbers and symbols on their own layers. Having a virtual numpad on the right hand side makes entering numbers easier than reaching up with both hands. My next split keyboard will not even have a number row anymore.

Coming up

Due to the exploding infection numbers in Ireland, the kids will not return to school on Monday, so that's going to be interesting. I'm going to pick up live streaming again -- with a new strategy.

Why I chose Obsidian over Notion for my PKM

After posting my recent weeknote mentioning that I use Obsidian for my personal knowledge management, my former teammate Andy asked why I didn’t use Notion like we do for our company wiki. I had to think for a minute and decided that I’d answer his question in another post.

Let me start by saying that these decisions are usually not clear-cut and a matter of preference. I could have used Notion for my PKM with ease and success. The reason I didn’t comes down to the different weights I subjectively give each product’s pros and cons.

Notion’s greatest strength is that it not only has a nested page structure like many other wiki-like systems. The feature it calls “databases” lets you build collections of pages with added custom metadata. You can use this metadata to filter and sort the collection, and you can save multiple filter and sorting combinations as “views”. Metadata can be aggregated to calculate counts, sums and averages. It even allows referencing other databases in a “foreign key” manner, which opens the way to complex multi-database data sets, with the single page still as its atomic building block.

Obsidian is much simpler. It’s a note editor for Markdown files. Its central feature is that it extends the Markdown standard to support the simple linking of files by surrounding the file title in double brackets. In file A, you can reference [[file B]], and when you view file B, Obsidian will display in a side pane that there’s an incoming link from file A. In other words, Obsidian automates bi-directional linking of Markdown documents. These “backlinks” are one of the core attributes of modern knowledge management. Notion recently added a feature that works similarly. (By the way, I don’t understand why it took us so long since the invention of Hypertext to realise the value backlinks have for PKM.)

You don’t need to know more about Obsidian to use it effectively. And that’s one of the reasons I prefer it for my managing my personal notes. I was able to import my existing Markdown notes with ease and didn’t have any learning curve to master.

Another important plus of Obsidian is that it’s an application running on my desktop machine. It’s fast. I don’t have to open a browser, click a bookmark and wait for the website to open, as is the case with Notion. I switch to Obsidian and start working.

The Notion team had an easier time to provide mobile apps for their web application. While it took them a while to make them work decently, the Obsidian team doesn’t even have any mobile application on offer yet. (It’s one of the major goals on their roadmap, though.) That doesn’t mean that I can’t access my notes from my iPhone or iPad. All I need is a cloud sync service (I’m using iCloud Drive) and a Markdown editor application. At the moment 1Writer seems to be the preferred iOS app because of its support for double-bracket links.

Since Obsidian data is just a bunch of Markdown files, I can use alternative tools even on my desktop machine. I could use another Markdown editor; I don’t because Obsidian is fine. I can use git to have versioned backups of my files. I can even use Ruby scripts to do maintenance or analysis tasks.

While Notion can also be used for taking, managing and interlinking notes, this is Obsidian’s core purpose. That’s why Obsidian offers features that probably didn’t have priority for the Notion developers. For example, on top of the backlinks feature, Obsidian offers a graph view that visualises the relationships between notes and allows for easy navigation across links.

What seals the deal for me is that Obsidian has a great user community where many people share their PKM practices and Obsidian experience. They also share CSS themes and plugins that extend Obsidian’s core functionality and personalise its look-and-feel.

TL;DR: I use Obsidian because it’s like an IDE for notes, a tool that allows me to do my daily knowledge management efficiently, without technology getting in the way.

Weeknote 50/2020

Taking notes

Writing my weeknotes will be easier from now on.

It makes me terribly sad that I didn’t learn to take proper notes decades ago. If there’s one thing the current note-taking craze has finally taught me, it’s this: If you want to get value from your notes collection, you need to be able to easily retrieve and process information when you need it. My previous attempts, however, were nothing but Write-Only Memory.

Things are looking much better since I’ve started using Obsidian. I’m even publishing my knowledge notes in the hope that they can be of value for others, too.

I’ve adopted the method of creating “daily notes” that serve as a daily anchor and link to the other notes that were created or relevant on that day. Each daily note has sections for accomplishments, highlights, disappointments and learnings. Now, all it takes to write my weeknote is summarise my daily notes of the past week.

DrupalCon Europe

Last week, DrupalCon Europe took place, not in Barcelona but on the OnAir online platform. I had blocked my calendar from Tuesday to Thursday to watch talks, and some of them inspired me to dive deeper on their topics. I wasn’t in a mood to do smalltalk in the “virtual hallway track” but I intend to do so next time I’m attending an online conference. I’m undecided if not having to travel was a plus or a minus.

Shell games

Discovering the spaceship zsh prompt plugin (and subsequently the zplug plugin manager) allowed me to simplify my dotfiles and shell setup.

Weeknote 42/2020

Going Marie Kondo on my desk – My desk sparks joy in me. That’s because I was able to give my IKEA BEKANT a new lease on life. More than a year ago, it lost its standing desk function because suddenly the motor wouldn’t lift the top more than a centimetre before giving up. I found out that this was a common issue caused by a faulty power supply. After filing a warranty case, it took many months and repeated phone calls to get a replacement unit delivered, but a few days ago, it finally arrived. When I installed it, seeing the messy underside of my desk sent me on a cable management quest. Using cable ties, velcro and double-sided pads, I was able to tidy up the rat’s nest of power and USB cables nicely. Fixing a power bar with USB charging ports to the underside of the desk substantially reduced the number of cables going down to the floor. Not only is the desk now a joy to look at, raising it also doesn’t pull a whole power bar off the ground anymore.

Checking off tasks with TickTick – Its growing popularity brought the Ticktick app to my attention. It aims at combining the two most important productivity tools, the to-do list and the calendar. Other than HourStack and TimeHero, two similar web applications I tried in the past, TickTick is a native app for Mac and iOS. I’m still a fan of time-boxing my work, and my home-grown solution that I built in Notion falls short in calendar integration. I’ve decided to give TickTick a try for my daily focus work. For my long-term strategic direction, I’ll keep tracking goals and outcomes in Notion.

I have a new type – Just like Steven Waterman, I fell Down the ergonomic keyboard rabbit hole. His description of how he gradually switched to a more ergonomic multi-layer keyboard layout is written and illustrated hilariously. But there’s also a serious health aspect behind the gadget mania. I’ve come to very similar conclusions recently that led me to split ortholinear keyboards. I’ve also adopted the Colemak keymap. I’m going to sell most of my keyboards that have the traditional row-staggered key layout because regardless of their build quality, they just can’t compete when it comes to long-term health benefits.

Weeknote 31/2020

My second week off work is coming to an end. I’m not sad; actually yesterday I started missing work. Thanks to my business partner manning the fort, I got to really switch off and recharge my batteries. Last week, my family and I spent a few days at a Slieve Aughty, an eco-friendly equestrian and activity leisure centre near Galway. Mere minutes before leaving, my daughter broke her arm; not by falling off a horse but by jumping off a swing. She wears her cast like a badge of honour, so it’s all good.

After coming back home, I decided to get back into live coding on Twitch. Feels good. Before, Imposter Syndrome had made me question if I really should sit in front of a camera when other streamers who are completely new to software development easily reach multiples of my viewer numbers. I’m incredibly grateful that my viewers were quick to reassure me that I’m providing them with real value. So instead of stupidly comparing myself with others, I’m looking forward to my upcoming streams.

My next few streams might suffer a little in terms of speed because a change of keyboard layout is going to keep messing with my brain. When I realised that my new split ortholinear Lily58 keyboard feels so much nicer than all the traditionally configured boards I had used before even though it’s nothing fancy in terms of materials, it brought up the question if switching from the QWERTY layout to something more modern would improve my typing experience even more. For about two weeks, I’ve been trying out the Colemak layout now (in particular, its mod-DHm variant), and I’m convinced it’s much more ergonomic. And I hope that over time, I’ll also regain a somewhat decent typing speed.

Now school has started again for our kids. My daughter has an enviably soft start into secondary school with only two hours of class so far just to see the new environment. The precautions against infection the school is taking are quite okay, so we’re happy to send her there. Not quite so with our second-grader. At his age, masks aren’t mandatory and there’s also only a 1m distance rule in place. At the moment, we’re not comfortable with this level of risk management and have decided to teach him at home, similar to before the holidays. Fortunately, the school is going to support our approach at least for a few weeks with materials and regular check-ins.

Adaptation is undoubtedly the skill of the year.

How not to drown in too many Discord servers

Discord has become a popular community platform far beyond gamers. Recently, the number of Discord servers I’ve joined has grown quite a bit. I have whole folders full of Discord servers grouped by Live Coders, Mechanical Keyboards, World of Warcraft, and application software support.

The downside of how easy it is to create or join a Discord server is keeping up with the amount of chatter that’s happening. That applies especially if you are a member of multiple servers that have overlapping interests and/or “general social” channels. I simply don’t want to wade through every “pet pictures” channel, sorry.

Unfortunately, the Discord UI is a bit convoluted, and I ended up using the “mute server” feature for almost everything. That stopped the flood of messages, but it also cut me off from updates that were relevant for me. This week, I finally found a good solution how to handle muting notifications, channels or whole servers, and it made all the difference! Here’s how I cut down the time it takes me to catch up to a few minutes every so often.


The way Discord handles notifications is quite straightforward. I’m strongly in the “the fewer notifications, the better” camp. That’s why I usually have notifications enabled only for @-mentions. Only in channels in which I don’t want to miss any post, I enable “notify for all messages”. For me, this applies mostly to announcement channels that are used rarely but contain time-critical information like keyboard group-buys.

Unread messages

Managing unread messages efficiently takes a little bit more effort. First, use “mute server” for servers that you don’t frequent actively at all. Servers you only joined to ask an occasional question but stay out of otherwise shouldn’t draw your attention at any time.

The majority will be servers that have some channels in which you’re actively interested. On these servers, mute each channel that doesn’t interest you. When new channels are added to the server, you’ll have to choose if you want to add them to the mute list. On some servers, I even enable “hide muted channels” to shorten the channel list.

With these two measures, Discord will only track unread messages for the servers and channels you didn’t mute. Only now the “unread messages” indicator on the server icon starts making sense. More importantly, it is the prerequisite for efficiently using the “Next channel with updates” key combination. Hitting Opt+Shift+Down-Arrow (Alt+Shift+Down-Arrow on Windows, Up-Arrow for the opposite direction) gets you to the next unmuted channel containing unread messages. Read the channel to the end, hit the key combination again. It jumps across server boundaries, too. That way, you can catch up on everything that interests you in no time. I’ve assigned the “next unread channel” and “previous unread channel” functions to two extra buttons on my trackball, so I can simply leave my hand on it if I don’t want to write a reply. Scroll, next, scroll, next. Usually, it takes me less than two minutes to get through all my new posts.

And when I press the key combo another time after having already caught up with everything, Discord rewards me with a satisfying wiggle.

Clean Chef code: Depend on public cookbook interfaces

For about a year, we’ve been cleaning up the Chef Infra code for freistilbox to make updating dependencies, Chef versions and even operating systems easier. It’s a lot of work because our early code is functional but not pretty. There have been many instances of “we didn’t know better”, and that’s what refactoring is for. But I also came to realise that we were missing a critical fact: Common software engineering principles and practices apply to infrastructure code like they do to any other type of code.

Or as early Chef developer Joshua Timberman puts it:

“Hey, ya’ll remember when devops really just meant you knew how to write all your bash in ruby instead?”

Ouch. Making this connection earlier would have saved us weeks of work. That’s why I’m going to share my findings in a series of posts.

In this post, I’m going to advocate for treating a Chef cookbook as a unit of software that provides explicit interfaces instead of tempting its users to depend on implementation details.

Chef Infra cookbooks use node attributes as variable parameters for system configuration. In software engineering terms, node attributes are global variables. They’re implementation details of a cookbook. In consequence, using a cookbook’s node attributes for any purpose other than defining setup parameters creates a dependency on implementation details which can change at any time.

For example, it’s common practice to use a search on node attributes for service discovery. As node attributes are global variables, any cookbook can do this:

service_nodes = search(:node, "webservice_id:myservice")

From this code, we can tell that web service nodes are identified by a node attribute named webservice_id; nodes sharing the same webservice_id value belong to the same web service.

The problem with using this information outside the cookbook which provides it is that this particular implementation can change at any time. This kind of tight coupling is a liability. For example, a second attribute webservice_status might get introduced, reducing the node set by adding AND webservice_status:active to the query. Since this change in semantics is not necessarily a breaking change, there’s no simple way like semantic versioning to inform everyone who depends on this unofficial interface.

How about we provide an public API instead? Our web service cookbook could for example provide a class we can use for service discovery:

webservice ="myservice")
service_nodes = webservice.nodes

This is easy to implement as a cookbook library. By using namespaces, we make sure that method names don’t conflict. In my practice, I tend to use the camel-cased cookbook name under the namespace Cookbook and the company namespace.

With service discovery encapsulated and hidden behind a public interface, we could even reimplement the cookbook’s service discovery using a different technology like Consul without breaking any code outside our cookbook.

But even if other cookbooks depending on our implementation isn’t a concern, implementing auxiliary logic in a central library instead of scattering it across recipe files makes it much easier to maintain. I’m going to talk about “Plain Old Ruby versus Chef DSL” in a separate post.

Typing with Jazz

I do my work using keyboards and I make music using keyboards. This clever web application brings it all together.

Making the step from being non-racist to being anti-racist

For decades, I’ve lived a sheltered life as a person whom MLK describes as

“the white moderate who is more devoted to β€œorder” than to justice; who prefers a negative peace which is the absence of tension to a positive peace which is the presence of justice”

All this time, I stayed in my comfort zone and considered justice someone else’s problem, probably something the state needs to take care of via foreign aid or policy.

Just like it took meeting my wife for me to learn that protecting our environment starts with me as an individual changing my consumption behaviour, it took the BLM movement and the recent riots for me to understand that I as an individual can be an ally, can contribute to racial justice, can speak up against discrimination. That being non-racist isn’t enough, that I need to be anti-racist.

I have much to learn, and I am grateful for the many online communities that raise awareness, practice solidarity, and foster understanding in “non-racist” people like me.