Skip to content

Goodbye IRC

Nach sehr vielen Jahren habe ich mich jetzt entschlossen, dem Internet Relay Chat endgültig den Rücken zu kehren. Nein! Doch! Oh!

In den letzten Jahren habe ich mit The Lounge einen eigenen Bouncer betrieben. Das hat wahnsinnig gut funktioniert, aber gebraucht habe ich es selten. Sehr selten.

Und das ist auch der Grund, weshalb ich mich zurück ziehe. Sollte ich noch einmal IRC benötigen, kann ich via Matrix und der entsprechenden IRC Bridge auch wieder teilnehmen. Vermutlich werde ich es aber nicht in Anspruch nehmen müssen.

Linkdump 48/2021

In dieser Woche gibt es drei Artikel in englischer Sprache und einen in deutsch. Ich hoffe, Ihr kommt damit zurecht und freue mich auf Euer Feedback.

Useful insight into organizing with time blocking: How I organize my week.

Dieser Trick hilft euch, endlich mit dem Prokrastinieren aufzuhören, von einer fünf-Sekunden-Regel hatte ich vor diesem Artikel noch nie etwas gehört.

This is a little summary of an interesting book, I did not know before, but I will read it for sure. Your time management won't work until you realize how little time you have.

How to Transition to Become a DevOps Engineer is a good introduction in skills needed to join the DevOps movement.

Bessere Shell-Skripte

Shell-Skripte sind gegenüber anderen Programmiersprachen natürlich nicht das "Non-plus-ultra", aber sie sind für Ablaufsteuerungen - dafür sind sie gemacht - eine gute Wahl. Für alles, was grösser ist, empfehle ich eine "richtige Programmiersprache". Ich bin als Systemadministrator ein grosser Fan von Python und - schon länger nicht mehr genutzt - Perl, aber auch Sprachen wie Raku, Ruby oder irgendetwas mit Compiler sind natürlich gute Alternativen.

Ich beziehe mich im Folgenden auf die Bash, weil das die Shell ist, die ich täglich auf verschiedenen Systemen und Architekturen benutze.

Tipp 1:

Schreibt in den Shebang #! zu Beginn des Skriptes genau die Skriptsprache mit der Ihr auch getestet habt und nicht - weil alle das machen - /bin/sh. Auf Debian basierten Systemen ist /bin/sh ein Link auf dash, bei Alpine ist es ein Link auf Busybox, auf Red Hat basierten Systemen ein Link auf bash.

An dieser Stelle möchte ich gerne noch auf diesen alten Artikel hinweisen.

Tipp 2:

Skripte laufen auch im Falle eines Fehlers weiter. Ich halte das für ein blödes Verhalten, was sehr häufig zu Fehlern führt. Glücklicherweise kann man das Verhalten abstellen.

Entweder man ruft die Shell mit -e auf, setzt den Shebang entsprechend oder schreibt set -e an den Anfang des Skriptes oder vor die Zeilen für die das Setting gelten soll. Mit set +e kann man wieder das alte Verhalten herstellen.

Meine Empfehlung ist, die Langform set -o errexit zu verwenden, das ist deutlich lesbarer. (Altes Verhalten kann man mit set +o errexit wieder herstellen).

Shellzeilen gelten als fehlerhaft, wenn der exit-Code des letzten Kommandos der Zeile ungleich 0 (null) ist. Das bedeutet unter anderem, dass man den Exitcode einer einzelnen Zeile durch Hinzufügen von || true auf "nicht fehlerhaft" ändern kann.

Tipp 3:

Wie im letzten Tipp beschrieben, ist das letzte ausgeführte Kommando einer Zeile ausschlaggebend dafür, ob eine Zeile mit oder ohne Fehlercode beendet wird.

Der Eintrag set -o pipefail sorgt dafür, dass eine Zeile als fehlerhaft "gesehen" wird, wenn auch nur ein Kommando der über Pipes vernetzten Kommandos einer Zeile fehlschlägt.

Tipp 4:

Nicht gesetzte oder "leere" Variablen sind häufig ein Problem.

Um eine nicht gesetzte Variable mit einem Fehler zu quittieren, kann man das Kommando set -o nounset oder set -u verwenden.

