From 638aa9523d57c7071d311909ef805bdda80098b3 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Tue, 1 Jul 2025 22:48:14 +0300 Subject: new post --- ...5-01-01-posts-from-october-to-december-2024.gmi | 1 + .../DRAFT-f3s-kubernetes-with-freebsd-part-6.gmi | 182 ++++ ...RAFT-f3s-kubernetes-with-freebsd-part-6.gmi.tpl | 230 +++++ gemfeed/atom.xml | 941 +++++++++++++++++---- gemfeed/index.gmi | 1 + 5 files changed, 1169 insertions(+), 186 deletions(-) (limited to 'gemfeed') diff --git a/gemfeed/2025-01-01-posts-from-october-to-december-2024.gmi b/gemfeed/2025-01-01-posts-from-october-to-december-2024.gmi index 2183a7bf..d59f5981 100644 --- a/gemfeed/2025-01-01-posts-from-october-to-december-2024.gmi +++ b/gemfeed/2025-01-01-posts-from-october-to-december-2024.gmi @@ -327,6 +327,7 @@ My New Year's resolution is not to start any new non-fiction books (or only very Other related posts: +=> ./2025-07-01-posts-from-january-to-june-2025.gmi 2025-07-01 Posts from January to June 2025 => ./2025-01-01-posts-from-october-to-december-2024.gmi 2025-01-01 Posts from October to December 2024 (You are currently reading this) E-Mail your comments to `paul@nospam.buetow.org` :-) diff --git a/gemfeed/DRAFT-f3s-kubernetes-with-freebsd-part-6.gmi b/gemfeed/DRAFT-f3s-kubernetes-with-freebsd-part-6.gmi index 039ba6b3..6e3f9395 100644 --- a/gemfeed/DRAFT-f3s-kubernetes-with-freebsd-part-6.gmi +++ b/gemfeed/DRAFT-f3s-kubernetes-with-freebsd-part-6.gmi @@ -22,6 +22,15 @@ This is the sixth blog post about the f3s series for self-hosting demands in a h * ⇢ ⇢ ⇢ Configuring `zdata` ZFS pool and encryption * ⇢ ⇢ ⇢ Migrating Bhyve VMs to encrypted `bhyve` ZFS volume * ⇢ ⇢ CARP +* ⇢ ⇢ ZFS Replication with zrepl +* ⇢ ⇢ ⇢ Installing zrepl +* ⇢ ⇢ ⇢ Checking ZFS pools +* ⇢ ⇢ ⇢ Configuring zrepl with WireGuard tunnel +* ⇢ ⇢ ⇢ Configuring zrepl on f0 (source) +* ⇢ ⇢ ⇢ Configuring zrepl on f1 (sink) +* ⇢ ⇢ ⇢ Enabling and starting zrepl services +* ⇢ ⇢ ⇢ Verifying replication +* ⇢ ⇢ ⇢ Monitoring replication ## Introduction @@ -189,6 +198,179 @@ next, copied that script /usr/local/bin/carpcontrol.sh and adjusted the disk to reboot or run doas kldload carp0 +## ZFS Replication with zrepl + +In this section, we'll set up automatic ZFS replication from f0 to f1 using zrepl. This ensures our data is replicated across nodes for redundancy. + +### Installing zrepl + +First, install zrepl on both hosts: + +```sh +# On f0 +paul@f0:~ % doas pkg install -y zrepl + +# On f1 +paul@f1:~ % doas pkg install -y zrepl +``` + +### Checking ZFS pools + +Verify the pools and datasets on both hosts: + +```sh +# On f0 +paul@f0:~ % doas zpool list +NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT +zdata 928G 1.03M 928G - - 0% 0% 1.00x ONLINE - +zroot 472G 26.7G 445G - - 0% 5% 1.00x ONLINE - + +paul@f0:~ % doas zfs list -r zdata/enc +NAME USED AVAIL REFER MOUNTPOINT +zdata/enc 200K 899G 200K /data/enc + +# On f1 +paul@f1:~ % doas zpool list +NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT +zdata 928G 956K 928G - - 0% 0% 1.00x ONLINE - +zroot 472G 11.7G 460G - - 0% 2% 1.00x ONLINE - + +paul@f1:~ % doas zfs list -r zdata/enc +NAME USED AVAIL REFER MOUNTPOINT +zdata/enc 200K 899G 200K /data/enc +``` + +### Configuring zrepl with WireGuard tunnel + +Since we have a WireGuard tunnel between f0 and f1, we'll use TCP transport over the secure tunnel instead of SSH. First, check the WireGuard IP addresses: + +```sh +# Check WireGuard interface IPs +paul@f0:~ % ifconfig wg0 | grep inet + inet 192.168.2.130 netmask 0xffffff00 + +paul@f1:~ % ifconfig wg0 | grep inet + inet 192.168.2.131 netmask 0xffffff00 +``` + +### Configuring zrepl on f0 (source) + +Create the zrepl configuration on f0: + +```sh +paul@f0:~ % doas tee /usr/local/etc/zrepl/zrepl.yml <<'EOF' +global: + logging: + - type: stdout + level: info + format: human + +jobs: + - name: "f0_to_f1" + type: push + connect: + type: tcp + address: "192.168.2.131:8888" + filesystems: { + "zdata/enc": true + } + send: + encrypted: true + snapshotting: + type: periodic + prefix: zrepl_ + interval: 10m + pruning: + keep_sender: + - type: last_n + count: 10 + - type: grid + grid: 1x1h(keep=all) | 24x1h | 7x1d | 4x7d | 6x30d + regex: "^zrepl_.*" + keep_receiver: + - type: grid + grid: 1x1h(keep=all) | 24x1h | 7x1d | 4x7d | 6x30d + regex: "^zrepl_.*" +EOF +``` + +### Configuring zrepl on f1 (sink) + +Create the zrepl configuration on f1: + +```sh +paul@f1:~ % doas tee /usr/local/etc/zrepl/zrepl.yml <<'EOF' +global: + logging: + - type: stdout + level: info + format: human + +jobs: + - name: "sink" + type: sink + serve: + type: tcp + listen: "192.168.2.131:8888" + clients: + "192.168.2.130": "f0" + recv: + placeholder: + encryption: inherit + root_fs: "zdata/enc" +EOF +``` + +### Enabling and starting zrepl services + +Enable and start zrepl on both hosts: + +```sh +# On f0 +paul@f0:~ % doas sysrc zrepl_enable=YES +zrepl_enable: -> YES +paul@f0:~ % doas service zrepl start +Starting zrepl. + +# On f1 +paul@f1:~ % doas sysrc zrepl_enable=YES +zrepl_enable: -> YES +paul@f1:~ % doas service zrepl start +Starting zrepl. +``` + +### Verifying replication + +Check the replication status: + +```sh +# On f0, check zrepl status +paul@f0:~ % doas zrepl status + +# Check for zrepl snapshots +paul@f0:~ % doas zfs list -t snapshot -r zdata/enc | grep zrepl + +# On f1, verify the replicated datasets +paul@f1:~ % doas zfs list -r zdata/enc + +# Check zrepl logs for any errors +paul@f0:~ % doas tail -f /var/log/zrepl.log +``` + +### Monitoring replication + +You can monitor the replication progress with: + +```sh +# Real-time status +paul@f0:~ % doas zrepl status --mode interactive + +# Check specific job details +paul@f0:~ % doas zrepl status --job f0_to_f1 +``` + +With this setup, zdata/enc on f0 will be automatically replicated to f1 every 10 minutes, with encrypted snapshots preserved on both sides. The pruning policy ensures that we keep recent snapshots while managing disk space efficiently. + ZFS auto scrubbing....~? Backup of the keys on the key locations (all keys on all 3 USB keys) diff --git a/gemfeed/DRAFT-f3s-kubernetes-with-freebsd-part-6.gmi.tpl b/gemfeed/DRAFT-f3s-kubernetes-with-freebsd-part-6.gmi.tpl index a2b7ea5f..64fa1cf1 100644 --- a/gemfeed/DRAFT-f3s-kubernetes-with-freebsd-part-6.gmi.tpl +++ b/gemfeed/DRAFT-f3s-kubernetes-with-freebsd-part-6.gmi.tpl @@ -176,6 +176,236 @@ next, copied that script /usr/local/bin/carpcontrol.sh and adjusted the disk to reboot or run doas kldload carp0 +## ZFS Replication with zrepl + +In this section, we'll set up automatic ZFS replication from f0 to f1 using zrepl. This ensures our data is replicated across nodes for redundancy. + +### Installing zrepl + +First, install zrepl on both hosts: + +```sh +# On f0 +paul@f0:~ % doas pkg install -y zrepl + +# On f1 +paul@f1:~ % doas pkg install -y zrepl +``` + +### Checking ZFS pools + +Verify the pools and datasets on both hosts: + +```sh +# On f0 +paul@f0:~ % doas zpool list +NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT +zdata 928G 1.03M 928G - - 0% 0% 1.00x ONLINE - +zroot 472G 26.7G 445G - - 0% 5% 1.00x ONLINE - + +paul@f0:~ % doas zfs list -r zdata/enc +NAME USED AVAIL REFER MOUNTPOINT +zdata/enc 200K 899G 200K /data/enc + +# On f1 +paul@f1:~ % doas zpool list +NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT +zdata 928G 956K 928G - - 0% 0% 1.00x ONLINE - +zroot 472G 11.7G 460G - - 0% 2% 1.00x ONLINE - + +paul@f1:~ % doas zfs list -r zdata/enc +NAME USED AVAIL REFER MOUNTPOINT +zdata/enc 200K 899G 200K /data/enc +``` + +### Configuring zrepl with WireGuard tunnel + +Since we have a WireGuard tunnel between f0 and f1, we'll use TCP transport over the secure tunnel instead of SSH. First, check the WireGuard IP addresses: + +```sh +# Check WireGuard interface IPs +paul@f0:~ % ifconfig wg0 | grep inet + inet 192.168.2.130 netmask 0xffffff00 + +paul@f1:~ % ifconfig wg0 | grep inet + inet 192.168.2.131 netmask 0xffffff00 +``` + +### Configuring zrepl on f0 (source) + +Create the zrepl configuration on f0: + +```sh +paul@f0:~ % doas tee /usr/local/etc/zrepl/zrepl.yml <<'EOF' +global: + logging: + - type: stdout + level: info + format: human + +jobs: + - name: f0_to_f1 + type: push + connect: + type: tcp + address: "192.168.2.131:8888" + filesystems: + "zdata/enc": true + send: + encrypted: true + snapshotting: + type: periodic + prefix: zrepl_ + interval: 10m + pruning: + keep_sender: + - type: last_n + count: 10 + keep_receiver: + - type: last_n + count: 10 +EOF +``` + +### Configuring zrepl on f1 (sink) + +Create the zrepl configuration on f1: + +```sh +paul@f1:~ % doas tee /usr/local/etc/zrepl/zrepl.yml <<'EOF' +global: + logging: + - type: stdout + level: info + format: human + +jobs: + - name: "sink" + type: sink + serve: + type: tcp + listen: "192.168.2.131:8888" + clients: + "192.168.2.130": "f0" + recv: + placeholder: + encryption: inherit + root_fs: "zdata/enc" +EOF +``` + +### Enabling and starting zrepl services + +Enable and start zrepl on both hosts: + +```sh +# On f0 +paul@f0:~ % doas sysrc zrepl_enable=YES +zrepl_enable: -> YES +paul@f0:~ % doas service zrepl start +Starting zrepl. + +# On f1 +paul@f1:~ % doas sysrc zrepl_enable=YES +zrepl_enable: -> YES +paul@f1:~ % doas service zrepl start +Starting zrepl. +``` + +### Verifying replication + +Check the replication status: + +```sh +# On f0, check zrepl status (use raw mode for non-tty) +paul@f0:~ % doas zrepl status --mode raw | grep -A2 "Replication" +"Replication":{"StartAt":"2025-07-01T22:31:48.712143123+03:00"... + +# Check if services are running +paul@f0:~ % doas service zrepl status +zrepl is running as pid 2649. + +paul@f1:~ % doas service zrepl status +zrepl is running as pid 2574. + +# Check for zrepl snapshots on source +paul@f0:~ % doas zfs list -t snapshot -r zdata/enc | grep zrepl +zdata/enc@zrepl_20250701_193148_000 0B - 176K - + +# On f1, verify the replicated datasets +paul@f1:~ % doas zfs list -r zdata/enc +NAME USED AVAIL REFER MOUNTPOINT +zdata/enc 776K 899G 200K /data/enc +zdata/enc/f0 576K 899G 200K none +zdata/enc/f0/zdata 376K 899G 200K none +zdata/enc/f0/zdata/enc 176K 899G 176K none + +# Check replicated snapshots on f1 +paul@f1:~ % doas zfs list -t snapshot -r zdata/enc +NAME USED AVAIL REFER MOUNTPOINT +zdata/enc/f0/zdata/enc@zrepl_20250701_193148_000 0B - 176K - +``` + +### Monitoring replication + +You can monitor the replication progress with: + +```sh +# Real-time status +paul@f0:~ % doas zrepl status --mode interactive + +# Check specific job details +paul@f0:~ % doas zrepl status --job f0_to_f1 +``` + +With this setup, zdata/enc on f0 will be automatically replicated to f1 every 10 minutes, with encrypted snapshots preserved on both sides. The pruning policy ensures that we keep the last 10 snapshots while managing disk space efficiently. + +The replicated data appears on f1 under `zdata/enc/f0/zdata/enc` to maintain the source dataset hierarchy. The replication uses the WireGuard tunnel for secure, encrypted transport between nodes. + +### Quick status check commands + +Here are the essential commands to monitor replication status: + +```sh +# On the source node (f0) - check if replication is active +paul@f0:~ % doas zrepl status --job f0_to_f1 | grep -E '(State|Last)' +State: done +LastError: + +# List all zrepl snapshots on source +paul@f0:~ % doas zfs list -t snapshot -r zdata/enc | grep zrepl +zdata/enc@zrepl_20250701_193148_000 0B - 176K - +zdata/enc@zrepl_20250701_194148_000 0B - 176K - + +# On the sink node (f1) - verify received datasets +paul@f1:~ % doas zfs list -r zdata/enc/f0 +NAME USED AVAIL REFER MOUNTPOINT +zdata/enc/f0 576K 899G 200K none +zdata/enc/f0/zdata 376K 899G 200K none +zdata/enc/f0/zdata/enc 176K 899G 176K none + +# Check received snapshots on sink +paul@f1:~ % doas zfs list -t snapshot -r zdata/enc | wc -l + 2 + +# Monitor replication progress in real-time (on source) +paul@f0:~ % doas zrepl status --mode interactive + +# Check last replication time (on source) +paul@f0:~ % doas zrepl status --job f0_to_f1 | grep -A1 "Replication" +Replication: + Status: Idle (last run: 2025-07-01T22:41:48) + +# View zrepl logs for troubleshooting +paul@f0:~ % doas tail -20 /var/log/zrepl.log | grep -E '(error|warn|replication)' +``` + +These commands provide a quick way to verify that: +- Replication jobs are running without errors +- Snapshots are being created on the source +- Data is being received on the sink +- The replication schedule is being followed + ZFS auto scrubbing....~? Backup of the keys on the key locations (all keys on all 3 USB keys) diff --git a/gemfeed/atom.xml b/gemfeed/atom.xml index 7d3fd79e..55a54ef4 100644 --- a/gemfeed/atom.xml +++ b/gemfeed/atom.xml @@ -1,11 +1,764 @@ - 2025-06-29T13:29:59+03:00 + 2025-07-01T22:39:30+03:00 foo.zone feed To be in the .zone! gemini://foo.zone/ + + Posts from January to June 2025 + + gemini://foo.zone/gemfeed/2025-07-01-posts-from-january-to-june-2025.gmi + 2025-07-01T22:39:29+03:00 + + Paul Buetow aka snonux + paul@dev.buetow.org + + These are my social media posts from the last six months. I keep them here to reflect on them and also to not lose them. Social media networks come and go and are not under my control, but my domain is here to stay. + +
+

