Docker Images für unterschiedliche Plattformen bauen

Seit ich denken kann beherrschten x86 Architekturen meine IT Welt. Dank Smartphones, dem RaspberriPi, der Graviton Plattform von Amazon oder aktuellen Apple Geräten ändert sich das ein wenig. Als User können von diesem Wettbewerb nur profitieren. Für Programmierer und Admins wird die Welt ein wenig komplexer sobald wir Binaries bauen. Ich kann auf meinem lokalen Host x86_64 GNU/Linux mit nicht ohne erweitertes Tooling gegen eine andere Zielplattform wie linux/arm64 kompilieren und auch keine kompatiblen Images bauen.

Docker bietet dafür ein Cli Plugin namens BuildX vor mit dem Container in spezifischen Umgebungen gebaut werden können.

Der Prozess lässt sich wunderbar in eine Github Action einbauen die Images pusht und baut:

name: Build

on:
  push:
    branches: main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: checkout code
        uses: actions/checkout@v2
      - name: install buildx
        id: buildx
        uses: crazy-max/ghaction-docker-buildx@v1
        with:
          version: latest
      - name: login to docker hub
        run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
      - name: build the image
        run: |
          docker buildx build --push \
            --tag ${{ secrets.DOCKER_REPO_NAME }}:latest \
            --platform linux/amd64,linux/arm64 .

Die paar Zeilen Yaml müssen im Repository unter ./.github/actions abgelegt werden und schon fällt nach jedem Push auf den Main Branch ein neues Image heraus welches support für die Plattformen linux/amd64 und linux/arm64 hat. Das hat den schönen Nebeneffekt, daß sich z.b. Kubernetes automatisch das passende Image zieht und man braucht keine Anpassungen in Code oder Konfiguration zu machen wenn man Docker Images in unterschiedlichen Umgebungen laufen lässt.

Ausbafähig ist an der Stelle die Verwendung von Docker Secrets. Eventuell gibt es auch eine BuildX Action.

Praktische Apps und Hardware für Touren mit dem Fahrrad

Dieses mal geht es um praktische Hardware und Software (Apps) für das rumfahren mit dem Fahrrad. Hintergrund: Ich lebe seit 10 Jahren in einer Stadt, habe seit 7 Jahren kein KFZ mehr und seit 2 Jahren kein Abo für den ÖPNV. Ich pendle mit dem Rad zur Arbeit, mache Tagestouren bis ~ 100km und nutze das Rad auch um ein wenig in Form zu bleiben. Im Durchschnitt fahre ich ~ 10.000 Kilometer / Jahr auf dem Rad. Ich habe also einen konkreten Bedarf für Navigationsmittel und möchte ein wenig meine Fitness und den Fortschritt erfassen.

Hardware

Sensoren

Die meisten Sensoren für das Rad laufen auf ANT+, einem proprietären Funkstandard. Die Bandbreite ist gering, dafür ist die Stromaufnahme gering. Jedes halbwegs moderne Android Gerät mit Bluethooth Chip kann sich auf die Sensoren verbinden.

Ich verwende einen Geschwindigkeitssensor der nur Strecke und Geschwindigkeit misst. Damit habe ich einen groben Überblick wie viele Kilometer das Rad schon gelaufen ist. Die Synchronisierung mit der Garmin App läuft automatisch. Zusätzlich habe ich einen Trittfrequenzsensor um meine Ausdauer zu verbessern.

Ich habe die Sensoren mangels wissen von Garmin gekauft. Chinesische Kopien sollen genauso gut funktionieren.

Smartphone Halterung

Tot durch billige Halterung und holprige Strecke

Ich besitze keinen Fahrradcomputer weil ich schon ausreichend Hardware in meinem Alltag habe die geladen und gepflegt werden will. Nach sehr negativen Erfahrungen mit einer günstigen Lenkradhalterung hab ich mich für ein System namens Quad Lock entschieden. Das ist eine solide Halterung und eine Hülle die genau auf Smartphone und das System eingepasst ist. Leider gibt es nicht für jedes Smarthpone eine passende Hülle aber die üblichen Verdächtigen wie IPhone, Samsung, Pixel Phone bekommt man die Hüllen.

Smartwatch

Ich trage eine Garmin Vivo Active Smartwatch um Touren zu erfassen. Durch die Uhr fallen zusätzlich GPS- und Herzfrequenzdaten an. Die Uhr kann auch als Ant+ Sender genutzt werden um Daten zur Herzfrequenz an andere Geräte zu übertragen.