Tipp 5:

Es ist generell eine gute Idee, alle Variablen mit doppelten Anführungszeichen zu umgeben, ganz besonders dann, wenn es um Dateien geht. Auch, wenn man selber keine Dateien mit Leerzeichen (oder anderen "Internal Field Separators" (IFS)) erstellt, heisst es nicht, dass man nicht auf solche treffen kann.

Nachtrag:

Christoph hat in diesem Kommentar zur recht darauf hingewiesen, dass es besser ist /usr/bin/env bash zu verwenden, das benutzt die erste Bash, die der Benutzer im Pfad hat und funktioniert auch auf Systemen, auf denen die Bash in einem anderem Pfad liegt als /bin/bash.

Zusammenfassung:

Meine Erfahrung ist, dass man mit den fünf Tipps rund 80% aller Probleme mit Shellskripten umschifft bzw. Skripte mit Fehlern rechtzeitig abbricht.

#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail

# Und Variablen immer mit doppelten Anführungszeichen verwenden.

echo "${Variable}"

Es gibt noch viele weitere Tipps, aber das sind meiner Ansicht nach die wichtigsten.

Linkdump 47/2021

Da ist er, der neue Linkdump. Dieses Mal tatsächlich mit drei Links aus der gleichen Quelle und vom gleichen Autoren, das ist meiner Meinung nach Premiere. Auf Euer Feedback bin ich - wie immer - sehr gespannt.

Ich teile die Meinung, auch, wenn ich vermute, dass es Untergruppen gibt, mich selber finde ich in der ersten und dritten: Spannungsfelder in der Linux Community.

Your syntax highlighter is wrong, I totally agree with this opinion - we are so used to syntax highlighting that we never question it.

Man kann noch einige Punkte ergänzen, letztlich stützen die neuen Formate meine These, dass die Wahl der Linuxdistribution immer weniger wichtig wird, Flatpak / Snap vs. Paketverwaltung.

Methoden für eine tägliche Routine, mit Journaling habe ich mich in den letzten Wochen ausführlicher beschäftigt und ich finde der Artikel ist eine gute Einführung, wie hilfreich das sein kann.

Ich musste sehr lachen, jeder Hundebesitzer könnte einen solchen Artikel schreiben, aber nur wenige mit so viel Humor. Danke! Ein paar Gedanken über meinen Hund.

Viele Distributionen nutzen nur bei wirklicher Vielfalt etwas, mir gefällt der Begriff "vermeintliche Vielfalt" sehr gut, weil ich ihn für sehr passend halte.

systemd user services

linux

Bei uns in der Firma ist es so, dass es auf virtuellen Maschinen eine strikte Trennung der Plattform von den Applikationen gibt. Wir sind für die Plattform verantwortlich und Applikationsteams für ihre Anwendungen.

Damit die Applikationsteams in der Lage sind, Ihre Dienste via systemd zu verwalten (Start, Stopp, Logs anschauen, etc.) erstellen wir systemd-Services und berechtigen die Applikationsteams mit entsprechenden sudo-Regeln.

Allerdings bietet systemd Benutzern die Möglichkeit, Dienste unter eigener Regie zu verwalten. Das geht vom Anlegen des Dienstes bis zu den Dingen, für die es vorher sudo-Regeln brauchte.

Einrichtung

Um systemd-User-Services für einen User zu aktivieren, muss im Hintergrund ein Prozess gestartet werden, der die Dienste verwaltet. Tut man das nicht, werden Dienste des Users bei der Abmeldung vom System gestoppt.

# loginctl enable-linger <user>

Im Homeverzeichnis des Users liegen die Servicedefinitionen unter ~/.config/systemd/user/NAME.service.

Im Service selber muss braucht es die folgenden Zeilen, damit die Dienste auch automatisch gestartet werden können. Andere Einstellungen sind auch möglich, aber ich habe herausgefunden, dass es wenigstens den einen Eintrag braucht.

[Install]
WantedBy=default.target

Der User muss in seine .bashrc die folgende Variable setzen, wenn sie nicht schon durch das System zur Verfügung gestellt wird.

# ~/.bashrc

export XDG_RUNTIME_DIR=/run/user/$(id -u)

