Entwickler oder Entwicklerinnen die sich besonders schlau vorkommen …

… bauen gerne mal Konstrukte der folgenden Art:

$path = ltrim( end( @explode( get_template(), str_replace( '\\', '/', dirname( __FILE__ ) ) ) ), '/' );

Sortiert sieht es dann so aus:

$path = ltrim(
    end(
        @explode(
            get_template(),
            str_replace('\\', '/', dirname(__FILE__))
        )
    ), 
    '/'
);

Zum Kontext: diese Zeile stammt aus einem kommerziellen WordPress-Template und es soll der letzte Teil des Pfadnamens des aktuell ausgeführten Skripts bestimmt werden. Aus /var/www/wordpress/wp-content/themes/valenti/option-tree soll also option-tree werden.

Von innen nach außen:

  • dirname(__FILE__) liefert den Pfadanteil des aktuell ausgeführten PHP-Skriptes; aus /var/www/wordpress/wp-content/themes/valenti/option-tree/ot-loader.php wird also /var/www/wordpress/wp-content/themes/valenti/option-tree
  • str_replace('\\', '/', …) ersetzt den Backslash (vermutlich als Workaround für Windows-Systeme) mit einem Slash, der Pfad bleibt auf einem unixoiden System also erstmal unverändert (es sei denn, er enthält tatsächlich den Backslash)
  • get_template() liefert den Namen des aktiven WordPress-Templates, in diesem Fall valenti
  • explode() trennt den Pfadnamen in einzelne Teile, und zwar an jeder Stelle an der der String valenti vorkommt; man erhält also dieses Array: [0 => '/var/www/wordpress/wp-content/themes/', 1 => '/option-tree']
  • end() liefert den Wert des letzten Elements des Arrays: /option-tree
  • ltrim(…, '/') entfernt zum Schluss den Slash am Anfang des Strings, so dass wir das Ergebnis erhalten: option-tree

Soweit, so gut.

Diese Variante hat unter Umständen einige Probleme, Backslashes im Pfadnamen könnten eines davon sein. Unterdrückte Fehlermeldungen mit dem @-Operator könnte zu weiteren Hässlichkeiten beim Debugging führen.

Aber das Hauptproblem ist, dass der Entwickler oder die Entwicklerin hier eine komplexe Lösung für ein einfaches Problem geschaffen hat. PHP löst die gegebene Fragestellung nämlich mit Bordmitteln viel eleganter und zudem fehlerunanfällig und OS-unabhängig:

$path = basename(__DIR__);

Keine Ursache.

EurKEY – The European Keyboard Layout

Den Link zum EurKEY-Tastaturlayout hatte ich bereits vor einiger Zeit als Bookmark gepostet, muss jetzt aber doch noch mal kurz darauf eingehen.

EurKEY ist ein von Steffen Brüntjen entwickeltes Tastaturlayout, welches sich vieler Probleme vorhandener Belegungen annimmt und quasi ein „Best of“ bietet. Dabei bleibt das Grundlayout der bekannten „QWERT…“-Belegung treu.

Die Belegung der Tasten mit ohne ohne Umschalt-Taste ist erstmal identisch mit dem US-amerikanischen Tastaturlayout. Da ich meine Rechner seit jeher mit US-amerikanischen Keyboards kaufe, änderte sich für mich auf den ersten Blick also nichts. Interessant wird es, sobald die Tasten Alt und Shift+Alt ins Spiel kommen.

Am besten erklärt sich das anhand eines Beispiels: die Eingabe deutscher Umlaute. Mit dem normalen US-Tastaturlayout unter macOS muss man für ein ä erst Alt+u und danach a tippen (vgl. diakritisches Zeichen). Das stört den Schreibfluss erheblich.

EurKEY erleichtert die Eingabe dieser Zeichen deutlich: es reicht hier Alt+a zu drücken, um den Umlaut zu erhalten. Das große Ä wird einfach per Shift+Alt+a erzeugt. Ähnlich einfach kann man die meisten im europäischen Raum benutzten Zeichen eingeben, ein ß etwa wird per Alt+s erzeugt.

Das Eingeben spezieller Zeichen mit den sogenannten Composition Keys (Alt, Shift+Alt) gibt es unter macOS seit jeher – die Logik hinter der Belegung ist mir aber nie klar geworden. Und bis auf eine Handvoll Sonderzeichen konnte ich mir die Tastenbelegung auch nie merken. EurKEY räumt mit dem Chaos auf und belegt die Tasten sinnvoll – sowohl für das Schreiben von Texten als auch für das Programmieren.

Ich empfehle, sich mal mit EurKEY auseinanderzusetzen – ich habe es jedenfalls keine Sekunde bereut.

EurKEY ist für die Plattformen Windows, macOS und Linux erhältlich.

Pipes, oder: eine von vielen Dingen, die mich an Unix begeistern

