summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gemfeed/2008-12-29-using-my-nokia-n95-for-fixing-my-mta.gmi2
-rw-r--r--gemfeed/2015-12-05-run-debian-on-your-phone-with-debroid.gmi2
-rw-r--r--gemfeed/2018-06-01-realistic-load-testing-with-ioriot-for-linux.gmi12
-rw-r--r--gemfeed/2021-04-22-dtail-the-distributed-log-tail-program.gmi6
-rw-r--r--gemfeed/2021-04-22-dtail-the-distributed-log-tail-program.gmi.tpl6
-rw-r--r--gemfeed/2021-04-24-welcome-to-the-geminispace.gmi4
-rw-r--r--gemfeed/2021-04-24-welcome-to-the-geminispace.gmi.tpl4
-rw-r--r--gemfeed/2021-06-05-gemtexter-one-bash-script-to-rule-it-all.gmi2
-rw-r--r--gemfeed/2021-06-05-gemtexter-one-bash-script-to-rule-it-all.gmi.tpl2
-rw-r--r--gemfeed/2021-07-04-the-well-grounded-rubyist.gmi4
-rw-r--r--gemfeed/2022-05-27-perl-is-still-a-great-choice.gmi4
-rw-r--r--gemfeed/2022-05-27-perl-is-still-a-great-choice.gmi.tpl4
-rw-r--r--gemfeed/2022-06-15-sweating-the-small-stuff.gmi4
-rw-r--r--gemfeed/2022-12-24-ultrarelearning-java-my-takeaways.gmi4
-rw-r--r--gemfeed/2023-06-01-kiss-server-monitoring-with-gogios.gmi2
-rw-r--r--gemfeed/2023-06-01-kiss-server-monitoring-with-gogios.gmi.tpl2
-rw-r--r--gemfeed/2023-12-10-bash-golf-part-3.gmi2
-rw-r--r--gemfeed/2023-12-10-bash-golf-part-3.gmi.tpl2
-rw-r--r--gemfeed/2024-03-03-a-fine-fyne-android-app-for-quickly-logging-ideas-programmed-in-golang.gmi4
-rw-r--r--gemfeed/2024-03-03-a-fine-fyne-android-app-for-quickly-logging-ideas-programmed-in-golang.gmi.tpl4
-rw-r--r--gemfeed/a-fine-fyne-android-app-for-quickly-logging-ideas-programmed-in-golang/logo-small.png (renamed from gemfeed/2024-03-03-a-fine-fyne-android-app-for-quickly-logging-ideas-programmed-in-golang/logo-small.png)bin63314 -> 63314 bytes
-rw-r--r--gemfeed/a-fine-fyne-android-app-for-quickly-logging-ideas-programmed-in-golang/screenshot-android.png (renamed from gemfeed/2024-03-03-a-fine-fyne-android-app-for-quickly-logging-ideas-programmed-in-golang/screenshot-android.png)bin45089 -> 45089 bytes
-rw-r--r--gemfeed/atom.xml310
-rw-r--r--gemfeed/bash-golf-part-3/bash-fork-bomb.jpg (renamed from gemfeed/2023-12-10-bash-golf-part-3/bash-fork-bomb.jpg)bin209399 -> 209399 bytes
-rw-r--r--gemfeed/dtail-the-distributed-log-tail-program/dgrep.gif (renamed from gemfeed/2021-04-22-dtail-the-distributed-log-tail-program/dgrep.gif)bin142329 -> 142329 bytes
-rw-r--r--gemfeed/dtail-the-distributed-log-tail-program/dtail.gif (renamed from gemfeed/2021-04-22-dtail-the-distributed-log-tail-program/dtail.gif)bin1984520 -> 1984520 bytes
-rw-r--r--gemfeed/dtail-the-distributed-log-tail-program/title.png (renamed from gemfeed/2021-04-22-dtail-the-distributed-log-tail-program/title.png)bin84933 -> 84933 bytes
-rw-r--r--gemfeed/gemtexter-one-bash-script-to-rule-it-all/blog-engine.jpg (renamed from gemfeed/2021-06-05-gemtexter-one-bash-script-to-rule-it-all/blog-engine.jpg)bin41291 -> 41291 bytes
-rw-r--r--gemfeed/kiss-server-monitoring-with-gogios/gogios-small.png (renamed from gemfeed/2023-06-01-kiss-server-monitoring-with-gogios/gogios-small.png)bin56698 -> 56698 bytes
-rw-r--r--gemfeed/perl-is-still-a-great-choice/googletrendsperl.jpg (renamed from gemfeed/2022-05-27-perl-is-still-a-great-choice/googletrendsperl.jpg)bin18537 -> 18537 bytes
-rw-r--r--gemfeed/perl-is-still-a-great-choice/regular_expressions.png (renamed from gemfeed/2022-05-27-perl-is-still-a-great-choice/regular_expressions.png)bin107151 -> 107151 bytes
-rw-r--r--gemfeed/realistic-load-testing-with-ioriot-for-linux/figure1-ioriot-io-recording.png (renamed from gemfeed/2018-06-01-realistic-load-testing-with-ioriot-for-linux/figure1-ioriot-io-recording.png)bin220247 -> 220247 bytes
-rw-r--r--gemfeed/realistic-load-testing-with-ioriot-for-linux/figure2-ioriot-test-preparation.png (renamed from gemfeed/2018-06-01-realistic-load-testing-with-ioriot-for-linux/figure2-ioriot-test-preparation.png)bin208235 -> 208235 bytes
-rw-r--r--gemfeed/realistic-load-testing-with-ioriot-for-linux/figure3-ioriot-replay.png (renamed from gemfeed/2018-06-01-realistic-load-testing-with-ioriot-for-linux/figure3-ioriot-replay.png)bin417034 -> 417034 bytes
-rw-r--r--gemfeed/realistic-load-testing-with-ioriot-for-linux/figure4-ioriot-read-latency.png (renamed from gemfeed/2018-06-01-realistic-load-testing-with-ioriot-for-linux/figure4-ioriot-read-latency.png)bin39552 -> 39552 bytes
-rw-r--r--gemfeed/realistic-load-testing-with-ioriot-for-linux/figure5-ioriot-write-latency.png (renamed from gemfeed/2018-06-01-realistic-load-testing-with-ioriot-for-linux/figure5-ioriot-write-latency.png)bin26547 -> 26547 bytes
-rw-r--r--gemfeed/realistic-load-testing-with-ioriot-for-linux/figure6-iostat.png (renamed from gemfeed/2018-06-01-realistic-load-testing-with-ioriot-for-linux/figure6-iostat.png)bin294346 -> 294346 bytes
-rw-r--r--gemfeed/run-debian-on-your-phone-with-debroid/Deboroid.png (renamed from gemfeed/2015-12-05-run-debian-on-your-phone-with-debroid/Deboroid.png)bin576510 -> 576510 bytes
-rw-r--r--gemfeed/sweating-the-small-stuff/jsmstrade.png (renamed from gemfeed/2022-06-15-sweating-the-small-stuff/jsmstrade.png)bin13636 -> 13636 bytes
-rw-r--r--gemfeed/sweating-the-small-stuff/ninja.jpg (renamed from gemfeed/2022-06-15-sweating-the-small-stuff/ninja.jpg)bin302772 -> 302772 bytes
-rw-r--r--gemfeed/the-well-grounded-rubyist/book-backside.jpg (renamed from gemfeed/2021-07-04-the-well-grounded-rubyist/book-backside.jpg)bin179996 -> 179996 bytes
-rw-r--r--gemfeed/the-well-grounded-rubyist/book-cover.jpg (renamed from gemfeed/2021-07-04-the-well-grounded-rubyist/book-cover.jpg)bin140259 -> 140259 bytes
-rw-r--r--gemfeed/ultrarelearning-java-my-takeaways/effective-java.jpg (renamed from gemfeed/2022-12-24-ultrarelearning-java-my-takeaways/effective-java.jpg)bin187342 -> 187342 bytes
-rw-r--r--gemfeed/ultrarelearning-java-my-takeaways/learnjava.jpg (renamed from gemfeed/2022-12-24-ultrarelearning-java-my-takeaways/learnjava.jpg)bin69628 -> 69628 bytes
-rw-r--r--gemfeed/using-my-nokia-n95-for-fixing-my-mta/nokia-n95.jpg (renamed from gemfeed/2008-12-29-using-my-nokia-n95-for-fixing-my-mta/nokia-n95.jpg)bin379578 -> 379578 bytes
-rw-r--r--gemfeed/welcome-to-the-geminispace/amfora-screenshot.png (renamed from gemfeed/2021-04-24-welcome-to-the-geminispace/amfora-screenshot.png)bin154951 -> 154951 bytes
-rw-r--r--gemfeed/welcome-to-the-geminispace/lagrange-screenshot.png (renamed from gemfeed/2021-04-24-welcome-to-the-geminispace/lagrange-screenshot.png)bin104677 -> 104677 bytes
-rw-r--r--index.gmi2
-rw-r--r--uptime-stats.gmi2
49 files changed, 195 insertions, 195 deletions
diff --git a/gemfeed/2008-12-29-using-my-nokia-n95-for-fixing-my-mta.gmi b/gemfeed/2008-12-29-using-my-nokia-n95-for-fixing-my-mta.gmi
index f52d9bb9..33484e6c 100644
--- a/gemfeed/2008-12-29-using-my-nokia-n95-for-fixing-my-mta.gmi
+++ b/gemfeed/2008-12-29-using-my-nokia-n95-for-fixing-my-mta.gmi
@@ -23,7 +23,7 @@ The last week I was in Vidin, Bulgaria with no internet access and I had to fix
My first attempt to find an internet café, which was working during Christmastime, failed. However, I found with my N95 phone lots of free WLAN hotspots. The hotspots refused me logging into my server using SSH as I have configured a non-standard port for SSH for security reasons. Without knowing the costs, I used the GPRS internet access of my German phone provider (yes, I had to pay roaming fees).
-=> ./2008-12-29-using-my-nokia-n95-for-fixing-my-mta/nokia-n95.jpg Picture of a Nokia N95
+=> ./using-my-nokia-n95-for-fixing-my-mta/nokia-n95.jpg Picture of a Nokia N95
With Putty for N95 and configuring Postfix with Vim and the T9 input mechanism, I managed to fix the problem. But it took half of an hour:
diff --git a/gemfeed/2015-12-05-run-debian-on-your-phone-with-debroid.gmi b/gemfeed/2015-12-05-run-debian-on-your-phone-with-debroid.gmi
index 2f15096a..f31ba96b 100644
--- a/gemfeed/2015-12-05-run-debian-on-your-phone-with-debroid.gmi
+++ b/gemfeed/2015-12-05-run-debian-on-your-phone-with-debroid.gmi
@@ -13,7 +13,7 @@
You can use the following tutorial to install a full-blown Debian GNU/Linux Chroot on an LG G3 D855 CyanogenMod 13 (Android 6). First of all, you need to have root permissions on your phone, and you also need to have the developer mode activated. The following steps have been tested on Linux (Fedora 23).
-=> ./2015-12-05-run-debian-on-your-phone-with-debroid/Deboroid.png
+=> ./run-debian-on-your-phone-with-debroid/Deboroid.png
## Foreword
diff --git a/gemfeed/2018-06-01-realistic-load-testing-with-ioriot-for-linux.gmi b/gemfeed/2018-06-01-realistic-load-testing-with-ioriot-for-linux.gmi
index 31ce85cc..4aeae0c6 100644
--- a/gemfeed/2018-06-01-realistic-load-testing-with-ioriot-for-linux.gmi
+++ b/gemfeed/2018-06-01-realistic-load-testing-with-ioriot-for-linux.gmi
@@ -81,7 +81,7 @@ During recording, ioriot acts as a wrapper and executes all relevant Systemtap c
% sudo ioriot -c io.capture
```
-=> ./2018-06-01-realistic-load-testing-with-ioriot-for-linux/figure1-ioriot-io-recording.png Screenshot I/O recording
+=> ./realistic-load-testing-with-ioriot-for-linux/figure1-ioriot-io-recording.png Screenshot I/O recording
A Ctrl-C (SIGINT) stops recording prematurely. Otherwise, ioriot terminates itself automatically after 1 hour. Depending on the system load, the output file can grow to several gigabytes. Only metadata is logged, not the read and written data itself. When replaying later, only random data is used. Under certain circumstances, Systemtap may omit some system calls and issue warnings. This is to ensure that Systemtap does not consume too many resources.
@@ -105,7 +105,7 @@ The test will most likely want to access existing files. These are files the tes
To avoid any damage to the running system, ioreplay only works in special directories. The tool creates a separate subdirectory for each file system mount point (e.g. /, /usr/local, /store/00,...) (here: /.ioriot/TESTNAME, /usr/local/.ioriot/TESTNAME, /store/00/.ioriot/TESTNAME,...). By default, the working directory of ioriot is /usr/local/ioriot/TESTNAME.
-=> ./2018-06-01-realistic-load-testing-with-ioriot-for-linux/figure2-ioriot-test-preparation.png Screenshot test preparation
+=> ./realistic-load-testing-with-ioriot-for-linux/figure2-ioriot-test-preparation.png Screenshot test preparation
You must re-initialize the environment before each run. Data from previous tests will be moved to a trash directory automatically, which can be finally deleted with "sudo ioriot -P".
@@ -115,7 +115,7 @@ After initialization, you can replay the log with -r. You can use -R to initiate
You can also influence the playback speed: "-s 0" is interpreted as "Playback as fast as possible" and is the default setting. With "-s 1" all operations are performed at original speed. "-s 2" would double the playback speed and "-s 0.5" would halve it.
-=> ./2018-06-01-realistic-load-testing-with-ioriot-for-linux/figure3-ioriot-replay.png Screenshot replaying I/O
+=> ./realistic-load-testing-with-ioriot-for-linux/figure3-ioriot-replay.png Screenshot replaying I/O
As an initial test, for example, you could compare the two Linux I/O schedulers CFQ and Deadline and check which scheduler the test runs the fastest. They run the test separately for each scheduler. The following shell loop iterates through all attached block devices of the system and changes their I/O scheduler to the one specified in variable $new_scheduler (in this case either cfq or deadline). Subsequently, all I/O events from the io.replay protocol are played back. At the end, an output file with statistics is generated:
@@ -157,13 +157,13 @@ Total time: 1213.00s
In any case, you should also set up a time series database, such as Graphite, where the I/O throughput can be plotted. Figures 4 and 5 show the read and write access times of both tests. The break-in makes it clear when the CFQ test ended and the deadline test was started. The reading latency of both tests is similar. Write latency is dramatically improved using the Deadline Scheduler.
-=> ./2018-06-01-realistic-load-testing-with-ioriot-for-linux/figure4-ioriot-read-latency.png Graphite visualization of the mean read access times in ms with CFQ and Deadline Scheduler.
+=> ./realistic-load-testing-with-ioriot-for-linux/figure4-ioriot-read-latency.png Graphite visualization of the mean read access times in ms with CFQ and Deadline Scheduler.
-=> ./2018-06-01-realistic-load-testing-with-ioriot-for-linux/figure5-ioriot-write-latency.png Graphite visualization of the average write access times in ms with CFQ and Deadline Scheduler.
+=> ./realistic-load-testing-with-ioriot-for-linux/figure5-ioriot-write-latency.png Graphite visualization of the average write access times in ms with CFQ and Deadline Scheduler.
You should also take a look at the iostat tool. The iostat screenshot shows the output of iostat -x 10 during a test run. As you can see, a block device is fully loaded with 99% utilization, while all other block devices still have sufficient buffer. This could be an indication of poor data distribution in the storage system and is worth pursuing. It is not uncommon for I/O Riot to reveal software problems.
-=> ./2018-06-01-realistic-load-testing-with-ioriot-for-linux/figure6-iostat.png Output of iostat. The block device sdy seems to be almost fully utilized by 99%.
+=> ./realistic-load-testing-with-ioriot-for-linux/figure6-iostat.png Output of iostat. The block device sdy seems to be almost fully utilized by 99%.
## I/O Riot is Open Source
diff --git a/gemfeed/2021-04-22-dtail-the-distributed-log-tail-program.gmi b/gemfeed/2021-04-22-dtail-the-distributed-log-tail-program.gmi
index aafd82f3..21e7d316 100644
--- a/gemfeed/2021-04-22-dtail-the-distributed-log-tail-program.gmi
+++ b/gemfeed/2021-04-22-dtail-the-distributed-log-tail-program.gmi
@@ -2,7 +2,7 @@
> Published at 2021-04-22T19:28:41+01:00; Updated at 2021-04-26
-=> ./2021-04-22-dtail-the-distributed-log-tail-program/title.png DTail logo image
+=> ./dtail-the-distributed-log-tail-program/title.png DTail logo image
This article first appeared at the Mimecast Engineering Blog but I made it available here in my personal internet site too.
@@ -30,7 +30,7 @@ Why not just use a full-blown log management system? There are various Open-Sour
DTail does not aim to replace any of the log management tools already available but is rather an additional tool crafted especially for ad-hoc debugging and troubleshooting purposes. DTail is cheap to operate as it does not require any dedicated hardware for log storage as it operates directly on the source of the logs. It means that there is a DTail server installed on all server boxes producing logs. This decentralized comes with the direct advantages that there is no introduced delay because the logs are not shipped to a central log storage device. The reduced complexity also makes it more robust against outages. You won’t be able to troubleshoot your distributed application very well if the log management infrastructure isn’t working either.
-=> ./2021-04-22-dtail-the-distributed-log-tail-program/dtail.gif DTail sample session animated gif
+=> ./dtail-the-distributed-log-tail-program/dtail.gif DTail sample session animated gif
As a downside, you won’t be able to access any logs with DTail when the server is down. Furthermore, a server can store logs only up to a certain capacity as disks will fill up. For the purpose of ad-hoc debugging, these are not typically issues. Usually, it’s the application you want to debug and not the server. And disk space is rarely an issue for bare metal and VM-based systems these days, with sufficient space for several weeks’ worth of log storage being available. DTail also supports reading compressed logs. The currently supported compression algorithms are gzip and zstd.
@@ -54,7 +54,7 @@ Following the UNIX philosophy, DTail includes multiple command-line commands eac
* dgrep: The distributed grep client for searching text files for a regular expression pattern.
* dmap: The distributed map-reduce client for aggregating stats from log files.
-=> ./2021-04-22-dtail-the-distributed-log-tail-program/dgrep.gif DGrep sample session animated gif
+=> ./dtail-the-distributed-log-tail-program/dgrep.gif DGrep sample session animated gif
## Usage example
diff --git a/gemfeed/2021-04-22-dtail-the-distributed-log-tail-program.gmi.tpl b/gemfeed/2021-04-22-dtail-the-distributed-log-tail-program.gmi.tpl
index bdae8e19..5c955c66 100644
--- a/gemfeed/2021-04-22-dtail-the-distributed-log-tail-program.gmi.tpl
+++ b/gemfeed/2021-04-22-dtail-the-distributed-log-tail-program.gmi.tpl
@@ -2,7 +2,7 @@
> Published at 2021-04-22T19:28:41+01:00; Updated at 2021-04-26
-=> ./2021-04-22-dtail-the-distributed-log-tail-program/title.png DTail logo image
+=> ./dtail-the-distributed-log-tail-program/title.png DTail logo image
This article first appeared at the Mimecast Engineering Blog but I made it available here in my personal internet site too.
@@ -30,7 +30,7 @@ Why not just use a full-blown log management system? There are various Open-Sour
DTail does not aim to replace any of the log management tools already available but is rather an additional tool crafted especially for ad-hoc debugging and troubleshooting purposes. DTail is cheap to operate as it does not require any dedicated hardware for log storage as it operates directly on the source of the logs. It means that there is a DTail server installed on all server boxes producing logs. This decentralized comes with the direct advantages that there is no introduced delay because the logs are not shipped to a central log storage device. The reduced complexity also makes it more robust against outages. You won’t be able to troubleshoot your distributed application very well if the log management infrastructure isn’t working either.
-=> ./2021-04-22-dtail-the-distributed-log-tail-program/dtail.gif DTail sample session animated gif
+=> ./dtail-the-distributed-log-tail-program/dtail.gif DTail sample session animated gif
As a downside, you won’t be able to access any logs with DTail when the server is down. Furthermore, a server can store logs only up to a certain capacity as disks will fill up. For the purpose of ad-hoc debugging, these are not typically issues. Usually, it’s the application you want to debug and not the server. And disk space is rarely an issue for bare metal and VM-based systems these days, with sufficient space for several weeks’ worth of log storage being available. DTail also supports reading compressed logs. The currently supported compression algorithms are gzip and zstd.
@@ -54,7 +54,7 @@ Following the UNIX philosophy, DTail includes multiple command-line commands eac
* dgrep: The distributed grep client for searching text files for a regular expression pattern.
* dmap: The distributed map-reduce client for aggregating stats from log files.
-=> ./2021-04-22-dtail-the-distributed-log-tail-program/dgrep.gif DGrep sample session animated gif
+=> ./dtail-the-distributed-log-tail-program/dgrep.gif DGrep sample session animated gif
## Usage example
diff --git a/gemfeed/2021-04-24-welcome-to-the-geminispace.gmi b/gemfeed/2021-04-24-welcome-to-the-geminispace.gmi
index 6ceea858..26e56715 100644
--- a/gemfeed/2021-04-24-welcome-to-the-geminispace.gmi
+++ b/gemfeed/2021-04-24-welcome-to-the-geminispace.gmi
@@ -48,8 +48,8 @@ Around the same time, I discovered a relatively new, more lightweight protocol n
The "downside" is that due to the limited capabilities of the Gemini protocol, all sites look very old and spartan. But that is not a downside; that is, in fact, a design choice people made. It is up to the client software how your capsule looks. For example, you could use a graphical client, such as Lagrange, with nice font renderings and colours to improve the appearance. Or you could use a very minimalistic command line black-and-white Gemini client. It's your (the user's) choice.
-=> ./2021-04-24-welcome-to-the-geminispace/amfora-screenshot.png Screenshot Amfora Gemini terminal client surfing this site
-=> ./2021-04-24-welcome-to-the-geminispace/lagrange-screenshot.png Screenshot graphical Lagrange Gemini client surfing this site
+=> ./welcome-to-the-geminispace/amfora-screenshot.png Screenshot Amfora Gemini terminal client surfing this site
+=> ./welcome-to-the-geminispace/lagrange-screenshot.png Screenshot graphical Lagrange Gemini client surfing this site
Why is there a need for a new protocol? As the modern web is a superset of Gemini, can't we use simple HTML 1.0 instead? That's a good and valid question. It is not a technical problem but a human problem. We tend to abuse the features once they are available. You can ensure that things stay efficient and straightforward as long as you are using the Gemini protocol. On the other hand, you can't force every website on the modern web to only create plain and straightforward-looking HTML pages.
diff --git a/gemfeed/2021-04-24-welcome-to-the-geminispace.gmi.tpl b/gemfeed/2021-04-24-welcome-to-the-geminispace.gmi.tpl
index 9b103c48..0a036349 100644
--- a/gemfeed/2021-04-24-welcome-to-the-geminispace.gmi.tpl
+++ b/gemfeed/2021-04-24-welcome-to-the-geminispace.gmi.tpl
@@ -48,8 +48,8 @@ Around the same time, I discovered a relatively new, more lightweight protocol n
The "downside" is that due to the limited capabilities of the Gemini protocol, all sites look very old and spartan. But that is not a downside; that is, in fact, a design choice people made. It is up to the client software how your capsule looks. For example, you could use a graphical client, such as Lagrange, with nice font renderings and colours to improve the appearance. Or you could use a very minimalistic command line black-and-white Gemini client. It's your (the user's) choice.
-=> ./2021-04-24-welcome-to-the-geminispace/amfora-screenshot.png Screenshot Amfora Gemini terminal client surfing this site
-=> ./2021-04-24-welcome-to-the-geminispace/lagrange-screenshot.png Screenshot graphical Lagrange Gemini client surfing this site
+=> ./welcome-to-the-geminispace/amfora-screenshot.png Screenshot Amfora Gemini terminal client surfing this site
+=> ./welcome-to-the-geminispace/lagrange-screenshot.png Screenshot graphical Lagrange Gemini client surfing this site
Why is there a need for a new protocol? As the modern web is a superset of Gemini, can't we use simple HTML 1.0 instead? That's a good and valid question. It is not a technical problem but a human problem. We tend to abuse the features once they are available. You can ensure that things stay efficient and straightforward as long as you are using the Gemini protocol. On the other hand, you can't force every website on the modern web to only create plain and straightforward-looking HTML pages.
diff --git a/gemfeed/2021-06-05-gemtexter-one-bash-script-to-rule-it-all.gmi b/gemfeed/2021-06-05-gemtexter-one-bash-script-to-rule-it-all.gmi
index f8e5fdde..c8e39d48 100644
--- a/gemfeed/2021-06-05-gemtexter-one-bash-script-to-rule-it-all.gmi
+++ b/gemfeed/2021-06-05-gemtexter-one-bash-script-to-rule-it-all.gmi
@@ -51,7 +51,7 @@ This comes with the benefit that I can write content in my favourite text editor
Another benefit of using Gemini is that the Gemtext markup language is easy to parse. As my site is dual-hosted (Gemini+HTTP), I could, in theory, just write a shell script to deal with the conversion from Gemtext to HTML; there is no need for a full-featured programming language here. I have done a lot of Bash in the past, but I am also often revisiting old tools and techniques for refreshing and keeping the knowledge up to date here.
-=> ./2021-06-05-gemtexter-one-bash-script-to-rule-it-all/blog-engine.jpg Motivational comic strip
+=> ./gemtexter-one-bash-script-to-rule-it-all/blog-engine.jpg Motivational comic strip
I have exactly done that - I wrote a Bash script, named Gemtexter, for that:
diff --git a/gemfeed/2021-06-05-gemtexter-one-bash-script-to-rule-it-all.gmi.tpl b/gemfeed/2021-06-05-gemtexter-one-bash-script-to-rule-it-all.gmi.tpl
index ad55cc9d..61cd65be 100644
--- a/gemfeed/2021-06-05-gemtexter-one-bash-script-to-rule-it-all.gmi.tpl
+++ b/gemfeed/2021-06-05-gemtexter-one-bash-script-to-rule-it-all.gmi.tpl
@@ -51,7 +51,7 @@ This comes with the benefit that I can write content in my favourite text editor
Another benefit of using Gemini is that the Gemtext markup language is easy to parse. As my site is dual-hosted (Gemini+HTTP), I could, in theory, just write a shell script to deal with the conversion from Gemtext to HTML; there is no need for a full-featured programming language here. I have done a lot of Bash in the past, but I am also often revisiting old tools and techniques for refreshing and keeping the knowledge up to date here.
-=> ./2021-06-05-gemtexter-one-bash-script-to-rule-it-all/blog-engine.jpg Motivational comic strip
+=> ./gemtexter-one-bash-script-to-rule-it-all/blog-engine.jpg Motivational comic strip
I have exactly done that - I wrote a Bash script, named Gemtexter, for that:
diff --git a/gemfeed/2021-07-04-the-well-grounded-rubyist.gmi b/gemfeed/2021-07-04-the-well-grounded-rubyist.gmi
index e3357370..55e8b0b1 100644
--- a/gemfeed/2021-07-04-the-well-grounded-rubyist.gmi
+++ b/gemfeed/2021-07-04-the-well-grounded-rubyist.gmi
@@ -6,11 +6,11 @@ When I was a Linux System Administrator, I have been programming in Perl for yea
You should learn or try out one new programming language once yearly anyway. If you end up not using the new language, that's not a problem. You will learn new techniques with each new programming language and this also helps you to improve your overall programming skills even for other languages. Also, having some background in a similar programming language makes it reasonably easy to get started. Besides that, learning a new programming language is kick-a** fun!
-=> ./2021-07-04-the-well-grounded-rubyist/book-cover.jpg
+=> ./the-well-grounded-rubyist/book-cover.jpg
Superficially, Perl seems to have many similarities to Ruby (but, of course, it is entirely different to Perl when you look closer), which pushed me towards Ruby instead of Python. I have tried Python a couple of times before, and I managed to write good code, but I never felt satisfied with the language. I didn't love the syntax, especially the indentations used; they always confused me. I don't dislike Python, but I don't prefer to program in it if I have a choice, especially when there are more propelling alternatives available. Personally, it's so much more fun to program in Ruby than in Python.
-=> ./2021-07-04-the-well-grounded-rubyist/book-backside.jpg
+=> ./the-well-grounded-rubyist/book-backside.jpg
Yukihiro Matsumoto, the inventor of Ruby, said: "I wanted a scripting language that was more powerful than Perl and more object-oriented than Python" - So I can see where some of the similarities come from. I personally don't believe that Ruby is more powerful than Perl, though, especially when you take CPAN and/or Perl 6 (now known as Raku) into the equation. Well, it all depends on what you mean with "more powerful". But I want to stay pragmatic and use what's already used at my workplace.
diff --git a/gemfeed/2022-05-27-perl-is-still-a-great-choice.gmi b/gemfeed/2022-05-27-perl-is-still-a-great-choice.gmi
index 90ac0f44..5719847c 100644
--- a/gemfeed/2022-05-27-perl-is-still-a-great-choice.gmi
+++ b/gemfeed/2022-05-27-perl-is-still-a-great-choice.gmi
@@ -2,13 +2,13 @@
> Published at 2022-05-27T07:50:12+01:00; Updated at 2023-01-28
-=> ./2022-05-27-perl-is-still-a-great-choice/regular_expressions.png Comic source: XKCD
+=> ./perl-is-still-a-great-choice/regular_expressions.png Comic source: XKCD
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.
Unfortunately (it makes me sad), Perl's popularity has been declining over the last years as Google trends shows:
-=> ./2022-05-27-perl-is-still-a-great-choice/googletrendsperl.jpg
+=> ./perl-is-still-a-great-choice/googletrendsperl.jpg
So why is that? Once the de-facto standard super-glue language for the web nowadays seems to have a bad reputation. Often, people state:
diff --git a/gemfeed/2022-05-27-perl-is-still-a-great-choice.gmi.tpl b/gemfeed/2022-05-27-perl-is-still-a-great-choice.gmi.tpl
index 26b5c67c..ea0170e2 100644
--- a/gemfeed/2022-05-27-perl-is-still-a-great-choice.gmi.tpl
+++ b/gemfeed/2022-05-27-perl-is-still-a-great-choice.gmi.tpl
@@ -2,13 +2,13 @@
> Published at 2022-05-27T07:50:12+01:00; Updated at 2023-01-28
-=> ./2022-05-27-perl-is-still-a-great-choice/regular_expressions.png Comic source: XKCD
+=> ./perl-is-still-a-great-choice/regular_expressions.png Comic source: XKCD
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.
Unfortunately (it makes me sad), Perl's popularity has been declining over the last years as Google trends shows:
-=> ./2022-05-27-perl-is-still-a-great-choice/googletrendsperl.jpg
+=> ./perl-is-still-a-great-choice/googletrendsperl.jpg
So why is that? Once the de-facto standard super-glue language for the web nowadays seems to have a bad reputation. Often, people state:
diff --git a/gemfeed/2022-06-15-sweating-the-small-stuff.gmi b/gemfeed/2022-06-15-sweating-the-small-stuff.gmi
index e270d436..aba7fa93 100644
--- a/gemfeed/2022-06-15-sweating-the-small-stuff.gmi
+++ b/gemfeed/2022-06-15-sweating-the-small-stuff.gmi
@@ -47,7 +47,7 @@ But now, let's continue with the small projects worth mentioning :-)
Photography is one of my casual hobbies. I love to capture interesting perspectives and motifs. I love to walk new streets and neighbourhoods I never walked before so I can capture those unexpected motifs, colours and moments. Unfortunately, because of time constraints (and sometime weather constraints), I do that on a pretty infrequent basis.
-=> ./2022-06-15-sweating-the-small-stuff/ninja.jpg
+=> ./sweating-the-small-stuff/ninja.jpg
More than 10 years ago I wrote the bespoke small static photo album generator in Bash `photoalbum.sh` which I recently refactored to a modern Bash coding style and also freshened up the Cascading Style Sheets. Last but not least, the new domain name `irregular.ninja` has been registered.
@@ -229,7 +229,7 @@ This is a shell script for the Mutt email client for delaying sending out E-Mail
`jsmstrade` is a minimalistic graphical Java swing client for sending SMS messages over the SMStrade service.
-=> ./2022-06-15-sweating-the-small-stuff/jsmstrade.png
+=> ./sweating-the-small-stuff/jsmstrade.png
=> https://codeberg.org/snonux/jsmstrade
=> https://smstrade.de
diff --git a/gemfeed/2022-12-24-ultrarelearning-java-my-takeaways.gmi b/gemfeed/2022-12-24-ultrarelearning-java-my-takeaways.gmi
index 944940a3..d3b4d94d 100644
--- a/gemfeed/2022-12-24-ultrarelearning-java-my-takeaways.gmi
+++ b/gemfeed/2022-12-24-ultrarelearning-java-my-takeaways.gmi
@@ -2,7 +2,7 @@
> Published at 2022-12-24T23:18:40+02:00
-=> ./2022-12-24-ultrarelearning-java-my-takeaways/learnjava.jpg
+=> ./ultrarelearning-java-my-takeaways/learnjava.jpg
As a regular participant in the annual Pet Project competition at work, I always try to find a project where I can learn something new. In this post, I would like to share my takeaways after revisiting Java. You can read about my motivations in my "Creative universe" post:
@@ -26,7 +26,7 @@ Over time, I had been missing out on many new features that were added to the la
This book was recommended by my brother and also by at least another colleague at work to be one of the best, if not the best, book about Java programming. I read the whole book from the beginning to the end and immersed myself in it. I fully agree; this is a great book. Every Java developer or Java software engineer should read it!
-=> ./2022-12-24-ultrarelearning-java-my-takeaways/effective-java.jpg
+=> ./ultrarelearning-java-my-takeaways/effective-java.jpg
I recommend reading the 90-part effective Java Series on `dev.to`. It's a perfect companion to the book as it explains all the chapters again but from a slightly different perspective and helps you to really understand the content.
diff --git a/gemfeed/2023-06-01-kiss-server-monitoring-with-gogios.gmi b/gemfeed/2023-06-01-kiss-server-monitoring-with-gogios.gmi
index bba6886c..cec0f470 100644
--- a/gemfeed/2023-06-01-kiss-server-monitoring-with-gogios.gmi
+++ b/gemfeed/2023-06-01-kiss-server-monitoring-with-gogios.gmi
@@ -2,7 +2,7 @@
> Published at 2023-06-01T21:10:17+03:00
-=> ./2023-06-01-kiss-server-monitoring-with-gogios/gogios-small.png Gogios logo
+=> ./kiss-server-monitoring-with-gogios/gogios-small.png Gogios logo
## Introduction
diff --git a/gemfeed/2023-06-01-kiss-server-monitoring-with-gogios.gmi.tpl b/gemfeed/2023-06-01-kiss-server-monitoring-with-gogios.gmi.tpl
index d49e9f1c..ec42c787 100644
--- a/gemfeed/2023-06-01-kiss-server-monitoring-with-gogios.gmi.tpl
+++ b/gemfeed/2023-06-01-kiss-server-monitoring-with-gogios.gmi.tpl
@@ -2,7 +2,7 @@
> Published at 2023-06-01T21:10:17+03:00
-=> ./2023-06-01-kiss-server-monitoring-with-gogios/gogios-small.png Gogios logo
+=> ./kiss-server-monitoring-with-gogios/gogios-small.png Gogios logo
## Introduction
diff --git a/gemfeed/2023-12-10-bash-golf-part-3.gmi b/gemfeed/2023-12-10-bash-golf-part-3.gmi
index 576b6735..d480ae80 100644
--- a/