Verwaltung der Dienste

$ systemctl --user enable NAME.service
$ systemctl --user start NAME.service
$ systemctl --user stop NAME.service
...
$ journalctl --user -u NAME.service
...

Weiterführende Links:

Linkdump 46/2021

Nachdem der Linkdump in der letzten Woche aufgrund eines familiären Notfalls ausgefallen ist, habe ich in dieser Woche wieder mehr Links. Auf Euer Feedback bin ich sehr gespannt.

Felix and I have pretty similar thoughts on that topic, Reading Habits.

Von Aussichtslosigkeit zu Dankbarkeit, spannende und sehr bewegende Geschichte, ein guter Grund, mit dem Journaling zu beginnen.

Pretty basic introduction into using Bash, Getting Around Your Computer Like a Pro.

Five Books That Can Help You Become a Better Programmer, I like that approach and the choices.

Eat your own dogfood, be responsible and show ownership - and ask your ops people how they are doing it. What can developers learn from being on call?.

Diese Sache ist im Jobinterview entscheidender als dein Lebenslauf, es folgt dem alten Grundsatz, dass man nach der Haltung (oder Einstellung) Menschen einstellen und die Fähigkeiten trainieren sollte ("Hire for attitude, train for skill").

Changelog und Polywork

In meinem Kopf ist schon lange herumgespukt, ein Sammelbecken für meine Inhalte auf verschiedenen Plattformen und in verschiedenen Formaten aufzubauen. Die verschiedenen Inhalte sind Bücher, Blog- und andere Artikel, Podcasts, Videos, Vorträge, Workshops, ... Ihr versteht, worauf das hinausläuft. Hintergrund des Gedankens ist, dass nicht alles bei mir im Blog oder auf meinen Plattformen passiert und so eine konsolidierte Sicht relativ schwierig ist.

In der TILpod-Episode 9 hatten wir Michael "dnsmichi" Friedrich zu Gast, der mich auf Polywork hinwies, was genau dafür gedacht ist.

Polywork ist schön gemacht und gut umgesetzt. Die neuen Features, die dort eingebaut werden, ergeben alle Sinn und treiben genau dieses Modell nach vorne. Es macht Spass, sich dort mit anderen "Creatern" zu vernetzen.

Die Profile von dnsmichi und ddeimeke findet Ihr unter den entsprechenden Links.

Aber: Mir leuchtet das Geschäftsmodell noch nicht ein, daher weiss ich nicht, wie lange der Dienst Bestand hat. Das weiss man ja irgendwie nie.

Dieser Gedanke führte mich dann dazu, dass ich ein eigenes Changelog aufgebaut habe, weil ich mich eh schon einmal mit Hugo beschäftigen wollte.

Beide Verfahren haben ihre ganz eigenen Vor- und Nachteile und die Pflege der Inhalte auf den beiden Plattformen bedeutet auch vertretbaren Mehraufwand. Menschen, die alles in alle sozialen Netzwerke teilen, haben einen solchen Mehraufwand ja auch, es sei denn, es passiert automatisiert (so mache ich es bei Mastodon).

Ich bin auf Eure Kommentare gespannt.

LanguageTool

Schon seit längerem setze ich LanguageTool zur Grammatik- und Rechtschreibprüfung ein und es hat mir mehr als einmal geholfen, halbwegs korrekte Texte zu verfassen.

Das Tool besteht aus einem Plugin für gängige Software, wie beispielsweise Webbrowser und Textverarbeitung und einer Serverkomponente, die man selber hosten kann oder die in "der Cloud" (tm) liegt. Momentan schreibe ich zu wenig, als dass sich ein Premium-Account für mich lohnen würde, allerdings bietet dieser zusätzliche Features.

Bei mir kommen beispielsweise die Plugins für Firefox und LibreOffice zum Einsatz. Für LaTeX setze ich das Visual Studio Code Plugin LanguageTool Extension und die dazu passenden Sprachen Deutsch und Englisch ein. Achtung: der Autor der VSCode-Extensions ist leider verstorben und daher werden sie nicht weiterentwickelt. Momentan funktionieren sie aber noch sehr gut. Für Thunderbird gibt es übrigens auch ein Plugin, was ich allerdings nicht getestet habe, weil ich kein Thunderbird benutze.

