Dialog mit apt-cyg unter Cygwin installieren

apt-cyg ist ein Kommandozeilen-Paketmanager für Cygwin, mit dem man Pakete bequem über die Eingabeaufforderung installieren kann, ohne jedes Mal den grafischen Setup-Dialog neu starten zu müssen. Er löst das Problem der umständlichen Nachinstallation, indem er ein apt-ähnliches Interface für die Cygwin-Paketverwaltung bereitstellt.

dialog ist ein Kommandozeilen-Tool zur Erstellung von textbasierten Dialogboxen (wie Eingabefelder, Menüs, Ja/Nein-Abfragen etc.), das auch unter Cygwin auf Windows verfügbar ist. Es ermöglicht es, relativ einfach grafische Benutzeroberflächen für Shell-Skripte zu erstellen.

Möchte man dialog unter Cygwin mit apt-cyg installieren, benötigt man mindestens diese beiden Pakete dialog libdialog15 installieren:

apt-cyg install dialog libdialog15

Ohne das Paket libdialog15 erhält man folgende Fehlermeldung:

dialog.exe: error while loading shared libraries: cygdialog-15.dll: cannot open shared object file: No such file or directory

Warum libdialog15 keine automatische Abhängigkeit von dialog ist, bleibt schleierhaft.

Starship - Ein plattformübergreifende Prompt für Linux, Windows und macOs

Starship ist ein Prompt-Renderer, der einen schnellen, anpassbaren und einheitlichen Prompt in allen Systemen und Shells bereitstellt.

Die einzigen Voraussetzungen sind eine funktionierende Shell wie Bash, Zsh, Fish oder PowerShell sowie ein Terminal-Emulator. Wer schöne Symbole will, braucht auch noch eine Nerd-Font. Starship selbst ist ein einzelnes, in Rust kompiliertes Binary, das ohne zusätzliche Laufzeitumgebungen auskommt und direkt unter Linux, macOS, Windows Native (PowerShell oder Cmd) und sogar in Umgebungen wie Cygwin oder WSL läuft.

Das Tool ersetzt den Standard-Prompt der Shell durch hochgradig konfigurierbare Ausgaben. Dazu startet es bei jeder neuen Eingabeaufforderung einen sehr schnellen Rendering-Prozess, der den aktuellen Kontext des Verzeichnisses analysiert. Es sammelt relevante Daten wie Git-Status, Versionen oder Befehlsdauer und stellt diese in einer kompakten Zeile dar. Ist der Akku fast leer, wird auch das angezeigt. Die eigentliche Shell bleibt dabei vollständig unberührt und alle Befehle funktionieren wie gewohnt.

Die größte Stärke von Starship ist seine nahtlose Plattformunabhängigkeit. Man erhält auf einem Windows-Rechner in der PowerShell exakt das gleiche, vertraute Erscheinungsbild wie in Bash auf einem Linux-Server. Diese Einheitlichkeit steigert die Produktivität erheblich. Weitere klare Vorteile sind die hohe Geschwindigkeit, die durch Rust garantiert wird, und die intelligente, kontextsensitive Anzeige: Nur was gerade benötigt wird, wie der Git-Branch oder die Node.js-Version, wird auch tatsächlich angezeigt. Ein geniales Detail ist die farbliche Kodierung des Prompts, die sofort visuell anzeigt, ob der letzte Befehl erfolgreich war. Starship ist out of the box einsetzbar, kann aber nach Belieben angepasst werden. Zu erwähnen ist, dass für eine ansprechende Ausgabe eine Nerd-Font benötigt wird, die separat zu installieren ist. Sie stellt Icons für viele Zwecke dar.

Nach der Installation des Windows-Binaries genügt ein Eintrag in der ~/.bashrc, um den Linux-ähnlichen Prompt auch unter Cygwin zu aktivieren:

# Das funktioniert auch in der ~/.bashrc unter Cygwin auf Windows
eval "$(starship init bash)"

Nach dem Neustart der Shell zeigt Starship sofort einen informativen Prompt, der unter anderem den Git-Status, die Python-Version im aktuellen virtuellen Environment und die Ausführungszeit des letzten langen Befehls an – alles im selben Layout wie auf einem Linux-System. Für Entwickler und Administratoren, die regelmäßig zwischen verschiedenen Betriebssystemen wechseln oder einfach Wert auf einen informativen und zuverlässigen Terminal-Prompt legen, ist Starship nahezu perfekt geeignet.

Weitere Informationen, Installationsanleitungen und die umfangreiche Moduldokumentation findet man auf der offiziellen Projektseite

