GUIs aus Docker heraus starten

Bis gestern dachte ich, grafische Programme via docker zu starten ist bestimmt ziemlich kompliziert. Allerdings wurde dann gestern auf dem developer camp 2017 in einem Vortrag zu Docker gezeigt wie das geht und es sind eigentlich nur 2 Parameter die man braucht 🙂

Ein Beispiel:

docker run -ti –rm -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix jess/cathode cathode

Ggf. ist vorher noch ein „xhost +“ notwendig, damit das Programm im Container dann auch auf deinen X-Server connecten darf. Wichtig dabei ist, $DISPLAY an den Container weiterzugeben und /tmp/.X11-unix als Volume in den Container zu mounten, mehr ist an sich nicht notwendig:

Es kamen auch schon mehrere Ideen auf was man damit noch so anstellen könnte, z.B. unter Fedora in einem Docker-Container Programme laufen zu lassen die eben doch nur für Ubuntu gepackaged werden o.ä. …

Probleme mit OpenVPN auf einem vServer

… und die passende Lösung dazu.

Aber mal ganz von Anfang an. Ich habe auf einem vServer bei Hetzner ein VPN mit OpenVPN eingerichtet. Dazu habe ich hauptsächlich die Anleitung dazu aus dem Debian Wiki und die Anleitung für IPv6 aus dem OpenVPN Wiki verwendet.

Über das VPN bekommen die verbundenen Clients dann private IPv4- und IPv6-Adressen. Neulich bin ich dann von einem älteren Modell auf einen der aktuellen CX-Server umgestiegen und damit kommen wir dann auch langsam zum Problem. Dort funktioniert zwar erstmal das VPN wie gewohnt. Die Clients bekommen ihre IPv4- und IPv6-Adresse und können damit auch übers VPN ins Internet. Um das zu verifizieren habe ich jeweils einen ping und einen mtr, je über IPv4 und IPv6, getestet um festzustellen, dass ein mtr über IPv6 nicht klappt, ich komme bis zum ersten HOP (meinem vServer), aber nicht weiter.

Ein tcpdump auf dem Client, während ein ‚mtr -6 google.de‘ läuft, sieht dann auszugsweise folgendermaßen aus:

# tcpdump -n -v -i tun0 icmp6
tcpdump: listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes

18:13:04.343693 IP6 (flowlabel 0xb626a, hlim 3, next-header ICMPv6 (58) payload length: 64) fd00:dead:beef:cafe::1000 > 2a00:1450:4001:81c::2003: [icmp6 sum ok] ICMP6, echo request, seq 60032
18:13:04.387088 IP6 (flowlabel 0x8e224, hlim 62, next-header ICMPv6 (58) payload length: 112) 2a01:4f8:0:e171::113e > fd00:dead:beef:cafe::1000: [bad icmp6 cksum 0x66d2 -> 0x68d2!] ICMP6, time exceeded in-transit for 2a00:1450:4001:81c::2003

fd00:dead:beef:cafe::1000 ist hierbei die IPv6-Adresse meines Clients, die Pakete gehen also korrekt raus, kommen aber mit einer ungültigen Checksumme zurück.

Ich habe mir tagelang über das Problem den Kopf zerbrochen und alles mögliche ausprobiert. Die Lösung fanden wir dann gestern gemeinsam auf dem Chaostreff nach weiterem stundenlangem Debugging.

Die Lösung

Nach dem erwähnten stundenlanden Debugging kam mir dann irgendwann der helfende Gedanke. Und zwar kann man bei den CX-Servern bei Hetzner die Art der Virtualisierung der Netzwerkkarte auswählen. Standardmäßig ist hier ‚VirtIO‘ ausgewählt, welches die beste Performance bieten soll. Als ich hier auf eine der anderen beiden Auswahlmöglichkeiten umgestellt hatte kamen die Pakete auf einmal mit einer korrekten Checksumme an! 🙂 Yeah! Endlich!

robot_cx_settings

