Googles Erfahrungen mit Rust

Google berichtet über die Nutzung von Rust in Android: Der mit Rust programmierte Code war nicht nur wesentlich sicherer, sondern brachte auch eine deutliche Zeitersparnis bei der Programmierung – die Reviews waren schneller, und es traten weniger Probleme auf, die zu Nacharbeiten an Commits führten.

Python oder Rust?

War es Hamlet, der die Frage stellte: „Python oder Rust?“ Egal, leicht zu beantworten ist sie offenbar nicht, und viel ist darüber zu lesen, so auch dieser Artikel. Kurzfassung der Antwort: Es kommt darauf an …

Die (nähere) Zukunft von Git

Die Git-Entwickler haben die nähere Zukunft von Git diskutiert; zu den zentralen Themen gehören die Umstellung auf SHA256 (statt SHA1, das nicht mehr ausreichend sicher ist!), die Migration auf Rust und die Vorbereitung auf Git 3.0, das einige breaking changes mit sich bringen wird.

Interessante CLI-Tools, die mit Rust erstellt wurden

Orhun Parmaksız hat bei RustLab 2024 seine 7 bevorzugten CLI-Tools vorgestellt: 7 Rust Terminal Tools That You Should Use. Er selbst ist Entwickler beim Projekt Ratatui, das TUI-Schnittstellen für Rust bereitstellt.

Seine Favoriten sind:

Meine Erfahrungen damit:

  • tui-journal - ein TUI-Journal- (Notizen-) Programm. Leicht zu installieren. Für jedes topic, das man anlegt, gibt es einen Editierbereich, der aber per se unstrukturiert ist. Also kein Ersatz für ein Weblog oder meine reST-Notizen.

  • repgrep – Suchen und Ersetzen in Verzeichnisbäumen. Es basiert auf dem Tool ripgrep, das nicht so simpel zu installieren ist, daher:

    git clone https://github.com/BurntSushi/ripgrep
    cd ripgrep
    cargo build --release --features pcre2
    cargo install repgrep

    Man kann beispielsweise in einem Source tree nach einem Bezeichner suchen, bekommt die Treffer (pseudo-) grafisch angezeigt, kann sie aus- oder abwählen und anschließend durch einen anderen String ersetzen.

  • serie – git-Historie im TUI grafisch darstellen. Installation einfach mit cargo install --frozen serie (lt. Homepage auszusprechen wie im Deutschen!). Aufruf in einem git-Baum zeigt direkt die Historie an; man kann mit dem Cursor einen Commit auswählen, Enter drücken und bekommt Details dazu angezeigt. Sehr einfach, sehr nützlich.

  • rainfrog – ein TUI-Datenbank-Client für PostgreSQL, SQLite, duckdb (experimentell) und andere. Installation mit cargo install rainfrog. Bedienung und Funktionalität können mich nicht überzeugen; mit den CLI-Clients (psql, sqlite3) geht's einfacher. Vermutlich soll rainfrog mit abgespeicherten Queries manche häufigen Abfragen abrufbar machen, aber die könnte man genausogut auch anders skripten.

  • netscanner – ein Tool zur Analyse des Datenverkehrs im LAN. Installation einfach mit cargo install netscanner; das Programm muss mit Root-Rechten ausgeführt werden. Es werden zunächst die lokalen Interfaces und die erkannten Wifi-Netze angezeigt; man kann ein lokal erreichbares Netz scannen. Man kann sich die ein- und ausgehenden Pakete anzeigen lassen, die offenen Ports und den Traffic. Die Navigation im TUI ist nicht gerade selbsterklärend (in den Labels sind hier und da einzelne Buchstaben hervorgehoben, wenn man die drückt, passiert was).

  • glim – “terminal user interface (TUI) for monitoring GitLab CI/CD pipelines and projects”. Nicht ausprobiert.

  • atac – ein Web-API-Client fürs TUI. Installation mit cargo install atac --locked scheiterte mit einer Compilerfehlermeldung.

Kurz gefasst: repgrep und serie passen gut in eine Sammlung von CLI-Tools.

Bat on the command line, not in the belfry

Das Programm bat ist nach eigenen Angaben „a cat clone with wings“. Es kann Dateiinhalte im Terminal anzeigen und dabei für Syntaxhervorhebung und Paging (Vor- und Zurückblättern mit less) sorgen. Wenn man es aus dem Debian-Paket bat installiert, heißt das Kommando batcat, um einen Namenskonflikt zu vermeiden. Trifft einen dieser nicht, spart ein alias bat=batcat die drei zusätzlichen Buchstaben ein.

Benutzt man einen hellen Hintergrund bspw. für Konsole, empfiehlt sich die Option --theme=ansi, weil sonst vieles nicht lesbar ist (also alias bat="batcat --theme=ansi").

Präsentationen mit der Textkonsole

