I've recently added a new way to run heavy end to end tests to one of my Rust projects. These tests are launching heavy infrastructure like Docker and Selenium WebDriver, so I did not want them to run together with my unit tests. In this article, I explain how I added a test target that is skipped when I run cargo test , and is run on its own when I run cargo test-end-to-end .
15 years ago, for a university assignment, I programmed a small game in C++. In this article, I'm looking back at that source code, and reflecting on what I had right at the time and what I've learned to do better.
I buy software engineering books. However, since I live in South Africa, it can sometimes be a bit tricky to find these niche technical books. This article lists some of the places that I've had the most luck in recent years.
I use Emacs Org-mode extensively to stay on top of the things in my life. I call this my exobrain because I treat it as an external augmentation of my mental abilities. In this article, I explain the various features of Org-mode that I'm using, how I arrange my files, and how I fit it together into a complete system that works for me.
Each year in December, I take part in the Advent of Code. In this article, I explore the habits and processes I've settled into for approaching a new Advent of Code challenge, and how that can be quite different from my approach to production code.
As software developers, we have all of the skills that we need to make the boring parts of our work the computer's problem! In this article, I explore how I think about if something is worth automating, and some of the approaches I use to save time in my software development process.
I've stopped paying for music streaming services in favour of going back to buying albums and building my own digital music collection. This article is about some of the modern tools I'm applying to this endeavour, including updating my choice in audio codecs for storing the collection.
I've released a new version of an old Javascript library I maintain, the South African ID Parser. This article lists the sorts of things I've changed, and talks about my plans to publish more libraries generally.
In this article, I continue from my previous article about setting up your own Git server. Specifically, this article shows how you can support multiple users and shared repositories using Linux groups and file permissions. Finally, I show how you can use Shackle Shell to make the server a bit more secure and a bit easier to use.
I believe that software is an engineering discipline. In this article, I make that argument by summarising the work of a few other authors who have written on this topic, and offer my perspective on why this terminology matters.
Have you considered hosting your own Git server? It's easier than you might think. In this article, I go step by step through setting up a simple self-hosted Git server which only supports private repositories for a single person.
I've recently been working on some Rust code that I'd like to be rather efficient. Along the path of optimizing, I've come across some tools that make things much easier.
Programming design patterns are patterns that come up in a variety of different situations while programming. In this article I discuss the Newtype design pattern. Specifically, I discuss it in the context of the Rust programming language, and how to solve some of the problems that arise when using the Newtype pattern in Rust.
I've done a redesign on this website. It has a new fancy stylesheet, a new fancy static site generator, and a new fancy URL scheme. In this article, I talk about what's new. I tried to make this transition seamless for RSS readers, but it's hard to know exactly how all readers will respond. If you subscribe to this site using RSS, and have just been notified about the whole site…
I wanted to manage the process of syncing audiobooks from my computer to my phone better. The solution that worked well for me is to use a podcasting app and an RSS feed. This article explains why this works well for me, and how you can try it out.
Every year, I participate in the Advent of Code programming advent calendar. This year, I set myself the challenge to complete the puzzles using only pure expressions in Rust. In this article, I share some of the techniques I used and how it worked out.
In my opinion, iterators are one of the most powerful tools you can add to your toolbelt as a programmer. I've met many programmers who struggled to understand the various iterator functions and how to use them. In this article, I explore a number of iterator functions available in Rust's standard library, and explain them by giving an example of how you would get the same effect using…
I'm a big fan of Literate Programming using Org-mode, as well as the graph visualisation program Graphviz. In this article, I demonstrate how to bring the two together to add pictures of graphs to your Emacs Org-mode documents.
This is part three in a three part series where I discuss how I did performance optimization on a Rust applilcation I developed: a submission to a programming competition called the Entelect Challenge. In this article, I introduce the various bitwise operations, and demonstrate how I composed them together to implement all of the game rules.
Feature flags are a usefull tool in software engineering. However, when you're working on high performance systems, you might be worried about the runtime cost of your software supporting multiple ways of doing things. In this article, I demonstrate how the Rust programming language allows you to specify feature flags at compile time which have zero runtime cost.
Property based testing is a useful technique for testing software. In this article, I discuss property based testing, and show an example of how I used a property based testing approach when competing in the Entelect Challenge.
This is part two in a three part series where I discuss how I did performance optimization on a Rust applilcation I developed: a submission to a programming competition called the Entelect Challenge. In this article, I show how I used Rayon to make an embarrasingly parallel program I'd written in Rust multithreaded.
This is part one in a three part series where I discuss how I did performance optimization on a Rust applilcation I developed: a submission to a programming competition called the Entelect Challenge. In this article, I talk about measuring your current performance so that you know when you're moving in the right direction, and using Perf in Linux to find the parts of your code that you need…
I recently competed in the Entelect Challenge annual programming competition. This is my story about how it went, and what I found worked well for me in the competition.
I've been fascinated by computer games for as long as I can remember. In fact, almost all of my early computer knowledge came about because I wanted to play games. A lot of time has passed since then and I now work as a software engineer, and most of the systems I work on don't look much like games. Throughout my career, I've maintained an interest in what game engineers are doing.…
Literate Programming is a way of writing software by embedding code blocks into normal written documents (like this article itself). In this article, I explain what Literate Programming is in an abstract sense, and then introduce my preferred Literate Programming environment: Emacs Org-Mode.
Each year, Entelect hosts a programming competition called the Entelect Challenge. They have graciously offered to support any programming language if someone provides a "starter bot" in that language. This article is a starter bot in Rust, written as a literate program.
Monte Carlo simulations are a class of algorithms that use probability and randomness to solve problems. In this article, I discuss what Monte Carlo simulations are and how to use them.
What is WebAssembly? How do you compile your Rust code to WebAssembly? Once you have some WebAssembly functions, how do you use them from JavaScript? This article aims to answer those questions.
In this article, I present an argument for why people who are passionate about functional programming should consider learning the Rust programming language.
I've decided to start managing more of my email myself, on my local computer, rather than relying on Gmail to keep it archived forever. This means that I need to backup my email myself. In this article, I share what my considerations were for this and the script I wrote to do it automatically.
I've been slowly automating more and more repetitive tasks on my computer, and running them on a schedule with Systemd. Unfortunately, these things break from time to time. This article shows how I set up Systemd to leave me an email if anything goes wrong in the scripts I've written.
When you're writing Rust code that targets multiple platforms, like both desktop and the web, not all of your code will work on all platforms. This article will show how you can write platform-specific code alongside your platform-independent code.
Graphviz is an awesome tool for software documentation and visualizing graphs. In this post I explain the core concepts that you need to get started with Graphviz, with examples.
Git hooks are a method of triggering scripts automatically while using the Git version control system. All of the examples of hooks that are bundled with Git are shell scripts, but they don't have to be! In this article, I'll show how you can write your Git hooks in the Rust programming language.
Writing multithreaded code can be challenging. Luckily, the Rust programming language aims to make it easier by baking information about multithreading directly into the language's type system. This post explores the second way that you can have multiple threads communicate with each other in Rust: pointers to shared memory, with concurrent access protected with a lock.
Writing multithreaded code can be challenging. Luckily, the Rust programming language aims to make it easier by baking information about multithreading directly into the language's type system. This post explores the first way that you can have multiple threads communicate with each other in Rust: message passing using channels.
I did data backups badly for a long time, and it ended up biting me. In this article, I share my experience of doing it wrong, and some things you should consider when setting up your own backups.