Wenn man den Server lokal betreiben will - das mache ich auf allen meinen Linux-Clients - benötigt man ein installiertes Java und den LanguageTool embedded HTTP Server, den man sich unter diesem Link herunterladen kann.

Ein aktuelles Java, kann man sich von der Webseite des OpenJDK-Projektes herunterladen.

Installation Java.

cd ~/Downloads

curl -LO https://download.java.net/java/GA/jdk17.0.1/2a2082e5a09d4267845be086888add4f/12/GPL/openjdk-17.0.1_linux-x64_bin.tar.gz

tar xzf openjdk-17.0.1_linux-x64_bin.tar.gz

ln -s jdk-17.0.1 java

Anmerkung: Wenn ein aktuelleres oder anderes Java benutzt werden soll, muss man einfach den Link umsetzen.

Funktionstest.

export JAVA_HOME=~/Downloads/java

export PATH=${JAVA_HOME}/bin:${PATH}

java -version
openjdk version "17.0.1" 2021-10-19
OpenJDK Runtime Environment (build 17.0.1+12-39)
OpenJDK 64-Bit Server VM (build 17.0.1+12-39, mixed mode, sharing)

Installation LanguageTool-Server.

cd ~/Downloads

curl -LO https://languagetool.org/download/LanguageTool-5.5.zip

unzip LanguageTool-5.5.zip

ln -s LanguageTool-5.5 LanguageTool

Sollte die aktuelle Version mit einem Plugin oder einer Extension nicht funktionieren, so findet man vorhergehende Versionen auf der Download-Seite.

Funktionstest.

Für den Funktionstest würde ich gleich ein Start-Skript - hier ~/Downloads/LanguageTool.bash - schreiben, dass man später auch für das automatische Starten des Servers via systemd verwenden kann.

#!/bin/bash
set -o errexit
set -o nounset
set -o pipefail

export JAVA_HOME=~/Downloads/java

cd ~/Downloads/LanguageTool

${JAVA_HOME}/bin/java -cp languagetool-server.jar \
    org.languagetool.server.HTTPServer --port 8081 --allow-origin "*"

Getestet wird mit dem folgenden curl-Aufruf, der JSON zurückliefert.

curl --noproxy localhost -d "language=en-US" -d "text=a simple test" http://localhost:8081/v2/check

{"software":{"name":"LanguageTool","version":"5.5","buildDate":"2021-10-02 12:33:00 +0000","apiVersion":1,"premium":false,"premiumHint":"You might be missing errors only the Premium version can find. Contact us at support<at>languagetoolplus.com.","status":""},"warnings":{"incompleteResults":false},"language":{"name":"English (US)","code":"en-US","detectedLanguage":{"name":"French","code":"fr","confidence":0.815771}},"matches":[{"message":"This sentence does not start with an uppercase letter.","shortMessage":"","replacements":[{"value":"A"}],"offset":0,"length":1,"context":{"text":"a simple test","offset":0,"length":1},"sentence":"a simple test","type":{"typeName":"Other"},"rule":{"id":"UPPERCASE_SENTENCE_START","description":"Checks that a sentence starts with an uppercase letter","issueType":"typographical","category":{"id":"CASING","name":"Capitalization"}},"ignoreForIncompleteSentence":true,"contextForSureMatch":-1}]}

Automatisches Starten mit systemd.

Erstellen der Datei /etc/systemd/system/LanguageTool.service mit folgendem Inhalt ("EuerUser" und "EuerHome" müssen ent1sprechend ersetzt werden). Zu systemd-user-services mache ich einmal einen separaten Artikel.

[Unit]
Description=LanguageTool
Wants=network.target
After=network.target

[Service]
User=
Type=simple
Restart=on-failure
RestartSec=10s
ExecStart=/Downloads/LanguageTool.bash
WorkingDirectory=/Downloads/LanguageTool

[Install]
WantedBy=multi-user.target

Aktivieren des Services.

sudo systemctl daemon-reload
sudo systemctl enable --now LanguageTool

sudo systemctl status LanguageTool
Viel Spass!

Linkdump 44/2021