Posts from January to June 2025


+
+These are my social media posts from the last six months. I keep them here to reflect on them and also to not lose them. Social media networks come and go and are not under my control, but my domain is here to stay.
+
+These are from Mastodon and LinkedIn. Have a look at my about page for my social media profiles. This list is generated with Gos, my social media platform sharing tool.
+
+My about page
+https://codeberg.org/snonux/gos
+
+

Table of Contents


+
+
+

January 2025


+
+

I am currently binge-listening to the Google ...


+
+I am currently binge-listening to the Google #SRE ProdCast. It's really great to learn about the stories of individual SREs and their journeys. It is not just about SREs at Google; there are also external guests.
+
+sre.google/prodcast/
+
+

Recently, there was a >5000 LOC #bash ...


+
+Recently, there was a >5000 LOC #bash codebase at work that reported the progress of a migration, nobody understood it and it was wonky (sometimes it would not return the desired results). On top of that, the coding style was very bad as well (I could rant forever here). The engineer who wrote it left the company. I rewrote it in #Perl in about 300 LOC. Colleagues asked why not Python. Perl is the perfect choice here—it's even in its name: Practical Extraction and Report Language!
+
+

Ghostty is a terminal emulator that was ...


+
+Ghostty is a terminal emulator that was recently released publicly as open-source. I love that it works natively on both Linux and macOS; it looks great (font rendering) and is fast and customizable via a config file (which I manage with a config mng system). Ghostty is a passion project written in Zig, the author loved the community so much while working on it that he donated $300k to the Zig Foundation. #terminal #emulator
+
+ghostty.org
+
+

