summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-09-13 12:05:30 +0300
committerPaul Buetow <paul@buetow.org>2025-09-13 12:05:30 +0300
commitdf44a2f93f69f6148b08ba9b608f8c6bdbdd39c9 (patch)
tree81dd5edae85c2eeec2842da61040def232a3cec2
parentef468763e42facc08c183ebf89bfd6ae9bf267e1 (diff)
Update content for md
-rw-r--r--about/resources.md204
-rw-r--r--gemfeed/2021-05-16-personal-bash-coding-style-guide.md1
-rw-r--r--gemfeed/2021-06-05-gemtexter-one-bash-script-to-rule-it-all.md1
-rw-r--r--gemfeed/2021-11-29-bash-golf-part-1.md2
-rw-r--r--gemfeed/2022-01-01-bash-golf-part-2.md2
-rw-r--r--gemfeed/2023-10-29-kiss-static-web-photo-albums-with-photoalbum.sh.md1
-rw-r--r--gemfeed/2023-12-10-bash-golf-part-3.md2
-rw-r--r--gemfeed/2024-01-13-one-reason-why-i-love-openbsd.md2
-rw-r--r--gemfeed/2024-08-05-typing-127.1-words-per-minute.md2
-rw-r--r--gemfeed/2025-09-14-bash-golf-part-4.md536
-rw-r--r--gemfeed/index.md1
-rw-r--r--index.md3
-rw-r--r--uptime-stats.md2
13 files changed, 654 insertions, 105 deletions
diff --git a/about/resources.md b/about/resources.md
index 8b920e6b..6a9affd3 100644
--- a/about/resources.md
+++ b/about/resources.md
@@ -35,106 +35,106 @@ You won't find any links on this site because, over time, the links will break.
In random order:
+* Tmux 2: Productive Mouse-free Development; Brain P. Hogan; The Pragmatic Programmers
+* Think Raku (aka Think Perl 6); Laurent Rosenfeld, Allen B. Downey; O'Reilly
+* Developing Games in Java; David Brackeen and others...; New Riders
+* Hands-on Infrastructure Monitoring with Prometheus; Joel Bastos, Pedro Araujo; Packt
+* Concurrency in Go; Katherine Cox-Buday; O'Reilly
+* Clusterbau mit Linux-HA; Michael Schwartzkopff; O'Reilly
+* Programming Perl aka "The Camel Book"; Tom Christiansen, brian d foy, Larry Wall & Jon Orwant; O'Reilly
+* DNS and BIND; Cricket Liu; O'Reilly
+* Effective Java; Joshua Bloch; Addison-Wesley Professional
+* Perl New Features; Joshua McAdams, brian d foy; Perl School
+* Pro Puppet; James Turnbull, Jeffrey McCune; Apress
+* The DevOps Handbook; Gene Kim, Jez Humble, Patrick Debois, John Willis; Audible
+* C++ Programming Language; Bjarne Stroustrup;
+* Distributed Systems: Principles and Paradigms; Andrew S. Tanenbaum; Pearson
* The Kubernetes Book; Nigel Poulton; Unabridged Audiobook
-* Object-Oriented Programming with ANSI-C; Axel-Tobias Schreiner
-* Effective awk programming; Arnold Robbins; O'Reilly
+* Raku Fundamentals; Moritz Lenz; Apress
* Learn You a Haskell for Great Good!; Miran Lipovaca; No Starch Press
-* Raku Recipes; J.J. Merelo; Apress
-* Polished Ruby Programming; Jeremy Evans; Packt Publishing
+* Amazon Web Services in Action; Michael Wittig and Andreas Wittig; Manning Publications
+* Systems Performance Tuning; Gian-Paolo D. Musumeci and others...; O'Reilly
+* Ultimate Go Notebook; Bill Kennedy
+* The Pragmatic Programmer; David Thomas; Addison-Wesley
+* Java ist auch eine Insel; Christian Ullenboom;
+* Funktionale Programmierung; Peter Pepper; Springer
* Leanring eBPF; Liz Rice; O'Reilly
-* Site Reliability Engineering; How Google runs production systems; O'Reilly
-* Learn You Some Erlang for Great Good; Fred Herbert; No Starch Press
-* Go Brain Teasers - Exercise Your Mind; Miki Tebeka; The Pragmatic Programmers
-* Developing Games in Java; David Brackeen and others...; New Riders
-* Think Raku (aka Think Perl 6); Laurent Rosenfeld, Allen B. Downey; O'Reilly
* Programming Ruby 3.3 (5th Edition); Noel Rappin, with Dave Thomas; The Pragmatic Bookshelf
+* Effective awk programming; Arnold Robbins; O'Reilly
* Systemprogrammierung in Go; Frank Müller; dpunkt
-* The KCNA (Kubernetes and Cloud Native Associate) Book; Nigel Poulton
-* The Pragmatic Programmer; David Thomas; Addison-Wesley
+* Raku Recipes; J.J. Merelo; Apress
+* 97 things every SRE should know; Emil Stolarsky, Jaime Woo; O'Reilly
* 100 Go Mistakes and How to Avoid Them; Teiva Harsanyi; Manning Publications
-* Java ist auch eine Insel; Christian Ullenboom;
-* Funktionale Programmierung; Peter Pepper; Springer
-* 21st Century C: C Tips from the New School; Ben Klemens; O'Reilly
-* The Go Programming Language; Alan A. A. Donovan; Addison-Wesley Professional
-* Clusterbau mit Linux-HA; Michael Schwartzkopff; O'Reilly
-* Effective Java; Joshua Bloch; Addison-Wesley Professional
+* Object-Oriented Programming with ANSI-C; Axel-Tobias Schreiner
+* Higher Order Perl; Mark Dominus; Morgan Kaufmann
* Modern Perl; Chromatic ; Onyx Neon Press
-* Amazon Web Services in Action; Michael Wittig and Andreas Wittig; Manning Publications
-* Pro Puppet; James Turnbull, Jeffrey McCune; Apress
-* 97 things every SRE should know; Emil Stolarsky, Jaime Woo; O'Reilly
-* Programming Perl aka "The Camel Book"; Tom Christiansen, brian d foy, Larry Wall & Jon Orwant; O'Reilly
-* Hands-on Infrastructure Monitoring with Prometheus; Joel Bastos, Pedro Araujo; Packt
+* Go Brain Teasers - Exercise Your Mind; Miki Tebeka; The Pragmatic Programmers
+* Data Science at the Command Line; Jeroen Janssens; O'Reilly
* Kubernetes Cookbook; Sameer Naik, Sébastien Goasguen, Jonathan Michaux; O'Reilly
-* Tmux 2: Productive Mouse-free Development; Brain P. Hogan; The Pragmatic Programmers
-* DevOps And Site Reliability Engineering Handbook; Stephen Fleming; Audible
-* C++ Programming Language; Bjarne Stroustrup;
-* Concurrency in Go; Katherine Cox-Buday; O'Reilly
+* The Go Programming Language; Alan A. A. Donovan; Addison-Wesley Professional
+* The Practise of System and Network Administration; Thomas A. Limoncelli, Christina J. Hogan, Strata R. Chalup; Addison-Wesley Professional Pro Git; Scott Chacon, Ben Straub; Apress
* Terraform Cookbook; Mikael Krief; Packt Publishing
-* The DevOps Handbook; Gene Kim, Jez Humble, Patrick Debois, John Willis; Audible
-* Raku Fundamentals; Moritz Lenz; Apress
* The Docker Book; James Turnbull; Kindle
-* Ultimate Go Notebook; Bill Kennedy
-* Distributed Systems: Principles and Paradigms; Andrew S. Tanenbaum; Pearson
-* The Practise of System and Network Administration; Thomas A. Limoncelli, Christina J. Hogan, Strata R. Chalup; Addison-Wesley Professional Pro Git; Scott Chacon, Ben Straub; Apress
-* Higher Order Perl; Mark Dominus; Morgan Kaufmann
-* Data Science at the Command Line; Jeroen Janssens; O'Reilly
-* DNS and BIND; Cricket Liu; O'Reilly
-* Systems Performance Tuning; Gian-Paolo D. Musumeci and others...; O'Reilly
-* Perl New Features; Joshua McAdams, brian d foy; Perl School
+* Site Reliability Engineering; How Google runs production systems; O'Reilly
+* 21st Century C: C Tips from the New School; Ben Klemens; O'Reilly
+* Polished Ruby Programming; Jeremy Evans; Packt Publishing
+* The KCNA (Kubernetes and Cloud Native Associate) Book; Nigel Poulton
+* DevOps And Site Reliability Engineering Handbook; Stephen Fleming; Audible
+* Learn You Some Erlang for Great Good; Fred Herbert; No Starch Press
## Technical references
I didn't read them from the beginning to the end, but I am using them to look up things. The books are in random order:
-* Groovy Kurz & Gut; Joerg Staudemeier; O'Reilly
-* Relayd and Httpd Mastery; Michael W Lucas
-* Algorithms; Robert Sedgewick, Kevin Wayne; Addison Wesley
-* Implementing Service Level Objectives; Alex Hidalgo; O'Reilly
* The Linux Programming Interface; Michael Kerrisk; No Starch Press
-* BPF Performance Tools - Linux System and Application Observability, Brendan Gregg; Addison Wesley
-* Understanding the Linux Kernel; Daniel P. Bovet, Marco Cesati; O'Reilly
+* Implementing Service Level Objectives; Alex Hidalgo; O'Reilly
+* Algorithms; Robert Sedgewick, Kevin Wayne; Addison Wesley
* Go: Design Patterns for Real-World Projects; Mat Ryer; Packt
+* Groovy Kurz & Gut; Joerg Staudemeier; O'Reilly
+* Understanding the Linux Kernel; Daniel P. Bovet, Marco Cesati; O'Reilly
+* BPF Performance Tools - Linux System and Application Observability, Brendan Gregg; Addison Wesley
+* Relayd and Httpd Mastery; Michael W Lucas
## Self-development and soft-skills books
In random order:
-* Psycho-Cybernetics; Maxwell Maltz; Perigee Books
-* The 7 Habits Of Highly Effective People; Stephen R. Covey; Simon & Schuster UK
-* The Off Switch; Mark Cropley; Virgin Books (RE-READ 1ST TIME)
* Influence without Authority; A. Cohen, D. Bradford; Wiley
-* Getting Things Done; David Allen
-* The Obstacle Is The Way; Ryan Holiday; Profile Books Ltd
-* The Good Enough Job; Simone Stolzoff; Ebury Edge
-* Coders at Work - Reflections on the craft of programming, Peter Seibel and Mitchell Dorian et al., Audiobook
-* Buddah and Einstein walk into a Bar; Guy Joseph Ale, Claire Bloom; Blackstone Publishing
-* Eat That Frog!; Brian Tracy; Hodder Paperbacks
-* Time Management for System Administrators; Thomas A. Limoncelli; O'Reilly
-* Solve for Happy; Mo Gawdat (RE-READ 1ST TIME)
* The Bullet Journal Method; Ryder Carroll; Fourth Estate
-* Consciousness: A Very Short Introduction; Susan Blackmore; Oxford Uiversity Press
-* Eat That Frog; Brian Tracy
-* Who Moved My Cheese?; Dr. Spencer Johnson; Vermilion
-* So Good They Can't Ignore You; Cal Newport; Business Plus
-* Digital Minimalism; Cal Newport; Portofolio Penguin
-* 101 Essays that change the way you think; Brianna Wiest; Audiobook
+* Deep Work; Cal Newport; Piatkus
+* Solve for Happy; Mo Gawdat (RE-READ 1ST TIME)
* Staff Engineer: Leadership beyond the management track; Will Larson; Audiobook
-* Ultralearning; Anna Laurent; Self-published via Amazon
-* Ultralearning; Scott Young; Thorsons
-* Slow Productivity; Cal Newport; Penguin Random House
-* 97 Things Every Engineering Manager Should Know; Camille Fournier; Audiobook
* Soft Skills; John Sommez; Manning Publications
-* Stop starting, start finishing; Arne Roock; Lean-Kanban University
-* The Daily Stoic; Ryan Holiday, Stephen Hanselman; Profile Books
-* The Power of Now; Eckhard Tolle; Yellow Kite
-* The Complete Software Developer's Career Guide; John Sonmez; Unabridged Audiobook
-* The Phoenix Project - A Novel About IT, DevOps, and Helping your Business Win; Gene Kim and Kevin Behr; Trade Select
-* Deep Work; Cal Newport; Piatkus
+* Eat That Frog!; Brian Tracy; Hodder Paperbacks
* Search Inside Yourself - The Unexpected path to Achieving Success, Happiness (and World Peace); Chade-Meng Tan, Daniel Goleman, Jon Kabat-Zinn; HarperOne
+* Time Management for System Administrators; Thomas A. Limoncelli; O'Reilly
+* The Good Enough Job; Simone Stolzoff; Ebury Edge
+* Psycho-Cybernetics; Maxwell Maltz; Perigee Books
+* The Obstacle Is The Way; Ryan Holiday; Profile Books Ltd
+* Buddah and Einstein walk into a Bar; Guy Joseph Ale, Claire Bloom; Blackstone Publishing
+* The Off Switch; Mark Cropley; Virgin Books (RE-READ 1ST TIME)
+* Ultralearning; Scott Young; Thorsons
+* 101 Essays that change the way you think; Brianna Wiest; Audiobook
+* Meditation for Mortals, Oliver Burkeman, Audiobook
* Never Split the Difference; Chris Voss, Tahl Raz; Random House Business
* The Joy of Missing Out; Christina Crook; New Society Publishers
+* 97 Things Every Engineering Manager Should Know; Camille Fournier; Audiobook
+* The Daily Stoic; Ryan Holiday, Stephen Hanselman; Profile Books
+* Slow Productivity; Cal Newport; Penguin Random House
+* The Complete Software Developer's Career Guide; John Sonmez; Unabridged Audiobook
+* Stop starting, start finishing; Arne Roock; Lean-Kanban University
+* So Good They Can't Ignore You; Cal Newport; Business Plus
+* Coders at Work - Reflections on the craft of programming, Peter Seibel and Mitchell Dorian et al., Audiobook
+* Who Moved My Cheese?; Dr. Spencer Johnson; Vermilion
+* Consciousness: A Very Short Introduction; Susan Blackmore; Oxford Uiversity Press
+* Ultralearning; Anna Laurent; Self-published via Amazon
+* Digital Minimalism; Cal Newport; Portofolio Penguin
* Atomic Habits; James Clear; Random House Business
-* Meditation for Mortals, Oliver Burkeman, Audiobook
+* The Phoenix Project - A Novel About IT, DevOps, and Helping your Business Win; Gene Kim and Kevin Behr; Trade Select
+* Eat That Frog; Brian Tracy
+* The Power of Now; Eckhard Tolle; Yellow Kite
+* The 7 Habits Of Highly Effective People; Stephen R. Covey; Simon & Schuster UK
+* Getting Things Done; David Allen
[Here are notes of mine for some of the books](../notes/index.md)
@@ -142,30 +142,30 @@ In random order:
Some of these were in-person with exams; others were online learning lectures only. In random order:
+* Functional programming lecture; Remote University of Hagen
* The Ultimate Kubernetes Bootcamp; School of Devops; O'Reilly Online
* Ultimate Go Programming; Bill Kennedy; O'Reilly Online
-* Red Hat Certified System Administrator; Course + certification (Although I had the option, I decided not to take the next course as it is more effective to self learn what I need)
-* Scripting Vim; Damian Conway; O'Reilly Online
+* Apache Tomcat Best Practises; 3-day on-site training
+* AWS Immersion Day; Amazon; 1-day interactive online training
* Protocol buffers; O'Reilly Online
-* Linux Security and Isolation APIs Training; Michael Kerrisk; 3-day on-site training
+* Red Hat Certified System Administrator; Course + certification (Although I had the option, I decided not to take the next course as it is more effective to self learn what I need)
+* MySQL Deep Dive Workshop; 2-day on-site training
* Structure and Interpretation of Computer Programs; Harold Abelson and more...;
-* Apache Tomcat Best Practises; 3-day on-site training
-* The Well-Grounded Rubyist Video Edition; David. A. Black; O'Reilly Online
-* Cloud Operations on AWS - Learn how to configure, deploy, maintain, and troubleshoot your AWS environments; 3-day online live training with labs; Amazon
* F5 Loadbalancers Training; 2-day on-site training; F5, Inc.
-* Algorithms Video Lectures; Robert Sedgewick; O'Reilly Online
-* Functional programming lecture; Remote University of Hagen
-* MySQL Deep Dive Workshop; 2-day on-site training
-* AWS Immersion Day; Amazon; 1-day interactive online training
* Developing IaC with Terraform (with Live Lessons); O'Reilly Online
+* Algorithms Video Lectures; Robert Sedgewick; O'Reilly Online
+* Cloud Operations on AWS - Learn how to configure, deploy, maintain, and troubleshoot your AWS environments; 3-day online live training with labs; Amazon
+* Scripting Vim; Damian Conway; O'Reilly Online
+* Linux Security and Isolation APIs Training; Michael Kerrisk; 3-day on-site training
+* The Well-Grounded Rubyist Video Edition; David. A. Black; O'Reilly Online
## Technical guides
These are not whole books, but guides (smaller or larger) which I found very useful. in random order:
-* Raku Guide at https://raku.guide
* Advanced Bash-Scripting Guide
* How CPUs work at https://cpu.land
+* Raku Guide at https://raku.guide
## Podcasts
@@ -173,29 +173,29 @@ These are not whole books, but guides (smaller or larger) which I found very use
In random order:
-* BSD Now [BSD]
-* The ProdCast (Google SRE Podcast)
-* Deep Questions with Cal Newport
-* Backend Banter
+* Fallthrough [Golang]
* The Pragmatic Engineer Podcast
+* Hidden Brain
* Fork Around And Find Out
-* Modern Mentor
-* Maintainable
* The Changelog Podcast(s)
+* Maintainable
+* The ProdCast (Google SRE Podcast)
+* BSD Now [BSD]
+* Pratical AI
* Cup o' Go [Golang]
-* Fallthrough [Golang]
-* Hidden Brain
+* Backend Banter
* Dev Interrupted
-* Pratical AI
+* Modern Mentor
+* Deep Questions with Cal Newport
### Podcasts I liked
I liked them but am not listening to them anymore. The podcasts have either "finished" (no more episodes) or I stopped listening to them due to time constraints or a shift in my interests.
-* FLOSS weekly
* Java Pub House
-* Ship It (predecessor of Fork Around And Find Out)
* Go Time (predecessor of fallthrough)
+* FLOSS weekly
+* Ship It (predecessor of Fork Around And Find Out)
* CRE: Chaosradio Express [german]
* Modern Mentor
@@ -203,27 +203,27 @@ I liked them but am not listening to them anymore. The podcasts have either "fin
This is a mix of tech and non-tech newsletters I am subscribed to. In random order:
-* The Imperfectionist
-* Andreas Brandhorst Newsletter (Sci-Fi author)
-* Changelog News
* Applied Go Weekly Newsletter
-* Golang Weekly
-* byteSizeGo
+* VK Newsletter
+* Changelog News
* The Valuable Dev
-* Ruby Weekly
+* Golang Weekly
* The Pragmatic Engineer
-* Monospace Mentor
* Register Spill
-* VK Newsletter
+* Ruby Weekly
+* The Imperfectionist
+* Monospace Mentor
+* byteSizeGo
+* Andreas Brandhorst Newsletter (Sci-Fi author)
## Magazines I like(d)
This is a mix of tech I like(d). I may not be a current subscriber, but now and then, I buy an issue. In random order:
-* freeX (not published anymore)
* Linux Magazine
-* LWN (online only)
* Linux User
+* freeX (not published anymore)
+* LWN (online only)
# Formal education
diff --git a/gemfeed/2021-05-16-personal-bash-coding-style-guide.md b/gemfeed/2021-05-16-personal-bash-coding-style-guide.md
index 4f1b8152..60302e95 100644
--- a/gemfeed/2021-05-16-personal-bash-coding-style-guide.md
+++ b/gemfeed/2021-05-16-personal-bash-coding-style-guide.md
@@ -409,6 +409,7 @@ E-Mail your comments to `paul@nospam.buetow.org` :-)
Other related posts are:
+[2025-09-14 Bash Golf Part 4](./2025-09-14-bash-golf-part-4.md)
[2023-12-10 Bash Golf Part 3](./2023-12-10-bash-golf-part-3.md)
[2022-01-01 Bash Golf Part 2](./2022-01-01-bash-golf-part-2.md)
[2021-11-29 Bash Golf Part 1](./2021-11-29-bash-golf-part-1.md)
diff --git a/gemfeed/2021-06-05-gemtexter-one-bash-script-to-rule-it-all.md b/gemfeed/2021-06-05-gemtexter-one-bash-script-to-rule-it-all.md
index 56e8df6a..39fcbba8 100644
--- a/gemfeed/2021-06-05-gemtexter-one-bash-script-to-rule-it-all.md
+++ b/gemfeed/2021-06-05-gemtexter-one-bash-script-to-rule-it-all.md
@@ -183,6 +183,7 @@ E-Mail your comments to `paul@nospam.buetow.org` :-)
Other related posts are:
+[2025-09-14 Bash Golf Part 4](./2025-09-14-bash-golf-part-4.md)
[2024-10-02 Gemtexter 3.0.0 - Let's Gemtext again⁴](./2024-10-02-gemtexter-3.0.0-lets-gemtext-again-4.md)
[2023-12-10 Bash Golf Part 3](./2023-12-10-bash-golf-part-3.md)
[2023-07-21 Gemtexter 2.1.0 - Let's Gemtext again³](./2023-07-21-gemtexter-2.1.0-lets-gemtext-again-3.md)
diff --git a/gemfeed/2021-11-29-bash-golf-part-1.md b/gemfeed/2021-11-29-bash-golf-part-1.md
index bc9ec420..ac9307dd 100644
--- a/gemfeed/2021-11-29-bash-golf-part-1.md
+++ b/gemfeed/2021-11-29-bash-golf-part-1.md
@@ -7,6 +7,7 @@ This is the first blog post about my Bash Golf series. This series is about rand
[2021-11-29 Bash Golf Part 1 (You are currently reading this)](./2021-11-29-bash-golf-part-1.md)
[2022-01-01 Bash Golf Part 2](./2022-01-01-bash-golf-part-2.md)
[2023-12-10 Bash Golf Part 3](./2023-12-10-bash-golf-part-3.md)
+[2025-09-14 Bash Golf Part 4](./2025-09-14-bash-golf-part-4.md)
```
@@ -480,6 +481,7 @@ E-Mail your comments to `paul@nospam.buetow.org` :-)
Other related posts are:
+[2025-09-14 Bash Golf Part 4](./2025-09-14-bash-golf-part-4.md)
[2023-12-10 Bash Golf Part 3](./2023-12-10-bash-golf-part-3.md)
[2022-01-01 Bash Golf Part 2](./2022-01-01-bash-golf-part-2.md)
[2021-11-29 Bash Golf Part 1 (You are currently reading this)](./2021-11-29-bash-golf-part-1.md)
diff --git a/gemfeed/2022-01-01-bash-golf-part-2.md b/gemfeed/2022-01-01-bash-golf-part-2.md
index 84238b32..8a92861b 100644
--- a/gemfeed/2022-01-01-bash-golf-part-2.md
+++ b/gemfeed/2022-01-01-bash-golf-part-2.md
@@ -7,6 +7,7 @@ This is the second blog post about my Bash Golf series. This series is random Ba
[2021-11-29 Bash Golf Part 1](./2021-11-29-bash-golf-part-1.md)
[2022-01-01 Bash Golf Part 2 (You are currently reading this)](./2022-01-01-bash-golf-part-2.md)
[2023-12-10 Bash Golf Part 3](./2023-12-10-bash-golf-part-3.md)
+[2025-09-14 Bash Golf Part 4](./2025-09-14-bash-golf-part-4.md)
```
@@ -498,6 +499,7 @@ E-Mail your comments to `paul@nospam.buetow.org` :-)
Other related posts are:
+[2025-09-14 Bash Golf Part 4](./2025-09-14-bash-golf-part-4.md)
[2023-12-10 Bash Golf Part 3](./2023-12-10-bash-golf-part-3.md)
[2022-01-01 Bash Golf Part 2 (You are currently reading this)](./2022-01-01-bash-golf-part-2.md)
[2021-11-29 Bash Golf Part 1](./2021-11-29-bash-golf-part-1.md)
diff --git a/gemfeed/2023-10-29-kiss-static-web-photo-albums-with-photoalbum.sh.md b/gemfeed/2023-10-29-kiss-static-web-photo-albums-with-photoalbum.sh.md
index 2121886c..21c22fd1 100644
--- a/gemfeed/2023-10-29-kiss-static-web-photo-albums-with-photoalbum.sh.md
+++ b/gemfeed/2023-10-29-kiss-static-web-photo-albums-with-photoalbum.sh.md
@@ -272,6 +272,7 @@ E-Mail your comments to `paul@nospam.buetow.org` :-)
Other Bash and KISS-related posts are:
+[2025-09-14 Bash Golf Part 4](./2025-09-14-bash-golf-part-4.md)
[2024-04-01 KISS high-availability with OpenBSD](./2024-04-01-KISS-high-availability-with-OpenBSD.md)
[2023-12-10 Bash Golf Part 3](./2023-12-10-bash-golf-part-3.md)
[2023-10-29 KISS static web photo albums with `photoalbum.sh` (You are currently reading this)](./2023-10-29-kiss-static-web-photo-albums-with-photoalbum.sh.md)
diff --git a/gemfeed/2023-12-10-bash-golf-part-3.md b/gemfeed/2023-12-10-bash-golf-part-3.md
index 8c6e5e01..f36b9731 100644
--- a/gemfeed/2023-12-10-bash-golf-part-3.md
+++ b/gemfeed/2023-12-10-bash-golf-part-3.md
@@ -7,6 +7,7 @@ This is the third blog post about my Bash Golf series. This series is random Bas
[2021-11-29 Bash Golf Part 1](./2021-11-29-bash-golf-part-1.md)
[2022-01-01 Bash Golf Part 2](./2022-01-01-bash-golf-part-2.md)
[2023-12-10 Bash Golf Part 3 (You are currently reading this)](./2023-12-10-bash-golf-part-3.md)
+[2025-09-14 Bash Golf Part 4](./2025-09-14-bash-golf-part-4.md)
```
@@ -371,6 +372,7 @@ E-Mail your comments to `paul@nospam.buetow.org` :-)
Other related posts are:
+[2025-09-14 Bash Golf Part 4](./2025-09-14-bash-golf-part-4.md)
[2023-12-10 Bash Golf Part 3 (You are currently reading this)](./2023-12-10-bash-golf-part-3.md)
[2022-01-01 Bash Golf Part 2](./2022-01-01-bash-golf-part-2.md)
[2021-11-29 Bash Golf Part 1](./2021-11-29-bash-golf-part-1.md)
diff --git a/gemfeed/2024-01-13-one-reason-why-i-love-openbsd.md b/gemfeed/2024-01-13-one-reason-why-i-love-openbsd.md
index aa53d5fa..9f6f400d 100644
--- a/gemfeed/2024-01-13-one-reason-why-i-love-openbsd.md
+++ b/gemfeed/2024-01-13-one-reason-why-i-love-openbsd.md
@@ -29,6 +29,8 @@ $ doas sysupgrade # Update all binaries (including Kernel)
`sysupgrade` downloaded and upgraded to the next release and rebooted the system. After the reboot, I run:
+> Note to myself: I have to undo the `/var/www` symlink before upgrading, and re-establishing the symlink afterwards again. This is due to disk space constraings on my setup!
+
```shell
$ doas sysmerge # Update system configuration files
$ doas pkg_add -u # Update all packages
diff --git a/gemfeed/2024-08-05-typing-127.1-words-per-minute.md b/gemfeed/2024-08-05-typing-127.1-words-per-minute.md
index a01e284e..ba1c5fd6 100644
--- a/gemfeed/2024-08-05-typing-127.1-words-per-minute.md
+++ b/gemfeed/2024-08-05-typing-127.1-words-per-minute.md
@@ -213,7 +213,7 @@ Interested in the Glove80? I suggest also reading this review:
As I mentioned, keyboards will remain an expensive hobby of mine. I don't regret anything here, though. After all, I use keyboards at my day job. I've ordered a Kinesis custom build with the Gateron Kangaroo switches, and I'm excited to see how that compares to my current setup. I'm still deciding whether to keep my Gateron Brown-equipped Kinesis as a secondary keyboard or possibly leave it at my in-laws for use when visiting or to sell it.
-> Update 2025-02-22: I've received my custom Kinesis Adv. 360 build with the Gateron Baby Kangaroo key switches. I am absolutely in love! I will keep my Gateron Brown versin around, though.
+> Update 2025-02-22: I've received my custom Kinesis Adv. 360 build with the Gateron Baby Kangaroo key switches. I am absolutely in love! I will keep my Gateron Brown version around, though.
## Conclusion
diff --git a/gemfeed/2025-09-14-bash-golf-part-4.md b/gemfeed/2025-09-14-bash-golf-part-4.md
new file mode 100644
index 00000000..849c7b9c
--- /dev/null
+++ b/gemfeed/2025-09-14-bash-golf-part-4.md
@@ -0,0 +1,536 @@
+# Bash Golf Part 4
+
+> Published at 2025-09-13T12:04:03+03:00
+
+This is the fourth blog post about my Bash Golf series. This series is random Bash tips, tricks, and weirdnesses I have encountered over time.
+
+[2021-11-29 Bash Golf Part 1](./2021-11-29-bash-golf-part-1.md)
+[2022-01-01 Bash Golf Part 2](./2022-01-01-bash-golf-part-2.md)
+[2023-12-10 Bash Golf Part 3](./2023-12-10-bash-golf-part-3.md)
+[2025-09-14 Bash Golf Part 4 (You are currently reading this)](./2025-09-14-bash-golf-part-4.md)
+
+```
+
+ '\ '\ '\ '\ . . |>18>>
+ \ \ \ \ . ' . |
+ O>> O>> O>> O>> . 'o |
+ \ .\. .. .\. .. .\. .. . |
+ /\ . /\ . /\ . /\ . . |
+ / / . / / .'. / / .'. / / .' . |
+jgs^^^^^^^`^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ Art by Joan Stark, mod. by Paul Buetow
+```
+
+## Table of Contents
+
+* [⇢ Bash Golf Part 4](#bash-golf-part-4)
+* [⇢ ⇢ Split pipelines with tee + process substitution](#split-pipelines-with-tee--process-substitution)
+* [⇢ ⇢ Heredocs for remote sessions (and their gotchas)](#heredocs-for-remote-sessions-and-their-gotchas)
+* [⇢ ⇢ Namespacing and dynamic dispatch with `::`](#namespacing-and-dynamic-dispatch-with-)
+* [⇢ ⇢ Indirect references with namerefs](#indirect-references-with-namerefs)
+* [⇢ ⇢ Function declaration forms](#function-declaration-forms)
+* [⇢ ⇢ Chaining function calls in conditionals](#chaining-function-calls-in-conditionals)
+* [⇢ ⇢ Grep, sed, awk quickies](#grep-sed-awk-quickies)
+* [⇢ ⇢ Safe xargs with NULs](#safe-xargs-with-nuls)
+* [⇢ ⇢ Efficient file-to-variable and arrays](#efficient-file-to-variable-and-arrays)
+* [⇢ ⇢ Quick password generator](#quick-password-generator)
+* [⇢ ⇢ `yes` for automation](#yes-for-automation)
+* [⇢ ⇢ Forcing `true` to fail (and vice versa)](#forcing-true-to-fail-and-vice-versa)
+* [⇢ ⇢ Restricted Bash](#restricted-bash)
+* [⇢ ⇢ Useless use of cat (and when it’s ok)](#useless-use-of-cat-and-when-its-ok)
+* [⇢ ⇢ Atomic locking with `mkdir`](#atomic-locking-with-mkdir)
+* [⇢ ⇢ Smarter globs and faster find-exec](#smarter-globs-and-faster-find-exec)
+
+## Split pipelines with tee + process substitution
+
+Sometimes you want to fan out one stream to multiple consumers and still continue the original pipeline. `tee` plus process substitution does exactly that:
+
+```
+somecommand \
+ | tee >(command1) >(command2) \
+ | command3
+```
+
+All of `command1`, `command2`, and `command3` see the output of `somecommand`. Example:
+
+```bash
+printf 'a\nb\n' \
+ | tee >(sed 's/.*/X:&/; s/$/ :c1/') >(tr a-z A-Z | sed 's/$/ :c2/') \
+ | sed 's/$/ :c3/'
+```
+
+Output:
+
+```
+a :c3
+b :c3
+A :c2 :c3
+B :c2 :c3
+X:a :c1 :c3
+X:b :c1 :c3
+```
+
+This relies on Bash process substitution (`>(...)`). Make sure your shell is Bash and not a POSIX `/bin/sh`.
+
+Example (fails under `dash`/POSIX sh):
+
+```bash
+/bin/sh -c 'echo hi | tee >(cat)'
+# /bin/sh: 1: Syntax error: "(" unexpected
+```
+
+Combine with `set -o pipefail` if failures in side branches should fail the whole pipeline.
+
+Example:
+
+```bash
+set -o pipefail
+printf 'ok\n' | tee >(false) | cat >/dev/null
+echo $? # 1 because a side branch failed
+```
+
+Further reading:
+
+[Splitting pipelines with tee](https://blogtitle.github.io/splitting-pipelines/)
+
+## Heredocs for remote sessions (and their gotchas)
+
+Heredocs are great to send multiple commands over SSH in a readable way:
+
+```bash
+ssh "$SSH_USER@$SSH_HOST" <<EOF
+ # Go to the work directory
+ cd "$WORK_DIR"
+
+ # Make a git pull
+ git pull
+
+ # Export environment variables required for the service to run
+ export AUTH_TOKEN="$APP_AUTH_TOKEN"
+
+ # Start the service
+ docker compose up -d --build
+EOF
+```
+
+Tips:
+
+Quoting the delimiter changes interpolation. Use `<<'EOF'` to avoid local expansion and send the content literally.
+
+Example:
+
+```bash
+FOO=bar
+cat <<'EOF'
+$FOO is not expanded here
+EOF
+```
+
+Prefer explicit quoting for variables (as above) to avoid surprises. Example (spaces preserved only when quoted):
+
+```bash
+WORK_DIR="/tmp/my work"
+ssh host <<EOF
+ cd $WORK_DIR # may break if unquoted
+ cd "$WORK_DIR" # safe
+EOF
+```
+
+Consider `set -euo pipefail` at the top of the remote block for stricter error handling. Example:
+
+```bash
+ssh host <<'EOF'
+ set -euo pipefail
+ false # causes immediate failure
+ echo never
+EOF
+```
+
+Indent-friendly variant: use a dash to strip leading tabs in the body:
+
+```bash
+cat <<-EOF > script.sh
+ #!/usr/bin/env bash
+ echo "tab-indented content is dedented"
+EOF
+```
+
+Further reading:
+
+[Heredoc headaches and fixes](https://rednafi.com/misc/heredoc_headache/)
+
+## Namespacing and dynamic dispatch with `::`
+
+You can emulate simple namespacing by encoding hierarchy in function names. One neat pattern is pseudo-inheritance via a tiny `super` helper that maps `pkg::lang::action` to a `pkg::base::action` default.
+
+```bash
+#!/usr/bin/env bash
+set -euo pipefail
+
+super() {
+ local -r fn=${FUNCNAME[1]}
+ # Split name on :: and dispatch to base implementation
+ local -a parts=( ${fn//::/ } )
+ "${parts[0]}::base::${parts[2]}" "$@"
+}
+
+foo::base::greet() { echo "base: $@"; }
+foo::german::greet() { super "Guten Tag, $@!"; }
+foo::english::greet() { super "Good day, $@!"; }
+
+for lang in german english; do
+ foo::$lang::greet Paul
+done
+```
+
+Output:
+
+```
+base: Guten Tag, Paul!
+base: Good day, Paul!
+```
+
+## Indirect references with namerefs
+
+`declare -n` creates a name reference — a variable that points to another variable. It’s cleaner than `eval` for indirection:
+
+```bash
+user_name=paul
+declare -n ref=user_name
+echo "$ref" # paul
+ref=julia
+echo "$user_name" # julia
+```
+
+Output:
+
+```
+paul
+julia
+```
+
+Namerefs are local to functions when declared with `local -n`. Requires Bash ≥4.3.
+
+You can also construct the target name dynamically:
+
+```bash
+make_var() {
+ local idx=$1; shift
+ local name="slot_$idx"
+ printf -v "$name" '%s' "$*" # create variable slot_$idx
+}
+
+get_var() {
+ local idx=$1
+ local -n ref="slot_$idx" # bind ref to slot_$idx
+ printf '%s\n' "$ref"
+}
+
+make_var 7 "seven"
+get_var 7
+```
+
+Output:
+
+```
+seven
+```
+
+## Function declaration forms
+
+All of these work in Bash, but only the first one is POSIX-ish:
+
+```bash
+foo() { echo foo; }
+function foo { echo foo; }
+function foo() { echo foo; }
+```
+
+Recommendation: prefer `name() { ... }` for portability and consistency.
+
+## Chaining function calls in conditionals
+
+Functions return a status like commands. You can short-circuit them in conditionals:
+
+```bash
+deploy_check() { test -f deploy.yaml; }
+smoke_test() { curl -fsS http://localhost/healthz >/dev/null; }
+
+if deploy_check || smoke_test; then
+ echo "All good."
+else
+ echo "Something failed." >&2
+fi
+```
+
+You can also compress it golf-style:
+
+```bash
+deploy_check || smoke_test && echo ok || echo fail >&2
+```
+
+## Grep, sed, awk quickies
+
+Word match and context: `grep -w word file`; with context: `grep -C3 foo file` (same as `-A3 -B3`). Example:
+
+```bash
+cat > /tmp/ctx.txt <<EOF
+one
+foo
+two
+three
+bar
+EOF
+grep -C1 foo /tmp/ctx.txt
+```
+
+Output:
+
+```
+one
+foo
+two
+```
+
+Skip a directory while recursing: `grep -R --exclude-dir=foo 'bar' /path`. Example:
+
+```bash
+mkdir -p /tmp/golf/foo /tmp/golf/src
+printf 'bar\n' > /tmp/golf/src/a.txt
+printf 'bar\n' > /tmp/golf/foo/skip.txt
+grep -R --exclude-dir=foo 'bar' /tmp/golf
+```
+
+Output:
+
+```
+/tmp/golf/src/a.txt:bar
+```
+
+Insert lines with sed: `sed -e '1isomething' -e '3isomething' file`. Example:
+
+```bash
+printf 'A\nB\nC\n' > /tmp/s.txt
+sed -e '1iHEAD' -e '3iMID' /tmp/s.txt
+```
+
+Output:
+
+```
+HEAD
+A
+B
+MID
+C
+```
+
+Drop last column with awk: `awk 'NF{NF-=1};1' file`. Example:
+
+```bash
+printf 'a b c\nx y z\n' > /tmp/t.txt
+cat /tmp/t.txt
+echo
+awk 'NF{NF-=1};1' /tmp/t.txt
+```
+
+Output:
+
+```
+a b c
+x y z
+
+a b
+x y
+```
+
+## Safe xargs with NULs
+
+Avoid breaking on spaces/newlines by pairing `find -print0` with `xargs -0`:
+
+```bash
+find . -type f -name '*.log' -print0 | xargs -0 rm -f
+```
+
+Example with spaces and NULs only:
+
+```bash
+printf 'a\0b c\0' | xargs -0 -I{} printf '<%s>\n' {}
+```
+
+Output:
+
+```
+<a>
+<b c>
+```
+
+## Efficient file-to-variable and arrays
+
+Read a whole file into a variable without spawning `cat`:
+
+```bash
+cfg=$(<config.ini)
+```
+
+Read lines into an array safely with `mapfile` (aka `readarray`):
+
+```bash
+mapfile -t lines < <(grep -v '^#' config.ini)
+printf '%s\n' "${lines[@]}"
+```
+
+Assign formatted strings without a subshell using `printf -v`:
+
+```bash
+printf -v msg 'Hello %s, id=%04d' "$USER" 42
+echo "$msg"
+```
+
+Output:
+
+```
+Hello paul, id=0042
+```
+
+Read NUL-delimited data (pairs well with `-print0`):
+
+```bash
+mapfile -d '' -t files < <(find . -type f -print0)
+printf '%s\n' "${files[@]}"
+```
+
+## Quick password generator
+
+Pure Bash with `/dev/urandom`:
+
+```bash
+LC_ALL=C tr -dc 'A-Za-z0-9_' </dev/urandom | head -c 16; echo
+```
+
+Alternative using `openssl`:
+
+```bash
+openssl rand -base64 16 | tr -d '\n' | cut -c1-22
+```
+
+## `yes` for automation
+
+`yes` streams a string repeatedly; handy for feeding interactive commands or quick load generation:
+
+```bash
+yes | rm -r large_directory # auto-confirm
+yes n | dangerous-command # auto-decline
+yes anything | head -n1 # prints one line: anything
+```
+
+## Forcing `true` to fail (and vice versa)
+
+You can shadow builtins with functions:
+
+```bash
+true() { return 1; }
+false() { return 0; }
+
+true || echo 'true failed'
+false && echo 'false succeeded'
+
+# Bypass function with builtin/command
+builtin true # returns 0
+command true # returns 0
+```
+
+To disable a builtin entirely: `enable -n true` (re-enable with `enable true`).
+
+Further reading:
+
+[Force true to return false](https://blog.robertelder.org/force-true-command-to-return-false/)
+
+## Restricted Bash
+
+`bash -r` (or `rbash`) starts a restricted shell that limits potentially dangerous actions, for example:
+
+* Changing directories (`cd`).
+* Modifying `PATH`, `SHELL`, `BASH_ENV`, or `ENV`.
+* Redirecting output.
+* Running commands with `/` in the name.
+* Using `exec`.
+
+It’s a coarse sandbox for highly constrained shells; read `man bash` (RESTRICTED SHELL) for details and caveats.
+
+Example session:
+
+```bash
+rbash -c 'cd /' # cd: restricted
+rbash -c 'PATH=/tmp' # PATH: restricted
+rbash -c 'echo hi > out' # redirection: restricted
+rbash -c '/bin/echo hi' # commands with /: restricted
+rbash -c 'exec ls' # exec: restricted
+```
+
+## Useless use of cat (and when it’s ok)
+
+Avoid the extra process if a command already reads files or `STDIN`:
+
+```bash
+# Prefer
+grep -i foo file
+<file grep -i foo # or feed via redirection
+
+# Over
+cat file | grep -i foo
+```
+
+But for interactive composition, or when you truly need to concatenate multiple sources into a single stream, `cat` is fine, as you may think, "First I need the content, then I do X." Changing the "useless use of cat" in retrospect is really a waste of time for one-time interactive use:
+
+```bash
+cat file1 file2 | grep -i foo
+```
+
+From notes: “Good for interactivity; Useless use of cat” — use judgment.
+
+## Atomic locking with `mkdir`
+
+Portable advisory locks can be emulated with `mkdir` because it’s atomic:
+
+```bash
+lockdir=/tmp/myjob.lock
+if mkdir "$lockdir" 2>/dev/null; then
+ trap 'rmdir "$lockdir"' EXIT INT TERM
+ # critical section
+ do_work
+else
+ echo "Another instance is running" >&2
+ exit 1
+fi
+```
+
+This works well on Linux. Remove the lock in `trap` so crashes don’t leave stale locks.
+
+## Smarter globs and faster find-exec
+
+* Enable extended globs when useful: `shopt -s extglob`; then patterns like `!(tmp|cache)` work.
+* Use `-exec ... {} +` to batch many paths in fewer process invocations:
+
+```bash
+find . -name '*.log' -exec gzip -9 {} +
+```
+
+Example for extglob (exclude two dirs from listing):
+
+```bash
+shopt -s extglob
+ls -d -- !(.git|node_modules) 2>/dev/null
+```
+
+E-Mail your comments to `paul@nospam.buetow.org` :-)
+
+Other related posts are:
+
+[2025-09-14 Bash Golf Part 4 (You are currently reading this)](./2025-09-14-bash-golf-part-4.md)
+[2023-12-10 Bash Golf Part 3](./2023-12-10-bash-golf-part-3.md)
+[2022-01-01 Bash Golf Part 2](./2022-01-01-bash-golf-part-2.md)
+[2021-11-29 Bash Golf Part 1](./2021-11-29-bash-golf-part-1.md)
+[2021-06-05 Gemtexter - One Bash script to rule it all](./2021-06-05-gemtexter-one-bash-script-to-rule-it-all.md)
+[2021-05-16 Personal Bash coding style guide](./2021-05-16-personal-bash-coding-style-guide.md)
+
+[Back to the main site](../)
diff --git a/gemfeed/index.md b/gemfeed/index.md
index 50e0463f..5e6f5539 100644
--- a/gemfeed/index.md
+++ b/gemfeed/index.md
@@ -2,6 +2,7 @@
## To be in the .zone!
+[2025-09-14 - Bash Golf Part 4](./2025-09-14-bash-golf-part-4.md)
[2025-08-15 - Random Weird Things - Part Ⅲ](./2025-08-15-random-weird-things-iii.md)
[2025-08-05 - Local LLM for Coding with Ollama on macOS](./2025-08-05-local-coding-llm-with-ollama.md)
[2025-07-14 - f3s: Kubernetes with FreeBSD - Part 6: Storage](./2025-07-14-f3s-kubernetes-with-freebsd-part-6.md)
diff --git a/index.md b/index.md
index 1289e6f1..a0ed00ed 100644
--- a/index.md
+++ b/index.md
@@ -1,6 +1,6 @@
# Hello!
-> This site was generated at 2025-09-11T11:13:29+03:00 by `Gemtexter`
+> This site was generated at 2025-09-13T12:04:03+03:00 by `Gemtexter`
Welcome to the foo.zone!
@@ -38,6 +38,7 @@ Everything you read on this site is my personal opinion and experience. You can
### Posts
+[2025-09-14 - Bash Golf Part 4](./gemfeed/2025-09-14-bash-golf-part-4.md)
[2025-08-15 - Random Weird Things - Part Ⅲ](./gemfeed/2025-08-15-random-weird-things-iii.md)
[2025-08-05 - Local LLM for Coding with Ollama on macOS](./gemfeed/2025-08-05-local-coding-llm-with-ollama.md)
[2025-07-14 - f3s: Kubernetes with FreeBSD - Part 6: Storage](./gemfeed/2025-07-14-f3s-kubernetes-with-freebsd-part-6.md)
diff --git a/uptime-stats.md b/uptime-stats.md
index 93638d5e..6b58ca96 100644
--- a/uptime-stats.md
+++ b/uptime-stats.md
@@ -1,6 +1,6 @@
# My machine uptime stats
-> This site was last updated at 2025-09-11T11:13:29+03:00
+> This site was last updated at 2025-09-13T12:04:03+03:00
The following stats were collected via `uptimed` on all of my personal computers over many years and the output was generated by `guprecords`, the global uptime records stats analyser of mine.