Links

Software

Garmin Connect

Die Daten der Sensoren landen via Bluetooth in Garmin Connect. Ich nutze auch noch eine Fitness Uhr von Garmin aber um die soll es an dieser Stelle nicht gehen. Neben dem Sammeln von Daten wird alles auf den Servern des Herstellers abgespeichert. Wer Wert auf Datenschutz legt sollte hier vorsichtig sein. Ein Vorteil ist die Anbindung an weitere Cloud Dienste und ein einfacher Zugriff über mehrere Geräte inklusive Webinterface. Die Daten können mit weiteren Diensten wie z.B. Komoot oder Strava geteilt werden.

Anfallende Daten auf dem Weg zum Kloster Schäftlarn in der Garmin Android App
Anfallende Daten auf dem Weg zum Kloster Schäftlarn

Kilometerzähler für mein Fahrrad
Kilometerzähler für mein Fahrrad

Navigation

Für die Navigation und Streckenplanung benutze ich Komoot. Das Kartenmaterial stammt von OpenStreetMap. Die App bietet nette Social Media Komponenten um Menschen zu folgen, Bilder hochladen usw. Wirklich interessant ist das Suchen nach interessanten Touren. Man bekommt alle relevanten Informationen wie Distanz, Höhenmeter, Dauer und eventuell ein paar Bilder und kann sich die Routen zum Nachfahren abspeichern und auch modifizeren. Neben der App gibt es ein Webinterface mit dem man bequem am PC Routen erstellen kann. Die Navigation ist ziemlich gut gemacht. Alles ist jederzeit klar ablesbar und gut verständlich.

Die Grundfunktion der App ist kostenlos; allerdings ist man auf eine Region beschränkt Wenn man außerhalb dieser Region unterwegs ist muß man entweder diese Region kaufen oder das „Weltpaket“ für ~ 30€ um überall auf dem Planeten navigieren zu können. Meiner Meinung nach lohnt sich die Investition und es ist ein kleines Dankeschön an die Entwickler die hier wirklich gute arbeit leisten. Es gibt ein optionales Abo mit dem ich keine Erfahrung habe. Die App gibt es für IOS und Android.

Fitness

myWorkouts

Bei der App myWorkouts handelt es sich um einen erweiterten Fahrradcomputer der Daten aus Sensoren und Smartwatches auslesen und aufbereiten kann. In meinem Setup sehe ich Geschwindigkeit, Tritt- und Herzfrequenz, Histogramme zu den Daten und Durchschnittswerte. Ich nutze die Anwendung um sicherzustellen, daß ich nicht mit dem Rad flaniere sondern meinen Körper stresse. Fahrten werden auf Wunsch lokal abgespeichert.

Screenshot der App myWorkouts: gespeicherte Fahrt
Screenshot myWorkouts: gespeicherte Fahrt

Pipe Operator in Ansible nutzen

Ansible ist ein nettes Tools  um deklarativ Rechner über SSH zu administrieren oder aufzusetzen. Deklarativ meint, daß man Zustände definiert die Ansible herbeiführen soll. Man erklärt in Tasks welche Software auf einem Rechner installiert sein soll und Ansible führ diesen Zustand herbei.

 

Ab und an muß man diesen deklarativen Pfad leider verlassen. Im konkreten Beispiel müßen alte Datenbanken (benannt nach dem Schema YYYY-mm-dd-hh-i-s)  gelöscht werden damit das RDBMS nicht volläuft. Wichtig ist es statt command shell zu nutzen, da es sonst mit dem Pipen nicht klappt.

- name: remove old databases
  shell: mysql  --user={{ vault_mysql_server[env][tld].wp_content_user }} --password='{{ vault_mysql_server[env][tld].wp_content_password }}'  --batch --execute "show databases;" |grep wp_content|sort -hr  |tail -n+4|while read line; do mysql  --user={{ vault_mysql_server[env][tld].wp_content_user }} --password='{{ vault_mysql_server[env][tld].wp_content_password }}'  --batch --execute  "DROP DATABASE $line;" 2>/dev/null;done
  register: debugOutput

Gaming Apps, Android vs. iOS

android

Bild von JD Hancock 