Go is not an easy programming language. Don't ...


+
+Go is not an easy programming language. Don't confuse easy with simple syntax. I'd agree to this. With the recent addition of Generics to the language I also feel that even the syntax stops being simple.. Also, simplicity is complex (especially under the hood how the language works - there are many mechanics you need to know if you really want to master the language). #golang
+
+www.arp242.net/go-easy.html
+
+

How will AI change software engineering (or has ...


+
+How will AI change software engineering (or has it already)? The bottom line is that less experienced engineers may have problems (accepting incomplete or incorrect programs, only reaching 70 percent solutions), while experienced engineers can leverage AI to boost their performance as they know how to fix the remaining 30 percent of the generated code. #ai #engineering #software
+
+newsletter.pragmaticengineer.com/p/how-ai-will-change-software-engineering
+
+

Eliminating toil - Toil is not always a bad ...


+
+Eliminating toil - Toil is not always a bad thing - some even enjoy toil - it is calming in small amounts - but it becomes toxic in large amounts - #SRE
+
+sre.google/sre-book/eliminating-toil/
+
+

Fun read. How about using the character ...


+
+Fun read. How about using the character sequence :-) as a statement separator in a programming language?
+
+ntietz.com/blog/researching-why-we-use-semicolons-as-statement-terminators/
+
+

