week 12, 2023

Four years of Plurrrr

Today, four years ago, I wrote the first post on this tumbelog. Since that first post I have daily searched for interesting links to post and please my readers. While I don't have many, everybody counts. It hasn't been possible to update the blog daily, however. So now and then several days of links piled up and I had to do some catching up. Anyway, let's see if I can do another year of Plurrrr.

The International Mineral Fair

In the morning Alice and I took a bus to Rijswijk in order to pay a visit to The International Mineral Fair. Esme wasn't feeling well and Adam didn't want to join us so we went together. One of the items Alice wanted to buy was a Himalayan salt lamp for her bedroom.

A stand at The International Mineral Fair
A stand at The International Mineral Fair.

After a short walk from the bus stop we arrived at the Broodfabriek (the bread factory) where the fair was held. Since I had bought my tickets online we didn't have to stand in line to get in.

Various pieces of Smoky Quartz
Various pieces of Smoky Quartz.

After walking and looking for a while Alice found a nice specimen of a mineral that she really wanted. We decided to look around a bit more and pick it up later. But we forgot to remember the code of the stand. Later on we were not able to find the stand back.

Asaphus kowalewskii trilobite
Asaphus kowalewskii trilobite.

Besides minerals we also saw some very nice fossils. I took a photo of a Asaphus kowalewskii trilobite, Asery formation, Ordovician, Vilpovitsy Quarry, St. Petersburg, Russia (according to the label).

Shells for sale
Shells for sale.

Alice and I also encountered a stand selling all kinds of shells, sea urchin (Echinoidea) skeletons, etc. But the majority of stands were selling minerals.

Sclerocephalus sp. fossil
Sclerocephalus sp. fossil.

Another nice fossil I saw was of a Sclerocephalus sp., Permian, 280MYA, Rotliegend, Niederhausen, Germany (according to the label).

After a while we went back to the stand with the Himalayan salt lamps to pick up the one I had bought for Alice. Because it was quite heavy, a few kilograms, we had decided to pick it up later. Alice had also bought a small piece of amethyst, a flat piece of a mineral for massage, three bracelets, and a second hand book on minerals; the Dutch translation of "The Illustrated Encyclopedia of Minerals and Rocks" by Jiří Kouřimský.

Notes on FFTs: for implementers

In the previous post I’ve talked about things you might want to know as someone who uses FFTs, this part covers all kinds of FFT implementation details, including the underlying reasons for a lot of the API complexities that showed up last time. I’ll also give some recommendations on what I think are good ways write a FFT right now, and presumably also going forward.

Source: Notes on FFTs: for implementers, an article by Fabian “ryg” Giesen.

Easy PostgreSQL Time Bins

It's the easiest thing in the world to put a timestamp on a column and track when events like new records or recent changes happen, but what about reporting?

Binning data for large data sets like time series is a great way to let you group data sets by obvious groups and then use SQL to pull out a query that easily works in a graph.

Here's some PostgreSQL secrets that you can use to build up complete reports of time-based data.

Source: Easy PostgreSQL Time Bins, an article by Paul Ramsey.

ASTs - What are they and how to use them

If you are writing code, chances are that ASTs are involved in your development flow. AST stands for Abstract Syntax Tree and they power a lot of parts of your development flow. Some people might have heard about them in the context of compilers but they are being used in a variety of tools. Even if you don't write general development tools, ASTs can be a useful thing to have in your toolbelt. In this post we'll talk about what ASTs are, where they are used and how you can leverage them.

Source: Introduction to Abstract Syntax Trees, an article by Dominik Kundel.

Edge of Darkness (2010)

As homicide detective Thomas Craven investigates the murder of his activist daughter, he uncovers a corporate cover-up and government conspiracy that attracts an agent tasked with cleaning up the evidence.

In the evening Alice and I watched Edge of Darkness. I liked the movie and give it a 7 out of 10.

Hunting Time



Allison Parker is on the run with her teenage daughter, Hannah, and Colter Shaw has been hired by her eccentric boss, entrepreneur Marty Harmon, to find and protect her. Though he’s an expert at tracking missing persons—even those who don’t wish to be found—Shaw has met his match in Allison, who brings all her skills as a brilliant engineer designing revolutionary technology to the game of evading detection.


The reason for Allison’s panicked flight is soon apparent. She’s being stalked by her ex-husband, Jon Merritt. Newly released from prison and fueled by blinding rage, Jon is a man whose former profession as a police detective makes him uniquely suited for the hunt. And he’s not alone. Two hitmen are also hot on her heels—an eerie pair of thugs who take delight not only in murder but in the sport of devising clever ways to make bodies disappear forever. Even if Shaw manages to catch up with Allison and her daughter, his troubles will just be beginning.



As Shaw ventures further into the wilderness, the truth becomes as hard to decipher as the forest’s unmarked trails…and peril awaits at every turn.

In the evening I started in Hunting Time, A Colter Shaw Novel Book 4 by Jeffery Deaver.

Speeding up text processing in Python (is hard)

If you’re doing text or string manipulation in Python, what do you do if your code is too slow? Assuming your algorithm is reasonably efficient, the next step is to try faster alternatives to Python: a compiled extension.

