Pipes, oder: eine von vielen Dingen, dich 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"

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 :-)

Island: Unterlauf der Blanda

Aufgenommen bei Bólstaðarhlíð. Hier zweigt die Straße 731 von der Ringstraße 1 nach Süden ab und quert sogleich die Blanda (Brücke im Bild). Folgt man der Straße 731, gelangt man nach kurzer Zeit zur Straße 35. Auf dieser kann man auf unbefestigtem Untergrund das isländische Hochland überqueren, bevor man im Süden beim berühmten Gullfoss-Wasserfall wieder in bequemer befahrbarem Gelände landet.

blanda

VW Touran 1.6 FSI: Benzinverbrauch über sieben Jahre

In einer Großstadt wie hier in Berlin gehört ein Auto definitiv zum weniger sinnvollen Besitzstand. Sofern man seinen Arbeitsalltag ebenfalls innerhalb der Stadtgrenzen verbringt, gibt meiner Meinung nach keinen validen Grund, das Kraftfahrzeug für das tägliche Hin und Her zu benutzen. Wenn dann zusätzlich der ÖPNV in einer Haltestellen- und Taktdichte wie in Berlin zur Verfügung steht, gehen einem auch die letzten Argumente für das Fahren im motorisierten Individualverkehr aus. Mal abgesehen davon, dass es ja auch andere Transportmittel wie z. B. das Fahrrad gibt.

Trotzdem gehört hier zum Haushalt seit nunmehr über sieben Jahren ein VW Touran der ersten Generation mit 1.6 FSI-Motor (85 kW) und 6-Gang-Schaltgetriebe. Tatsächlich wird das Fahrzeug auch hin und wieder bewegt. Meist handelt es sich Touren welche die Stadtgrenzen deutlich hinter sich lassen. Diese wechseln sich ab mit Zeiten längeren Stillstands – im Winter war durchaus auch schon mal die Batterie leer nachdem das Auto mal wieder einige Wochen Wurzeln geschlagen hat.

Ich habe seit der ersten Tankfüllung Buch geführt und Datum, Kilometerstand, Benzinmenge und Preis notiert. Die iOS-App FillPro (auf Deutsch eingestellten Geräten heißt sie TankPro) leistet hier bis heute gute Dienste, auch wenn sie seit Anfang 2015 schon nicht mehr im App Store zu finden ist.

Ich habe letztens mal die Daten aus FillPro exportiert und in ein Numbers-Spreadsheet übernommen. Nachfolgend habe ich meine Erkenntnisse kurz zusammengefasst.

Seit Juli 2009 hat der Touran 142 Tankfüllungen bekommen, dabei wurden 5.602,44 Liter Super getankt.

Insgesamt hat der Spaß 8.210,52 Euro gekostet, was einen durchschnittlichen Preis von 1,46 Euro pro Liter Super ergibt.

Mit dieser Benzinmenge ist das Auto bisher 71.165 Kilometer gefahren – das entspricht einem durchschnittlichen Verbrauch von 7,8 Liter pro 100 Kilometer. Die Verbrauchswerte schwanken relativ stark zwischen 5,74 Liter pro 100 Kilometer und 10,11 Liter pro 100 Kilometer. Den Haupteinfluss hat hierbei der Fahrer. Ich selbst habe es fast nie geschafft, über 9 Liter pro 100 Kilometer zu verbrauchen. Sobald das Auto aber mal verliehen war, sprangen die Werte fast immer deutlich nach oben.

2016 ist übrigens bisher das preiswerteste Jahr für die Benzinbeschaffung: 1,29 Euro kostete der Liter Super durchschnittlich. 2012 war mit 1,64 Euro pro Liter deutlich teurer. Die Extremwerte einzelner Tankfüllungen liegen bei 1,73 Euro pro Liter und 1,18 Euro pro Liter.

Nachfolgend habe ich noch mal alle 142 Tankfüllungen in zwei Diagramme komprimiert. Zu sehen sind die Entwicklung des Benzinpreises und des durchschnittlichen Verbrauchs:

Benzinpreis
Verbrauch

Mond und Venus

Am Abend des 3. Dezember 2016 standen Mond und Venus relativ dicht übereinander am Südwesthimmel. Etwas weiter östlich ließ sich später auch noch Mars blicken – allerdings nicht auf diesem Foto ;-)

2016-12-03

Akkutausch am iPhone 6

Nach zwei Jahren und rund 650 Ladezyklen ließ mich der Akku meines iPhone 6 in letzter Zeit immer öfter im Stich. Das Telefon verlangte zuletzt bereits um die Mittagszeit das Ladekabel. Nicht selten musste der Akku am Abend ein weiteres Mal aufgeladen werden, damit ich für die Zeit bis zur Nachtruhe ein funktionierendes Telefon zur Verfügung hatte.