Thats unexpected, you cant remove a NaN key ...


+
+Thats unexpected, you cant remove a NaN key from a map without clearing it! #golang via @wallabagapp
+
+unexpected-go.com/you-cant-remove-a-nan-key-from-a-map-without-clearing-it.html
+
+

Nice refresher for #shell #bash #zsh ...


+
+Nice refresher for #shell #bash #zsh redirection rules
+
+rednafi.com/misc/shell_redirection/
+
+

I think discussing action items in incident ...


+
+I think discussing action items in incident reviews is important. At least the obvious should be captured and noted down. It does not mean that the action items need to be fully refined in the review meeting; that would be out of scope, in my opinion.
+
+surfingcomplexity.blog/2024/09/28/why-..-..-action-items-during-incident-reviews/
+
+

At first, functional options add a bit of ...


+
+At first, functional options add a bit of boilerplate, but they turn out to be quite neat, especially when you have very long parameter lists that need to be made neat and tidy. #golang
+
+www.calhoun.io/using-functional-options-instead-of-method-chaining-in-go/
+
+

In the "Working with an SRE Interview" I have ...


+
+In the "Working with an SRE Interview" I have been askd about what it's like working with an SRE! We'd covered much more in depth, but we decided not to make it too long in the final version! #sre #interview
+
+foo.zone/gemfeed/2025-01-15-working-with-an-sre-interview.gmi (Gemini)
+foo.zone/gemfeed/2025-01-15-working-with-an-sre-interview.html
+
+