Es ist die alles entscheidende Frage, wenn man sich ein Smartphone oder Tablet kauft. Für welches mobile System entscheide ich mich bloß, Android oder iOS? Wer sich ganz neu orientieren will und vielleicht bisher einfach noch kein Mobilgerät besessen hat, steht vor der Qual der Wahl. Wer hingegen vorher schon eines der zwei Systeme ausprobiert hat, bleibt meist auf derselben Seite. Die Fronten sind verhärtet, jeder lobt das in die Höhe, wovon er selber überzeugt ist. Das hilft denjenigen, die ernsthaft vor der Wahl stehen, jedoch nicht im Geringsten. Deshalb sollte man sich als zukünftiger Nutzer darüber klar werden, welcher Bereich einem am wichtigsten ist.

Wer gerne spielt und dafür jede Menge Apps herunterladen möchte auf seinem neuen Gerät, sollte doch zum Beispiel einmal versuchen, die zwei Systeme auf diese Frage hin zu überprüfen. Heute kann man ja bereits Spiele aus den unterschiedlichsten Bereichen finden und auf das Smartphone oder Tablet laden, so dass man zu jeder Zeit und von überall aus seinem Lieblingsspiel nachgehen kann. Glücksspielseiten wie Coral oder 32Red beispielsweise bieten entsprechende Apps für beide Systeme an, dann wären da noch beliebte Quizspiele oder Geschicklichkeitsvarianten. Leider hat der Nutzer im Voraus meist nicht die Gelegenheit, beide Systeme auszuprobieren und zu gucken, mit welchem es sich besser spielen lässt. Spielen Sie online bei 32Red, doch erkennen, wie es sich bei iOS oder Android spielt, werden Sie erst, wenn Sie das Gerät besitzen.

So muss man sich vor dem Kauf zumindest darüber informieren, welche Spiele denn überhaupt für welches System im Angebot sind. Online Casinos und gängige Gaming Optionen sind im Grunde fast alle für iOS sowie Android zu haben. Allerdings gibt es auch hier Ausnahmen und wenn man sich erst für ein System entschieden hat, steht man am Ende vielleicht dumm da, weil gerade dieses nicht von dem Anbieter der ersten Wahl zur Verfügung gestellt wird. Wenn es um exklusive Spiele geht, dann ist tatsächlich zu erkennen, dass der App Store für die iOS Variante mehr zu bieten hat. Im Vergleich zu Android Spielen, die fast alle auch für iOS zu haben sind, gibt es eine ganze Reihe an Möglichkeiten, die eben wirklich nur für das iPhone oder iPad angeboten werden. Das wäre möglicherweise ein Grund dafür, sich für iOS zu entscheiden.

Was die Anzahl der Spiele im Allgemeinen betrifft, sind beide Systeme mit über einer Million aktiven Apps auf fast demselben Stand. Von diesen sind fast 25 Prozent Spiele-Apps für jede Plattform. Was die Qualität betrifft, so muss man sich auf die Bewertungen der Spieler verlassen. iOS Nutzer vergaben hier in der Vergangenheit in den Bewertungen höhere Punktzahlen, also durchschnittlich viereinhalb Sterne von fünf möglichen. Android Nutzer hingegen haben bei den meistgespielten Apps eine Durchschnittsbewertung von vier Sternen abgegeben. Beide Systeme schneiden insofern aber enorm gut ab mit nur geringen Unterschieden. Vielleicht muss man sich also an anderen Punkten orientieren, zum Beispiel dem Sicherheitsaspekt, oder sich einfach ins kalte Wasser stürzen und sich in eine der zwei Blasen begeben. Dann gehört man bald wahrscheinlich auch zum Fanclub des einen oder anderen.

Mehrere Bildschirme mit dem Thinkpad W530

Eines der nervigsten Bastelthemen die mich jemals beschäftigt haben war die Konfiguration dieses Laptops für den Linuxbetrieb. Die Installation von Debian verlief problemlos – das Thinkpad wollte jedoch auf Gedeih und Verderb nicht mit mehreren Displays arbeiten. In dem Thinkpad arbeiten 2 Grafikkarten, eine von Intel und eine NVIDIA Optimus. Da mir das Umschalten mit Bumblebee zu umständlich war habe ich im BIOS die NVIDIA Karte als Default ausgewählt – siehe Screenshots und den proprietären NVIDIA Treiber installiert.

Diese Konfiguration läuft jedoch nur bedingt – ab und an bootet das System und manchmal leider nicht. Das Stichwort lautet waiting for /dev to be fully populated. Die Lösung ist dieses Problems ist absolut logisch und selbst für den Laien verständlich – im BIOS einfach die Virtualisierung deaktivieren und alles ist gut.

