summaryrefslogtreecommitdiff
path: root/gemfeed
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2024-08-24 19:42:39 +0300
committerPaul Buetow <paul@buetow.org>2024-08-24 19:42:39 +0300
commit8618529905d74ce738c9907b48a8bfb046844977 (patch)
treed2c80f555740c793339a1fd3c663a12ec725fe22 /gemfeed
parentd2cea79cc18a013355cfd58f3a0f794d472a4667 (diff)
Update content for gemtext
Diffstat (limited to 'gemfeed')
-rw-r--r--gemfeed/2023-08-18-site-reliability-engineering-part-1.gmi2
-rw-r--r--gemfeed/2023-11-19-site-reliability-engineering-part-2.gmi4
-rw-r--r--gemfeed/2024-01-09-site-reliability-engineering-part-3.gmi2
-rw-r--r--gemfeed/2024-04-01-KISS-high-availability-with-OpenBSD.gmi29
-rw-r--r--gemfeed/2024-05-03-projects-i-currently-dont-have-time-for.gmi77
-rw-r--r--gemfeed/2024-06-23-terminal-multiplexing-with-tmux.gmi41
-rw-r--r--gemfeed/atom.xml720
7 files changed, 430 insertions, 445 deletions
diff --git a/gemfeed/2023-08-18-site-reliability-engineering-part-1.gmi b/gemfeed/2023-08-18-site-reliability-engineering-part-1.gmi
index f28fbce8..25baf9ad 100644
--- a/gemfeed/2023-08-18-site-reliability-engineering-part-1.gmi
+++ b/gemfeed/2023-08-18-site-reliability-engineering-part-1.gmi
@@ -6,7 +6,7 @@ Being a Site Reliability Engineer (SRE) is like stepping into a lively, ever-evo
=> ./2023-08-18-site-reliability-engineering-part-1.gmi 2023-08-18 Site Reliability Engineering - Part 1: SRE and Organizational Culture (You are currently reading this)
=> ./2023-11-19-site-reliability-engineering-part-2.gmi 2023-11-19 Site Reliability Engineering - Part 2: Operational Balance in SRE
-=> ./2024-01-09-site-reliability-engineering-part-3.gmi 2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Aspect
+=> ./2024-01-09-site-reliability-engineering-part-3.gmi 2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Side
```
▓▓▓▓░░
diff --git a/gemfeed/2023-11-19-site-reliability-engineering-part-2.gmi b/gemfeed/2023-11-19-site-reliability-engineering-part-2.gmi
index 04b82bb7..5205b4d8 100644
--- a/gemfeed/2023-11-19-site-reliability-engineering-part-2.gmi
+++ b/gemfeed/2023-11-19-site-reliability-engineering-part-2.gmi
@@ -6,7 +6,7 @@ This is the second part of my Site Reliability Engineering (SRE) series. I am cu
=> ./2023-08-18-site-reliability-engineering-part-1.gmi 2023-08-18 Site Reliability Engineering - Part 1: SRE and Organizational Culture
=> ./2023-11-19-site-reliability-engineering-part-2.gmi 2023-11-19 Site Reliability Engineering - Part 2: Operational Balance in SRE (You are currently reading this)
-=> ./2024-01-09-site-reliability-engineering-part-3.gmi 2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Aspect
+=> ./2024-01-09-site-reliability-engineering-part-3.gmi 2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Side
```
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣾⣷⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
@@ -42,7 +42,7 @@ That all sounds pretty idealistic. The reality is that getting the perfect balan
Continue with the third part of this series:
-=> ./2024-01-09-site-reliability-engineering-part-3.gmi 2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Aspect
+=> ./2024-01-09-site-reliability-engineering-part-3.gmi 2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Side
E-Mail your comments to `paul@nospam.buetow.org` :-)
diff --git a/gemfeed/2024-01-09-site-reliability-engineering-part-3.gmi b/gemfeed/2024-01-09-site-reliability-engineering-part-3.gmi
index cf297214..a04951b1 100644
--- a/gemfeed/2024-01-09-site-reliability-engineering-part-3.gmi
+++ b/gemfeed/2024-01-09-site-reliability-engineering-part-3.gmi
@@ -6,7 +6,7 @@ Welcome to Part 3 of my Site Reliability Engineering (SRE) series. I'm currently
=> ./2023-08-18-site-reliability-engineering-part-1.gmi 2023-08-18 Site Reliability Engineering - Part 1: SRE and Organizational Culture
=> ./2023-11-19-site-reliability-engineering-part-2.gmi 2023-11-19 Site Reliability Engineering - Part 2: Operational Balance in SRE
-=> ./2024-01-09-site-reliability-engineering-part-3.gmi 2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Aspect (You are currently reading this)
+=> ./2024-01-09-site-reliability-engineering-part-3.gmi 2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Side (You are currently reading this)
```
..--""""----..
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 656cd33e..ccfbd796 100644
--- a/gemfeed/2024-04-01-KISS-high-availability-with-OpenBSD.gmi
+++ b/gemfeed/2024-04-01-KISS-high-availability-with-OpenBSD.gmi
@@ -27,22 +27,19 @@ _____|_:_:_| (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/2024-05-03-projects-i-currently-dont-have-time-for.gmi b/gemfeed/2024-05-03-projects-i-currently-dont-have-time-for.gmi
index 6e12585c..480dd889 100644
--- a/gemfeed/2024-05-03-projects-i-currently-dont-have-time-for.gmi
+++ b/gemfeed/2024-05-03-projects-i-currently-dont-have-time-for.gmi
@@ -19,46 +19,43 @@ Art by Laura Brown
Over the years, I have collected many ideas for my personal projects and noted them down. I am currently in the process of cleaning up all my notes and reviewing those ideas. I don’t have time for the ones listed here and won’t have any soon due to other commitments and personal projects. So, in order to "get rid of them" from my notes folder, I decided to simply put them in this blog post so that those ideas don't get lost. Maybe I will pick up one or another idea someday in the future, but for now, they are all put on ice in favor of other personal projects or family time.
-```
-Table of contents
-=================
-
-Projects I currently don't have time for
- Introduction
- Hardware projects I don't have time for
- I use Arch, btw!
- OpenBSD home router
- Pi-Hole server
- Infodash
- Reading station
- Retro station
- Sound server
- Project Freekat
- Programming projects I don't have time for
- CLI-HIVE
- Enhanced KISS home photo albums
- KISS file sync server with end-to-end encryption
- A language that compiles to `bash`
- A language that compiles to `sed`
- Renovate VS-Sim
- KISS ticketing system
- A domain-specific language (DSL) for work
- Self-hosting projects I don't have time for
- My own Matrix server
- Ampache music server
- Librum eBook reader
- Memos - Note-taking service
- Bepasty server
- Books I don't have time to read
- Fluent Python
- Programming Ruby
- Peter F. Hamilton science fiction books
- New websites I don't have time for
- Create a "Why Raku Rox" site
- Research projects I don't have time for
- Project secure
- CPU utilisation is all wrong
-```
+## Table of Contents
+
+* ⇢ Projects I currently don't have time for
+* ⇢ ⇢ Introduction
+* ⇢ ⇢ Hardware projects I don't have time for
+* ⇢ ⇢ ⇢ I use Arch, btw!
+* ⇢ ⇢ ⇢ OpenBSD home router
+* ⇢ ⇢ ⇢ Pi-Hole server
+* ⇢ ⇢ ⇢ Infodash
+* ⇢ ⇢ ⇢ Reading station
+* ⇢ ⇢ ⇢ Retro station
+* ⇢ ⇢ ⇢ Sound server
+* ⇢ ⇢ ⇢ Project Freekat
+* ⇢ ⇢ Programming projects I don't have time for
+* ⇢ ⇢ ⇢ CLI-HIVE
+* ⇢ ⇢ ⇢ Enhanced KISS home photo albums
+* ⇢ ⇢ ⇢ KISS file sync server with end-to-end encryption
+* ⇢ ⇢ ⇢ A language that compiles to `bash`
+* ⇢ ⇢ ⇢ A language that compiles to `sed`
+* ⇢ ⇢ ⇢ Renovate VS-Sim
+* ⇢ ⇢ ⇢ KISS ticketing system
+* ⇢ ⇢ ⇢ A domain-specific language (DSL) for work
+* ⇢ ⇢ Self-hosting projects I don't have time for
+* ⇢ ⇢ ⇢ My own Matrix server
+* ⇢ ⇢ ⇢ Ampache music server
+* ⇢ ⇢ ⇢ Librum eBook reader
+* ⇢ ⇢ ⇢ Memos - Note-taking service
+* ⇢ ⇢ ⇢ Bepasty server
+* ⇢ ⇢ Books I don't have time to read
+* ⇢ ⇢ ⇢ Fluent Python
+* ⇢ ⇢ ⇢ Programming Ruby
+* ⇢ ⇢ ⇢ Peter F. Hamilton science fiction books
+* ⇢ ⇢ New websites I don't have time for
+* ⇢ ⇢ ⇢ Create a "Why Raku Rox" site
+* ⇢ ⇢ Research projects I don't have time for
+* ⇢ ⇢ ⇢ Project secure
+* ⇢ ⇢ ⇢ CPU utilisation is all wrong
## Hardware projects I don't have time for
diff --git a/gemfeed/2024-06-23-terminal-multiplexing-with-tmux.gmi b/gemfeed/2024-06-23-terminal-multiplexing-with-tmux.gmi
index 42f01cb5..ff6b266d 100644
--- a/gemfeed/2024-06-23-terminal-multiplexing-with-tmux.gmi
+++ b/gemfeed/2024-06-23-terminal-multiplexing-with-tmux.gmi
@@ -14,28 +14,25 @@ jgs `-=========-`()
mod. by Paul B.
```
-```
-Table of contents
-=================
-
-Terminal multiplexing with `tmux`
- Introduction
- Shell aliases
- The `tn` alias - Creating a new session
- Cleaning up default sessions automatically
- Renaming sessions
- The `ta` alias - Attaching to a session
- The `tr` alias - For a nested remote session
- Change of the Tmux prefix for better nesting
- The `ts` alias - Searching sessions with fuzzy finder
- The `tssh` alias - Cluster SSH replacement
- The `tmux::tssh_from_argument` helper
- The `tmux::tssh_from_file` helper
- `tssh` examples
- Common Tmux commands I use in `tssh`
- Copy and paste workflow
- Tmux configurations
-```
+## Table of Contents
+
+* ⇢ Terminal multiplexing with `tmux`
+* ⇢ ⇢ Introduction
+* ⇢ ⇢ Shell aliases
+* ⇢ ⇢ The `tn` alias - Creating a new session
+* ⇢ ⇢ ⇢ Cleaning up default sessions automatically
+* ⇢ ⇢ ⇢ Renaming sessions
+* ⇢ ⇢ The `ta` alias - Attaching to a session
+* ⇢ ⇢ The `tr` alias - For a nested remote session
+* ⇢ ⇢ ⇢ Change of the Tmux prefix for better nesting
+* ⇢ ⇢ The `ts` alias - Searching sessions with fuzzy finder
+* ⇢ ⇢ The `tssh` alias - Cluster SSH replacement
+* ⇢ ⇢ ⇢ The `tmux::tssh_from_argument` helper
+* ⇢ ⇢ ⇢ The `tmux::tssh_from_file` helper
+* ⇢ ⇢ ⇢ `tssh` examples
+* ⇢ ⇢ ⇢ Common Tmux commands I use in `tssh`
+* ⇢ ⇢ Copy and paste workflow
+* ⇢ ⇢ Tmux configurations
## Introduction
diff --git a/gemfeed/atom.xml b/gemfeed/atom.xml
index e3c37f82..abcc982a 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-08-18T22:23:22+03:00</updated>
+ <updated>2024-08-24T19:37:43+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" />
@@ -234,7 +234,7 @@
<summary>These are my personal takeaways after reading 'The Stoic Challenge: A Philosopher's Guide to Becoming Tougher, Calmer, and More Resilient' by William B. Irvine. </summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline' id='TheStoicChallengebooknotes'>"The Stoic Challenge" book notes</h1><br />
+ <h1 style='display: inline' id='the-stoic-challenge-book-notes'>"The Stoic Challenge" book notes</h1><br />
<br />
<span class='quote'>Published at 2024-07-07T12:46:55+03:00</span><br />
<br />
@@ -262,7 +262,7 @@
<br />
<span>Stoics are thankful that they are mortal. As then you can get reminded of how great it is to be alive at all. In dying we are more alive we have ever been as every thing you do could be the last time you do it. Rather than fighting your death you should embrace it if there are no workarounds. Embrace a good death.</span><br />
<br />
-<h2 style='display: inline' id='Negativevisualization'>Negative visualization</h2><br />
+<h2 style='display: inline' id='negative-visualization'>Negative visualization</h2><br />
<br />
<span>It is easy what we have to take for granted.</span><br />
<br />
@@ -272,7 +272,7 @@
<li>Now close your eyes for a minute and imagine you would be blind, so that you will never be able to experience the world again and let it sink in. When you open your eyes again you will feel a lot of gratefulness.</li>
<li>Last time meditation. Lets you appreciate the life as it is now. Life gets vitalised again.</li>
</ul><br />
-<h2 style='display: inline' id='Ohnicetrickyoustoicgod'>Oh, nice trick, you stoic "god"! ;-)</h2><br />
+<h2 style='display: inline' id='oh-nice-trick-you-stoic-god--'>Oh, nice trick, you stoic "god"! ;-)</h2><br />
<br />
<span>Take setbacks as a challenge. Also take it with some humor.</span><br />
<br />
@@ -671,10 +671,10 @@ r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()&lt;&gt;@,;:\\".\
<name>Paul Buetow aka snonux</name>
<email>paul@dev.buetow.org</email>
</author>
- <summary>Table of contents</summary>
+ <summary>Tmux (Terminal Multiplexer) is a powerful, terminal-based tool that manages multiple terminal sessions within a single window. Here are some of its primary features and functionalities:</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline' id='Terminalmultiplexingwithtmux'>Terminal multiplexing with <span class='inlinecode'>tmux</span></h1><br />
+ <h1 style='display: inline' id='terminal-multiplexing-with-tmux'>Terminal multiplexing with <span class='inlinecode'>tmux</span></h1><br />
<br />
<span class='quote'>Published at 2024-06-23T22:41:59+03:00</span><br />
<br />
@@ -690,30 +690,28 @@ jgs `-=========-`()
mod. by Paul B.
</pre>
<br />
-<pre>
-Table of contents
-=================
-
-Terminal multiplexing with `tmux`
- Introduction
- Shell aliases
- The `tn` alias - Creating a new session
- Cleaning up default sessions automatically
- Renaming sessions
- The `ta` alias - Attaching to a session
- The `tr` alias - For a nested remote session
- Change of the Tmux prefix for better nesting
- The `ts` alias - Searching sessions with fuzzy finder
- The `tssh` alias - Cluster SSH replacement
- The `tmux::tssh_from_argument` helper
- The `tmux::tssh_from_file` helper
- `tssh` examples
- Common Tmux commands I use in `tssh`
- Copy and paste workflow
- Tmux configurations
-</pre>
+<h2 style='display: inline' id='table-of-contents'>Table of Contents</h2><br />
<br />
-<h2 style='display: inline' id='Introduction'>Introduction</h2><br />
+<ul>
+<li><a href='#terminal-multiplexing-with-tmux'>Terminal multiplexing with <span class='inlinecode'>tmux</span></a></li>
+<li>⇢ <a href='#introduction'>Introduction</a></li>
+<li>⇢ <a href='#shell-aliases'>Shell aliases</a></li>
+<li>⇢ <a href='#the-tn-alias---creating-a-new-session'>The <span class='inlinecode'>tn</span> alias - Creating a new session</a></li>
+<li>⇢ ⇢ <a href='#cleaning-up-default-sessions-automatically'>Cleaning up default sessions automatically</a></li>
+<li>⇢ ⇢ <a href='#renaming-sessions'>Renaming sessions</a></li>
+<li>⇢ <a href='#the-ta-alias---attaching-to-a-session'>The <span class='inlinecode'>ta</span> alias - Attaching to a session</a></li>
+<li>⇢ <a href='#the-tr-alias---for-a-nested-remote-session'>The <span class='inlinecode'>tr</span> alias - For a nested remote session</a></li>
+<li>⇢ ⇢ <a href='#change-of-the-tmux-prefix-for-better-nesting'>Change of the Tmux prefix for better nesting</a></li>
+<li>⇢ <a href='#the-ts-alias---searching-sessions-with-fuzzy-finder'>The <span class='inlinecode'>ts</span> alias - Searching sessions with fuzzy finder</a></li>
+<li>⇢ <a href='#the-tssh-alias---cluster-ssh-replacement'>The <span class='inlinecode'>tssh</span> alias - Cluster SSH replacement</a></li>
+<li>⇢ ⇢ <a href='#the-tmuxtsshfromargument-helper'>The <span class='inlinecode'>tmux::tssh_from_argument</span> helper</a></li>
+<li>⇢ ⇢ <a href='#the-tmuxtsshfromfile-helper'>The <span class='inlinecode'>tmux::tssh_from_file</span> helper</a></li>
+<li>⇢ ⇢ <a href='#tssh-examples'><span class='inlinecode'>tssh</span> examples</a></li>
+<li>⇢ ⇢ <a href='#common-tmux-commands-i-use-in-tssh'>Common Tmux commands I use in <span class='inlinecode'>tssh</span></a></li>
+<li>⇢ <a href='#copy-and-paste-workflow'>Copy and paste workflow</a></li>
+<li>⇢ <a href='#tmux-configurations'>Tmux configurations</a></li>
+</ul><br />
+<h2 style='display: inline' id='introduction'>Introduction</h2><br />
<br />
<span>Tmux (Terminal Multiplexer) is a powerful, terminal-based tool that manages multiple terminal sessions within a single window. Here are some of its primary features and functionalities:</span><br />
<br />
@@ -739,7 +737,7 @@ Terminal multiplexing with `tmux`
<br />
<span>Tmux is highly configurable, and I think I am only scratching the surface of what is possible with it. Nevertheless, it may still be useful for you. I also love that Tmux is part of the OpenBSD base system!</span><br />
<br />
-<h2 style='display: inline' id='Shellaliases'>Shell aliases</h2><br />
+<h2 style='display: inline' id='shell-aliases'>Shell aliases</h2><br />
<br />
<span>I am a user of the Z-Shell (<span class='inlinecode'>zsh</span>), but I believe all the snippets mentioned in this blog post also work with Bash. </span><br />
<br />
@@ -764,7 +762,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>The first two are pretty straightforward. <span class='inlinecode'>tm</span> is simply a shorthand for <span class='inlinecode'>tmux</span>, so I have to type less, and <span class='inlinecode'>tl</span> lists all Tmux sessions that are currently open. No magic here.</span><br />
<br />
-<h2 style='display: inline' id='ThetnaliasCreatinganewsession'>The <span class='inlinecode'>tn</span> alias - Creating a new session</h2><br />
+<h2 style='display: inline' id='the-tn-alias---creating-a-new-session'>The <span class='inlinecode'>tn</span> alias - Creating a new session</h2><br />
<br />
<span>The <span class='inlinecode'>tn</span> alias is referencing this function:</span><br />
<br />
@@ -795,7 +793,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>First, a Tmux session name can be passed to the function as a first argument. That session name is only optional. Without it, Tmux will select a session named <span class='inlinecode'>T$($date +%s)</span> as a default. Which is T followed by the UNIX epoch, e.g. <span class='inlinecode'>T1717133796</span>.</span><br />
<br />
-<h3 style='display: inline' id='Cleaningupdefaultsessionsautomatically'>Cleaning up default sessions automatically</h3><br />
+<h3 style='display: inline' id='cleaning-up-default-sessions-automatically'>Cleaning up default sessions automatically</h3><br />
<br />
<span>Note also the call to <span class='inlinecode'>tmux::cleanup_default</span>; it would clean up all already opened default sessions if they aren&#39;t attached. Those sessions were only temporary, and I had too many flying around after a while. So, I decided to auto-delete the sessions if they weren&#39;t attached. If I want to keep sessions around, I will rename them with the Tmux command <span class='inlinecode'>prefix-key $</span>. This is the cleanup function:</span><br />
<br />
@@ -815,11 +813,11 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>The cleanup function kills all open Tmux sessions that haven&#39;t been renamed properly yet—but only if they aren&#39;t attached (e.g., don&#39;t run in the foreground in any terminal). Cleaning them up automatically keeps my Tmux sessions as neat and tidy as possible. </span><br />
<br />
-<h3 style='display: inline' id='Renamingsessions'>Renaming sessions</h3><br />
+<h3 style='display: inline' id='renaming-sessions'>Renaming sessions</h3><br />
<br />
<span>Whenever I am in a temporary session (named <span class='inlinecode'>T....</span>), I may decide that I want to keep this session around. I have to rename the session to prevent the cleanup function from doing its thing. That&#39;s, as mentioned already, easily accomplished with the standard <span class='inlinecode'>prefix-key $</span> Tmux command.</span><br />
<br />
-<h2 style='display: inline' id='ThetaaliasAttachingtoasession'>The <span class='inlinecode'>ta</span> alias - Attaching to a session</h2><br />
+<h2 style='display: inline' id='the-ta-alias---attaching-to-a-session'>The <span class='inlinecode'>ta</span> alias - Attaching to a session</h2><br />
<br />
<span>This alias refers to the following function, which tries to attach to an already-running Tmux session.</span><br />
<br />
@@ -841,7 +839,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>If no session is specified (as the argument of the function), it will try to attach to the first open session. If no Tmux server is running, it will create a new one with <span class='inlinecode'>tmux::new</span>. Otherwise, with a session name given as the argument, it will attach to it. If unsuccessful (e.g., the session doesn&#39;t exist), it will be created and attached to.</span><br />
<br />
-<h2 style='display: inline' id='ThetraliasForanestedremotesession'>The <span class='inlinecode'>tr</span> alias - For a nested remote session</h2><br />
+<h2 style='display: inline' id='the-tr-alias---for-a-nested-remote-session'>The <span class='inlinecode'>tr</span> alias - For a nested remote session</h2><br />
<br />
<span>This SSHs into the remote server specified and then, remotely on the server itself, starts a nested Tmux session. So we have one Tmux session on the local computer and, inside of it, an SSH connection to a remote server with a Tmux session running again. The benefit of this is that, in case my network connection breaks down, the next time I connect, I can continue my work on the remote server exactly where I left off. The session name is the name of the server being SSHed into. If a session like this already exists, it simply attaches to it.</span><br />
<br />
@@ -857,7 +855,7 @@ http://www.gnu.org/software/src-highlite -->
<b><font color="#ffffff">alias</font></b><font color="#ff0000"> </font><font color="#ff0000">tr</font><font color="#F3E651">=</font><font color="#ff0000">tmux</font><font color="#F3E651">::</font><font color="#ff0000">remote</font>
</pre>
<br />
-<h3 style='display: inline' id='ChangeoftheTmuxprefixforbetternesting'>Change of the Tmux prefix for better nesting</h3><br />
+<h3 style='display: inline' id='change-of-the-tmux-prefix-for-better-nesting'>Change of the Tmux prefix for better nesting</h3><br />
<br />
<span>To make nested Tmux sessions work smoothly, one must change the Tmux prefix key locally or remotely. By default, the Tmux prefix key is <span class='inlinecode'>Ctrl-b</span>, so <span class='inlinecode'>Ctrl-b $</span>, for example, renames the current session. To change the prefix key from the standard <span class='inlinecode'>Ctrl-b</span> to, for example, <span class='inlinecode'>Ctrl-g</span>, you must add this to the <span class='inlinecode'>tmux.conf</span>:</span><br />
<br />
@@ -869,7 +867,7 @@ set-option -g prefix C-g
<br />
<span>There might also be another way around this (without reconfiguring the prefix key), but that is cumbersome to use, as far as I remember. </span><br />
<br />
-<h2 style='display: inline' id='ThetsaliasSearchingsessionswithfuzzyfinder'>The <span class='inlinecode'>ts</span> alias - Searching sessions with fuzzy finder</h2><br />
+<h2 style='display: inline' id='the-ts-alias---searching-sessions-with-fuzzy-finder'>The <span class='inlinecode'>ts</span> alias - Searching sessions with fuzzy finder</h2><br />
<br />
<span>Despite the fact that with <span class='inlinecode'>tmux::cleanup_default</span>, I don&#39;t leave a huge mess with trillions of Tmux sessions flying around all the time, at times, it can become challenging to find exactly the session I am currently interested in. After a busy workday, I often end up with around twenty sessions on my laptop. This is where fuzzy searching for session names comes in handy, as I often don&#39;t remember the exact session names.</span><br />
<br />
@@ -894,7 +892,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<a href='./terminal-multiplexing-with-tmux/tmux-session-fzf.png'><img alt='Tmux session fuzzy finder' title='Tmux session fuzzy finder' src='./terminal-multiplexing-with-tmux/tmux-session-fzf.png' /></a><br />
<br />
-<h2 style='display: inline' id='ThetsshaliasClusterSSHreplacement'>The <span class='inlinecode'>tssh</span> alias - Cluster SSH replacement</h2><br />
+<h2 style='display: inline' id='the-tssh-alias---cluster-ssh-replacement'>The <span class='inlinecode'>tssh</span> alias - Cluster SSH replacement</h2><br />
<br />
<span>Before I used Tmux, I was a heavy user of ClusterSSH, which allowed me to log in to multiple servers at once in a single terminal window and type and run commands on all of them in parallel.</span><br />
<br />
@@ -925,7 +923,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>This function is just a wrapper around the more complex <span class='inlinecode'>tmux::tssh_from_file</span> and <span class='inlinecode'>tmux::tssh_from_argument</span> functions, as you have learned already. Most of the magic happens there.</span><br />
<br />
-<h3 style='display: inline' id='Thetmuxtsshfromargumenthelper'>The <span class='inlinecode'>tmux::tssh_from_argument</span> helper</h3><br />
+<h3 style='display: inline' id='the-tmuxtsshfromargument-helper'>The <span class='inlinecode'>tmux::tssh_from_argument</span> helper</h3><br />
<br />
<span>This is the most magic helper function we will cover in this post. It looks like this:</span><br />
<br />
@@ -961,7 +959,7 @@ bind-key p setw synchronize-panes off
bind-key P setw synchronize-panes on
</pre>
<br />
-<h3 style='display: inline' id='Thetmuxtsshfromfilehelper'>The <span class='inlinecode'>tmux::tssh_from_file</span> helper</h3><br />
+<h3 style='display: inline' id='the-tmuxtsshfromfile-helper'>The <span class='inlinecode'>tmux::tssh_from_file</span> helper</h3><br />
<br />
<span>This one sets the session name to the file name and then reads a list of servers from that file, passing the list of servers to <span class='inlinecode'>tmux::tssh_from_argument</span> as the arguments. So, this is a neat little wrapper that also enables me to open clustered SSH sessions from an input file.</span><br />
<br />
@@ -977,7 +975,7 @@ http://www.gnu.org/software/src-highlite -->
<font color="#ff0000">}</font>
</pre>
<br />
-<h3 style='display: inline' id='tsshexamples'><span class='inlinecode'>tssh</span> examples</h3><br />
+<h3 style='display: inline' id='tssh-examples'><span class='inlinecode'>tssh</span> examples</h3><br />
<br />
<span>To open a new session named <span class='inlinecode'>fish</span> and log in to 4 remote hosts, run this command (Note that it is also possible to specify the remote user):</span><br />
<br />
@@ -992,7 +990,7 @@ $ tssh fish blowfish.buetow.org fishfinger.buetow.org \
$ tssh manyservers.txt
</pre>
<br />
-<h3 style='display: inline' id='CommonTmuxcommandsIuseintssh'>Common Tmux commands I use in <span class='inlinecode'>tssh</span></h3><br />
+<h3 style='display: inline' id='common-tmux-commands-i-use-in-tssh'>Common Tmux commands I use in <span class='inlinecode'>tssh</span></h3><br />
<br />
<span>These are default Tmux commands that I make heavy use of in a <span class='inlinecode'>tssh</span> session:</span><br />
<br />
@@ -1001,7 +999,7 @@ $ tssh manyservers.txt
<li>Press <span class='inlinecode'>prefix-key &lt;space&gt;</span> to change the pane layout (can be pressed multiple times to cycle through them).</li>
<li>Press <span class='inlinecode'>prefix-key z</span> to zoom in and out of the current active pane.</li>
</ul><br />
-<h2 style='display: inline' id='Copyandpasteworkflow'>Copy and paste workflow</h2><br />
+<h2 style='display: inline' id='copy-and-paste-workflow'>Copy and paste workflow</h2><br />
<br />
<span>As you will see later in this blog post, I have configured a history limit of 1 million items in Tmux so that I can scroll back quite far. One main workflow of mine is to search for text in the Tmux history, select and copy it, and then switch to another window or session and paste it there (e.g., into my text editor to do something with it).</span><br />
<br />
@@ -1020,7 +1018,7 @@ bind-key -T copy-mode-vi &#39;y&#39; send -X copy-selection-and-cancel
<br />
<span>Once the text is yanked, I switch to another Tmux window or session where, for example, a text editor is running and paste the yanked text from Tmux into the editor with <span class='inlinecode'>prefix-key ]</span>. Note that when pasting into a modal text editor like Vi or Helix, you would first need to enter insert mode before <span class='inlinecode'>prefix-key ]</span> would paste anything.</span><br />
<br />
-<h2 style='display: inline' id='Tmuxconfigurations'>Tmux configurations</h2><br />
+<h2 style='display: inline' id='tmux-configurations'>Tmux configurations</h2><br />
<br />
<span>Some features I have configured directly in Tmux don&#39;t require an external shell alias to function correctly. Let&#39;s walk line by line through my local <span class='inlinecode'>~/.config/tmux/tmux.conf</span>:</span><br />
<br />
@@ -1113,7 +1111,7 @@ bind-key r source-file ~/.config/tmux/tmux.conf \; display-message "tmux.conf re
<summary>Art by Laura Brown</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline' id='ProjectsIcurrentlydonthavetimefor'>Projects I currently don&#39;t have time for</h1><br />
+ <h1 style='display: inline' id='projects-i-currently-dont-have-time-for'>Projects I currently don&#39;t have time for</h1><br />
<br />
<span class='quote'>Published at 2024-05-03T16:23:03+03:00</span><br />
<br />
@@ -1130,58 +1128,56 @@ Art by Laura Brown
</pre>
<br />
-<h2 style='display: inline' id='Introduction'>Introduction</h2><br />
+<h2 style='display: inline' id='introduction'>Introduction</h2><br />
<br />
<span>Over the years, I have collected many ideas for my personal projects and noted them down. I am currently in the process of cleaning up all my notes and reviewing those ideas. I don’t have time for the ones listed here and won’t have any soon due to other commitments and personal projects. So, in order to "get rid of them" from my notes folder, I decided to simply put them in this blog post so that those ideas don&#39;t get lost. Maybe I will pick up one or another idea someday in the future, but for now, they are all put on ice in favor of other personal projects or family time.</span><br />
<br />
-<pre>
-Table of contents
-=================
-
-Projects I currently don&#39;t have time for
- Introduction
- Hardware projects I don&#39;t have time for
- I use Arch, btw!
- OpenBSD home router
- Pi-Hole server
- Infodash
- Reading station
- Retro station
- Sound server
- Project Freekat
- Programming projects I don&#39;t have time for
- CLI-HIVE
- Enhanced KISS home photo albums
- KISS file sync server with end-to-end encryption
- A language that compiles to `bash`
- A language that compiles to `sed`
- Renovate VS-Sim
- KISS ticketing system
- A domain-specific language (DSL) for work
- Self-hosting projects I don&#39;t have time for
- My own Matrix server
- Ampache music server
- Librum eBook reader
- Memos - Note-taking service
- Bepasty server
- Books I don&#39;t have time to read
- Fluent Python
- Programming Ruby
- Peter F. Hamilton science fiction books
- New websites I don&#39;t have time for
- Create a "Why Raku Rox" site
- Research projects I don&#39;t have time for
- Project secure
- CPU utilisation is all wrong
-</pre>
-<br />
-<h2 style='display: inline' id='HardwareprojectsIdonthavetimefor'>Hardware projects I don&#39;t have time for</h2><br />
-<br />
-<h3 style='display: inline' id='IuseArchbtw'>I use Arch, btw!</h3><br />
+<h2 style='display: inline' id='table-of-contents'>Table of Contents</h2><br />
+<br />
+<ul>
+<li><a href='#projects-i-currently-dont-have-time-for'>Projects I currently don&#39;t have time for</a></li>
+<li>⇢ <a href='#introduction'>Introduction</a></li>
+<li>⇢ <a href='#hardware-projects-i-dont-have-time-for'>Hardware projects I don&#39;t have time for</a></li>
+<li>⇢ ⇢ <a href='#i-use-arch-btw'>I use Arch, btw!</a></li>
+<li>⇢ ⇢ <a href='#openbsd-home-router'>OpenBSD home router</a></li>
+<li>⇢ ⇢ <a href='#pi-hole-server'>Pi-Hole server</a></li>
+<li>⇢ ⇢ <a href='#infodash'>Infodash</a></li>
+<li>⇢ ⇢ <a href='#reading-station'>Reading station</a></li>
+<li>⇢ ⇢ <a href='#retro-station'>Retro station</a></li>
+<li>⇢ ⇢ <a href='#sound-server'>Sound server</a></li>
+<li>⇢ ⇢ <a href='#project-freekat'>Project Freekat</a></li>
+<li>⇢ <a href='#programming-projects-i-dont-have-time-for'>Programming projects I don&#39;t have time for</a></li>
+<li>⇢ ⇢ <a href='#cli-hive'>CLI-HIVE</a></li>
+<li>⇢ ⇢ <a href='#enhanced-kiss-home-photo-albums'>Enhanced KISS home photo albums</a></li>
+<li>⇢ ⇢ <a href='#kiss-file-sync-server-with-end-to-end-encryption'>KISS file sync server with end-to-end encryption</a></li>
+<li>⇢ ⇢ <a href='#a-language-that-compiles-to-bash'>A language that compiles to <span class='inlinecode'>bash</span></a></li>
+<li>⇢ ⇢ <a href='#a-language-that-compiles-to-sed'>A language that compiles to <span class='inlinecode'>sed</span></a></li>
+<li>⇢ ⇢ <a href='#renovate-vs-sim'>Renovate VS-Sim</a></li>
+<li>⇢ ⇢ <a href='#kiss-ticketing-system'>KISS ticketing system</a></li>
+<li>⇢ ⇢ <a href='#a-domain-specific-language-dsl-for-work'>A domain-specific language (DSL) for work</a></li>
+<li>⇢ <a href='#self-hosting-projects-i-dont-have-time-for'>Self-hosting projects I don&#39;t have time for</a></li>
+<li>⇢ ⇢ <a href='#my-own-matrix-server'>My own Matrix server</a></li>
+<li>⇢ ⇢ <a href='#ampache-music-server'>Ampache music server</a></li>
+<li>⇢ ⇢ <a href='#librum-ebook-reader'>Librum eBook reader</a></li>
+<li>⇢ ⇢ <a href='#memos---note-taking-service'>Memos - Note-taking service</a></li>
+<li>⇢ ⇢ <a href='#bepasty-server'>Bepasty server</a></li>
+<li>⇢ <a href='#books-i-dont-have-time-to-read'>Books I don&#39;t have time to read</a></li>
+<li>⇢ ⇢ <a href='#fluent-python'>Fluent Python</a></li>
+<li>⇢ ⇢ <a href='#programming-ruby'>Programming Ruby</a></li>
+<li>⇢ ⇢ <a href='#peter-f-hamilton-science-fiction-books'>Peter F. Hamilton science fiction books</a></li>
+<li>⇢ <a href='#new-websites-i-dont-have-time-for'>New websites I don&#39;t have time for</a></li>
+<li>⇢ ⇢ <a href='#create-a-why-raku-rox-site'>Create a "Why Raku Rox" site</a></li>
+<li>⇢ <a href='#research-projects-i-dont-have-time-for'>Research projects I don&#39;t have time for</a></li>
+<li>⇢ ⇢ <a href='#project-secure'>Project secure</a></li>
+<li>⇢ ⇢ <a href='#cpu-utilisation-is-all-wrong'>CPU utilisation is all wrong</a></li>
+</ul><br />
+<h2 style='display: inline' id='hardware-projects-i-dont-have-time-for'>Hardware projects I don&#39;t have time for</h2><br />
+<br />
+<h3 style='display: inline' id='i-use-arch-btw'>I use Arch, btw!</h3><br />
<br />
<span>The idea was to build the ultimate Arch Linux setup on an old ThinkPad X200 booting with the open-source LibreBoot firmware, complete with a tiling window manager, dmenu, and all the elite tools. This is mainly for fun, as I am pretty happy (and productive) with my Fedora Linux setup. I ran EndeavourOS (close enough to Arch) on an old ThinkPad for a while, but then I switched back to Fedora because the rolling releases were annoying (there were too many updates).</span><br />
<br />
-<h3 style='display: inline' id='OpenBSDhomerouter'>OpenBSD home router</h3><br />
+<h3 style='display: inline' id='openbsd-home-router'>OpenBSD home router</h3><br />
<br />
<span>In my student days, I operated a 486DX PC with OpenBSD as my home DSL internet router. I bought the setup from my brother back then. The router&#39;s hostname was <span class='inlinecode'>fishbone</span>, and it performed very well until it became too slow for larger broadband bandwidth after a few years of use.</span><br />
<br />
@@ -1196,23 +1192,23 @@ Projects I currently don&#39;t have time for
<br />
<a class='textlink' href='https://OpenWRT.org/'>https://OpenWRT.org/</a><br />
<br />
-<h3 style='display: inline' id='PiHoleserver'>Pi-Hole server</h3><br />
+<h3 style='display: inline' id='pi-hole-server'>Pi-Hole server</h3><br />
<br />
<span>Install Pi-hole on one of my Pis or run it in a container on Freekat. For now, I am putting this on hold as the primary use for this would be ad-blocking, and I am avoiding surfing ad-heavy sites anyway. So there&#39;s no significant use for me personally at the moment.</span><br />
<br />
<a class='textlink' href='https://pi-hole.net/'>https://pi-hole.net/</a><br />
<br />
-<h3 style='display: inline' id='Infodash'>Infodash</h3><br />
+<h3 style='display: inline' id='infodash'>Infodash</h3><br />
<br />
<span>The idea was to implement my smart info screen using purely open-source software. It would display information such as the health status of my personal infrastructure, my current work tracker balance (I track how much I work to prevent overworking), and my sports balance (I track my workouts to stay within my quotas for general health). The information would be displayed on a small screen in my home office, on my Pine watch, or remotely from any terminal window.</span><br />
<br />
<span>I don&#39;t have this, and I haven&#39;t missed having it, so I guess it would have been nice to have it but not provide any value other than the "fun of tinkering."</span><br />
<br />
-<h3 style='display: inline' id='Readingstation'>Reading station</h3><br />
+<h3 style='display: inline' id='reading-station'>Reading station</h3><br />
<br />
<span>I wanted to create the most comfortable setup possible for reading digital notes, articles, and books. This would include a comfy armchair, a silent barebone PC or Raspberry Pi computer running either Linux or *BSD, and an e-Ink display mounted on a flexible arm/stand. There would also be a small table for my paper journal for occasional note-taking. There are a bunch of open-source software available for PDF and ePub reading. It would have been neat, but I am currently using the most straightforward solution: a Kobo Elipsa 2E, which I can use on my sofa.</span><br />
<br />
-<h3 style='display: inline' id='Retrostation'>Retro station</h3><br />
+<h3 style='display: inline' id='retro-station'>Retro station</h3><br />
<br />
<span>I had an idea to build a computer infused with retro elements. It wouldn&#39;t use actual retro hardware but would look and feel like a retro machine. I would call this machine HAL or Retron.</span><br />
<br />
@@ -1224,14 +1220,14 @@ Projects I currently don&#39;t have time for
<br />
<span>The computer would occasionally be used to surf the Gemini space, take notes, blog, or do light coding. However, I have abandoned the project for now because there isn&#39;t enough space in my apartment, as my daughter will have a room for herself.</span><br />
<br />
-<h3 style='display: inline' id='Soundserver'>Sound server</h3><br />
+<h3 style='display: inline' id='sound-server'>Sound server</h3><br />
<br />
<span>My idea involved using a barebone mini PC running FreeBSD with the Navidrome sound server software. I could remotely connect to it from my phone, workstation/laptop to listen to my music collection. The storage would be based on ZFS with at least two drives for redundancy. The app would run in a Linux Docker container under FreeBSD via Bhyve.</span><br />
<br />
<a class='textlink' href='https://github.com/navidrome/navidrome'>https://github.com/navidrome/navidrome</a><br />
<a class='textlink' href='https://wiki.freebsd.org/bhyve'>https://wiki.freebsd.org/bhyve</a><br />
<br />
-<h3 style='display: inline' id='ProjectFreekat'>Project Freekat</h3><br />
+<h3 style='display: inline' id='project-freekat'>Project Freekat</h3><br />
<br />
<span>My idea involved purchasing the Meerkat mini PC from System76 and installing FreeBSD. Like the sound-server idea (see previous idea), it would run Linux Docker through Bhyve. I would self-host a bunch of applications on it:</span><br />
<br />
@@ -1255,15 +1251,15 @@ Projects I currently don&#39;t have time for
<br />
<a class='textlink' href='./2024-02-04-from-babylon5.buetow.org-to-.cloud.html'>My personal AWS setup</a><br />
<br />
-<h2 style='display: inline' id='ProgrammingprojectsIdonthavetimefor'>Programming projects I don&#39;t have time for</h2><br />
+<h2 style='display: inline' id='programming-projects-i-dont-have-time-for'>Programming projects I don&#39;t have time for</h2><br />
<br />
-<h3 style='display: inline' id='CLIHIVE'>CLI-HIVE</h3><br />
+<h3 style='display: inline' id='cli-hive'>CLI-HIVE</h3><br />
<br />
<span>This was a pet project idea that my brother and I had. The concept was to collect all shell history of all servers at work in a central place, apply ML/AI, and return suggestions for commands to type or allow a fuzzy search on all the commands in the history. The recommendations for the commands on a server could be context-based (e.g., past occurrences on the same server type). </span><br />
<br />
<span>You could decide whether to share your command history with others so they would receive better suggestions depending on which server they are on, or you could keep all the history private and secure. The plan was to add hooks into zsh and bash shells so that all commands typed would be pushed to the central location for data mining.</span><br />
<br />
-<h3 style='display: inline' id='EnhancedKISShomephotoalbums'>Enhanced KISS home photo albums</h3><br />
+<h3 style='display: inline' id='enhanced-kiss-home-photo-albums'>Enhanced KISS home photo albums</h3><br />
<br />
<span>I don&#39;t use third-party cloud providers such as Google Photos to store/archive my photos. Instead, they are all on a ZFS volume on my home NAS, with regular offsite backups taken. Thus, my project would involve implementing the features I miss most or finding a solution simple enough to host on my LAN:</span><br />
<br />
@@ -1275,7 +1271,7 @@ Projects I currently don&#39;t have time for
</ul><br />
<a class='textlink' href='./2023-10-29-kiss-static-web-photo-albums-with-photoalbum.sh.html'>KISS static web photo albums with <span class='inlinecode'>photoalbum.sh</span></a><br />
<br />
-<h3 style='display: inline' id='KISSfilesyncserverwithendtoendencryption'>KISS file sync server with end-to-end encryption</h3><br />
+<h3 style='display: inline' id='kiss-file-sync-server-with-end-to-end-encryption'>KISS file sync server with end-to-end encryption</h3><br />
<br />
<span>I aimed to have a simple server to which I could sync notes and other documents, ensuring that the data is fully end-to-end encrypted. This way, only the clients could decrypt the data, while an encrypted copy of all the data would be stored on the server side. There are a few solutions (e.g., NextCloud), but they are bloated or complex to set up. </span><br />
<br />
@@ -1285,7 +1281,7 @@ Projects I currently don&#39;t have time for
<br />
<span>I also had the idea of using this as a pet project for work and naming it <span class='inlinecode'>Cryptolake</span>, utilizing post-quantum-safe encryption algorithms and a distributed data store.</span><br />
<br />
-<h3 style='display: inline' id='Alanguagethatcompilestobash'>A language that compiles to <span class='inlinecode'>bash</span></h3><br />
+<h3 style='display: inline' id='a-language-that-compiles-to-bash'>A language that compiles to <span class='inlinecode'>bash</span></h3><br />
<br />
<span>I had an idea to implement a higher-level language with strong typing that could be compiled into native Bash code. This would make all resulting Bash scripts more robust and secure by default. The project would involve developing a parser, lexer, and a Bash code generator. I planned to implement this in Go.</span><br />
<br />
@@ -1293,11 +1289,11 @@ Projects I currently don&#39;t have time for
<br />
<a class='textlink' href='./2010-05-09-the-fype-programming-language.html'>The Fype Programming Language</a><br />
<br />
-<h3 style='display: inline' id='Alanguagethatcompilestosed'>A language that compiles to <span class='inlinecode'>sed</span></h3><br />
+<h3 style='display: inline' id='a-language-that-compiles-to-sed'>A language that compiles to <span class='inlinecode'>sed</span></h3><br />
<br />
<span>This is similar to the previous idea, but the difference is that the language would compile into a sed script. Sed has many features, but the brief syntax makes scripts challenging to read. The higher-level language would mimic sed but in a form that is easier for humans to read.</span><br />
<br />
-<h3 style='display: inline' id='RenovateVSSim'>Renovate VS-Sim</h3><br />
+<h3 style='display: inline' id='renovate-vs-sim'>Renovate VS-Sim</h3><br />
<br />
<span>VS-Sim is an open-source simulator programmed in Java for distributed systems. VS-Sim stands for "Verteilte Systeme Simulator," the German translation for "Distributed Systems Simulator." The VS-Sim project was my diploma thesis at Aachen University of Applied Sciences.</span><br />
<br />
@@ -1313,13 +1309,13 @@ Projects I currently don&#39;t have time for
</ul><br />
<span>I have put this project on hold for now, as I want to do more things in Go and fewer in Java in my personal time.</span><br />
<br />
-<h3 style='display: inline' id='KISSticketingsystem'>KISS ticketing system</h3><br />
+<h3 style='display: inline' id='kiss-ticketing-system'>KISS ticketing system</h3><br />
<br />
<span>My idea was to program a KISS (Keep It Simple, Stupid) ticketing system for my personal use. However, I am abandoning this project because I now use the excellent Taskwarrior software. You can learn more about it at:</span><br />
<br />
<a class='textlink' href='https://taskwarrior.org/'>https://taskwarrior.org/</a><br />
<br />
-<h3 style='display: inline' id='AdomainspecificlanguageDSLforwork'>A domain-specific language (DSL) for work</h3><br />
+<h3 style='display: inline' id='a-domain-specific-language-dsl-for-work'>A domain-specific language (DSL) for work</h3><br />
<br />
<span>At work, an internal service allocates storage space for our customers on our storage clusters. It automates many tasks, but many tweaks are accessible through APIs. I had the idea to implement a Ruby-based DSL that would make using all those APIs for ad-hoc changes effortless, e.g.:</span><br />
<br />
@@ -1339,19 +1335,19 @@ http://www.gnu.org/software/src-highlite -->
<br />
<a class='textlink' href='./2022-04-10-creative-universe.html'>Creative universe (Work pet project contests)</a><br />
<br />
-<h2 style='display: inline' id='SelfhostingprojectsIdonthavetimefor'>Self-hosting projects I don&#39;t have time for</h2><br />
+<h2 style='display: inline' id='self-hosting-projects-i-dont-have-time-for'>Self-hosting projects I don&#39;t have time for</h2><br />
<br />
-<h3 style='display: inline' id='MyownMatrixserver'>My own Matrix server</h3><br />
+<h3 style='display: inline' id='my-own-matrix-server'>My own Matrix server</h3><br />
<br />
<span>I value privacy. It would be great to run my own Matrix server for communication within my family. I have yet to have time to look into this more closely.</span><br />
<br />
<a class='textlink' href='https://matrix.org'>https://matrix.org</a><br />
<br />
-<h3 style='display: inline' id='Ampachemusicserver'>Ampache music server</h3><br />
+<h3 style='display: inline' id='ampache-music-server'>Ampache music server</h3><br />
<br />
<span>Ampache is an open-source music streaming server that allows you to host and manage your music collection online, accessible via a web interface. Setting it up involves configuring a web server, installing Ampache, and organising your music files, which can be time-consuming. </span><br />
<br />
-<h3 style='display: inline' id='LibrumeBookreader'>Librum eBook reader</h3><br />
+<h3 style='display: inline' id='librum-ebook-reader'>Librum eBook reader</h3><br />
<br />
<span>Librum is a self-hostable e-book reader that allows users to manage and read their e-book collection from a web interface. Designed to be a self-contained platform where users can upload, organise, and access their e-books, Librum emphasises privacy and control over one&#39;s digital library.</span><br />
<br />
@@ -1359,7 +1355,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>I am using my Kobo devices or my laptop to read these kinds of things for now.</span><br />
<br />
-<h3 style='display: inline' id='MemosNotetakingservice'>Memos - Note-taking service</h3><br />
+<h3 style='display: inline' id='memos---note-taking-service'>Memos - Note-taking service</h3><br />
<br />
<span>Memos is a note-taking service that simplifies and streamlines information capture and organisation. It focuses on providing users with a minimalistic and intuitive interface, aiming to enhance productivity without the clutter commonly associated with more complex note-taking apps.</span><br />
<br />
@@ -1367,27 +1363,27 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>I am abandoning this idea for now, as I am currently using plain Markdown files for notes and syncing them with Syncthing across my devices.</span><br />
<br />
-<h3 style='display: inline' id='Bepastyserver'>Bepasty server</h3><br />
+<h3 style='display: inline' id='bepasty-server'>Bepasty server</h3><br />
<br />
<span>Bepasty is like a Pastebin for all kinds of files (text, image, audio, video, documents, binary, etc.). It seems very neat, but I only share a little nowadays. When I do, I upload files via SCP to one of my OpenBSD VMs and serve them via vanilla httpd there, keeping it KISS.</span><br />
<br />
<a class='textlink' href='https://github.com/bepasty/bepasty-server'>https://github.com/bepasty/bepasty-server</a><br />
<br />
-<h2 style='display: inline' id='BooksIdonthavetimetoread'>Books I don&#39;t have time to read</h2><br />
+<h2 style='display: inline' id='books-i-dont-have-time-to-read'>Books I don&#39;t have time to read</h2><br />
<br />
-<h3 style='display: inline' id='FluentPython'>Fluent Python</h3><br />
+<h3 style='display: inline' id='fluent-python'>Fluent Python</h3><br />
<br />
<span>I consider myself an advanced programmer in Ruby, Bash, and Perl. However, Python seems to be ubiquitous nowadays, and most of my colleagues prefer Python over any other languages. Thus, it makes sense for me to also learn and use Python. After conducting some research, "Fluent Python" appears to be the best book for this purpose.</span><br />
<br />
<span>I don&#39;t have time to read this book at the moment, as I am focusing more on Go (Golang) and I know just enough Python to get by (e.g., for code reviews). Additionally, there are still enough colleagues around who can review my Ruby or Bash code.</span><br />
<br />
-<h3 style='display: inline' id='ProgrammingRuby'>Programming Ruby</h3><br />
+<h3 style='display: inline' id='programming-ruby'>Programming Ruby</h3><br />
<br />
<span>I&#39;ve read a couple of Ruby books already, but "Programming Ruby," which covers up to Ruby 3.2, was just recently released. I would like to read this to deepen my Ruby knowledge further and to revisit some concepts that I may have forgotten.</span><br />
<br />
<span>As stated in this blog post, I am currently more eager to focus on Go, so I&#39;ve put the Ruby book on hold. Additionally, there wouldn&#39;t be enough colleagues who could "understand" my advanced Ruby skills anyway, as most of them are either Java developers or SREs who don&#39;t code a lot.</span><br />
<br />
-<h3 style='display: inline' id='PeterFHamiltonsciencefictionbooks'>Peter F. Hamilton science fiction books</h3><br />
+<h3 style='display: inline' id='peter-f-hamilton-science-fiction-books'>Peter F. Hamilton science fiction books</h3><br />
<br />
<span>I am a big fan of science fiction, but my reading list is currently too long anyway. So, I&#39;ve put the Hamilton books on the back burner for now. You can see all the novels I&#39;ve read here:</span><br />
<br />
@@ -1395,9 +1391,9 @@ http://www.gnu.org/software/src-highlite -->
<a class='textlink' href='gemini://paul.buetow.org/novels.gmi'>gemini://paul.buetow.org/novels.gmi</a><br />
<br />
<br />
-<h2 style='display: inline' id='NewwebsitesIdonthavetimefor'>New websites I don&#39;t have time for</h2><br />
+<h2 style='display: inline' id='new-websites-i-dont-have-time-for'>New websites I don&#39;t have time for</h2><br />
<br />
-<h3 style='display: inline' id='CreateaWhyRakuRoxsite'>Create a "Why Raku Rox" site</h3><br />
+<h3 style='display: inline' id='create-a-why-raku-rox-site'>Create a "Why Raku Rox" site</h3><br />
<br />
<span>The website "Why Raku Rox" would showcase the unique features and benefits of the Raku programming language and highlight why it is an exceptional choice for developers. Raku, originally known as Perl 6, is a dynamic, expressive language designed for flexible and powerful software development.</span><br />
<br />
@@ -1408,9 +1404,9 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>I am not working on this for now, as I currently don’t even have time to program in Raku.</span><br />
<br />
-<h2 style='display: inline' id='ResearchprojectsIdonthavetimefor'>Research projects I don&#39;t have time for</h2><br />
+<h2 style='display: inline' id='research-projects-i-dont-have-time-for'>Research projects I don&#39;t have time for</h2><br />
<br />
-<h3 style='display: inline' id='Projectsecure'>Project secure</h3><br />
+<h3 style='display: inline' id='project-secure'>Project secure</h3><br />
<br />
<span>For work: Implement a PoC that dumps Java heaps to extract secrets from memory. Based on the findings, write a Java program that encrypts secrets in the kernel using the <span class='inlinecode'>memfd_secret()</span> syscall to make it even more secure.</span><br />
<br />
@@ -1418,7 +1414,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>Due to other priorities, I am putting this on hold for now. The software we have built is pretty damn secure already!</span><br />
<br />
-<h3 style='display: inline' id='CPUutilisationisallwrong'>CPU utilisation is all wrong</h3><br />
+<h3 style='display: inline' id='cpu-utilisation-is-all-wrong'>CPU utilisation is all wrong</h3><br />
<br />
<span>This research project, based on Brendan Gregg&#39;s blog post, could potentially significantly impact my work.</span><br />
<br />
@@ -1448,7 +1444,7 @@ http://www.gnu.org/software/src-highlite -->
<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' id='SlowProductivitybooknotes'>"Slow Productivity" book notes</h1><br />
+ <h1 style='display: inline' id='slow-productivity-book-notes'>"Slow Productivity" book notes</h1><br />
<br />
<span class='quote'>Published at 2024-04-27T14:18:51+03:00</span><br />
<br />
@@ -1472,7 +1468,7 @@ http://www.gnu.org/software/src-highlite -->
<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' id='PseudoproductivityandShallowwork'>Pseudo-productivity and Shallow work</h2><br />
+<h2 style='display: inline' id='pseudo-productivity-and-shallow-work'>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 />
@@ -1481,7 +1477,7 @@ http://www.gnu.org/software/src-highlite -->
<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' id='Accomplishmentswithoutburnout'>Accomplishments without burnout</h2><br />
+<h2 style='display: inline' id='accomplishments-without-burnout'>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 />
@@ -1492,7 +1488,7 @@ http://www.gnu.org/software/src-highlite -->
<li>Work at a natural pace</li>
<li>Obsess over quality</li>
</ul><br />
-<h2 style='display: inline' id='Dofewerthings'>Do fewer things</h2><br />
+<h2 style='display: inline' id='do-fewer-things'>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 />
@@ -1526,7 +1522,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>Put tasks on autopilot (regular recurring tasks).</span><br />
<br />
-<h2 style='display: inline' id='Workatanaturalpace'>Work at a natural pace</h2><br />
+<h2 style='display: inline' id='work-at-a-natural-pace'>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 />
@@ -1542,7 +1538,7 @@ http://www.gnu.org/software/src-highlite -->
<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' id='Obsessoverquality'>Obsess over quality </h2><br />
+<h2 style='display: inline' id='obsess-over-quality-'>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 />
@@ -1606,7 +1602,7 @@ http://www.gnu.org/software/src-highlite -->
<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' id='KISShighavailabilitywithOpenBSD'>KISS high-availability with OpenBSD</h1><br />
+ <h1 style='display: inline' id='kiss-high-availability-with-openbsd'>KISS high-availability with OpenBSD</h1><br />
<br />
<span class='quote'>Published at 2024-03-30T22:12:56+02:00</span><br />
<br />
@@ -1635,23 +1631,21 @@ _____|_:_:_| (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
-</pre>
+<h2 style='display: inline' id='table-of-contents'>Table of Contents</h2><br />
<br />
+<ul>
+<li><a href='#kiss-high-availability-with-openbsd'>KISS high-availability with OpenBSD</a></li>
+<li>⇢ <a href='#my-auto-failover-requirements'>My auto-failover requirements</a></li>
+<li>⇢ <a href='#my-ha-solution'>My HA solution</a></li>
+<li>⇢ ⇢ <a href='#only-openbsd-base-installation-required'>Only OpenBSD base installation required</a></li>
+<li>⇢ ⇢ <a href='#fairly-cheap-and-geo-redundant'>Fairly cheap and geo-redundant</a></li>
+<li>⇢ ⇢ <a href='#failover-time-and-split-brain'>Failover time and split-brain</a></li>
+<li>⇢ ⇢ <a href='#failover-support-for-multiple-protocols'>Failover support for multiple protocols</a></li>
+<li>⇢ ⇢ <a href='#lets-encrypt-tls-certificates'>Let&#39;s encrypt TLS certificates</a></li>
+<li>⇢ ⇢ <a href='#monitoring'>Monitoring</a></li>
+<li>⇢ ⇢ <a href='#rex-automation'>Rex automation</a></li>
+<li>⇢ <a href='#more-ha'>More HA</a></li>
+</ul><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 />
<br />
<span>But still, my personal sites were never highly available. All those technologies are great for professional use, but I was looking for something much more straightforward for my personal space - something as KISS (keep it simple and stupid) as possible.</span><br />
@@ -1660,7 +1654,7 @@ KISS high-availability with OpenBSD
<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' id='Myautofailoverrequirements'>My auto-failover requirements</h2><br />
+<h2 style='display: inline' id='my-auto-failover-requirements'>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>
@@ -1673,9 +1667,9 @@ KISS high-availability with OpenBSD
<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' id='MyHAsolution'>My HA solution</h2><br />
+<h2 style='display: inline' id='my-ha-solution'>My HA solution</h2><br />
<br />
-<h3 style='display: inline' id='OnlyOpenBSDbaseinstallationrequired'>Only OpenBSD base installation required</h3><br />
+<h3 style='display: inline' id='only-openbsd-base-installation-required'>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 />
@@ -1831,7 +1825,7 @@ http://www.gnu.org/software/src-highlite -->
<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' id='Fairlycheapandgeoredundant'>Fairly cheap and geo-redundant</h3><br />
+<h3 style='display: inline' id='fairly-cheap-and-geo-redundant'>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 />
@@ -1842,13 +1836,13 @@ http://www.gnu.org/software/src-highlite -->
<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' id='Failovertimeandsplitbrain'>Failover time and split-brain</h3><br />
+<h3 style='display: inline' id='failover-time-and-split-brain'>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' id='Failoversupportformultipleprotocols'>Failover support for multiple protocols</h3><br />
+<h3 style='display: inline' id='failover-support-for-multiple-protocols'>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 />
@@ -1859,7 +1853,7 @@ http://www.gnu.org/software/src-highlite -->
<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' id='LetsencryptTLScertificates'>Let&#39;s encrypt TLS certificates</h3><br />
+<h3 style='display: inline' id='lets-encrypt-tls-certificates'>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 />
@@ -1896,7 +1890,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' id='Monitoring'>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 />
@@ -1905,7 +1899,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' id='Rexautomation'>Rex automation</h3><br />
+<h3 style='display: inline' id='rex-automation'>Rex automation</h3><br />
<br />
<span>I use Rexify, a friendly configuration management system that allows automatic deployment and configuration.</span><br />
<br />
@@ -1914,7 +1908,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' id='MoreHA'>More HA</h2><br />
+<h2 style='display: inline' id='more-ha'>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 />
@@ -1952,7 +1946,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' id='AfineFyneAndroidappforquicklyloggingideasprogrammedinGo'>A fine Fyne Android app for quickly logging ideas programmed in Go</h1><br />
+ <h1 style='display: inline' id='a-fine-fyne-android-app-for-quickly-logging-ideas-programmed-in-go'>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 />
@@ -1984,7 +1978,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' id='Alleasypeasy'>All easy-peasy?</h2><br />
+<h2 style='display: inline' id='all-easy-peasy'>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 />
@@ -2201,7 +2195,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' id='OnereasonwhyIloveOpenBSD'>One reason why I love OpenBSD</h1><br />
+ <h1 style='display: inline' id='one-reason-why-i-love-openbsd'>One reason why I love OpenBSD</h1><br />
<br />
<span class='quote'>Published at 2024-01-13T22:55:33+02:00</span><br />
<br />
@@ -2282,7 +2276,7 @@ http://www.gnu.org/software/src-highlite -->
<summary>Welcome to Part 3 of my Site Reliability Engineering (SRE) series. I'm currently working as a Site Reliability Engineer, and I’m here to share what SRE is all about in this blog series.</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline' id='SiteReliabilityEngineeringPart3OnCallCultureandtheHumanSide'>Site Reliability Engineering - Part 3: On-Call Culture and the Human Side</h1><br />
+ <h1 style='display: inline' id='site-reliability-engineering---part-3-on-call-culture-and-the-human-side'>Site Reliability Engineering - Part 3: On-Call Culture and the Human Side</h1><br />
<br />
<span class='quote'>Published at 2024-01-09T18:35:48+02:00</span><br />
<br />
@@ -2290,7 +2284,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<a class='textlink' href='./2023-08-18-site-reliability-engineering-part-1.html'>2023-08-18 Site Reliability Engineering - Part 1: SRE and Organizational Culture</a><br />
<a class='textlink' href='./2023-11-19-site-reliability-engineering-part-2.html'>2023-11-19 Site Reliability Engineering - Part 2: Operational Balance in SRE</a><br />
-<a class='textlink' href='./2024-01-09-site-reliability-engineering-part-3.html'>2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Aspect (You are currently reading this)</a><br />
+<a class='textlink' href='./2024-01-09-site-reliability-engineering-part-3.html'>2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Side (You are currently reading this)</a><br />
<br />
<pre>
..--""""----..
@@ -2318,7 +2312,7 @@ http://www.gnu.org/software/src-highlite -->
</pre>
<br />
-<h2 style='display: inline' id='OnCallCultureandtheHumanSidePuttingWellbeingFirstintheWorldofReliability'>On-Call Culture and the Human Side: Putting Well-being First in the World of Reliability</h2><br />
+<h2 style='display: inline' id='on-call-culture-and-the-human-side-putting-well-being-first-in-the-world-of-reliability'>On-Call Culture and the Human Side: Putting Well-being First in the World of Reliability</h2><br />
<br />
<span>Site Reliability Engineering is all about keeping systems reliable, but we often forget how important the human side is. A healthy on-call culture is just as crucial as any technical fix. The well-being of the engineers really matters.</span><br />
<br />
@@ -2356,7 +2350,7 @@ http://www.gnu.org/software/src-highlite -->
<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' id='BashGolfPart3'>Bash Golf Part 3</h1><br />
+ <h1 style='display: inline' id='bash-golf-part-3'>Bash Golf Part 3</h1><br />
<br />
<span class='quote'>Published at 2023-12-10T11:35:54+02:00</span><br />
<br />
@@ -2377,7 +2371,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' id='FUNCNAME'><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 />
@@ -2417,7 +2411,7 @@ http://www.gnu.org/software/src-highlite -->
<font color="#ff0000">INFO</font><font color="#F3E651">|</font><font color="#bb00ff">20231210</font><font color="#ff0000">-</font><font color="#bb00ff">082732</font><font color="#F3E651">|</font><font color="#bb00ff">123002</font><font color="#F3E651">|</font><font color="#ff0000">at_home_friday_evening</font><font color="#F3E651">|</font><font color="#ff0000">One Peperoni Pizza</font><font color="#F3E651">,</font><font color="#ff0000"> please</font>
</pre>
<br />
-<h2 style='display: inline' id=''><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 />
@@ -2440,7 +2434,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<a href='./bash-golf-part-3/bash-fork-bomb.jpg'><img alt='Bash fork bomb' title='Bash fork bomb' src='./bash-golf-part-3/bash-fork-bomb.jpg' /></a><br />
<br />
-<h2 style='display: inline' id='Innerfunctions'>Inner functions</h2><br />
+<h2 style='display: inline' id='inner-functions'>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 />
@@ -2509,7 +2503,7 @@ Wintel inside!
Wintel inside!
</pre>
<br />
-<h2 style='display: inline' id='Exportingfunctions'>Exporting functions</h2><br />
+<h2 style='display: inline' id='exporting-functions'>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 />
@@ -2599,7 +2593,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' id='Dynamicvariableswithlocal'>Dynamic variables with <span class='inlinecode'>local</span></h2><br />
+<h2 style='display: inline' id='dynamic-variables-with-local'>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 />
@@ -2639,7 +2633,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' id='ifconditionals'><span class='inlinecode'>if</span> conditionals</h2><br />
+<h2 style='display: inline' id='if-conditionals'><span class='inlinecode'>if</span> conditionals</h2><br />
<br />
<span>Consider all variants here more or less equivalent:</span><br />
<br />
@@ -2690,7 +2684,7 @@ ok4a
ok4b
</pre>
<br />
-<h2 style='display: inline' id='Multilinecomments'>Multi-line comments</h2><br />
+<h2 style='display: inline' id='multi-line-comments'>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 />
@@ -2714,7 +2708,7 @@ http://www.gnu.org/software/src-highlite -->
<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' id='Dontchangeitwhileitsexecuted'>Don&#39;t change it while it&#39;s executed</h2><br />
+<h2 style='display: inline' id='dont-change-it-while-its-executed'>Don&#39;t change it while it&#39;s executed</h2><br />
<br />
<span>Consider this script:</span><br />
<br />
@@ -2773,7 +2767,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' id='SiteReliabilityEngineeringPart2OperationalBalanceinSRE'>Site Reliability Engineering - Part 2: Operational Balance in SRE</h1><br />
+ <h1 style='display: inline' id='site-reliability-engineering---part-2-operational-balance-in-sre'>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 />
@@ -2781,7 +2775,7 @@ echo baz
<br />
<a class='textlink' href='./2023-08-18-site-reliability-engineering-part-1.html'>2023-08-18 Site Reliability Engineering - Part 1: SRE and Organizational Culture</a><br />
<a class='textlink' href='./2023-11-19-site-reliability-engineering-part-2.html'>2023-11-19 Site Reliability Engineering - Part 2: Operational Balance in SRE (You are currently reading this)</a><br />
-<a class='textlink' href='./2024-01-09-site-reliability-engineering-part-3.html'>2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Aspect</a><br />
+<a class='textlink' href='./2024-01-09-site-reliability-engineering-part-3.html'>2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Side</a><br />
<br />
<pre>
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣾⣷⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
@@ -2798,7 +2792,7 @@ echo baz
⠀⠀⠀⠀⠀⠀⠴⠶⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠶⠦⠀⠀
</pre>
<br />
-<h2 style='display: inline' id='OperationalBalanceinSREStrikingtheRightBalanceBetweenReliabilityandSpeed'>Operational Balance in SRE: Striking the Right Balance Between Reliability and Speed</h2><br />
+<h2 style='display: inline' id='operational-balance-in-sre-striking-the-right-balance-between-reliability-and-speed'>Operational Balance in SRE: Striking the Right Balance Between Reliability and Speed</h2><br />
<br />
<span>Site Reliability Engineering is more than just a bunch of best practices or methods. It&#39;s a guiding light for engineering teams, helping them navigate the tricky waters of modern software development and system management.</span><br />
<span>In the world of software production, there are two big forces that often clash: the push for fast feature releases (velocity) and the need for reliable systems. Traditionally, moving faster meant more risk. SRE helps balance these opposing goals with things like error budgets and SLIs/SLOs. These tools give teams a clear way to measure how much they can push changes without hurting system health. So, the error budget becomes a balancing act, helping teams trade off between innovation and reliability.</span><br />
@@ -2817,7 +2811,7 @@ echo baz
<br />
<span>Continue with the third part of this series:</span><br />
<br />
-<a class='textlink' href='./2024-01-09-site-reliability-engineering-part-3.html'>2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Aspect</a><br />
+<a class='textlink' href='./2024-01-09-site-reliability-engineering-part-3.html'>2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Side</a><br />
<br />
<span>E-Mail your comments to <span class='inlinecode'>paul@nospam.buetow.org</span> :-)</span><br />
<br />
@@ -2837,7 +2831,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' id='MindManagementbooknotes'>"Mind Management" book notes</h1><br />
+ <h1 style='display: inline' id='mind-management-book-notes'>"Mind Management" book notes</h1><br />
<br />
<span class='quote'>Published at 2023-11-11T22:21:47+02:00</span><br />
<br />
@@ -2861,11 +2855,11 @@ echo baz
<li>The point of diminishing returns</li>
<li>The point of negative return</li>
</ul><br />
-<h2 style='display: inline' id='Emptyslotsinthecalendar'>Empty slots in the calendar</h2><br />
+<h2 style='display: inline' id='empty-slots-in-the-calendar'>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' id='Whenyousafetime'>When you safe time...</h2><br />
+<h2 style='display: inline' id='when-you-safe-time'>When you safe time...</h2><br />
<br />
<span>...keep it.</span><br />
<br />
@@ -2874,7 +2868,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' id='Followyourmood'>Follow your mood</h2><br />
+<h2 style='display: inline' id='follow-your-mood'>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 />
@@ -2882,7 +2876,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' id='Boostingcreativity'>Boosting creativity</h2><br />
+<h2 style='display: inline' id='boosting-creativity'>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 />
@@ -2892,7 +2886,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' id='Therightmoodforthetaskathand'>The right mood for the task at hand</h2><br />
+<h2 style='display: inline' id='the-right-mood-for-the-task-at-hand'>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 />
@@ -2906,7 +2900,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' id='Creativityhacks'>Creativity hacks</h2><br />
+<h2 style='display: inline' id='creativity-hacks'>Creativity hacks</h2><br />
<br />
<ul>
<li>Coffee can cause anxiety.</li>
@@ -2917,7 +2911,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' id='Planningandstrategizing'>Planning and strategizing</h2><br />
+<h2 style='display: inline' id='planning-and-strategizing'>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 />
@@ -2930,7 +2924,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' id='Fakeituntilyoumakeit'>Fake it until you make it. </h2><br />
+<h2 style='display: inline' id='fake-it-until-you-make-it-'>Fake it until you make it. </h2><br />
<br />
<ul>
<li>E.g. act calm if you want to be calm.</li>
@@ -2966,7 +2960,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' id='KISSstaticwebphotoalbumswithphotoalbumsh'>KISS static web photo albums with <span class='inlinecode'>photoalbum.sh</span></h1><br />
+ <h1 style='display: inline' id='kiss-static-web-photo-albums-with-photoalbumsh'>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 />
@@ -2987,7 +2981,7 @@ echo baz
&#39;._____________________________________________.&#39;
</pre>
<br />
-<h2 style='display: inline' id='Motivation'>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 />
@@ -2995,11 +2989,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' id='Introducingphotoalbumsh'>Introducing <span class='inlinecode'>photoalbum.sh</span></h2><br />
+<h2 style='display: inline' id='introducing-photoalbumsh'>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' id='Installation'>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 />
@@ -3042,7 +3036,7 @@ cp ./src/photoalbum.default.conf /etc/default/photoalbum
This is Photoalbum Version 0.5.1
</pre>
<br />
-<h2 style='display: inline' id='Settingitup'>Setting it up</h2><br />
+<h2 style='display: inline' id='setting-it-up'>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 />
@@ -3155,7 +3149,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' id='Generatingthestaticphotoalbum'>Generating the static photo album</h2><br />
+<h2 style='display: inline' id='generating-the-static-photo-album'>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 />
@@ -3218,15 +3212,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' id='Cleaningitup'>Cleaning it up</h2><br />
+<h2 style='display: inline' id='cleaning-it-up'>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' id='HTMLtemplates'>HTML templates</h2><br />
+<h2 style='display: inline' id='html-templates'>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' id='Conclusion'>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 />
@@ -3264,7 +3258,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' id='DTailusageexamples'>DTail usage examples</h1><br />
+ <h1 style='display: inline' id='dtail-usage-examples'>DTail usage examples</h1><br />
<br />
<span class='quote'>Published at 2023-09-25T14:57:42+03:00</span><br />
<br />
@@ -3298,7 +3292,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' id='Followinglogs'>Following logs</h2><br />
+<h2 style='display: inline' id='following-logs'>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 />
@@ -3322,7 +3316,7 @@ http://www.gnu.org/software/src-highlite -->
<pre><font color="#F3E651">%</font><font color="#ff0000"> dtail --servers serverlist</font><font color="#F3E651">.</font><font color="#ff0000">txt --grep INFO </font><font color="#bb00ff">"/var/log/dserver/*.log"</font>
</pre>
<br />
-<h2 style='display: inline' id='Aggregatinglogs'>Aggregating logs</h2><br />
+<h2 style='display: inline' id='aggregating-logs'>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 />
@@ -3379,7 +3373,7 @@ http://www.gnu.org/software/src-highlite -->
<font color="#ff0000"> --query </font><font color="#bb00ff">'from STATS select ... outfile append result.csv'</font>
</pre>
<br />
-<h2 style='display: inline' id='Howtousedcat'>How to use <span class='inlinecode'>dcat</span></h2><br />
+<h2 style='display: inline' id='how-to-use-dcat'>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 />
@@ -3403,7 +3397,7 @@ http://www.gnu.org/software/src-highlite -->
<pre><font color="#F3E651">%</font><font color="#ff0000"> dcat --servers serverlist</font><font color="#F3E651">.</font><font color="#ff0000">txt /etc/hostname</font>
</pre>
<br />
-<h2 style='display: inline' id='Howtousedgrep'>How to use <span class='inlinecode'>dgrep</span></h2><br />
+<h2 style='display: inline' id='how-to-use-dgrep'>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 />
@@ -3422,7 +3416,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span class='quote'>Hint: <span class='inlinecode'>-regex</span> is an alias for <span class='inlinecode'>-grep</span>.</span><br />
<br />
-<h2 style='display: inline' id='Howtousedmap'>How to use <span class='inlinecode'>dmap</span></h2><br />
+<h2 style='display: inline' id='how-to-use-dmap'>How to use <span class='inlinecode'>dmap</span></h2><br />
<br />
<span>To run a map-reduce aggregation over logs written in the past, the <span class='inlinecode'>dmap</span> command can be used. The following example aggregates all map-reduce fields <span class='inlinecode'>dmap</span> will print interim results every few seconds. You can also write the result to an CSV file by adding <span class='inlinecode'>outfile result.csv</span> to the query.</span><br />
<br />
@@ -3440,7 +3434,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<a href='./dtail-usage-examples/dmap.gif'><img alt='DMap example' title='DMap example' src='./dtail-usage-examples/dmap.gif' /></a><br />
<br />
-<h2 style='display: inline' id='HowtousetheDTailserverlessmode'>How to use the DTail serverless mode</h2><br />
+<h2 style='display: inline' id='how-to-use-the-dtail-serverless-mode'>How to use the DTail serverless mode</h2><br />
<br />
<span>Until now, all examples so far required to have remote server(s) to connect to. That makes sense, as after all DTail is a *distributed* tool. However, there are circumstances where you don&#39;t really need to connect to a server remotely. For example, you already have a login shell open to the server an all what you want is to run some queries directly on local log files.</span><br />
<br />
@@ -3448,7 +3442,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>All commands shown so far also work in a serverless mode. All what needs to be done is to omit a server list. The DTail client then starts in serverless mode.</span><br />
<br />
-<h3 style='display: inline' id='Serverlessmapreducequery'>Serverless map-reduce query</h3><br />
+<h3 style='display: inline' id='serverless-map-reduce-query'>Serverless map-reduce query</h3><br />
<br />
<span>The following <span class='inlinecode'>dmap</span> example is the same as the previously shown one, but the difference is that it operates on a local log file directly:</span><br />
<br />
@@ -3483,7 +3477,7 @@ http://www.gnu.org/software/src-highlite -->
<font color="#bb00ff"> lifetimeConnections group by $hostname order by max($cgocalls)'</font>
</pre>
<br />
-<h3 style='display: inline' id='AggregatingCSVfiles'>Aggregating CSV files</h3><br />
+<h3 style='display: inline' id='aggregating-csv-files'>Aggregating CSV files</h3><br />
<br />
<span>In essence, this works exactly like aggregating logs. All files operated on must be valid CSV files and the first line of the CSV must be the header. E.g.:</span><br />
<br />
@@ -3505,7 +3499,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>DMap can also be used to query and aggregate CSV files from remote servers.</span><br />
<br />
-<h3 style='display: inline' id='Otherserverlesscommands'>Other serverless commands</h3><br />
+<h3 style='display: inline' id='other-serverless-commands'>Other serverless commands</h3><br />
<br />
<span>The serverless mode works transparently with all other DTail commands. Here are some examples:</span><br />
<br />
@@ -3584,7 +3578,7 @@ http://www.gnu.org/software/src-highlite -->
<summary>Being a Site Reliability Engineer (SRE) is like stepping into a lively, ever-evolving universe. The world of SRE mixes together different tech, a unique culture, and a whole lot of determination. It’s one of the toughest but most exciting jobs out there. There's zero chance of getting bored because there's always a fresh challenge to tackle and new technology to play around with. It's not just about the tech side of things either; it's heavily rooted in communication, collaboration, and teamwork. As someone currently working as an SRE, I’m here to break it all down for you in this blog series. Let's dive into what SRE is really all about!</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline' id='SiteReliabilityEngineeringPart1SREandOrganizationalCulture'>Site Reliability Engineering - Part 1: SRE and Organizational Culture</h1><br />
+ <h1 style='display: inline' id='site-reliability-engineering---part-1-sre-and-organizational-culture'>Site Reliability Engineering - Part 1: SRE and Organizational Culture</h1><br />
<br />
<span class='quote'>Published at 2023-08-18T22:43:47+03:00</span><br />
<br />
@@ -3592,7 +3586,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<a class='textlink' href='./2023-08-18-site-reliability-engineering-part-1.html'>2023-08-18 Site Reliability Engineering - Part 1: SRE and Organizational Culture (You are currently reading this)</a><br />
<a class='textlink' href='./2023-11-19-site-reliability-engineering-part-2.html'>2023-11-19 Site Reliability Engineering - Part 2: Operational Balance in SRE</a><br />
-<a class='textlink' href='./2024-01-09-site-reliability-engineering-part-3.html'>2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Aspect</a><br />
+<a class='textlink' href='./2024-01-09-site-reliability-engineering-part-3.html'>2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Side</a><br />
<br />
<pre>
▓▓▓▓░░
@@ -3616,7 +3610,7 @@ DC on fire:
░░░░░░░░░░▒▒░░░░░░░░░░░░░░░░░░░░░░░░▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▒▒░░░░░░░░░░░░░░░░░░
</pre>
<br />
-<h2 style='display: inline' id='SREandOrganizationalCultureNavigatingtheNexus'>SRE and Organizational Culture: Navigating the Nexus</h2><br />
+<h2 style='display: inline' id='sre-and-organizational-culture-navigating-the-nexus'>SRE and Organizational Culture: Navigating the Nexus</h2><br />
<br />
<span>At the core of SRE is the principle of "prevention over cure." Unlike traditional IT setups that mostly react to problems, SRE focuses on spotting issues before they happen. This proactive approach involves using Service Level Indicators (SLIs) and Service Level Objectives (SLOs). These tools give teams specific metrics and targets to aim for, helping them keep systems reliable and users happy. It&#39;s all about creating a culture that prioritizes user experience and makes sure everything runs smoothly to meet their needs.</span><br />
<br />
@@ -3658,7 +3652,7 @@ DC on fire:
<summary>I proudly announce that I've released Gemtexter version `2.1.0`. What is Gemtexter? It's my minimalist static site generator for Gemini Gemtext, HTML and Markdown, written in GNU Bash.</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline' id='Gemtexter210LetsGemtextagain'>Gemtexter 2.1.0 - Let&#39;s Gemtext again³</h1><br />
+ <h1 style='display: inline' id='gemtexter-210---lets-gemtext-again'>Gemtexter 2.1.0 - Let&#39;s Gemtext again³</h1><br />
<br />
<span class='quote'>Published at 2023-07-21T10:19:31+03:00</span><br />
<br />
@@ -3679,17 +3673,17 @@ DC on fire:
<br />
<a class='textlink' href='https://codeberg.org/snonux/gemtexter'>https://codeberg.org/snonux/gemtexter</a><br />
<br />
-<h2 style='display: inline' id='WhyBash'>Why Bash?</h2><br />
+<h2 style='display: inline' id='why-bash'>Why Bash?</h2><br />
<br />
<span>This project is too complex for a Bash script. Writing it in Bash was to try out how maintainable a "larger" Bash script could be. It&#39;s still pretty maintainable and helps me try new Bash tricks here and then!</span><br />
<br />
<span>Let&#39;s list what&#39;s new!</span><br />
<br />
-<h2 style='display: inline' id='SwitchtoGPL3license'>Switch to GPL3 license</h2><br />
+<h2 style='display: inline' id='switch-to-gpl3-license'>Switch to GPL3 license</h2><br />
<br />
<span>Many (almost all) of the tools and commands (GNU Bash, GMU Sed, GNU Date, GNU Grep, GNU Source Highlight) used by <span class='inlinecode'>Gemtexter</span> are licensed under the GPL anyway. So why not use the same? This was an easy switch, as I was the only code contributor so far!</span><br />
<br />
-<h2 style='display: inline' id='Sourcecodehighlightingsupport'>Source code highlighting support</h2><br />
+<h2 style='display: inline' id='source-code-highlighting-support'>Source code highlighting support</h2><br />
<br />
<span>The HTML output now supports source code highlighting, which is pretty neat if your site is about programming. The requirement is to have the <span class='inlinecode'>source-highlight</span> command, which is GNU Source Highlight, to be installed. Once done, you can annotate a bare block with the language to be highlighted. E.g.:</span><br />
<br />
@@ -3714,11 +3708,11 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>Please run <span class='inlinecode'>source-highlight --lang-list</span> for a list of all supported languages.</span><br />
<br />
-<h2 style='display: inline' id='HTMLexactvariant'>HTML exact variant</h2><br />
+<h2 style='display: inline' id='html-exact-variant'>HTML exact variant</h2><br />
<br />
<span>Gemtexter is there to convert your Gemini Capsule into other formats, such as HTML and Markdown. An HTML exact variant can now be enabled in the <span class='inlinecode'>gemtexter.conf</span> by adding the line <span class='inlinecode'>declare -rx HTML_VARIANT=exact</span>. The HTML/CSS output changed to reflect a more exact Gemtext appearance and to respect the same spacing as you would see in the Geminispace. </span><br />
<br />
-<h2 style='display: inline' id='UseofHackwebfontbydefault'>Use of Hack webfont by default</h2><br />
+<h2 style='display: inline' id='use-of-hack-webfont-by-default'>Use of Hack webfont by default</h2><br />
<br />
<span>The Hack web font is a typeface designed explicitly for source code. It&#39;s a derivative of the Bitstream Vera and DejaVu Mono lineage, but it features many improvements and refinements that make it better suited to reading and writing code.</span><br />
<br />
@@ -3726,7 +3720,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>Hack is open-source and freely available for use and modification under the MIT License.</span><br />
<br />
-<h2 style='display: inline' id='HTMLMastodonverificationsupport'>HTML Mastodon verification support</h2><br />
+<h2 style='display: inline' id='html-mastodon-verification-support'>HTML Mastodon verification support</h2><br />
<br />
<span>The following link explains how URL verification works in Mastodon:</span><br />
<br />
@@ -3756,7 +3750,7 @@ http://www.gnu.org/software/src-highlite -->
<pre><b><font color="#ffffff">&lt;a</font></b><font color="#ff0000"> </font><b><font color="#F35E1E">href</font></b><font color="#F3E651">=</font><font color="#bb00ff">'https://fosstodon.org/@snonux'</font><font color="#ff0000"> </font><b><font color="#F35E1E">rel</font></b><font color="#F3E651">=</font><font color="#bb00ff">'me'</font><b><font color="#ffffff">&gt;</font></b><font color="#ff0000">Me at Mastodon</font><b><font color="#ffffff">&lt;/a&gt;</font></b>
</pre>
<br />
-<h2 style='display: inline' id='More'>More</h2><br />
+<h2 style='display: inline' id='more'>More</h2><br />
<br />
<span>Additionally, there were a couple of bug fixes, refactorings and overall improvements in the documentation made. </span><br />
<br />
@@ -3786,7 +3780,7 @@ http://www.gnu.org/software/src-highlite -->
<summary>These notes are of two books by 'John Sommez' I found helpful. I also added some of my own keypoints to it. These notes are mainly for my own use, but you might find them helpful, too.</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline' id='SoftwareDevelopmersCareerGuideandSoftSkillsbooknotes'>"Software Developmers Career Guide and Soft Skills" book notes</h1><br />
+ <h1 style='display: inline' id='software-developmers-career-guide-and-soft-skills-book-notes'>"Software Developmers Career Guide and Soft Skills" book notes</h1><br />
<br />
<span class='quote'>Published at 2023-07-17T04:56:20+03:00</span><br />
<br />
@@ -3804,9 +3798,9 @@ http://www.gnu.org/software/src-highlite -->
&#39;&#39;&#39;
</pre>
<br />
-<h1 style='display: inline' id='Improve'>Improve</h1><br />
+<h1 style='display: inline' id='improve'>Improve</h1><br />
<br />
-<h2 style='display: inline' id='Alwayslearnnewthings'>Always learn new things</h2><br />
+<h2 style='display: inline' id='always-learn-new-things'>Always learn new things</h2><br />
<br />
<span>When you learn something new, e.g. a programming language, first gather an overview, learn from multiple sources, play around and learn by doing and not consuming and form your own questions. Don&#39;t read too much upfront. A large amount of time is spent in learning technical skills which were never use. You want to have a practical set of skills you are actually using. You need to know 20 percent to get out 80 percent of the results.</span><br />
<br />
@@ -3824,11 +3818,11 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>Boot camps: The advantage of a boot camp is to pragmatically learn things fast. We almost always overestimate what we can do in a day. Especially during boot camps. Connect to others during the boot camps</span><br />
<br />
-<h2 style='display: inline' id='Setgoals'>Set goals</h2><br />
+<h2 style='display: inline' id='set-goals'>Set goals</h2><br />
<br />
<span>Your own goals are important but the manager also looks at how the team performs and how someone can help the team perform better. Check whether you are on track with your goals every 2 weeks in order to avoid surprises for the annual review. Make concrete goals for next review. Track and document your progress. Invest in your education. Make your goals known. If you want something, then ask for it. Nobody but you knows what you want.</span><br />
<br />
-<h2 style='display: inline' id='Ratings'>Ratings</h2><br />
+<h2 style='display: inline' id='ratings'>Ratings</h2><br />
<br />
<span>That&#39;s a trap: If you have to rate yourself, that&#39;s a trap. That never works in an unbiased way. Rate yourself always the best way but rate your weakest part as high as possible minus one point. Rate yourself as good as you can otherwise. Nobody is putting for fun a gun on his own head. </span><br />
<br />
@@ -3836,7 +3830,7 @@ http://www.gnu.org/software/src-highlite -->
<li>Don&#39;t do peer rating, it can fire back on you. What if the colleague becomes your new boss?</li>
<li>Cooperate rankings are unfortunately HR guidelines and politics and only mirror a little your actual performance.</li>
</ul><br />
-<h2 style='display: inline' id='Promotions'>Promotions</h2><br />
+<h2 style='display: inline' id='promotions'>Promotions</h2><br />
<br />
<span>The most valuable employees are the ones who make themselves obsolete and automate all away. Keep a safety net of 3 to 6 months of finances. Safe at least 10 percent of your earnings. Also, if you make money it does not mean that you have to spent more money. Is a new car better than a used car which both can bring you from A to B? Liability vs assets.</span><br />
<br />
@@ -3849,7 +3843,7 @@ http://www.gnu.org/software/src-highlite -->
<li>If you want a raise be specific how much and know to back your demands. Don&#39;t make a thread and no ultimatums.</li>
<li>Best way for a promotion is to switch jobs. You can even switch back with a better salary.</li>
</ul><br />
-<h2 style='display: inline' id='Finishthings'>Finish things</h2><br />
+<h2 style='display: inline' id='finish-things'>Finish things</h2><br />
<br />
<span>Hard work is necessary for accomplish results. However, work smarter not harder. Furthermore, working smart is not a substitute for working hard. Work both, hard and smart.</span><br />
<br />
@@ -3864,7 +3858,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>Defeat is finally give up. Failure is the road to success, embrace it. Failure does not define you but how you respond to it. Events don&#39;t make your unhappy, but how you react to events do.</span><br />
<br />
-<h2 style='display: inline' id='Expandtheempire'>Expand the empire</h2><br />
+<h2 style='display: inline' id='expand-the-empire'>Expand the empire</h2><br />
<br />
<span>The larger your empire is, the larger your circle of influence is. The larger the circle of influence is, the more opportunities you have.</span><br />
<br />
@@ -3875,7 +3869,7 @@ http://www.gnu.org/software/src-highlite -->
</ul><br />
<span>Become visible, keep track that you accomplishments. E.g. write a weekly summary. Do presentations, be seen. Learn new things and share your learnings. Be the problem solver and not the blamer.</span><br />
<br />
-<h2 style='display: inline' id='Bepragmaticandalsomanageyourtime'>Be pragmatic and also manage your time</h2><br />
+<h2 style='display: inline' id='be-pragmatic-and-also-manage-your-time'>Be pragmatic and also manage your time</h2><br />
<br />
<span>Make use of time boxing via the Pomodoro technique: Set a target of rounds and track the rounds. That give you exact focused work time. That&#39;s really the trick. For example set a goal of 6 daily pomodores.</span><br />
<br />
@@ -3885,7 +3879,7 @@ http://www.gnu.org/software/src-highlite -->
</ul><br />
<span>You should feel good of the work done even if you don&#39;t finished the task. You will feel good about pomodoro wise even you don&#39;t finish the task on hand yet. Helps you to enjoy time off more. Working longer may not sell anything.</span><br />
<br />
-<h3 style='display: inline' id='Thequotasystem'>The quota system</h3><br />
+<h3 style='display: inline' id='the-quota-system'>The quota system</h3><br />
<br />
<span>Defined quota of things done. E.g. N runs per week or M Blog posts per month or O pomodoros per week. This helps with consistency. Truly commit to these quotas. Failure is not an option. Start with small commitments. Don&#39;t commit to something you can&#39;t fulfill otherwise you set yourself up for failure.</span><br />
<br />
@@ -3894,7 +3888,7 @@ http://www.gnu.org/software/src-highlite -->
<li>Internal motivation is more important over external motivation. Check out Daniels book drive.</li>
<li>Multitasking: Batching is effective. E.g. emails twice daily at pre-set times..</li>
</ul><br />
-<h3 style='display: inline' id='Dontwastetime'>Don&#39;t waste time</h3><br />
+<h3 style='display: inline' id='dont-waste-time'>Don&#39;t waste time</h3><br />
<br />
<span>The biggest time waster is TV watching. The TV is programming you. It&#39;s insane that Americans watch so much TV as they work full time. Schedule one show at a time and watch it when you want to watch it. Most movies are crap anyways. The good movies will come to you as people will talk about them.</span><br />
<br />
@@ -3903,7 +3897,7 @@ http://www.gnu.org/software/src-highlite -->
<li>Meetings can waste time as well. Simply don&#39;t go to them. Try to cancel meeting if it can be dealt with via email.</li>
<li>Enjoying things is not a waste of time. E.g. you could still play a game once in a while. It is important not to cut away all you enjoy from your life.</li>
</ul><br />
-<h3 style='display: inline' id='Habits'>Habits</h3><br />
+<h3 style='display: inline' id='habits'>Habits</h3><br />
<br />
<span>Try to have as many good habits as possible. Start with easy habits, and make them a little bit more challenging over time. Set ankers and rewards. Over time the routines will become habits naturally.</span><br />
<br />
@@ -3913,7 +3907,7 @@ http://www.gnu.org/software/src-highlite -->
<li>We don&#39;t have control over our habits but our own routines.</li>
<li>Routines help to form the habits, though.</li>
</ul><br />
-<h1 style='display: inline' id='Worklifebalance'>Work-life balance</h1><br />
+<h1 style='display: inline' id='work-life-balance'>Work-life balance</h1><br />
<br />
<span>Avoid overwork hours. That&#39;s not as beneficial as you might think and comes only with very small rewards. Invest rather in yourself and not in your employer.</span><br />
<br />
@@ -3925,7 +3919,7 @@ http://www.gnu.org/software/src-highlite -->
</ul><br />
<span>Use your most productive hours to work on you. Make that your priority. Take care of yourself a priority (E.g. do workouts or learn a new language). You can always workout 2 or 1 hour per day, but will you pay the price?</span><br />
<br />
-<h2 style='display: inline' id='Mentalhealth'>Mental health</h2><br />
+<h2 style='display: inline' id='mental-health'>Mental health</h2><br />
<br />
<ul>
<li>Friendships and positive thinking help to have and maintain better health, longer Life, better productivity and increased happiness.</li>
@@ -3936,7 +3930,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>In most cases burnout is just an illusion. If you don&#39;t have motivation push through the wall. People usually don&#39;t pass the wall as they feel they are burned out. After pushing through the wall you will have the most fun, for example you will be able playing the guitar greatly.</span><br />
<br />
-<h2 style='display: inline' id='Physicalhealth'>Physical health</h2><br />
+<h2 style='display: inline' id='physical-health'>Physical health</h2><br />
<br />
<span>Utilise a standing desk and treadmill (you could walk and type at the same time). Increase the incline in order to burn more calories. Even on the standing desk you burn more calories than sitting. When you use pomodoro then you can use the small breaks for push-ups (maybe won&#39;t do as good when you are in a fasted state).</span><br />
<br />
@@ -3948,7 +3942,7 @@ http://www.gnu.org/software/src-highlite -->
</ul><br />
<span>Intermittent fasting is an effective method to maintain weight and health. But it does not mean that you can only eat junk food in the feeding windows. Also, diet and nutrition is the most important for health and fitness. They make it also easier to stay focused and positive.</span><br />
<br />
-<h2 style='display: inline' id='Nodrama'>No drama</h2><br />
+<h2 style='display: inline' id='no-drama'>No drama</h2><br />
<br />
<span>Avoid drama at work. Where are humans there is drama. You can decide where to spent your energy in. But don&#39;t avoid conflict. Conflict is healthy in any kind of relationship. Be tactful and state your opinion. The goal is to find the best solution to the problem.</span><br />
<br />
@@ -3964,13 +3958,13 @@ http://www.gnu.org/software/src-highlite -->
</ul><br />
<span>You have to learn how to work in a team. Be honest but tactful. It&#39;s not too be the loudest but about selling your ideas. Don&#39;t argue otherwise you won&#39;t sell anything. Be persuasive by finding the common ground. Or lead the colleagues to your idea and don&#39;t sell it upfront. Communicate clearly.</span><br />
<br />
-<h1 style='display: inline' id='Personalbrand'>Personal brand</h1><br />
+<h1 style='display: inline' id='personal-brand'>Personal brand</h1><br />
<br />
<ul>
<li>Invest your value outside the company. Build your personal brand. Show how valuable you are, also to other companies. Become an asset.</li>
<li>Invest in your education. Make your goals known. If you want something ask for it (see also the sections about goals in this document).</li>
</ul><br />
-<h2 style='display: inline' id='Marketyourself'>Market yourself</h2><br />
+<h2 style='display: inline' id='market-yourself'>Market yourself</h2><br />
<br />
<ul>
<li>The best way to market yourself is to make you usable.</li>
@@ -3983,11 +3977,11 @@ http://www.gnu.org/software/src-highlite -->
<li>Have an elevator pitch: "buetow.org - Having fun with computers!"</li>
<li>Have social media accounts, especially the ones which are more tech related.</li>
</ul><br />
-<h2 style='display: inline' id='Networking'>Networking</h2><br />
+<h2 style='display: inline' id='networking'>Networking</h2><br />
<br />
<span>Ask people so they talk about themselves. They are not really interested in you. Use meetup.com to find groups you are interested and build up the network over time. Don&#39;t drink on social networking events even when others do. Talking to other people at events only has upsides. Just saying "hi" and introducing yourself is enough. What worse can happen? If the person rejects you so what, life goes on. Ask open questions and no "yes" and "no" questions. E.g.: "What is your story, why are you here?".</span><br />
<br />
-<h2 style='display: inline' id='Publicspeaking'>Public speaking</h2><br />
+<h2 style='display: inline' id='public-speaking'>Public speaking</h2><br />
<br />
<span>Before your talk go on stage 10 minutes in advance. Introduce yourself to the front row people. During the talk they will smile at you and encourage you during your talk.</span><br />
<br />
@@ -3997,9 +3991,9 @@ http://www.gnu.org/software/src-highlite -->
</ul><br />
<span>Just do it. Just go to conferences. Even if you are not speaking. Sell your boss what you would learn and "this and that" and you would present the learnings to the team afterwards.</span><br />
<br />
-<h1 style='display: inline' id='Newjob'>New job</h1><br />
+<h1 style='display: inline' id='new-job'>New job</h1><br />
<br />
-<h2 style='display: inline' id='Fortheinterview'>For the interview</h2><br />
+<h2 style='display: inline' id='for-the-interview'>For the interview</h2><br />
<br />
<ul>
<li>Build up a network before the interview. E.g., follow and comment blogs. Or go to meet-ups and conferences. Join user groups.</li>
@@ -4008,7 +4002,7 @@ http://www.gnu.org/software/src-highlite -->
</ul><br />
<span>If you are specialized then there is a better chance to get a fitting job. No one will hire a general lawyer if there are specialized lawyers available. Even if you are specialized, you will have a wide range of skills (T-shape knowledge).</span><br />
<br />
-<h2 style='display: inline' id='Findtherighttypeofcompany'>Find the right type of company</h2><br />
+<h2 style='display: inline' id='find-the-right-type-of-company'>Find the right type of company</h2><br />
<br />
<span>Not all companies are equal. They have individual cultures and guidelines.</span><br />
<br />
@@ -4020,7 +4014,7 @@ http://www.gnu.org/software/src-highlite -->
</ul><br />
<span>Work in a tech. company if you want to work on/with cutting edge technologies.</span><br />
<br />
-<h2 style='display: inline' id='Applyforthenewjob'>Apply for the new job</h2><br />
+<h2 style='display: inline' id='apply-for-the-new-job'>Apply for the new job</h2><br />
<br />
<span>Get a professional resume writer. Get referrals of writers and get samples from there. Get sufficient with algorithm and data structures interview questions. Cracking the coding interview book and blog </span><br />
<br />
@@ -4033,7 +4027,7 @@ http://www.gnu.org/software/src-highlite -->
</ul><br />
<span>Invest in your dress code as appearance masters. It does make sense to invest in your style. You could even hire a professional stylist (not my personal way though).</span><br />
<br />
-<h2 style='display: inline' id='Negotiation'>Negotiation</h2><br />
+<h2 style='display: inline' id='negotiation'>Negotiation</h2><br />
<br />
<ul>
<li>Whoever names the number first loses. You don&#39;t know what someone else is expecting unless told. Low ball number may be an issue but you have to know the market.</li>
@@ -4051,21 +4045,21 @@ http://www.gnu.org/software/src-highlite -->
<ul>
<li>Never spilt the difference is the best book for learning negotiation techniques..</li>
</ul><br />
-<h2 style='display: inline' id='Leavingtheoldjob'>Leaving the old job</h2><br />
+<h2 style='display: inline' id='leaving-the-old-job'>Leaving the old job</h2><br />
<br />
<span>When leaving a job make a clean and non personal as possible. Never complain and never explain. Don&#39;t worry about abandonment of the team. Everybody is replacement and you make a business decision. Don&#39;t threaten to quit as you are replaceable.</span><br />
<br />
-<h1 style='display: inline' id='Otherthings'>Other things</h1><br />
+<h1 style='display: inline' id='other-things'>Other things</h1><br />
<br />
<ul>
<li>As a leader lead by example and don&#39;t lead from the Eiffel tower.</li>
<li>As a leader you are responsible for the team. If the team fails then it&#39;s your fault only.</li>
</ul><br />
-<h2 style='display: inline' id='Testing'>Testing</h2><br />
+<h2 style='display: inline' id='testing'>Testing</h2><br />
<br />
<span>Unit testing Vs regression testing: Unit tests test the smallest possible unit and get rewritten if the unit gets changed. It&#39;s like programming against a specification n. Regression tests test whether the software still works after the change. Now you know more than most software engineers.</span><br />
<br />
-<h2 style='display: inline' id='Bookstoread'>Books to read</h2><br />
+<h2 style='display: inline' id='books-to-read'>Books to read</h2><br />
<br />
<ul>
<li>Clean Code</li>
@@ -4113,13 +4107,13 @@ http://www.gnu.org/software/src-highlite -->
<summary>Gogios is a minimalistic and easy-to-use monitoring tool I programmed in Google Go designed specifically for small-scale self-hosted servers and virtual machines. The primary purpose of Gogios is to monitor my personal server infrastructure for `foo.zone`, my MTAs, my authoritative DNS servers, my NextCloud, Wallabag and Anki sync server installations, etc.</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline' id='KISSservermonitoringwithGogios'>KISS server monitoring with Gogios</h1><br />
+ <h1 style='display: inline' id='kiss-server-monitoring-with-gogios'>KISS server monitoring with Gogios</h1><br />
<br />
<span class='quote'>Published at 2023-06-01T21:10:17+03:00</span><br />
<br />
<a href='./kiss-server-monitoring-with-gogios/gogios-small.png'><img alt='Gogios logo' title='Gogios logo' src='./kiss-server-monitoring-with-gogios/gogios-small.png' /></a><br />
<br />
-<h2 style='display: inline' id='Introduction'>Introduction</h2><br />
+<h2 style='display: inline' id='introduction'>Introduction</h2><br />
<br />
<span>Gogios is a minimalistic and easy-to-use monitoring tool I programmed in Google Go designed specifically for small-scale self-hosted servers and virtual machines. The primary purpose of Gogios is to monitor my personal server infrastructure for <span class='inlinecode'>foo.zone</span>, my MTAs, my authoritative DNS servers, my NextCloud, Wallabag and Anki sync server installations, etc.</span><br />
<br />
@@ -4150,7 +4144,7 @@ The original can be found at
https://asciiart.website/index.php?art=objects/computers
</pre>
<br />
-<h2 style='display: inline' id='Motivation'>Motivation</h2><br />
+<h2 style='display: inline' id='motivation'>Motivation</h2><br />
<br />
<span>With experience in monitoring solutions like Nagios, Icinga, Prometheus and OpsGenie, these tools often came with many features that I didn&#39;t necessarily need for personal use. Contact groups, host groups, check clustering, and the requirement of operating a DBMS and a WebUI added complexity and bloat to my monitoring setup.</span><br />
<br />
@@ -4158,7 +4152,7 @@ https://asciiart.website/index.php?art=objects/computers
<br />
<span>This led me to create Gogios, a lightweight monitoring tool tailored to my specific needs. I chose the Go programming language for this project as it comes, in my opinion, with the best balance of ease to use and performance.</span><br />
<br />
-<h2 style='display: inline' id='Features'>Features</h2><br />
+<h2 style='display: inline' id='features'>Features</h2><br />
<br />
<ul>
<li>Compatible with Nagios Check scripts: Gogios leverages the widely-used Nagios Check API, allowing to use existing Nagios plugins.</li>
@@ -4169,7 +4163,7 @@ https://asciiart.website/index.php?art=objects/computers
<li>Email Notifications: Gogios can send email notifications regarding the status of monitored services, ensuring you stay informed about potential issues.</li>
<li>CRON-based Execution: Gogios can be quickly scheduled to run periodically via CRON, allowing you to automate monitoring without needing a complex setup.</li>
</ul><br />
-<h2 style='display: inline' id='Examplealert'>Example alert</h2><br />
+<h2 style='display: inline' id='example-alert'>Example alert</h2><br />
<br />
<span>This is an example alert report received via E-Mail. Whereas, <span class='inlinecode'>[C:2 W:0 U:0 OK:51]</span> means that we&#39;ve got two alerts in status critical, 0 warnings, 0 unknowns and 51 OKs.</span><br />
<br />
@@ -4191,9 +4185,9 @@ CRITICAL: Check ICMP6 vulcan.buetow.org: Check command timed out
Have a nice day!
</pre>
<br />
-<h2 style='display: inline' id='Installation'>Installation</h2><br />
+<h2 style='display: inline' id='installation'>Installation</h2><br />
<br />
-<h3 style='display: inline' id='CompilingandinstallingGogios'>Compiling and installing Gogios</h3><br />
+<h3 style='display: inline' id='compiling-and-installing-gogios'>Compiling and installing Gogios</h3><br />
<br />
<span>This document is primarily written for OpenBSD, but applying the corresponding steps to any Unix-like (e.g. Linux-based) operating system should be easy. On systems other than OpenBSD, you may always have to replace <span class='inlinecode'>does</span> with the <span class='inlinecode'>sudo</span> command and replace the <span class='inlinecode'>/usr/local/bin</span> path with <span class='inlinecode'>/usr/bin</span>.</span><br />
<br />
@@ -4225,7 +4219,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<a class='textlink' href='https://www.rexify.org'>https://www.rexify.org</a><br />
<br />
-<h3 style='display: inline' id='Settingupusergroupanddirectories'>Setting up user, group and directories</h3><br />
+<h3 style='display: inline' id='setting-up-user-group-and-directories'>Setting up user, group and directories</h3><br />
<br />
<span>It is best to create a dedicated system user and group for Gogios to ensure proper isolation and security. Here are the steps to create the <span class='inlinecode'>_gogios</span> user and group under OpenBSD:</span><br />
<br />
@@ -4242,7 +4236,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>Please note that creating a user and group might differ depending on your operating system. For other operating systems, consult their documentation for creating system users and groups.</span><br />
<br />
-<h3 style='display: inline' id='Installingmonitoringplugins'>Installing monitoring plugins</h3><br />
+<h3 style='display: inline' id='installing-monitoring-plugins'>Installing monitoring plugins</h3><br />
<br />
<span>Gogios relies on external Nagios or Icinga monitoring plugin scripts. On OpenBSD, you can install the <span class='inlinecode'>monitoring-plugins</span> package with Gogios. The monitoring-plugins package is a collection of monitoring plugins, similar to Nagios plugins, that can be used to monitor various services and resources:</span><br />
<br />
@@ -4256,9 +4250,9 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>Once the installation is complete, you can find the monitoring plugins in the <span class='inlinecode'>/usr/local/libexec/nagios</span> directory, which then can be configured to be used in <span class='inlinecode'>gogios.json</span>.</span><br />
<br />
-<h2 style='display: inline' id='Configuration'>Configuration</h2><br />
+<h2 style='display: inline' id='configuration'>Configuration</h2><br />
<br />
-<h3 style='display: inline' id='MTA'>MTA</h3><br />
+<h3 style='display: inline' id='mta'>MTA</h3><br />
<br />
<span>Gogios requires a local Mail Transfer Agent (MTA) such as Postfix or OpenBSD SMTPD running on the same server where the CRON job (see about the CRON job further below) is executed. The local MTA handles email delivery, allowing Gogios to send email notifications to monitor status changes. Before using Gogios, ensure that you have a properly configured MTA installed and running on your server to facilitate the sending of emails. Once the MTA is set up and functioning correctly, Gogios can leverage it to send email notifications.</span><br />
<br />
@@ -4270,7 +4264,7 @@ echo &#39;This is a test email from OpenBSD.&#39; | mail -s &#39;Test Email&#39;
<br />
<span>Check the recipient&#39;s inbox to confirm the delivery of the test email. If the email is delivered successfully, it indicates that your email server is configured correctly and functioning. Please check your MTA logs in case of issues.</span><br />
<br />
-<h3 style='display: inline' id='ConfiguringGogios'>Configuring Gogios</h3><br />
+<h3 style='display: inline' id='configuring-gogios'>Configuring Gogios</h3><br />
<br />
<span>To configure Gogios, create a JSON configuration file (e.g., <span class='inlinecode'>/etc/gogios.json</span>). Here&#39;s an example configuration:</span><br />
<br />
@@ -4333,7 +4327,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>The <span class='inlinecode'>state.json</span> file mentioned above keeps track of the monitoring state and check results between Gogios runs, enabling Gogios only to send email notifications when there are changes in the check status.</span><br />
<br />
-<h2 style='display: inline' id='RunningGogios'>Running Gogios</h2><br />
+<h2 style='display: inline' id='running-gogios'>Running Gogios</h2><br />
<br />
<span>Now it is time to give it a first run. On OpenBSD, do:</span><br />
<br />
@@ -4355,7 +4349,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>Gogios is now configured to run every five minutes from 8 am to 10 pm via CRON as the <span class='inlinecode'>_gogios</span> user. It will execute the checks and send monitoring status whenever a check status changes via email according to your configuration. Also, Gogios will run once at 7 am every morning and re-notify all unhandled alerts as a reminder.</span><br />
<br />
-<h3 style='display: inline' id='Highavailability'>High-availability</h3><br />
+<h3 style='display: inline' id='high-availability'>High-availability</h3><br />
<br />
<span>To create a high-availability Gogios setup, you can install Gogios on two servers that will monitor each other using the NRPE (Nagios Remote Plugin Executor) plugin. By running Gogios in alternate CRON intervals on both servers, you can ensure that even if one server goes down, the other will continue monitoring your infrastructure and sending notifications.</span><br />
<br />
@@ -4368,7 +4362,7 @@ http://www.gnu.org/software/src-highlite -->
</ul><br />
<span>There are plans to make it possible to execute certain checks only on certain nodes (e.g. on elected leader or master nodes). This is still in progress (check out my Gorum Git project).</span><br />
<br />
-<h2 style='display: inline' id='Conclusion'>Conclusion:</h2><br />
+<h2 style='display: inline' id='conclusion'>Conclusion:</h2><br />
<br />
<span>Gogios is a lightweight and straightforward monitoring tool that is perfect for small-scale environments. With its compatibility with the Nagios Check API, email notifications, and CRON-based scheduling, Gogios offers an easy-to-use solution for those looking to monitor a limited number of resources. I personally use it to execute around 500 checks on my personal server infrastructure. I am very happy with this solution.</span><br />
<br />
@@ -4397,7 +4391,7 @@ http://www.gnu.org/software/src-highlite -->
<summary>These are my personal takeaways after reading 'The Obstacle Is the Way' by Ryan Holiday. 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' id='TheObstacleistheWaybooknotes'>"The Obstacle is the Way" book notes</h1><br />
+ <h1 style='display: inline' id='the-obstacle-is-the-way-book-notes'>"The Obstacle is the Way" book notes</h1><br />
<br />
<span class='quote'>Published at 2023-05-06T17:23:16+03:00</span><br />
<br />
@@ -4418,7 +4412,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>"The obstacle is the way" is a powerful statement that encapsulates the wisdom of turning challenges into opportunities for growth and success. We will explore using obstacles as fuel, transforming weaknesses into strengths, and adopting a mindset that allows us to be creative and persistent in the face of adversity.</span><br />
<br />
-<h2 style='display: inline' id='Reframeyourperspective'>Reframe your perspective</h2><br />
+<h2 style='display: inline' id='reframe-your-perspective'>Reframe your perspective</h2><br />
<br />
<span>The obstacle in your path can become your path to success. Instead of being paralyzed by challenges, see them as opportunities to learn and grow. Remember, the things that hurt us often instruct us. </span><br />
<br />
@@ -4427,37 +4421,37 @@ http://www.gnu.org/software/src-highlite -->
<span>Don&#39;t always try to use the front door; a backdoor could open. It&#39;s nonsense. Don&#39;t fight the judo master with judo. Non-action can be action, exposing the weaknesses of others.</span><br />
<br />
<br />
-<h2 style='display: inline' id='Embracerationality'>Embrace rationality</h2><br />
+<h2 style='display: inline' id='embrace-rationality'>Embrace rationality</h2><br />
<br />
<span>It is a superpower to see things rationally when others are fearful. Focus on the reality of the situation without letting emotions, such as anger, cloud your judgment. This ability will enable you to make better decisions in adversity. Ability to see things what they really are. E.g. wine is old fermented grapes, or other people behaving like animals during a fight. Show the middle finger if someone persists on the stupid rules occasionally.</span><br />
<br />
-<h2 style='display: inline' id='Controlyourresponse'>Control your response</h2><br />
+<h2 style='display: inline' id='control-your-response'>Control your response</h2><br />
<br />
<span>You can choose how you respond to obstacles. Focus on what you can control, and don&#39;t let yourself feel harmed by external circumstances. Remember, you decide how things affect you; nobody else does. Choose to feel good in response to any situation. Embrace the challenges and obstacles that come your way, as they are opportunities for growth and learning.</span><br />
<br />
-<h2 style='display: inline' id='Practiceemotionalandphysicalresilience'>Practice emotional and physical resilience</h2><br />
+<h2 style='display: inline' id='practice-emotional-and-physical-resilience'>Practice emotional and physical resilience</h2><br />
<br />
<span>Martial artists know the importance of developing physical and emotional strength. Cultivate the art of not panicking; it will help you avoid making mistakes during high-pressure situations.</span><br />
<br />
<span>Focus on what you can control. Don&#39;t choose to feel harmed, and then you won&#39;t be harmed. I decide things that affect me; nobody else does. E.g., in prison, your mind stays your own. Don&#39;t ignore fear but explain it away, have a different view.</span><br />
<br />
-<h2 style='display: inline' id='Persistenceandpatience'>Persistence and patience</h2><br />
+<h2 style='display: inline' id='persistence-and-patience'>Persistence and patience</h2><br />
<br />
<span>Practice persistence and patience in your pursuits. Focus on the process rather than the prize and take one step at a time. Remember, the journey is about finishing tasks, projects, or workouts to the best of your ability. Never be in a hurry and never be desperate. There is no reason to be rushed; there are all in the long haul. Follow the process and not the price. Take it one step at a time. The process is about finishing (workout, task, project, etc.).</span><br />
<br />
-<h2 style='display: inline' id='Embracefailure'>Embrace failure</h2><br />
+<h2 style='display: inline' id='embrace-failure'>Embrace failure</h2><br />
<br />
<span>Failure is a natural part of life and can make us stronger. Treat defeat as a stepping stone to success and education. What is defeat? The first step to education. Failure makes you stronger. If we do our best, we can be proud of it, regardless of the result. Do your job, but do it right. Only an asshole thinks he is too good at the things he does. Also, asking for forgiveness is easier than asking for permission. </span><br />
<br />
-<h2 style='display: inline' id='Beadaptable'>Be adaptable</h2><br />
+<h2 style='display: inline' id='be-adaptable'>Be adaptable</h2><br />
<br />
<span>There are many ways to achieve your goals; sometimes, unconventional methods are necessary. Feel free to break the rules or go off the beaten path if it will lead to better results. Transform weaknesses into strengths. We have a choice of how to respond to things. It&#39;s not about being positive but to be creative. Aim high, but stuff will happen; E.g., surprises will always happen.</span><br />
<br />
-<h2 style='display: inline' id='Embracenonaction'>Embrace non-action</h2><br />
+<h2 style='display: inline' id='embrace-non-action'>Embrace non-action</h2><br />
<br />
<span>We constantly push to the next thing. Sometimes the best course of action is standing still or even going backwards. Obstacles might resolve by themselves. Or going sideways. Sometimes, the best action is to stand still, go sideways, or even go backwards. Obstacles may resolve themselves or present new opportunities if you&#39;re patient and observant. People always want your input before you have all the facts. They want you to play after their rules. The question is, do you let them? The English call it the cool head. Being in control of Stress; requires practice. Appear, the absence of fear (Greek). When all others do it one way, it does not mean it is the correct or best practice.</span><br />
<br />
-<h2 style='display: inline' id='Leveragecrisis'>Leverage crisis</h2><br />
+<h2 style='display: inline' id='leverage-crisis'>Leverage crisis</h2><br />
<br />
<span>In times of crisis, seize the chance to do things never done before. Great people use negative situations to their advantage and become the most effective in challenging circumstances.</span><br />
<br />
@@ -4465,19 +4459,19 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>Be prepared for nothing to work. Problems are an opportunity to do your best, not to do miracles. Always manage your expectations. It will suck, but it will be ok. Be prepared to begin from the beginning. Be cheerful and eagerly work on the next obstacle. Each time you become better. Life is not a sprint but a marathon. After each obstacle lies another obstacle, there won&#39;t be anything without obstacles. Passing one means you are ready for the next.</span><br />
<br />
-<h2 style='display: inline' id='Buildyourinnercitadel'>Build your inner citadel</h2><br />
+<h2 style='display: inline' id='build-your-inner-citadel'>Build your inner citadel</h2><br />
<br />
<span>Develop your inner strength during good times so you can rely on it in bad times. Always prepare for adversity and face it with calmness and resilience. Be humble enough that things which happen will happen. Build your inner citadel. In good times strengthen it. In bad times rely on it.</span><br />
<br />
<span>We should always prepare for things to get tough. Your house burns down: no worries, we eliminated much rubbish. Imagine what can go wrong before things go wrong. We are prepared for adversity; it&#39;s other people who aren&#39;t. Phil Jackson&#39;s hip problem example. To receive unexpected benefits, you must first accept the unexpected obstacles. Meditate on death. It&#39;s a universal obstacle. Use it as a reminder to do your best.</span><br />
<br />
-<h2 style='display: inline' id='Loveeverythingthathappens'>Love everything that happens</h2><br />
+<h2 style='display: inline' id='love-everything-that-happens'>Love everything that happens</h2><br />
<br />
<span>Turn an obstacle the other way around for your benefit. Use it at fuel. It&#39;s simple but challenging. Most are paralyzed instead. The obstacle in the path becomes the path. Obstacles are neither good nor bad. The things which hurt, instruct.</span><br />
<br />
<span>Should I hate people who hate me? That&#39;s their problem and not mine. Be always calm and relaxed during the fight. The story of the battle is the story of the smile. Cheerfulness in all situations, especially the bad ones. Love for everything that happens; if it happens, it was meant to happen. We can choose how we react to things, so why not choose to feel good? I love everything that happens. You must never lower yourself to the person you don&#39;t like.</span><br />
<br />
-<h2 style='display: inline' id='Conclusion'>Conclusion</h2><br />
+<h2 style='display: inline' id='conclusion'>Conclusion</h2><br />
<br />
<span>Life is a marathon, not a sprint. Each obstacle we overcome prepares us for the next one. Remember, the obstacle is not just a barrier to be turned upside down; it can also be used as a catapult to propel us forward. By embracing challenges and using them as opportunities for growth, we become stronger, more adaptable, and, ultimately, more successful.</span><br />
<br />
@@ -4510,7 +4504,7 @@ http://www.gnu.org/software/src-highlite -->
<summary>For fun, I am tracking the uptime of various personal machines (servers, laptops, workstations...). I have been doing this for over ten years now, so I have a lot of statistics collected.</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline' id='UnveilingguprecordsrakuGlobalUptimeRecordswithRaku'>Unveiling <span class='inlinecode'>guprecords.raku</span>: Global Uptime Records with Raku</h1><br />
+ <h1 style='display: inline' id='unveiling-guprecordsraku-global-uptime-records-with-raku'>Unveiling <span class='inlinecode'>guprecords.raku</span>: Global Uptime Records with Raku</h1><br />
<br />
<span class='quote'>Published at 2023-04-30T13:10:26+03:00</span><br />
<br />
@@ -4531,7 +4525,7 @@ http://www.gnu.org/software/src-highlite -->
+-----+-----------------+-----------------------------+
</pre>
<br />
-<h1 style='display: inline' id='Introduction'>Introduction</h1><br />
+<h1 style='display: inline' id='introduction'>Introduction</h1><br />
<br />
<span>For fun, I am tracking the uptime of various personal machines (servers, laptops, workstations...). I have been doing this for over ten years now, so I have a lot of statistics collected.</span><br />
<br />
@@ -4554,7 +4548,7 @@ http://www.gnu.org/software/src-highlite -->
</ul><br />
<span>And I have been following the Raku newsletter, and sometimes I have been lurking around in the IRC channels, too. Watching Raku coding challenges on YouTube was pretty fun, too. However, nothing beats actually using Raku to learn the language. After reading all of these resources, I may have a good idea about the features and paradigms, but I am by far not an expert.</span><br />
<br />
-<h2 style='display: inline' id='HowGuprecordsworks'>How Guprecords works</h2><br />
+<h2 style='display: inline' id='how-guprecords-works'>How Guprecords works</h2><br />
<br />
<span>Guprecords works in three stages:</span><br />
<br />
@@ -4580,7 +4574,7 @@ http://www.gnu.org/software/src-highlite -->
<li>Output formats available: Plaintext, Markdown, and Gemtext</li>
<li>Provides top entries based on the specified limit</li>
</ul><br />
-<h2 style='display: inline' id='Example'>Example</h2><br />
+<h2 style='display: inline' id='example'>Example</h2><br />
<br />
<span>You have already seen an example at the very top of this post, where the hosts were grouped by their total lifespans (uptime+downtime). Here&#39;s an example of what the global uptime report (grouped by total host uptimes) might look like:</span><br />
<br />
@@ -4651,7 +4645,7 @@ no1 in 455 days, 18:52:44 | at Sun Jul 21 07:37:51 2024
%up 99.997 | since Tue Dec 18 10:16:08 2018
</pre>
<br />
-<h2 style='display: inline' id='Conclusion'>Conclusion</h2><br />
+<h2 style='display: inline' id='conclusion'>Conclusion</h2><br />
<br />
<span>Guprecords is a small, yet powerful tool for analyzing uptime statistics. While developing Guprecords, I have come to truly appreciate and love Raku&#39;s expressiveness. The language is designed to be both powerful and flexible, allowing developers to express their intentions and logic more clearly and concisely.</span><br />
<br />
@@ -4692,7 +4686,7 @@ no1 in 455 days, 18:52:44 | at Sun Jul 21 07:37:51 2024
<summary>This is the first blog post about my Algorithms and Data Structures in Go series. I am not a Software Developer in my day job. In my current role, programming and scripting skills are desirable but not mandatory. I have been learning about Data Structures and Algorithms many years ago at University. I thought it would be fun to revisit/refresh my knowledge here and implement many of the algorithms in Go.</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline' id='AlgorithmsandDataStructuresinGoPart1'>Algorithms and Data Structures in Go - Part 1</h1><br />
+ <h1 style='display: inline' id='algorithms-and-data-structures-in-go---part-1'>Algorithms and Data Structures in Go - Part 1</h1><br />
<br />
<span class='quote'>Published at 2023-04-09T22:31:42+03:00</span><br />
<br />
@@ -4716,7 +4710,7 @@ no1 in 455 days, 18:52:44 | at Sun Jul 21 07:37:51 2024
<br />
<span>This post is about setting up some basic data structures and methods for this blog series. I promise, everything will be easy to follow in this post. It will become more interesting later in this series.</span><br />
<br />
-<h2 style='display: inline' id='Typeconstraints'>Type constraints</h2><br />
+<h2 style='display: inline' id='type-constraints'>Type constraints</h2><br />
<br />
<span>First, the package <span class='inlinecode'>ds</span> (data structures) defines the <span class='inlinecode'>types.go</span>. All examples will either operate on the <span class='inlinecode'>Integer</span> or <span class='inlinecode'>Number</span> type:</span><br />
<br />
@@ -4740,7 +4734,7 @@ http://www.gnu.org/software/src-highlite -->
</pre>
<br />
-<h2 style='display: inline' id='ArrayList'>ArrayList</h2><br />
+<h2 style='display: inline' id='arraylist'>ArrayList</h2><br />
<br />
<span>Next comes the <span class='inlinecode'>arraylist.go</span>, which defines the underlying data structure all the algorithms of this series will use. <span class='inlinecode'>ArrayList</span> is just a type alias of a Go array (or slice) with custom methods on it:</span><br />
<br />
@@ -4800,7 +4794,7 @@ http://www.gnu.org/software/src-highlite -->
<font color="#F3E651">}</font>
</pre>
<br />
-<h2 style='display: inline' id='Helpermethods'>Helper methods</h2><br />
+<h2 style='display: inline' id='helper-methods'>Helper methods</h2><br />
<br />
<span>The <span class='inlinecode'>FirstN</span> method only returns the first N elements of the <span class='inlinecode'>ArrayList</span>. This is useful for printing out only parts of the data structure:</span><br />
<br />
@@ -4859,7 +4853,7 @@ http://www.gnu.org/software/src-highlite -->
</pre>
<br />
-<h2 style='display: inline' id='Sleepsort'>Sleep sort</h2><br />
+<h2 style='display: inline' id='sleep-sort'>Sleep sort</h2><br />
<br />
<span>Let&#39;s implement our first algorithm, sleep sort. Sleep sort is a non-traditional and unconventional sorting algorithm based on the idea of waiting a certain amount of time corresponding to the value of each element in the input <span class='inlinecode'>ArrayList</span>. It&#39;s more of a fun, creative concept rather than an efficient or practical sorting technique. This is not a sorting algorithm you would use in any production code. As you can imagine, it is quite an inefficient sorting algorithm (it&#39;s only listed here as a warm-up exercise). This sorting method may also return false results depending on how the Goroutines are scheduled by the Go runtime. </span><br />
<br />
@@ -4906,7 +4900,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>This Go code implements the sleep sort algorithm using generics and goroutines. The main function <span class='inlinecode'>Sleep[V ds.Integer](a ds.ArrayList[V]) ds.ArrayList[V]</span> takes a generic <span class='inlinecode'>ArrayList</span> as input and returns a sorted <span class='inlinecode'>ArrayList</span>. The code creates a separate goroutine for each element in the input array, sleeps for a duration proportional to the element&#39;s value, and then sends the element to a channel. Another goroutine waits for all the sleeping goroutines to finish and then closes the channel. The sorted result <span class='inlinecode'>ArrayList</span> is constructed by appending the elements received from the channel in the order they arrive. The <span class='inlinecode'>sync.WaitGroup</span> is used to synchronize goroutines and ensure that all of them have completed before closing the channel.</span><br />
<br />
-<h3 style='display: inline' id='Testing'>Testing</h3><br />
+<h3 style='display: inline' id='testing'>Testing</h3><br />
<br />
<span>For testing, we only allow values up to 10, as otherwise, it would take too long to finish:</span><br />
<br />
@@ -4965,7 +4959,7 @@ http://www.gnu.org/software/src-highlite -->
<summary>These are my personal takeaways after reading 'Never split the difference' by Chris Voss. 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' id='Neversplitthedifferencebooknotes'>"Never split the difference" book notes</h1><br />
+ <h1 style='display: inline' id='never-split-the-difference-book-notes'>"Never split the difference" book notes</h1><br />
<br />
<span class='quote'>Published at 2023-04-01T20:00:17+03:00</span><br />
<br />
@@ -4983,7 +4977,7 @@ http://www.gnu.org/software/src-highlite -->
&#39;&#39;&#39;
</pre>
<br />
-<h2 style='display: inline' id='Tacticallisteningspreadingempathy'>Tactical listening, spreading empathy</h2><br />
+<h2 style='display: inline' id='tactical-listening-spreading-empathy'>Tactical listening, spreading empathy</h2><br />
<br />
<span>Be a mirror, copy each other to be comfy with each other to build up trust. Mirroring is mainly body language. A mirror is to repeat the words the other just said. Simple but effective.</span><br />
<br />
@@ -4994,7 +4988,7 @@ http://www.gnu.org/software/src-highlite -->
</ul><br />
<span>Mirror training is like Jedi training. Simple but effective. A mirror needs space. Be silent after "you want this?" </span><br />
<br />
-<h2 style='display: inline' id='Mindsetofdiscovery'>Mindset of discovery</h2><br />
+<h2 style='display: inline' id='mindset-of-discovery'>Mindset of discovery</h2><br />
<br />
<span>Try to have multiple realities in your mind and use facts to distinguish between real and false.</span><br />
<br />
@@ -5006,7 +5000,7 @@ http://www.gnu.org/software/src-highlite -->
</ul><br />
<span>Try: to put a label on someone&#39;s emotion and then be silent. Wait for the other to reveal himself. "You seem unhappy about this?"</span><br />
<br />
-<h3 style='display: inline' id='Moretips'>More tips </h3><br />
+<h3 style='display: inline' id='more-tips-'>More tips </h3><br />
<br />
<ul>
<li>Put on a poker face and don&#39;t show emotions.</li>
@@ -5015,7 +5009,7 @@ http://www.gnu.org/software/src-highlite -->
<li>Being right is not the key to successful negotiation; being mindful is.</li>
<li>Be in the safe zone of empathy and acknowledge bad news.</li>
</ul><br />
-<h2 style='display: inline' id='Nostartstheconversation'>"No" starts the conversation</h2><br />
+<h2 style='display: inline' id='no-starts-the-conversation'>"No" starts the conversation</h2><br />
<br />
<span>When the opponent starts with a "no", he feels in control and comfortable. That&#39;s why he has to start with "no".</span><br />
<br />
@@ -5028,11 +5022,11 @@ http://www.gnu.org/software/src-highlite -->
</ul><br />
<span>Get a "That&#39;s right" when negotiating. Don&#39;t get a "you&#39;re right". You can summarise the opponent to get a "that&#39;s right".</span><br />
<br />
-<h2 style='display: inline' id='Winwin'>Win-win</h2><br />
+<h2 style='display: inline' id='win-win'>Win-win</h2><br />
<br />
<span>Win-win is a naive approach when encountering the win-lose counterpart, but always cooperate. Don&#39;t compromise, and don&#39;t split the difference. We don&#39;t compromise because it&#39;s right; we do it because it is easy. You must embrace the hard stuff; that&#39;s where the great deals are.</span><br />
<br />
-<h2 style='display: inline' id='OnDeadlines'>On Deadlines</h2><br />
+<h2 style='display: inline' id='on-deadlines'>On Deadlines</h2><br />
<br />
<ul>
<li>All deadlines are imaginary.</li>
@@ -5040,7 +5034,7 @@ http://www.gnu.org/software/src-highlite -->
<li>They push a deal to a conclusion.</li>
<li>They rush the counterpart to cause pressure and anxiety.</li>
</ul><br />
-<h2 style='display: inline' id='Analysetheopponent'>Analyse the opponent</h2><br />
+<h2 style='display: inline' id='analyse-the-opponent'>Analyse the opponent</h2><br />
<br />
<ul>
<li>Understand the motivation of people behind the table as well.</li>
@@ -5050,7 +5044,7 @@ http://www.gnu.org/software/src-highlite -->
</ul><br />
<span>The person on the other side is never the issue; the problem is the issue. Keep this in mind to avoid emotional issues with the person and focus on the problem, not the person. The bond is essential; never create an enemy.</span><br />
<br />
-<h2 style='display: inline' id='Usedifferentwaysofsayingno'>Use different ways of saying "no."</h2><br />
+<h2 style='display: inline' id='use-different-ways-of-saying-no'>Use different ways of saying "no."</h2><br />
<br />
<span class='quote'>I had paid my rent always in time. I had positive experiences with the building and would be sad for the landlord to lose a good tenant. I am looking for a win-win agreement between us. Pulling out the research, other neighbours offer much lower prices even if your building is a better location and services. How can I effort 200 more.... </span><br />
<br />
@@ -5058,7 +5052,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>You always have to embrace thoughtful confrontation for good negotiation and life. Don&#39;t avoid honest, clear conflict. It will give you the best deals. Compromises are mostly bad deals for both sides. Most people don&#39;t negotiate a win-win but a win-lose. Know the best and worst outcomes and what is acceptable for you.</span><br />
<br />
-<h2 style='display: inline' id='Calibratedquestion'>Calibrated question</h2><br />
+<h2 style='display: inline' id='calibrated-question'>Calibrated question</h2><br />
<br />
<span>Calibrated questions. Give the opponent a sense of power. Ask open-how questions to get the opponent to solve your problem and move him in your direction. Calibrated questions are the best tools. Summarise everything, and then ask, "how I am supposed to do that?". Asking for help this way with a calibrated question is a powerful tool for joint problem solving</span><br />
<br />
@@ -5074,11 +5068,11 @@ http://www.gnu.org/software/src-highlite -->
</ul><br />
<span>Prepare 3 to 5 calibrated questions for your counterpart. Be curious what is really motivating the other side. You can get out the "Black Swan".</span><br />
<br />
-<h2 style='display: inline' id='Theblackswan'>The black swan </h2><br />
+<h2 style='display: inline' id='the-black-swan-'>The black swan </h2><br />
<br />
<span>What we don&#39;t know can break our deal. Uncovering it can bring us unexpected success. You get what you ask for in this world, but you must learn to ask correctly. Reveal the black swan by asking questions.</span><br />
<br />
-<h2 style='display: inline' id='More'>More</h2><br />
+<h2 style='display: inline' id='more'>More</h2><br />
<br />
<span>Establish a range at top places like corp. I get... (e.g. remote London on a project basis). Set a high salary range and not a number. Also, check on LinkedIn premium for the salaries.</span><br />
<br />
@@ -5123,7 +5117,7 @@ http://www.gnu.org/software/src-highlite -->
<summary>I proudly announce that I've released Gemtexter version `2.0.0`. What is Gemtexter? It's my minimalist static site generator for Gemini Gemtext, HTML and Markdown written in GNU Bash.</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline' id='Gemtexter200LetsGemtextagain'>Gemtexter 2.0.0 - Let&#39;s Gemtext again²</h1><br />
+ <h1 style='display: inline' id='gemtexter-200---lets-gemtext-again'>Gemtexter 2.0.0 - Let&#39;s Gemtext again²</h1><br />
<br />
<span class='quote'>Published at 2023-03-25T17:50:32+02:00</span><br />
<br />
@@ -5148,7 +5142,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>Let&#39;s list what&#39;s new!</span><br />
<br />
-<h2 style='display: inline' id='Minimaltemplateengine'>Minimal template engine</h2><br />
+<h2 style='display: inline' id='minimal-template-engine'>Minimal template engine</h2><br />
<br />
<span>Gemtexter now supports templating, enabling dynamically generated content to <span class='inlinecode'>.gmi</span> files before converting anything to any output format like HTML and Markdown.</span><br />
<br />
@@ -5214,7 +5208,7 @@ See more entries about DTail and Golang:
Blablabla...
</pre>
<br />
-<h2 style='display: inline' id='Addedhooks'>Added hooks</h2><br />
+<h2 style='display: inline' id='added-hooks'>Added hooks</h2><br />
<br />
<span>You can configure <span class='inlinecode'>PRE_GENERATE_HOOK</span> and <span class='inlinecode'>POST_PUBLISH_HOOK</span> to point to scripts to be executed before running <span class='inlinecode'>--generate</span>, or after running <span class='inlinecode'>--publish</span>. E.g. you could populate some of the content by an external script before letting Gemtexter do its thing or you could automatically deploy the site after running <span class='inlinecode'>--publish</span>.</span><br />
<br />
@@ -5228,11 +5222,11 @@ http://www.gnu.org/software/src-highlite -->
<b><font color="#ffffff">declare</font></b><font color="#ff0000"> -xr </font><font color="#ff0000">POST_PUBLISH_HOOK</font><font color="#F3E651">=.</font><font color="#ff0000">/post_publish_hook</font><font color="#F3E651">.</font><font color="#ff0000">sh</font>
</pre>
<br />
-<h2 style='display: inline' id='UseofsaferBashoptions'>Use of safer Bash options</h2><br />
+<h2 style='display: inline' id='use-of-safer-bash-options'>Use of safer Bash options</h2><br />
<br />
<span>Gemtexter now does <span class='inlinecode'>set -euf -o pipefile</span>, which helps to eliminate bugs and to catch scripting errors sooner. Previous versions only <span class='inlinecode'>set -e</span>.</span><br />
<br />
-<h2 style='display: inline' id='Metacachemadeobsolete'>Meta cache made obsolete</h2><br />
+<h2 style='display: inline' id='meta-cache-made-obsolete'>Meta cache made obsolete</h2><br />
<br />
<span>Here is the breaking change to older versions of Gemtexter. The <span class='inlinecode'>$BASE_CONTENT_DIR/meta</span> directory was made obsolete. <span class='inlinecode'>meta</span> was used to store various information about all the blog post entries to make generating an Atom feed in Bash easier. Especially the publishing dates of each post were stored there. Instead, the publishing date is now encoded in the <span class='inlinecode'>.gmi</span> file. And if it is missing, Gemtexter will set it to the current date and time at first run.</span><br />
<br />
@@ -5262,11 +5256,11 @@ http://www.gnu.org/software/src-highlite -->
<font color="#ff0000">The remaining content of the Gemtext file</font><font color="#F3E651">...</font>
</pre>
<br />
-<h2 style='display: inline' id='XMLLintsupport'>XMLLint support</h2><br />
+<h2 style='display: inline' id='xmllint-support'>XMLLint support</h2><br />
<br />
<span>Optionally, when the <span class='inlinecode'>xmllint</span> binary is installed, Gemtexter will perform a simple XML lint check against the Atom feed generated. This is a double-check of whether the Atom feed is a valid XML.</span><br />
<br />
-<h2 style='display: inline' id='More'>More</h2><br />
+<h2 style='display: inline' id='more'>More</h2><br />
<br />
<span>Additionally, there were a couple of bug fixes, refactorings and overall improvements in the documentation made. </span><br />
<br />
@@ -5296,7 +5290,7 @@ http://www.gnu.org/software/src-highlite -->
<summary>These are my personal takeaways after reading 'The Pragmatic Programmer' by David Thomas and Andrew Hunt. 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' id='ThePragmaticProgrammerbooknotes'>"The Pragmatic Programmer" book notes</h1><br />
+ <h1 style='display: inline' id='the-pragmatic-programmer-book-notes'>"The Pragmatic Programmer" book notes</h1><br />
<br />
<span class='quote'>Published at 2023-03-16T00:55:20+02:00</span><br />
<br />
@@ -5347,7 +5341,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>Do what works and not what&#39;s fashionable. E.g. does SCRUM make sense? The goal is to deliver deliverables and not to "become" agile.</span><br />
<br />
-<h2 style='display: inline' id='Continuouslearning'>Continuous learning</h2><br />
+<h2 style='display: inline' id='continuous-learning'>Continuous learning</h2><br />
<br />
<span>Add new tools to your repertoire every day and keep the momentum up. Learning new things is your most crucial aspect. Invest regularly in your knowledge portfolio. The learning process extends your thinking. It does not matter if you will never use it.</span><br />
<br />
@@ -5358,7 +5352,7 @@ http://www.gnu.org/software/src-highlite -->
</ul><br />
<span>Think critically about everything you learn. Use paper for your notes. There is something special about it.</span><br />
<br />
-<h2 style='display: inline' id='Stayconnected'>Stay connected</h2><br />
+<h2 style='display: inline' id='stay-connected'>Stay connected</h2><br />
<br />
<span>It&#39;s your life, and you own it. Bruce Lee once said: </span><br />
<br />
@@ -5371,7 +5365,7 @@ http://www.gnu.org/software/src-highlite -->
</ul><br />
<span>It&#39;s your life. Share it, celebrate it, be proud and have fun.</span><br />
<br />
-<h2 style='display: inline' id='Thestoryofstonesoup'>The story of stone soup</h2><br />
+<h2 style='display: inline' id='the-story-of-stone-soup'>The story of stone soup</h2><br />
<br />
<span>How to motivate others to contribute something (e.g. ideas to a startup):</span><br />
<br />
@@ -5916,7 +5910,7 @@ http://www.gnu.org/software/src-highlite -->
<summary>This will be a quick blog post, as I am busy with my personal life now. I have relocated to a different country and am still busy arranging things. So bear with me :-)</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline' id='InstallingDTailonOpenBSD'>Installing DTail on OpenBSD</h1><br />
+ <h1 style='display: inline' id='installing-dtail-on-openbsd'>Installing DTail on OpenBSD</h1><br />
<br />
<span class='quote'>Published at 2022-10-30T11:03:19+02:00</span><br />
<br />
@@ -5969,7 +5963,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>I will also mention some relevant <span class='inlinecode'>Rexfile</span> snippets in this post!</span><br />
<br />
-<h2 style='display: inline' id='Compileit'>Compile it</h2><br />
+<h2 style='display: inline' id='compile-it'>Compile it</h2><br />
<br />
<span>First of all, DTail needs to be downloaded and compiled. For that, <span class='inlinecode'>git</span>, <span class='inlinecode'>go</span>, and <span class='inlinecode'>gmake</span> are required:</span><br />
<br />
@@ -6004,7 +5998,7 @@ $ doas pkg_delete git go gmake
<br />
<span>One day I shall create an official OpenBSD port for DTail.</span><br />
<br />
-<h2 style='display: inline' id='Installit'>Install it</h2><br />
+<h2 style='display: inline' id='install-it'>Install it</h2><br />
<br />
<span>Installing the binaries is now just a matter of copying them to <span class='inlinecode'>/usr/local/bin</span> as follows:</span><br />
<br />
@@ -6046,7 +6040,7 @@ END
$ doas chmod 755 /etc/rc.d/dserver
</pre>
<br />
-<h3 style='display: inline' id='Rexification'>Rexification</h3><br />
+<h3 style='display: inline' id='rexification'>Rexification</h3><br />
<br />
<span>This is the task for setting it up via Rex. Note the <span class='inlinecode'>. . . .</span>, that&#39;s a placeholder which we will fill up more and more during this blog post:</span><br />
<br />
@@ -6073,7 +6067,7 @@ task &#39;dtail&#39;, group =&gt; &#39;frontends&#39;,
};
</pre>
<br />
-<h2 style='display: inline' id='Configureit'>Configure it</h2><br />
+<h2 style='display: inline' id='configure-it'>Configure it</h2><br />
<br />
<span>Now, DTail is fully installed but still needs to be configured. Grab the default config file from GitHub ...</span><br />
<br />
@@ -6096,7 +6090,7 @@ $ curl https://raw.githubusercontent.com/mimecast/dtail/master/examples/dtail.js
}
</pre>
<br />
-<h3 style='display: inline' id='Rexification'>Rexification</h3><br />
+<h3 style='display: inline' id='rexification'>Rexification</h3><br />
<br />
<span>That&#39;s as simple as adding the following to the Rex task:</span><br />
<br />
@@ -6112,7 +6106,7 @@ file &#39;/etc/dserver/dtail.json&#39;,
on_change =&gt; sub { $restart = TRUE };
</pre>
<br />
-<h2 style='display: inline' id='Updatethekeycacheforit'>Update the key cache for it</h2><br />
+<h2 style='display: inline' id='update-the-key-cache-for-it'>Update the key cache for it</h2><br />
<br />
<span>DTail relies on SSH for secure authentication and communication. However, the system user <span class='inlinecode'>_dserver</span> has no permission to read the SSH public keys from the user&#39;s home directories, so the DTail server also checks for available public keys in an alternative path <span class='inlinecode'>/var/run/dserver/cache</span>. </span><br />
<br />
@@ -6165,7 +6159,7 @@ $ echo /usr/local/bin/dserver-update-key-cache.sh | doas tee -a /etc/daily.local
/usr/local/bin/dserver-update-key-cache.sh
</pre>
<br />
-<h3 style='display: inline' id='Rexification'>Rexification</h3><br />
+<h3 style='display: inline' id='rexification'>Rexification</h3><br />
<br />
<span>That&#39;s done by adding ...</span><br />
<br />
@@ -6181,7 +6175,7 @@ append_if_no_such_line &#39;/etc/daily.local&#39;, &#39;/usr/local/bin/dserver-u
<br />
<span>... to the Rex task!</span><br />
<br />
-<h2 style='display: inline' id='Startit'>Start it</h2><br />
+<h2 style='display: inline' id='start-it'>Start it</h2><br />
<br />
<span>Now, it&#39;s time to enable and start the DTail server:</span><br />
<br />
@@ -6221,7 +6215,7 @@ Caching /home/rex/.ssh/authorized_keys -&gt; /var/cache/dserver/rex.authorized_k
All set...
</pre>
<br />
-<h2 style='display: inline' id='Useit'>Use it</h2><br />
+<h2 style='display: inline' id='use-it'>Use it</h2><br />
<br />
<span>The DTail server is now ready to serve connections. You can use any DTail commands, such as <span class='inlinecode'>dtail</span>, <span class='inlinecode'>dgrep</span>, <span class='inlinecode'>dmap</span>, <span class='inlinecode'>dcat</span>, <span class='inlinecode'>dtailhealth</span>, to do so. Checkout out all the usage examples on the official DTail page.</span><br />
<br />
@@ -6247,7 +6241,7 @@ REMOTE|blowfish|100|7|fstab|31bfd9d9a6788844.h /usr/local ffs rw,wxallowed,nodev
REMOTE|fishfinger|100|7|fstab|093f510ec5c0f512.h /usr/local ffs rw,wxallowed,nodev 1 2
</pre>
<br />
-<h2 style='display: inline' id='Conclusions'>Conclusions</h2><br />
+<h2 style='display: inline' id='conclusions'>Conclusions</h2><br />
<br />
<span>It&#39;s a bit of manual work, but it&#39;s ok on this small scale! I shall invest time in creating an official OpenBSD port, though. That would render most of the manual steps obsolete, as outlined in this post!</span><br />
<br />
@@ -6396,7 +6390,7 @@ jgs (________\ \
<summary>I proudly announce that I've released Gemtexter version `1.1.0`. What is Gemtexter? It's my minimalist static site generator for Gemini Gemtext, HTML and Markdown written in GNU Bash.</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline' id='Gemtexter110LetsGemtextagain'>Gemtexter 1.1.0 - Let&#39;s Gemtext again</h1><br />
+ <h1 style='display: inline' id='gemtexter-110---lets-gemtext-again'>Gemtexter 1.1.0 - Let&#39;s Gemtext again</h1><br />
<br />
<span class='quote'>Published at 2022-08-27T18:25:57+01:00</span><br />
<br />
@@ -6418,9 +6412,9 @@ jgs (________\ \
<br />
<span>It has been around a year since I released the first version <span class='inlinecode'>1.0.0</span>. Although, there aren&#39;t any groundbreaking changes, there have been a couple of smaller commits and adjustments. I was quite surprised that I received a bunch of feedback and requests about Gemtexter so it means that I am not the only person in the universe actually using it.</span><br />
<br />
-<h2 style='display: inline' id='Whatsnew'>What&#39;s new?</h2><br />
+<h2 style='display: inline' id='whats-new'>What&#39;s new?</h2><br />
<br />
-<h3 style='display: inline' id='AutomaticcheckforGNUversionrequirements'>Automatic check for GNU version requirements</h3><br />
+<h3 style='display: inline' id='automatic-check-for-gnu-version-requirements'>Automatic check for GNU version requirements</h3><br />
<br />
<span>Gemtexter relies on the GNU versions of the tools <span class='inlinecode'>grep</span>, <span class='inlinecode'>sed</span> and <span class='inlinecode'>date</span> and it also requires the Bash shell in version 5 at least. That&#39;s now done in the <span class='inlinecode'>check_dependencies()</span> function:</span><br />
<br />
@@ -6449,15 +6443,15 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>Especially macOS users didn&#39;t read the <span class='inlinecode'>README</span> carefully enough to install GNU Grep, GNU Sed and GNU Date before using Gemtexter.</span><br />
<br />
-<h3 style='display: inline' id='BackticksnowproduceinlinecodeblocksintheHTMLoutput'>Backticks now produce <span class='inlinecode'>inline code blocks</span> in the HTML output</h3><br />
+<h3 style='display: inline' id='backticks-now-produce-inline-code-blocks-in-the-html-output'>Backticks now produce <span class='inlinecode'>inline code blocks</span> in the HTML output</h3><br />
<br />
<span>The Gemtext format doesn&#39;t support inline code blocks, but Gemtexter now produces <span class='inlinecode'>inline code blocks</span> (means, small code fragments can be placed in the middle of a paragraph) in the HTML output when the code block is enclosed with Backticks. There were no adjustments required for the Markdown output format, because Markdown supports it already out of the box.</span><br />
<br />
-<h3 style='display: inline' id='CacheforAtomfeedgeneration'>Cache for Atom feed generation</h3><br />
+<h3 style='display: inline' id='cache-for-atom-feed-generation'>Cache for Atom feed generation</h3><br />
<br />
<span>The Bash is not the most performant language. Gemtexter already takes a couple of seconds only to generate the Atom feed for around two hand full of articles on my slightly underpowered Surface Go 2 Linux tablet. Therefore, I introduced a cache, so that subsequent Atom feed generation runs finish much quicker. The cache uses a checksum of the Gemtext <span class='inlinecode'>.gmi</span> file to decide whether anything of the content has changed or not.</span><br />
<br />
-<h3 style='display: inline' id='Inputfiltersupport'>Input filter support</h3><br />
+<h3 style='display: inline' id='input-filter-support'>Input filter support</h3><br />
<br />
<span>Once your capsule reaches a certain size, it can become annoying to re-generate everything if you only want to preview the HTML or Markdown output of one single content file. The following will add a filter to only generate the files matching a regular expression:</span><br />
<br />
@@ -6468,22 +6462,22 @@ http://www.gnu.org/software/src-highlite -->
<pre><font color="#F3E651">.</font><font color="#ff0000">/gemtexter --generate </font><font color="#bb00ff">'.*hello.*'</font>
</pre>
<br />
-<h3 style='display: inline' id='Revampedgitsupport'>Revamped <span class='inlinecode'>git</span> support</h3><br />
+<h3 style='display: inline' id='revamped-git-support'>Revamped <span class='inlinecode'>git</span> support</h3><br />
<br />
<span>The Git support has been completely rewritten. It&#39;s now more reliable and faster too. Have a look at the <span class='inlinecode'>README</span> for more information.</span><br />
<br />
-<h3 style='display: inline' id='Additionofhtmlextrasandwebfontsupport'>Addition of <span class='inlinecode'>htmlextras</span> and web font support</h3><br />
+<h3 style='display: inline' id='addition-of-htmlextras-and-web-font-support'>Addition of <span class='inlinecode'>htmlextras</span> and web font support</h3><br />
<br />
<span>The <span class='inlinecode'>htmlextras</span> folder now contains all extra files required for the HTML output format such as cascading style sheet (CSS) files and web fonts.</span><br />
<br />
-<h3 style='display: inline' id='Subsectionsupport'>Sub-section support</h3><br />
+<h3 style='display: inline' id='sub-section-support'>Sub-section support</h3><br />
<br />
<span>It&#39;s now possible to define sub-sections within a Gemtexter capsule. For the HTML output, each sub-section can use its own CSS and web font definitions. E.g.:</span><br />
<br />
<a class='textlink' href='https://foo.zone'>The foo.zone main site</a><br />
<a class='textlink' href='https://foo.zone/notes'>The notes sub-section (with different fonts)</a><br />
<br />
-<h3 style='display: inline' id='More'>More</h3><br />
+<h3 style='display: inline' id='more'>More</h3><br />
<br />
<span>Additionally, there were a couple of bug fixes, refactorings and overall improvements in the documentation made. </span><br />
<br />
@@ -6515,7 +6509,7 @@ http://www.gnu.org/software/src-highlite -->
<summary>I was amazed at how easy it is to automatically generate and update Let's Encrypt certificates with OpenBSD.</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline' id='LetsEncryptwithOpenBSDandRex'>Let&#39;s Encrypt with OpenBSD and Rex</h1><br />
+ <h1 style='display: inline' id='lets-encrypt-with-openbsd-and-rex'>Let&#39;s Encrypt with OpenBSD and Rex</h1><br />
<br />
<span class='quote'>Published at 2022-07-30T12:14:31+01:00</span><br />
<br />
@@ -6548,7 +6542,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>I was amazed at how easy it is to automatically generate and update Let&#39;s Encrypt certificates with OpenBSD.</span><br />
<br />
-<h2 style='display: inline' id='WhatsLetsEncrypt'>What&#39;s Let&#39;s Encrypt?</h2><br />
+<h2 style='display: inline' id='whats-lets-encrypt'>What&#39;s Let&#39;s Encrypt?</h2><br />
<br />
<span class='quote'>Let&#39;s Encrypt is a non-profit certificate authority run by Internet Security Research Group that provides X.509 certificates for Transport Layer Security (TLS) encryption at no charge. It is the world&#39;s largest certificate authority, used by more than 265 million websites, with the goal of all websites being secure and using HTTPS.</span><br />
<br />
@@ -6556,7 +6550,7 @@ http://www.gnu.org/software/src-highlite -->
<br />
<span>In short, it gives away TLS certificates for your website - for free! The catch is, that the certificates are only valid for three months. So it is better to automate certificate generation and renewals.</span><br />
<br />
-<h2 style='display: inline' id='Meetacmeclient'>Meet <span class='inlinecode'>acme-client</span></h2><br />
+<h2 style='display: inline' id='meet-acme-client'>Meet <span class='inlinecode'>acme-client</span></h2><br />
<br />
<span><span class='inlinecode'>acme-client</span> is the default Automatic Certifcate Management Environment (ACME) client on OpenBSD and part of the OpenBSD base system. </span><br />
<br />
@@ -6576,11 +6570,11 @@ http://www.gnu.org/software/src-highlite -->
<li>Let&#39;s Encrypt then will contact the hostname for the certificate through a particular URL (e.g. <span class='inlinecode'>http://foo.zone/.well-known/acme-challenge/...</span>) to verify that the requester is the valid owner of the host.</li>
<li>Let&#39;s Encrypt generates a certificate, which then is downloaded to <span class='inlinecode'>/etc/ssl/...</span>.</li>
</ul><br />
-<h2 style='display: inline' id='Configuration'>Configuration</h2><br />
+<h2 style='display: inline' id='configuration'>Configuration</h2><br />
<br />
<span>There is some (but easy) configuration required to make that all work on OpenBSD.</span><br />
<br />
-<h3 style='display: inline' id='acmeclientconf'>acme-client.conf</h3><br />
+<h3 style='display: inline' id='acme-clientconf'>acme-client.conf</h3><br />
<br />
<span>This is how my <span class='inlinecode'>/etc/acme-client.conf</span> looks like (I copied a template from <span class='inlinecode'>/etc/examples/acme-client.conf</span> to <span class='inlinecode'>/etc/acme-client.conf</span> and added my domains to the bottom:</span><br />
<br />
@@ -6679,7 +6673,7 @@ server "foo.zone" {
<br />
<span>It is worth noticing that <span class='inlinecode'>httpd</span> will start without the certificates being present. This will cause a certificate error when you try to reach the HTTPS endpoint, but it helps to bootstrap Let&#39;s Encrypt. As you saw in the config snippet above, Let&#39;s Encrypt only requests the plain HTTP endpoint for the verification process, so HTTPS doesn&#39;t need to be operational yet at this stage. But once the certificates are generated, you will have to reload or restart <span class='inlinecode'>httpd</span> to use any new certificate.</span><br />
<br />
-<h3 style='display: inline' id='CRONjob'>CRON job</h3><br />
+<h3 style='display: inline' id='cron-job'>CRON job</h3><br />
<br />
<span>You could now run <span class='inlinecode'>doas acme-client foo.zone</span> to generate the certificate or to renew it. Or you could automate it with CRON.</span><br />
<br />
@@ -6757,11 +6751,11 @@ acme-client: /etc/ssl/irregular.ninja.fullchain.pem: certificate valid: 80 days
acme-client: /etc/ssl/snonux.land.fullchain.pem: certificate valid: 79 days left
</pre>
<br />
-<h2 style='display: inline' id='relaydconfandsmtpdconf'>relayd.conf and smtpd.conf</h2><br />
+<h2 style='display: inline' id='relaydconf-and-smtpdconf'>relayd.conf and smtpd.conf</h2><br />
<br />
<span>Besides <span class='inlinecode'>httpd</span>, <span class='inlinecode'>relayd</span> (mainly for Gemini) and <span class='inlinecode'>smtpd</span> (for mail, of course) also use TLS certificates. And as you can see in <span class='inlinecode'>acme.sh</span>, the services are reloaded or restarted (<span class='inlinecode'>smtpd</span> doesn&#39;t support reload) whenever a certificate is generated or updated.</span><br />
<br />
-<h2 style='display: inline' id='Rexification'>Rexification</h2><br />
+<h2 style='display: inline' id='rexification'>Rexification</h2><br />
<br />
<span>I didn&#39;t write all these configuration files by hand. As a matter of fact, everything is automated with the Rex configuration management system.</span><br />
<br />
@@ -6773,7 +6767,7 @@ acme-client: /etc/ssl/snonux.land.fullchain.pem: certificate valid: 79 days left
our @acme_hosts = qw/buetow.org paul.buetow.org tmp.buetow.org dtail.dev foo.zone irregular.ninja snonux.land/;
</pre>
<br />
-<h3 style='display: inline' id='GeneralACMEclientconfiguration'>General ACME client configuration</h3><br />
+<h3 style='display: inline' id='general-acme-client-configuration'>General ACME client configuration</h3><br />
<br />
<span>ACME will be installed into the frontend group of hosts. Here, blowfish is the primary, and twofish is the secondary OpenBSD box.</span><br />
<br />
@@ -6925,7 +6919,7 @@ if [ $has_update = yes ]; then
fi
</pre>
<br />
-<h3 style='display: inline' id='Servicerexification'>Service rexification </h3><br />
+<h3 style='display: inline' id='service-rexification-'>Service rexification </h3><br />
<br />
<span>These are the Rex tasks setting up <span class='inlinecode'>httpd</span>, <span class='inlinecode'>relayd</span> and <span class='inlinecode'>smtpd</span> services:</span><br />
<br />
@@ -7153,7 +7147,7 @@ match from local for local action localmail
match from local for any action outbound
</pre>
<br />
-<h2 style='display: inline' id='Allpiecestogether'>All pieces together</h2><br />
+<h2 style='display: inline' id='all-pieces-together'>All pieces together</h2><br />
<br />
<span>For the complete <span class='inlinecode'>Rexfile</span> example and all the templates, please look at the Git repository:</span><br />
<br />
@@ -7167,7 +7161,7 @@ rex commons
<br />
<span>The <span class='inlinecode'>commons</span> is a group of tasks I specified which combines a set of common tasks I always want to execute on all frontend machines. This also includes the ACME tasks mentioned in this article!</span><br />
<br />
-<h2 style='display: inline' id='Conclusion'>Conclusion</h2><br />
+<h2 style='display: inline' id='conclusion'>Conclusion</h2><br />
<br />
<span>ACME and Let&#39;s Encrypt greatly help reduce recurring manual maintenance work (creating and renewing certificates). Furthermore, all the certificates are free of cost! I love to use OpenBSD and Rex to automate all of this.</span><br />
<br />
@@ -7545,7 +7539,7 @@ v = 008 [v = p*c*(s != c ? 2 : 1)] Total logical CPUs
<summary>Perl (the Practical Extraction and Report Language) is a battle-tested, mature, multi-paradigm dynamic programming language. Note that it's not called PERL, neither P.E.R.L. nor Pearl. 'Perl' is the name of the language and `perl` the name of the interpreter or the interpreter command.</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline' id='Perlisstillagreatchoice'>Perl is still a great choice</h1><br />
+ <h1 style='display: inline' id='perl-is-still-a-great-choice'>Perl is still a great choice</h1><br />
<br />
<span class='quote'>Published at 2022-05-27T07:50:12+01:00; Updated at 2023-01-28</span><br />
<br />
@@ -7565,7 +7559,7 @@ v = 008 [v = p*c*(s != c ? 2 : 1)] Total logical CPUs
<li>Why use Perl as there are better alternatives?</li>
<li>Why all the sigils? It looks like an exploding ASCII factory!!</li>
</ul><br />
-<h2 style='display: inline' id='Writeonlylanguage'>Write-only language</h2><br />
+<h2 style='display: inline' id='write-only-language'>Write-only language</h2><br />
<br />
<span>Is Perl really a write-only language? You have to understand that Perl 5 was released in 1994 (28 years ago as of this writing) and when we refer to Perl we usually mean Perl 5. That&#39;s many years, and there are many old scripts not following the modern Perl best practices (as they didn&#39;t exist yet). So yes, legacy scripts may be difficult to read. Japanese may be difficult to read too if you don&#39;t know Japanese, though.</span><br />
<br />
@@ -7591,7 +7585,7 @@ v = 008 [v = p*c*(s != c ? 2 : 1)] Total logical CPUs
<br />
<span>This all doesn&#39;t mean that you can&#39;t "get things done" with Perl. Quite the opposite is the case. Perl is a very pragmatic programming language and is suitable very well for rapid prototyping and any kind of small to medium-sized scripts and programs. You can write large enterprise scale application in Perl too, but that wasn&#39;t the original intend of why Perl was invented (more on that later).</span><br />
<br />
-<h2 style='display: inline' id='IsPerlabandoned'>Is Perl abandoned?</h2><br />
+<h2 style='display: inline' id='is-perl-abandoned'>Is Perl abandoned?</h2><br />
<br />
<span>As I pointed out in the previous section, Perl 5 is around for quite some time without any new major version released. This can lead to the impression that development is not progressing and that the project is abandoned. Nothing can be further from the truth. Perl 5.000 was released in 1994 and the latest version (as of this writing) Perl 5.34.1 was released two months ago in 2022. You can check the version history on Wikipedia. You will notice releases being made regularly:</span><br />
<br />
@@ -7632,7 +7626,7 @@ v = 008 [v = p*c*(s != c ? 2 : 1)] Total logical CPUs
<br />
<a class='textlink' href='https://www.leanpub.com/perl_new_features'>Perl New Features</a><br />
<br />
-<h2 style='display: inline' id='WhyusePerlastherearebetteralternatives'>Why use Perl as there are better alternatives?</h2><br />
+<h2 style='display: inline' id='why-use-perl-as-there-are-better-alternatives'>Why use Perl as there are better alternatives?</h2><br />
<br />
<span>Here, common sense must be applied. I don&#39;t believe there is anything like "the perfect" programming language. Everyone has got his preferred (or a set of preferred) programming language to chose from. All programming languages come with their own set of strengths and weaknesses. These are the strengths making Perl shine, and you (technically) don&#39;t need to bother to look for "better" alternatives:</span><br />
<br />
@@ -7661,7 +7655,7 @@ v = 008 [v = p*c*(s != c ? 2 : 1)] Total logical CPUs
</ul><br />
<a class='textlink' href='https://github.com/Ovid/Cor'>Cor - Bringing modern OOP to the Perl Core</a><br />
<br />
-<h2 style='display: inline' id='WhyallthesigilsItlookslikeanexplodingASCIIfactory'>Why all the sigils? It looks like an exploding ASCII factory!!</h2><br />
+<h2 style='display: inline' id='why-all-the-sigils-it-looks-like-an-exploding-ascii-factory'>Why all the sigils? It looks like an exploding ASCII factory!!</h2><br />
<br />
<span>The sigils <span class='inlinecode'>$ @ % &amp;</span> (where Perl is famously known for) serve a purpose. They seem confusing at first, but they actually make the code better readable. <span class='inlinecode'>$scalar</span> is a scalar variable (holding a single value), <span class='inlinecode'>@array</span> is an array (holding a list of values), <span class='inlinecode'>%hash</span> holds a list of key-value pairs and <span class='inlinecode'>&amp;sub</span> is for subroutines. A given variable <span class='inlinecode'>$ref</span> can also hold reference to something. <span class='inlinecode'>@$arrayref</span> dereferences a reference to an array, <span class='inlinecode'>%$hashref</span> to a hash, <span class='inlinecode'>$$scalarref</span> to a scalar, <span class='inlinecode'>&amp;$subref</span> dereferences a referene to a subroutine, etc. That can be encapsulated as deep as you want. (This paragraph only scratched the surface here of what Perl can do, and there is a lot of syntactic sugar not mentioned here).</span><br />
<br />
@@ -7669,7 +7663,7 @@ v = 008 [v = p*c*(s != c ? 2 : 1)] Total logical CPUs
<br />
<a class='textlink' href='https://www.perl.com/article/on-sigils/'>https://www.perl.com/article/on-sigils/</a><br />
<br />
-<h2 style='display: inline' id='WheredoIpersonallystilluseperl'>Where do I personally still use perl?</h2><br />
+<h2 style='display: inline' id='where-do-i-personally-still-use-perl'>Where do I personally still use perl?</h2><br />
<br />
<ul>
<li>I use Rexify for my OpenBSD server automation. Rexify is a configuration management system developed in Perl with similar features to Ansible but less bloated. It suits my personal needs perfectly.</li>
@@ -7870,7 +7864,7 @@ learn () {
<summary>I have recently released DTail 4.0.0 and this blog post goes through all the new goodies. If you want to jump directly to DTail, do it here (there are nice animated gifs which demonstrates the usage pretty well):</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline' id='ThereleaseofDTail400'>The release of DTail 4.0.0</h1><br />
+ <h1 style='display: inline' id='the-release-of-dtail-400'>The release of DTail 4.0.0</h1><br />
<br />
<span class='quote'>Published at 2022-03-06T18:11:39+00:00</span><br />
<br />
@@ -7892,9 +7886,9 @@ learn () {
<br />
<a class='textlink' href='https://dtail.dev'>https://dtail.dev</a><br />
<br />
-<h2 style='display: inline' id='Sowhatsnewin400'>So, what&#39;s new in 4.0.0?</h2><br />
+<h2 style='display: inline' id='so-whats-new-in-400'>So, what&#39;s new in 4.0.0?</h2><br />
<br />
-<h3 style='display: inline' id='Rewrittenlogging'>Rewritten logging</h3><br />
+<h3 style='display: inline' id='rewritten-logging'>Rewritten logging</h3><br />
<br />
<span>For DTail 4, logging has been completely rewritten. The new package name is "internal/io/dlog". I rewrote the logging because DTail is a special case here: There are logs processed by DTail, there are logs produced by the DTail server itself, there are logs produced by a DTail client itself, there are logs only logged by a DTail client, there are logs only logged by the DTail server, and there are logs logged by both, server and client. There are also different logging levels and outputs involved.</span><br />
<br />
@@ -7921,7 +7915,7 @@ const (
<br />
<span>DTail also supports multiple log outputs (e.g. to file or to stdout). More are now easily pluggable with the new logging package. The output can also be "enriched" (default) or "plain" (read more about that further below).</span><br />
<br />
-<h3 style='display: inline' id='Configurableterminalcolorcodes'>Configurable terminal color codes</h3><br />
+<h3 style='display: inline' id='configurable-terminal-color-codes'>Configurable terminal color codes</h3><br />
<br />
<span>A complaint I received from the users of DTail 3 were the terminal colors used for the output. Under some circumstances (terminal configuration) it made the output difficult to read so that users defaulted to "--noColor" (disabling colored output completely). I toke it by heart and also rewrote the color handling. It&#39;s now possible to configure the foreground and background colors and an attribute (e.g. dim, bold, ...).</span><br />
<br />
@@ -8037,7 +8031,7 @@ const (
jsonschema -i dtail.json schemas/dtail.schema.json
</pre>
<br />
-<h3 style='display: inline' id='Serverlessmode'>Serverless mode</h3><br />
+<h3 style='display: inline' id='serverless-mode'>Serverless mode</h3><br />
<br />
<span>All DTail commands can now operate on log files (and other text files) directly without any DTail server running. So there isn&#39;t a need anymore to install a DTail server when you are on the target server already anyway, like the following example shows:</span><br />
<br />
@@ -8053,7 +8047,7 @@ jsonschema -i dtail.json schemas/dtail.schema.json
<br />
<span>The way it works in Go code is that a connection to a server is managed through an interface and in serverless mode DTail calls through that interface to the server code directly without any TCP/IP and SSH connection made in the background. This means, that the binaries are a bit larger (also ship with the code which normally would be executed by the server) but the increase of binary size is not much.</span><br />
<br />
-<h3 style='display: inline' id='Shorthandflags'>Shorthand flags</h3><br />
+<h3 style='display: inline' id='shorthand-flags'>Shorthand flags</h3><br />
<br />
<span>The "--files" from the previous example is now redundant. As a shorthand, It is now possible to do the following instead:</span><br />
<br />
@@ -8063,7 +8057,7 @@ jsonschema -i dtail.json schemas/dtail.schema.json
<br />
<span>Of course, this also works with all other DTail client commands (dgrep, dcat, ... etc).</span><br />
<br />
-<h3 style='display: inline' id='Spartanakaplainmode'>Spartan (aka plain) mode</h3><br />
+<h3 style='display: inline' id='spartan-aka-plain-mode'>Spartan (aka plain) mode</h3><br />
<br />
<span>There&#39;s a plain mode, which makes DTail only print out the "plain" text of the files operated on (without any DTail specific enriched output). E.g.:</span><br />
<br />
@@ -8074,7 +8068,7 @@ jsonschema -i dtail.json schemas/dtail.schema.json
<br />
<span>This might be useful if you wanted to post-process the output. </span><br />
<br />
-<h3 style='display: inline' id='Standardinputpipe'>Standard input pipe</h3><br />
+<h3 style='display: inline' id='standard-input-pipe'>Standard input pipe</h3><br />
<br />
<span>In serverless mode, you might want to process your data in a pipeline. You can do that now too through an input pipe:</span><br />
<br />
@@ -8089,7 +8083,7 @@ jsonschema -i dtail.json schemas/dtail.schema.json
% awk &#39;.....&#39; &lt; /some/file | dtail ....
</pre>
<br />
-<h3 style='display: inline' id='Newcommanddtailhealth'>New command dtailhealth</h3><br />
+<h3 style='display: inline' id='new-command-dtailhealth'>New command dtailhealth</h3><br />
<br />
<span>Prior to DTail 4, there was a flag for the "dtail" command to check the health of a remote DTail server (for use with monitoring system such as Nagios). That has been moved out to a separate binary to reduce complexity of the "dtail" command. The following checks whether DTail is operational on the current machine (you could also check a remote instance of DTail server, just adjust the server address).</span><br />
<br />
@@ -8100,7 +8094,7 @@ jsonschema -i dtail.json schemas/dtail.schema.json
exec /usr/local/bin/dtailhealth --server localhost:2222
</pre>
<br />
-<h3 style='display: inline' id='Improveddocumentation'>Improved documentation</h3><br />
+<h3 style='display: inline' id='improved-documentation'>Improved documentation</h3><br />
<br />
<span>Some features, such as custom log formats and the map-reduce query language, are now documented. Also, the examples have been updated to reflect the new features added. This also includes the new animated example Gifs (plus documentation how they were created).</span><br />
<br />
@@ -8114,7 +8108,7 @@ exec /usr/local/bin/dtailhealth --server localhost:2222
</ul><br />
<span>That will be added in one of the future releases. </span><br />
<br />
-<h3 style='display: inline' id='Integrationtestingsuite'>Integration testing suite</h3><br />
+<h3 style='display: inline' id='integration-testing-suite'>Integration testing suite</h3><br />
<br />
<span>DTail comes already with some unit tests, but what&#39;s new is a full integration testing suite which covers all common use cases of all the commands (dtail, dcat, dgrep, dmap) with a server backend and also in serverless mode.</span><br />
<br />
@@ -8135,7 +8129,7 @@ exec /usr/local/bin/dtailhealth --server localhost:2222
% go test -race -v ./integrationtests
</pre>
<br />
-<h3 style='display: inline' id='Improvedcode'>Improved code</h3><br />
+<h3 style='display: inline' id='improved-code'>Improved code</h3><br />
<br />
<span>Not that the code quality of DTail has been bad (I have been using Go vet and Go lint for previous releases and will keep using these), but this time I had new tools (such as SonarQube and BlackDuck) in my arsenal to:</span><br />
<br />
@@ -8145,11 +8139,11 @@ exec /usr/local/bin/dtailhealth --server localhost:2222
</ul><br />
<span>Other than that, a lot of other code has been refactored as I saw fit.</span><br />
<br />
-<h3 style='display: inline' id='Useofmemorypools'>Use of memory pools</h3><br />
+<h3 style='display: inline' id='use-of-memory-pools'>Use of memory pools</h3><br />
<br />
<span>DTail makes excessive use of string builder and byte buffer objects. For performance reasons, those are now re-used from memory pools.</span><br />
<br />
-<h2 style='display: inline' id='Whatsnext'>What&#39;s next</h2><br />
+<h2 style='display: inline' id='whats-next'>What&#39;s next</h2><br />
<br />
<span>DTail 5 won&#39;t be released any time soon I guess, but some 4.x.y releases will follow this year fore sure. I can think of:</span><br />
<br />
@@ -8503,7 +8497,7 @@ GNU/kFreeBSD rhea.buetow.org 8.0-RELEASE-p5 FreeBSD 8.0-RELEASE-p5 #2: Sat Nov 2
<summary>This is the second blog post about my Bash Golf series. This series is random Bash tips, tricks and weirdnesses I came across. It's a collection of smaller articles I wrote in an older (in German language) blog, which I translated and refreshed with some new content.</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline' id='BashGolfPart2'>Bash Golf Part 2</h1><br />
+ <h1 style='display: inline' id='bash-golf-part-2'>Bash Golf Part 2</h1><br />
<br />
<span class='quote'>Published at 2022-01-01T23:36:15+00:00; Updated at 2022-01-05</span><br />
<br />
@@ -8524,7 +8518,7 @@ jgs^^^^^^^`^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
<a class='textlink' href='./2022-01-01-bash-golf-part-2.html'>2022-01-01 Bash Golf Part 2 (You are currently reading this)</a><br />
<a class='textlink' href='./2023-12-10-bash-golf-part-3.html'>2023-12-10 Bash Golf Part 3</a><br />
<br />
-<h2 style='display: inline' id='Redirection'>Redirection</h2><br />
+<h2 style='display: inline' id='redirection'>Redirection</h2><br />
<br />
<span>Let&#39;s have a closer look at Bash redirection. As you might already know that there are 3 standard file descriptors:</span><br />
<br />
@@ -8656,7 +8650,7 @@ First line: Learn You a Haskell
Second line: for Great Good
</pre>
<br />
-<h2 style='display: inline' id='HERE'>HERE</h2><br />
+<h2 style='display: inline' id='here'>HERE</h2><br />
<br />
<span>I have mentioned HERE-documents and HERE-strings already in this post. Let&#39;s do some more examples. The following "cat" receives a multi line string from stdin. In this case, the input multi line string is a HERE-document. As you can see, it also interpolates variables (in this case the output of "date" running in a subshell).</span><br />
<br />
@@ -8739,7 +8733,7 @@ Learn you a Golang for Great Good
I like Perl too
</pre>
<br />
-<h2 style='display: inline' id='RANDOM'>RANDOM</h2><br />
+<h2 style='display: inline' id='random'>RANDOM</h2><br />
<br />
<span>Random is a special built-in variable containing a different pseudo random number each time it&#39;s used.</span><br />
<br />
@@ -8784,11 +8778,11 @@ Delaying script execution for 42 seconds...
Continuing script execution...
</pre>
<br />
-<h2 style='display: inline' id='setxandseteandpipefile'>set -x and set -e and pipefile</h2><br />
+<h2 style='display: inline' id='set--x-and-set--e-and-pipefile'>set -x and set -e and pipefile</h2><br />
<br />
<span>In my opinion, -x and -e and pipefile are the most useful Bash options. Let&#39;s have a look at them one after another.</span><br />
<br />
-<h3 style='display: inline' id='x'>-x</h3><br />
+<h3 style='display: inline' id='-x'>-x</h3><br />
<br />
<span>-x prints commands and their arguments as they are executed. This helps to develop and debug your Bash code:</span><br />
<br />
@@ -8830,7 +8824,7 @@ Second line: for Great Good
</pre>
<br />
-<h3 style='display: inline' id='e'>-e</h3><br />
+<h3 style='display: inline' id='-e'>-e</h3><br />
<br />
<span>This is a very important option you want to use when you are paranoid. This means, you should always "set -e" in your scripts when you need to make absolutely sure that your script runs successfully (with that I mean that no command should exit with an unexpected status code).</span><br />
<br />