Willkommen auf pberndt.com, der privaten Homepage von Phillip Berndt. Diese Webseite dient der Information über mich, meine Arbeit und als Downloadportal für meine Projekte.
Unter anderem finden sich hier Anyfreewhere, eine simple VNC Applikation, sowie die phpBB Highlighting Mod, die fast alle Sprachen schnell und einfach hervorhebt.
Ich habe in letzter Zeit wieder einige praktische Scripte in mein Repository übernommen, die vielleicht praktisch sein könnten. Daher stelle ich dir mal kurz vor:
bind()
Aufrufe
abzufangen und damit Prozessen transparent die Möglichkeit zu geben,
priviligierte Ports zu verwenden, bietet es einen eigenen Aufruf, der
Sockets an priviligierte Ports bindet. Das funktioniert, indem der
Dateideskriptor an einen Prozess mit cap_net_bind_service
übergeben wird; im Gegensatz zu den älteren Ansätzen nicht kompliziert per
sendmsg
über ein UNIX-Socket, sondern einfach, indem das
Socket vor dem execv
Aufruf nicht geschlossen wird.pydoce os.path.isfile
öffnet z.B. das path Modul gleich an der richtigen Zeile.Schon älter ist, und nichts mit Python zu tun hat, gdo. Ich
benutze das so wahnsinnig viel, dass ich das noch einmal verlinken musste: Das ist ein Tool, das
i.W. find -regextype pcre -iregex "$1" -exec "$2" \;
entspricht.
In letzter Zeit habe ich pqiv mal wieder etwas mehr Zeit gewidmet. In meinem wissenschaftlichen Alltag speichere ich Plots in aller Regel direkt als Postscript oder PDF Datei, damit ich für die Einbindung in ein Paper direkt ideale Qualität habe, ohne doppelte Arbeit zu haben. Nachteil dieser Praxis ist, dass es aufwendig ist, schnell durch Serien von Plots zu schauen, die z.B. während langer Simulationen regelmäßig zwecks Übersicht weggespeichert werden. Da ich in pqiv 2.x ohnehin Cairo zum Zeichnen verwende, ist die Einbindung von Poppler extrem simpel: Das rendert in einer Zeile eine PDF auf eine Cairo Oberfläche. Von daher bot es sich an, das mal nachzurüsten.
Aufwendiger war es, das schön zu machen. Ich hatte bislang gdk-pixbuf fest mit pqiv verdrahtet, weil ich beim Designen nicht davon ausgegangen war, dass ich einmal mehr Backends als nur das verwenden will. Diese Verknüpfung ist nun aufgehoben, sodass das Nachrüsten von Backends extrem einfach geworden ist. (Der gesamte Poppler Code ist z.B. derzeit nur 179 Zeilen inklusive Kommentaren lang.)
Ich habe mich für's erste an meinen Bedürfnissen orientiert und neben Poppler nur durch libspectre Postscript-Support eingebaut. Für Spezialanwendungen dürfte aber selbst so etwas wie ein gnuplot Backend machbar sein, falls jemand daran interessiert ist ;) Nebenbei kamen durch die Umbauten noch besserer BSD-Support, diverse Bugfixes und allgemein bessere Stabilität als Gimmick hinzu, denn beim ausgiebigen, inzwischen automatisierten, Testen habe ich einige Probleme gefunden & behoben.
Wer an den Änderungen interessiert ist, findet hinter dem Merge-Commit noch die Versionsgeschichte der Umbauten.
pqiv 2.0 ist vor inzwischen wieder einer ganzen Weile erschienen und steht bereits in den Testversionen von Debian und Gentoo zur Verfügung. Während im Vergleich zur hier angekündigten rc-Version nicht mehr viel passiert ist, wird die kommende Version 2.1 einige große Änderungen bringen:
Sie fügt per inotify automatisch neue Dateien zur Dateiliste hinzu, gibt endgültig den Namen qiv auf, bringt Überblendungen zwischen Bildern zurück - schicker als je zuvor, denn diesmal funktioniert der Effekt für beliebige Bilder, kommt besser mit dem Nachladen großer Bilder zurecht, schont die CPU beim Neuzeichnen von Bildern, indem mehr gecached wird, bringt einen neuen „low memory“ Modus, der alle Zwischenspeicher so weit wie möglich abschaltet, und ermöglicht das Laden der Bilder im einem „lazy mode“, bei dem das Fenster bereits angezeigt wird, bevor alle Bilder geladen worden sind. Auf letzteres Feature bin ich ein wenig stolz, denn richtig sortiert werden die nachgeladenen Bilder trotzdem. Das erreiche ich, indem ich statt der Dateiliste einen order-statistic AVL Baum verwende. Das ist ein Suchbaum, in dem zusätzlich, ebenfalls in O(log n), per Index auf Elemente zugegriffen werden kann. Da ich so etwas nicht in fertig für C gefunden habe, habe ich mir einen selbst geschrieben: Das Projekt habe ich bostree (binary order statistic tree) genannt.
In other, unrelated news: Ich habe die Homepage auf einen Server umgezogen, über den ich etwas mehr Kontrolle habe. Meinen alten Hoster musste ich dafür leider ganz verlassen, weil man mir keine Hoheit über die DNS-Einträge geben wollte. Nun liegt die Domain bei Host Europe. Dadurch gibt es hier endlich den ganzen Technik-Schnickschnack, der schon lange überfällig war: IPv6, SSL und für Email DKIM und SPF. Und bei Gelegenheit habe ich die Seite mal auf UTF-8 umgestellt.
Für meinen Bildbetrachter pqiv gibt es ein großes Update. Zunächst ein kleines: Version 0.13 springt auf 1.0, denn das Release mit einem kleinen neuen Feature (anpassbare Fenstertitel) wird das letzte in dieser Reihe sein. pqiv 2.0 wird demnächst als komplettes Rewrite mit GTK 3 erscheinen.
Zunächst einmal hatte ich ja mal eine Portierung angekündigt. Während der Arbeit daran habe ich aber gemerkt, dass ich einige Konzepte von GTK erst jetzt richtig verstehe und dass sich einige auch mit der neuen Version geändert haben. Das ganze neu zu schreiben erschien mir da angebracht.
Die neue Version läuft mit GTK 3 und Cairo, ist aber rückwärtskompatibel mit den neueren Versionen von GTK 2. Einige aus heutiger Sicht unnütze Features werden verschwinden, dafür kommt auch ein neues, das mir schon länger gefehlt hat: pqiv lädt das kommende Bild schon vorab in den Speicher, sodass bei Albenpräsentationen nach Betätigung der Leertaste auch wirklich sofort das nächste Bild zu sehen ist. Außerdem ist die neue Version dank saubererer Verwendung der Schnittstelle zum Display Server und intensivem Testen mit verschiedenen Fenster Managern (mutter, muffin, xfwm, i3 und etwas am Rande auch mingw32) deutlich kompatibler und hat weniger Macken.
Ich freue mich, wenn jemand das schon testen will & Feedback gibt!
Den Code gibt es im
Rewrite Branch auf Github. Kompilieren geht einfach per
make
, ./configure
ist noch optional.
Meine Eltern haben einen Philips Fernseher, der über einen OpenWRT-WLAN-Router in das eigentliche LAN eingebunden ist. Ich hatte mir - eigentlich schon über Weihnachten - vorgenommen, herauszufinden, warum der Computer den Fernseher nicht via UPnP als Ausgabegerät findet. Am Netzwerk lag es nicht, Multicast-Routing hatte ich eingerichtet und in die andere Richtung hat auch alles funktioniert.
Jetzt an Ostern war ich wieder einmal zu Hause und hatte Gelegenheit, noch einmal herumzuexperimentieren: Anscheinend hat der Fernseher einen Bug. In der UPnP-Spezifikation tauschen Geräte über UDP/Port 1900 per Multicast HTTP-Nachrichten aus, um einander zu finden. Über eine weitere URL, die dann per TCP aufgerufen wird, lädt sich jedes interessierte Gerät dann nähere Informationen herunter. Es gibt nun zwei verschiede Mechanismen: Zum einen senden alle Geräte ab und zu ein "NOTIFY"-Request, in dem sie ihre Präsenz ankündigen. Der andere Mechanismus ist eine aktive Suche, bei der ein Gerät ein "M-SEARCH" an dieselbe Adresse schickt und alle Geräte eine HTTP-Antwort speziell an den Fragenden zurücksenden.
Letzterer Mechanismus funktioniert auf dem Fernseher offenbar nicht. Und auch bei dem Notify gibt es Probleme, denn im laufenden Betrieb sendet er bisweilen eine Nachricht ins Netz, in der er sich aus dem Verbund abmeldet. Und danach ist dann Funkstille.
Ich habe einen kleinen Dämon geschrieben, den man auf seinem Router laufen lassen kann, der das Problem angeht. Er cached die NOTIFY-Nachrichten und antwortet auf M-SEARCH Anfragen mit Antworten aus diesem Cache. Dabei halte ich mich nicht gänzlich an die Spezifikation und erzeuge einigen unnötigen Traffic, aber dafür finden alle Geräte jetzt den Fernseher und ich kann endlich von meinem Handy aus Videos vom PC auf dem Fernseher starten. Schick.
Außerdem kann man den Dämon auf einen Router zwischen zwei gerouteten Netzwerken setzen und kann sich auf die Weise Multicast-Routing komplett sparen. Auch nützlich.
Wer will: Auf Github gibt es ein Repository.