Stesie’s Vermutung dazu ist, dass der VirtIO-Treiber hier davon ausgeht, dass er keine Checksummenberechnung machen muss, da es ja nur ein virtualisiertes Netzwerkinterface ist und die Netzwerkkarte des Hostsystems ja schon die Checksummen berechnen sollte. Im Zusammenspiel mit OpenVPN klappt das wohl nicht ganz wie erwartet. Diese Pakete gehen dann in diesem Fall also ohne korrekte Checksumme übers VPN zum Client, welcher hier dann die Checksumme prüft und merkt, dass dort keine gültige eingetragen ist. Ich weiß nicht, ob diese Vermutung zutrifft, klingt für mich aber plausibel so wie er sie erzählt hat (ich hoffe ich habe es hier auch halbwegs korrekt wiedergegeben).

TL;DR

Wenn du auf einem CX-Server bei Hetzner ein VPN betreiben möchtest, dann stell das ‚NIC-Modell‘ von VirtIO auf eine der anderen Auswahlmöglichkeiten.

Vielen Dank nochmal an alle, die beim Chaostreff anwesend waren und mir bei der Problemlösung geholfen haben 😉 Ich hoffe falls jemand das selbe Problem hat findet er diesen Blogeintrag 🙂

Problem bei Synchronisierung von Ubuntu und Debian mit Unison

unisonIch verwende zum Synchronisieren von einigen Daten zwischen mehreren Rechnern gerne Unison. Das Tool kann Dateien z.B. per SSH zwischen dem lokalen Rechner und einem entfernten Rechner synchronisieren.

Jetzt habe ich neulich meinen Laptop auf das neue Kubuntu 16.10 aktualisiert, auf dem entfernten Rechner um den es hier geht läuft ein Debian 8. Bisher hatte ich da auch keine Probleme diese beiden mit Unison zu synchronisieren, aber jetzt bekam ich folgenden Fehler:

Unison failed: Uncaught exception Failure(„input_value: bad bigarray kind“)

Nach einiger Recherche scheint es wohl daran zu liegen, dass die beiden Unison-Versionen gegen unterschiedliche Versionen irgendwelcher Libs gebaut wurden.

Eigentlich gibt es dafür sowohl in Ubuntu, als auch Debian das Paket unison-all in dem „alle“ Versionen von Unison enthalten sein sollten, falls man mit einem System synchronisieren möchte, dass nicht die aktuelle Version beinhaltet. Leider ist dieses Paket aktuell etwas nutzlos, da es nur eine Abhängigkeit auf die aktuelle Version von Unison enthält.

Ich konnte das Problem in meinem Fall lösen in dem ich mir das Paket von den Ubuntu Repos heruntergeladen und dann manuell unter Debian installiert habe. Damit funktioniert die Synchronisierung jetzt wieder ohne Probleme 🙂

Ich dachte mir ich halte das mal hier fest, falls noch jemand auf das Problem stoßen sollte. Das ist natürlich keine dauerhafte oder schöne Lösung, aber für den Moment (bis zum nächsten Update) funktioniert es. Falls jemand eine bessere Lösung weiß immer her damit! 🙂

Regex: Wieder mal was neues gelernt

Wenn ich mir so manche regulären Ausdrücke (regular expressions oder kurz RegEx) ansehe, dann verstehe ich teilweise nur Bahnhof. Umso mehr freut es mich, wenn ich wieder etwas mehr von dem Mysterium verstehe 🙂 Ich bin neulich das erste mal bewusst mit den Regex-Konstrukten ‚lookahead‘ und ‚lookbehind‘ in Kontakt gekommen. Damit kann man darauf prüfen, ob vor bzw. hinter dem Gesuchten etwas bestimmtes vorkommt, oder auch nicht. Ich möchte euch diese Konstrukte heute einmal ganz kurz vorstellen. Ich denke am besten sehen wir uns das mal an einem Beispiel an:

Nehmen wir mal den String ‚Ich habe Hunger und habe Durst.‘. Ich möchte hier für das Beispiel auf das erste ‚habe‘ matchen.

Mit lookahead:

/habe(?= Hunger)/g
=> matcht auf ‚habe‘ gefolgt von ‚ Hunger‘
/habe(?! Durst)/g
=> matcht auf ‚habe‘, solange danach nicht ‚ Durst‘ kommt

Mit lookbehind:

/(?<=Ich )habe/g
=> matcht auf ‚habe‘, wenn davor ‚Ich ‚ steht
/(?<!und )habe/g
=> matcht auf ‚habe‘, aber nur, wenn davor kein ‚und ‚ steht

