Du mein altes Keyboard mittlerweile ziemlich abgenutzt war und die letzten Wochen außerdem die Leertaste immer mal für mehrere Sekunden aussetzte, entschied ich mich dazu mir eine neue Tastatur zu kaufen. Eigentlich hätte ich einfach gern den (vermutlich) defekten Switch getauscht, leider waren bei meiner alten aber die Switches fest verlötet. Und da ich jetzt kein Bock hatte daran rumzulöten, ich sowieso eine kleinere Tastatur haben und schon lange mal in die Welt der Custom Keyboards eintauchen wollte, las ich mich ein bisschen schlau und besorgte mir ein Zuoya GMK67. Keycaps und ein paar Switches hatte ich sogar da, weil ich hier seit ca. einem Jahr einen ganzen Bausatz für ein Reviung41 rumliegen habe, wo ich bisher noch nicht die Lust aufbringen konnte den mal zusammen zu löten. Da aber die neue Tastatur ein paar Tasten mehr hat als die Reviung41, musste ich mir doch noch ein paar Switches dazu holen. Die die ich noch da hatte waren Akko Sponge Switches, welche aber leider nicht mehr lieferbar waren. Also habe ich mir Akko Jelly Blue geholt, zum einen weil die Sponge einfach recolored Jelly Blues sind (wohl mit ner anderen Feder, aber ich merk da keinen Unterschied) und außerdem günstiger waren weil Auslaufmodel. Beides sind übrigens Taktile Switche. Ich kenne viele in meinem Bekanntenkreis die Lineare favorisieren, aber mir fehlte da einfach das haptische Feedback beim tippen. Meine ausgemusterte Tastatur hatte diese Clicky Switches, also Taktile in extra laut, was ich damals lustig fand und im Home Office auch niemand nervte. Außer mich, so nach ein paar Jahren. :D Ich hab dann die Sponge Switches für Buchstaben und die Tasten rechts genommen (Pfeiltasten etc.) und für den Rest dann die Jelly Blue. Jetzt muss ich mich erstmal daran gewöhnen weniger Tasten zu haben und mit einem englischen Layout zu schreiben. Bisher muss ich aber sagen das das umgewöhnen schneller geht als gedacht.
Das Problem
Wie man oben sieht hat die Tastatur keine Funktionstasten. Die sind aber dennoch verfügbar indem man FN+ 1 – = drückt. Dabei unterstützt die Tastatur zwei Modi – WIN OS und MAC OS. Im MAC OS Modus hat man mit den zuvor genannten Tastenkombinationen allerdings eine Multimediasteuerung, wie man sie vom Notebook kennt, statt der Funktionstasten. Ich war also am WIN OS Modus interessiert da ich die Funktionstasten wollte, allerdings hatte ich egal was ich einstellte immer die Multimediasteuerung auf den Tasten. Selbst wenn an der Tastatur über einen Schalter der Modus umgeschaltet wurde änderte das nichts.
Die Lösung
Eine Kollege der sich gut mit Customs Keyboards teilte mir dann die Lösung mit:
echo 2 > /sys/module/hid_apple/parameters/fnmode
Er meinte das wohl viele der China Custom Keyboards Apple IDs für Vendor und Product IDs verwenden würden, im WIN OS Modus dann aber keinen Code für die FN Taste übermitteln würden und der hid_apple Treiber dann einfach den Default Wert nimmt – Multimedia.
Um die Einstellung nun persistent zu machen legt man eine entsprechende modeprobe config an:
Ich habe heute in der Firma die Webseite umgezogen und da diese sich nun eine IP mit anderen Seiten teilen muss, läuft sie hinter einem Reverse Proxy (nginx). Die Verbindung zwischen Proxy und Webseite läuft dabei über HTTP.
Wenn ich die Seite aufrufen wollte, lief der Browser laufend in einen Redirect Loop und ich wusste nicht wieso. Eine Seite, ebenfalls WordPress, die ich parallel auf das selbe System umgezogen habe, funktionierte ohne Problem mit der identischen Konfiguration. Nachdem ich alles andere ausgeschlossen hatte, kam mir der Gedanke das womöglich WordPress selbst für den Loop verantwortlich ist und tatsächlich, es war so. Der Unterschied zu der anderen WordPress Installation war, folgende Konfiguration in der wp-config.php:
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
$_SERVER['HTTPS'] = 'on';
Kein Plan wieso das bei der einen Installation enthalten war und der anderen wieder nicht. Eventuell gab es bei der Installation einen Diese Seite befindet sich hinter einem Reverse Proxy Button, an den ich mich nicht erinnere. Allerdings weiß ich nicht wieso ich das dann bei der einen Installation ausgewählt haben soll und bei der anderen nicht, da beide vorher nicht hinter einen Reverse Proxy liefen. Natürlich muss auch vom Reverse Proxy der Header entsprechend gesetzt werden, damit es funktioniert, was man in Nginx z.B. wie foglt tut:
Schon lange her das ich hier mal was geschrieben hab, aber irgendwie fehlte mir immer ein Thema um was zu schreiben oder wenn es eins gab, die Lust. Jetzt habe ich aber mal eins, mit dem ich mich die letzten Tage ein wenig auseinander gesetzt hab und überwinde hiermit meine Faulheit und schreibe etwas dazu. :-)
Einleitung
Seit ungefähr Anfang des Jahres bring ich mir selbst programmieren bei und nutze dafür meine Lieblingssprache Lua. Warum Lua? Naja, ich habe schon mal einen Versuch gestartet programmieren zu lernen und zwar mit Python, aber aus irgendeinem Grund langweilte es mich schnell. Versteht mich nicht falsch, Python ist ne coole Sprache, aber irgendwie sprang bei mir da der Funke nicht über. Ganz anders sah das bei Lua aus, auf die ich über den XMPP Server Prosody aufmerksam wurde, wo ich direkt Spaß am schreiben und lesen hatte und hab. Außerdem gefällt mir die minimalistische Natur von Lua, die natürlich nicht nur Vorteile hat. Leider ist sie nicht so weit verbreitet, was den Umfang an vorhanderen Modulen (Libraries) sehr überschaubar macht und ein guter Teil davon auch etwas alt ist. Da ich jemand bin der am besten was versteht und behält indem er es einfach tut, suchte ich, nachdem ich ein paar Tage in Programming in Lua geschmökert hatte, eine Möglichkeit zu üben. Ein Bekannter empfohl mir exercism.io (das ich an dieser Stelle nur wärmstens empfehlen kann), wodurch ich auch direkt mit Test Driven Development in Berührung kam. Seitdem versuche ich immer neben einer guten Dokumentation auch meine „Software“ mit Tests auszustatten. So kam mir dann auch mal langsam der Gedanke sich mit Continuous Integration auseinander zu setzen.
Btw. hier mein bisherigen „Projekte“:
lua-netio – ein API Client Modul zum steuern von Netzwerksteckdosen der Firma NETIO products a.s.
lua-ssllabs – ein API Client Modul für Qualys SSL Labs Server Test API (v3)
emoji-downloader – ein CLI Tool zum downloaden von Custom Emojis von Mastodon oder Pleroma Instanzen
Ich bin immernoch sehr viel am experimentieren und lernen, also ja, der Code sieht mit Sicherheit für den geübten Programmierer an vielen Stellen ziemlich hässlich aus. Für Hinweise bin ich dankbar btw. ;-)
Die Umgebung
Derzeit sind die verbreitesten Lua Versionen Lua 5.1, 5.2 und 5.3. Daneben gibt es zwar noch LuaJIT, aber das lass ich meist außen vor, da wenn es mit Lua 5.1 funktioniert in der Regel auch mit LuaJIT funzt. Gegen diese Versionen möchte ich also auch meine Module testen, was bedeutet das ich diese dann auch installieren muss. Außerdem wird der Paketmanager LuaRocks benötigt, um Abhängkeiten zu installieren. Außerdem wäre es auch möglich das getestete Modul direkt auf luarocks.org zu publishen, das hab ich aber noch nicht gemacht und ist deshalb nicht Part von dem Artikel.
Da ich primär mein eigenes Gitea nutze, entschied ich mich auch einen CI Service zu nutzen der mit Gitea zusammenarbeitet und dies ist Drone. Mit Drone habe ich schon einmal herumgespielt, bevor ich mein Gitea aufsetzte und es gefiel mir schon damals recht gut. Nur hatte ich noch keinen Einsatzzweck und so warf ich den Container irgendwann wieder weg. Drone baut auf Docker auf, wie so fast jedes CI System glaub ich, was man auch sehr an den Konfigurationen sehen kann, welche docker-compose Konfigurationen ähneln. Somit werden auch alle Sprachen unterstützt für die es einen entsprechenden Container gibt und wenn es keinen gibt, macht man sich einen. Für Lua würde also eine .drone.yml in etwa so aussehene:
Diese Konfiguration würde nun z.B. sagen: „Nimm für den Job build, das Docker Image some/lua${LUAVERSION}:image, installier das Unit Testing Framwork busted mit LuaRocks und führe die Tests anschließend aus. Achja und dies tust du bitte für alle drei Lua Versionen.“
Docker Images für Tests
Leider gibt es nicht all zu viele fertige Images mit Lua und LuaRocks und die wenigen die es gibt, basieren dann entweder auf Debian oder Ubuntu (Größe so ~300MB), werden nicht mehr gepflegt oder sind irgendwie buggy. Am vielversprechendsten waren die Images von akorn, welcher allerdings die Lua Versionen mit Platform posix, statt linux kompiliert, was dazu führt das ein paar in C geschriebene Module, wie z.B. luafilesystem nicht nutzbar sind. Dazu habe ich auch schon ein Issue bei ihm erstellt. Sollte er das anpassen oder mich auf einen Fehler meinerseits hinweisen, werde ich vermutlich seine Images nutzen. Bis dahin allerdings habe ich die Dockerfiles angepasst und local die Images erstellt, sodass sie Drone nutzen kann. Das Image das aus meinen LuaRocks Dockerfiles erstellt wird ist mit 187MB zwar dennoch recht groß, allerdings sind auch schon eine Reihe von Build Tools enthalten, womit sich in C geschriebenen Abhängigkeiten direkt installieren lassen sollten. Das cleane Image von akorn ist hingegen ca. 12MB groß.
Alternativ kann man auch das offizielle Python Image nehmen und darin das Tool hererocks installieren. Mit diesem kann man dann Lua und LuaRocks in ein Projektverzeichnis installieren und anschließend nutzen. Wenn man sich die Lua Docker Image Situation anschaut, ist dies sicher auf den ersten Blick die einfachste Lösung. Allerdings komme ich persönlich nicht damit klar, ein 1GB großes Image zum testen eines paar KB großen Modules zu verwenden. Wenn man sich natürlich keine Sorge um Ressourcen machen muss, dann kann man das natürlich tun, bzw. soweit ich das bisher gelesen hab, hat man, wenn man Travis CI nutzt, nicht wirklich viele Auswahlmöglichkeiten mit Lua.
Tests bzw. Specs
Wie weiter oben in dem .drone.yml Beispiel zu sehen ist, nutze ich das Unit Testing Framwork busted von OlivineLabs. Neben busted gibt es noch wesentlich schmalere Unit Testing Framworks, da ich aber durch exercism.io bei busted gelandet bin, nutze ich dieses auch seitdem. Hier mal ein kurzes Beispiel wie ein Test, bzw. in bustedSpec genannt, aussehen kann: Ein simples Modul:
-- hello.lua
return {
say = function(str) return 'Hello ' .. str end
}
Die Spec dazu:
-- spec/hello_spec.lua
local hello = require('hello')
describe('hello lib', function()
it('says hello to you', function()
assert.equal('Hello you', hello.say('you'))
end)
end)
Kurz zur Erklärung: Mit describe definiert man eine Gruppe von Specs und mit it definiert man eine Spec. assert ist hier die monkeypatched Version von Lua’s assert und wird hier für assertions (übersetzt man das in Behauptungen?) genutzt. Wenn assertations zutreffen, gilt der Spec als bestanden und es wird ein grüner Punkt zurück gegeben, wenn nicht gibt es einen roten Punkt und der Spec gilt als nicht bestanden. Die Ausgabe für das obige Beispiel würde dann wie folgt aussehen:
Für das obige Beispiel, habe ich meine .drone.yml wie folgt angepasst:
Mit -o TAP sage ich das busted als Output Handler das TAP (Test Anything Protocoll) benutzen soll. Sobald gepusht, fängt Drone auch direkt mit den Tests an:
Ist der Test durchgelaufen, sieht man dann den Status hinter dem Commit:
Statische Code-Analyse
Obwohl es schon mein IDE macht, lasse ich in der Regel dennoch gern, vor den eigentlichen Tests, eine Linter über meinen Code drüber laufen. Dafür nutze ich luacheck, welches verbreitete Fehler, wie z.B. deklarierte aber unbenutzte Variablen, globale Variablen, uvm. erkennt. luacheck wird ebenfalls über LuaRocks installiert und kann dann als CLI Tool benutzt werden:
Die Werte der --std Option sagen folgendes aus:
max – akzeptiere alle globale Variablen welche in allen Lua Versionen genutzt werden
+busted – akzeptiert globale Variablen die von busted deklariert werden, also z.B. describe oder it (dies brauch man natürlich nur wenn man auch seine Spec Dateien mit analysieren lässt)
Eine .drone.yml für luacheck würde dann wie folgt aussehen:
Und wie definiert wird das ganze dann auch von Drone ausgeführt:
So das soll der Bericht über meine ersten CI Gehversuche sein. Neben Testing und Linting werde ich wohl zukünftig auch noch Coverage Analysen mit LuaCov einbauen, aber da habe ich bisher noch keine Lust gehabt mich mit auseinander zu setzen. Außerdem habe ich gemerkt das ich mich nun doch langsam mal ein bisschen ausführlicher mit Docker beschäftigen muss. Bisher habe ich das Thema immer umschifft, da ich es nie wirklich gebraucht habe, bzw. LXC mir vollkommen ausreichte.
Vielen Dank fürs lesen und fals es Anmerkungen gibt, freue ich mich sehr davon zu hören/lesen. :-)
UPDATE: Erstaunlicherweise wurde ein Update auf Android 8 für die Mi Box 3 bereit gestellt, womit ich ja gar nicht gerechnet hatte. Seitdem treten die unten beschriebenen Probleme nicht mehr auf und ich konnte bisher auch noch keine Neuen feststellen.
Ich habe seit Anfang letzten Jahres die Set-Top-Box Xiaomi Mi Box 3 im Einsatz. Hier möchte ich nur mal eine kleine Liste von Problemen und deren Lösung aufstellen, die ich primär mit der Netflix App hatte:
Netflix App: Auflösung wird nicht unterstützt
Wenn man das Netflix Abo mit 2 Geräten hat, über welches man Videos in HD Qualität abspielen kann, und man die Mi Box in Full HD betreibt, kam es in der Vergangenheit oft dazu, das Netflix meldete, das die Auflösung nicht unterstützt wird. Das hängt irgendwie damit zusammen, dass die Netflix App in die Android Version intergriert ist und wenn man die Box nun in Full HD betreibt, die Videos bei Netflix auch in dieser Auflösung angefragt werden und Netflix dann halt antwortet, das man nicht berechtigt ist diese zu schauen.
Lösung
Man muss die Auflösung in der Box auf 720p stellen, dann sollte es wieder funktionieren. Zeitweise hatte Xiaomi das Problem mal gefixt und man konnte die Box wieder in voller Auflösung fahren, allerdings hielt das nicht lang. Ich fuhr die Box seitdem in 720p und seit gestern habe ich das höhste Abo, weswegen ich nicht sagen kann ob sie das nun gelöst haben oder ob es immernoch auftritt.
Netflix App: Probleme nachdem die Mi Box aus dem Standby erwacht
Die Mi Box läuft in der Regel immer, wenn man nicht den Strom trennt, und geht beim ausschalten des TV’s in Standby. Schaltet man den TV an und möchte direkt Netflix schauen kann es zu Problemen kommen, welche da wären:
Wenn man die Netflix App nicht geschlossen hat, bevor man den TV abgeschaltet hat, zeigt diese nach dem einschalten statt der Thumbnails überall, das es ein Problem mit der Verbindung gibt.
Oben genanntes Problem kann auch auftreten wenn man die Netflix App zuvor geschlossen hat.
Man macht die Netflix App auf, nachdem man die Mi Box aus dem Standby geholt hat und 2s nach dem Start eines Titels meldet die App „Wir haben derzeit Probleme bei der Wiedergabe dieses Titels. [..]“
Lösung
Die App über Einstellung -> Apps beenden und anschließend die App wieder starten
Die Box komplett rebooten
Bild und Ton nicht synchron
Dieses Problem ist mir bisher erst einmal unter gekommen und ich dachte erst das es nur die Netflix App wäre, allerdings trat das Problem in jeder App auf. Auch ein beenden der Apps oder Neustart der Box brachte keine Ändungen.
Lösung
Besserung brachte folgendes, was ich mir aber nicht ganz erklären kann wieso das funktioniert:
Mi Box stromlos machen
HDMI Kabel ausstecken
1-2 min warten
Alles wieder einstecken
Anschließend läuft Bild und Ton wieder synchron.
Anmerkung 26.03.18: Das Problem ist damit nicht dauerhaft gelöst, in meinem Fall tritt es immer mal wieder auf. Was mich verwundert ist, das es vorher nie aufgetreten ist, eigentlich erst seitdem ich die Box wieder 1080p statt 720p laufen lasse.
Nachdem ich Anfang des Jahres, über Thomas Leister seinem Beitrag zu Mastodon, auf Milan seine Instanz und damit ins Fediverse gefunden hatte, dachte ich mir das ich heute mal kurz etwas über die Software Pleroma schreibe, womit ich seit ein paar Monaten eine Instanz betreibe.
PleromaFE frontend auf social.kokolor.es
Pleroma setzt sich aus zwei Komponenten zusammen, dem Frontend und dem Backend, welche getrennt voneinander entwickelt werden. Das hat den Vorteil das das Frontend (PleromaFE) nicht an das Backend gebunden ist und auch für GNUsocial oder postActiv verwendet werden kann. Dadurch wurde ich auch auf das Projekt aufmerksam, da ich, nachdem ich meine postActiv Instanz Anfang des Jahres aufgesetzt hatte, keinen Bock mehr auf das Frontend Qvitter hatte, da dieses bei mir jeden Tag neue Fehler produzierte und ich schon eine ganze Weile das Classic Frontend einsetzte, welche allerdings optisch als auch technisch, stark in die Jahre gekommen ist. Ich war von Anfang an von PleromaFE begeistert, da es schlicht und simpel aufgebaut ist. Quasi genau das was ich gesucht hatte. Ich fing dann an dem Hauptentwickler @lain zu folgen und erfuhr so das sich ein Backend ebenfalls in der Entwicklung befand. Ein paar Monate vergingen und irgendwann Mitte des Jahres ging die erste Testinstanz online und Anfang August entschied ich mich dann ebenfalls mal eine Instanz aufzusetzen und schrieb eine kleine Quick and Dirty Anleitung darüber, da noch keine existierte.
PleromaFE und PleromaBE running on edolas.world
PleromaBE ist in Elixir geschrieben und verwendet das Phoenix Framework. Implementiert ist das OStatus und ActivityPub (derzeit nur intern) Protokoll, außerdem die Twitter und Mastodon API, und ist dabei so ressourcenschonend, dass es auf einem Raspberry Pi läuft oder wie meine Testinstanz, auf einer 2€ VM mit 512MB RAM. Dadurch das auch die Mastodon API implementiert ist, funktioniert auch das Mastodon UI als Frontend und die Mastodon Apps für mobile Betriebssyteme mit PleromaBE. Standartmäßig sind beide UI’s enthalten, wobei PleromaFE der Standart ist. Neben dem ganzen technischen kommt noch dazu, dass das ganze Entwicklerteam rund um die Software ein netter und verrückter Haufen ist, bei dem man sich nie von oben herab behandelt fühlt, wenn man mal Fragen hat und die auch für Kritik und Vorschläge offen sind, was man von anderen Softwareprojekten leider nicht behaupten kann. Wegen all diesen Punkten und weil ich das Gefühl habe das diese Software mit der richtigen Portion an Weitsicht entwickelt wird, ist es derzeit meine favorisierte Mircoblogging Software.
Wer sich selber mal davon ein Bild machen möchte, der kann mittlerweile aus einer Reihe von Instanzen wählen. Hier mal drei Stück mit einer offenen Registrierung, die mir gerade einfallen:
Wer eine eigene Instanz aufsetzen möchte, der kann sich die in der README enthaltene Basis Anleitung im git durchlesen oder schaut mal ins Wiki, wo schon ein paar Step-by-Step Anleitungen existieren, welche mit unter auch von mir stammen und mein bescheidener Beitrag zu diesem Projekt sein soll, da ich beim programmieren eher weniger hilfreich bin.
Das soll es erstmal gewesen dazu gewesen sein. Wenn es Fragen gibt, das ganze euch interessiert oder ihr was beisteuern wollt, die softwarebezogene Kommunikation findet über Matrix, bzw. dem IRC Channel #pleroma auf Freenode statt.
Ein Kumpel ist in eine neue Wohnung gezogen, welche nicht weit von meinen Eltern entfernt ist. Da es noch eine Weile dauert bis er Internet da hat, kam ich auf die Idee das man ihn doch temporär bei meinen Eltern dran hängen kann. Was vorher eher als Scherz gedacht war, wollte dann aber doch ausprobiert werden, denn die nötige Hardware war vorhanden.
Ich schnappte mir also meinen CPE210, der derzeit nur im Schrank rumm lag und und lötet hier wieder die Antennen um, da ich hier ja eine durch eine Rundstrahler Antenne getauscht hatte. Anschließende flashte ich hier LEDE als Firmware auf den Router und konfigurierte ihn als AP. Mein Vater hat, aus Zeiten als es noch kein Internet in meinem kleinen Heimatdorf gab, eine kleine Antennenhalterung einer ehemaligen WIMAX Antenne auf dem Dach, welche perfekt für den CPE passte. Ich kletterte also aufs Dach, befestigte den Router und richtete ihn ungefähr in die Richtung aus, wo die neue Wohnung sich befindet. Erstaunlicherweise habe ich sogar im Garten meiner Eltern, direkt unter dem Router recht guten Empfang, was aber bei der Öffnung der Antenne gar nicht der Fall sein sollte, aber naja. Als Gegenstelle, welche bei meinem Kumpel ans Dachfenster kommt, kommt eine Picostation M2 zum Einsatz. Diese hatte ich mal als Freifunkrouter bei meinem Vater auf dem Dach, welcher allerdings irgendwann mal, aus Gründen, wieder abgenommen wurde und seitdem herum lag. Auf dieser hatte ich irgendwann mal wieder die Stock Software aufgespielt, welche ich auch drauf ließ und den Router einfach als „Station“ konfigurierte, welcher sich mit dem CPE verbindet. Befestigt wurde die Picostation neben einem Dachfenster, indem wir einen Winkel in einen Schlitz zwischen zwei Blechen einklemmten und daran den Router befestigten. Eine Verbindung kam auch prompt zustande, allerdings ist die Geschwindigkeit…naja überschaubar. Mein Kumpel hat nun eine, ein klein wenig schwankende, DSL4000er Leitung, mit welcher man aber bequem 720p Youtube und Netflix gucken kann. Ich habe noch ein paar Stunden mit unterschiedlichen Ausrichtungen der Router und unterschiedlichen Channeln verbracht, allerdings wird es wohl an den Bäumen und drei Häusern liegen, das das Signal nicht sooooo gut ist, aber als Übergang wird es reichen. Klar, ich könnte mir jetzt noch eine Richtantenne für einen normalen Router bauen, aber das ist mir der Aufwand jetzt nicht wert.
UPDATE: Wie angekündigt, nochmal eine kurze Rückmeldung: Mein Rechner lief jetzt seit diesen 14 Tagen durch ohne das das Problem aufgetreten ist. Das wäre vorher nicht gegangen, somit würde ich sagen Kernel Upgrade bringt was. ;-)
Ich hab schon seit Beginn an mit Xubuntu 16.04 das Problem, das in einem von zehn Aufweckversuchen aus dem Standby, so gut wie keine Buchstaben mehr da sind. Außer bei ein paar einzelnen Programmen wie Chromium oder Thunderbird, wo dennoch Buchstaben angezeigt werden. Ich hatte mich damit auch schonmal beschäftigt, konnte aber nichts näheres herausfinden woran es liegen könnte, und ein paar Testeinstellungen in der xorg.conf brachten auch nicht wirklich Besserung. Außerdem trat der Fehler auch „relativ“ selten auf und ich hab ihn auch nicht absichtlich reproduziert können, wodurch mir der Fehler irgendwann wieder egal war und ich damit lebte. Heute trat er allerdings wieder auf und da bekam ich so einen Hals, das ich mich da nochmal mit beschätigte und einen Bugreport fand, der dieses Problem beschrieb. Das Problem hat offenbar mit dem Kernel 4.4 zu tun, da auch Benutzer von Ubuntu 14.04 mit Xenial Kernel von dem selben Problem berichteten. Die Lösung sei hier den Kernel 4.8 zu installieren, welcher das Problem beheben soll. Unter 16.04 macht man das wie folgt:
Laut dem Bugreport soll der Fehler danach nicht mehr auftreten. Ich bin gespannnt und werde nach 14 Tagen hier nochmal ein kleines Update reinschreiben.
Ich denke jeder kennt nohup und was man damit macht. Deshalb hier nur ganz kurz – Führt man z.B. etwas auf einer entfernten Maschine einen Befehl aus und loggt sich aus, wird das HUP Signal an den Prozess gesendet und in Folge dessen terminiert. Stellt man nun nohup vor den Befehl, wird das HUP Signal ignoiert.
Dieser Artikel soll eher für mich eine kleine Gedankenstütze sein, da ich kürzlich, remote, einen Befehl mit vorangestelltem nohup ausführen wollte, der es allerdings nicht tat. Und zwar führte ich ihn wie folgt aus:
STDOUT und STDERR werden eigentlich standartmäßig nach nohup.out umgeleitet, laut manual. Laut Stackoverflow muss man aber alle I/O Stream bei remote nohup Kommandos umleiten. Folgendes funktionierte dann auch:
Steuererklärung…ja spannendes Thema das jeder liebt. Ich gehöre zu denen die noch nie eine gemacht haben. Zwar hab ich schon zwei mal damit angefangen, aber jedes mal wieder abgebrochen, da es mir den Aufwand einfach nicht Wert war. Jeder sagte zwar immer „Ja, die Programme machen alles für dich, das ist einfach.“. Diese Aussage konnt ich nie nachvollziehen. Man wird da zwar an die Hand genommen, aber ich kam immer wieder an den Punkte wo mir das Programm vorschlug hier jetzt Option A oder B einzutragen. Ich hatte aber Option C, welche irgendwie in A und B passen würde, was nun? Dann kommt noch dazu die ganzen Belege zu suchen… Ich bekomm schon richtig Lust während ich das hier schreibe… Naja jedenfalls hat mir mein Vater nahe gelegt das doch mal zu machen, da ich von zu Hause aus arbeite und das sicher lohnen würde. Also heute mal hingesetzt und geguckt ob es denn Steuererklärungsprogramme gibt die nativ unter Linux laufen, obwohl ich die Antwort schon kannte. Ein paar sollen allerdings gut mit Wine laufen, unter anderem das Program tax2017 von Buhl. Das passte mir ganz gut in den Kram, da ich mit diesem damals meinen zweiten Versuch unternahm und ich das als recht übersichtlich in Erinnerung hatte. Also mal schnell gesucht, welche Wine Version denn dafür zu empfehlen ist und wurde im Forum des Herstellers fündig. Benötigt wird also folgendes:
tax2017
Wine >2.4
Aktuelles Winetricks
Visual C++ 2015 libraries
Die Wine Version muss dafür aus dem Repo des Winehq installiert werden, welches man wie folgt hinzufügt:
Dies installiert die derzeit aktuellste Developer Version von Wine (zu diesem Zeitpunkt 2.11.0). Als nächstes installiert man Winetricks. Allerdings nicht aus dem Ubuntu Repository, da die Version ganz schön in die Jahre gekommen ist und damit eine Installation von vcrun2015 nicht funktioniert:
Man sollte nun Winetricks einmal über die Konsole ohne Argumente aufrufen, damit es sich konfiguriert und noch ein paar Abhängkeiten installiert. Anschließend kann man das Fenster schließen und auf der Konsole folgendes ausführen um vcrun2015 zu installieren:
winetricks vcrun2015
Soviel zur Vorbereitung von Wine. Nun kann man die Setupdatei von tax2017 ausführen und die Installation sollte durchlaufen und das Programm anschließend starten. Ich kann noch nicht sagen ob es noch irgendwo Fehler gibt, da ich nun erstmal irgend nenn Code, für das automatische vorausfüllen der Steuererklärung, beantragen musste der mit PER POST zugeschickt wird. Das ist unter anderem auch so ein Punkt der mich immer wieder ankotzt. Man nimmt sich vor heute mal die Steuererklärung zu machen und dann kommt „Bitte beantragen sie das und das – Vielen Dank, Sie werden den Zugangscode in ca. 2 Tagen in ihrem Briefkasten haben.“. 2017 FTW!
Vor ein paar Wochen hat ein Kumpel sich einen neuen Rechner gekauft und in diesem Zuge auch direkt mal sein System neu gemacht, von vorher Ubuntu 12.04 nach nun Xubuntu 16.04. Er meldete sich dann bei mir, weil er seinen Drucker, einen Canon PIXMA MG5250, nicht installiert bekommt. Er hatte bereits die richtigen Treiber herunter geladen und entpackt, allerdings meckerte die install.sh beim ausführen das eine Abhängkeit nicht erfüllt ist:
[...]
Entpacken von cnijfilter-mg5200series (3.40-1) ...
dpkg: Abhängigkeitsprobleme verhindern Konfiguration von cnijfilter-mg5200series:
cnijfilter-mg5200series hängt ab von libtiff4; aber:
Paket libtiff4 ist nicht installiert.
[...]
Nun ist der Treiber von 2011, also eher so Ubuntu 10.04. Unter 16.04 gibt es nun kein libtiff4 mehr, sondern libtiff5. Gut dacht ich mir, bearbeiteste mal schnell das control file des Pakets und ersetzt libtiff4 durch libtiff5. Für solche schnellen Sachen benutzt ich gern ein Script, welches ich mal vor einer Weile gefunden hatte: https://ubuntuforums.org/showthread.php?t=636724. Nachdem ich das control file angepasst hatte, lief die install.sh auch durch und der Drucker lies sich einrichten. Ich macht dann einen Testdruck, allerdings passierte nichts. Die Daten wurden scheinbar korrekt übermittelt und man sah im Display des Druckers, dass dieser auch die Daten empfing, aber anschließend einfach nichts tat. Weder der Drucker noch Ubuntu gaben einen Fehler aus. Nach einer kurzen Recherche, ob denn der Druckertreiber mit libtiff5 zusammenarbeitet, fand ich den Artikel von Klaus Munsteiner. Also bin ich dem Artikel gefolgt und habe libtiff4 installiert und anschließend kam auch etwas aus dem Drucker.