Blockbench - OpenSource Low-Poly-Modelling

Blockbench ist ein auf Low-Poly-Modellierung augelegter 3D-Editor, da er auf Electron setzt, kann er unter Windows, macOS oder Linux ausgeführt werden. Er arbeitet primär mit Quadern, die man rotiert, skaliert und zusammensetzt, was den Prozess im Vergleich zum klassischen Vertex-Modeling vereinfacht. Blockbench bietet einen integrierten Textur-Editor, mit dem man Texturen direkt auf das 3D-Modell malt. Blockbench verfügt auch über einen Animationseditor; Es ist möglich, ein Modell zu riggen und es anschließend mithilfe von Keyframes für Position, Rotation und Skalierung zu animieren.

Der Editor exportiert in diverse 3D-Formate wie OBJ oder GLTF sowie in spezifische Minecraft-Formate. Zu den großen Stärken zählt die extrem flache Lernkurve, die es Einsteigern erlaubt, innerhalb weniger Minuten brauchbare Ergebnisse zu erzielen.

Blockbench ist auf Low-Poly-Modellierung spezialisiert; für organisches High-Poly-Sculpting ist es nicht geeignet.

Da Blockbench über eine integrierte Konsole verfügt und durch Plugins erweiterbar ist, kann man Aufgaben automatisieren.

Weitere Informationen und den Download findet man unter blockbench.net. Für Minecraft-Modder und Indie-Entwickler mit Fokus auf Retro-Ästhetik das Tool ideal.

ragersMediaInfo - Medieninfos auf dem Stream Deck und der MiraBox

ragersMediaInfo zeigt umfangreiche Medieninformationen wie Titel, Interpret, Album und das Albumcover. Die Anzeige wird bei jedem Titelwechsel aktualisiert und ist für maximale Kompatibilität nahtlos in die native Windows-Medien-API integriert.

Es werden beliebig viele Tasten untertsützt, jede Taste kann ein eigenes Layout haben:

  • Titel
  • Interpret
  • Album
  • Titel + Interpret
  • Titel + Album
  • Titel + Interpret + Album
  • Cover

Unterstützte Anwendungen

Das Plugin verwendet den Windows 10/11 Global System Media Transport Controls Session Manager (GSMTC) - Jede Anwendung die, der GSMTC unterstützt, funktioniert automatisch. Dies umfasst (ist aber nicht beschränkt auf):

  • Spotify (App + Web)
  • YouTube / YouTube Music (über den Browser)
  • Apple Music Web
  • Amazon Music (App + Web)
  • Foobar2000
  • Chrome, Edge, Opera, Firefox, Vivaldi (alle Medien mit Metadaten)
  • Windows Media Player

Generell gilt: Wenn Windows den Titel in der Lautstärkeanzeige anzeigt oder die Wiedergabe-/Pause-Tasten der Tastatur funktionieren, funktioniert das ragersMediaInfo-Plugin.

Den Download gibt es bei manuell bei rager.dev oder direkt im Store von MiraBox.

MiraBox - Ein Chinesischer Stream Deck Klon

Das MiraBox MBOX 293S, häufig auch „Stream Dock“ genannt, ist ein kompaktes, kabelgebundenes Macro-Pad, das funktional an ein „Stream Deck“ erinnert, jedoch mit etwa 35 Euro nur einen Bruchteil kostet. Es verfügt über 15 frei programmierbare LCD-Tasten, hinter denen ein durchgehendes Display verbaut ist. Dadurch können die Tasten beliebige Icons oder Statusanzeigen darstellen.

Im Vergleich zu herkömmlichen Tastaturen oder Maus-Shortcuts bietet ein Gerät dieser Art deutliche Vorteile: visuelles Feedback, eine klare Zuordnung von Aktionen und eine schnell zugängliche Bedienoberfläche. Das macht es besonders für Workflows mit vielen wiederkehrenden Schritten interessant, bei denen Übersicht und Reaktionszeit eine große Rolle spielen.

Elgato brachte mit dem „Stream Deck“ den ersten weit verbreiteten Vertreter dieser Geräteklasse auf den Markt, primär für Streamer, die damit Szenen, Audioquellen oder andere Streaming-Elemente steuern. Die Anforderungen, viele Befehle, schnelle Erreichbarkeit und intuitive Bedienung, gelten aber ebenso für zahlreiche andere Anwendungen, etwa Entwicklungs-, Kreativ- oder Automations-Tools.

Inzwischen existieren sowohl von Elgato als auch von MiraBox zahlreiche Varianten in unterschiedlichen Größen. Teilweise verfügen diese auch über Drehregler, um beispielsweise Lautstärken analog zu regeln.