Alle diese Beispiele finden jeweils das erste ‚habe‘ aus dem Beispielsatz. Ich hoffe das war jetzt für irgendjemand hilfreich und auch halbwegs verständlich. Wenn dich das Thema interessiert, dann gibt es hier noch mehr Info dazu.

3. Hand improved

Beim Verlöten von Kabeln, oder auch ähnlichen Arbeiten, ist es manchmal hilfreich eine 3. Hand zu haben, da man meistens nicht Lötkolben, Lötzinn und die beiden zu verlötenden Teile gleichzeitig halten kann. Und weil nicht immer jemand in der Nähe ist der einem eine Hand leihen kann gibt es praktischerweise auch (3.) Hände zu kaufen, ich meine natürlich diese hier 😀

Ein kleiner Tipp, falls ihr auch öfter eine 3. Hand verwendet und auch schon manchmal Abdrücke der Krokodilklemmen bemerkt habt: Einfach Schrumpfschläuche über die Klemmen stülpen und schon beißen sie nicht mehr so in Kabelummantelungen, oder hinterlassen Kratzer auf irgendwelchen Boards oder so 🙂

Beispielbild: ein Arduino und ein Kabel in der Klemme

Beispielbild: ein Arduino und ein Kabel in der Klemme

Kurzmitteilung

Unterhaltsame Webcomics: xkcd

Heute möchte ich mal auf xkcd hinweisen. Dort gibt es regelmäßig, mehrmals wöchentlich, Comics. Diese sind stets einfach gehalten und zu den unterschiedlichsten Themen. Ich habe den RSS-Feed seit einigen Jahren abonniert und freue mich jedes mal aufs Neue, wenn es einen neuen Comic gibt.

Heute gab es z.B. einen tollen Comic zum Thema Datensicherheit. Nicht mit Datenschutz verwechseln 😉

via xkcd.com.

Der Zeichenstil ist immer recht einfach und fast immer komplett in schwarz-weiß gehalten. Manchmal sind die Comics allerdings etwas komplexer wie ihr Zeichenstil. Hier kommt einem dann explain xkcd zu Hilfe 🙂 Dort findet man zu jedem Comic die passende Erklärung.

Let’s encrypt! [UPDATE]

Ich habe spontan beschlossen für meine private ownCloud, Tiny Tiny RSS usw. ein ordentliches Zertifikat via let’s encrypt einzurichten.

In Debian ist inzwischen ein Paket namens letsencrypt enthalten. Zudem installierte ich noch python-letsencrypt-apache welches ein Plugin für letsencrypt für Apache enthält.

Nun noch schnell mit Hilfe der man-page den Befehl zusammengebastelt um ein Zertifikat zu erstellen, natürlich direkt für mehrere Domains welche dann im Zertifikat als SAN geführt werden.

War eine Sache von einer halben Stunde inklusive cronjob einrichten welcher mir dann hoffentlich das Zertifikat rechtzeitig erneuert.

Ich veröffentliche hier mit Absicht keine Anleitung, zum einen weil es davon schon genug gibt, zum anderen weil man mit der man-page des Pakets letsencrypt auch schon relativ weit kommt 🙂

Update (13.06.2016):

Inzwischen gibt es in den backports von Debian Jessie die Weiterentwicklung des letsencrypt-Clients, namentlich certbot. Hier ist im Paket schon ein Cronjob enthalten, der also automatisch die erstellten Zertifikate erneuert.

Ich musste allerdings vor der Installation die letsencrypt-Pakete deinstallieren, da es sonst zu Abhängigkeitsproblemen gekommen wäre. Danach ließen sich aber die entsprechenden certbot-Pakete installieren.

Alles ist besser mit Bluetooth

Ich höre gerne Musik, so auch im Auto. Nur höre ich nicht unbedingt das was so von normalen Radiosendern gesendet wird die man mit einem Autoradio empfangen könnte. Ich wollte also eine Möglichkeit haben Musik aus meiner Sammlung im Auto abzuspielen und das möglichst komfortabel. Das heißt ich möchte nicht ständig neue CDs brennen oder mein Handy an den AUX-Anschluss anstecken müssen bei jeder Autofahrt.

