BIRD Journey to Threads. Chapter 2: Asynchronous route export

Route export is a core algorithm of BIRD. This chapter covers how we are making this procedure multithreaded. Desired outcomes are mostly lower latency of route import, flap dampening and also faster route processing in large configurations with lots of export from one table.

BIRD Journey to Threads. Chapter 1: The Route and its Attributes

Data structures used by BIRD have to be changed in order to allow multithreading safely. This chapter covers necessary changes of them. BIRD is a fast, robust and memory-efficient routing daemon designed and implemented at the end of 20th century. We’re doing a significant amount of BIRD’s internal structure changes to make it possible to run in multiple threads in parallel.

BIRD Journey to Threads. Chapter 0: The Reason Why

BIRD is a fast, robust and memory-efficient routing daemon designed and implemented at the end of 20th century. Its concept of multiple routing tables with pipes between them, as well as a procedural filtering language, has been unique for a long time and is still one of main reasons why people use BIRD for big loads of routing data.

Python CLI libraries analysis

An analysis of several Python CLI libraries to detect their usability in various cases.


We want to design a command with following usage based on compilation of several existing commands:

Usage: testcli [options] [--choices=VALUE]... [--params=...] create <label>
       testcli [options] [--choices=VALUE]... [--params=...] drop <label>
       testcli -h | --help
       testcli --version

  -h, --help             Show this help message and exit.
  --version              Show program's version number and exit.
  --config=FILE          Set config file.
  --string=STRING        Set custom string.
  --number=NUMBER        Set custom number.
  --params=KEY=VALUE     Set custom parameters.
  --today=DATE           Set custom today [default: today].
  --choices=VALUE        Set custom choices [default: all]. Available options: 'all', 'foo', 'bar', 'baz'.
  -n, --dry-run          Don't actually do anything.
  -v,--verbosity=LEVEL   Set verbosity level in range 0 to 3 [default: 1].

Current statistics on global situation regarding COVID-19 at one place

The internet has been recently flooded with websites trying to create various statistical information regarding the new coronavirus. Just within the Czech register, there are several. If you are on of the people who like to follow latest “coronavirus” numbers or if you use them in your work, you can face multiple obstacles. Some of the statistics give you the data you need, but they are outdated and are not regurlarly refreshed. In case of dynamic visualizations, you are limited by fixed boundaries. If you are not satisfied with that, you can try a newly created tool for generating dynamic visualizations from the CZ.NIC Association that offers a broad set of features and settings. You can for example choose any country/region and a formula for your desired curve, copy URL and of course refresh the data simply by pressing F5. Everything you can find on the web page

Fun we had at AT&T hackathon

At the end of November last year awesome crew from AT&T organized a hackathon about various aspects of smart technology. They have a long tradition in organizing those and they are really good at it. We spoke at various conferences with them and they asked us whether we would be interested in joining as we have interesting hardware to lend contestants and also developers skilled in various areas that could help the attendees to overcome various issues. We jumped on board right a way!

DNSSEC signing with Knot DNS and YubiKey

Knot DNS 2.1 introduced support for DNSSEC signing using PKCS #11. PKCS #11 (also called Cryptoki) is a standard interface to access various Hardware Security Modules (HSM). Such devices are usually used to improve protection of private key material. The interface is rather flexible and gives the HSM vendors huge amount of freedom, which unfortunately makes its use a bit tricky. There are often surprising differences between individual implementations.

Embedding LuaJIT in 30 minutes (or so)

Since you’re reading this, you probably know Lua, the world’s most infuriating language. If not, hop on to Lua in 15 minutes to get the basics right. Now there are two types of use cases where Lua shines – as a tiny script/configuration language, and for high-performance data processing (with JIT). I went through both of them with kresd, and wrote down some notes.