Unfortunately, this is harder than it seems. Some options don’t offer an easy path to optimizations, others are actually slower. To see this limitation in action, we’ll consider some alternatives:

  • Pure Python, with the default Python interpreter.
  • Cython.
  • mypyc.
  • Rust.
  • Pure Python, with the PyPy interpreter.

We’ll also consider what can be done if these option don’t help.

Source: Speeding up text processing in Python (is hard), an article by Itamar Turner-Trauring.

How Big Should a Programming Language Be?

Reading the thought-provoking "Patterns & Abstractions" post reminded me of a long-held opinion I have about programming language design: we have a tendency to keep adding features to a language until it becomes so big that its sheer size makes it difficult to use reliably. Since most of us spend most of our time programming in one language, it can be difficult to see a common trend amongst languages in general.

Source: How Big Should a Programming Language Be?, an article by Laurence Tratt.

Fascination of AWK

AWK is a delightful mini-language almost unchanged for decades.

A bare minimum of features includes strings, numbers, functions, associative arrays, line-by-line I/O and shell invocation. Perhaps, if it had fewer features, it would be impossible to program in it at all.

There is an opinion that AWK is not suitable for writing serious programs. Even Brian Kernighan (the K in AWK) is convinced that his language is only good for small one-liners. However, this does not prevent enthusiasts from creating rather voluminous programs in AWK.

Source: Fascination of AWK, an article by Volodymyr Gubarkov.

It’s worth putting in the effort to regularly update dependencies

Whether or not to regularly spend time and effort upgrading dependencies can be a contentious topic on development teams. Advocates argue that not doing the work allows tech debt and bitrot to accumulate, while opponents accuse them of chasing new-and-shiny novelties while ignoring what’s actually valuable to the product. Despite what feels like an unending amount of time spent on the churn of upgrades, security teams still struggle to get risky old dependencies patched, and developers complain about using deprecated tools.

After being burned several times by excruciatingly tedious forced upgrades of vulnerable or broken legacy codebases, I’ve come down firmly on the side of favouring frequent updates — with plenty of flexibility and some caveats.

Source: It’s worth putting in the effort to regularly update dependencies, an article by Felix Crux.

Web fingerprinting is worse than I thought

Fingerprinting has become a popular method of user tracking due to its ability to connect multiple different browsing sessions even if the user clears browsing history and data. Given there are companies selling fingerprinting as a service, if you want to really protect yourself from fingerprinting, you should use Tor Browser or Firefox with resistFingerprinting=true. If you need to use Chromium, then Brave browser is a good choice. It also randomizes fingerprint for each session, making it harder to link your browsing sessions. However, I do not recommend Brave because it is based on Google’s Chromium engine, thus only encourages Google’s monopoly.

On mobile, only Tor Browser and Firefox with resistFingerprinting=true were able to protect against fingerprinting. Firefox Focus leaks fingerprints even if you clear its session each time. Also note that VPNs does not help with fingerprinting. They only masks IP address.

Source: Web fingerprinting is worse than I thought.

Why I returned the Mac Mini M2 Pro

I was super excited when my M2 Mac Mini arrived. So excited I wanted to take the rest of the day off work just to set it up. That excitement didn’t last very long.

I returned my Mac Mini M2 Pro, and this is why. I’m not trying to bash here. This isn’t a hit piece. I generated a lot of talk and tons of instant messages on Twitter and other platforms. I thought it would be easier to explain here and send people the link.

Source: Mac Mini M2 Pro Review, an article by Jeremy Morgan.

Write Predictable software, not Ergonomic

As software engineers, when we build software, we often choose the configuration defaults that our language or the framework provides to us. And most of the time, the default options work well. At least for a while, until something unexpected happens that reveals that the configuration which has been in place for years can cause an outage under specific circumstances.

In this article, I’ll go over a few examples illustrating the issues arising from misconfiguration. I also suggest a mental model and an API style that can help reason about configuration more effectively.

Source: Write Predictable software, not Ergonomic, an article by Sergey Tselovalnikov.

Github Actions and Go

I love open source, and also I love Go. So, a few months ago I decided to build the best CI for Go that I could easily reuse across my projects.

This post shares the results.

Source: Github Actions and Go, an article by Oleg Kovalov.

Implementing a Transformer From Scratch

To get intimately familiar with the nuts and bolts of transformers I decided to implement the original architecture in the “Attention is all you need” paper from scratch. I thought I knew everything there was to know, but to my own surprise, I encountered several unexpected implementation details that made me better understand how everything works under the hood.

Source: Implementing a Transformer From Scratch, an article by Joris Baan.


Under cover of night in Richmond, Virginia, a monster strikes, leaving a gruesome trail of stranglings that has paralyzed the city. Medical examiner Kay Scarpetta suspects the worst: a deliberate campaign by a brilliant serial killer whose signature offers precious few clues. With an unerring eye, she calls on the latest advances in forensic research to unmask the madman. But this investigation will test Kay like no other, because it’s being sabotaged from within—and someone wants her dead.

In the afternoon I started in Postmortem, Kay Scarpetta book 1 by Patricia Cornwell.