Presenterm ist ein Präsentationstool für Terminals, das seine Eingabe in Markdown erwartet (mit zahlreichen Erweiterungen) und die Ausgabe auf geeigneten (Text-) Konsolprogrammen darstellt – mit Grafiken, Farben, mehreren Spalten, Pausen, aktiven Codebeispielen usw. usf.

Es ist neuerdings auch als Debian-Paket gleichen Namens verfügbar, das derzeit dieselbe Version hat wie ein mit

cargo install --locked presenterm

selbst installiertes Programm.

Eine ausführliche Doku gibt es unter https://mfontanini.github.io/presenterm/introduction.html.

Formeln können über Typst- oder LaTeX-Code integriert werden (wobei LaTeX intern über pandoc nach Typst umgesetzt wird!). Auch Mermaid-Diagramme werden unterstützt. Mit einem parallelen Terminalfenster ist die synchrone Anzeige von Speakernotes möglich. Ein Export der Folien nach HTML oder PDF ist vorgesehen; für letzteres wird intern WeasyPrint eingesetzt. Allerdings hat das PDF standardmäßig den dunklen Hintergrund; will man es ausdrucken, sollte ein anderes Theme gewählt werden.

Hinweis:

Mit einem anderen Theme, z.B.

presenterm --theme light --export-pdf --output /tmp/demo.pdf examples/demo.md

kann dunkle Schrift auf hellem Hintergrund gewählt werden, der aber noch (hell-) grau ist. Das Theme terminal-light hat wohl einen weißen Hintergrund, aber es wird beim PDF-Export mit der Meldung unsupported background color in theme abgelehnt!

Die Präsentation funktioniert mit der KDE-Konsole, aber nach Beendigung des Präsentationsmodus muss evtl. über „Einstellungen → Profil wechseln“ wieder das normale Profil (Profil1) aktiviert werden, sonst bleibt nicht nur ein anderes Farbschema bestehen, sondern die Benutzereingaben sind unsichtbar.

Da die Beschriftung eines Konsole-Tabs gelöscht wird, empfiehlt es sich, für die Präsentation (mit Ctrl-Shift-N) ein neues Fenster zu öffnen.

Anscheinend ist es nicht möglich, zwei Display-Instanzen synchronisiert laufen zu lassen, sondern nur eine als Display und eine für Speakernotes. Wenn (z.B. wegen abweichender Auflösungen) nicht der Bildschirm geclonet wird, muss man sich zur Präsentation auf der Leinwand halt immer umdrehen.

Vertrauenswürdige Zertifikate hinzufügen

TIL: Wie kann man die Liste der vertrauenswürdigen Server auf einem (Debian-) Linux-Server erweitern?

  • Zertifikat(e) im crt-Format besorgen oder entsprechend (mit openssl) umwandeln

  • Zertifikate nach /usr/share/ca-certificates (am besten in ein frisches Unterverzeichnis) kopieren; es gibt auch /usr/local/share/ca-certificates, aber das funktionierte (auf einem älteren System) nicht

  • Zertifikatsdateien mit relativem Pfadnamen in /etc/ca-certificates.conf eintragen

  • das Kommando update-ca-certificates ausführen

  • gegebenenfalls Prozesse neu starten (oder den Server rebooten), weil manche Software offenbar Zertifikatsinformationen cachet

(Spoilerwarnung: Falls jemand rätselt – TIL steht für “things I learnt” …)

Spreadsheets ganz flott lesen

Häufig bekommt man Daten als Spreadsheets geliefert, möchte sie aber nicht in LibreOffice, sondern per eigenem Programm weiterverarbeiten. Es gibt zahlreiche Tools für fast ebenso zahlreiche Programmiersprachen, die diese Tabellenformate einlesen können. Ein besonders schnell zu Werke gehendes solches Tool ist calamine, das – wen wundert's – in Rust geschrieben ist. Für die Python-Programmierer gibt es einen Wrapper als Paket python-calamine. Hier ein Beispiel für dessen Benutzung:

$ uv run --with=python-calamine,ipython ipython
>>> from python_calamine import CalamineWorkbook
>>> wb = CalamineWorkbook.from_path("some_file.xlsx")
>>> wb.sheet_names
['First Sheet']
>>> ws = wb.get_sheet_by_index(0)
>>> ws.height, ws.width
(2302, 18)
>>> data = ws.to_python()
>>> len(data)
2302
>>> data[0]
['Spalte 1', 'Zweite Spalte', 'Noch eine Spalte', …]
>>> data[1]
['1200 ABC', 'xyz', 672000000, …]

(Die Ausgaben sind hier etwas verkürzt.) Das Einlesen des Spreadsheets und Umwandeln in Python-Daten geht in Nullkommanichts vonstatten, und es können außer XLSX- auch XLS- und ODS-Dateien gleichermaßen gelesen werden. Auch als BytesIO-Objekt können die Daten bereitgestellt werden:

>>> from io import BytesIO
>>> b = BytesIO(open("some_file.xlsx", "b").read())
>>> wb = CalamineWorkbook.from_filelike(b)
>>> wb.sheet_names
['First Sheet']