Sascha Hagedorn

Full Slack Developer

Urlaubslektüre (Updated)

Ich bin gerade auf Sardinien (Yay!) und eine meiner morgendlichen Routinen besteht darin mir auf Pocket ein paar Artikel und Blogposts aus der Liste der empfohlenen Inhalte zusammen zu klicken. Die werden automatisch heruntergeladen und ich kann sie dann am Strand lesen. Neben Pocket auf dem iPhone lese ich längere Artikel oder Bücher auf dem Kindle. Die schicke ich einfach an meine Kindle E-Mailadresse oder füge sie direkt über eine Browserextension hinzu. Hier ist eine Liste an Dingen die ich bisher gelesen habe:

RAM Verbrauch in docker stats unter Debian fixen

Ich hab neulich auf meinem Docker Host bemerkt, dass der Arbeitsspeicherverbrauch meiner Container in docker stats gar nicht angezeigt wird. Mit docker stats $(docker ps --format={{.Names}}) werden Statistiken zu den Containern angezeigt, so z. B. Arbeitsspeicherverbrauch, CPU Last und Net I/O.

Und natürlich hatte jemand schon einmal dieses Problem. Da Control Groups standardmäßig deaktiviert sind werden die relevanten Daten aus den Containern dem Host System nicht freigegeben. Das Hinzufügen von cgroup_enable=memory in /etc/default/grub fixte dieses Problem.

Vorbei gescrollt: Cozy

Cozy ist eine All-In-One Lösung die mit verschiedenen Apps Dienste wie Kalender, Kontakte, Datensync und einiges mehr anbietet. Selbst gehostet versteht sich. Unter der Haube mit NodeJS und CouchDB.

Store, sync, and share your data just the way you want it.

Als Alternative zu OwnCloud vielleicht interessant.

Vlogs der Tour de France

Die Tour de France ist vorbei und schön war es. Ich habe die Tour sporadisch über Eurosport verfolgt, aber was mir am meisten Spaß gemacht hat sind die Vlogs von ORICA Bike Exchange und Marks Cycling Maven.

Die Vlogs sind weniger Rennberichterstattung als ein Blick hinter die Kulissen. Besonders das Gefühl dabei zu sein und einen ungeschönten Blick der Tour zu bekommen gelingt mit den täglichen Videos besonders gut. Beim Team ORICA fast mit im Bus zu sitzen, zu sehen wie sie Witze über andere Teammitglieder machen, die bevorstehende Stage auswerten oder einfach nur mit den Fans feiern — daß macht Spaß und erweitern so den Sport sehr gut von einem reinen Sportevent auf eine persönlichere Ebene.
Der Vlog von Mark dagegen ist aus der Perspektive eines Radsporttouries mit Privilegien. Mit einem Presseausweis schafft er es direkt neben Cavendish beim Warmfahren zu stehen, auf einem Motorrad mit dem Peloton mitzufahren oder eine Tour durch einen TV Übertragungswagen zu geben (die übrigens vor und nach jeder Stage in rasender Geschwindigkeit auf- und abgebaut werden). Nebenbei fängt die Atmosphäre am Rand der Strecke ein und trifft jede Menge Leute.

Podcast: Aufwachen!

Der Marcus hat mir letztens den Podcast Aufwachen! empfohlen. Darin wird die politische Medienlandschaft von Tilo Jung und Stefan Schulz auseinandergenommen und analysiert. Abonniert!

Epic Climbs: Mirador de La Cumbrecita

Es gibt Anstiege die vergisst man nicht. Vor allem nicht, wenn es einer der ersten wirklich heftigen Anstiege ist die man jemals gefahren ist. 2015 war ich zusammen mit Susi auf der kanarischen Insel La Palma. Im Jahr zuvor hatte ich mir einen Cyclocrosser gekauft und war angefixt vom Radfahren. Also liehen wir uns vor Ort Rennräder aus und erkundeten so die schönen Ecken der Insel.

Eine Tour die wir uns ausgesucht hatten ging in den Nationalpark La Palmas, Parque Nacional de la Caldera de Taburiente, hoch zum Roque de Los Cuervos. Der Weg dorthin geht teils durch Stadtgebiet, also nicht schlecht zum warm fahren. Hinter El Paso biegt man links ab in den Nationalpark und nach ein paar hundert Metern beginnt schon das Segment.

