The first quarter of the year I trained again for the 20 km of Lausanne where I beat my 2024 personal best. In May, I joined a few friends for a week of gravel cycling through the hills of Tuscany. Articles In February, I described our use of the AWS …
This summer I read Normal Accidents by Charles Perrow, which analyzes failures in the nuclear industry, petrochemical plants, planes and airways, marine transport, and other earthbound systems like dams and mining. In the book’s title the word “normal” means systemic , accidents that involve the unanticipated interaction of many failures …
I began taking notes around age ten in primary school. Though my teachers certainly instructed us to do so, I don’t remember if anyone actually taught me how to take notes. Like the rest of the class, I studied and revised using them. I followed the teacher’s explanations …
This day marks the fifth anniversary of my Homelab. Five years ago, as a COVID -19 lockdown project, I learned Nix and installed NixOS on my home computers . While my Homelab may not compete in sophistication with setups you find on Reddit , I consider it a forerunner in longevity and …
Last August I started a new job. I joined a team of engineers building cloud infrastructure using the Amazon Web Services ( AWS ) Cloud Development Kit ( CDK ) TypeScript library. I have had extensive experience building on AWS , but I haven’t used this tool professionally. In this article I describe my …
I started the 2024 with an intense training program for the 20 km of Lausanne . I moved to a new place, I rode my new bike as much as I could and I started a new job. Fortunately, next to all these changes in my life, I could still find …
My new Lenovo X1 Carbon Gen 12 arrived today. I plan to use this computer as my personal workstation for the coming years. I’ve been watching the evolution of the X1 Carbon series for a while; I was convinced that this is the right model for me. I don …
In this article, I describe how I configured my Raspberry Pi v1 camera module on my Raspberry Pi 3 running NixOS. The Raspberry Pi OS has excellent support for many camera modules. If you run the officially supported operating system, most cameras work without any further configuration. In my Homelab …
I was always part of software teams that wanted to write high quality software. Most team members felt what was good or bad quality software. Some goodness criteria were accepted by everybody in the team, perhaps some remained controversial. I’m sure every team had heated discussions about software quality …
This is a review of the book The Stupidity Paradox by Mats Alvesson and André Spicer which explores the role of functional stupidity in contemporary organizations. The authors’ thesis is that functional stupidity is omnipresent, especially in large firms, and it has a mix of positive and negative outcomes. The …
This post is a short summary of the articles I wrote in 2023. At the beginning of the year reviewed Winston Royce’s 1970 paper on Managing the development of large software systems . This paper is list of suggestions about what makes a software project succeed. Perhaps at places the …
I configured continuous deployment in my homelab . This article describes how I use Nix with GitHub Actions and Cachix Deploy to automatically deploy NixOS machines on my home network. Overview My home network comprises a wireless router, a few computers, temperature and humidity sensors and remote controllable switches. I configure …
Building Nix packages for the Raspberry Pi 3 or newer requires building for an ARM 64 architecture, which Nix refers to as aarch64-linux . To build aarch64-linux binaries we can: Build natively on an aarch64-linux machine. Cross compile for aarch64-linux . Compile with an emulator. The first option is the simplest. For …
This is a review of the paper Managing the development of large systems by Winston W. Royce , originally published in August 1970. Figure 2 of this paper often cited as the “waterfall” method , a model that considers the project’s activities as a linear sequence of steps. In fact, this …
This year I wrote only three articles (including this one), so this will be a short review of the articles in 2022. The puzzle of Day 8 in 2021 Advent of Code inspired me to explore logic programming , a lesser known, perhaps forgotten, yet powerful programming paradigm. In this article …
I revisit the problem Seven Segment Search of Day 8 in the Advent of Code 2021 puzzle series. I implement a declarative solution in Clojure using the logic programming library core.logic.
This year I wrote six posts on this blog (including this one), which is fewer than the ten written in 2020. In the first half of the year I was looking for a new job which sucked up most of my creative energy, but eventually last Summer I changed my …
In the past years I have been learning about technical writing. In this article I review two books that helped me to improve my writing skills. Then, I present how I practice writing at home and at work.
Recently I reread some chapters of the book The Practice of Programming by Brian Kernighan and Rob Pike . In Chapter 3 on Design and Implementation the authors present several implementations of a random text generator to compare how various languages’ idioms express the same idea. I wrote my version in …
Dockerfiles are de facto standard for creating container images. In this article I highlight some issues with this approach and I propose building container images with Nix.
This blog has no specific theme, I write about topics that are on my mind at the moment. In this post I reconstruct a story arc of the year and link to articles I wrote in 2020. During the holiday break in 2019 I wrote about functions in disguise . I …
In July I described how I use Travis CI to deploy this static site to GitHub Pages using a Nix pipeline. Before continuing I suggest reading that article because rest of this post builds on top of that. This article is about the changes I made in this blog’s …
Previously, I distilled the essence of a software delivery pipeline and argued that a transformation step that builds or tests a piece of code can be viewed as a function. Functions compose according to well-defined mathematical rules and they are a suitable model for defining arbitrary pipelines. Instead of talking …
In the past I wrote two articles where I explored concurrency in Haskell using some examples from the talk Go Concurrency Patterns by Rob Pike. The examples are different implementations of a simulated search engine which receives a search query and returns web, image and video results. The first version …
For a long time I’ve been manually deploying this blog to GitHub Pages . This worked OK because I publish less than once a month. But I always wished for a better, automatic solution. Recently I used Nix to rebuild my home network and I was curious if I can …
I own a few computers which I use to experiment with new languages, tools and technologies. I was dissatisfied with configuration management of these machines. I used to install and configure packages manually and I never remembered what I’ve changed. I tried Ansible but I found it tedious to …
For the last few weeks I’ve been exploring NixOS and its related tools. This article is an experience report and a collection of learning material I find useful. NixOS is a unique Linux distribution with origins in research conducted at Utrecht University. NixOS handles software delivery and configuration in …
Perhaps everything in our mainstream programming languages is at least 50 years old. Loops, iterators, pointers and references to mutable memory locations appeared in Fortran or ALGOL and now they are part of all mainstream programming languages. These constructs were designed for developing sequential programs. But today computers have many …
Practitioners of continuous integration often describe the process of automated software delivery as a pipeline : the source code enters the pipe, it is compiled, tested, packaged and released product comes out on the other end. This methaphor evokes the notions of delivering, modularity and continuity. Teams of different backgrounds relate …
We can make a function more testable by making it a more generic. Polymorphism allows us to inject test points into our function. This is often achieved by mocks and fakes in traditional programming languages.
Mainstream programming languages provide various constructs for control flow : conditionals, loops, exceptions, etc. Many of these can be modeled using the general functor concept. In this post I’m going to show you how. In most programming languages defining a function (or a method, subroutine, procedure, etc.) is simple. Using …
The work “Build systems à la carte” from Andrey Mokhov and his co-workers taught me a lot about how build systems work. It demonstrates the power of Haskell as a modeling language.
In this post we are going to write a simple load balancer in Haskell. The design is based on that presented in Rob Pike’s Concurrency Is Not Parallelism talk (starting around 22 minutes). If you are not familiar with this presentation I highly recommend watching it before reading on …
Thinking using a computer is hard. First, a computer is full of distractions, but let’s say we can eliminate those . Second, using the conventional input such as mouse and a keyboard, anything more complex than a character or a mouse click is difficult to communicate to the computer. Where …
I solve the Minimum Coin Exchange problem programmatically using Haskell. I will compare the performance of the naive implementation to that using dynamic programming.
The other day I got a question from a colleague: Do you know an algorithm for this problem of … details…details? The exact the problem description is not important. It was a well defined problem which totally made sense. I felt that there must be an algorithm for it, but …
In this post I’m replicating in Haskell some of the examples from the talk Go Concurrency Patterns by Rob Pike. In the talk Pike explains how Go’s built-in concurrency primitives can help writing concurrent code. I was curious to see how the presented examples would look in Haskell …
Inarguably David Allen’s Getting Things Done had the great influence on me in developing an efficient working routine. I have implemented my own system based on the book which works well for me most of the times. Interestingly, GTD also taught me what I should not do, and when …