Programming for fun and profit

A blog about software engineering, programming languages and technical tinkering

Archives

2024

Sun 03 November 2024
Programmatically set the pixel density (DPI) of a PNG image
Sat 19 October 2024
Developer PSA: Learn to type!
Sun 18 August 2024
Taking a step back from open source development
Fri 05 July 2024
Book Review: Cybersecurity Myths and Misconceptions
Tue 02 April 2024
PostgreSQL indexing: The basics
Sun 24 March 2024
Configuring touchpad tap in Sway
Mon 11 March 2024
Syntax highlight anything with Tree-sitter
Thu 29 February 2024
Extending NeoVim for commenting and uncommenting code blocks
Sat 24 February 2024
Adding guardrails to psql for PostgreSQL
Sun 04 February 2024
First impressions of Wayland on Arch Linux
Mon 29 January 2024
Dependabot's dependency grouping is awesome

2023

Wed 25 October 2023
A new dark theme for the blog!
Tue 24 October 2023
What does the number in a man page mean?
Sat 21 October 2023
The sheer insanity of interfaces and nil in Go
Sat 14 October 2023
Book Review: Writing an Interpreter in Go

2022

Mon 26 December 2022
Fix 3D graphics in Arch Linux on Dell XPS 15 9520
Sun 20 November 2022
Book Review: CPython Internals
Sat 19 November 2022
The difference between Python and CPython
Sun 06 November 2022
The pre Python 2.5 ternary operator hack
Sat 29 October 2022
Why I write a blog that nobody reads (and you should, too)
Mon 24 October 2022
Introducing my Wiki!
Wed 10 August 2022
Book Review: The Rust Programming Language
Mon 11 July 2022
Book Review: 97 Things Every Programmer Should Know
Sun 10 July 2022
Full text search with pelican-search!
Thu 07 July 2022
The art of learning from the less experienced
Sat 02 July 2022
Book Review: Apprenticeship Patterns
Sun 12 June 2022
Eleven Table Tennis: A VR masterpiece
Sun 12 June 2022
Learning a new programming language as a practicing software engineer

2021

Thu 09 September 2021
RepoBee at ITiCSE and SIGCSE 2021!

2020

Sun 04 October 2020
RepoBee at ITiCSE 2020!
Sat 03 October 2020
Essential pytest pt. 3: Rerunning failed tests (and the pytest cache)
Sat 03 October 2020
Essential pytest pt. 2: Selecting tests to run
Tue 29 September 2020
Thoughts on graduating with an MSc in Computer Science and Engineering
Sun 02 August 2020
The Linux /etc/passwd file, and why it doesn't contain passwords
Fri 31 July 2020
Essential pytest pt. 1: Controlling the verbosity of output

2019

Sun 10 November 2019
Don't use String for method options, use an enum!
Fri 11 October 2019
Java's Optional: Why you should prefer it over null
Mon 22 July 2019
RepoBee (and Simon) at ITiCSE 2019!
Mon 22 July 2019
Git worktrees: work in parallel on multiple versions of a project
Sun 23 June 2019
Redirecting stdout and stderr in bash
Thu 13 June 2019
Technical e-books from Humble Bundle
Tue 11 June 2019
I/O redirection in bash
Tue 21 May 2019
Piping commands in bash
Mon 06 May 2019
Using bash aliases
Mon 29 April 2019
Git local
Mon 22 April 2019
History and history expansion in bash
Tue 09 April 2019
Reverse search in bash
Tue 09 April 2019
Announcing Tip of the Week (TotW)
Sat 06 April 2019
Migrating my blog
Tue 05 March 2019
Testing tips: Tests that don't test

2018

Sun 30 December 2018
TornadoFX+Exposed pt. 3: Adding, editing and removing rows
Wed 26 December 2018
TornadoFX+Exposed pt. 2: Showing a database table
Tue 25 December 2018
TornadoFX+Exposed pt. 1: Project and database setup
Wed 14 November 2018
Collapsing and expanding HTML elements using (mostly) CSS
Tue 30 October 2018
A binary search tree in Kotlin pt. 2: Generic node
Sun 28 October 2018
A binary search tree in Kotlin pt. 1: Representing a node
Wed 17 October 2018
Creating a standalone (runnable) Kotlin .jar file with IntelliJ and Gradle
Tue 03 July 2018
Awesome Python Podcasts
Tue 01 May 2018
What the self? Python's self demystified!
Thu 05 April 2018
Properties as Pythonic setters
Thu 05 April 2018
Properties as Pythonic getters