Smokes your problems, coughs fresh air.

Author: Rowan Rodrik (Page 2 of 26)

Rowan is mainly a writer. This blog here is a dumping ground for miscellaneous stuff that he just needs to get out of his head. He is way more passionate about the subjects he writes about on Sapiens Habitat: the connections between humans, each other, and to nature, including their human nature.

If you are dreaming of a holiday in the forests of Drenthe (the Netherlands), look no further than “De Schuilplaats”: a beautiful vacation home, around which Rowan maintains a magnificent ecological garden and a private heather field, brimming with biological diversity. is a business that offers managed MQTT hosting and other services that Rowan co-founded with Jeroen and Wiebe.

Icinga 2 dependencies, downtimes and host/service unreachability

There are a few gotchas you have to be aware of when working with Icinga 2 dependencies and downtimes.

Gotcha 1a: Downtimes and dependencies are independent of each other

Intuitively, I had expected downtime to always traverse down the parent-child dependency tree. It doesn’t. It’s opt-in. The ScheduledDowntime.child_options attribute can be set to DowntimeTriggeredChildren or DowntimeNonTriggeredChildren to make it so. (These options are called “schedule triggered downtime for all child hosts” and “schedule non-triggered downtime for all child hosts”, respectively, in Icingaweb2.) With one of these options set, runtime downtime objects will also be created for (grand)child hosts (but not services; see Gotcha 1b).

Gotcha 1b: Downtimes never traverse to child hosts’ services

In Icingaweb2, when you’re scheduling downtime for a host and choose to also “schedule (non-)triggered downtime for all child hosts”, this excludes services on those child hosts. The “All Services” toggle applies only to the current host. There is an (open, as of May 5 2020) Icingaweb 2 feature request to address this. So far, the only attempt to implement the Icinga 2 side of this was shot down by the Icinga maintainers on the basis of making things too complex. @dnsmichi would prefer rethinking the current options.

If you want to make it easy to schedule downtime for dependency chain involving numerous hosts and/or services, I recommend using a single HostGroup and/or ServiceGroup to make it easy to Shift-select all dependent objects in Icingaweb2 and schedule the downtime in batch. In the worst case you than have to select all objects in each group separately to plan the bulk downtime twice. In some cases, just a HostGroup may do (because in Icingaweb2 you can include downtime for all of a hosts services), but this won’t be sufficient if you have services that depend directly on other services rather than hosts.

From the configuration, it’s not at all possible to include all of a host’s services in the ScheduledDowntime objects. But, here it’s not really an issue, because it’s enough to abstract your downtime particularities into a template and apply that to both the Host and the Service objects that are to be affected.

Gotcha 2a: Child hosts will (almost) never become UNREACHABLE when the parent host fails and Dependency.disable_checks == true