Es musste also eine Lösung her Musik kabellos vom Handy an mein Autoradio zu senden. Ich habe mich hier für Bluetooth entschieden und eines der vielen Bluetooth-Audio-Module bestellt die es so gibt, namentlich das KRC-86B V 4.0.

IMG_20160430_180711

Ich habe mich auch für das Modul entschieden, da man damit die Möglichkeit hat die Lautstärke zu ändern und noch wichtiger, das Modul kann auch Play/Pause, nächstes/vorheriges Lied was ich gerade für das Autofahren haben wollte. Dann kann man Knöpfe anbringen und kann quasi blind zum nächsten Lied weiterschalten und muss seinen Blick nicht von der Straße abwenden 🙂

IMG_20160408_194601Nach einem kurzen Test war klar, das Teil funktioniert einwandfrei. Das Pairing mit meinem Handy ging ohne Probleme und auch die Musiksteuerung funktioniert so wie sie soll.

Die mitgelieferte blaue LED habe ich durch eine diffuse orange LED ersetzt und noch einen Vorwiderstand eingebaut, damit ich nicht von der LED geblendet werde.

Für die Stromversorgung möchte das Modul gerne 5 V haben. Das liegt es natürlich nahe das über USB zu lösen, damit wäre es dann Problemlos möglich das Modul mit jedem Handyladekabel o.ä. zu betreiben.

Ich habe also nach micro-USB Buchsen gesucht die man auf ein PCB löten kann. Ich habe allerdings leider nichts wirklich brauchbares gefunden und musste deshalb ein bisschen tricksen um die Buchse die ich dann bestellt hatte überhaupt zu befestigen. Wenn hier jemand einen Tipp parat hat bitte her damit 🙂

So schaut dann das Endprodukt aus, relativ kompakt:

IMG_20160430_174916

Bonus-Feature:

Ich habe auf meinem Handy eine Software namens Llama. Damit war es auch noch möglich einzustellen, dass mein Handy sobald es sich mit dem Bluetooth-Modul verbindet die Lautstärke entsprechend einstellt und Musik abspielt. Ich habe jetzt also den Komfort, dass ich mich im Prinzip um nichts kümmern muss außer, dass ich Musik auf meinem Handy habe die mir gefällt. Der Rest wird automatisch erledigt mit Hilfe von Llama und Bluetooth 🙂 denn wie sagte schon Sheldon Cooper so schön:

Alles ist besser mit Bluetooth!

Wetter in bunt und mit Farbe :)

Falls du schon immer mal das Bedürfnis hattest das aktuelle Wetter abzufragen, aber keine Lust hast dafür die Konsole zu verlassen, dann habe ich die Lösung für dich 😀

Spaß beiseite, aber die Seite wttr.in lässt sich wirklich wunderbar auf der Konsole mit curl abfragen und liefert dann schön formatiert und sogar mit Farben das aktuelle Wetter. Über Parameter in der URL kann man die Stadt oder PLZ angeben.

Hier mal ein Beispiel:

$ curl wttr.in/Rothenburg\ ob\ der\ Tauber

wttr-in

Gefunden auf webupd8.

Vertauschte Farben einer LED-Leiste korrigieren

Ich hatte seit einigen Tagen ein Problem mit einer dieser günstigen LED-Leiste die ich zur indirekten Beleuchtung hinter meinem Schreibtisch befestigt habe. Und zwar waren dort plötzlich die Farben vertauscht. Also war der blaue Kanal auf einmal rot, der grüne dafür blau und der rote eben grün. Ich hatte schon einiges probiert von Stecker ziehen und warten bis wild auf der Fernbedienung herumdrücken 😀

Gerade bin ich durch Zufall auf ein Youtube-Video gestoßen, in dem erklärt wird wie man dieses Problem behebt:

Wenn die LED-Leiste an ist nacheinander auf ‚Power‘, ‚FADE7‘ und nochmal auf ‚Power‘ drücken. Falls die Farben noch nicht direkt wieder richtig sind das Ganze wiederholen bis die Farben passen.

Ich nehme an, bzw. hoffe, dass nicht alle Controller für diese LED-Leisten so eine bescheuerte Software haben die auf einmal die Farbzuordnung vergisst, aber zumindest bei meinem hat der Tipp geholfen 🙂