Auch, wenn es sonst deutlich ruhiger im Blog geworden ist, schaffe ich es glücklicherweise regelmässig (fast) jede Woche, einen Linkdump zu präsentieren. Darüber bin ich ganz froh.

Ähnlich wie Gerrit mag ich diese Artikel, weil man immer gute Tipps und Hinweise bekommen kann: Mein Linux-Desktop.

Nach 5 Jahren, raus aus dem Homeoffice, eine Riesenumstellung.

Das muss ich für mich mal wieder machen, wobei ich immer stärker zu der Überzeugung komme, dass ich keine PGP-/GPG-Keys mehr benötige, Web Key Directory (WKD) einrichten.

Wie Sie Ihren inneren Schweinehund überwinden und richtig durchstarten, auch hier finden sich ein oder zwei sehr gute Hinweise (der Artikel ist schon älter).

Zeiterfassung

Die Hauptmotivation, mich mit Zeiterfassung herumzuschlagen ist, dass ich gerne wissen möchte, wo meine Zeit bleibt.

Dabei gibt es im Grossen und Ganzen zwei Möglichkeiten.

Jede Zeit kann nur einmal erfasst werden, weil die Zeit auch nur einmal verstreicht. Ein Tag hat 24 Stunden und man kann in diesen 24 Stunden nicht zweimal das gleiche Zeitintervall für unterschiedliche Dinge "buchen".

Die andere Möglichkeit wäre, dass man Rahmenzeit erfasst und innerhalb dieser Rahmenzeit trotzdem noch Zeit für andere Dinge buchen kann. Das würde aber auch bedeuten, dass eine Zeiterfassungssoftware, Möglichkeiten bieten muss, die gleiche Zeit mehrfach zu erfassen.

Warum das überhaupt eine Rolle spielt, zeigt ein ganz einfaches Beispiel. Ich möchte gerne wissen, wie viel Zeit ich mit "Transport" verbringe, wie beispielsweise das Pendeln zur Arbeit. Ich möchte aber auch gerne wissen, wie viel Zeit ich etwas für mich selber mache, wie beispielsweise lesen. Vermutlich leuchtet direkt ein, dass ich während des Pendelns auch lese.

Mit Variante eins würde die Zeit-Buchung vielleicht wie folgt aussehen (reales Beispiel):

05:45-06:00 Transport public
06:00-06:15 Transport public Dirk reading
06:15-06:45 Transport public

Die Schlagwörter in Grossbuchstaben sind Kategorien und die klein geschriebenen dienen zur "Verfeinerung".

Es ist relativ leicht einsehbar, dass jedes Zeitfenster nur einmal gebucht wurde, einzig die Schlagwörter ("Tags") geben Aufschluss darüber, was mit der Zeit angefangen wurde.

Allerdings würde eine Auswertung eine Stunde "Transport public" ergeben und eine viertel Stunde "Dirk reading". Genauer würde die Auswertung sogar je eine Stunde "Transport" und "public" und je eine viertel Stunde "Dirk" und "reading".

Damit würde eine einzige Zeitstunde mit Inhalt von 1:15 Stunden bzw. sogar 2:30 Stunden gebucht sein.

Bei der Erfassung der Zeit hätte ich zwar nur jedes Zeitintervall einmal erfasst, aber die Auswertung würde mir vier eine Stunde Zeit, 2:30 Stunden "Tätigkeiten" anzeigen.

Einige Zeit lang habe ich Timewarrior benutzt, aber nur um grobe Zeitfenster zu erfassen, nicht für Tätigkeiten.

In einer zweiten Variante könnte man wie folgt die Zeit erfassen (gleiches Beispiel wie oben):

05:45-06:45 Transport public
06:00-06:15 Dirk reading

Die Auswertung zeigt das gleiche Resultat wie oben, es gibt aber zwei entscheidende Unterschiede:

  1. Der Aufwand für die Erfassung ist kleiner. Ich muss nur zwei Intervalle erfassen und nicht drei.
  2. Eher akademischer Natur ist, dass ich im ersten Fall eine Stunde erfasst habe und in der zweiten Variante 1:15 Stunden.

Mit der Umstellung auf Todoist habe ich gemerkt wie wichtig es ist, die Aufgabenverwaltung überall verfügbar zu haben.