Der Anstieg wird von Strava in der Kategorie 2 angesiedelt und wird damit als mittelschwer eingestuft. Über 5,9km kann hier 483m aufgestiegen werden. Das macht 8,2% Steigung im Durchschnitt mit Einzelstücken um die 13%. Gar nicht so übel.

Durch einen Nadelwald geht es erst an kleineren Häusern vorbei, auf einer immer steiler werdenden Straße. Autoverkehr gibt es dort so gut wie keinen. Nur weitere Touristen die auch hoch zum Berg wollen, das sind allerdings nicht viele. Parkplätze sind oben nur begrenzt verfügbar.

Wir, als ungeübte aus dem Flachland, hatten dort ganz schön zu kämpfen und machten ein paar Pausen um Luft zu schnappen. Nach circa 52 Minuten kamen wir oben an und konnten die Aussicht über den Nationalpark und die Caldera genießen. Keine Bestzeit, aber wir waren trotzdem stolz wie Bolle. 483 Höhenmeter müssen erst einmal überwunden werden. Ein ziemlich tolles Gefühl.

Sehr gute Straßenverhältnisse

Sehr gute Straßenverhältnisse

Die letzten Höhenmeter

Die letzten Höhenmeter

Belohnung: Blick über die Caldera

Belohnung: Blick über die Caldera

Vorbei gescrollt: Home Assistant

Gerade an mir vorbei gescrollt: Home Assistant.

Home Assistant is an open-source home automation platform running on Python 3. Track and control all devices at home and automate control. Installation in less than a minute.

Demnächst mal ausprobieren.

Huginn für Release-Notifications nutzen

Huginn ist eine Platform mit der datengetriebene Agenten erstellt werden können. Diese Agenten können für einen Aufgaben im Internet erledigen und auf die Ergebnisse dieser Aufgaben reagieren. Huginn funktioniert nach dem Prinzip „wenn das passiert dann mache das“, bekannt von IFTTT, nur kann Huginn selbst gehostet werden.

Ein guter Einstieg in Huginn ist es sich erst einmal ein einfaches Szenario auszudenken. Ich habe mir überlegt, dass ich eine Pushnachricht über Pushover bekommen möchte wenn von Baïkal ein neues Release zur Verfügung steht, damit ich meine Installation updaten kann. Eine fertige Agentenliste für diesen Anwendungsfall könnte so aussehen:

Liste von Huginn Agenten

Es gibt drei Agenten: ein Agenten der die Release Informationen von Außen in das System holt – „Baïkal Release Source“, ein Agent der ein Event empfängt und es wieder im System versendet – „Baïkal Release Message Formatter“ und ein Agent der Nachrichten aus dem System heraus verschickt – „Push Notification Emitter“. Gehen wir die drei Agenten mal im Detail durch.

Baïkal Release Source

Als erstes soll Huginn feststellen, dass es von Baïkal ein neues Release gibt. Dazu habe ich den Website Agenten „Baïkal Release Source“ definiert. Dieser Agent lädt jeden Tag die release.atom des GitHub Projektes herunter und vergleicht den Inhalt mit der zu letzt heruntergeladenen Version. Weichen diese von einander ab wird ein Event produziert. Der Agent kann auch den Inhalt der Datei analysieren und Werte herausfiltern, das eignet sich gut um die neue Versionsnummer dem Event hinzuzufügen. Den Agenten habe ich so konfiguriert, dass über XPATH aus der Liste der Release Einträge, aus dem Neusten die Versionsnummer herausgefiltert wird:

{
  "expected_update_period_in_days": "365",
  "url": "https://github.com/fruux/Baikal/releases.atom",
  "type": "xml",
  "mode": "on_change",
  "extract": {
    "version": {
      "xpath": "(//feed/entry/title)[1]",
      "value": ".//text()"
    }
  }
}

Da unklar ist, wann ein neues Release kommt, habe ich die Option expected_update_period_in_days auf 365 Tage gesetzt. Gibt es ein neuen Eintrag in der Feedliste produziert dieser Agent im System ein Event mit dem Inhalt { "version": "..." }.

Baïkal Release Message Formatter

Dieser Agent bekommt vom Agenten „Baïkal Release Source“ das Event welches die Versionssnummer enthält. Da ich den Pushnotification Agenten so generisch wie möglich halten möchte, erstelle ich ein neues Event welches das version Feld aus dem ursprünglichen Event in eine aussagekräftige Nachricht verpackt. Dieses Event wird dann an den Pushnotification Agenten geschickt.