object Host "A" {

object Host "B" {

object Dependency "B-needs-A" {
  parent_host_name = "A"
  child_host_name = "B"
  disable_notifications = true
  disable_checks = true

In this example, when host A goes down, the B-needs-A dependency is activated and notifications about B are suppressed (because disable_notifications == True). However, because checks are also disabled, host B never becomes unreachable, unless if you manually/explicitly trigger a check via the Icingaweb2 interface.

The means that any service on the child host (B in this example) will still generate notifications, because the (default) host-service dependencies will not be activated until the child host becomes UNREACHABLE. (Of course, any other non-UP state of the child host would also activate the the host-service dependencies.) The same goes for grandchild hosts.

So, if you want a child host to become UNREACHABLE when the parent host fails, Dependency.disable_checks must be false. Only as soon as the check fails will the host become UNREACHABLE.

Gotcha 2b: Grandchild dependencies don’t become active until the child/parent in between them fails

Dependencies are always between a parent and a child. Icinga never traverses further along the tree to determine that a grandchild should be UNREACHABLE rather than DOWN.

Take the following setup:

object Host "A" {

object Host "B" {

object Host "C" {

object Dependency "B-needs-A" {
  parent_host_name = "A"
  child_host_name = "B"
  disable_notifications = true

object Dependency "C-needs-B" {
  parent_host_name = "B"
  child_host_name = "C"
  disable_notifications = true

If host A fails, host B doesn’t become UNREACHABLE until its check_command returns a not-OK status. The same goes for host B and C. And, despite disable_notifications = true, problems with host C will generate notifications as long as host B is Up. Therefore, to avoid needless notifications, you must always make sure that the hosts go down in the order of the dependency chain. You can do this by playing with check_interval, max_check_attempts, and retry_interval. And, make sure that disable_checks is always false for any intermediate host or service in the dependency chain!

New year’s resolutions

I updated my personal homepage at the beginning of the new year. Some of the changes were long overdue, like my university student status and the number of diving licenses. But, there were other changes that arose from a more recent insight: that, if I am to reach my goals, I need a plan. A bad plan is better than no plan. And too many goals are as useless as no goals.

Here is my plan as I published it in Januari in verbatim:

This has a plan: to become a happy little 🐷. His tech job at YTEC already keeps him warm and his belly full. (His family 💰 and the 🇳🇱 welfare state helped him along the way.) 🐷 2 + 2 little 🐱🐱 + some 🌿🌴 make 🏠 🏠. And, with all that comfort, ❄️🚿🚿, योगः, 中国武术 and มวยไทย keep the 🐷 from getting .

Homo sapiens is more homonid than sapiens, so the most sapient thing for this H. to do is to take good care of his 🐒-mind. This 🐒 wants (☑), and is very particular about who he keeps ✓ed in this —a ♀ who breaks out of the stupid , and climbs on top of it to 👙💃.

Outside this most private of private bubbles, there are friends and family on call to put into perspective the tribulations that flow from the oft-inflated need to earn societal respect and dominate other ♂♂. At his most ☮️ful, his work and hobbies (i.e., kickboxing & diving) afford him plenty of opportunity to ✓ this ☐, but sometimes he dreams of wider recognition, especially at times of narrow self-respect.

He used to want to grow 📈 indiscriminately in all directions at once (like a ), dreaming of universal admiration and acceptance, being unable to accept—let alone, love—himself. Having since undergone therapy, he can now make the 🐒 feel sufficiently secure to focus on more forms of self-improvement, as long as he pays conscious attention to his need for ♡.

2018’s goal is for him to learn to respect himself, which requires him to ⒜ be deserving of respect, and ⒝ to give himself credit when credit is due. To combat self-sabotage and improve his discipline, he has given himself 3 rules: ① consumption is production; ② the training schedule is sacred; and ③ meditate daily. This may sound harsh, and it is, if he will needlessly beat himself up over any failure to comply. These rules are fairly constant, but there’s also a maximum of 4 assignments, which will change when they’re finished or given up; currently, these 4 are: ⓐ publish 7 6 articles on Sapiens Habitat about PPPermaculture; ⓑ create an Angel prototype and share it with colleagues; ⓒ finish opschoot‘s Mint upgrade; and ⓓ remember 7 new lucid dreams.

Note that there’s no need to work on these assignments; they don’t have a deadline. Deadlines abound in the day job. It’s all about the rule of ④: no more than 4 private projects at the time, to avoid all that free energy from being scattered with purpose nor satisfaction.

Rule ①: consumption is production

My adherence to rule ① has been decent in the beginning but is somewhat mixed at the moment: I’ve tweeted most times that I caught myself scrolling Twitter, but I haven’t written something—even if it’s just a single line—every time I’ve been mindlessly losing myself in the newspaper. Definitely, I need to continue to be vigilant if I want to rid myself of my habit to numb myself with mindless information consumption.

Speaking of production: For some time, I’ve waited with writing more about Annemarie, Laurelin and Nils their permaculture adventures in Portugal ⓐ while making some adjustments to the layout of But, I am now nicely progressing ⓐ with the second article in the series on PPPermaculture: Tree Nurse Nils.

Rule ②: the training schedule is sacred

Rule ② has been somewhat more sacred to me than rule ①, and I’m proud to say that I’ve persisted through quite a bit of boredom. Interestingly, so far, I’ve found adhering to my training schedule easier than making changes to it. The only changes I made were rather minor.

Last week, I decided that I want to pursue some competitive kickboxing bouts. But, that’ll have to wait until I finished one of ⓐ through ⓓ. Otherwise, I’d be violating the rule of ④.

Rule ③: meditate daily

Being mindful instead of running around like a caffeinated chicken is still challenging, in so far as that I don’t feel that I’ve further progressed towards being sufficiently at ease during the day that it has improved my dream content. My dream recall, however, has kind of improved.

There have been days on which I violated rule ③, and these shouldn’t be allowed to multiple. But, it’s also important to remember the spirit of the rule rather than the letter. And that spirit would soar as soon as ⓓ I will have the first of those 7 new lucid dreams.

The rule of ④

The rule of ④ is great. It has already protected me from undertaking ⓔ and ⓕ before finishing ⓐ through ⓓ. It also has a motivating quality, because I’m really itching (literally) to try ⓔ a ketogenic diet again.


Rule ① Rule ② Rule ③
Week Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
20 ½ ½ ½ ½ ½ ½ ½
21 I can not nor want to remember all this shit throughout the week.

Status of auto-assignemts

ⓐ published 5 of first 7 articles about PPPermaculture on
ⓑ create an Angel prototype and share it with colleagues
ⓒ finished opschoot‘s Mint upgrade ☑ on Feb. 22 2018
ⓓ remembered 7 of 7 new lucid dreams ☑ on Jun. 8 2018
ⓔ tried a ketogenic diet again for a week ☑ from Feb. 12–18 2018
ⓕ fight a kickboxing match started in the beginning Mar. 2018,
officially paused at the end of Apr.
ⓖ publish opinion piece about the annual winter-time population crash in the Oostvaardersplassen ☑ on Mar. 14 2018
ⓗ submit an entry for the NRC essay writing competition started on May 26 2018
☑ on Jun. 25 2018
ⓘ something something Magento started on Jun. 8 2018
ⓙ reviewing Myrna her open letter to the Dutch national Health Council embarked on Jun 25. 2018
☑ on Jul. 1 2018
ⓚ sand and paint my bicycle cart waiting for a slot
ⓛ read Annemarie her fairy tale
ⓜ get Hardwood wikis back online and put them up for sale waiting for a slot
ⓝ redesign accidentally started on Aug. 27

Worldwide Wilderness

A long, long time ago, when I still thought that Drupal would turn out be a good choice for a new website project, I founded Well, actually I found, because I didn’t know that ‘worldwide’ is spelled as one word. And, then I found, because I thought that hyphens in domain names are really cool—so cool, in fact, that I was on the Dashing Domains fanlist for years. Apart from all the hyphens, I still like the Worldwide Wilderness, so much so that I’ve recently been considering building an interactive map of all the remaining wilderness areas in the world under the brand.

Because of Rule 4—the rule of 4—I will not work on this idea any time soon, and the best way to get an idea out of my head is to put it on paper (of sorts): the idea is to have an interactive map of the world in which wilderness areas are marked according to the threats and protections that are present. Vetted specialist users should be able to amend this information and every site should include information about all the actions that concerned visitors can take to improve the protection of the wildernesses.

For archival purposes, below is the blurb I used to describe the project on

I’m a wild ape and civilization is a bad joke I didn’t get the punchline of. Somehow I’m supposed to be excited about all the freedom that my ancestors didn’t have because they were too busy staying alive. I have to be grateful for all the stuff that I can fill my life with in the absence of the struggle for survival. Instead of hunger and hungry predators we have gotten a pack of paper predators chasing us through life. The whole pack is being digitized so that we can run even faster.

Constantly, I feel threatened, because I am supposed to feel threatened for things that are simply not threatening, no matter how you turn them around or blow them out of proportion. As a social animal, nog taking these “threats” serious does feel seriously threatening to my social status. But I’m taking my chances. Fuck you and your self-imposed cages! I do not agree to be lifestock. I claim the right to be the wild animal that I will be regardless of your (and my) attempts to control me.

Self-control is a delusion. Self-improvement is masturbation. Because who would be doing the controlling and who would be doing the improving? Not me, that’s for sure.

Writing bootable disk images (.iso, .img, etc.) to a USB stick from Windows

Because Windows doesn’t have dd, and I want to write the latest Mint LTS release to a USB task, I had to face the unpleasant task of finding a Windows tool to perform what’s a basic Unix operation. The good news is that I found one, and it’s open source: Win32 Disk Imager. It even has a version ≥ 1, titled: “Holy cow, we made a 1.0 Release”.

A screenshot of Win32 Disk Imager at work, writing Linux Mint 18.3 MATE 64bit to my SanDisk USB stick.

Win32 Disk Imager at work, writing Linux Mint 18.3 MATE 64bit to my SanDisk USB stick.

I found another open source tool, UNetbootin, but that tool didn’t recognize my non-MS-format formatted USB stick (which already tauted the installer for a previous Mint release).

In the end, Win32 Disk Imager also choked on the funky partition table left by the previous boot image, so I had to find out how reset the USB disk’s partition table in Windows:


Microsoft DiskPart version 10.0.16299.15

Copyright (C) Microsoft Corporation.
On computer: YTHINK

DISKPART> list disk

