Blog

Privatrüsseltier

Schon seit vielen Jahren beklagen zunehmend griesgrämige Männer das Ende des freien Internets und beschwören seine Wiedergeburt aus der Asche kommerzieller Plattformen (wie im programmatischen Essay Protocols, not Platforms); Cory Doctorow zeichnet sich bei diesem Thema durch besondere Beharrlichkeit (und eine gewisse Selbstironie bei der Wahl seines Mediums) aus. Diese faszinierende Subkultur hat während der monatelangen Übernahme von Twitter erheblich an Zulauf gewonnen, und nach dem Abschluss der Transaktion (the bird is freed) lässt der neue Besitzer keine Gelegenheit aus, ihre Kassandra-Rufe umgehend zu bestätigen, wobei seine absolute Macht über die Plattform von finanziellen Zwängen begrenzt wird. Auch sind die Ideen, Zugpferde für ihre Rolle zahlen zu lassen (und mit ihnen öffentlich zu feilschen), die Belegschaft zur Steigerung ihrer Motivation in Angst und Schrecken zu versetzen oder Werbekunden zu bedrohen, vielleicht nicht ganz zu Ende gedacht (selbst wenn findige Geschäftsleute die darin enthaltene business opportunity schnell erkannt haben).

Wohlwollende Nutzerinnen begrüßen Mr. Musk dennoch sehr herzlich (Welcome to Hell, Elon), wünschen ihm Erfolg oder planen jedenfalls keinen Wechsel auf andere Plattformen (Why would I leave Twitter? It's like living in NY and not taking the subway. Sure it's dirty and smells bad, but it's how you get places.), während rechte Trolle die Hölle schon mal anheizen.

Viele andere Menschen suchen nach einer Mikroblogging-Alternative und erinnern sich ihrer seit Jahren verwaisten Mastodon-Accounts oder registrieren sich (in Massen) auf einer der größeren Instanzen. Sie genießen oder bestaunen die ungewohnte Atmosphäre (What I really enjoy about this space is how there are so few crypto bros.) und das abweichende, gesündere, überlegene feature set (Bookmarks!). Die unterbezahlten Admins der großen Instanzen ringen mit dem Ansturm und werfen zusätzliche Hardware in die Flut. Während Hugh Rundle den aktuellen eternal september als Invasion in eine sensible Subkultur empfindet, lehnt Kathrin Passig solche Metaphern – Ansturm, Flut, Invasion – ab. Bei aller Sympathie für eine reflektierte Sprachverwendung – stark erhöhtes Interesse und rasch wachsende Nutzerzahlen werden der Atmosphäre auf vielen Instanzen nicht gerecht.

Es wird sich zeigen, ob Mastodon Twitter als place to be ablösen wird (unwahrscheinlich), oder ob es sich mit einer breiten Nutzerinnenbasis (> 100M) als antivirales Gegenmodell zum zentralisierten Mikroblogging etablieren kann (hoffentlich).

Das alles könnte mir – auf einer praktischen Ebene – relativ egal sein, denn ich nutze Twitter im Wesentlichen als einen (zusätzlichen) Feedreader, in dem neben verschiedenen Medien auch unterhaltsame Einzelpersonen publizieren. Shitstorms nehme ich nur in Ausnahmefällen wahr, weil ich sehr selten Reaktionen auf Tweets beachte, spektakuläre Eilmeldungen verifiziere ich auf zusätzlichen Kanälen, und Tweetbot liefert eine chronologische Timeline ohne Werbung und Trolle. Die aktive Nutzung eines Microblogging-Dienstes verträgt sich – selbst mit einem großzügigen Limit von 500 Zeichen – nicht gut mit meiner Weitschweifigkeit und mangelnden Spontaneität. Selbst der in der Evolutionsbiologie ausgemusterte Name der Plattform (Mastodon as a genus name is obsolete; the valid name is Mammut) ist klanglich eine Zumutung und mit seiner ungalanten Anspielung auf die weibliche Physiognomie völlig aus der Zeit gefallen.

Andererseits. Die Verlockung, als Betreiberin eines (Knotens innerhalb eines) freien sozialen Netzwerks (innerhalb des Fediverse) aufzutreten, ist sehr groß, und mein Server klagt schon länger, dass er sich mit Nginx, Postfix und Dovecot unterfordert fühlt. Schon die erste Verheißung für angehende Mastodon-Admins klingt vielversprechend –

Absolute control over your own voice on the web, not subject to anyone else's rules or whims. Your server is your property, with your rules. It will exist as long as you want it to exist.

– die zweite richtet sich eher an Menschen mit ausgeprägteren sozialen Bedürfnissen als ich –

You are not isolated on your own server. You can follow anyone on any other server, and they can follow you and you can exchange messages just like if you were on the same server.

– während die dritte einen Betrieb ohne potentiell ungehobelte fremde Nutzerinnen in Aussicht stellt:

You can either limit sign-ups to be the only one on the server and run it like personal (micro)blog, maintain an invite-only community for family or friends or run a server anyone can sign up on, it's up to you!

Ich beschließe daher, das social media equivalent of Desktop Linux passend zum YoLD als persönliches Mikroblog aufzusetzen, schließlich möchte ich nicht in dieselbe Falle tappen wie Mr. Musk (Please mind that providing a public internet service involves moderation work and community management, and that such work becomes more complicated the larger your server grows.), Geld in zusätzliche Server/Kerne oder Zeit in die optimale Konfiguration von Sidekiq investieren.

Die fürsorgliche Mastodon-Dokumentation beginnt mit Sicherheitshinweisen und führt sehr geschmeidig durch die Installation von Ruby (on Rails), Node.js, PostgreSQL, einer Reihe von Hilfspaketen und schließlich der Mastodon-Software. Man sollte allerdings nicht von den empfohlenen, etwas veralteten Versionen (Node.js 16, Ruby 3.0.3) abweichen, wenn man nicht Komplikationen zu einem sehr späten Zeitpunkt riskieren möchte.

Zur neuen Subdomain lasse ich mir ein passendes SSL-Zertifikat ausstellen (certbot certonly --nginx -d social.eden.one) und vermenge die bestehende Nginx-Konfiguration mit der bereitgestellten Datei. Nginx stolpert zunächst über unterschiedliche ssl_session_cache-Werte für meine Website und die Mastodon-Instanz, aber der Konflikt lässt sich lösen, indem der Session-Cache im übergeordneten http-Kontext festgelegt wird. Eine weitere Verzögerung ergibt sich durch den Unterschied zwischen SMTPS auf Port 465 und SMTP auf Port 587 mit STARTTLS bzw. den Parameter SMTP_SSL=true in der Konfigurationsdatei .env.production:

Oct 29 19:00:30 eden bundle[838075]: 2022-10-29T19:00:30.636Z pid=838075 tid=isfb WARN: OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: wrong version number

Nach der Behebung dieses Problems und dem Start der Mastodon-Services ist die Instanz offiziell eröffnet. Mastodon übt in /var/log/syslog leise Kritik an meiner Redis-Konfiguration

Oct 30 16:48:36 eden bundle[867373]: WARNING: Your Redis instance will evict Sidekiq data under heavy load. Oct 30 16:48:36 eden bundle[867373]: The 'noeviction' maxmemory policy is recommended (current policy: 'volatile-ttl'). Oct 30 16:48:36 eden bundle[867373]: See: https://github.com/mperham/sidekiq/wiki/Using-Redis#memory

– aber heavy load ist eher nicht zu erwarten: Mit Mastodon nutze ich etwa 8% des verfügbaren RAMs (statt 1%), die CPU-Last liegt unverändert bei knapp 1,5%. Angesichts der reibungslosen Installation blicke ich dem bevorstehenden Upgrade auf Mastodon v4.0 entspannt entgegen.

Als erste Amtshandlung schließe ich die Tore ein wenig (Preferences → Administration → Site settings → Approval required for sign up), aktiviere die 2-Faktor-Authentifizierung für alle Accounts (2) und übernehme die Nutzungsbedingungen von legal.social. Für einen Pedanten wie mich ist es sehr befriedigend, die bestehenden Accounts von mastodon.social und social.tchncs.de umleiten zu können. Die link verification zwischen meinem Mastodon-Profil und meiner Website mit Hilfe des Attributs rel="me" funktioniert nicht, weil Mastodon und Website auf demselben VPS laufen, und aus demselben Grund stützt sich social.eden.one auf die viel bessere implizite Domain-Verifikation:

Because Mastodon can be self-hosted, there is no better way to verify your identity than to host Mastodon on your own domain, which people already trust.

Außerdem installiere ich den begehrten blauen Haken als zusätzliches Emoji (Preferences → Administration → Custom emojis → :verified: → Copy) und benenne mich kostenlos in Jan Eden :verified: um. Mein innerer Fünfzehnjähriger kichert zufrieden über diesen Regelbruch (And whatever you do, don’t use the verified emoji).

Der Fedifinder findet in meinem Twitter-Account insgesamt 8 Gefolgte mit Hinweisen auf Mastodon-Accounts, die ich als CSV-Datei importieren kann, und auch sonst mangelt es nicht an freundlicher Unterstützung beim Einstieg in den Mastodon-Teil des Fediverse. Bei der Auswahl der gefolgten Accounts geht einem kein Algorithmus zur Hand, die Stimmung ist familiärer und vereinzelte Crosspostings stören kaum. Falls Mr. Musk Twitter tatsächlich zu Grunde richtet, habe ich einen bequemen Logenplatz, denn Twitter-bezogene Toots machen einen erheblichen Teil meiner Timeline aus (so wie auch mein Feedreader derzeit voller Twitter-Reflexionen ist).

Vor lauter Aufregung vermassele ich die feierliche Einweihung mit einem #Introduction-Toot und antworte stattdessen auf einen Toot. So viel zu den Vorzügen der Spontaneität.

macOS Ventura y Pobreza funcional

Mit macOS Ventura präsentiert Apple wieder einmal eine neue Variante der Fensterverwaltung:

Managing multiple overlapping windows has been a defining feature of using a Mac since 1984. For decades, it’s been a huge productivity boost to savvy Mac users, since it allows multiple panes of information of arbitrary sizes to be arranged arbitrarily on a user’s screen. But for some users, the Mac’s windowing metaphor has led to confusion and frustration, whether it’s windows covering other windows or hidden or minimized windows being unfindable.

You, an expert Mac user, may be fine with the way things are. But Apple’s got a broader audience to serve with the Mac—there are more Mac users today than ever before, and the Mac installed base just keeps growing—and it’s never really been satisfied with the available window-management tools on the Mac.

I have to admire Apple’s insistence on this topic. Over the decades it’s tried windowshades, a floating application bar, Dock minimization, single-window mode, Exposé, Spaces, Mission Control, Full Screen, and Split View, and while many of those features have been embraced by some Mac users, the company still doesn’t think that it’s cracked it.

So here comes the latest attempt to refine window management on the Mac: Stage Manager, which makes its debut with macOS Ventura (and iPadOS 16, but that’s another story). Stage Manager is best thought of as a way to create arbitrary groups of windows that you can quickly switch between.

Ich neige mit zunehmendem Alter dazu, neumodische Spielereien achselzuckend zu ignorieren, solange mein LaunchBar und app switching wie gewohnt funktionieren. Abgesehen von einer rabiaten Umgestaltung der Systemeinstellungen –

System Preferences was long overdue for a refresh, but System Settings isn’t the redesign we needed. Instead, it’s a clear example of why you can’t just graft iOS or iPadOS design onto macOS and call it quits.

– und der Einführung neuer Bugs glänzt mac OS Ventura in der Paradedisziplin neuer Betriebssystemversionen, der Entfernung hilfreicher (Anwendungen|Funktionen|Optionen). Aktuell betrifft das verborgene Login Items, Datumsformate, Network Locations

System Preferences used to have a Network Locations feature, where you could set up profiles that would change your network settings based on where you were—for example, if you used a fixed IP address on your Ethernet connection at home but wanted to use DHCP at work or if you wanted your computer to use wired Ethernet first at home but prioritize Wi-Fi at work.

I doubt many people will miss this since it’s not as though Ethernet adapters are common on Macs anymore, and you can set different settings for different Wi-Fi networks or Ethernet dongles anyway (your dock on your desk and your USB Ethernet dongle at home can still have different settings). But if you do rely on it, you’ll need to figure out something else.

– und die Möglichkeit, (Encapsulated) PostScript-Dateien mit der Vorschau-Anwendung zu öffnen:

Other apps that can view or convert .ps and .eps files are available from the App Store and elsewhere.

Schwer nachvollziehbar, zumal die Formatunterstützung offenbar noch im System vorhanden ist. Tatsächlich erzeuge ich regelmäßig PostScript-Dateien mit Acrobat Pro (File → Export to → PostScript), um aus proprietären, nur mit Acrobat lesbaren Dokumenten standardkonforme PDF-Dateien abzuleiten. Künftig wird GhostScript (ps2pdf) diesen Ausbruch aus dem Adobe-System unterstützen müssen. Eventuell ist diese Feature-Anämie aber auch ein subversiver Akt von CLI-Fans im macOS-Entwicklungsteam, denn Datumsformate und Netzwerkumgebungen sind nicht wirklich verschwunden – sie haben nur ihr GUI abgeben müssen.

Ganz unabhängig von U-Booten bei Apple halte ich es mit John Gruber

I’ve updated my devices across the board, with the exception of my Macs. I have no particular or specific concerns about Ventura, I’m just always more conservative about MacOS updates than other devices, because my Macs are so essential for my work.

– und Marcel Weiher:

In other words, I had set the Bozo Bit on Apple. By default, when Apple does something new these days, I fully and quietly expect it to be broken. And I am surprised when they actually get something right, like Apple Silicon. And it wasn't an angry reaction to anything, in fact, it wasn't even much of conscious decision, more a gradual erosion of expectations.

Generation 习近平

Die neue Führung der KPCh sorgt überraschend für Überraschungen:

Der Parteichef stellte anschließend seine neue Führungsmannschaft mit treuen Gefolgsleuten vor. Im mächtigen neuen Ständigen Ausschuss des Politbüros trat überraschend der Shanghaier Parteichef Li Qiang an zweiter Stelle auf das Podium. Die Auswahl des 63-Jährigen deutet darauf hin, dass der enge Vertraute von Xi im März neuer Regierungschef werden soll. Der bisherige Regierungschef Li Keqiang zieht sich vorzeitig zurück und gehört dem Zentralkomitee auch nicht mehr an, obwohl er erst 67 Jahre alt ist. Er wird auf der Jahrestagung des Volkskongresses im März als Premier abtreten.

Wenn eine Pensionierung selbst in anstrengenden Positionen mit 67 Jahren als vorzeitig gilt, sehe ich schwarz für Liu Ziheng, Xiang Biao und Yu Zhenming. Immerhin scheint es aber weiterhin eine informelle Altersgrenze zu geben:

Kurz vor den Abstimmungen über die Änderungen der Parteiverfassung eskortierten Saaldiener den 79-jährigen Amtsvorgänger Xis hinaus. In den Aufnahmen wirkte es so, als räume Hu seinen Sitz neben Xi nur widerwillig. Chinas staatliche Nachrichtenagentur Xinhua berichtete jedoch später, Hu habe sich nicht wohl gefühlt und sei daraufhin aus dem Saal geführt worden.

Doppelzüngig

Einige Bürgerinnen der russischen Föderation entwickeln bereits in jungen Jahren einen bewundernswert subversiven Umgang mit staatlichen Sprachregelungen:

Selbst, wenn Krieg herrscht, kann der doch politische Konflikte nicht lösen. Das kann nur unser Präsident, der über uns steht. Wir normalen Bürger können da in keiner Weise helfen.

Ich möchte den Milizionär sehen, der diese schicksalergebene Anhängerin des Präsidenten wegen der fehlerhaften Bezeichnung der militärischen Spezialoperation und des Plädoyers für ein Ende der Kampfhandlungen belangen würde.

Pintegration

Bei jeder manuellen Eingabe eines GnuPG-Passworts im macOS-Terminal steht mir die vorbildliche Zusammenarbeit von pinentry-gnome und Seahorse vor Augen, und trotz des Cachings durch den gpg-agent gebe ich solche Passwörter sehr oft ein. Das von Ralph Seichter betreute Paket GnuPG for OS X unterstützt zwar die Hinterlegung der Passwörter im macOS-Schlüsselbund, aber ich möchte ungern Homebrew und manuelles Paketmanagement mischen. Erfreulicherweise ist die schlüsselbundunterstützende GPGOSX-Komponente pinentry-mac auch via Homebrew verfügbar. Nach der Installation (brew install pinentry-mac) genügen eine einzige Zeile

# ~/.gnupg/gpg-agent.conf pinentry-program /opt/homebrew/bin/pinentry-mac

– und ein Neustart des gpg-agent, um wiederholte Passworteingaben zu vermeiden. Obwohl die Kombination von Schlüsselbund und Touch ID noch etwas eleganter wäre, begnüge ich mich vorerst mit feature parity zwischen macOS und Ubuntu/Gnome. In diesem Zusammenhang erwäge ich kurz, ob 1Password die Verwaltung meiner SSH-Schlüssel übernehmen könnte, aber in diesem Korb sind bereits mehr als genug Eier.

Überprofiliert

Als hätte das Unternehmen sein Profil nicht bereits hinreichend geschärft, möchte N26 nun auch noch den Handel mit Kryptowährungen anbieten.

Grüneres Gras

Unabhängig von der in Teilen überraschend positiven Außenwahrnehmung ist Deutschland besonders (betroffen|verwundbar|abhängig|rückständig) in Bezug auf Fachkräftemangel, Energieversorgung, Exporte (insbesondere von Personenkraftwagen), Produktfälschungen, Klimawandel, Artensterben, Bewegungsmangel, Digitalisierung, Innovationsfähigkeit, Infrastruktur und das Bildungssystem.

Es ist wohl an der Zeit, über eine Auswanderung in das entfesselte Global Britain unter der visionären Liz Truss (growth, growth, growth) oder ein stabiles demokratisches Gemeinwesen innerhalb der Europäischen Union nachzudenken.

Matriarchat

Eine Zurechtweisung durch die eigene Mutter scheint in Österreich ein starkes politisches Motiv zu sein –

Die WKStA führt die Ermittlungen in der mittlerweile umfangreichen Affäre, die durch Schmids Aussagen nun auch wieder in die öffentliche Aufmerksamkeit rückt. Zahlreiche Medien zitierten Passagen aus Schmids Aussagen bei der WKStA, so etwa der ORF: Wir haben Dinge gemacht, die nicht in Ordnung waren. Zum Umdenken hat mich bewogen, dass meine Mutter gesagt hat, wir haben dich so nicht erzogen. Wenn du etwas falsch gemacht hast, dann steh dazu, und das mit allen Konsequenzen.

– das manchmal zufällig mit (selbstverständlich nachrangigen) juristischen Erwägungen korreliert:

Ein weiteres Motiv könnte Schmids Wunsch sein, in künftigen Verfahren als Kronzeuge geführt zu werden und damit sein eigenes Strafmaß gegebenenfalls signifikant zu reduzieren. Laut WKStA ist Schmid im April mit diesem Anliegen an die Ermittler herangetreten.

Offensichtlich hat das vierte Gebot in Thomas Schmids persönlichem Katechismus Vorrang sowohl vor dem siebten als auch vor dem achten Gebot.

Dawn of the YoLD: Netzwerk

Die Verwendung eines Ubuntu Server-Images und das anschließende Upgrade auf Ubuntu Desktop (apt install ubuntu-desktop) auf einem ThinkPad ändert nur auf den ersten Blick nichts an der Konfiguration als Desktop-System. Tatsächlich werden Netzwerkverbindungen unter Ubuntu entweder durch networkd (Server) oder den Network Manager (Desktop) verwaltet, und die Installation von Ubuntu Server impliziert eine Entscheidung für networkd.

Beim Start des Systems besteht networkd zum Beispiel darauf, dass ein Ubuntu-Server über eine aktive Ethernet-Verbindung verfügen sollte, und akzeptiert die fehlende Verbindung erst nach geschlagenen zwei Minuten. Diese Beharrlichkeit kann mit einer Ergänzung der netplan-Konfigurationsdatei umgangen werden:

# /etc/netplan/00-installer-config.yaml network: ethernets: enp0s31f6: dhcp4: true optional: true version: 2

Auch die Verwendung des lokalen DNS-Servers kann networkd auf diesem Weg nähergebracht werden:

# /etc/netplan/00-installer-config-wifi.yaml network: version: 2 wifis: wlp4s0: access-points: MySSID: password: mypassword dhcp4: true dhcp4-overrides: use-dns: false nameservers: addresses: [192.168.78.42]

Allerdings bleibt das Problem, dass eine von networkd verwaltete Verbindung aus Sicht des Network Managers (und damit in der Gnome-Oberfläche) unavailable ist. Die Übergabe der Netzwerkverwaltung erfordert radikale Schritte:

sudo rm /etc/netplan/00-installer-config-wifi.yaml sudo vi /etc/netplan/01-network-manager-all.yaml # Let NetworkManager manage all devices on this system network: version: 2 renderer: NetworkManager sudo netplan generate sudo netplan apply sudo service NetworkManager restart

Nach einem Neustart erscheinen sämtliche WLAN-Einstellungen wie von Zauberhand in der Gnome Shell.

Antiquiert

Im Zuge der Inbetriebnahme von vim auf einem neuen System fällt mir auf, dass sich eine visual selection nicht mehr mit der Zeichenfolge s) einklammern lässt, obwohl ich die gesamte Konfiguration (.vim/ und .vimrc) unverändert vom bisher genutzten System übernommen habe. Der Grund wirft kein gutes Licht auf meine Update-Gewohnheiten:

The s visual mode map was removed 11 years years ago. 6fb16ea

Trotzdem frage ich mich, warum der Commit von 2011 auf dem neuen System wirksam wurde, obwohl das antiquierte ~/.vim/plugin/surround.vim mit umgezogen ist. Das Geheimnis muss ungelöst bleiben, bietet aber die Gelegenheit, vim-surround und vim-ragtag zu aktualisieren und .vim/ aufzuräumen.

Relativ schnell

Nachdem ich mittlerweile drei lokale Webserver mit sehr unterschiedlichen Ausstattungen betreibe, muss ich natürlich auch ihre Leistung bei der Auslieferung einer dynamisch generierten Webseite vergleichen (ab -c50 -n500 http://django(server|think|book)/):

Server Software: nginx/1.18.0 nginx/1.18.0 nginx/1.23.1
Server Hostname: djangoserver.rhine (NUC) djangothink.rhine (LTP) djangobook.rhine (MBP)
Server Port: 80 80 80
Document Path: / / /
Document Length: 65820 bytes 65820 bytes 65820 bytes
Concurrency Level: 50 50 50
Time taken for tests: 3.056 seconds 8.081 seconds 1.595 seconds
Complete requests: 500 500 500
Failed requests: 0 0 0
Total transferred: 33058000 bytes 33058000 bytes 33065000 bytes
HTML transferred: 32910000 bytes 32910000 bytes 32910000 bytes
Requests per second: 163.60 [#/sec] (mean) 61.87 [#/sec] (mean) 313.49 [#/sec] (mean)
Time per request: 305.624 [ms] (mean) 808.148 [ms] (mean) 159.492 [ms] (mean)
Time per request: 6.112 [ms] (mean, across all concurrent requests) 16.163 [ms] (mean, across all concurrent requests) 3.190 [ms] (mean, across all concurrent requests)
Transfer rate: 10563.03 [Kbytes/sec] received 3994.71 [Kbytes/sec] received 20245.53 [Kbytes/sec] received

Wie zu erwarten, ist der Aufruf vom MacBook Pro (localhost) am schnellsten, gefolgt vom aktuellen Intel NUC-System (Ethernet/WLAN), während das ältere ThinkPad (WLAN/WLAN) signifikant langsamer liefert.

Ebenfalls erwartbar sind die Ergebnisse für die Auslieferung einer statischen Webseite durch die lokalen Server und das Produktivsystem:

Server Software: nginx/1.18.0 nginx/1.18.0 nginx/1.23.1 nginx/1.18.0
Server Hostname: staticserver.rhine (NUC) staticthink.rhine (LTP) staticbook.rhine (MBP) eden.one (VPS)
Server Port: 80 80 80 443
Document Path: / / / /
Document Length: 65361 bytes 65361 bytes 65361 bytes 65361 bytes
Concurrency Level: 50 50 50 50
Time taken for tests: 0.530 seconds 1.557 seconds 0.142 seconds 3.210 seconds
Complete requests: 500 500 500 500
Failed requests: 0 0 0 0
Total transferred: 32803000 bytes 32803000 bytes 32810000 bytes 32959500 bytes
HTML transferred: 32680500 bytes 32680500 bytes 32680500 bytes 32680500 bytes
Requests per second: 942.71 [#/sec] (mean) 321.14 [#/sec] (mean) 3524.08 [#/sec] (mean) 155.78 [#/sec] (mean)
Time per request: 53.039 [ms] (mean) 155.694 [ms] (mean) 14.188 [ms] (mean) 320.967 [ms] (mean)
Time per request: 1.061 [ms] (mean, across all concurrent requests) 3.114 [ms] (mean, across all concurrent requests) 0.284 [ms] (mean, across all concurrent requests) 6.419 [ms] (mean, across all concurrent requests)
Transfer rate: 60397.63 [Kbytes/sec] received 20575.09 [Kbytes/sec] received 225830.21 [Kbytes/sec] received 10028.12 [Kbytes/sec] received

Der virtuelle Server in Baden-Baden schlägt sich trotz des Overheads für die Transportverschlüsselung (TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256) erstaunlich gut und macht seinem PageSpeed-Ergebnis alle Ehre.

Terminal NT

Gegen ein blazingly fast, Rust-based terminal built to supercharge your workflows kann man wenig einwenden, abgesehen von der Registrierungspflicht (Service Account), den Lizenzbedingungen

To the extent you receive our Software, subject to your compliance with these Terms and during the applicable term of your Service Account, we grant to you a non-exclusive, non-transferable, non-sublicensable right and license to use our Software solely as reasonably necessary for your use of our Service in accordance with these Terms.

– der nicht in Stein gemeißelten Preisgestaltung (Individual: Free – Team: Pricing TBD) –

We may add new services for additional fees and charges, add or amend fees and charges for existing services, at any time in our sole discretion.

– und natürlich der Erfahrung mit ambitionierten Neueinsteigern in einer anderen Produktkategorie.

Dawn of the YoLD: Gnome

Abgesehen vom unnötig kleinen Dateisystem hat sich die Konfiguration eines Ubuntu-Notebooks bisher nur im Grenzbereich zwischen Terminal und Gnome (mutt/Firefox) als hakelig erwiesen. Tatsächlich ist die Gnome-Oberfläche trotz erheblicher Fortschritte und vollmundiger Eigenwerbung (Simple, beautiful, elegant) nach wie vor weniger kohärent als macOS. In der Praxis fehlt mir hauptsächlich LaunchBar, aber der Weg zu einer annähernd gleichwertigen Alternative illustriert den Unterschied zwischen macOS und Ubuntu/Gnome ganz gut: Ulauncher (sudo add-apt-repository ppa:agornostal/ulauncher && sudo apt update && sudo apt install ulauncher) funktioniert systemweit erst nach der Installation eines weiteren Pakets (sudo apt install wmctrl) und der kontraintuitiven Definition der gewünschten Tastenkombination in Settings > Keyboard > Customize Shortcuts > Custom Shortcuts > + sowie der Wahl einer anderen Tastenkombination (z.B. Ctrl-Alt-Ü) in den ULauncher-Einstellungen.

Der Start von Anwendungen mit ULauncher (und aus dem Terminal) ist aber immer noch beschwerlich: Statt das Fenster der gestarteten Anwendung anzuzeigen, erscheint eine provozierende Benachrichtigung (Mozilla Firefox is ready), während die Anwendung diskret im Hintergrund bleibt. Abhilfe sollen verschiedene Extensions schaffen, aber angeblich auch die Modifikation des Systemverhaltens mit dconf-editor. Leider erweist sich die empfohlene Einstellung strict für org.gnome.desktop.wm.preferences.focus-new-windows nicht als hilfreich, denn:

This option provides additional control over how newly created windows get focus. It has two possible values; smart applies the user's normal focus mode, and strict results in windows started from a terminal not being given focus.

Es führt wohl doch kein Weg an einer Gnome Shell Extension vorbei. Weil aber Firefox als Snap-Paket nicht zur Extension-Installation taugt, müssen zwei Pakete installiert werden:

sudo apt install gnome-shell-extension sudo apt install gnome-shell-extension-manager

Der Extension Manager bietet sehr viele Extensions zum Thema Fensterfokus an, ich entscheide mich für Grand Theft Focus. Zum Abschluss der Konfiguration wird ~/Documents mit dem jeweils aktuellen Dokumentenordner des Backups verknüpft (ln -s /home/jan/Backup/latest/Documents /home/jan/Documents), so dass ich die Ordnerhierarchie mit ULauncher schnell durchforsten kann. Der Weg zu meinem gewohnten Launcher-Workflow hat mehr Zeit beansprucht als Mailstack und Webstack zusammen.

Tastatur-Kurzbefehle in Ubuntu sind dadurch gekennzeichnet, dass sie Nutzerinnen verschiedener anderer Plattformen ansprechen sollen. Ctrl-W schließt – wie auf dem Mac – ein Fenster bzw. in einem Fenster mit mehreren Tabs die einzelnen Tabs und – anders als auf dem Mac – mit dem letzten Fenster/Tab auch die jeweilige Anwendung. Alternativ lässt sich eine Anwendung (unabhängig von der Anzahl der Fenster) mit Ctrl-Q schließen. Zusätzlich kann man ein Fenster aber auch - wie unter Windows – mit Alt-F4 schließen (unabhängig von der Anzahl der Tabs).

Für das application/window/tab switching wurden unterschiedliche UI-Varianten implementiert:

Im Terminal werden die meisten Kurzbefehle durch die Shift-Taste ergänzt

– aber ein Wechsel zwischen Tabs erfolgt nicht mit Ctrl-Shift-Tab sondern mit Ctrl-PageUp/PageDown (oder Alt-[Ziffer] für die Wahl eines bestimmten Tabs).

Weitere nützliche Kurzbefehle sind:

The Penguin has landed.

Markdownhund 2

Word-Anhänge sind entgegen der zwischenzeitlichen Abgesänge

Nowadays, I get the same feeling of dread when I open an email to see a Microsoft Word document attached. Time and effort are about to be wasted cleaning up someone’s archaic habits. A Word file is the story-fax of the early 21st century: cumbersome, inefficient, and a relic of obsolete assumptions about technology. It’s time to give up on Word.

– und verfrühter Hoffnungen weiterhin eine außerordentlich raumgreifende Geißel der Menschheit. Trotz des Gegenwinds halte ich aber an den textbezogenen Rules for Computing Happiness fest –

  • Use a plain text editor that you know well. Not a word processor, a plain text editor.
  • Do not use your text editor for tasks other than editing text.
  • Keep as much as possible in plain text. Not Word or Pages documents, plain text.
  • For tasks that plain text doesn’t fit, store documents in an open standard file format if possible.

– und auch hier erweist sich Pandoc als hilfreich. Mit dem Einsatz von w3m für das inline rendering von HTML-Nachrichten gibt es bereits eine Vorlage für die feindliche Umarmung ungeliebter Anhänge (in diesem Fall Office Open XML Document und Open Document Text):

# .muttrc auto_view application/vnd.openxmlformats-officedocument.wordprocessingml.document application/vnd.oasis.opendocument.text # .mailcap application/vnd.openxmlformats-officedocument.wordprocessingml.document; ~/scripts/view_attachment %s "-" application/vnd.openxmlformats-officedocument.wordprocessingml.document; pandoc --from docx --to markdown; copiousoutput application/vnd.oasis.opendocument.text; ~/scripts/view_attachment %s "-" application/vnd.oasis.opendocument.text; pandoc --from odt --to markdown %s; copiousoutput

Mit dieser Konfiguration erzeugt Pandoc für jedes OOXML- und ODT-Dokument eine Textversion (mit Markdown-Auszeichnungen), die automatisch in der Pager-Ansicht von mutt dargestellt wird. Die Konversion ist allerdings nicht perfekt: Aufzählungen innerhalb einer OOXML-Tabellenzelle werden von Pandoc manchmal ignoriert, und die Kombination unterschiedlicher Pandoc-Versionen sorgt für überraschende Effekte. Eine unter Ubuntu verfügbare Pandoc-Version von 2020 (2.9.2.1) generiert zum Beispiel OOXML-Dokumente, deren Tabellen von LibreOffice und neueren Pandoc-Versionen (2.19+) nicht verstanden werden. Das macht sich bemerkbar, wenn ein aktuelles Pandoc einen OOXML-Anhang rendert, der mit dem älteren Pandoc erstellt wurde – statt wohlgeformter Markdown-Tabellen enthält die Textfassung nichts. Außerdem unterscheidet sich die Darstellung von Überschriften zwischen den Pandoc-Versionen (Setext-style vs. ATX-style). Beide Phänomene sind nur für Menschen relevant, die unterschiedliche Pandoc-Versionen als OOXML-Generator und -Parser einsetzen, und es wäre übertrieben, von einer Breitenwirkung der fehlenden Abwärtskompatibilität zu sprechen.

Bei dieser Gelegenheit fällt mir auf, dass ich bislang auf den Hail Mary-Ansatz zur Identifikation von MIME-Types durch mutt gesetzt habe:

If Mutt can not determine the MIME type by the extension of the file you attach, it will run the command specified in $mime_type_query_command. If that command is not specified, Mutt will look at the file. If the file is free of binary information, Mutt will assume that the file is plain text, and mark it as text/plain. If the file contains binary information, then Mutt will mark it as application/octet-stream.

Ursache der undifferenzierten Typisierung fast aller Anhänge ist die unter macOS fehlende Referenzdatei mime.types. Um dieses Defizit zu beheben, kann man die Datei von einem anderen System kopieren (nach ~/.mime.types oder /etc/mime.types) oder sich das file-Kommando zu Nutze machen:

# .muttrc set mime_type_query_first = yes set mime_type_query_command = "file -b --mime-type"

Der erste Parameter stellt die Präzedenz von file gegenüber mime.types sicher.

Raumgreifend 2

Für Spielereien mit KI-gestützter Bildgenerierung bin ich eigentlich immer zu haben, aber bei einem lokalen Platzbedarf von > 5 GB hört der Spaß auf. Wer einmal 1000 D-Mark für 10 MB Festplattenplatz zahlen musste, begegnet raumgreifender Informationsverarbeitung für den Rest seines Lebens mit einer gewissen Reserve. Herwig Feichtinger hat diese Empfindung bereits 1986 in der Mikrocomputer-Zeitschrift mit der gebotenen Entrüstung auf den Punkt gebracht –

Die Speicherpreise sind in den letzten Jahren drastisch gesunken. Mikrocomputer mit mehr als 64 KBvte RAM waren noch vor vier oder fünf Jahren fast undenkbar – nicht nur mangel Adressierbarkeit durch 8-Bit-Prozessoren. sondern vor allem wegen der damals horrenden Preise für die nötigen Chips. Manch einer konnte sich auch gar nicht vorstellen, wozu er jemals mehr Speicher brauchen würde...

Die Zeiten haben sich geändert. Die Chips wurden billiger, und man kann kaum noch einen PC mit weniger als 256 KByte RAM kaufen. Die braucht er aber auch: Es ist fast schon schwierig geworden, ein Software-Paket zu finden, das mit weniger auskommt. Dabei war doch früher eine komfortable Textverarbeitung oder gar eine komplette Finanzbuchhaltung mit 64 KByte RAM gar kein Problem?!

Das alles hat gute Gründe. Vor fünf Jahren wäre kein Mensch auf die Idee gekommen, zum Beispiel ein wirklich professionelles Textverarbeitungs-System in einer anderen Sprache als Assembler zu schreiben. Das Resultat waren kompakte und trotz 8-Bit-Verarbeitung recht schnelle Programme. Natürlich: Assembler-Programmierung hat gegenüber höheren Sprachen Nachteile – wie schlechte Portabilität, höhere Entwicklungsdauer, schwierige Änderbarkeit. Aber nur für den Software-Entwickler, nicht für den Käufer: Dem ist es egal, in welcher Sprache das letztlich durch Compilation ohnehin unlesbare Programm geschrieben wurde.

Heute werden von den größeren Software-Häusern höhere Programmiersprachen bevorzugt, namentlich die Sprache C, aber auch Pascal oder Basic. Ohne viel Arbeit läßt sich solch ein Programm auch für andere Computertypen compilieren. Sicher brauchen solche Programme mehr Platz im Speicher als die früher bevorzugte Assembler-Software. Aber spielt das denn eine Rolle bei den so drastisch gefallenen Speicherpreisen und bei den heute großzügig mit Arbeitsspeicher ausgestatteten Rechnern?

Leider doch. Wer einmal mit Wordstar-2000 gearbeitet hat, weiß, daß ein für die 8088-CPU compiliertes C-Programm langsamer ist als ein 8080-oder Z80-Assembler-Programm. Und wer dauernd Disk-Jockey spielen muß, weil das komplette Programmpaket nicht einmal mehr auf eine 360-KBvte-Diskette paßt, und wer die hundert oder mehr Kilobytes, die heutige Programme fressen, beim Start jedesmal erst mühsam von der Floppy-Disk herunterholen muß (wer arbeitet schon den ganzen Tag mit dem gleichen Programm?), sehnt sich manchmal ehrlich nach der 8-Bit-Ära zurück...

Ich weiß, ich weiß, eigentlich braucht man für Micropros Wordstar-2000, Microsoft-Windows und ähnliche Programme eine Festplatte. Dann geht das Laden wirklich flott. (Auch hierzu paßt das Argument fallender Speicher-Preise.) Nur frage ich mich, warum der Käufer mit teurer Hardware die Speicherverschwendungs-Wut der Software-Hersteller bezahlen muß.

Es wäre schön, wenn mehr Software-Häusern bewußt wäre, daß die Hardware-Ausstattung der Mehrzahl ihrer Kunden nicht mit der ihres Entwicklungs-Systems übereinstimmt. Es soll auch noch Anwender ohne Festplatte geben – und sie wird es immer geben, sonst wären die kleinen Aktentaschen-Computer kaum sinnvoll. Die vielbeschworene Benutzerfreundlichkeit kann auch darin bestehen, daß ein komfortables Programmpaket dank Kompakt-Schreibweise zusammen mit dem Betriebssystem und in paar Benutzer-Dateien auf einer einzigen Diskette Platz findet.

– aber auch 2022 empfinden Menschen den Status Quo als unbefriedigend:

Part of my brain still lives with C64 tapes and disks. Tape? one or two files, unnamed, may you rewind to the right spot. Someone put 5 files on the 5.25" disk? unthrifty!

Now one volume has millions and what's all this about honestly?

Dawn of the YoLD: Seepferdchen

Die Passwort- und Schlüsselverwaltung von Ubuntu entspricht meiner Arbeitsweise deutlich besser als der macOS-Schlüsselbund. Sie stellt sämtliche SSH- und GnuPG-Schlüssel in ~/.ssh und ~/.gnupg dar und bietet die (auf dem Mac fehlende) Möglichkeit, Passwörter für GnuPG-Schlüssel nach der einmaligen Eingabe via Pinentry zu speichern. Wie unter macOS ist eine CLI-basierte Speicherung bzw. Abfrage von Passwörtern möglich:

apt install libsecret-tools secret-tool store --label=domainmail user snafu host mailserver.domain.com service imap secret-tool store --label=privatemail user snafu host mailserver.private.org service imap secret-tool lookup user snafu host mailserver.private.org

In den Konfigurationsdateien für mutt, msmtp und mbsync muss entsprechend das macOS-Kommando security find-internet-password durch secret-tool lookup ersetzt werden. Trotz aller Seahorse-Begeisterung möchte ich auf 1Password nicht verzichten:

curl -sS https://downloads.1password.com/linux/keys/1password.asc | sudo gpg --dearmor --output /usr/share/keyrings/1password-archive-keyring.gpg echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/1password-archive-keyring.gpg] https://downloads.1password.com/linux/debian/amd64 stable main' | sudo tee /etc/apt/sources.list.d/1password.list sudo mkdir -p /etc/debsig/policies/AC2D62742012EA22/ curl -sS https://downloads.1password.com/linux/debian/debsig/1password.pol | sudo tee /etc/debsig/policies/AC2D62742012EA22/1password.pol sudo mkdir -p /usr/share/debsig/keyrings/AC2D62742012EA22 curl -sS https://downloads.1password.com/linux/keys/1password.asc | sudo gpg --dearmor --output /usr/share/debsig/keyrings/AC2D62742012EA22/debsig.gpg sudo apt update && sudo apt install 1password

Dawn of the YoLD: Webstack

Die Einrichtung meines Webstacks unter Ubuntu ist ein gelöstes Problem: Die Inhalte (/var/www/) und Konfigurationsdateien (/etc/uwsgi/apps-enabled bzw. /etc/nginx) können unverändert vom lokalen Webserver übernommen werden, wobei das Verzeichnis /var/www dem Benutzer www-data zu eigen sein sollte (mit Ausnahme des DB-Dumps /var/www/djangoproject3/dbdump/site.sql). Der Symlink zur nginx-Standardkonfiguration (/etc/nginx/sites-enabled/default) muss entfernt und die Servernamen in /etc/nginx/sites-enabled/* müssen angepasst werden. Schließlich müssen dieselben Servernamen in /etc/hosts eingetragen und die Dienste nginx, PostgreSQL und uwsgi neu gestartet werden (service restart nginx|postgresql|uwsgi). Wegen der Einrichtung eines zusätzlichen synchronisationsbedürftigen Webservers muss das Synchronisationsskript flexibilisiert werden:

#!/usr/local/bin/python3 import os import operator import subprocess import argparse import paramiko local_dir = '/home/snafu/djangosite/dbdump/' remote_dir = '/var/www/djangosite/dbdump/' db = 'djangosite' dbuser = 'snafu' extension = '.sql' dumpfile = local_dir + db + extension targetfile = remote_dir + db + extension class ServerProfile: def __init__(self, server_name, actions): self.name = server_name self.actions = actions self.actions.sort() configparser = paramiko.SSHConfig() configparser.parse(open('/home/snafu/.ssh/config')) self.ssh_config = configparser.lookup(self.name) self.ssh_key = paramiko.ECDSAKey.from_private_key(open(self.ssh_config['identityfile'][0])) def print_status(self, return_code): if return_code == 0: print('done.') else: print('failed!') def dump_db(self): print('Dumping local database...') with open(dumpfile, 'w') as writefile: completed_process = subprocess.run(['pg_dump', '-E', 'UTF8', '-c', db], stdout=writefile) self.print_status(completed_process.returncode) def transfer_db(self): print(f'Sending database dump to {self.name} ...') transport = paramiko.Transport((self.ssh_config['hostname'],int(self.ssh_config['port']))) transport.connect(username=self.ssh_config['user'], pkey=self.ssh_key) sftp = paramiko.SFTPClient.from_transport(transport) try: sftp.put(dumpfile,targetfile) self.print_status(0) except: self.print_status(1) if sftp: sftp.close() if transport: transport.close() def update_db(self): print(f'Updating remote database on {self.name} ...') client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(self.ssh_config['hostname'], username=self.ssh_config['user'], port=self.ssh_config['port'], key_filename=self.ssh_config['identityfile'][0]) stdin, stdout, stderr = client.exec_command(f'psql -U {dbuser} {db} < {targetfile}') return_code = stdout.channel.recv_exit_status() self.print_status(return_code) client.close() def work(self): dispatcher = { 'd' : self.dump_db, 't' : self.transfer_db, 'u' : self.update_db } if self.actions: for action in self.actions: dispatcher[action]() else: print(f'Nothing to do for {self.name}.') def main(): p = argparse.ArgumentParser(description='Synchronize website database') p.add_argument('server', type=str, choices=['firstserver', 'secondserver'], help='the target server') p.add_argument('-d', '--dump', dest='actions', action='append_const', const='d') p.add_argument('-t', '--transfer', dest='actions', action='append_const', const='t') p.add_argument('-u', '--update', dest='actions', action='append_const', const='u') arguments = p.parse_args() server = ServerProfile(arguments.server, arguments.actions) server.work() if __name__=='__main__': main()

Das synchronisierende Nutzerkonto benötigt offensichtlich Schreibrechte auf den Pfad targetfile, aber die Überarbeitung nützt trotzdem wenig, wenn man vergisst, die PostgreSQL-Authentifizierung in /etc/postgresql/14/main/pg_hba.conf für lokale Nutzerinnen von peer auf scram-sha-256 umzustellen:

2022-10-08 18:05:49.435 CEST [16140] snafu@djangosite DETAIL: Connection matched pg_hba.conf line 95: "local all all peer" 325 2022-10-08 18:14:46.258 CEST [16579] snafu@djangosite LOG: provided user name (snafu) and authenticated user name (jan) do not match 326 2022-10-08 18:14:46.258 CEST [16579] snafu@djangosite FATAL: Peer authentication failed for user "snafu"

Jenseits des Webstacks ist für authentication unter Ubuntu ein Seepferdchen zuständig.

Dawn of the YoLD: Mailstack

Die Installation meines Mailstacks auf einem Ubuntu-Notebook ist schnell erledigt (sudo apt install mutt isync msmtp), und die Konfigurationsdateien können weitgehend übernommen werden, mit einer Ausnahme: Die via snap installierte most important application in an operating system (sudo apt install snap; sudo snap install firefox) scheitert mit einer beeindruckenden Menge von Fehlermeldungen daran, HTML-Nachrichten mittels Mailcap (text/html; ~/.mutt/view_attachment %s html) zu öffnen:

update.go:85: cannot change mount namespace according to change mount (/var/lib/snapd/hostfs/usr/share/cups/doc-root /usr/share/cups/doc-root none bind,ro 0 0): cannot create directory "/usr/share/cups/doc-root": permission denied update.go:85: cannot change mount namespace according to change mount (/var/lib/snapd/hostfs/usr/share/gimp/2.0/help /usr/share/gimp/2.0/help none bind,ro 0 0): cannot create directory "/usr/share/gimp/2.0": permission denied update.go:85: cannot change mount namespace according to change mount (/var/lib/snapd/hostfs/usr/share/libreoffice/help /usr/share/libreoffice/help none bind,ro 0 0): cannot create directory "/usr/share/libreoffice/help": permission denied update.go:85: cannot change mount namespace according to change mount (/var/lib/snapd/hostfs/usr/share/xubuntu-docs /usr/share/xubuntu-docs none bind,ro 0 0): cannot open directory "/var/lib": permission denied /bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8) Gtk-Message: 09:22:48.907: Failed to load module "canberra-gtk-module" Gtk-Message: 09:22:48.921: Failed to load module "canberra-gtk-module" ATTENTION: default value of option mesa_glthread overridden by environment. ATTENTION: default value of option mesa_glthread overridden by environment. ATTENTION: default value of option mesa_glthread overridden by environment. Missing chrome or resource URL: resource://gre/modules/UpdateListener.sys.mjs [2022-10-09T07:22:51Z ERROR glean_core::metrics::ping] Invalid reason code startup for ping background-update ^CExiting due to channel error. Exiting due to channel error. Exiting due to channel error. Exiting due to channel error. Exiting due to channel error. Exiting due to channel error. Press any key to continue... /bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8) Gtk-Message: 09:24:29.485: Failed to load module "canberra-gtk-module" Gtk-Message: 09:24:29.487: Failed to load module "canberra-gtk-module" ATTENTION: default value of option mesa_glthread overridden by environment. ATTENTION: default value of option mesa_glthread overridden by environment. ATTENTION: default value of option mesa_glthread overridden by environment. Missing chrome or resource URL: resource://gre/modules/UpdateListener.sys.mjs [2022-10-09T07:24:31Z ERROR glean_core::metrics::ping] Invalid reason code startup for ping background-update

Der Epiphany-Browser (sudo apt install epiphany-browser) zeigt HTML-Nachrichten zwar an, ist aber sehr streng mit fehlerhaftem HTML, kann mit Zeichensätzen schlecht umgehen und spielt YouTube-Videos nicht ab. Zum Glück lässt sich Firefox zur Mitarbeit bewegen, wenn der Speicherort für Anhänge im Skript view_attachment geändert wird (/tmp/mutt_attach/home/jan/mutt_attach). Ohne weitere Anpassungen funktioniert das Öffnen von Links mit Firefox (via urlview.py):

#!/usr/bin/python3 import sys import subprocess import re import os os.system('clear') message = sys.stdin.read() urls = re.findall(r'(?:http|www)[^"\'>\s)]+', message) sys.stdin = open('/dev/tty') if len(urls) > 1: for index, url in enumerate(urls): print('{0}: {1}\n'.format(index+1, url)) selected_index = input('Which URL to open? ') selected_index = int(selected_index)-1 else: selected_index = 0 try: selected_url = urls[selected_index] if not selected_url.startswith('http'): selected_url = 'http://' + selected_url return_code = subprocess.call(['firefox', selected_url]) except IndexError: pass

Die Übernahme der Mailarchive aus dem regulären Backup hat den Nachteil, dass sie ohne mbsync-Statusinformationen (.mbsyncstate, .uidvalidity) gesichert werden und die jeweils erste Synchronisation nach der Aktualisierung des Mailarchivs (MBP → LTP) mit dem IMAP-Server daher Duplikate erzeugt (die sich allerdings mit der magischen Zeichenfolge T~=;d rasch entfernen lassen). Ich lege daher neue rbackup-Profile für die vollständige Synchronisation der Mailarchive an. Next up: Webstack

Dawn of the YoLD

Nach jahrzehntelangem Spott über die relative Unhandlichkeit von Linux-Systemen für den Hausgebrauch und gewissen Abweichungen von der ursprünglichen Idee Linus Torvalds' ist 2022 mein persönliches YoLD, was allerdings wenig mit Linux und viel mit meiner CLI-basierten Arbeitsumgebung zu tun hat, die sich nur noch punktuell auf die UI-Vorzüge von macOS (aber in zunehmendem Maß auf Apple-Dienste) stützt.

Für mein Experiment genügt ein gut erhaltenes und sehr günstiges Lenovo ThinkPad X260 von 2016, auf dem nach der Installation von Ubuntu 22.04 (aka Jammy Jellyfish) zunächst nur die Feststelltaste zur Escape-Taste verwandelt werden muss. Das unter macOS zentrale Kommando open heißt hier xdg-open, was sich aber durch ein Alias in .bashrc harmonisieren lässt.

Ärgerlich ist die Einrichtung eines nur 100G großen LVM-Volumes durch den Installer, obwohl ausdrücklich die gesamte SSD genutzt werden sollte (und die verschlüssselte Partition auch 235G umfasst). Zum Glück lassen sich LVM-Volume und ext4-Dateisystem nachträglich vergrößern:

$ sudo lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 238.5G 0 disk ├─sda1 8:1 0 1G 0 part /boot/efi ├─sda2 8:2 0 2G 0 part /boot └─sda3 8:3 0 235.4G 0 part └─dm_crypt-0 253:0 0 235.4G 0 crypt └─ubuntu--vg-ubuntu--lv 253:1 0 100.0G 0 lvm /var/snap/firefox/common/host-hunspell / $ df -h | grep ubuntu--vg-ubuntu--lv /dev/mapper/ubuntu--vg-ubuntu--lv 100G 27G 73G 27%% / # Vergrößerung des LVM-Volumes (Test) $ sudo lvresize -t -v -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv # Umsetzung nach erfolgreichem Test $ sudo lvresize -v -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv # Vergrößerung des Dateisystems $ resize2fs -p /dev/mapper/ubuntu--vg-ubuntu--lv $ df -h | grep ubuntu--vg-ubuntu--lv /dev/mapper/ubuntu--vg-ubuntu--lv 232G 27G 194G 13% /

Weniger ärgerlich als mysteriös ist die Tatsache, dass bei der Wahl unterschiedlicher Passwörter für die LUKS-Schlüsseldatei und das Nutzerkonto die Entschlüsselung der Festplatte (mit dem LUKS-Passwort) beim Start fehlschlägt. Ich muss nicht alles verstehen.

Weil das vorhandene vim nicht mit der Systemablage zusammenarbeitet, muss eine GTK-Version nachinstalliert (sudo apt install vim-gtk3) werden, nebst einer Anpassung von .vimrc (clipboard = unnamedplus). Außerdem fordert eines meiner vim-Plugins das Programm ctags (sudo apt install exuberant-ctags). Für alle weiteren textbasierten Angelegenheiten benötige ich LaTex (sudo apt install texlive-full) und Pandoc (sudo apt install pandoc). Die LaTeX-Konfiguration besteht in einer Kopie des texmf-Ordners nach ~/texmf und der magischen Befehlskette sudo texhash; updmap -user --enable MixedMap pad.map. Als Nächstes widme ich mich dem Mailstack.

Signaturkarussell

Vor einigen Jahrzehnten galt es als schick, ständig wechselnde Aphorismen als E-Mail-Signaturen zu verwenden, und in meinem damaligen Client konnte ich diese Albernheit mit einem Perl-Skript umsetzen. Heute erfahre ich von Dr. Drang, dass es für die Verbreitung von Aphorismen auch das Unix-Werkzeug fortune gibt, dessen Korpora allerdings nicht zu empfehlen sind:

  • First, too many cooks. Lots of people have contributed to the files, so you get too wide a variety of subject matter and taste.
  • Second, most of the cooks seem to have been boys in their teens and early twenties, i.e., people who have no taste.

Third, some of the files are full of homophobia, Hitler quotes, virulent misogyny, racism, and more.

Wenn man sich die Mühe macht, einen geeigneten Korpus zusammenzustellen, lässt sich fortune sehr einfach in mutt einbinden (set signature="fortune corpusfile|"). Rube-Goldberg-Epigoninnen verfassen stattdessen ein Skript, das den fortune-Output in eine Signaturdatei schreibt, diese Datei dann öffnet, um ihren Inhalt zu lesen und an mutt zu übergeben, und Puristinnen verwenden vim. Sollte ich einmal in so nostalgischer Stimmung sein, dass ich keine Scham für meinen spätpubertären Humor empfinde, konvertiere ich meinen alten Korpus mit strfile.

-- A: Yes. Q: Is top-posting bad?