From e1ef1b5f3e21e84fcca29bedee6d1af154d61169 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sat, 24 Aug 2024 19:42:38 +0300 Subject: Update content for html --- gemfeed/atom.xml | 720 +++++++++++++++++++++++++++---------------------------- 1 file changed, 357 insertions(+), 363 deletions(-) (limited to 'gemfeed/atom.xml') diff --git a/gemfeed/atom.xml b/gemfeed/atom.xml index 664bece8..9f6f992a 100644 --- a/gemfeed/atom.xml +++ b/gemfeed/atom.xml @@ -1,6 +1,6 @@ - 2024-08-18T22:23:22+03:00 + 2024-08-24T19:37:43+03:00 foo.zone feed To be in the .zone! @@ -234,7 +234,7 @@ 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.
-

"The Stoic Challenge" book notes


+

"The Stoic Challenge" book notes



Published at 2024-07-07T12:46:55+03:00

@@ -262,7 +262,7 @@
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.

-

Negative visualization


+

Negative visualization



It is easy what we have to take for granted.

@@ -272,7 +272,7 @@
  • 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.
  • Last time meditation. Lets you appreciate the life as it is now. Life gets vitalised again.

  • -

    Oh, nice trick, you stoic "god"! ;-)


    +

    Oh, nice trick, you stoic "god"! ;-)



    Take setbacks as a challenge. Also take it with some humor.

    @@ -671,10 +671,10 @@ r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\ Paul Buetow aka snonux paul@dev.buetow.org - Table of contents + 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:
    -

    Terminal multiplexing with tmux


    +

    Terminal multiplexing with tmux



    Published at 2024-06-23T22:41:59+03:00

    @@ -690,30 +690,28 @@ 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



    -

    Introduction


    +
    +

    Introduction



    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:

    @@ -739,7 +737,7 @@ Terminal multiplexing with `tmux`
    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!

    -

    Shell aliases


    +

    Shell aliases



    I am a user of the Z-Shell (zsh), but I believe all the snippets mentioned in this blog post also work with Bash.

    @@ -764,7 +762,7 @@ http://www.gnu.org/software/src-highlite -->
    The first two are pretty straightforward. tm is simply a shorthand for tmux, so I have to type less, and tl lists all Tmux sessions that are currently open. No magic here.

    -

    The tn alias - Creating a new session


    +

    The tn alias - Creating a new session



    The tn alias is referencing this function:

    @@ -795,7 +793,7 @@ http://www.gnu.org/software/src-highlite -->
    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 T$($date +%s) as a default. Which is T followed by the UNIX epoch, e.g. T1717133796.

    -

    Cleaning up default sessions automatically


    +

    Cleaning up default sessions automatically



    Note also the call to tmux::cleanup_default; it would clean up all already opened default sessions if they aren'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't attached. If I want to keep sessions around, I will rename them with the Tmux command prefix-key $. This is the cleanup function:

    @@ -815,11 +813,11 @@ http://www.gnu.org/software/src-highlite -->
    The cleanup function kills all open Tmux sessions that haven't been renamed properly yet—but only if they aren't attached (e.g., don't run in the foreground in any terminal). Cleaning them up automatically keeps my Tmux sessions as neat and tidy as possible.

    -

    Renaming sessions


    +

    Renaming sessions



    Whenever I am in a temporary session (named T....), 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's, as mentioned already, easily accomplished with the standard prefix-key $ Tmux command.

    -

    The ta alias - Attaching to a session


    +

    The ta alias - Attaching to a session



    This alias refers to the following function, which tries to attach to an already-running Tmux session.

    @@ -841,7 +839,7 @@ http://www.gnu.org/software/src-highlite -->
    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 tmux::new. Otherwise, with a session name given as the argument, it will attach to it. If unsuccessful (e.g., the session doesn't exist), it will be created and attached to.

    -

    The tr alias - For a nested remote session


    +

    The tr alias - For a nested remote session



    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.

    @@ -857,7 +855,7 @@ http://www.gnu.org/software/src-highlite --> alias tr=tmux::remote
    -

    Change of the Tmux prefix for better nesting


    +

    Change of the Tmux prefix for better nesting



    To make nested Tmux sessions work smoothly, one must change the Tmux prefix key locally or remotely. By default, the Tmux prefix key is Ctrl-b, so Ctrl-b $, for example, renames the current session. To change the prefix key from the standard Ctrl-b to, for example, Ctrl-g, you must add this to the tmux.conf:

    @@ -869,7 +867,7 @@ set-option -g prefix C-g
    There might also be another way around this (without reconfiguring the prefix key), but that is cumbersome to use, as far as I remember.

    -

    The ts alias - Searching sessions with fuzzy finder


    +

    The ts alias - Searching sessions with fuzzy finder



    Despite the fact that with tmux::cleanup_default, I don'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't remember the exact session names.

    @@ -894,7 +892,7 @@ http://www.gnu.org/software/src-highlite -->
    Tmux session fuzzy finder

    -

    The tssh alias - Cluster SSH replacement


    +

    The tssh alias - Cluster SSH replacement



    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.

    @@ -925,7 +923,7 @@ http://www.gnu.org/software/src-highlite -->
    This function is just a wrapper around the more complex tmux::tssh_from_file and tmux::tssh_from_argument functions, as you have learned already. Most of the magic happens there.

    -

    The tmux::tssh_from_argument helper


    +

    The tmux::tssh_from_argument helper



    This is the most magic helper function we will cover in this post. It looks like this:

    @@ -961,7 +959,7 @@ bind-key p setw synchronize-panes off bind-key P setw synchronize-panes on
    -

    The tmux::tssh_from_file helper


    +

    The tmux::tssh_from_file helper



    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 tmux::tssh_from_argument as the arguments. So, this is a neat little wrapper that also enables me to open clustered SSH sessions from an input file.

    @@ -977,7 +975,7 @@ http://www.gnu.org/software/src-highlite --> }
    -

    tssh examples


    +

    tssh examples



    To open a new session named fish and log in to 4 remote hosts, run this command (Note that it is also possible to specify the remote user):

    @@ -992,7 +990,7 @@ $ tssh fish blowfish.buetow.org fishfinger.buetow.org \ $ tssh manyservers.txt
    -

    Common Tmux commands I use in tssh


    +

    Common Tmux commands I use in tssh



    These are default Tmux commands that I make heavy use of in a tssh session:

    @@ -1001,7 +999,7 @@ $ tssh manyservers.txt
  • Press prefix-key <space> to change the pane layout (can be pressed multiple times to cycle through them).
  • Press prefix-key z to zoom in and out of the current active pane.

  • -

    Copy and paste workflow


    +

    Copy and paste workflow



    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).

    @@ -1020,7 +1018,7 @@ bind-key -T copy-mode-vi 'y' send -X copy-selection-and-cancel
    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 prefix-key ]. Note that when pasting into a modal text editor like Vi or Helix, you would first need to enter insert mode before prefix-key ] would paste anything.

    -

    Tmux configurations


    +

    Tmux configurations



    Some features I have configured directly in Tmux don't require an external shell alias to function correctly. Let's walk line by line through my local ~/.config/tmux/tmux.conf:

    @@ -1113,7 +1111,7 @@ bind-key r source-file ~/.config/tmux/tmux.conf \; display-message "tmux.conf re Art by Laura Brown
    -

    Projects I currently don't have time for


    +

    Projects I currently don't have time for



    Published at 2024-05-03T16:23:03+03:00

    @@ -1130,58 +1128,56 @@ Art by Laura Brown
    -

    Introduction


    +

    Introduction



    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
    -
    -
    -

    Hardware projects I don't have time for


    -
    -

    I use Arch, btw!


    +

    Table of Contents


    +
    +
    +

    Hardware projects I don't have time for


    +
    +

    I use Arch, btw!



    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).

    -

    OpenBSD home router


    +

    OpenBSD home router



    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's hostname was fishbone, and it performed very well until it became too slow for larger broadband bandwidth after a few years of use.

    @@ -1196,23 +1192,23 @@ Projects I currently don't have time for
    https://OpenWRT.org/

    -

    Pi-Hole server


    +

    Pi-Hole server



    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's no significant use for me personally at the moment.

    https://pi-hole.net/

    -

    Infodash


    +

    Infodash



    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.

    I don't have this, and I haven'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."

    -

    Reading station


    +

    Reading station



    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.

    -

    Retro station


    +

    Retro station



    I had an idea to build a computer infused with retro elements. It wouldn't use actual retro hardware but would look and feel like a retro machine. I would call this machine HAL or Retron.

    @@ -1224,14 +1220,14 @@ Projects I currently don't have time for
    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't enough space in my apartment, as my daughter will have a room for herself.

    -

    Sound server


    +

    Sound server



    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.

    https://github.com/navidrome/navidrome
    https://wiki.freebsd.org/bhyve

    -

    Project Freekat


    +

    Project Freekat



    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:

    @@ -1255,15 +1251,15 @@ Projects I currently don't have time for
    My personal AWS setup

    -

    Programming projects I don't have time for


    +

    Programming projects I don't have time for



    -

    CLI-HIVE


    +

    CLI-HIVE



    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).

    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.

    -

    Enhanced KISS home photo albums


    +

    Enhanced KISS home photo albums



    I don'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:

    @@ -1275,7 +1271,7 @@ Projects I currently don't have time for
    KISS static web photo albums with photoalbum.sh

    -

    KISS file sync server with end-to-end encryption


    +

    KISS file sync server with end-to-end encryption



    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.

    @@ -1285,7 +1281,7 @@ Projects I currently don't have time for
    I also had the idea of using this as a pet project for work and naming it Cryptolake, utilizing post-quantum-safe encryption algorithms and a distributed data store.

    -

    A language that compiles to bash


    +

    A language that compiles to bash



    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.

    @@ -1293,11 +1289,11 @@ Projects I currently don't have time for
    The Fype Programming Language

    -

    A language that compiles to sed


    +

    A language that compiles to sed



    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.

    -

    Renovate VS-Sim


    +

    Renovate VS-Sim



    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.

    @@ -1313,13 +1309,13 @@ Projects I currently don't have time for
    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.

    -

    KISS ticketing system


    +

    KISS ticketing system



    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:

    https://taskwarrior.org/

    -

    A domain-specific language (DSL) for work


    +

    A domain-specific language (DSL) for work



    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.:

    @@ -1339,19 +1335,19 @@ http://www.gnu.org/software/src-highlite -->
    Creative universe (Work pet project contests)

    -

    Self-hosting projects I don't have time for


    +

    Self-hosting projects I don't have time for



    -

    My own Matrix server


    +

    My own Matrix server



    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.

    https://matrix.org

    -

    Ampache music server


    +

    Ampache music server



    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.

    -

    Librum eBook reader


    +

    Librum eBook reader



    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's digital library.

    @@ -1359,7 +1355,7 @@ http://www.gnu.org/software/src-highlite -->
    I am using my Kobo devices or my laptop to read these kinds of things for now.

    -

    Memos - Note-taking service


    +

    Memos - Note-taking service



    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.

    @@ -1367,27 +1363,27 @@ http://www.gnu.org/software/src-highlite -->
    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.

    -

    Bepasty server


    +

    Bepasty server



    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.

    https://github.com/bepasty/bepasty-server

    -

    Books I don't have time to read


    +

    Books I don't have time to read



    -

    Fluent Python


    +

    Fluent Python



    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.

    I don'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.

    -

    Programming Ruby


    +

    Programming Ruby



    I'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.

    As stated in this blog post, I am currently more eager to focus on Go, so I've put the Ruby book on hold. Additionally, there wouldn't be enough colleagues who could "understand" my advanced Ruby skills anyway, as most of them are either Java developers or SREs who don't code a lot.

    -

    Peter F. Hamilton science fiction books


    +

    Peter F. Hamilton science fiction books



    I am a big fan of science fiction, but my reading list is currently too long anyway. So, I've put the Hamilton books on the back burner for now. You can see all the novels I've read here:

    @@ -1395,9 +1391,9 @@ http://www.gnu.org/software/src-highlite --> https://paul.buetow.org/novels.gmi


    -

    New websites I don't have time for


    +

    New websites I don't have time for



    -

    Create a "Why Raku Rox" site


    +

    Create a "Why Raku Rox" site



    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.

    @@ -1408,9 +1404,9 @@ http://www.gnu.org/software/src-highlite -->
    I am not working on this for now, as I currently don’t even have time to program in Raku.

    -

    Research projects I don't have time for


    +

    Research projects I don't have time for



    -

    Project secure


    +

    Project secure



    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 memfd_secret() syscall to make it even more secure.

    @@ -1418,7 +1414,7 @@ http://www.gnu.org/software/src-highlite -->
    Due to other priorities, I am putting this on hold for now. The software we have built is pretty damn secure already!

    -

    CPU utilisation is all wrong


    +

    CPU utilisation is all wrong



    This research project, based on Brendan Gregg's blog post, could potentially significantly impact my work.

    @@ -1448,7 +1444,7 @@ http://www.gnu.org/software/src-highlite --> These are my personal takeaways after reading 'Slow Productivity - The lost Art of Accomplishment Without Burnout' by Cal Newport.
    -

    "Slow Productivity" book notes


    +

    "Slow Productivity" book notes



    Published at 2024-04-27T14:18:51+03:00

    @@ -1472,7 +1468,7 @@ http://www.gnu.org/software/src-highlite -->
    "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.

    -

    Pseudo-productivity and Shallow work


    +

    Pseudo-productivity and Shallow work



    People use visible activity instead of real productivity because it's easier to measure. This is called pseudo-productivity.
    Pseudo-productivity is used as a proxy for real productivity. If you don't look busy, you are dismissed as lazy or lacking a work ethic.
    @@ -1481,7 +1477,7 @@ http://www.gnu.org/software/src-highlite -->
    Shallow work usually doesn't help you to accomplish big things. Always have the big picture in mind. Shallow work can't be entirely eliminated, but it can be managed—for example, plan dedicated time slots for certain types of shallow work.

    -

    Accomplishments without burnout


    +

    Accomplishments without burnout



    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.

    @@ -1492,7 +1488,7 @@ http://www.gnu.org/software/src-highlite -->
  • Work at a natural pace
  • Obsess over quality

  • -

    Do fewer things


    +

    Do fewer things



    There will always be more work. The faster you finish it, the quicker you will have something new on your plate.

    @@ -1526,7 +1522,7 @@ http://www.gnu.org/software/src-highlite -->
    Put tasks on autopilot (regular recurring tasks).

    -

    Work at a natural pace


    +

    Work at a natural pace



    We suffer from overambitious timelines, task lists, and business. Focus on what matters. Don't rush your most important work to achieve better results.

    @@ -1542,7 +1538,7 @@ http://www.gnu.org/software/src-highlite -->
    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.

    -

    Obsess over quality


    +

    Obsess over quality



    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:

    @@ -1606,7 +1602,7 @@ http://www.gnu.org/software/src-highlite --> Art by Michael J. Penick (mod. by Paul B.)
    -

    KISS high-availability with OpenBSD


    +

    KISS high-availability with OpenBSD



    Published at 2024-03-30T22:12:56+02:00

    @@ -1635,23 +1631,21 @@ _____|_:_:_| (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



    +
    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.

    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.
    @@ -1660,7 +1654,7 @@ KISS high-availability with OpenBSD
    PS: ASCII-art reflects an OpenBSD under-water world with all the tools available in the base system.

    -

    My auto-failover requirements


    +

    My auto-failover requirements



    • Be OpenBSD-based (I prefer OpenBSD because of the cleanliness and good documentation) and rely on as few external packages as possible.
    • @@ -1673,9 +1667,9 @@ KISS high-availability with OpenBSD
    • Have good monitoring in place so I know when a failover was performed and when something went wrong with the failover.
    • Don't configure everything manually. The configuration should be automated and reproducible.

    -

    My HA solution


    +

    My HA solution



    -

    Only OpenBSD base installation required


    +

    Only OpenBSD base installation required



    My HA solution for Web and Gemini is based on DNS (OpenBSD's nsd) and a simple shell script (OpenBSD's ksh and some little sed and awk and grep). 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.

    @@ -1831,7 +1825,7 @@ http://www.gnu.org/software/src-highlite -->
    dns-failover.ksh

    -

    Fairly cheap and geo-redundant


    +

    Fairly cheap and geo-redundant



    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).

    @@ -1842,13 +1836,13 @@ http://www.gnu.org/software/src-highlite -->
    A DNS-based failover is cheap, as there isn't any BGP or fancy load balancer to pay for. Small VMs also cost less than millions.

    -

    Failover time and split-brain


    +

    Failover time and split-brain



    A DNS failover doesn't happen immediately. I've configured a DNS TTL of 300 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's fine - eventually, all requests will resolve to the new master after a failover).

    A split-brain scenario between the old master and the new master might happen. That's OK, as my sites are static, and there's no database to synchronise other than HTML, CSS, and images when the site is updated.

    -

    Failover support for multiple protocols


    +

    Failover support for multiple protocols



    With the DNS failover, HTTP, HTTPS, and Gemini protocols are failovered. This works because all domain virtual hosts are configured on either VM's httpd (OpenBSD's HTTP server) and relayd (it'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's just a matter of the DNS entries, which VM receives the requests.

    @@ -1859,7 +1853,7 @@ http://www.gnu.org/software/src-highlite -->
    On DNS failover, master and standby swap roles without config changes other than the DNS entries. That's KISS (keep it simple and stupid)!

    -

    Let's encrypt TLS certificates


    +

    Let's encrypt TLS certificates



    All my hosts use TLS certificates from Let's Encrypt. The ACME automation for requesting and keeping the certificates valid (up to date) requires that the host requesting a certificate from Let's Encrypt is also the host using that certificate.

    @@ -1896,7 +1890,7 @@ http://www.gnu.org/software/src-highlite --> https://man.OpenBSD.org/acme-client.1
    Let's Encrypt with OpenBSD and Rex

    -

    Monitoring


    +

    Monitoring



    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.

    @@ -1905,7 +1899,7 @@ http://www.gnu.org/software/src-highlite -->
    Gogios, as I developed it by myself, isn't part of the OpenBSD base system.

    -

    Rex automation


    +

    Rex automation



    I use Rexify, a friendly configuration management system that allows automatic deployment and configuration.

    @@ -1914,7 +1908,7 @@ http://www.gnu.org/software/src-highlite -->
    Rex isn't part of the OpenBSD base system, but I didn't need to install any external software on OpenBSD either as Rex is invoked from my Laptop!

    -

    More HA


    +

    More HA



    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 (nsd) 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!

    @@ -1952,7 +1946,7 @@ http://www.gnu.org/software/src-highlite --> 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.
    -

    A fine Fyne Android app for quickly logging ideas programmed in Go


    +

    A fine Fyne Android app for quickly logging ideas programmed in Go



    Published at 2024-03-03T00:07:21+02:00

    @@ -1984,7 +1978,7 @@ http://www.gnu.org/software/src-highlite -->
    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).

    -

    All easy-peasy?


    +

    All easy-peasy?



    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 AndroidManifest.xml for custom app storage permissions. Without a custom AndroidAmnifest.xml the app icon would be displayed under Android, but then the app would not have the MANAGE_EXTERNAL_STORAGE permission, which is required for Quick logger to write to a custom directory. I found a workaround, which I commented on here at Github:

    @@ -2201,7 +2195,7 @@ http://www.gnu.org/software/src-highlite --> HKISSFISHKISSFISHKISSFISHKISSFISH KISS
    -

    One reason why I love OpenBSD


    +

    One reason why I love OpenBSD



    Published at 2024-01-13T22:55:33+02:00

    @@ -2282,7 +2276,7 @@ http://www.gnu.org/software/src-highlite --> 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.
    -

    Site Reliability Engineering - Part 3: On-Call Culture and the Human Side


    +

    Site Reliability Engineering - Part 3: On-Call Culture and the Human Side



    Published at 2024-01-09T18:35:48+02:00

    @@ -2290,7 +2284,7 @@ http://www.gnu.org/software/src-highlite -->
    2023-08-18 Site Reliability Engineering - Part 1: SRE and Organizational Culture
    2023-11-19 Site Reliability Engineering - Part 2: Operational Balance in SRE
    -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: On-Call Culture and the Human Side (You are currently reading this)

                         ..--""""----..                 
    @@ -2318,7 +2312,7 @@ http://www.gnu.org/software/src-highlite -->
     
     

    -

    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



    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.

    @@ -2356,7 +2350,7 @@ http://www.gnu.org/software/src-highlite --> 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.
    -

    Bash Golf Part 3


    +

    Bash Golf Part 3



    Published at 2023-12-10T11:35:54+02:00

    @@ -2377,7 +2371,7 @@ jgs^^^^^^^`^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2022-01-01 Bash Golf Part 2
    2023-12-10 Bash Golf Part 3 (You are currently reading this)

    -

    FUNCNAME


    +

    FUNCNAME



    FUNCNAME 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 FUNCNAME. This is an array variable that contains the names of all shell functions currently in the execution call stack. The element FUNCNAME[0] holds the name of the currently executing function, FUNCNAME[1] the name of the function that called that, and so on.

    @@ -2417,7 +2411,7 @@ http://www.gnu.org/software/src-highlite --> INFO|20231210-082732|123002|at_home_friday_evening|One Peperoni Pizza, please
    -

    :(){ :|:& };:


    +

    :(){ :|:& };:



    This one may be widely known already, but I am including it here as I found a cute image illustrating it. But to break :(){ :|:& };: down:

    @@ -2440,7 +2434,7 @@ http://www.gnu.org/software/src-highlite -->
    Bash fork bomb

    -

    Inner functions


    +

    Inner functions



    Bash defines variables as it is interpreting the code. The same applies to function declarations. Let's consider this code:

    @@ -2509,7 +2503,7 @@ Wintel inside! Wintel inside!
    -

    Exporting functions


    +

    Exporting functions



    Have you ever wondered how to execute a shell function in parallel through xargs? The problem is that this won't work:

    @@ -2599,7 +2593,7 @@ http://www.gnu.org/software/src-highlite -->
    ... because some_other_function isn't exported! You will also need to add an export -f some_other_function!

    -

    Dynamic variables with local


    +

    Dynamic variables with local



    You may know that local is how to declare local variables in a function. Most don't know that those variables actually have dynamic scope. Let's consider the following example:

    @@ -2639,7 +2633,7 @@ foo What happened? The variable foo (declared with local) 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 foo, and the change will be visible up the call stack. It's not a global variable; on the last line, echo "$foo" echoes the global variable content.


    -

    if conditionals


    +

    if conditionals



    Consider all variants here more or less equivalent:

    @@ -2690,7 +2684,7 @@ ok4a ok4b
    -

    Multi-line comments


    +

    Multi-line comments



    You all know how to comment. Put a # in front of it. You could use multiple single-line comments or abuse heredocs and redirect it to the : no-op command to emulate multi-line comments.

    @@ -2714,7 +2708,7 @@ http://www.gnu.org/software/src-highlite -->
    I will not demonstrate the execution of this script, as it won't print anything! It's obviously not the most pretty way of commenting on your code, but it could sometimes be handy!

    -

    Don't change it while it's executed


    +

    Don't change it while it's executed



    Consider this script:

    @@ -2773,7 +2767,7 @@ echo baz 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.
    -

    Site Reliability Engineering - Part 2: Operational Balance in SRE


    +

    Site Reliability Engineering - Part 2: Operational Balance in SRE



    Published at 2023-11-19T00:18:18+03:00

    @@ -2781,7 +2775,7 @@ echo baz
    2023-08-18 Site Reliability Engineering - Part 1: SRE and Organizational Culture
    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: On-Call Culture and the Human Aspect
    +2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Side

     ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣾⣷⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
    @@ -2798,7 +2792,7 @@ echo baz
     ⠀⠀⠀⠀⠀⠀⠴⠶⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠶⠦⠀⠀
     

    -

    Operational Balance in SRE: Striking the Right Balance Between Reliability and Speed


    +

    Operational Balance in SRE: Striking the Right Balance Between Reliability and Speed



    Site Reliability Engineering is more than just a bunch of best practices or methods. It's a guiding light for engineering teams, helping them navigate the tricky waters of modern software development and system management.
    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.
    @@ -2817,7 +2811,7 @@ echo baz
    Continue with the third part of this series:

    -2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Aspect
    +2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Side

    E-Mail your comments to paul@nospam.buetow.org :-)

    @@ -2837,7 +2831,7 @@ echo baz 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.
    -

    "Mind Management" book notes


    +

    "Mind Management" book notes



    Published at 2023-11-11T22:21:47+02:00

    @@ -2861,11 +2855,11 @@ echo baz
  • The point of diminishing returns
  • The point of negative return

  • -

    Empty slots in the calendar


    +

    Empty slots in the calendar



    If we do more things in less time and use all possible slots, speed read, etc., we are more productive. But in reality, that's not the entire truth. You also exchange one thing against everything else.... You cut out too much from your actual life.

    -

    When you safe time...


    +

    When you safe time...



    ...keep it.

    @@ -2874,7 +2868,7 @@ echo baz
  • Creative thinking needs space. It will pay dividends tomorrow.
  • You will be rewarded with the "Eureka effect" - a sudden new insight.

  • -

    Follow your mood


    +

    Follow your mood



    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.:

    @@ -2882,7 +2876,7 @@ echo baz
  • Didn't sleep enough today? Then, do simple, non-demanding tasks at work
  • Had a great sleep, and there is even time before work starts? Pull in a workout...

  • -

    Boosting creativity


    +

    Boosting creativity



    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.

    @@ -2892,7 +2886,7 @@ echo baz
  • Don't race with time but walk alongside it as rough time lines.
  • Don't judge every day after the harvest, but the seed you lay

  • -

    The right mood for the task at hand


    +

    The right mood for the task at hand



    We need to try many different combinations. Limiting ourselves and trying too hard makes us frustrated and burn out. Creativity requires many iterations.

    @@ -2906,7 +2900,7 @@ echo baz
    It gives you pleasure and is in a good mood. This increases creativity if you do what you want to do.

    -

    Creativity hacks


    +

    Creativity hacks



    • Coffee can cause anxiety.
    • @@ -2917,7 +2911,7 @@ echo baz
    • Go to open spaces for creativity.
    • Go to closed spaces for polishing.

    -

    Planning and strategizing


    +

    Planning and strategizing



    Minds work better in sprints and not in marathons. Have a weekly plan, not a daily one.

    @@ -2930,7 +2924,7 @@ echo baz
    You could schedule exploratory tasks when you are under grief. Sound systems should create slack for creativity. Plan only for a few minutes.

    -

    Fake it until you make it.


    +

    Fake it until you make it.



    • E.g. act calm if you want to be calm.
    • @@ -2966,7 +2960,7 @@ echo baz 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).
      -

      KISS static web photo albums with photoalbum.sh


      +

      KISS static web photo albums with photoalbum.sh



      Published at 2023-10-29T22:25:04+02:00

      @@ -2987,7 +2981,7 @@ echo baz '._____________________________________________.'
      -

      Motivation


      +

      Motivation



      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).

      @@ -2995,11 +2989,11 @@ echo baz
      I value KISS (keep it simple and stupid) and simplicity. All that'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.

      -

      Introducing photoalbum.sh


      +

      Introducing photoalbum.sh



      photoalbum.sh 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.

      -

      Installation


      +

      Installation



      Installation is straightforward. All required is a recent version of GNU Bash, GNU Make, Git and ImageMagick. On Fedora, the dependencies are installed with:

      @@ -3042,7 +3036,7 @@ cp ./src/photoalbum.default.conf /etc/default/photoalbum This is Photoalbum Version 0.5.1
      -

      Setting it up


      +

      Setting it up



      Now, it'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: irregular.ninja for the Irregular Ninja Photo site - or any oter sub-directory reflecting your album's name), and inside of that directory, create an incoming directory. The incoming directory. Copy all photos to be part of the album there.

      @@ -3155,7 +3149,7 @@ http://www.gnu.org/software/src-highlite -->
      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't want to copy them to the local incoming directory. Also, a tarball containing the whole album as a download isn't provided.

      -

      Generating the static photo album


      +

      Generating the static photo album



      Let's generate it. Depending on the image sizes and count, the following step may take a while.

      @@ -3218,15 +3212,15 @@ blurs html index.html photos thumbs
      PS: There'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).

      -

      Cleaning it up


      +

      Cleaning it up



      A simple make clean will clean up the ./dist directory and all other (if any) temp files created.

      -

      HTML templates


      +

      HTML templates



      Poke around in this source directory. You will find a bunch of Bash-HTML template files. You could tweak them to your liking.

      -

      Conclusion


      +

      Conclusion



      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?).

      @@ -3264,7 +3258,7 @@ blurs html index.html photos thumbs 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!
      -

      DTail usage examples


      +

      DTail usage examples



      Published at 2023-09-25T14:57:42+03:00

      @@ -3298,7 +3292,7 @@ blurs html index.html photos thumbs
    • Use dmap to aggregate logs and other text files already written
    • dserver is the DTail server, where all the clients can connect to

    -

    Following logs


    +

    Following logs



    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 INFO. Any other Go compatible regular expression can also be used instead of INFO.

    @@ -3322,7 +3316,7 @@ http://www.gnu.org/software/src-highlite -->
    % dtail --servers serverlist.txt --grep INFO "/var/log/dserver/*.log"
     

    -

    Aggregating logs


    +

    Aggregating logs



    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.

    @@ -3379,7 +3373,7 @@ http://www.gnu.org/software/src-highlite --> --query 'from STATS select ... outfile append result.csv'
    -

    How to use dcat


    +

    How to use dcat



    The following example demonstrates how to cat files (display the full content of the files) on several servers at once.

    @@ -3403,7 +3397,7 @@ http://www.gnu.org/software/src-highlite -->
    % dcat --servers serverlist.txt /etc/hostname
     

    -

    How to use dgrep


    +

    How to use dgrep



    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 /etc/passwd. This time, we don't provide the server list via an file but rather via a comma separated list directly on the command line. We also explore the -before, -after and -max flags (see animation).

    @@ -3422,7 +3416,7 @@ http://www.gnu.org/software/src-highlite -->
    Hint: -regex is an alias for -grep.

    -

    How to use dmap


    +

    How to use dmap



    To run a map-reduce aggregation over logs written in the past, the dmap command can be used. The following example aggregates all map-reduce fields dmap will print interim results every few seconds. You can also write the result to an CSV file by adding outfile result.csv to the query.

    @@ -3440,7 +3434,7 @@ http://www.gnu.org/software/src-highlite -->
    DMap example

    -

    How to use the DTail serverless mode


    +

    How to use the DTail serverless mode



    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'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.

    @@ -3448,7 +3442,7 @@ http://www.gnu.org/software/src-highlite -->
    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.

    -

    Serverless map-reduce query


    +

    Serverless map-reduce query



    The following dmap example is the same as the previously shown one, but the difference is that it operates on a local log file directly:

    @@ -3483,7 +3477,7 @@ http://www.gnu.org/software/src-highlite --> lifetimeConnections group by $hostname order by max($cgocalls)'
    -

    Aggregating CSV files


    +

    Aggregating CSV files



    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.:

    @@ -3505,7 +3499,7 @@ http://www.gnu.org/software/src-highlite -->
    DMap can also be used to query and aggregate CSV files from remote servers.

    -

    Other serverless commands


    +

    Other serverless commands



    The serverless mode works transparently with all other DTail commands. Here are some examples:

    @@ -3584,7 +3578,7 @@ http://www.gnu.org/software/src-highlite --> 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!
    -

    Site Reliability Engineering - Part 1: SRE and Organizational Culture


    +

    Site Reliability Engineering - Part 1: SRE and Organizational Culture



    Published at 2023-08-18T22:43:47+03:00

    @@ -3592,7 +3586,7 @@ http://www.gnu.org/software/src-highlite -->
    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: Operational Balance in SRE
    -2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Aspect
    +2024-01-09 Site Reliability Engineering - Part 3: On-Call Culture and the Human Side

     ▓▓▓▓░░                                                                                  
    @@ -3616,7 +3610,7 @@ DC on fire:
       ░░░░░░░░░░▒▒░░░░░░░░░░░░░░░░░░░░░░░░▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▒▒░░░░░░░░░░░░░░░░░░
     

    -

    SRE and Organizational Culture: Navigating the Nexus


    +

    SRE and Organizational Culture: Navigating the Nexus



    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's all about creating a culture that prioritizes user experience and makes sure everything runs smoothly to meet their needs.

    @@ -3658,7 +3652,7 @@ DC on fire: 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.
    -

    Gemtexter 2.1.0 - Let's Gemtext again³


    +

    Gemtexter 2.1.0 - Let's Gemtext again³



    Published at 2023-07-21T10:19:31+03:00

    @@ -3679,17 +3673,17 @@ DC on fire:
    https://codeberg.org/snonux/gemtexter

    -

    Why Bash?


    +

    Why Bash?



    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's still pretty maintainable and helps me try new Bash tricks here and then!

    Let's list what's new!

    -

    Switch to GPL3 license


    +

    Switch to GPL3 license



    Many (almost all) of the tools and commands (GNU Bash, GMU Sed, GNU Date, GNU Grep, GNU Source Highlight) used by Gemtexter 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!

    -

    Source code highlighting support


    +

    Source code highlighting support



    The HTML output now supports source code highlighting, which is pretty neat if your site is about programming. The requirement is to have the source-highlight 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.:

    @@ -3714,11 +3708,11 @@ http://www.gnu.org/software/src-highlite -->
    Please run source-highlight --lang-list for a list of all supported languages.

    -

    HTML exact variant


    +

    HTML exact variant



    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 gemtexter.conf by adding the line declare -rx HTML_VARIANT=exact. 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.

    -

    Use of Hack webfont by default


    +

    Use of Hack webfont by default



    The Hack web font is a typeface designed explicitly for source code. It'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.

    @@ -3726,7 +3720,7 @@ http://www.gnu.org/software/src-highlite -->
    Hack is open-source and freely available for use and modification under the MIT License.

    -

    HTML Mastodon verification support


    +

    HTML Mastodon verification support



    The following link explains how URL verification works in Mastodon:

    @@ -3756,7 +3750,7 @@ http://www.gnu.org/software/src-highlite -->
    <a href='https://fosstodon.org/@snonux' rel='me'>Me at Mastodon</a>
     

    -

    More


    +

    More



    Additionally, there were a couple of bug fixes, refactorings and overall improvements in the documentation made.

    @@ -3786,7 +3780,7 @@ http://www.gnu.org/software/src-highlite --> 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.
    -

    "Software Developmers Career Guide and Soft Skills" book notes


    +

    "Software Developmers Career Guide and Soft Skills" book notes



    Published at 2023-07-17T04:56:20+03:00

    @@ -3804,9 +3798,9 @@ http://www.gnu.org/software/src-highlite --> '''
    -

    Improve


    +

    Improve



    -

    Always learn new things


    +

    Always learn new things



    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'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.

    @@ -3824,11 +3818,11 @@ http://www.gnu.org/software/src-highlite -->
    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

    -

    Set goals


    +

    Set goals



    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.

    -

    Ratings


    +

    Ratings



    That's a trap: If you have to rate yourself, that'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.

    @@ -3836,7 +3830,7 @@ http://www.gnu.org/software/src-highlite -->
  • Don't do peer rating, it can fire back on you. What if the colleague becomes your new boss?
  • Cooperate rankings are unfortunately HR guidelines and politics and only mirror a little your actual performance.

  • -

    Promotions


    +

    Promotions



    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.

    @@ -3849,7 +3843,7 @@ http://www.gnu.org/software/src-highlite -->
  • If you want a raise be specific how much and know to back your demands. Don't make a thread and no ultimatums.
  • Best way for a promotion is to switch jobs. You can even switch back with a better salary.

  • -

    Finish things


    +

    Finish things



    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.

    @@ -3864,7 +3858,7 @@ http://www.gnu.org/software/src-highlite -->
    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't make your unhappy, but how you react to events do.

    -

    Expand the empire


    +

    Expand the empire



    The larger your empire is, the larger your circle of influence is. The larger the circle of influence is, the more opportunities you have.

    @@ -3875,7 +3869,7 @@ http://www.gnu.org/software/src-highlite -->
    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.

    -

    Be pragmatic and also manage your time


    +

    Be pragmatic and also manage your time



    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's really the trick. For example set a goal of 6 daily pomodores.

    @@ -3885,7 +3879,7 @@ http://www.gnu.org/software/src-highlite -->
    You should feel good of the work done even if you don't finished the task. You will feel good about pomodoro wise even you don't finish the task on hand yet. Helps you to enjoy time off more. Working longer may not sell anything.

    -

    The quota system


    +

    The quota system



    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't commit to something you can't fulfill otherwise you set yourself up for failure.

    @@ -3894,7 +3888,7 @@ http://www.gnu.org/software/src-highlite -->
  • Internal motivation is more important over external motivation. Check out Daniels book drive.
  • Multitasking: Batching is effective. E.g. emails twice daily at pre-set times..

  • -

    Don't waste time


    +

    Don't waste time



    The biggest time waster is TV watching. The TV is programming you. It'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.

    @@ -3903,7 +3897,7 @@ http://www.gnu.org/software/src-highlite -->
  • Meetings can waste time as well. Simply don't go to them. Try to cancel meeting if it can be dealt with via email.
  • 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.

  • -

    Habits


    +

    Habits



    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.

    @@ -3913,7 +3907,7 @@ http://www.gnu.org/software/src-highlite -->
  • We don't have control over our habits but our own routines.
  • Routines help to form the habits, though.

  • -

    Work-life balance


    +

    Work-life balance



    Avoid overwork hours. That's not as beneficial as you might think and comes only with very small rewards. Invest rather in yourself and not in your employer.

    @@ -3925,7 +3919,7 @@ http://www.gnu.org/software/src-highlite -->
    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?

    -

    Mental health


    +

    Mental health



    • Friendships and positive thinking help to have and maintain better health, longer Life, better productivity and increased happiness.
    • @@ -3936,7 +3930,7 @@ http://www.gnu.org/software/src-highlite -->
      In most cases burnout is just an illusion. If you don't have motivation push through the wall. People usually don'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.

      -

      Physical health


      +

      Physical health



      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't do as good when you are in a fasted state).

      @@ -3948,7 +3942,7 @@ http://www.gnu.org/software/src-highlite -->

    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.

    -

    No drama


    +

    No drama



    Avoid drama at work. Where are humans there is drama. You can decide where to spent your energy in. But don'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.

    @@ -3964,13 +3958,13 @@ http://www.gnu.org/software/src-highlite -->
    You have to learn how to work in a team. Be honest but tactful. It's not too be the loudest but about selling your ideas. Don't argue otherwise you won't sell anything. Be persuasive by finding the common ground. Or lead the colleagues to your idea and don't sell it upfront. Communicate clearly.

    -

    Personal brand


    +

    Personal brand



    • Invest your value outside the company. Build your personal brand. Show how valuable you are, also to other companies. Become an asset.
    • Invest in your education. Make your goals known. If you want something ask for it (see also the sections about goals in this document).

    -

    Market yourself


    +

    Market yourself



    • The best way to market yourself is to make you usable.
    • @@ -3983,11 +3977,11 @@ http://www.gnu.org/software/src-highlite -->
    • Have an elevator pitch: "buetow.org - Having fun with computers!"
    • Have social media accounts, especially the ones which are more tech related.

    -

    Networking


    +

    Networking



    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'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?".

    -

    Public speaking


    +

    Public speaking



    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.

    @@ -3997,9 +3991,9 @@ http://www.gnu.org/software/src-highlite -->
    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.

    -

    New job


    +

    New job



    -

    For the interview


    +

    For the interview



    • Build up a network before the interview. E.g., follow and comment blogs. Or go to meet-ups and conferences. Join user groups.
    • @@ -4008,7 +4002,7 @@ http://www.gnu.org/software/src-highlite -->

    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).

    -

    Find the right type of company


    +

    Find the right type of company



    Not all companies are equal. They have individual cultures and guidelines.

    @@ -4020,7 +4014,7 @@ http://www.gnu.org/software/src-highlite -->
    Work in a tech. company if you want to work on/with cutting edge technologies.

    -

    Apply for the new job


    +

    Apply for the new job



    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

    @@ -4033,7 +4027,7 @@ http://www.gnu.org/software/src-highlite -->
    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).

    -

    Negotiation


    +

    Negotiation



    • Whoever names the number first loses. You don't know what someone else is expecting unless told. Low ball number may be an issue but you have to know the market.
    • @@ -4051,21 +4045,21 @@ http://www.gnu.org/software/src-highlite -->
      • Never spilt the difference is the best book for learning negotiation techniques..

      -

      Leaving the old job


      +

      Leaving the old job



      When leaving a job make a clean and non personal as possible. Never complain and never explain. Don't worry about abandonment of the team. Everybody is replacement and you make a business decision. Don't threaten to quit as you are replaceable.

      -

      Other things


      +

      Other things



      • As a leader lead by example and don't lead from the Eiffel tower.
      • As a leader you are responsible for the team. If the team fails then it's your fault only.

      -

      Testing


      +

      Testing



      Unit testing Vs regression testing: Unit tests test the smallest possible unit and get rewritten if the unit gets changed. It'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.

      -

      Books to read


      +

      Books to read



      • Clean Code
      • @@ -4113,13 +4107,13 @@ http://www.gnu.org/software/src-highlite --> 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.
        -

        KISS server monitoring with Gogios


        +

        KISS server monitoring with Gogios



        Published at 2023-06-01T21:10:17+03:00

        Gogios logo

        -

        Introduction


        +

        Introduction



        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.

        @@ -4150,7 +4144,7 @@ The original can be found at https://asciiart.website/index.php?art=objects/computers
        -

        Motivation


        +

        Motivation



        With experience in monitoring solutions like Nagios, Icinga, Prometheus and OpsGenie, these tools often came with many features that I didn'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.

        @@ -4158,7 +4152,7 @@ https://asciiart.website/index.php?art=objects/computers
        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.

        -

        Features


        +

        Features



        • Compatible with Nagios Check scripts: Gogios leverages the widely-used Nagios Check API, allowing to use existing Nagios plugins.
        • @@ -4169,7 +4163,7 @@ https://asciiart.website/index.php?art=objects/computers
        • Email Notifications: Gogios can send email notifications regarding the status of monitored services, ensuring you stay informed about potential issues.
        • CRON-based Execution: Gogios can be quickly scheduled to run periodically via CRON, allowing you to automate monitoring without needing a complex setup.

        -

        Example alert


        +

        Example alert



        This is an example alert report received via E-Mail. Whereas, [C:2 W:0 U:0 OK:51] means that we've got two alerts in status critical, 0 warnings, 0 unknowns and 51 OKs.

        @@ -4191,9 +4185,9 @@ CRITICAL: Check ICMP6 vulcan.buetow.org: Check command timed out Have a nice day!
        -

        Installation


        +

        Installation



        -

        Compiling and installing Gogios


        +

        Compiling and installing Gogios



        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 does with the sudo command and replace the /usr/local/bin path with /usr/bin.

        @@ -4225,7 +4219,7 @@ http://www.gnu.org/software/src-highlite -->
        https://www.rexify.org

        -

        Setting up user, group and directories


        +

        Setting up user, group and directories



        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 _gogios user and group under OpenBSD:

        @@ -4242,7 +4236,7 @@ http://www.gnu.org/software/src-highlite -->
        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.

        -

        Installing monitoring plugins


        +

        Installing monitoring plugins



        Gogios relies on external Nagios or Icinga monitoring plugin scripts. On OpenBSD, you can install the monitoring-plugins 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:

        @@ -4256,9 +4250,9 @@ http://www.gnu.org/software/src-highlite -->
        Once the installation is complete, you can find the monitoring plugins in the /usr/local/libexec/nagios directory, which then can be configured to be used in gogios.json.

        -

        Configuration


        +

        Configuration



        -

        MTA


        +

        MTA



        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.

        @@ -4270,7 +4264,7 @@ echo 'This is a test email from OpenBSD.' | mail -s 'Test Email'
        Check the recipient'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.

        -

        Configuring Gogios


        +

        Configuring Gogios



        To configure Gogios, create a JSON configuration file (e.g., /etc/gogios.json). Here's an example configuration:

        @@ -4333,7 +4327,7 @@ http://www.gnu.org/software/src-highlite -->
        The state.json 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.

        -

        Running Gogios


        +

        Running Gogios



        Now it is time to give it a first run. On OpenBSD, do:

        @@ -4355,7 +4349,7 @@ http://www.gnu.org/software/src-highlite -->
        Gogios is now configured to run every five minutes from 8 am to 10 pm via CRON as the _gogios 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.

        -

        High-availability


        +

        High-availability



        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.

        @@ -4368,7 +4362,7 @@ http://www.gnu.org/software/src-highlite -->

      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).

      -

      Conclusion:


      +

      Conclusion:



      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.

      @@ -4397,7 +4391,7 @@ http://www.gnu.org/software/src-highlite --> 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.
      -

      "The Obstacle is the Way" book notes


      +

      "The Obstacle is the Way" book notes



      Published at 2023-05-06T17:23:16+03:00

      @@ -4418,7 +4412,7 @@ http://www.gnu.org/software/src-highlite -->
      "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.

      -

      Reframe your perspective


      +

      Reframe your perspective



      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.

      @@ -4427,37 +4421,37 @@ http://www.gnu.org/software/src-highlite --> Don't always try to use the front door; a backdoor could open. It's nonsense. Don't fight the judo master with judo. Non-action can be action, exposing the weaknesses of others.


      -

      Embrace rationality


      +

      Embrace rationality



      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.

      -

      Control your response


      +

      Control your response



      You can choose how you respond to obstacles. Focus on what you can control, and don'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.

      -

      Practice emotional and physical resilience


      +

      Practice emotional and physical resilience



      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.

      Focus on what you can control. Don't choose to feel harmed, and then you won't be harmed. I decide things that affect me; nobody else does. E.g., in prison, your mind stays your own. Don't ignore fear but explain it away, have a different view.

      -

      Persistence and patience


      +

      Persistence and patience



      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.).

      -

      Embrace failure


      +

      Embrace failure



      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.

      -

      Be adaptable


      +

      Be adaptable



      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's not about being positive but to be creative. Aim high, but stuff will happen; E.g., surprises will always happen.

      -

      Embrace non-action


      +

      Embrace non-action



      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'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.

      -

      Leverage crisis


      +

      Leverage crisis



      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.

      @@ -4465,19 +4459,19 @@ http://www.gnu.org/software/src-highlite -->
      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't be anything without obstacles. Passing one means you are ready for the next.

      -

      Build your inner citadel


      +

      Build your inner citadel



      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.

      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's other people who aren't. Phil Jackson's hip problem example. To receive unexpected benefits, you must first accept the unexpected obstacles. Meditate on death. It's a universal obstacle. Use it as a reminder to do your best.

      -

      Love everything that happens


      +

      Love everything that happens



      Turn an obstacle the other way around for your benefit. Use it at fuel. It'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.

      Should I hate people who hate me? That'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't like.

      -

      Conclusion


      +

      Conclusion



      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.

      @@ -4510,7 +4504,7 @@ http://www.gnu.org/software/src-highlite --> 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.
      -

      Unveiling guprecords.raku: Global Uptime Records with Raku


      +

      Unveiling guprecords.raku: Global Uptime Records with Raku



      Published at 2023-04-30T13:10:26+03:00

      @@ -4531,7 +4525,7 @@ http://www.gnu.org/software/src-highlite --> +-----+-----------------+-----------------------------+
      -

      Introduction


      +

      Introduction



      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.

      @@ -4554,7 +4548,7 @@ http://www.gnu.org/software/src-highlite -->

    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.

    -

    How Guprecords works


    +

    How Guprecords works



    Guprecords works in three stages:

    @@ -4580,7 +4574,7 @@ http://www.gnu.org/software/src-highlite -->
  • Output formats available: Plaintext, Markdown, and Gemtext
  • Provides top entries based on the specified limit

  • -

    Example


    +

    Example



    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's an example of what the global uptime report (grouped by total host uptimes) might look like:

    @@ -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
    -

    Conclusion


    +

    Conclusion



    Guprecords is a small, yet powerful tool for analyzing uptime statistics. While developing Guprecords, I have come to truly appreciate and love Raku's expressiveness. The language is designed to be both powerful and flexible, allowing developers to express their intentions and logic more clearly and concisely.

    @@ -4692,7 +4686,7 @@ no1 in 455 days, 18:52:44 | at Sun Jul 21 07:37:51 2024 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.
    -

    Algorithms and Data Structures in Go - Part 1


    +

    Algorithms and Data Structures in Go - Part 1



    Published at 2023-04-09T22:31:42+03:00

    @@ -4716,7 +4710,7 @@ no1 in 455 days, 18:52:44 | at Sun Jul 21 07:37:51 2024
    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.

    -

    Type constraints


    +

    Type constraints



    First, the package ds (data structures) defines the types.go. All examples will either operate on the Integer or Number type:

    @@ -4740,7 +4734,7 @@ http://www.gnu.org/software/src-highlite -->
    -

    ArrayList


    +

    ArrayList



    Next comes the arraylist.go, which defines the underlying data structure all the algorithms of this series will use. ArrayList is just a type alias of a Go array (or slice) with custom methods on it:

    @@ -4800,7 +4794,7 @@ http://www.gnu.org/software/src-highlite --> }
    -

    Helper methods


    +

    Helper methods



    The FirstN method only returns the first N elements of the ArrayList. This is useful for printing out only parts of the data structure:

    @@ -4859,7 +4853,7 @@ http://www.gnu.org/software/src-highlite -->
    -

    Sleep sort


    +

    Sleep sort



    Let'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 ArrayList. It'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'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.

    @@ -4906,7 +4900,7 @@ http://www.gnu.org/software/src-highlite -->
    This Go code implements the sleep sort algorithm using generics and goroutines. The main function Sleep[V ds.Integer](a ds.ArrayList[V]) ds.ArrayList[V] takes a generic ArrayList as input and returns a sorted ArrayList. The code creates a separate goroutine for each element in the input array, sleeps for a duration proportional to the element'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 ArrayList is constructed by appending the elements received from the channel in the order they arrive. The sync.WaitGroup is used to synchronize goroutines and ensure that all of them have completed before closing the channel.

    -

    Testing


    +

    Testing



    For testing, we only allow values up to 10, as otherwise, it would take too long to finish:

    @@ -4965,7 +4959,7 @@ http://www.gnu.org/software/src-highlite --> 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.
    -

    "Never split the difference" book notes


    +

    "Never split the difference" book notes



    Published at 2023-04-01T20:00:17+03:00

    @@ -4983,7 +4977,7 @@ http://www.gnu.org/software/src-highlite --> '''
    -

    Tactical listening, spreading empathy


    +

    Tactical listening, spreading empathy



    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.

    @@ -4994,7 +4988,7 @@ http://www.gnu.org/software/src-highlite -->
    Mirror training is like Jedi training. Simple but effective. A mirror needs space. Be silent after "you want this?"

    -

    Mindset of discovery


    +

    Mindset of discovery



    Try to have multiple realities in your mind and use facts to distinguish between real and false.

    @@ -5006,7 +5000,7 @@ http://www.gnu.org/software/src-highlite -->
    Try: to put a label on someone's emotion and then be silent. Wait for the other to reveal himself. "You seem unhappy about this?"

    -

    More tips


    +

    More tips



    • Put on a poker face and don't show emotions.
    • @@ -5015,7 +5009,7 @@ http://www.gnu.org/software/src-highlite -->
    • Being right is not the key to successful negotiation; being mindful is.
    • Be in the safe zone of empathy and acknowledge bad news.

    -

    "No" starts the conversation


    +

    "No" starts the conversation



    When the opponent starts with a "no", he feels in control and comfortable. That's why he has to start with "no".

    @@ -5028,11 +5022,11 @@ http://www.gnu.org/software/src-highlite -->
    Get a "That's right" when negotiating. Don't get a "you're right". You can summarise the opponent to get a "that's right".

    -

    Win-win


    +

    Win-win



    Win-win is a naive approach when encountering the win-lose counterpart, but always cooperate. Don't compromise, and don't split the difference. We don't compromise because it's right; we do it because it is easy. You must embrace the hard stuff; that's where the great deals are.

    -

    On Deadlines


    +

    On Deadlines



    • All deadlines are imaginary.
    • @@ -5040,7 +5034,7 @@ http://www.gnu.org/software/src-highlite -->
    • They push a deal to a conclusion.
    • They rush the counterpart to cause pressure and anxiety.

    -

    Analyse the opponent


    +

    Analyse the opponent



    • Understand the motivation of people behind the table as well.
    • @@ -5050,7 +5044,7 @@ http://www.gnu.org/software/src-highlite -->

    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.

    -

    Use different ways of saying "no."


    +

    Use different ways of saying "no."



    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....

    @@ -5058,7 +5052,7 @@ http://www.gnu.org/software/src-highlite -->
    You always have to embrace thoughtful confrontation for good negotiation and life. Don't avoid honest, clear conflict. It will give you the best deals. Compromises are mostly bad deals for both sides. Most people don't negotiate a win-win but a win-lose. Know the best and worst outcomes and what is acceptable for you.

    -

    Calibrated question


    +

    Calibrated question



    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

    @@ -5074,11 +5068,11 @@ http://www.gnu.org/software/src-highlite -->
    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".

    -

    The black swan


    +

    The black swan



    What we don'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.

    -

    More


    +

    More



    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.

    @@ -5123,7 +5117,7 @@ http://www.gnu.org/software/src-highlite --> 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.
    -

    Gemtexter 2.0.0 - Let's Gemtext again²


    +

    Gemtexter 2.0.0 - Let's Gemtext again²



    Published at 2023-03-25T17:50:32+02:00

    @@ -5148,7 +5142,7 @@ http://www.gnu.org/software/src-highlite -->
    Let's list what's new!

    -

    Minimal template engine


    +

    Minimal template engine



    Gemtexter now supports templating, enabling dynamically generated content to .gmi files before converting anything to any output format like HTML and Markdown.

    @@ -5214,7 +5208,7 @@ See more entries about DTail and Golang: Blablabla...
    -

    Added hooks


    +

    Added hooks



    You can configure PRE_GENERATE_HOOK and POST_PUBLISH_HOOK to point to scripts to be executed before running --generate, or after running --publish. 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 --publish.

    @@ -5228,11 +5222,11 @@ http://www.gnu.org/software/src-highlite --> declare -xr POST_PUBLISH_HOOK=./post_publish_hook.sh
    -

    Use of safer Bash options


    +

    Use of safer Bash options



    Gemtexter now does set -euf -o pipefile, which helps to eliminate bugs and to catch scripting errors sooner. Previous versions only set -e.

    -

    Meta cache made obsolete


    +

    Meta cache made obsolete



    Here is the breaking change to older versions of Gemtexter. The $BASE_CONTENT_DIR/meta directory was made obsolete. meta 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 .gmi file. And if it is missing, Gemtexter will set it to the current date and time at first run.

    @@ -5262,11 +5256,11 @@ http://www.gnu.org/software/src-highlite --> The remaining content of the Gemtext file...
    -

    XMLLint support


    +

    XMLLint support



    Optionally, when the xmllint 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.

    -

    More


    +

    More



    Additionally, there were a couple of bug fixes, refactorings and overall improvements in the documentation made.

    @@ -5296,7 +5290,7 @@ http://www.gnu.org/software/src-highlite --> 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.
    -

    "The Pragmatic Programmer" book notes


    +

    "The Pragmatic Programmer" book notes



    Published at 2023-03-16T00:55:20+02:00

    @@ -5347,7 +5341,7 @@ http://www.gnu.org/software/src-highlite -->
    Do what works and not what's fashionable. E.g. does SCRUM make sense? The goal is to deliver deliverables and not to "become" agile.

    -

    Continuous learning


    +

    Continuous learning



    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.

    @@ -5358,7 +5352,7 @@ http://www.gnu.org/software/src-highlite -->
    Think critically about everything you learn. Use paper for your notes. There is something special about it.

    -

    Stay connected


    +

    Stay connected



    It's your life, and you own it. Bruce Lee once said:

    @@ -5371,7 +5365,7 @@ http://www.gnu.org/software/src-highlite -->
    It's your life. Share it, celebrate it, be proud and have fun.

    -

    The story of stone soup


    +

    The story of stone soup



    How to motivate others to contribute something (e.g. ideas to a startup):

    @@ -5916,7 +5910,7 @@ http://www.gnu.org/software/src-highlite --> 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 :-)
    -

    Installing DTail on OpenBSD


    +

    Installing DTail on OpenBSD



    Published at 2022-10-30T11:03:19+02:00

    @@ -5969,7 +5963,7 @@ http://www.gnu.org/software/src-highlite -->
    I will also mention some relevant Rexfile snippets in this post!

    -

    Compile it


    +

    Compile it



    First of all, DTail needs to be downloaded and compiled. For that, git, go, and gmake are required:

    @@ -6004,7 +5998,7 @@ $ doas pkg_delete git go gmake
    One day I shall create an official OpenBSD port for DTail.

    -

    Install it


    +

    Install it



    Installing the binaries is now just a matter of copying them to /usr/local/bin as follows:

    @@ -6046,7 +6040,7 @@ END $ doas chmod 755 /etc/rc.d/dserver
    -

    Rexification


    +

    Rexification



    This is the task for setting it up via Rex. Note the . . . ., that's a placeholder which we will fill up more and more during this blog post:

    @@ -6073,7 +6067,7 @@ task 'dtail', group => 'frontends', };
    -

    Configure it


    +

    Configure it



    Now, DTail is fully installed but still needs to be configured. Grab the default config file from GitHub ...

    @@ -6096,7 +6090,7 @@ $ curl https://raw.githubusercontent.com/mimecast/dtail/master/examples/dtail.js }
    -

    Rexification


    +

    Rexification



    That's as simple as adding the following to the Rex task:

    @@ -6112,7 +6106,7 @@ file '/etc/dserver/dtail.json', on_change => sub { $restart = TRUE };
    -

    Update the key cache for it


    +

    Update the key cache for it



    DTail relies on SSH for secure authentication and communication. However, the system user _dserver has no permission to read the SSH public keys from the user's home directories, so the DTail server also checks for available public keys in an alternative path /var/run/dserver/cache.

    @@ -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
    -

    Rexification


    +

    Rexification



    That's done by adding ...

    @@ -6181,7 +6175,7 @@ append_if_no_such_line '/etc/daily.local', '/usr/local/bin/dserver-u
    ... to the Rex task!

    -

    Start it


    +

    Start it



    Now, it's time to enable and start the DTail server:

    @@ -6221,7 +6215,7 @@ Caching /home/rex/.ssh/authorized_keys -> /var/cache/dserver/rex.authorized_k All set...
    -

    Use it


    +

    Use it



    The DTail server is now ready to serve connections. You can use any DTail commands, such as dtail, dgrep, dmap, dcat, dtailhealth, to do so. Checkout out all the usage examples on the official DTail page.

    @@ -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
    -

    Conclusions


    +

    Conclusions



    It's a bit of manual work, but it'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!

    @@ -6396,7 +6390,7 @@ jgs (________\ \ 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.
    -

    Gemtexter 1.1.0 - Let's Gemtext again


    +

    Gemtexter 1.1.0 - Let's Gemtext again



    Published at 2022-08-27T18:25:57+01:00

    @@ -6418,9 +6412,9 @@ jgs (________\ \
    It has been around a year since I released the first version 1.0.0. Although, there aren'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.

    -

    What's new?


    +

    What's new?



    -

    Automatic check for GNU version requirements


    +

    Automatic check for GNU version requirements



    Gemtexter relies on the GNU versions of the tools grep, sed and date and it also requires the Bash shell in version 5 at least. That's now done in the check_dependencies() function:

    @@ -6449,15 +6443,15 @@ http://www.gnu.org/software/src-highlite -->
    Especially macOS users didn't read the README carefully enough to install GNU Grep, GNU Sed and GNU Date before using Gemtexter.

    -

    Backticks now produce inline code blocks in the HTML output


    +

    Backticks now produce inline code blocks in the HTML output



    The Gemtext format doesn't support inline code blocks, but Gemtexter now produces inline code blocks (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.

    -

    Cache for Atom feed generation


    +

    Cache for Atom feed generation



    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 .gmi file to decide whether anything of the content has changed or not.

    -

    Input filter support


    +

    Input filter support



    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:

    @@ -6468,22 +6462,22 @@ http://www.gnu.org/software/src-highlite -->
    ./gemtexter --generate '.*hello.*'
     

    -

    Revamped git support


    +

    Revamped git support



    The Git support has been completely rewritten. It's now more reliable and faster too. Have a look at the README for more information.

    -

    Addition of htmlextras and web font support


    +

    Addition of htmlextras and web font support



    The htmlextras folder now contains all extra files required for the HTML output format such as cascading style sheet (CSS) files and web fonts.

    -

    Sub-section support


    +

    Sub-section support



    It'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.:

    The foo.zone main site
    The notes sub-section (with different fonts)

    -

    More


    +

    More



    Additionally, there were a couple of bug fixes, refactorings and overall improvements in the documentation made.

    @@ -6515,7 +6509,7 @@ http://www.gnu.org/software/src-highlite --> I was amazed at how easy it is to automatically generate and update Let's Encrypt certificates with OpenBSD.
    -

    Let's Encrypt with OpenBSD and Rex


    +

    Let's Encrypt with OpenBSD and Rex



    Published at 2022-07-30T12:14:31+01:00

    @@ -6548,7 +6542,7 @@ http://www.gnu.org/software/src-highlite -->
    I was amazed at how easy it is to automatically generate and update Let's Encrypt certificates with OpenBSD.

    -

    What's Let's Encrypt?


    +

    What's Let's Encrypt?



    Let'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's largest certificate authority, used by more than 265 million websites, with the goal of all websites being secure and using HTTPS.

    @@ -6556,7 +6550,7 @@ http://www.gnu.org/software/src-highlite -->
    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.

    -

    Meet acme-client


    +

    Meet acme-client



    acme-client is the default Automatic Certifcate Management Environment (ACME) client on OpenBSD and part of the OpenBSD base system.

    @@ -6576,11 +6570,11 @@ http://www.gnu.org/software/src-highlite -->
  • Let's Encrypt then will contact the hostname for the certificate through a particular URL (e.g. http://foo.zone/.well-known/acme-challenge/...) to verify that the requester is the valid owner of the host.
  • Let's Encrypt generates a certificate, which then is downloaded to /etc/ssl/....

  • -

    Configuration


    +

    Configuration



    There is some (but easy) configuration required to make that all work on OpenBSD.

    -

    acme-client.conf


    +

    acme-client.conf



    This is how my /etc/acme-client.conf looks like (I copied a template from /etc/examples/acme-client.conf to /etc/acme-client.conf and added my domains to the bottom:

    @@ -6679,7 +6673,7 @@ server "foo.zone" {
    It is worth noticing that httpd 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's Encrypt. As you saw in the config snippet above, Let's Encrypt only requests the plain HTTP endpoint for the verification process, so HTTPS doesn't need to be operational yet at this stage. But once the certificates are generated, you will have to reload or restart httpd to use any new certificate.

    -

    CRON job


    +

    CRON job



    You could now run doas acme-client foo.zone to generate the certificate or to renew it. Or you could automate it with CRON.

    @@ -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
    -

    relayd.conf and smtpd.conf


    +

    relayd.conf and smtpd.conf



    Besides httpd, relayd (mainly for Gemini) and smtpd (for mail, of course) also use TLS certificates. And as you can see in acme.sh, the services are reloaded or restarted (smtpd doesn't support reload) whenever a certificate is generated or updated.

    -

    Rexification


    +

    Rexification



    I didn't write all these configuration files by hand. As a matter of fact, everything is automated with the Rex configuration management system.

    @@ -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/;
    -

    General ACME client configuration


    +

    General ACME client configuration



    ACME will be installed into the frontend group of hosts. Here, blowfish is the primary, and twofish is the secondary OpenBSD box.

    @@ -6925,7 +6919,7 @@ if [ $has_update = yes ]; then fi
    -

    Service rexification


    +

    Service rexification



    These are the Rex tasks setting up httpd, relayd and smtpd services:

    @@ -7153,7 +7147,7 @@ match from local for local action localmail match from local for any action outbound
    -

    All pieces together


    +

    All pieces together



    For the complete Rexfile example and all the templates, please look at the Git repository:

    @@ -7167,7 +7161,7 @@ rex commons
    The commons 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!

    -

    Conclusion


    +

    Conclusion



    ACME and Let'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.

    @@ -7545,7 +7539,7 @@ v = 008 [v = p*c*(s != c ? 2 : 1)] Total logical CPUs 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.
    -

    Perl is still a great choice


    +

    Perl is still a great choice



    Published at 2022-05-27T07:50:12+01:00; Updated at 2023-01-28

    @@ -7565,7 +7559,7 @@ v = 008 [v = p*c*(s != c ? 2 : 1)] Total logical CPUs
  • Why use Perl as there are better alternatives?
  • Why all the sigils? It looks like an exploding ASCII factory!!

  • -

    Write-only language


    +

    Write-only language



    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's many years, and there are many old scripts not following the modern Perl best practices (as they didn't exist yet). So yes, legacy scripts may be difficult to read. Japanese may be difficult to read too if you don't know Japanese, though.

    @@ -7591,7 +7585,7 @@ v = 008 [v = p*c*(s != c ? 2 : 1)] Total logical CPUs
    This all doesn't mean that you can'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't the original intend of why Perl was invented (more on that later).

    -

    Is Perl abandoned?


    +

    Is Perl abandoned?



    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:

    @@ -7632,7 +7626,7 @@ v = 008 [v = p*c*(s != c ? 2 : 1)] Total logical CPUs
    Perl New Features

    -

    Why use Perl as there are better alternatives?


    +

    Why use Perl as there are better alternatives?



    Here, common sense must be applied. I don'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't need to bother to look for "better" alternatives:

    @@ -7661,7 +7655,7 @@ v = 008 [v = p*c*(s != c ? 2 : 1)] Total logical CPUs
    Cor - Bringing modern OOP to the Perl Core

    -

    Why all the sigils? It looks like an exploding ASCII factory!!


    +

    Why all the sigils? It looks like an exploding ASCII factory!!



    The sigils $ @ % & (where Perl is famously known for) serve a purpose. They seem confusing at first, but they actually make the code better readable. $scalar is a scalar variable (holding a single value), @array is an array (holding a list of values), %hash holds a list of key-value pairs and &sub is for subroutines. A given variable $ref can also hold reference to something. @$arrayref dereferences a reference to an array, %$hashref to a hash, $$scalarref to a scalar, &$subref 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).

    @@ -7669,7 +7663,7 @@ v = 008 [v = p*c*(s != c ? 2 : 1)] Total logical CPUs
    https://www.perl.com/article/on-sigils/

    -

    Where do I personally still use perl?


    +

    Where do I personally still use perl?



    • 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.
    • @@ -7870,7 +7864,7 @@ learn () { 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):
      -

      The release of DTail 4.0.0


      +

      The release of DTail 4.0.0



      Published at 2022-03-06T18:11:39+00:00

      @@ -7892,9 +7886,9 @@ learn () {
      https://dtail.dev

      -

      So, what's new in 4.0.0?


      +

      So, what's new in 4.0.0?



      -

      Rewritten logging


      +

      Rewritten logging



      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.

      @@ -7921,7 +7915,7 @@ const (
      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).

      -

      Configurable terminal color codes


      +

      Configurable terminal color codes



      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's now possible to configure the foreground and background colors and an attribute (e.g. dim, bold, ...).

      @@ -8037,7 +8031,7 @@ const ( jsonschema -i dtail.json schemas/dtail.schema.json
      -

      Serverless mode


      +

      Serverless mode



      All DTail commands can now operate on log files (and other text files) directly without any DTail server running. So there isn't a need anymore to install a DTail server when you are on the target server already anyway, like the following example shows:

      @@ -8053,7 +8047,7 @@ jsonschema -i dtail.json schemas/dtail.schema.json
      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.

      -

      Shorthand flags


      +

      Shorthand flags



      The "--files" from the previous example is now redundant. As a shorthand, It is now possible to do the following instead:

      @@ -8063,7 +8057,7 @@ jsonschema -i dtail.json schemas/dtail.schema.json
      Of course, this also works with all other DTail client commands (dgrep, dcat, ... etc).

      -

      Spartan (aka plain) mode


      +

      Spartan (aka plain) mode



      There'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.:

      @@ -8074,7 +8068,7 @@ jsonschema -i dtail.json schemas/dtail.schema.json
      This might be useful if you wanted to post-process the output.

      -

      Standard input pipe


      +

      Standard input pipe



      In serverless mode, you might want to process your data in a pipeline. You can do that now too through an input pipe:

      @@ -8089,7 +8083,7 @@ jsonschema -i dtail.json schemas/dtail.schema.json % awk '.....' < /some/file | dtail ....
      -

      New command dtailhealth


      +

      New command dtailhealth



      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).

      @@ -8100,7 +8094,7 @@ jsonschema -i dtail.json schemas/dtail.schema.json exec /usr/local/bin/dtailhealth --server localhost:2222
      -

      Improved documentation


      +

      Improved documentation



      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).

      @@ -8114,7 +8108,7 @@ exec /usr/local/bin/dtailhealth --server localhost:2222

    That will be added in one of the future releases.

    -

    Integration testing suite


    +

    Integration testing suite



    DTail comes already with some unit tests, but what'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.

    @@ -8135,7 +8129,7 @@ exec /usr/local/bin/dtailhealth --server localhost:2222 % go test -race -v ./integrationtests
    -

    Improved code


    +

    Improved code



    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:

    @@ -8145,11 +8139,11 @@ exec /usr/local/bin/dtailhealth --server localhost:2222
    Other than that, a lot of other code has been refactored as I saw fit.

    -

    Use of memory pools


    +

    Use of memory pools



    DTail makes excessive use of string builder and byte buffer objects. For performance reasons, those are now re-used from memory pools.

    -

    What's next


    +

    What's next



    DTail 5 won't be released any time soon I guess, but some 4.x.y releases will follow this year fore sure. I can think of:

    @@ -8503,7 +8497,7 @@ GNU/kFreeBSD rhea.buetow.org 8.0-RELEASE-p5 FreeBSD 8.0-RELEASE-p5 #2: Sat Nov 2 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.
    -

    Bash Golf Part 2


    +

    Bash Golf Part 2



    Published at 2022-01-01T23:36:15+00:00; Updated at 2022-01-05

    @@ -8524,7 +8518,7 @@ jgs^^^^^^^`^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2022-01-01 Bash Golf Part 2 (You are currently reading this)
    2023-12-10 Bash Golf Part 3

    -

    Redirection


    +

    Redirection



    Let's have a closer look at Bash redirection. As you might already know that there are 3 standard file descriptors:

    @@ -8656,7 +8650,7 @@ First line: Learn You a Haskell Second line: for Great Good
    -

    HERE


    +

    HERE



    I have mentioned HERE-documents and HERE-strings already in this post. Let'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).

    @@ -8739,7 +8733,7 @@ Learn you a Golang for Great Good I like Perl too
    -

    RANDOM


    +

    RANDOM



    Random is a special built-in variable containing a different pseudo random number each time it's used.

    @@ -8784,11 +8778,11 @@ Delaying script execution for 42 seconds... Continuing script execution...
    -

    set -x and set -e and pipefile


    +

    set -x and set -e and pipefile



    In my opinion, -x and -e and pipefile are the most useful Bash options. Let's have a look at them one after another.

    -

    -x


    +

    -x



    -x prints commands and their arguments as they are executed. This helps to develop and debug your Bash code:

    @@ -8830,7 +8824,7 @@ Second line: for Great Good ❯
    -

    -e


    +

    -e



    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).

    -- cgit v1.2.3