Das, was Todoist für Aufgaben ist, scheint Clockify für Zeiterfassung zu sein.

Ich gebe dem ganzen mal einen Versuch und schaue, was dabei herauskommt.

Was mir nicht passt, ist, dass die Daten auf fremden Servern liegen. Was ich auf der FLOSS-Seite vermisse, sind Dienste, die Clients für alle Betriebssysteme mitbringen.

Linkdump 43/2021

Und wieder ist eine Woche rum.

Viel Spass mit dem Linkdump. Auf Euer Feedback bin ich gespannt.

Ob Menschen mit diesen Eigenschaften aussergewöhnlich sind, weiss ich nicht, aber sie sind in jedem Fall sehr hilfreich. Einem ehemaligen FBI-Agenten zufolge zeichnen diese fünf Eigenschaften außergewöhnliche Menschen aus.

The PARA Method, a really interesting system to organize (not only) digital information.

In my opinion this is a good and helpfull introduction to journalling, How Journaling Puts Leadership in Action.

Team vor Technik wird in Projekten sehr häufig behauptet, aber leider auch sehr selten gelebt.

Linkdump 42/2021

Willkommen zum ersten Linkdump nach meinem Urlaub, ich habe dieses Mal nicht so viele Fundstücke wie sonst.

Wer sich das schon einmal gefragt hat, findet ein paar Antworten im verlinkten Artikel (oder hört die aktuelle Episode von BuzzZoom): Was ist Agilität?.

Arbeiten im Homeoffice nicht uneingeschränkt positiv, viele Menschen verstehen nicht, dass es nicht eine Lösung für alle Menschen und Firmen gibt. Manche Menschen schaffen es gut im Homeoffice, wenn die Firmenkultur es zulässt und andere halt nicht.

Nice summary of tool which help you to find out which hardware you are on. Linux commands to display your hardware information.

Mein Covid-19 Star

Für mich ist das die beste Geschichte, die in der Covid-19-Krise passiert ist.

Ja, es ist viel Schlimmes passiert, auch für mich privat, aber diese Story zaubert mir immer ein Lächeln auf das Gesicht.

Nandi Bushell, ein zehnjähriges Mädchen, fordert Dave Grohl, den Gründer der Foo Fighters zu einem Drum Battle heraus und der macht das mit.

Die ganze Geschichte spielt sich auf YouTube ab, viel Spass!

Linkdump 38/2021

Das sind die Links zu Artikeln, die ich in den letzten zwei Wochen lesenswert fand. Viel Spass dabei.

OKRs sind eine interessante Alternative zu klassischen Zieldefinitionen, OKR im Zeichen der Zeit.

Augen auf bei der Branchenwahl, ja, es gibt schon viele Gemeinsamkeiten, wenn man in der gleichen Branche unterwegs ist (allerdings kommt es auch darauf, in welcher Funktion).

Interesting point of view, Practice the 4 Percent Rule to Get Exactly What You Want.

How to customize the Linux top command, I like to find out more about standard tools.

Die vergessene Generation

In dieser Woche gibt es keinen Linkdump.

In den letzten Tagen habe ich das Buch Die vergessene Generation von Sabine Bode gelesen (hier gibt es den Wikipedia-Artikel dazu).

Im Buch geht es um Menschen, die in den Jahren 1930 bis 1945 geboren wurden und vor allem über die Prägung, die die Menschen durch den Krieg bzw. die Zeit danach erfahren haben.

Leider kann ich meine Eltern nicht mehr dazu befragen, aber das Buch war in vielen Beziehungen ein Augenöffner und hat mir viele Erklärungsansätze über ihr Verhalten, ihr Pflichtbewusstsein und auch ihren Emottionen gegeben. Ich habe sie in einigen Fallbeispielen wiedererkannt.

Daher möchte ich das Buch jedem empfehlen, der noch Verwandte oder Bekannte mit einem passenden Geburtsjahr hat. Nutzt die Chance so lange Ihr noch mit den Menschen reden könnt oder nutzt die Chance im Nachhinein für ein besseres Verständnis.

Das Buch und die Implikationen haben mich wirklich berührt.