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
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
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.
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.
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).
Alice and I also encountered a stand selling all kinds of shells, sea
urchin (Echinoidea) skeletons, etc. But the majority of stands were
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ý.
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.
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.
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
In the evening Alice and I watched Edge of
Darkness. I liked the movie
and give it a 7 out of 10.
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
#2: NEVER BE WITHOUT ACCESS TO A WEAPON.
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.
SHAW IS ABOUT TO DISCOVER RULE #3:
NEVER BELIEVE ANYTHING.
As Shaw ventures further into the wilderness, the truth becomes as
hard to decipher as the forest’s unmarked trails…and peril awaits at
In the evening I started in Hunting
A Colter Shaw Novel Book 4 by Jeffery Deaver.
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
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.
Pure Python, with the PyPy interpreter.
We’ll also consider what can be done if these option don’t help.
Reading the thought-provoking "Patterns &
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.
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
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.
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
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.
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.
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.
I had been meaning to give
ChatGPT a good try, preferably
from Emacs. As an
fan, ChatGPT seemed like the perfect fit for a shell interface of
sorts. With that in mind, I set out to wire ChatGPT with Emacs's
general command interpreter
As of March 2023, the Internet Computer
repository contains about six
hundred thousand lines of Rust code. Last year, we started using
Bazel as our primary build system, and we
couldn't have been happier with the switch. This article explains
the motivation behind this move and the migration process details.
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.
To get intimately familiar with the nuts and bolts of transformers I
decided to implement the original architecture in the “Attention is
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.
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
Kay Scarpetta book 1 by Patricia Cornwell.