Jeder Button des MBOX 293S kann mit Shortcuts belegt werden, die über die mitgelieferte Software verwaltet werden. Diese Software lässt sich über Plugins aus einem eigenen App-Store erweitern. Viele Plugins, die ursprünglich für das Elgato Stream Deck entwickelt wurden, sind zudem mit der MiraBox kompatibel. Mithilfe eines Tampermonkey-Scripts lassen sich diese Plugins direkt aus dem offiziellen Elgato-Store herunterladen. Icons und grafische Elemente können meist problemlos übernommen werden. Bei Plugins hängt die tatsächliche Kompatibilität jedoch von der jeweiligen Implementierung ab.

Der Shop und die offizielle Software unterstützen nur Windows und MacOS. Für die MiraBox 293 (ohne S) existieren bereits Open-Source-Implementierungen, die unter Linux funktionieren. Auch gibt es bereits ein Linux StreamDock SDK, das allerdings keine Plugins unterstützt, sondern nur die direkte Kommunikation. Wahrscheinlich wird es aber bald erste Implementierungen eines Pluginsystems auch für Linux geben.

Einer der nächsten Artikel wird sich mit der Pluginentwicklung beschäftigen. Auch wenn die Hardware gut und preiswert ist, so ist vor allem die Dokumentation auf Englisch dürftig. Es gibt zwar ein großes Forum, allerdings ist dieses hauptsächlich in Chinesisch.

Zusammengefasst kann man sagen, dass es sich bei der MiraBox um ein interessantes Produkt handelt. Vor allem durch den Preis wird es für eine größere Zielgruppe interessant.

Mit dem Ulanzi D200 U-Studio gibt es ein weiteres ähnliches Gerät, das bereits ausführlich auf HACKADAY analysiert wurde.

MiniSearch - Volltextsuche mit minimalem Overhead

MiniSearch ist eine JavaScript-Bibliothek, die client- und serverseitige Volltextsuche ermöglicht, indem sie einen invertierten Index im Arbeitsspeicher des Browsers oder Node.js-Servers aufbaut. Der Index wird vollständig im Arbeitsspeicher gehalten, wodurch die Datenmenge, die durchsucht werden kann, begrenzt ist. Auch wird der Index beim Starten immer neu aufgebaut, was für größere Mengen an Daten nicht ideal ist. Bei Versuchen mit ca. 6 MB an Daten hat der Aufbau des Index nur ca. 860 ms gedauert. Eine Fuzzy-Suche war meist in unter einer ms durchgeführt.

MiniSearch ist eine reine JavaScript-Bibliothek ohne externe Abhängigkeiten. Dadurch ist sie auch ideal, wenn ein kleines serverseitiges Projekt mit einer Volltextsuche ausgestattet werden muss, wo Solr oder auch schon Meilisearch viel Overhead benötigen. MiniSearch hingegen kann direkt eingebunden und verwendet werden. Auch die Nutzung im Browser in einer PWA ist ideal.

Die Kernfunktionalität von MiniSearch basiert auf einem Radix Tree (einem platzoptimierten Präfixbaum) für den invertierten Index. Dieser Ansatz macht die Indexierung und Suche nicht nur schnell, sondern auch besonders speichereffizient, was für mobile Browser entscheidend ist.

Es ist möglich, Dokumente zur Laufzeit hinzuzufügen und zu entfernen. Die Bibliothek bietet erweiterte Suchfunktionen wie Präfix-Suche, Fuzzy-Suche für Tippfehler und Field Boosting zur Gewichtung von Feldern, sodass Treffer in Titelfeldern höher bewertet werden können als z.B. in der Beschreibung. MiniSearch bietet viele Funktionen, die man bei einer so kleinen Suche nicht erwarten würde. So generiert Die Auto-Suggestion-Funktionalität Vorschläge direkt aus den indizierten Dokumenten und sortiert sie nach Relevanz.

Im Vergleich zu schwergewichtigen Lösungen wie Solr oder Meilisearch punktet MiniSearch durch minimalen Overhead. Während diese serverbasierten Lösungen erhebliche Ressourcen benötigen, kann MiniSearch direkt im Anwendungsprozess operieren.

sed - Der universelle Text-Transformer für die Kommandozeile

sed steht für Stream Editor und ist ein Unix/Linux-Kommandozeilenwerkzeug, das die automatische Bearbeitung von Text ermöglicht, indem es nicht-interaktive Transformationen durchführt.