In the "Working with an SRE Interview" I have ...


+
+In the "Working with an SRE Interview" I have been askd about what it's like working with an SRE! We'd covered much more in depth, but we decided not to make it too long in the final version! #sre #interview
+
+foo.zone/gemfeed/2025-01-15-working-with-an-sre-interview.gmi (Gemini)
+foo.zone/gemfeed/2025-01-15-working-with-an-sre-interview.html
+
+

Small introduction to the #Android ...


+
+Small introduction to the #Android distribution called #GrapheneOS For myself, I am using a Pixel 7 Pro, which comes with "only" 5 years of support (not yet 7 years like the Pixel 8 and 9 series). I also wrote about GrapheneOS here once:
+
+dataswamp.org/~solene/2025-01-12-intro-to-grapheneos.html
+foo.zone/gemfeed/2023-01-23-why-grapheneos-rox.gmi (Gemini)
+foo.zone/gemfeed/2023-01-23-why-grapheneos-rox.html
+
+

Helix 2025.01 has been released. The completion ...


+
+Helix 2025.01 has been released. The completion of path names and the snippet functionality will be particularly useful for me. Overall, it's a great release. The release notes cover only some highlights, but there are many more changes in this version so also have a look at the Changelog! #HelixEditor
+
+helix-editor.com/news/release-25-01-highlights/
+
+