  Disk ###  Status         Size     Free     Dyn  Gpt
  --------  -------------  -------  -------  ---  ---
  Disk 0    Online          238 GB      0 B        *
  Disk 1    Online           29 GB    28 GB

DISKPART> select disk 1

Disk 1 is now the selected disk.

DISKPART> list partition

  Partition ###  Type              Size     Offset
  -------------  ----------------  -------  -------
  Partition 1    Primary           1706 MB  1024 KB
  Partition 2    Primary           2368 KB  1707 MB

DISKPART> select partition 2

Partition 2 is now the selected partition.

DISKPART> delete partition

DiskPart successfully deleted the selected partition.

DISKPART> select partition 0

The specified partition is not valid.
Please select a valid partition.

There is no partition selected.

DISKPART> select partition 1

Partition 1 is now the selected partition.

DISKPART> delete partition

DiskPart successfully deleted the selected partition.

DISKPART> create partition primary

DiskPart succeeded in creating the specified partition.


Leaving DiskPart...


Web print is still shit, even for CSS2 print features

Having spent ten yours out of the loop, I had somehow expected browser makers to take some time out of their favorite hobby—moving knobs and settings around—to implement CSS printing support. I’m all for saving paper and all, but requiring me to pipe my HTML through LaTeX to produce halfway decent documents doesn’t feel very 2017ish to me. In 2007, it already didn’t even feel very 2007is to me.

I’m trying to make the articles on nicely printable. The good news is that I can finally style my headings so that they do not end up all alone on the bottom of a page. page-break-after: avoid is finally supported, except that it isn’t in Firefox. Well, I’m still happy. Back in 2007, only Opera supported this.

Next stop: I wanted to replace the standard header and footer slapped on the page with something nicer. It turned out that, yes, @page {} is supported now, which makes this rather easy:

@page {
 : 0;

Except, then I wanted to add the page number, preferrable in the form n/N to the footer, which turned out to be impossible.

Then, I thought: since my publication pipeline starts with Markdown, I might as well convert that to PDF through LaTeX and then hint to the browser to use the PDF version for printing:

<link rel="alternate" media="print" type="application/pdf" href="print.pdf" />

Never mind. Why did I even for one second think that this would be supported?

Which context does the circumflex accent (^) refer to in BULL?

  • ^ refers to the last step left in the superpath, never to a step right. (In the A4 notes below, in red, I seem to disagree with what I say here.)
  • [^] refers to the superpath’s imprint, [^^] to the super-superpath’s imprint, etc. Referring to a superpath’s imprint from within a subpath is only possible if the subpath’s imprint isn’t included in the superpath’s—that is: the subpath shouldn’t preceed \\ or be preceded by //.
  • [[^]] refers to the superpath as a whole, [[^^]] to the super-superpath, etc.

My A4 notebook (p. 23) also bears witness to complicated thoughts and conflicting insights (in red) about what the ^ symbol should and should not refer to.

BULL TiddlyWiki

At some point, I started condensing some paper and digital notes into a TiddlyWiki, which seemed like an appropriate tool for a personal project. Looking at the timestamp (July 26 of 2013), this choice doesn’t make sense, because at that time I had already started this blog and discovered the joy of indexical knowledge management based on links between temporal blurbs (as within a blog) rather than links between named blurbs (as within a wiki). I guess it had everything to do with wanting the execution of the BULL idea to be perfect before daring to share. It’s definitely time to get over that.

The BULL TiddlyWiki.

BULL progress and stagnation

At work yesterday, during lunch, I started a lengthy discussion that stretched out long beyond the boundaries of regular lunch hours. The discussion topic was my surprise that IT practices—particularly programming methodologies—hadn’t changed much, if at all, between my leaving the industry in 2007 and re-entering the industry in 2015. My surprise wasn’t a rethorical technique; my unpreparedness for this lack of change has lost me a long-running bet with Wiebe around 2007, when we stopped being colleagues for about 8 years. The content of that bet was as follows: I predicted that in 10 years time—now—computer science would have sufficiently evolved so that software would behave intelligently. In fact, I didn’t believe that AI would have emerged by now, but I did expect software architecture to have changed in such a fundamental way that computers would at least have behaved intelligent, even if they weren’t self-taught and self-learning.

I was doubly wrong when I entered the bet with Wiebe: software systems are messier and more difficult to change than they were 10 years ago, and special purpose, self-learning AIs are obsoleting humans even in such areas as driving cars. So, was I fundamentally wrong in thinking that a different type of software would be possible? Should I simply wait for AI to take over my job as a programmer and obsolete these concerns?

I don’t know. I do know that if AI doesn’t make my job obsolete (any time soon), I no longer believe that anybody else is going to make my job obsolete. And I really do believe that my job—the functions that I perform during the majority of my working hours—ought to be obsolete. But, since I can’t seem to convince anybody of this fact, I should suck up my pride and shame and start sharing what I’ve come up so far.

The notes that I’ve made the last few years aren’t as disjointed and messy as they were when I wrote my previous—and first—post about BULL. Here are some of the better-looking notes, from my A4 notebook:

BULL notes – A4 notebook p. 18

BULL notes – A4 notebook p. 19

BULL notes – A4 notebook p. 20

BULL notes – A4 notebook p. 21

BULL notes – A4 notebook p. 22

BULL notes – A4 notebook p. 23

BULL notes – A4 notebook p. 24

BULL notes – A4 notebook p. 25

Meanwhile, yesterday, while I should have been clocking work time, I’ve been condensing some of the threads in my head into a in a newly published GitHub repository. This morning, I also rebased my latest half-assed attempt at a formal EBFN grammar and a parser in C++ to that same repository.

Epson XP-630 cartridges

Our printer is an Epson XP-630, courtesy of Marilisa’s parents who gifted it to us when we moved into our new place together. Suitable ink comes in the following multipacks:

  • C13T33374510 (24.4 ml),
  • C13T33574510 (47.0 ml),
  • C13T33374010 (24.4 ml), and
  • C13T33574010 (47.0 ml).

I ordered a supposedly compatible multipack (“Epson 33XL multipack zwart en kleur”) through for our first cartridge replacement (which has been due since Marilisa’s trip to India about half a year ago).

« Older posts Newer posts »

© 2022 BigSmoke

Theme by Anders NorenUp ↑