sed gibt es für alle Unix-ähnlichen Betriebssysteme (wie Linux oder macOS) oder Umgebungen wie Cygwin unter Windows. sed ist praktisch immer vorinstalliert oder über die Paketverwaltung leicht beziehbar. Da es Bestandteil von Busybox ist, ist es auch in den meisten Docker-Containern vorhanden und muss nicht installiert werden.

Die Kernfunktionalität von sed besteht darin, einen Textstrom zeilenweise zu lesen, auf jede Zeile eine oder mehrere vordefinierte Operationen anzuwenden und das Ergebnis auszugeben. Sämtliche Bearbeitungen wie Suchen, Ersetzen, Löschen oder Einfügen laufen dabei ohne manuelle Eingriffe ab. sed verarbeitet Text zeilenweise: Es lädt jede Zeile in den Pattern Space, wendet die definierten Operationen darauf an und gibt das Ergebnis anschließend aus. Dieser Prozess wiederholt sich für alle Zeilen der Eingabedatei.

Es eignet sich hervorragend für Skripte oder Build-Pipelines, in denen Konfigurationsdateien angepasst werden müssen.

Entfernt alle Zeilen, die mit '#' beginnen und überschreibt die Originaldatei

sed -i '/^#/d' meine_konfiguration.conf

Ersetzt in allen Zeilen das Wort "alt" durch "neu" und erstellt eine Backup-Datei

sed -i.bak 's/alt/neu/g' meine_datei.txt

Weitere Informationen wie eine vollständige Befehlsreferenz und Tutorials findt man in der offiziellen GNU sed Dokumentation.

Mumble Auto-Restart für Let's Encrypt Zertifikate

Will man Let's Encrypt TLS/SSL-Zertifikate mit Mumble nutzen, so gibt es das Problem, dass der Mumble-Server diese nicht neu lädt, weswegen sie nach 90 ungültig sind. Wird der Mumble-Server in einem Docker-Container betrieben, kann man ihn über ein ENTRYPOINT automatisch neu starten lassen. Dafür muss der Mode restart: unless-stopped oder restart: allways gesetzt sein. In meinem Fall lasse ich die Let's Encrypt durch Caprover erstellen und mountet sie dann direkt im Docker-Container. Die Zertifikate findet man unter /captain/data/letencrypt/etc/live/<domain> auf dem Hostsystem.

#!/bin/bash
while true; do
  # Murmur im Hintergrund starten
  mumble-server -ini /config/mumble-server.ini -fg &
  
  PID=$!
  
  # Prozess für 30 Tage pausieren (2.592.000 Sekunden)
  sleep 2592000
  
  # Murmur-Prozess beenden, was den Container-Exit und Restart auslöst
  kill $PID
done

FrankenPHP und RoadRunner: Moderne App-Server für PHP

FrankenPHP und RoadRunner ersetzen den traditionellen PHP-FPM-Ansatz. Sie führen PHP-Anwendungen als dauerhafte Prozesse aus, die im Speicher bleiben, anstatt sie bei jeder Anfrage neu zu starten. Dieser Architekturwechsel bringt erhebliche Performance-Vorteile, insbesondere für framework-basierte Anwendungen mit hohem Initialisierungsaufwand. Beide Projekte sind Open-Source und können kostenlos genutzt werden.

FrankenPHP

FrankenPHP ist ein in Go geschriebener Application Server, der die PHP-Laufzeitumgebung direkt in den modernen Caddy-Webserver einbettet . Diese enge Integration erlaubt eine einfache Handhabung.

Man sollte beachten, dass FrankenPHP in zwei Modi betrieben werden kann:

  • Klassisch: Funktioniert als Drop-in-Ersatz für PHP-FPM und bietet sofortige Performance-Verbesserungen ohne Codeänderungen .
  • Worker-Modus: Hier bootet die gesamte Anwendung einmal und verbleibt im Speicher. Dies kann die Antwortzeiten laut Benchmarks um das 3,5-fache im Vergleich zu FPM verbessern, da der Framework-Initialisierungsaufwand für jede Anfrage entfällt.

Weitere herausragende Merkmale sind die native Unterstützung für moderne Protokolle wie HTTP/2 und HTTP/3, die automatische Verwaltung von HTTPS-Zertifikaten und die Möglichkeit, Anwendungen als eigenständige, portierbare Binärdateien zu bauen.

RoadRunner: Der leistungsstarke Manager

RoadRunner, ebenfalls in Go implementiert, verfolgt einen anderen Ansatz. Es handelt sich um einen High-Performance Application Server, der persistente PHP-Worker-Prozesse verwaltet . Anstatt PHP selbst einzubetten, startet und überwacht RoadRunner separate PHP-Worker und leitet Anfragen über eine schnelle Brücke an sie weiter.