I found these are excellent examples of how ...


+
+I found these are excellent examples of how #OpenBSD's #relayd can be used.
+
+www.tumfatig.net/2023/using-openbsd-relayd8-as-an-application-layer-gateway/
+
+

LLMs for Ops? Summaries of logs, probabilities ...


+
+LLMs for Ops? Summaries of logs, probabilities about correctness, auto-generating Ansible, some uses cases are there. Wouldn't trust it fully, though.
+
+youtu.be/WodaffxVq-E?si=noY0egrfl5izCSQI
+
+

Enjoying an APC Power-UPS BX750MI in my ...


+
+Enjoying an APC Power-UPS BX750MI in my #homelab with #FreeBSD and apcupsd. I can easily use the UPS status to auto-shutdown a cluster of FreeBSD machines on a power cut. One FreeBSD machine acts as the apcupsd master, connected via USB to the APC, while the remaining machines read the status remotely via the apcupsd network port from the master. However, it won't work when the master is down. #APC #UPS
+
+

"Even in the projects where I'm the only ...


+
+"Even in the projects where I'm the only person, there are at least three people involved: past me, present me, and future me." - Quote from #software #programming
+
+liw.fi/40/#index1h1
+
+

Connecting an #UPS to my #FreeBSD cluster ...


+
+Connecting an #UPS to my #FreeBSD cluster in my #homelab, protecting it from power cuts!
+
+foo.zone/gemfeed/2025-02-01-f3s-kubernetes-with-freebsd-part-3.gmi (Gemini)
+foo.zone/gemfeed/2025-02-01-f3s-kubernetes-with-freebsd-part-3.html
+
+

So, the Co-founder and CTO of honeycomb.io and ...


+
+So, the Co-founder and CTO of honeycomb.io and author of the book Observability Engineering always hated observability. And Distinguished Software Engineer and The Pragmatic Engineer host can't pronounce the word Observability. :-) No, jokes aside, I liked this podcast episode of The Pragmatic Engineer: Observability: the present and future, with Charity Majors #sre #observability
+
+newsletter.pragmaticengineer.com/p/observability-the-present-and-future
+
+

February 2025


+
+

I don't know about you, but at work, I usually ...


+
+I don't know about you, but at work, I usually deal with complex setups involving thousands of servers and work in a complex hybrid microservices-based environment (cloud and on-prem), where homelabbing (as simple as described in my blog post) is really relaxing and recreative. So, I was homelabbing a bit again, securing my #FreeBSD cluster from power cuts. #UPS #recreative
+
+foo.zone/gemfeed/2025-02-01-f3s-kubernetes-with-freebsd-part-3.gmi (Gemini)
+foo.zone/gemfeed/2025-02-01-f3s-kubernetes-with-freebsd-part-3.html
+
+

Great proposal (got accepted by the Goteam) for ...


+
+Great proposal (got accepted by the Goteam) for safer file system open functions #golang
+
+github.com/golang/go/issues/67002
+
+

My Gemtexter has only 1320 LOC.... The Biggest ...


+
+My Gemtexter has only 1320 LOC.... The Biggest Shell Programs in the World are huuuge... #shell #sh
+
+github.com/oils-for-unix/oils/wiki/The-Biggest-Shell-Programs-in-the-World
+
+

Against /tmp - He is making a point #unix ...


+
+Against /tmp - He is making a point #unix #linux #bsd #filesystem via @wallabagapp
+
+dotat.at/@/2024-10-22-tmp.html
+
+

Random Weird Things Part 2: #blog ...


+
+Random Weird Things Part 2: #blog #computing
+
+foo.zone/gemfeed/2025-02-08-random-weird-things-ii.gmi (Gemini)
+foo.zone/gemfeed/2025-02-08-random-weird-things-ii.html
+
+

As a former #Pebble user and fan, thats ...


+
+As a former #Pebble user and fan, thats aweaome news. PebbleOS is now open source and there will aoon be a new watch. I don't know about you, but I will be the first getting one :-) #foss
+
+ericmigi.com/blog/why-were-bringing-pebble-back
+
+