Da ich die letzten 12 Monate wenig Zeit und noch mehr Arbeit hatte begleitete mich dieses Problem wirklich sehr lange – zeitweise mußte ich sogar einen sehr bizarren KDE Klon zum Arbeiten verwenden.

Die Früchte dieser merkwürdigen Konfigurationsarbeit sehen dann so aus:

 

4 mal Slayer

 

2 Displays sind via DisplayPort angeschlossen und eines über VGA. Einen sinnvollen Verwendungszweck habe ich für soviele Displays noch nicht gefunden. Aber auf 3 Screens läßt sich wunderbar Java schreiben:)

Led Lampen mit WLAN Anbindung

Ein Thema das mich immer wieder fasziniert ist die Vernetzung von Gegenständen des Alltags. Meine Wohnzimmerlampe glänzt nicht nur durch hässliche Form sondern auch durch kaltes Licht und Quecksilber im Leuchtmittel. Deshalb ersetze ich nach und nach Kompaktleuchtstofflampen durch LED Lampen. Der Zufall brachte mich zu diesem Lampenset mit WLAN Anbindung (Affiliate) vom Hersteller LimitlessLED. Die Lampen passen in E27 Sockel, haben 6 Watt Leistung und können mit 230V ~  betrieben werden. Die Grundidee ist die Lampen via Smartphone oder auf anderen Wegen einzuschalten, die Farben zu ändern und dimmen.Neben den 3 Lampen werden eine Fernbedienung und was viel interessanter ist einem Controller mit dokumentierter API geliefert. Apps gibt es auch! Pro Fernbedienung und Controller kann man 4 Lampen steuern. Dabei kann man die Parameter Helligkeit, Farbe regeln.

2013-10-15 16.56.18

 

Impressionen

Inbetriebnahme

Lampen

Jede Lampe muß konfiguriert werden. Dabei spielt es keine Rolle, ob man sie der Fernbedienung oder in der App konfiguriert.

Lampe in Fassung drehen und binnen 2 Sekunden nach Anlegen von Spannung auf der Fernbedienung einen Kanal aktivieren – die Lampe ist nun dem entsprechenden Kanal zugewiesen. Die erfolgreiche Zuweisung  wird durch Blinken quittiert. Um die Lampe aus dem Kanal zu lösen innerhalb von 2 Sekunden nach dem Einschalten 5 mal den entsprechenden Kanal auf der Fernbedienung aktivieren.

Controller

Der Controller wird per Micro-USB Kabel mit Spannung versorgt. Ich nutze ein Ladegerät für Smartphones. Nach dem Booten sollte man ein WLAN mit der SSID milight finden. Nun kann man der Anleitung folgen oder was ich als angenehmer per Webinterface konfigurieren. Dazu ins eigene WLAN verbinden und http://192.168.0.100/home.html aufrufen – ob die IP immer die gleiche ist kann ich nicht sagen. Hier muß in den STA Interface Settings das eigene WLAN konfiguriert werden.

App

Momentan nutze ich die in der Anleitung vorgeschlagene App Es gibt auch noch eine puristischere Version mit
Anbindung an Tasker – die  ohne Anpassungen leider nicht läuft.

LED Lampen ansteuern

Beim Hersteller gibt es eine Dokumentation.  Die Beispiele sind leider ein wenig inkonsistent, da irgendwann die Portnummer von 50000 auf 8899 umgestellt wurde.

Die Lampen werden per UDP Kommandos gesteuert. Dabei werden immer 3 Byte übertragen.

Byte 1 ist das Kommando an welches immer der Suffix 0x00  0x55 angehängt werden muß.

In PHP kann mit diesen Zeilen alle Kanäle einschalten:

<?php
define("CONTROLLER_IP", "192.168.0.100");
function executeCommand( $ip, $command, $suffix1=00, $suffix2='55'){
	fwrite(fsockopen("udp://$ip", 8899), chr(hexdec($command)) . chr(hexdec($suffix1)) . chr(hexdec($suffix2)));
}
 
executeCommand(CONTROLLER_IP, 42);

Wer php5-cli installiert hat kann das Script auch auf der Kommandozeile nutzen. Für Freunde der Bash gibt es auch ein Script (geklaut bei Smileytechadventures)

#!/bin/bash 
 
if [ -z "$1" ] ; then 
    echo "You must enter a parameter: "  
    echo "  e.g. $0 allon" 
    exit 1 
fi 
 
incmd="$1" 
ipaddress="192.168.0.201" 
portnum="50000" 
 
