Curly Tail, Curly Braces: My Blog

Justin Wernick <>
Curly Tail, Curly Braces

This is my personal blog, where I write articles about whatever I happen to be working on. Usually, this is some sort of programming-related topic.

The most recent articles are at the top. Click through to read the full article.

My approach to Advent of Code puzzles

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.

Make the computer do it!

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.

Building a digital music collection in 2023

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.

Release Announcement: South African ID Parser (JavaScript library) v1.1.0

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.

Concatenating PDF files on Linux

This article just shares a shell script I use to concatenate PDF files together into one long PDF. Under the hood, the script is using Ghostscript.

Leveling Up Your Git Server - Sharing Repos with a Friend

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 was saved by Test Driven Development

This is a short story about how I gained a new appreciation for Test Driven Development.

Software Engineering is Engineering

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.

How to Train Your Git Server

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.

My Current Pick of Rust Performance Optimization Tools

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.

The Newtype Pattern in Rust

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.

A Fancy New Website Redesign

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 being new, I'm sorry.

The Localhost Podcast

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.

Advent of Code: Expressing yourself

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.

Rust Iterators

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 for loops.

Illustrate your Point with Literate Programming

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.

What's in a Name?

This is an explanation of a disagreement I had with home affairs. From now on, I'm going back to using my birth surname of Wernick.

Implementing a Bitwise Simulation

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.

Compile Time Feature Flags in Rust

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

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.

Going Four Times Faster using Multi-Threading

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.

Performance Tuning in Rust using Benchmarking and Perf

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 to focus on.

Coding for the Win

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.

WebAssembly

In this article, I explore the opportunity that WebAssembly brings to bridge the gap between native desktop applications and web applications.

Game Programming Inspires My Software Development

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. This article presents a few concepts from the context of computer games that help me to solve the problems that I do face.

FUN: JMP FUN

This is a list of games that I've enjoyed playing, that have something to teach you about low level programming in Assembly languages.

Literate Programming

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.

Writing an Entelect Challenge bot in Rust

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

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's a WASM?

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.

Why functional programmers should care about Rust

In this article, I present an argument for why people who are passionate about functional programming should consider learning the Rust programming language.

Happy 2018: A stereotypical new years post

This is a reflection on the previous year, and what my plans are for this site in 2018.

Using Git for Incremental Backups

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.

The Fundamentals of Version Control

In this article, I aim to explain what version control is, and the core concepts that you're likely to encounter in any version control system.

Error Reporting from your Systemd Automation

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.

Multi-platform Rust and Emscripten-Specific Functions

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.

A Quick Introduction to Graphviz

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.

Writing Git Hooks using Rust

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.

Rusty Microphone

In this article, I show off a program that I wrote to give myself real time feedback on my intonation while playing the trumpet.

A Rusty Tale of Shared Memories and Passed Messages Part 2: Pointers to Shared Memory

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.

A Rusty Tale of Shared Memories and Passed Messages Part 1: Channels

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.

A love poem to the mechanical keyboard

I recently bought my first mechanical keyboard. This is my first impressions.

Backups are a form of Risk Management

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.

Updated Thoughts on using GTK in Rust

A few months back, I started using GTK inside a Rust project I was working on. At the time, I wrote a post about how I was making it all fit together. Some of my opinions have changed a bit since I started, and I'd like to give an update.

The Script I Use to Deploy My Website

In this article, I share the script that I use to deploy a Jekyll-based static website over FTP.

Tail Recursion

Functional programming uses recursion as its fundamental model for iteration. However, if you try to naively use really deeply nested recursion, you'll eventually run into a stack overflow error! In this article, I aim to explain why stack overflows happen, and how they can be avoided using a compiler optimization called tail recursion.

Reflections on the IT Industry

These are a few systemic problems that are bothering me about the state of the IT industry.

What Note Is This? Part 2: Taking a signal from a microphone, and making sense of it musically

I'm currently working on a project to help me to improve my trumpet playing by giving me real-time feedback on pitch. This is the second post in a two part series, where I discuss how I process the sound from the microphone to determine its musical pitch.

Validating a South African ID Number in Javascript

This is an announcement for an open source Javascript library that I've released, which can be used to validate South African ID numbers. It's available now on NPM.

What Note Is This? Part 1: What is sound, and how do I use it in a program?

I'm currently working on a project to help me to improve my trumpet playing by giving me real-time feedback on pitch. This is the first post in a two part series, where I discuss what sound is, and how you can get it into your computer.

Aliasing Traits in Rust

In my article on programming with generic types in Rust, I found that some of the type declarations got pretty long and repetitive. In this article, I show how you can alias a collection of traits together into one trait.

What's in a Generic Number Type?

I've been working on a small signal processing library as a learning exercise. As part of doing this, I've been exploring using generic types in Rust. This article is my notes on that exploration.

Development in the Open

From now on, I'm going to start having my default position being making personal repositories public, open source repositories. They might not all be good, or finished.

My first GUI with GTK and Rust

I've recently started using GTK from Rust. I'm new to this, and here are some of the patterns that I've found so far to stick things together.

Static Website Generation with Jekyll

Jekyll is a tool for compiling static websites. As is usually the case for a compiler, you put together a directory full of source code files, you run Jekyll from the command line, and you get a static website out. This article digs into what Jekyll can do and why you might choose to use it.

I've been using Emacs for about a year now

I've been using it for about a year now. At times I still feel like I'm not sure what I'm doing, but I've reached the point where I can comfortably look up help online, and I have some workflows that I feel pretty good about. In this article, I'd like to share some of my favourite packages that extend Emacs and have made it a much better experience for me overall.

Automated Syncing with Git

I wanted Dropbox-style syncing of my notes between my computers. However, rather than actually using Dropbox, I wanted to keep my notes in a Git repo so that I can manage it the same way that I manage code that I write. This article shows how I achieved this using Git Sync and Systemd.

All about Rust: The programming language, not the game

In this post, I introduct the Rust programming language and some particular problems that it solves.

A scipt to convert Striata statements to PDF

This is a script I wrote to convert the statements that Cell C was sending me that required Striata reader into PDF format for archiving.

So I've been learning Emacs...

I've been learning to use the text editor Emacs. In this article, I explain why I think this is a good investment of my time.

Building a Computer from Parts

I've built myself a new computer. This is the first time that I've chosen out each individual part, ordered them, and put it together into a complete working system, and I'd like to share my experience.

Open Source Recording

I've recently recorded myself playing a cover of a song on the trumpet. I try to use open source tools wherever possible. This article is the list of tools I used.

Getting Started with Angular JS

Angular JS is quite a popular framework in the web frontend development world at the moment. As a result, a lot of people have been starting to use it. I've been using Angular for a while now, and I'd like to share some information for people who might be starting to use Angular for the first time.

An Open/Closed Icon in Angular JS

In this article, I solve the problem of how to toggle an icon between the "open" state and "closed" state on an accordion in Angular JS in three different ways.

Return to C++

In this article, I discuss how I'm trying out C++ again after a few years of only working in higher level languages. My previous experience of C++ was only in an academic context, so I'm applying the more practical experience I now have from working in industry to see how it works out in C++.

Bitwise JavaScript

In this article, I use a programming puzzle about counting coloured balls to talk about the bitwise operations, and some of the peculiar ways that they behave in JavaScript.