Oft benötige ich für meine lokale Entwicklungsumgebung die aktuelle Struktur und die Inhalte der Datenbank des Produktivsystems. Ein möglicher Ablauf, um die Daten aus dem Produktiv-Datenbankserver herauszuholen und lokal zu importieren könnte so aussehen:

  1. Einloggen auf dem Server
  2. per mysqldump eine Datei mit allen SQL-Statements zum Erzeugen der Datenbank samt ihrer Daten schreiben
  3. Den Dump mit gzip oder bzip2 komprimieren
  4. Diese Datei mit scp oder rsync auf den lokalen Rechner herunterladen und in die Entwicklungs-Virtual-Machine kopieren
  5. Einloggen auf der Entwicklungs-VM
  6. Entpacken sowie Importieren des Dumps

Oder man macht es einfach als Einzeiler auf der Shell:

ssh server "mysqldump --opt db_name | gzip -c" | ssh vagrant "gzip -dc | mysql db_name"

Wahlweise kann man auch noch pv als Fortschrittsanzeige dazwischenschalten:

ssh server "mysqldump --opt db_name | gzip -c" | pv | ssh vagrant "gzip -dc | mysql db_name"

(Der Einfachheit halber sind Dinge wie das Erstellen eines Locks auf den Tabellen usw. weggelassen)

Mit Hilfe des Pipes-Konzepts lässt sich der Ausgabestream eines Kommandos als Eingabestream eines anderen Kommandos verwenden, ohne dass temporäre Dateien angelegt und herumkopiert werden müssen. Es dürfte sich neben der „Everything is a file“-Philosophie¹ um eines der praktischsten Dinge von Unix sein.

¹ Eine Pipe hat übrigens auch einen file descriptor (aber keinen zugewiesenen Pfad).

Infografik: Rad fahren in 2016

Wie auch im letzten Jahr kann man sich auf veloviewer.com eine schicke Infografik der vergangenen Radfahr-Saison erstellen lassen. Mein Ziel, mehr Strecke als im Vorjahr zurückzulegen habe ich nicht erreicht, zum Schluss fehlten knapp 300 km. Ist aber nicht schlimm, vielleicht klappt’s ja in diesem Jahr!

Zum Vergleich die 2015er Grafik:

miniflux: Feedreader selbstgehostet

miniflux ist eine Webapplikation, welche die Aufgaben von Feed-Aggregator und Feed-Reader übernimmt. miniflux ist in PHP geschrieben und lässt sich so sehr einfach auf einem eigenen Server oder Webspace hosten und hat jetzt bei mir seit kurzer Zeit Fever° abgelöst.

Vor zwei Jahre hatte ich in einem Blogpost beschrieben, dass ich meine RSS-Feeds mit Fever° aggregieren lasse und sie dann mit Reeder (iOS und macOS) lese. Diese Lösung arbeitet bis heute zuverlässig, wenngleich das Feed-Management mit Fever° manchmal etwas umständlich ist. Auch gibt es seit längerer Zeit keine Updates mehr für Fever°, sodass irgendwann sowieso eine Ablösung angestanden hätte.

miniflux

Beim von mir sehr geschätzten Felix Schwenzel las ich letztens, dass er von Fever° auf miniflux gewechselt ist und die Software für ihn zufriedenstellend funktioniert. Sein beschriebener Einsatzbereich deckt sich mit meinem, sodass ich mir miniflux direkt einmal zum Testen installierte. Meine Feed-Abos konnte ich per OPML-Datei in Fever° ex- und in miniflux wieder importieren.

Die hohe Geschwindigkeit war der erste positive Eindruck nach dem Aufrufen von miniflux. Das Webinterface reagiert augenblicklich auf Klicks, man hat zu keiner Zeit das Gefühl auf die Antwort des Servers warten zu müssen. Damit taugt miniflux im Gegensatz zu Fever° auch als webbasierter Feed-Reader. Selbstverständlich bietet miniflux auch ein responsives Interface, welches auf Telefonen, Tablets und Desktop gleichermaßen gut funktioniert. Viele Funktionen lassen sich auch per Tastatur-Shortcuts und Touchscreen-Gesten ausführen.

miniflux bietet weiterhin ein API, oder genauer gesagt, zwei APIs. Eins davon ist kompatibel mit dem API von Fever°, was es ermöglicht, weiterhin Reeder als Feed-Reader zu benutzen. So konnte ich meine Reeder-Instanzen schnell mit den Zugangsdaten von miniflux versorgen und mehr oder weniger nahtlos meine Feed-Abos weiterlesen.

Alles in allem kommt miniflux dem klassischen Google Reader in vielen Belangen ziemlich nahe – sei es das (im Gegensatz zu Fever°) gut nutzbare Webinterface oder die praktischen APIs. Der Wechsel von Fever° fiel mir so alles andere als schwer.

miniflux ist Open Source, das Projekt ist bei Github zu finden. Ich habe dort zwischenzeitlich schon drei kleine Pull-Requests eingereicht, die tatsächlich auch ihren Weg in den Master-Branch gefunden haben :-)