{
  "instructions": {
    "message": "Baïkal updated to version {{version}}",
    "agent": "{{agent.type}}",
    "title": "New Release for Baïkal"
  },
  "matchers": [

  ],
  "mode": "clean"
}

Push Notification Emitter

Der letzte Agent empfängt Events und verschickt diese über Pushover. Für diesen Agenten benötigt man einen API Key, den man sich bei Pushover besorgen kann. In diesem Agenten passiert lediglich ein Mapping von title und message auf ein POST Request zu Pushover.

{
  "token": "pushover-application-token",
  "user": "pushover-user-token",
  "message": "{{message}}",
  "device": "",
  "title": "{{title}}",
  "url": "",
  "url_title": "",
  "priority": "0",
  "sound": "pushover",
  "retry": "0",
  "expire": "0",
  "expected_receive_period_in_days": "1"
}

Sind alle drei Agenten konfiguriert und als Flow verknüpft, so fängt Huginn an im definierten Intervall die release.atom von Baïkal herunterzuladen und zu analysieren. Bei einer Änderung wird eine Pushnachricht verschickt. Yay!

Von Pushover versendete Notification

Von Pushover versendete Notification

Es gibt noch zahlreiche andere Anwendungsfälle und beliebig komplizierte Flows die sich mit Huginn abbilden lassen. Im Wiki von Huginn gibt es noch ein paar Beispiele für Agenten.

Wieso sehen Zielfotos so komisch aus?

Gerade läuft die Tour de France und es gab einige Fotofinishes. So auch auf der Stage 16, wo Peter Sagan vor Alexander Kristoff ins Ziel kam.

Tour de France 2016 Stage 16 Fotofinish

Schaut man sich das Zielfoto an, so fällt gleich auf, dass der Boden nur aus Linien besteht, aber die Schatten der Fahrer sind zu sehen. Die Fahrer selbst sehen ein wenig verzogen aus, die Fahrräder aber nicht. Highlight sind die Speichen, die sind total verbogen. Wie werden diese Bilder also aufgenommen, was zu diesem Effekt führt?

Der Trick bei der ganzen Sache ist, dass ganze Bild ist die Ziellinie. Verwirrend? Ok: Stellt Euch einen Scanner vor, der besteht aus einem schmalen Streifen der über ein Bild fährt und dann Zeile für Zeile abfotografiert und aneinander reiht. Ähnlich ist es mit einer Fotofinish Kamera. Die Kamera besteht ebenfalls nur aus einem kleinen Streifen der aber fest auf die Ziellinie ausgerichtet ist – die Fahrer fahren an ihm vorbei. Mehrere hundert Mal löst die Kamera aus und jede Momentaufnahme der Ziellinie wird aneinander gereiht.

Damit erklärt sich auch die linienförmige Darstellung des Bodens: es wird immer der gleiche schmale Abschnitt der Ziellinie nebeneinander dargestellt. Fährt nun ein Fahrer über die Ziellinie so ist in einem kurzen Moment nur die Spitze seines Vorderrades auf der Ziellinie und damit auch auf dem fotografierten Streifen, der an das Zielbild angefügt wird. Ein paar tausendstel Sekunden später ist der Fahrer weiter gerollt und der nächste Streifen wird fotografiert. So ergibt sich nach und nach ein Bild. Bewegt sich der Fahrer dabei kann es passieren, dass er auf dem Foto etwas verschoben oder gestaucht aussieht, da sich seine Position auf dem Rad während er über die Ziellinie fährt verändert. Somit erklärt sich auch, warum das Fahrrad selbst ganz normal aussieht: es fährt in gleicher Form, mit fast konstanter Geschwindigkeit, an der Kamera vorbei. Und die Speichen? Die Räder drehen sich beim Überqueren der Ziellinie und haben immer eine andere Stellung wenn sie an der Kamera vorbei kommen. Ähnlich wie beim Rolling-Shutter-Effekt sehen sie auf dem Foto verbogen aus.

Das Zielfoto ist also kein Foto von dem Moment wo der erste Fahrer die Ziellinie überquert, sondern ein Foto der Ziellinie über einen Zeitraum X, in dem die Fahrer die Linie überqueren.

© 2017 Sascha Hagedorn

Theme von Anders NorénHoch ↑