I think I am slowly getting the point of Cue. ...


+
+I think I am slowly getting the point of Cue. For example, it can replace both a JSON file and a JSON Schema. Furthermore, you can convert it from and into different formats (Cue, JSON, YAML, Go data types, ...), and you can nicely embed this into a Go project as well. #cue #cuelang #golang #configuration
+
+cuelang.org
+
+

Jonathan's reflection of 10 years of ...


+
+Jonathan's reflection of 10 years of programming!
+
+jonathan-frere.com/posts/10-years-of-programming/
+
+

Really enjoyed reading this. Easily digestible ...


+
+Really enjoyed reading this. Easily digestible summary of what's new in Go 1.24. #golang
+
+antonz.org/go-1-24/
+
+

Some great advice from 40 years of experience ...


+
+Some great advice from 40 years of experience as a software developer. #software #development
+
+liw.fi/40/#index1h1
+
+

I enjoyed this talk, some recipes I knew ...


+
+I enjoyed this talk, some recipes I knew already, others were new to me. The "line of sight" is my favourite, which I always tend to follow. I also liked the example where the speaker simplified a "complex" nested functions into two not-nested-if-statements. #golang
+
+www.youtube.com/watch?v=zdKHq9Xo4OY&list=WL&index=5
+
+

A way of how to add the version info to the Go ...


+
+A way of how to add the version info to the Go binary. ... I personally just hardcode the version number in version.go and update it there manually for each release. But with Go 1.24, I will try embedding it! #golang
+
+jerrynsh.com/3-easy-ways-to-add-version-flag-in-go/
+
+

In other words, using t.Parallel() for ...


+
+In other words, using t.Parallel() for lightweight unit tests will likely make them slower.... #golang
+
+threedots.tech/post/go-test-parallelism/
+
+

Neat little blog post, showcasing various ...


+
+Neat little blog post, showcasing various methods unsed for generic programming before of the introduction of generics. Only reflection wasn't listed. #golang
+
+bitfieldconsulting.com/posts/generics
+
+

The smallest thing in Go #golang ...


+
+The smallest thing in Go #golang
+
+bitfieldconsulting.com/posts/iota
+
+

Fun with defer in #golang, I did't know, that ...


+
+Fun with defer in #golang, I did't know, that a defer object can either be heap or stack allocated. And there are some rules for inlining, too.
+
+victoriametrics.com/blog/defer-in-go/
+
+

What I like about Go is that it is still ...


+
+What I like about Go is that it is still possible to understand what's going on under the hood, whereas in JVM-based languages (for example) or dynamic languages, there are too many optimizations and abstractions. However, you don't need to know too much about how it works under the hood in Go (like memory management in C). It's just the fact that you can—you have a choice. #golang
+
+blog.devtrovert.com/p/goroutine-scheduler-revealed-youll
+
+

March 2025


+
+

Television has somewhat transformed how I work ...


+
+Television has somewhat transformed how I work in the shell on a day-to-day basis. It is especially useful for me in navigating all the local Git repositories on my laptop. I have bound Ctrl+G in my shell for that now. #television #tv #tool #shell
+
+github.com/alexpasmantier/television
+
+

Once in a while, I like to read a book about a ...


+
+Once in a while, I like to read a book about a programming language I have been using for a while to find new tricks or to refresh and sharpen my knowledge about it. I just finished reading "Programming Ruby 3.3," and I must say this is my favorite Ruby book now. What makes this one so special is that it is quite recent and covers all the new features. #ruby #programming #coding
+
+pragprog.com/titles/ruby5/programming-ruby-3-3-5th-edition/
+
+

As you may have noticed, I like to share on ...


+
+As you may have noticed, I like to share on Mastodon and LinkedIn all the technical things I find interesting, and this blog post is technically all about that. Having said that, I love these tiny side projects. They are so relaxing to work on! #gos #golang #tool #programming #fun
+
+foo.zone/gemfeed/2025-03-05-sharing-on-social-media-with-gos.gmi (Gemini)
+foo.zone/gemfeed/2025-03-05-sharing-on-social-media-with-gos.html
+
+

Personally, I think AI (LLMs) are pretty ...


+
+Personally, I think AI (LLMs) are pretty useful. But there's really some Hype around that. However, AI is about to stay - its not all hype
+
+unixdigest.com/articles/i-passionately-hate-hype-especially-the-ai-hype.html
+
+