allon="\x35\00\x55" 
alloff="\x39\00\x55" 
zone1on="\x38\00\x55" 
zone1off="\x3B\00\x55" 
zone2on="\x3D\00\x55" 
zone2off="\x33\00\x55" 
zone3on="\x37\00\x55" 
zone3off="\x3A\00\x55" 
zone4on="\x32\00\x55" 
zone4off="\x36\00\x55" 
 
eval incmd=\$$incmd 
 
echo -n -e "$incmd" >/dev/udp/"$ipaddress"/"$portnum"

Ein wenig Heimautomatisierung ist auch schnell betrieben. Dieses Skript prüft, ob die Sonne untergegangen ist und schaltet in diesem Fall alle Lampen ein.

#!/usr/bin/php
<?php define("CONTROLLER_IP", "192.168.0.100"); define("ZEIT_FUER_BETT", "23:59"); function executeCommand( $ip, $command, $suffix1=00, $suffix2='55'){ fwrite(fsockopen("udp://$ip", 8899), chr(hexdec($command)) . chr(hexdec($suffix1)) . chr(hexdec($suffix2))); } function getIp(){ return file_get_contents("http://icanhazip.com/"); } function getLatLongByIp($ip){ $geoplugin = unserialize( file_get_contents('http://www.geoplugin.net/php.gp?ip='.$ip) ); if ( is_numeric($geoplugin['geoplugin_latitude']) && is_numeric($geoplugin['geoplugin_longitude']) ) { $ret['lat']= $geoplugin['geoplugin_latitude']; $ret['lon']=$geoplugin['geoplugin_longitude']; return $ret; } } $ret= getLatLongByIp(getIp()); $dateSunset=date_sunset(time(), SUNFUNCS_RET_TIMESTAMP,$ret['lat'], $ret['lon'], 90, 1); $dateSunrise=date_sunrise(time(), SUNFUNCS_RET_TIMESTAMP, $ret['lat'], $ret['lon'], 90, 1); //Zu einer festen Uhrzeit ausschalten if(date("H:i")>= date(ZEIT_FUER_BETT)){
echo "schlafen";
	executeCommand(CONTROLLER_IP, 41);
	exit;
}  
//Nach Sonnenuntergang und vor Aufgang
if ( time() >=$dateSunset && $dateSunset >$dateSunrise){
 
	executeCommand(CONTROLLER_IP, 42);
}else {
	executeCommand(CONTROLLER_IP, 41);
}

Das kleine Skript fühlt sich auf kleinen Linuxrechnern im eigenen Netzwerk sehr wohl und sollte per Cronjob alle 1 Minuten angestoßen werden.

*/1 *    * * *   /home/pi/sunrise.php

Inzwischen habe ich die Lampen seit einer Woche in Betrieb und viel Spaß damit. Die Lichtausbeute ist ausreichend, der Stromverbrauch in Ordnung. Der Preis ist mit 99 EUR schon sehr happig, aber es macht auch sehr sehr viel Spaß Skripte für die Lampen zu schreiben.

Servus Planet!

Hallo zusammen,

ich war vor langer Zeit schonmal mit der Prämisse „Unerklärliches am Rande“ und dem Slogan „Worte des Parteivorsitzenden“ auf dem Planeten unterwegs (Domain schmiddi.co.cc). Wer das noch kennt kann nun im Feedreader auf weiter klicken weil sich nicht viel geändert hat.

Den Vergesslichen und auch Neuen Planetenkonsumenten sei gesagt, daß es sich hier alles um Linux dreht, nette Programme, Bash, wie ich meine Hardware damit zum laufen bringe,  ein wenig Skripten und ab und an Hardware ohne x86 CPU aber mit Linux :).

An Rechnern betreibe ich momentan ein Thinkpad W530 mit Ubuntu, eine kleine Debian Workstation, Raspberry Pi, Pogo Plug sowie diverse Android Telefone + Tablets und meinen heißgeliebten Ebookreader.

In diesem Sinne: auf fröhliches Bloggen!

Sql: Order by Switch/Case

Ziemlich coole Geschichte um die Ordnung von Datenbankabfragen in Mysql zu ordnen:

 

SELECT name from showcase

order by
case name
when ‚bla‘ then 1
when ‚blub‘ then 2
when ‚blabla‘ then 3
when ‚blubblub‘ then 4
when ‚blablablabla‘ then 5
when ‚blubblubblubblub‘ then 6
when ‚blablablablablabla then 7
else 99
end;