summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gemfeed/2024-04-01-KISS-high-availability-with-OpenBSD.gmi26
-rw-r--r--gemfeed/atom.xml522
-rw-r--r--index.gmi2
-rw-r--r--notes/influence-wihout-authority.gmi.tpl55
-rw-r--r--uptime-stats.gmi2
5 files changed, 333 insertions, 274 deletions
diff --git a/gemfeed/2024-04-01-KISS-high-availability-with-OpenBSD.gmi b/gemfeed/2024-04-01-KISS-high-availability-with-OpenBSD.gmi
index f4c33f9c..656cd33e 100644
--- a/gemfeed/2024-04-01-KISS-high-availability-with-OpenBSD.gmi
+++ b/gemfeed/2024-04-01-KISS-high-availability-with-OpenBSD.gmi
@@ -28,18 +28,20 @@ _____|_:_:_| (o)-(o) |_:_:_|--'`-. ,--. ksh under-water (((\'/
```
```
-Table of contents:
- KISS high-availability with OpenBSD
- My auto-failover requirements
- My HA solution
- Only OpenBSD base installation required
- Fairly cheap and geo-redundant
- Failover time and split-brain
- Failover support for multiple protocols
- Let's encrypt TLS certificates
- Monitoring
- Rex automation
- More HA
+Table of contents
+=================
+
+KISS high-availability with OpenBSD
+ My auto-failover requirements
+ My HA solution
+ Only OpenBSD base installation required
+ Fairly cheap and geo-redundant
+ Failover time and split-brain
+ Failover support for multiple protocols
+ Let's encrypt TLS certificates
+ Monitoring
+ Rex automation
+ More HA
```
I have always wanted a highly available setup for my personal websites. I could have used off-the-shelf hosting solutions or hosted my sites in an AWS S3 bucket. I have used technologies like (in unsorted and slightly unrelated order) BGP, LVS/IPVS, ldirectord, Pacemaker, STONITH, scripted VIP failover via ARP, heartbeat, heartbeat2, Corosync, keepalived, DRBD, and commercial F5 Load Balancers for high availability at work.
diff --git a/gemfeed/atom.xml b/gemfeed/atom.xml
index d9f9521d..746bdd7b 100644
--- a/gemfeed/atom.xml
+++ b/gemfeed/atom.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
- <updated>2024-04-27T21:58:16+03:00</updated>
+ <updated>2024-04-30T13:13:33+03:00</updated>
<title>foo.zone feed</title>
<subtitle>To be in the .zone!</subtitle>
<link href="gemini://foo.zone/gemfeed/atom.xml" rel="self" />
@@ -18,7 +18,7 @@
<summary>These are my personal takeaways after reading 'Slow Productivity - The lost Art of Accomplishment Without Burnout' by Cal Newport.</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline'>"Slow Productivity" book notes</h1><br />
+ <h1 style='display: inline' id='SlowProductivitybooknotes'>"Slow Productivity" book notes</h1><br />
<br />
<span class='quote'>Published at 2024-04-27T14:18:51+03:00</span><br />
<br />
@@ -42,7 +42,7 @@
<br />
<span>"Slow productivity" does not mean being less productive. Cal Newport wants to point out that you can be much more productive with "slow productivity" than you would be without it. It is a different way of working than most of us are used to in the modern workplace, which is hyper-connected and always online.</span><br />
<br />
-<h2 style='display: inline'>Pseudo-productivity and Shallow work</h2><br />
+<h2 style='display: inline' id='PseudoproductivityandShallowwork'>Pseudo-productivity and Shallow work</h2><br />
<br />
<span>People use visible activity instead of real productivity because it&#39;s easier to measure. This is called pseudo-productivity.</span><br />
<span>Pseudo-productivity is used as a proxy for real productivity. If you don&#39;t look busy, you are dismissed as lazy or lacking a work ethic.</span><br />
@@ -51,7 +51,7 @@
<br />
<span>Shallow work usually doesn&#39;t help you to accomplish big things. Always have the big picture in mind. Shallow work can&#39;t be entirely eliminated, but it can be managed—for example, plan dedicated time slots for certain types of shallow work.</span><br />
<br />
-<h2 style='display: inline'>Accomplishments without burnout</h2><br />
+<h2 style='display: inline' id='Accomplishmentswithoutburnout'>Accomplishments without burnout</h2><br />
<br />
<span>The overall perception is that if you want to accomplish something, you must put yourself on the verge of burnout. Cal Newport writes about "The lost Art of Accomplishments without Burnouts", where you can accomplish big things without all the stress usually involved.</span><br />
<br />
@@ -62,7 +62,7 @@
<li>Work at a natural pace</li>
<li>Obsess over quality</li>
</ul><br />
-<h2 style='display: inline'>Do fewer things</h2><br />
+<h2 style='display: inline' id='Dofewerthings'>Do fewer things</h2><br />
<br />
<span>There will always be more work. The faster you finish it, the quicker you will have something new on your plate.</span><br />
<br />
@@ -96,7 +96,7 @@
<br />
<span>Put tasks on autopilot (regular recurring tasks).</span><br />
<br />
-<h2 style='display: inline'>Work at a natural pace</h2><br />
+<h2 style='display: inline' id='Workatanaturalpace'>Work at a natural pace</h2><br />
<br />
<span>We suffer from overambitious timelines, task lists, and business. Focus on what matters. Don&#39;t rush your most important work to achieve better results.</span><br />
<br />
@@ -112,7 +112,7 @@
<br />
<span>Schedule slow seasons (e.g., when on vacation). Disconnect in the slow season. Doing nothing will not satisfy your mind, though. You could read a book on your subject matter to counteract that.</span><br />
<br />
-<h2 style='display: inline'>Obsess over quality </h2><br />
+<h2 style='display: inline' id='Obsessoverquality'>Obsess over quality </h2><br />
<br />
<span>Obsess over quality even if you lose short-term opportunities by rejecting other projects. Quality demands you slow down. The two previous two principles (do fewer things and work at a natural pace) are mandatory for this principle to work:</span><br />
<br />
@@ -175,7 +175,7 @@
<summary>Art by Michael J. Penick (mod. by Paul B.)</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline'>KISS high-availability with OpenBSD</h1><br />
+ <h1 style='display: inline' id='KISShighavailabilitywithOpenBSD'>KISS high-availability with OpenBSD</h1><br />
<br />
<span class='quote'>Published at 2024-03-30T22:12:56+02:00</span><br />
<br />
@@ -205,18 +205,20 @@ _____|_:_:_| (o)-(o) |_:_:_|--&#39;`-. ,--. ksh under-water (((\&#39;/
</pre>
<br />
<pre>
-Table of contents:
- KISS high-availability with OpenBSD
- My auto-failover requirements
- My HA solution
- Only OpenBSD base installation required
- Fairly cheap and geo-redundant
- Failover time and split-brain
- Failover support for multiple protocols
- Let&#39;s encrypt TLS certificates
- Monitoring
- Rex automation
- More HA
+Table of contents
+=================
+
+KISS high-availability with OpenBSD
+ My auto-failover requirements
+ My HA solution
+ Only OpenBSD base installation required
+ Fairly cheap and geo-redundant
+ Failover time and split-brain
+ Failover support for multiple protocols
+ Let&#39;s encrypt TLS certificates
+ Monitoring
+ Rex automation
+ More HA
</pre>
<br />
<span>I have always wanted a highly available setup for my personal websites. I could have used off-the-shelf hosting solutions or hosted my sites in an AWS S3 bucket. I have used technologies like (in unsorted and slightly unrelated order) BGP, LVS/IPVS, ldirectord, Pacemaker, STONITH, scripted VIP failover via ARP, heartbeat, heartbeat2, Corosync, keepalived, DRBD, and commercial F5 Load Balancers for high availability at work. </span><br />
@@ -227,7 +229,7 @@ Table of contents:
<br />
<span class='quote'>PS: ASCII-art reflects an OpenBSD under-water world with all the tools available in the base system.</span><br />
<br />
-<h2 style='display: inline'>My auto-failover requirements</h2><br />
+<h2 style='display: inline' id='Myautofailoverrequirements'>My auto-failover requirements</h2><br />
<br />
<ul>
<li>Be OpenBSD-based (I prefer OpenBSD because of the cleanliness and good documentation) and rely on as few external packages as possible. </li>
@@ -240,9 +242,9 @@ Table of contents:
<li>Have good monitoring in place so I know when a failover was performed and when something went wrong with the failover.</li>
<li>Don&#39;t configure everything manually. The configuration should be automated and reproducible.</li>
</ul><br />
-<h2 style='display: inline'>My HA solution</h2><br />
+<h2 style='display: inline' id='MyHAsolution'>My HA solution</h2><br />
<br />
-<h3 style='display: inline'>Only OpenBSD base installation required</h3><br />
+<h3 style='display: inline' id='OnlyOpenBSDbaseinstallationrequired'>Only OpenBSD base installation required</h3><br />
<br />
<span>My HA solution for Web and Gemini is based on DNS (OpenBSD&#39;s <span class='inlinecode'>nsd</span>) and a simple shell script (OpenBSD&#39;s <span class='inlinecode'>ksh</span> and some little <span class='inlinecode'>sed</span> and <span class='inlinecode'>awk</span> and <span class='inlinecode'>grep</span>). All software used here is part of the OpenBSD base system and no external package needs to be installed - OpenBSD is a complete operating system.</span><br />
<br />
@@ -398,7 +400,7 @@ echo <font color="#FF0000">"Failover of zone $zone to $MASTER completed"</font>
<br />
<a class='textlink' href='https://codeberg.org/snonux/rexfiles/src/branch/master/frontends/scripts/dns-failover.ksh'>dns-failover.ksh</a><br />
<br />
-<h3 style='display: inline'>Fairly cheap and geo-redundant</h3><br />
+<h3 style='display: inline' id='Fairlycheapandgeoredundant'>Fairly cheap and geo-redundant</h3><br />
<br />
<span>I am renting two small OpenBSD VMs: One at OpenBSD Amsterdam and the other at Hetzner Cloud. So, both VMs are hosted at another provider, in different IP subnets, and in different countries (the Netherlands and Germany).</span><br />
<br />
@@ -409,13 +411,13 @@ echo <font color="#FF0000">"Failover of zone $zone to $MASTER completed"</font>
<br />
<span>A DNS-based failover is cheap, as there isn&#39;t any BGP or fancy load balancer to pay for. Small VMs also cost less than millions.</span><br />
<br />
-<h3 style='display: inline'>Failover time and split-brain</h3><br />
+<h3 style='display: inline' id='Failovertimeandsplitbrain'>Failover time and split-brain</h3><br />
<br />
<span>A DNS failover doesn&#39;t happen immediately. I&#39;ve configured a DNS TTL of <span class='inlinecode'>300</span> seconds, and the failover script checks once per minute whether to perform a failover or not. So, in total, a failover can take six minutes (not including other DNS caching servers somewhere in the interweb, but that&#39;s fine - eventually, all requests will resolve to the new master after a failover).</span><br />
<br />
<span>A split-brain scenario between the old master and the new master might happen. That&#39;s OK, as my sites are static, and there&#39;s no database to synchronise other than HTML, CSS, and images when the site is updated.</span><br />
<br />
-<h3 style='display: inline'>Failover support for multiple protocols</h3><br />
+<h3 style='display: inline' id='Failoversupportformultipleprotocols'>Failover support for multiple protocols</h3><br />
<br />
<span>With the DNS failover, HTTP, HTTPS, and Gemini protocols are failovered. This works because all domain virtual hosts are configured on either VM&#39;s <span class='inlinecode'>httpd</span> (OpenBSD&#39;s HTTP server) and <span class='inlinecode'>relayd</span> (it&#39;s also part of OpenBSD and I use it to TLS offload the Gemini protocol). So, both VMs accept requests for all the hosts. It&#39;s just a matter of the DNS entries, which VM receives the requests.</span><br />
<br />
@@ -426,7 +428,7 @@ echo <font color="#FF0000">"Failover of zone $zone to $MASTER completed"</font>
<br />
<span>On DNS failover, master and standby swap roles without config changes other than the DNS entries. That&#39;s KISS (keep it simple and stupid)!</span><br />
<br />
-<h3 style='display: inline'>Let&#39;s encrypt TLS certificates</h3><br />
+<h3 style='display: inline' id='LetsencryptTLScertificates'>Let&#39;s encrypt TLS certificates</h3><br />
<br />
<span>All my hosts use TLS certificates from Let&#39;s Encrypt. The ACME automation for requesting and keeping the certificates valid (up to date) requires that the host requesting a certificate from Let&#39;s Encrypt is also the host using that certificate.</span><br />
<br />
@@ -463,7 +465,7 @@ http://www.gnu.org/software/src-highlite -->
<a class='textlink' href='https://man.OpenBSD.org/acme-client.1'>https://man.OpenBSD.org/acme-client.1</a><br />
<a class='textlink' href='./2022-07-30-lets-encrypt-with-openbsd-and-rex.html'>Let&#39;s Encrypt with OpenBSD and Rex</a><br />
<br />
-<h3 style='display: inline'>Monitoring</h3><br />
+<h3 style='display: inline' id='Monitoring'>Monitoring</h3><br />
<br />
<span>CRON is sending me an E-Mail whenever a failover is performed (or whenever a failover failed). Furthermore, I am monitoring my DNS servers and hosts through Gogios, the monitoring system I have developed. </span><br />
<br />
@@ -472,7 +474,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>Gogios, as I developed it by myself, isn&#39;t part of the OpenBSD base system. </span><br />
<br />
-<h3 style='display: inline'>Rex automation</h3><br />
+<h3 style='display: inline' id='Rexautomation'>Rex automation</h3><br />
<br />
<span>I use Rexify, a friendly configuration management system that allows automatic deployment and configuration.</span><br />
<br />
@@ -481,7 +483,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>Rex isn&#39;t part of the OpenBSD base system, but I didn&#39;t need to install any external software on OpenBSD either as Rex is invoked from my Laptop!</span><br />
<br />
-<h2 style='display: inline'>More HA</h2><br />
+<h2 style='display: inline' id='MoreHA'>More HA</h2><br />
<br />
<span>Other high-available services running on my OpenBSD VMs are my MTAs for mail forwarding (OpenSMTPD - also part of the OpenBSD base system) and the authoritative DNS servers (<span class='inlinecode'>nsd</span>) for all my domains. No particular HA setup is required, though, as the protocols (SMTP and DNS) already take care of the failover to the next available host! </span><br />
<br />
@@ -519,7 +521,7 @@ http://www.gnu.org/software/src-highlite -->
<summary>I am an ideas person. I find myself frequently somewhere on the streets with an idea in my head but no paper journal noting it down. </summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline'>A fine Fyne Android app for quickly logging ideas programmed in Go</h1><br />
+ <h1 style='display: inline' id='AfineFyneAndroidappforquicklyloggingideasprogrammedinGo'>A fine Fyne Android app for quickly logging ideas programmed in Go</h1><br />
<br />
<span class='quote'>Published at 2024-03-03T00:07:21+02:00</span><br />
<br />
@@ -551,7 +553,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>My Android apps will never be polished, but they will get the job done, and this is precisely how I want them to be. Minimalistic but functional. I could spend more time polishing Quick logger, but my Quick logger app then may be the same as any other notes app out there (complicated or bloated).</span><br />
<br />
-<h2 style='display: inline'>All easy-peasy?</h2><br />
+<h2 style='display: inline' id='Alleasypeasy'>All easy-peasy?</h2><br />
<br />
<span>I did have some issues with the app logo for Android, though. Android always showed the default app icon and not my custom icon whenever I used a custom <span class='inlinecode'>AndroidManifest.xml</span> for custom app storage permissions. Without a custom <span class='inlinecode'>AndroidAmnifest.xml</span> the app icon would be displayed under Android, but then the app would not have the <span class='inlinecode'>MANAGE_EXTERNAL_STORAGE</span> permission, which is required for Quick logger to write to a custom directory. I found a workaround, which I commented on here at Github:</span><br />
<br />
@@ -768,7 +770,7 @@ http://www.gnu.org/software/src-highlite -->
<summary>HKISSFISHKISSFISHKISSFISHKISSFISH KISS</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline'>One reason why I love OpenBSD</h1><br />
+ <h1 style='display: inline' id='OnereasonwhyIloveOpenBSD'>One reason why I love OpenBSD</h1><br />
<br />
<span class='quote'>Published at 2024-01-13T22:55:33+02:00</span><br />
<br />
@@ -849,7 +851,7 @@ $ doas reboot <i><font color="#9A1900"># Just in case, reboot one more time</fon
<summary>This is the third part of my Site Reliability Engineering (SRE) series. I am currently employed as a Site Reliability Engineer and will try to share what SRE is about in this blog series.</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline'>Site Reliability Engineering - Part 3: On-Call Culture and the Human Aspect</h1><br />
+ <h1 style='display: inline' id='SiteReliabilityEngineeringPart3OnCallCultureandtheHumanAspect'>Site Reliability Engineering - Part 3: On-Call Culture and the Human Aspect</h1><br />
<br />
<span class='quote'>Published at 2024-01-09T18:35:48+02:00</span><br />
<br />
@@ -885,7 +887,7 @@ $ doas reboot <i><font color="#9A1900"># Just in case, reboot one more time</fon
</pre>
<br />
-<h2 style='display: inline'>On-Call Culture and the Human Aspect: Prioritising Well-being in the Realm of Reliability</h2><br />
+<h2 style='display: inline' id='OnCallCultureandtheHumanAspectPrioritisingWellbeingintheRealmofReliability'>On-Call Culture and the Human Aspect: Prioritising Well-being in the Realm of Reliability</h2><br />
<br />
<span>Site Reliability Engineering is synonymous with ensuring system reliability, but the human factor is an often-underestimated part of this discipline. Ensuring an healthy on-call culture is as critical as any technical solution. The well-being of the engineers is an important factor.</span><br />
<br />
@@ -921,7 +923,7 @@ $ doas reboot <i><font color="#9A1900"># Just in case, reboot one more time</fon
<summary>This is the third blog post about my Bash Golf series. This series is random Bash tips, tricks, and weirdnesses I have encountered over time. </summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline'>Bash Golf Part 3</h1><br />
+ <h1 style='display: inline' id='BashGolfPart3'>Bash Golf Part 3</h1><br />
<br />
<span class='quote'>Published at 2023-12-10T11:35:54+02:00</span><br />
<br />
@@ -942,7 +944,7 @@ jgs^^^^^^^`^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
<a class='textlink' href='./2022-01-01-bash-golf-part-2.html'>2022-01-01 Bash Golf Part 2</a><br />
<a class='textlink' href='./2023-12-10-bash-golf-part-3.html'>2023-12-10 Bash Golf Part 3 (You are currently reading this)</a><br />
<br />
-<h2 style='display: inline'><span class='inlinecode'>FUNCNAME</span></h2><br />
+<h2 style='display: inline' id='FUNCNAME'><span class='inlinecode'>FUNCNAME</span></h2><br />
<br />
<span><span class='inlinecode'>FUNCNAME</span> is an array you are looking for a way to dynamically determine the name of the current function (which could be considered the callee in the context of its own execution), you can use the special variable <span class='inlinecode'>FUNCNAME</span>. This is an array variable that contains the names of all shell functions currently in the execution call stack. The element <span class='inlinecode'>FUNCNAME[0]</span> holds the name of the currently executing function, <span class='inlinecode'>FUNCNAME[1]</span> the name of the function that called that, and so on.</span><br />
<br />
@@ -982,7 +984,7 @@ http://www.gnu.org/software/src-highlite -->
INFO<font color="#990000">|</font><font color="#993399">20231210</font>-<font color="#993399">082732</font><font color="#990000">|</font><font color="#993399">123002</font><font color="#990000">|</font>at_home_friday_evening<font color="#990000">|</font>One Peperoni Pizza<font color="#990000">,</font> please
</pre>
<br />
-<h2 style='display: inline'><span class='inlinecode'>:(){ :|:&amp; };:</span></h2><br />
+<h2 style='display: inline' id=''><span class='inlinecode'>:(){ :|:&amp; };:</span></h2><br />
<br />
<span>This one may be widely known already, but I am including it here as I found a cute image illustrating it. But to break <span class='inlinecode'>:(){ :|:&amp; };:</span> down:</span><br />
<br />
@@ -1005,7 +1007,7 @@ INFO<font color="#990000">|</font><font color="#993399">20231210</font>-<font co
<br />
<a href='./2023-12-10-bash-golf-part-3/bash-fork-bomb.jpg'><img alt='Bash fork bomb' title='Bash fork bomb' src='./2023-12-10-bash-golf-part-3/bash-fork-bomb.jpg' /></a><br />
<br />
-<h2 style='display: inline'>Inner functions</h2><br />
+<h2 style='display: inline' id='Innerfunctions'>Inner functions</h2><br />
<br />
<span>Bash defines variables as it is interpreting the code. The same applies to function declarations. Let&#39;s consider this code:</span><br />
<br />
@@ -1074,7 +1076,7 @@ Wintel inside!
Wintel inside!
</pre>
<br />
-<h2 style='display: inline'>Exporting functions</h2><br />
+<h2 style='display: inline' id='Exportingfunctions'>Exporting functions</h2><br />
<br />
<span>Have you ever wondered how to execute a shell function in parallel through <span class='inlinecode'>xargs</span>? The problem is that this won&#39;t work:</span><br />
<br />
@@ -1164,7 +1166,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>... because <span class='inlinecode'>some_other_function</span> isn&#39;t exported! You will also need to add an <span class='inlinecode'>export -f some_other_function</span>!</span><br />
<br />
-<h2 style='display: inline'>Dynamic variables with <span class='inlinecode'>local</span></h2><br />
+<h2 style='display: inline' id='Dynamicvariableswithlocal'>Dynamic variables with <span class='inlinecode'>local</span></h2><br />
<br />
<span>You may know that <span class='inlinecode'>local</span> is how to declare local variables in a function. Most don&#39;t know that those variables actually have dynamic scope. Let&#39;s consider the following example:</span><br />
<br />
@@ -1204,7 +1206,7 @@ foo
<span>What happened? The variable <span class='inlinecode'>foo</span> (declared with <span class='inlinecode'>local</span>) is available in the function it was declared in and in all other functions down the call stack! We can even modify the value of <span class='inlinecode'>foo</span>, and the change will be visible up the call stack. It&#39;s not a global variable; on the last line, <span class='inlinecode'>echo "$foo"</span> echoes the global variable content.</span><br />
<br />
<br />
-<h2 style='display: inline'><span class='inlinecode'>if</span> conditionals</h2><br />
+<h2 style='display: inline' id='ifconditionals'><span class='inlinecode'>if</span> conditionals</h2><br />
<br />
<span>Consider all variants here more or less equivalent:</span><br />
<br />
@@ -1255,7 +1257,7 @@ ok4a
ok4b
</pre>
<br />
-<h2 style='display: inline'>Multi-line comments</h2><br />
+<h2 style='display: inline' id='Multilinecomments'>Multi-line comments</h2><br />
<br />
<span>You all know how to comment. Put a <span class='inlinecode'>#</span> in front of it. You could use multiple single-line comments or abuse heredocs and redirect it to the <span class='inlinecode'>:</span> no-op command to emulate multi-line comments. </span><br />
<br />
@@ -1279,7 +1281,7 @@ COMMENT
<br />
<span>I will not demonstrate the execution of this script, as it won&#39;t print anything! It&#39;s obviously not the most pretty way of commenting on your code, but it could sometimes be handy!</span><br />
<br />
-<h2 style='display: inline'>Don&#39;t change it while it&#39;s executed</h2><br />
+<h2 style='display: inline' id='Dontchangeitwhileitsexecuted'>Don&#39;t change it while it&#39;s executed</h2><br />
<br />
<span>Consider this script:</span><br />
<br />
@@ -1338,7 +1340,7 @@ echo baz
<summary>This is the second part of my Site Reliability Engineering (SRE) series. I am currently employed as a Site Reliability Engineer and will try to share what SRE is about in this blog series.</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline'>Site Reliability Engineering - Part 2: Operational Balance in SRE</h1><br />
+ <h1 style='display: inline' id='SiteReliabilityEngineeringPart2OperationalBalanceinSRE'>Site Reliability Engineering - Part 2: Operational Balance in SRE</h1><br />
<br />
<span class='quote'>Published at 2023-11-19T00:18:18+03:00</span><br />
<br />
@@ -1363,7 +1365,7 @@ echo baz
⠀⠀⠀⠀⠀⠀⠴⠶⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠶⠦⠀⠀
</pre>
<br />
-<h2 style='display: inline'>Operational Balance in SRE: Finding the Equilibrium in Reliability and Velocity</h2><br />
+<h2 style='display: inline' id='OperationalBalanceinSREFindingtheEquilibriuminReliabilityandVelocity'>Operational Balance in SRE: Finding the Equilibrium in Reliability and Velocity</h2><br />
<br />
<span>Site Reliability Engineering has established itself as more than just a set of best practices or methodologies. Instead, it stands as a beacon of operational excellence, which guides engineering teams through the turbulent waters of modern software development and system management.</span><br />
<br />
@@ -1403,7 +1405,7 @@ echo baz
<summary>These are my personal takeaways after reading 'Mind Management' by David Kadavy. Note that the book contains much more knowledge wisdom and that these notes only contain points I personally found worth writing down. This is mainly for my own use, but you might find it helpful too.</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline'>"Mind Management" book notes</h1><br />
+ <h1 style='display: inline' id='MindManagementbooknotes'>"Mind Management" book notes</h1><br />
<br />
<span class='quote'>Published at 2023-11-11T22:21:47+02:00</span><br />
<br />
@@ -1427,11 +1429,11 @@ echo baz
<li>The point of diminishing returns</li>
<li>The point of negative return</li>
</ul><br />
-<h2 style='display: inline'>Empty slots in the calendar</h2><br />
+<h2 style='display: inline' id='Emptyslotsinthecalendar'>Empty slots in the calendar</h2><br />
<br />
<span>If we do more things in less time and use all possible slots, speed read, etc., we are more productive. But in reality, that&#39;s not the entire truth. You also exchange one thing against everything else.... You cut out too much from your actual life.</span><br />
<br />
-<h2 style='display: inline'>When you safe time...</h2><br />
+<h2 style='display: inline' id='Whenyousafetime'>When you safe time...</h2><br />
<br />
<span>...keep it.</span><br />
<br />
@@ -1440,7 +1442,7 @@ echo baz
<li>Creative thinking needs space. It will pay dividends tomorrow.</li>
<li>You will be rewarded with the "Eureka effect" - a sudden new insight.</li>
</ul><br />
-<h2 style='display: inline'>Follow your mood</h2><br />
+<h2 style='display: inline' id='Followyourmood'>Follow your mood</h2><br />
<br />
<span>Ask yourself: what is my mood now? We never have the energy to do anything, so the better strategy is to follow your current mode and energy. E.g.:</span><br />
<br />
@@ -1448,7 +1450,7 @@ echo baz
<li>Didn&#39;t sleep enough today? Then, do simple, non-demanding tasks at work</li>
<li>Had a great sleep, and there is even time before work starts? Pull in a workout...</li>
</ul><br />
-<h2 style='display: inline'>Boosting creativity</h2><br />
+<h2 style='display: inline' id='Boostingcreativity'>Boosting creativity</h2><br />
<br />
<span>The morning without coffee is a gift for creativity, but you often get distracted. Minimize distractions, too. I have no window to stare out but a plain blank wall.</span><br />
<br />
@@ -1458,7 +1460,7 @@ echo baz
<li>Don&#39;t race with time but walk alongside it as rough time lines.</li>
<li>Don&#39;t judge every day after the harvest, but the seed you lay</li>
</ul><br />
-<h2 style='display: inline'>The right mood for the task at hand</h2><br />
+<h2 style='display: inline' id='Therightmoodforthetaskathand'>The right mood for the task at hand</h2><br />
<br />
<span>We need to try many different combinations. Limiting ourselves and trying too hard makes us frustrated and burn out. Creativity requires many iterations.</span><br />
<br />
@@ -1472,7 +1474,7 @@ echo baz
<br />
<span>It gives you pleasure and is in a good mood. This increases creativity if you do what you want to do.</span><br />
<br />
-<h2 style='display: inline'>Creativity hacks</h2><br />
+<h2 style='display: inline' id='Creativityhacks'>Creativity hacks</h2><br />
<br />
<ul>
<li>Coffee can cause anxiety.</li>
@@ -1483,7 +1485,7 @@ echo baz
<li>Go to open spaces for creativity.</li>
<li>Go to closed spaces for polishing.</li>
</ul><br />
-<h2 style='display: inline'>Planning and strategizing</h2><br />
+<h2 style='display: inline' id='Planningandstrategizing'>Planning and strategizing</h2><br />
<br />
<span>Minds work better in sprints and not in marathons. Have a weekly plan, not a daily one.</span><br />
<br />
@@ -1496,7 +1498,7 @@ echo baz
<br />
<span>You could schedule exploratory tasks when you are under grief. Sound systems should create slack for creativity. Plan only for a few minutes.</span><br />
<br />
-<h2 style='display: inline'>Fake it until you make it. </h2><br />
+<h2 style='display: inline' id='Fakeituntilyoumakeit'>Fake it until you make it. </h2><br />
<br />
<ul>
<li>E.g. act calm if you want to be calm.</li>
@@ -1531,7 +1533,7 @@ echo baz
<summary>Once in a while, I share photos on the inter-web with either family and friends or on my The Irregular Ninja photo site. One hobby of mine is photography (even though I don't have enough time for it - so I am primarily a point-and-shoot photographer).</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline'>KISS static web photo albums with <span class='inlinecode'>photoalbum.sh</span></h1><br />
+ <h1 style='display: inline' id='KISSstaticwebphotoalbumswithphotoalbumsh'>KISS static web photo albums with <span class='inlinecode'>photoalbum.sh</span></h1><br />
<br />
<span class='quote'>Published at 2023-10-29T22:25:04+02:00</span><br />
<br />
@@ -1552,7 +1554,7 @@ echo baz
&#39;._____________________________________________.&#39;
</pre>
<br />
-<h2 style='display: inline'>Motivation</h2><br />
+<h2 style='display: inline' id='Motivation'>Motivation</h2><br />
<br />
<span>Once in a while, I share photos on the inter-web with either family and friends or on my The Irregular Ninja photo site. One hobby of mine is photography (even though I don&#39;t have enough time for it - so I am primarily a point-and-shoot photographer).</span><br />
<br />
@@ -1560,11 +1562,11 @@ echo baz
<br />
<span>I value KISS (keep it simple and stupid) and simplicity. All that&#39;s required for a web photo album is some simple HTML and spice it up with CSS. No need for JavaScript, no need for a complex dynamic website. </span><br />
<br />
-<h2 style='display: inline'>Introducing <span class='inlinecode'>photoalbum.sh</span></h2><br />
+<h2 style='display: inline' id='Introducingphotoalbumsh'>Introducing <span class='inlinecode'>photoalbum.sh</span></h2><br />
<br />
<span><span class='inlinecode'>photoalbum.sh</span> is a minimal Bash (Bourne Again Shell) script for Unix-like operating systems (such as Linux) to generate static web photo albums. The resulting static photo album is pure HTML+CSS (without any JavaScript!). It is specially designed to be as simple as possible.</span><br />
<br />
-<h2 style='display: inline'>Installation</h2><br />
+<h2 style='display: inline' id='Installation'>Installation</h2><br />
<br />
<span>Installation is straightforward. All required is a recent version of GNU Bash, GNU Make, Git and ImageMagick. On Fedora, the dependencies are installed with:</span><br />
<br />
@@ -1607,7 +1609,7 @@ cp ./src/photoalbum.default.conf /etc/default/photoalbum
This is Photoalbum Version 0.5.1
</pre>
<br />
-<h2 style='display: inline'>Setting it up</h2><br />
+<h2 style='display: inline' id='Settingitup'>Setting it up</h2><br />
<br />
<span>Now, it&#39;s time to set up the Irregular Ninja static web photo album (or any other web photo album you may be setting up!)! Create a directory (here: <span class='inlinecode'>irregular.ninja</span> for the Irregular Ninja Photo site - or any oter sub-directory reflecting your album&#39;s name), and inside of that directory, create an <span class='inlinecode'>incoming</span> directory. The <span class='inlinecode'>incoming</span> directory. Copy all photos to be part of the album there.</span><br />
<br />
@@ -1720,7 +1722,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>So I changed the album title, adjusted some image and thumbnail dimensions, and I want all images to be randomly shuffled every time the album is generated! I also have all my photos in my Nextcloud Photo directory and don&#39;t want to copy them to the local <span class='inlinecode'>incoming</span> directory. Also, a tarball containing the whole album as a download isn&#39;t provided.</span><br />
<br />
-<h2 style='display: inline'>Generating the static photo album</h2><br />
+<h2 style='display: inline' id='Generatingthestaticphotoalbum'>Generating the static photo album</h2><br />
<br />
<span>Let&#39;s generate it. Depending on the image sizes and count, the following step may take a while. </span><br />
<br />
@@ -1783,15 +1785,15 @@ blurs html index.html photos thumbs
<br />
<span class='quote'>PS: There&#39;s also a server-side synchronisation script mirroring the same content to another server for high availability reasons (out of scope for this blog post).</span><br />
<br />
-<h2 style='display: inline'>Cleaning it up</h2><br />
+<h2 style='display: inline' id='Cleaningitup'>Cleaning it up</h2><br />
<br />
<span>A simple <span class='inlinecode'>make clean</span> will clean up the <span class='inlinecode'>./dist</span> directory and all other (if any) temp files created.</span><br />
<br />
-<h2 style='display: inline'>HTML templates</h2><br />
+<h2 style='display: inline' id='HTMLtemplates'>HTML templates</h2><br />
<br />
<span>Poke around in this source directory. You will find a bunch of Bash-HTML template files. You could tweak them to your liking. </span><br />
<br />
-<h2 style='display: inline'>Conclusion</h2><br />
+<h2 style='display: inline' id='Conclusion'>Conclusion</h2><br />
<br />
<span>A decent looking (in my opinion, at least) in less than 500 (273 as of this writing, to be precise) lines of Bash code and with minimal dependencies; what more do you want? How many LOCs would this be in Raku with the same functionality (can it be sub-100?). </span><br />
<br />
@@ -1829,7 +1831,7 @@ blurs html index.html photos thumbs
<summary>Hey there. As I am pretty busy this month personally (I am now on Paternity Leave) and as I still want to post once monthly, the blog post of this month will only be some DTail usage examples. They're from the DTail documentation, but not all readers of my blog may be aware of those!</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline'>DTail usage examples</h1><br />
+ <h1 style='display: inline' id='DTailusageexamples'>DTail usage examples</h1><br />
<br />
<span class='quote'>Published at 2023-09-25T14:57:42+03:00</span><br />
<br />
@@ -1863,7 +1865,7 @@ blurs html index.html photos thumbs
<li>Use <span class='inlinecode'>dmap</span> to aggregate logs and other text files already written</li>
<li><span class='inlinecode'>dserver</span> is the DTail server, where all the clients can connect to</li>
</ul><br />
-<h2 style='display: inline'>Following logs</h2><br />
+<h2 style='display: inline' id='Followinglogs'>Following logs</h2><br />
<br />
<span>The following example demonstrates how to follow logs of several servers at once. The server list is provided as a flat text file. The example filters all records containing the string <span class='inlinecode'>INFO</span>. Any other Go compatible regular expression can also be used instead of <span class='inlinecode'>INFO</span>.</span><br />
<br />
@@ -1887,7 +1889,7 @@ http://www.gnu.org/software/src-highlite -->
<pre><font color="#990000">%</font> dtail --servers serverlist<font color="#990000">.</font>txt --grep INFO <font color="#FF0000">"/var/log/dserver/*.log"</font>
</pre>
<br />
-<h2 style='display: inline'>Aggregating logs</h2><br />
+<h2 style='display: inline' id='Aggregatinglogs'>Aggregating logs</h2><br />
<br />
<span>To run ad-hoc map-reduce aggregations on newly written log lines you must add a query. The following example follows all remote log lines and prints out every few seconds the result to standard output.</span><br />
<br />
@@ -1944,7 +1946,7 @@ http://www.gnu.org/software/src-highlite -->
--query <font color="#FF0000">'from STATS select ... outfile append result.csv'</font>
</pre>
<br />
-<h2 style='display: inline'>How to use <span class='inlinecode'>dcat</span></h2><br />
+<h2 style='display: inline' id='Howtousedcat'>How to use <span class='inlinecode'>dcat</span></h2><br />
<br />
<span>The following example demonstrates how to cat files (display the full content of the files) on several servers at once.</span><br />
<br />
@@ -1968,7 +1970,7 @@ http://www.gnu.org/software/src-highlite -->
<pre><font color="#990000">%</font> dcat --servers serverlist<font color="#990000">.</font>txt /etc/hostname
</pre>
<br />
-<h2 style='display: inline'>How to use <span class='inlinecode'>dgrep</span></h2><br />
+<h2 style='display: inline' id='Howtousedgrep'>How to use <span class='inlinecode'>dgrep</span></h2><br />
<br />
<span>The following example demonstrates how to grep files (display only the lines which match a given regular expression) of multiple servers at once. In this example, we look after some entries in <span class='inlinecode'>/etc/passwd</span>. This time, we don&#39;t provide the server list via an file but rather via a comma separated list directly on the command line. We also explore the <span class='inlinecode'>-before</span>, <span class='inlinecode'>-after</span> and <span class='inlinecode'>-max</span> flags (see animation).</span><br />
<br />
@@ -1987,7 +1989,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span class='quote'>Hint: <span class='inlinecode'>-regex</span> is an alias for <s