Der alte weiße Mann erzählt von UNIX-Philosophie

vorhergehende Artikel in: Linux Rants Python
12.04.2026

Ich möchte hier einmal beschreiben, wie wir Probleme früher ressourcenschonend, effizient und mit einem Wissensgewinn als Bonus gelöst haben und werde zeigen, dass das auch heute noch möglich ist.

In einer Zeit, in der AI / LLM / ML in alles mögliche hineingepumpt wird, wo es nicht hingehürt, wo allenthalben Warnungen vor dem Platzen der KI-Bubble ungehört verhallen, wo es immer noch Leute gibt, die Vibe-Coding als Fortschritt ansehen, wo Leute dafür gepriesen werden, dass sie "Code" durch KI erstellen lassen, anstelle ihnen zu erklären, dass es möglich ist, Bücher zu lesen, aus denen sie lernen, selbstbestimmt Probleme zu lösen - in einer solchen Zeit wollte ich nie leben.

Oder wie ich früher sehr oft und auch heute noch ab und zu sage: "Daf+r haben wir das Internet nicht erfunden!"

Die Unix-Philosophie lässt sich auf folgende drei einfachen Regeln eindampfen:

  • Schreibe Computerprogramme so, dass sie nur eine Aufgabe erledigen und diese gut machen.
  • Schreibe Programme so, dass sie zusammenarbeiten.
  • Schreibe Programme so, dass sie Textströme verarbeiten, denn das ist eine universelle Schnittstelle.
Genau diese Grundsätze charakterisieren auch heute noch eine gute Software-Architektur. Diese Grundsätze lassen sich auch heute noch in bewährten Design-Patterns, in Architekturregeln für sichere Software - kurz: in allem wiederverwenden, das einen hohen Qualitätsstandard aufweist.

Leider ist es kein neuer Trend, dass ständig hinter allem hergerannt wird, das neu aussieht. So war es damals auch mit der Sprache Python: Es gab (und gibt) Leute, die der Meinung sind, dass es damit endlich eine Möglichkeit gab, Aufgaben zu automatisieren. Das sind alles Leute, die nichts lernen wollen: Wir waren Jahrzehnte davor in der Lage, Abläufe zu automatisieren: wir nutzten die Shells, die in jedem Betriebssystem seit den Siebzigern existieren.

Dasselbe geschah davor mit Objektorientierung: Smalltalk hatte dieses Konzept und seine Nützlichkeit hervorragend demonstriert. Statt sich aber damit zu beschäftigen und dort einzusetzen, wo diese Konzepte einen messbaren Nutzen versprachen verdrehte und kastrierte man diese Konzepte beinahe bis zur Unkenntlichkeit und flanschte sie an alle Sprachen, die nicht bei drei auf den Bäumen waren. Ein wunderbares Beispiel dafür ist C++. Genau dasselbe wiederholte sich mit funktionalen Sprachen: LISP zeigte, wie es geht. Auch hier wiederholte sich dasselbe Schema F: Auch hier wieder wurden die grundlegenden Konzepte so lange verdreht, bis sie nur mehr Karikaturen der zugrundeliegenden Ideen waren und dann in andere Sprachen hineingestampft, in die sie nicht hineinpassen. Das Hasso-Plattner-Institut missbraucht sogar Studenten, indem seine Dozenten funktionale Programmierung anhand von C++ lehren. Aber auch hier ist eben die Mittelmäßigkeit zu Hause - was will man erwarten: Mit diesem Namen ist schließlich auch SAP verbunden. Und Mittelmäßigkeit zeichnet sich eben unter anderem durch das Befolgen der Regel aus: "Wenn ich nur einen Hammer habe, sieht jedes Problem aus wie ein Nagel!"

So, dass war der Teil mit dem Rant - zurück zum eigentlichen Thema. Man hat ein Problem, das man lösen möchte. Meins war (zugegebenermaßen aus zu viel freier Zeit geboren) folgendes: Man hat lange Jahre die erfolgreichste Science-Fiction-Serie der Welt gelesen und war auch immer von den Einbänden fasziniert. Man möchte diese Einbände für seinen Bildschirmhintergrund verwenden, allerdings existieren sie nicht in der dazu notwendigen hohen Auflösung. Also kommt man auf die Idee, eine Collage anzufertigen, will dies aber nicht von Hand machen. Dadurch kommt man zu einer Liste von Anforderungen:

  • Es soll ein Hintergrundbild in einer spezifizierten Auflösung und im Format PNG entstehen
  • Dieses Hintergrundbild kombiniert zwei zufällige Bilder aus der Sammlung - eines links oben und eines rechts unten
  • Damit der Bereich um die beiden Bilder nicht zu langweilig erscheint soll der restliche Bereich mit zufälligen Bildern an zufälligen Positionen gefüllt werden, die allerdings nicht mit der vollen Deckkraft gezeichnet werden sollen.
  • Um die beiden Bilder vom Hintergrund abzugrenzen, sollen sie mit vergrößerten, stark weichgezeichneten Versionen davon hinterlegt werden.