Ich habe mir dann bei iFixIt kurz die Anleitung zum Aus- und Einbau der iPhone-Batterien angeschaut und als für mich machbar eingestuft. Praktisch: eine neue Batterie kann man direkt im Online-Shop von iFixIt kaufen. Da ich vor einer Weile beim Wechsel der Batterie meines iPhone 5 bereits gute Erfahrungen mit dem iFixIt-Store gemacht hatte, bestellte ich auch den Akku für das iPhone 6 dort. Keine 24 Stunden später kam das Paket und ich konnte loslegen.

Der Akku ist im iPhone 6 verklebt, was den Wechsel etwas fummeliger macht, als noch beim iPhone 5. Mit Geduld (!) bekommt man die Klebestreifen aber sauber herausgezogen – ohne dass sie reißen. Der Griff zum Fön blieb mir daher zum Glück erspart.

Akku iPhone 6
Der neue Akku wird zum ersten Mal geladen

Ein paar Minuten später war dann auch der neue Akku eingebaut und das Telefon wieder zusammengesetzt – die bebilderten Anleitungen von iFixIt sind hier echt Gold wert!

Fazit: Wer in der Lage ist, einen kleinen Schraubendreher ruhig zu halten und richtig herum zu drehen, kann beim Akku-Tausch eine Menge Geld sparen.

Apple oder offizielle Service-Partner rufen 100 Euro für den Batterie-Wechsel auf, der Akku bei iFixIt kostet dagegen nur 35 Euro bzw. 40 Euro wenn man das Set inklusive der passenden Werkzeuge bestellt. Es bleiben 60 Euro oder sogar 65 Euro übrig, die man für andere Dinge ausgeben kann.

Update 2016-09-28: Nach anderthalb Wochen kann ich sagen, dass sich der Tausch gelohnt hat. Das Telefon muss jetzt im Laufe des Tages nicht mehr nachgeladen werden, sondern hat genug Akkuladung um problemlos über den ganzen Tag zu kommen. Mittags zeigt der Ladebalken oft noch um die 70 % an und erst spätabends kommt dann hin und wieder die Warnung, dass der Akku unter 20 % geladen ist.

Workaround für PHP Bug #43225

In PHP gibt es einen Bug, der dazu führt, dass die Funktion fputcsv unter Umständen fehlerhaftes CSV generiert, welches dann von Programmen nicht mehr eingelesen werden kann.

Der Fehler tritt auf, wenn in einem Feldwert ein Backslash \ vorkommt, der direkt von einem doppelten Anführungszeichen " („double quote“) gefolgt wird. Ein Beispiel:

$data = [
    'CMXINV',
    '-1001338',
    'Some string data here: "quoted text // highlight string \\\\" and "foo" bar',
    'baz'
];

Hier folgt auf die zwei Backslashes[1] direkt ein doppeltes Anführungszeichen.

Erzeugt man aus dem $data-Array mit fputcsv eine CSV-Zeile, erwartet man folgende Ausgabe:

CMXINV;-1001338;"Some string data here: ""quoted text // highlight string \\"" and ""foo"" bar";baz

Tatsächlich erhält man aber:

CMXINV;-1001338;"Some string data here: ""quoted text // highlight string \\" and ""foo"" bar";baz

Bei genauem Hinschauen erkennt man, dass hinter den beiden Backslashes nur ein doppeltes Anführungszeichen steht, obwohl es zwei sein sollten[2].

Dieses Verhalten ist als PHP Bug 43225 bereits 2007 dokumentiert worden und wurde bis heute nicht korrigiert.

Ich setze fputcsv in meiner Open Source Library für Collmex ein. Jegliche Kommunikation mit der Collmex-API geschieht über das Senden und Empfangen von Nachrichten im CSV-Format. Bei einem Projekt trat nun der Fall auf, dass in einem Feld tatsächlich Backslashes vor doppelten Anführungszeichen standen und Collmex den erzeugten fehlerhaften Datensatz nicht lesen konnte. Ich habe jetzt einen Workaround in der Collmex-Library eingebaut, mit der dieser spezielle Fehler nicht mehr auftritt.

Der Workaround macht nichts anderes als vor dem Aufruf von fputcsv temporär einen String zwischen Backslash und doppeltem Anführungszeichen einzufügen und ihn nach dem Erzeugen der CSV-Daten wieder zu entfernen. Die Details lassen sich in der betreffenden Quelldatei bei Github ansehen.


[1] Es sind hier vier Backslashes zu sehen, weil das Backslash-Zeichen zum „escapen“ benutzt wird und selbst auch escaped werden muss – durch einen weiteren Backslash.
[2] Ähnlich wie bei [1] muss ein doppeltes Anführungszeichen durch ein weiteres doppeltes Anführungszeichen „escaped“ werden, wenn die Feldwerte durch ein doppeltes Anführungszeichen eingeschlossen werden.