Type aliases in #golang, soon also work with ...


+
+Type aliases in #golang, soon also work with generics. It's an interesting feature, useful for refactorings and simplifications
+
+go.dev/blog/alias-names
+
+

#Perl, my "first love" of programming ...


+
+#Perl, my "first love" of programming languages. Still there, still use it here and then (but not as my primary language at the moment). And others do so as well, apparently. Which makes me happy! :-)
+
+dev.to/fa5tworm/why-perl-remains-indis..-..e-of-modern-programming-languages-2io0
+
+

I guess there are valid reasons for phttpdget, ...


+
+I guess there are valid reasons for phttpdget, which I also don't know about? Maybe complexity and/or licensing of other tools. #FreeBSD
+
+l33t.codes/2024/12/05/Updating-FreeBSD-and-Re-Inventing-the-Wheel/
+
+

This is one of the reasons why I like ...


+
+This is one of the reasons why I like terminal-based applications so much—they are usually more lightweight than GUI-based ones (and also more flexible).
+
+www.arp242.net/stupid-light.html
+
+

Advanced Concurrency Patterns with #Golang ...


+
+Advanced Concurrency Patterns with #Golang
+
+blogtitle.github.io/go-advanced-concurrency-patterns-part-1/
+
+

#SQLite was designed as an #TCL extension. ...


+
+#SQLite was designed as an #TCL extension. There are ~trillion SQLite databases in active use. SQLite heavily relies on #TCL: C code generation via mksqlite3c.tcl, C code isn't edited directly by the SQLite developers, and for testing , and for doc generation). The devs use a custom editor written in Tcl/Tk called "e" to edit the source! There's a custom versioning system Fossil, a custom chat-room written in Tcl/Tk!
+
+www.tcl-lang.org/community/tcl2017/assets/talk93/Paper.html
+
+

Git provides automatic rendering of Markdown ...


+
+Git provides automatic rendering of Markdown files, including README.md, in a repository’s root directory" .... so much junk now in LLM powered search engines.... #llm #ai
+
+

These are some neat little Go tips. Linters ...


+
+These are some neat little Go tips. Linters already tell you when you silently omit a function return value, though. The slice filter without allocation trick is nice and simple. And I agree that switch statements are preferable to if-else statements. #golang
+
+blog.devtrovert.com/p/go-ep5-avoid-contextbackground-make
+
+

This is a great introductory blog post about ...


+
+This is a great introductory blog post about the Helix modal editor. It's also been my first choice for over a year now. I am really looking forward to the Steel plugin system, though. I don't think I need a lot of plugins, but one or two would certainly be on my wish list. #HelixEditor #Helix
+
+felix-knorr.net/posts/2025-03-16-helix-review.html
+
+

Maps in Go under the hood #golang ...


+
+Maps in Go under the hood #golang
+
+victoriametrics.com/blog/go-map/
+
+

I found that working on multiple side projects ...


+
+I found that working on multiple side projects concurrently is better than concentrating on just one. This seems inefficient, but if you to lose motivation, you can temporarily switch to another one with full élan. Remember to stop starting and start finishing. This doesn't mean you should be working on 10+ side projects concurrently! Select your projects and commit to finishing them before starting the next thing. For example, my current limit of concurrent side projects is around five.
+
+

I have been in incidents. Understandably, ...


+
+I have been in incidents. Understandably, everyone wants the issue to be resolved as quickly and others want to know how long TTR will be. IMHO, providing no estimates at all is no solution either. So maybe give a rough estimate but clearly communicate that the estimate is rough and that X, Y, and Z can interfere, meaning there is a chance it will take longer to resolve the incident. Just my thought. What's yours?
+
+firehydrant.com/blog/hot-take-dont-provide-incident-resolution-estimates/
+
+

I dont understand what it is. Certificates are ...


+
+I dont understand what it is. Certificates are so easy to monitor but still, expirations cause so many incidents. #sre
+
+securityboulevard.com/2024/10/dont-let..-..time-prevent-outages-with-a-smart-clm/
+
+

Don't just blindly trust LLMs. I recently ...


+
+Don't just blindly trust LLMs. I recently trusted an LLM, spent 1 hour debugging, and ultimately had to verify my assumption about fcntl behavior regarding inherited file descriptors in child processes manually with a C program, as the manual page wasn't clear to me. I could have done that immediately and I would have been done within 10 minutes. #productivity #loss #llm #progr