Diese Anforderungen sind mit einer Programmiersprache einfach umzusetzen. Man könnte dafür Ressourcen und vor allem Trinkwasser verschwenden und sich mit einem LLM so lange streiten, bis etwas entsteht, das eventuell mit einiger manueller Handarbeit etwas tut, was fast alle Anforderungen mehr schlecht als recht erfüllt oder irgendwann frustriert das Handtuch werfen. Oder - und lassen Sie mich bitte ausreden - man setzt sich hin und denkt bevor man beginnt.

Was wird eigentlich benötigt?

  • Bilder erzeugen können
  • Bilder laden
  • Bilder zwischen verschiedenen Formaten konvertieren können
  • Bilder skalieren
  • Bilder filtern
  • Bilder kombinieren
  • Metadaten von Bildern bestimmen
All das kann man mit einem Set von Werkzeugen erreichen, die bereits sehr lange existieren. Sie können hervorragend in Skripten eingesetzt werden und folgen der Unix-Philosophie: Jedes davon erledigt genau einen wohldefinierten Job - tut es aber dafür sehr gut. Die Rede ist von netpbm.

Zunächst zur Erzeugung eines Bildes:

ppmmake rgb:ff/80/80 1920 1200 >back.pam

Laden von Bildern

anytopnm '<path>/<source_file>.<suffix>' >source.pnm

Kombinieren von Bildern:

pamcomp -xoff=-100 -yoff=-100 source.pnm back.pam >intermediary.pam

Metadaten bestimmen:

WIDTH=$(pamfile source.pam|cut -d ',' -f 2|cut -d ' ' -f 2)
HEIGHT=$(pamfile source.pam|cut -d ',' -f 2|cut -d ' ' -f 4)

Zufallswert in einem vorgegebenen Bereich $MAX erzeugen:

RAND=$(($(dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -d' ' -f1) % $MAX))

Über alle Bilder in einem Verzeichnis in zufälliger Reihenfolge iterieren

#!/bin/bash -
SAVEIFS=$IFS
IFS=$'\n'; set -f
for i in `find "$1" -maxdepth 1 \( -iname '*.jpg' -o -iname '*.png' -o -iname '*.webm' \) -type f | shuf`
do
    # do something usefil here!
done
IFS=$SAVEIFS; set +f

Bilder skalieren:

pamscale -width "$ONESWIDTH" "/tmp/${ONEFILESTEM}.pnm" >"/tmp/S${ONEFILESTEM}.pnm"

Weichzeichner erzeugen...

pamgauss 27 27 -sigma=13 -maximize -tupletype=GRAYSCALE | pamtopnm >/tmp/gauss.pgm

und nutzen:

pnmconvol -nooffset -normalize /tmp/gauss.pgm "/tmp/S${ONEFILESTEM}.pnm" >convolved.pam

Ungefilterten Randbereich entfernen:

pnmcut -croptop=13 -cropleft=13 -cropbottom=13 -cropright=13 convolved.pam >"/tmp/B${ONEFILESTEM}.pnm"

Kombiniert man das geschickt, entsteht damit genau eine solche Collage, wie wir sie uns eingangs gewünscht haben. Das funktioniert ohne Internet, ohne Ressourcenverschwendung, ohne Skriptspracheninterpreter, ohne Laufzeitumgebung, ohne Compilieraufwand. Nur Bordmittel und der Wille, sich mit den bestehenden Werkzeugen auseinanderzusetzen und zu lernen!

Alle Artikel rss Wochenübersicht Monatsübersicht Codeberg Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • GeoJson Stadtplan-Generator

    10.04.2021

    Ich habe mich wieder einmal mit dem Generieren von Testdaten beschäfigt - dieses Mal sollte es eine Karte eines urbanen Gebietes, sozusagen ein Stadtplan sein.

    Weiterlesen

Neueste Artikel

  • Asymmetrische Kryptographie

    Ich habe mich mit der Idee schon länger getragen: Nochmal einen Rundumschlag zu asymmetrischer Kryptographie zu machen. Dabei werde ich mich auf Demonstrationen der einzelnen Konzepte und Operationen mit Beispielcode konzentrieren und zu jedem der vorgestellten Konzepte mehr oder weniger ausführlich bezüglich der Einsatzszenarien und Vor- und Nachteile Stellung beziehen

    Weiterlesen
  • Securing Transparent RMI

    Ich bitte um Entschuldigung für den denglischen Titel dieses Artikels. Ich habe vor vielen Jahren eine interessante Bibliothek gefunden, die noch aus meiner Arbeit am Institut für Neuroinformatik der TU Ilmenau heraus motiviert war.

    Weiterlesen
  • Voyager By Night - Live at Magnet House (2025 comeback show)

    Über Mastodon bin ich auf dieses Konzert gestoßen - und ich war sehr froh darüber!

    Weiterlesen

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muss damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen Codeberg-Repositories findet man hier.