Seine Stärken liegen in der hervorragenden Integration mit großen Frameworks wie Laravel oder Symfony und einem reichhaltigen Plugin-System, das Aufgaben wie Queue-Verarbeitung, gRPC und das Servieren statischer Dateien abdeckt . Dies macht es besonders geeignet für skalierbare Dienste, APIs und Anwendungen mit hohem Durchsatz.

Die Konfiguration und das Debugging gelten als anspruchsvoller als bei FrankenPHP.

Notwendige Anpassungen

Die Entscheidung für einen persistenten Application Server erfordert Anpassungen an der Architektur. Der größte Unterschied ist der Verlust der Prozessisolation. Während bei FPM jeder Request in einer sauberen Umgebung startet, kann globaler Zustand von einer Anfrage zur nächsten in einem Worker bestehen bleiben. Anwendungen müssen daher sorgfältiger mit globalen Variablen und der Initialisierung von Zuständen umgehen .

Zudem benötigt der Worker-Modus von FrankenPHP eine thread-sichere PHP-Version (ZTS), was die Kompatibilität mit einigen PHP-Erweiterungen einschränken kann. Für maximale Performance sollte der Bootstrap-Code der Anwendung so optimiert werden, dass er problemlos mehrmals in einem persistenten Worker ausgeführt werden kann.

Fazit

Mit FrankenPHP und RoadRunner stehen zwei ausgereifte und leistungsstarke Alternativen zu PHP-FPM zur Verfügung. Beide lösen das Problem des Kaltstarts von PHP-Anwendungen auf elegante Weise und ermöglichen so einen modernen, wettbewerbsfähigen Betrieb.

  • FrankenPHP überzeugt durch seine einfache Integration, den mitgelieferten Caddy-Server und seine raw Performance in Benchmarks.
  • RoadRunner punktet mit seiner Reife, einer breiten Funktionspalette durch Plugins und einer stabilen Architektur für komplexe, skalierbare Dienste.

Die Wahl zwischen ihnen hängt letztlich von den spezifischen Anforderungen des Projekts, der bestehenden Infrastruktur und den Vorlieben des Entwicklungsteams ab.

Abschließend ist es erwähnenswert, dass große Plattformen wie Facebook auf eigene, hochspezialisierte Lösungen wie HHVM und HackHack setzen, während FrankenPHP und RoadRunner diese moderne Architektur als praxistaugliche Werkzeuge für die gesamte PHP-Community bereitstellen.

NPM Packages - Patchen

Das Patchen von NPM-Paketen bezeichnet das gezielte Verändern des Quellcodes einer externen Bibliothek in einem Node.js-Projekt. Dies wird typischerweise dann notwendig, wenn ein kritischer Bug die eigene Anwendung betrifft, aber das offizielle Update des Paket-Maintainers noch nicht verfügbar ist. Diese Methode eignet sich auch für kleine, projekt-spezifische Anpassungen an einem Paket. Eine Alternative wäre das Erstellen eines Forks des Pakets, was jedoch mit einem erheblich größeren Aufwand verbunden ist.

Vorgehensweise mit patch-package

Ein beliebtes Werkzeug für diesen Prozess ist das NPM-Paket patch-package. Die Vorgehensweise ist wie folgt:

  1. Installieren npm i patch-package
  2. Erweitern der package.json um einen Postinstall-Step:
...
"scripts": {
     "postinstall": "patch-package"
}
...
  1. Manuell anpassen des Codes des zu patchenden Pakets innerhalb des node_modules-Ordners.
  2. npx patch-package <paket-name> aufrufen. Dadurch wird ein Diff erstellt und automatisch eine Patch-Datei abgelegt. Der Patch enthält die Unterschiede zwischen dem originalen und dem geänderten Code.
  3. Testen: npm i sollte nach der Installation automatisch das Paket patchen. Nachfolgend eine Beispielausgabe des Patchvorgangs:
patch-package
patch-package 8.0.1
Applying patches...
react-slick@0.30.3 ✔

Man sollte Patches immer nur als vorübergehende Lösung betrachten, bis ein offizielles Update des Originalpakets verfügbar ist. Den gefundenen Bug und den erstellten Fix sollte man idealerweise dem Maintainer des Originalpakets melden, beispielsweise via Pull Request auf GitHub. Zudem sollte man beachten, dass Patches bei größeren Updates des Originalpakets Konflikte verursachen können, die dann nach jedem update aufgelöst werden müssen.