Mein erstes Buch in 2022

In der letzten Zeit schreibe ich bedeutend weniger Bücher als früher. Über viele Jahre war es üblich, dass ich neben Schulungsunterlagen und Beiträgen in Fachzeitschriften pro Jahr regelmäßig noch mindestens  2 – 3 Bücher geschrieben habe. Meine Publikationen haben sich mittlerweile aber mehr auf Schulungsunterlagen und vor allen Dingen Videoproduktionen bei LiL verlagert.

Aber ganz kann ich das Schreiben von Büchern nicht lassen. Entweder im Selbstverlag, aber auch weiter bei großen Verlagen wie Springer. Und da ist heute mein Buch zu JavaFX bzw. OpenJFX erschienen.

Es handelt sich um eine Aktualisierung meines JavaFX-Buchs aus dem Jahr 2014. Das war also wirklich in die Jahre gekommen, aber jetzt ist die Sache wieder auf dem aktuellen Stand.

Auch wenn JavaFX mittlerweile „offiziell“ in OpenJFX umbenannt wurde, ist der Name JavaFX weiter präsenter und wird auch in vielen Quellen weiter verwendet. Deshalb auch der etwas „sperrige“ Name „Einführung in JavaFX/OpenJFX“.

Telekommunikationsmindestanforderungsverordnung der Bundesnetzagentur

Gerade lese ich einen Artikel, dass die Bundesnetzagentur in dem Entwurf der sogenannten „Telekommunikationsmindestanforderungsverordnung“ 10 Mbit/s im Download, eine Uploadrate von 1,3 Mbit/s und 150 Millisekunden bei der Latenz für einen Internetzugang als ausreichend ansieht. Die Bundesnetzagentur nennt das ausdrücklich „Mindestanforderungen an einen Internetzugang, der alle relevanten Online-Dienste ermöglicht“. In dem Artikel wird sich echauffiert, dass das total lächerlich wäre.

Auch wenn ich kein Freund der Bundesnetzagentur bzw. bürokratischen und veralteten Behörden bin (ganz und gar nicht) – ich teile die Ansicht, dass diese Mindestanforderungen genügen. Was da in den Medien als Mindestanforderungen gehyped und von Drückern Kunden für unbedingt notwendig verkloppt wird, ist rein auf Gaming und Streaming von HD-Inhalten ausgerichtet. Es gibt doch kein Grundrecht auf latenzfreies Daddeln von Internet-Spielen oder stumpfem Konsumieren von HD-Videos irgendwelcher Streamingplattformen.

Die Zeitschrift, die ich gerade lese, behauptet sogar glatt, dass mit 10 MBit/s keine Videokonferenzen möglich wäre. Das ist so ein lächerlicher Bullshit, dass man der Zeitschrift jede Kompetenz absprechen muss. So fundiert wie ein Umsonst-Werbeblättchen, was den Briefkasten verstopft. Angeblich ein PC-Magazin und so etwas Falsches und Dummes zu schreiben. Ich habe viele Jahre mit weniger Datendurchsatz meine Online-Schulungen gehalten und parallel haben noch andere Familienmitglieder das Internet genutzt. Angeblich hatte ich da 16 MBit/s, aber es kamen real nur etwa 8 – 9 MBit/s an. Und es ging auch. Klar – mit Glasfaser geht es jetzt besser. Das ist nicht das Thema. Reinen Unterhaltungsbedarf als Maßstab für einen ausreichenden Internet-Anschluss anzusetzen, ist dumm, tendenziös und einfach nur unseriös.

Ich bin zufällig gestern von einem Glasfaseranbieter kontaktiert worden, der mich zum Wechseln animieren und mir deren Standardtarif mit 250 MBit/s andrehen will. Den langsamsten Tarif mit 100 MBit/s würden nur ältere Leute nehmen, die nicht viel mit Internet machen. Ich musst echt an mich halten. Zwar werde ich wohl schon den Vertrag eingehen, aber hauptsächlich wegen der geringeren Kosten gegenüber meinem derzeitigen Vertrag. Da habe ich zudem „nur“ (!) 50 MBit/s, aber nicht die geringsten Bedürfnisse bisher gemerkt, die mich einen schnelleren Anschluss wünschenswert erscheinen lassen.

Und ich betone nochmal – ich schule ständig remote und lade große Datenmengen ins Netz oder runter. Nur bin ich halt kein Daddler und Streamingdienste brauche ich so notwendig wie einen Kropf.

Ich will nicht infrage stellen, dass die zukünftigen Anwendungen immer mehr Datendurchsatz verlangen werden, aber derzeit ist die Aussage der Bundesnetzagentur einfach nur sinnvoll und seriös.

Multiplikation von sequenziellen Datentypen – wieder was Neues in meinem Tutorial zu Python

Mittwoch und ich schaue., welcher neue Entwickler-Tipp der Woche zu Python bei LinkedIn Learning veröffentlicht wurde. Denn in welcher Reihenfolge die Tipps freigeschaltet werden, entzieht sich meiner Kenntnis – oder besser meinem Bewusstsein. So gesehen bin ich selbst jeden Mittwoch überrascht und immer ganz aufgeregt, was denn hinter dem Türchen des Weihnachtskalenders verbirgt. 🙂

Es geht in der Woche um die Multiplikation von sequenziellen Datentypen. Es gibt meiner Meinung nach kaum eine Sprache, die diese Multiplikation von sequenziellen Datentypen so einfach macht wie Python.

Es besteht keine Notwendigkeit Edge zu verwenden

Ich halte gerade eine Remote-Schulung zu Ajax per Teams und bekomme darüber hinaus von dem Schulungsunternehme RDP-Zugang zu einem Schulungsrechner mit Windows 10. Da war XAMPP und Visual Studio Code installiert, aber leider als Browser nur Edge. Kein Problem – ich wollte dann fix Firefox noch nachinstallieren und wurde doch tatsächlich von Windows mit der unverschämten Warnung konfrontiert, dass es keine Notwendigkeit gäbe, neben Edge noch einen anderen Browser zu installieren. Doch! Im Gegenteil – gerade diese „Warnung“ macht deutlich, dass es keine Notwendigkeit für Edge gibt und es Microsoft einfach nicht lernt. So bekommt man niemals Nutzer dazu Edge zu verwenden und sich nicht über Microsoft aufzuregen.

Flottenzuwachs – oder nicht?

Ab heute gibt es einen LKW in meinem Flottenbestand. Oder auch nicht. Zu dem Forester, den ich als Geschäftswagen verwenden, und dem Trek-MTB sowie dem eBike (von der W800 will ich gar nicht reden) nenne ich jetzt einen Dacia Docker mein. Genaugenommen wollen den meine Söhne überwiegend fahren, aber ich schaue mal, ob ich den auch als 2. Geschäftswagen ansetzen kann. Der Einsatzzweck von dem Dokker, der als LKW zugelassen ist, ist ja definitiv ein anderer als der Einsatzzweck eines PKW. Aber das muss ich mit dem Steuerberater klären. Durch Corona fahre ich ja sowieso nicht mehr so viel und da muss das alles durchkalkuliert werden – auch wegen der beiden Fahrräder, mit denen ich immer mehr zwischen meinen beiden Standorten pendle.

Meine Söhne wollen aus dem Dacia einen Minicamper machen und mir schwebt in der Tat vor, dass ich bei externen Jobs, bei denen die Übernachtung nicht vom Kunden übernommen wird, darin auf dem Campingplatz übernachte. Das spart Geld, aber vor allen Dingen hat das was von Urlaub, wie ich ihn früher ausschließlich gemacht habe. Und das mit Enten (2 CV), Motorrad oder gar Fahrrad und Zelt. Da wäre ein Mini-Camper auf dem Level sogar Luxus und zudem ein Argument, warum ich ihn auch steuerlich anrechnen lasse. Denn die Kosten für Hotelübernachtungen sind höher und das wäre dann sogar im Sinn des Finanzamtes. Mal sehen.

Aber so richtig ausgegoren ist das noch nicht, wenngleich im August ein Auftrag in der Schweiz in Aussicht steht, bei dem sich das ideal anbieten würde – wenn der Auftrag denn kommt. Auch als mobiles Büro könnte das ausgebaute Fahrzeug Sinn machen, wenn ich private Dinge erledige und zwischenzeitlich was arbeiten muss.

Das Teil hat zwar schon unendlich viele Kilometer auf dem Tacho, ist aber noch recht neu, 1. Hand und super gepflegt. Dazu zwar technisch und im Inneren altbacken und „preiswert“, aber im Grunde absolut vollständig ausgestattet. Da wir ihn für kleines Geld bekommen haben, sollte das kein Fehlkauf sein und da das auch hauptsächlich das 1. Auto meiner Kidds wird – so luxuriös war mein erstes Auto damals nicht. Auch wenn der Komfort in der Tat etwas an einen kleinen LKW erinnert, was ich bei der Überführungsfahrt nach Hause gerade gemerkt habe.

Was ein Gefuddel für Android

Nachdem mir die Raspberry PIs als auch vergleichbare Platinen im Moment einfach zu teuer sind, habe ich mich daran gemacht, ein uraltes Notebook, dass ich vor einigen Monaten mit Deepin Linux neu eingerichtet habe, für die Cordova-Entwicklung einzurichten. Das ist zwar fertig, liegt aber sowieso da rum und einen Test war es mir wert.

Im Grunde geht das Einrichten von Cordova ja auch recht einfach, wenn es nicht die elenden Fallen geben würde.
Einmal ist da im Fall von Android das Problem mit der Java-Version. So richtig geht es – falls man für Android die App erstellen will – nur mit Java 8 bzw. dem JDK 8. Das Problem habe ich schon vor gefühlten Ewigkeiten bemerkt und mir immer damit geholfen, dass ich eben Java 8 installiert habe. Neben den aktuellen Versionen. Leider ist es dann aber blöde, weil man für Gradle-Skripte (zumindest die vorgefertigten von Cordova) die Default-Version von Java auch auf eben dieses Java 8 umstellen muss. Das geht in Linux (Debian, Ubuntu, Mint und Derivate) so:

sudo update-alternatives --config java

In der Folge kann man zwischen den installierten Java-Versionen auswählen und eine davon zur Default-Version machen. Aber dann muss man dann auch noch JAVA_HOME korrekt setzen. Etwa so:

env JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/

oder

export JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/

Ging unter Deepin als normaler User, aber komischer Weise hat das als root nicht funktioniert bzw. die Einstellungen wurden nicht übernommen. Letztendlich habe ich viel rumgebastelt, wieder viel gelernt, bin aber wie so oft im Grunde gescheitert.
Wobei das Problem mit Java 8 ist vermutlich ein ganz anderes, als man vermutet. Denn vor einigen Monaten hatte ich eine Schulung rund um Java EE gehalten und da hatten wir bei JSF ein ähnliches Problem. Die Meldung sah so aus als wäre die Version von Java nicht passend bzw. zu alt, obwohl sie neuer als die geforderte/angezeigte Version war. Ganz wie hier bei Cordova. Aber dann ist mir aufgefallen, dass die Versionsnummern in dem Framework nur einstellig (!) evaluiert wurden. Also Java 11 oder Java 17 werden als Java 1 interpretiert. So was vermute ich mittlerweile auch bei Cordova bzw. den Gradle-Skripten. Man müsste es mal mit Java 9 testen, aber dazu habe ich im Moment keine Zeit.
Letztendlich ist aber sowieso das Hauptproblem dieses elende Android-Gefuddel. Das Android-SDK und die Android-Tools etc. habe ich nach und nach alle installiert, aber ständig kam die Meldung, dass das Zeug nicht da wäre. Genaugenommen hat das Gradle-Skript diese Meldung gebracht. Letztendlich habe ich sogar das Android Studio auf dem uralten Notebook mit Deepin installiert, dort diverse Fernzugriffservice eingerichtet und gestartet, alle möglichen SDK-Versionen nachinstalliert und sogar ein Cordova-Template im Android Studio als Plugin eingerichtet.
Resultat – das Gradle-Skript weigert sich, die Android-Ressourcen zu finden. Und selbst das Android Studio nimmt dieses Gradle-Skript und kennt sich quasi dann selbst nicht mehr.

Irgendwann hatte ich die Faxen dicke, denn so schön Deepin Linux von der Oberfläche auch ist – es hat so ein paar Macken, die ich von der administrativen Seite nicht wirklich gut finde. Und der VNC- als auch RDP-Zugriff haben darauf ums Verrecken nicht funktioniert. Nur ssh – auch mit X-Umleitung von einem anderen Linux-Rechner.
Apropos anderer Linux-Rechner – das ist mein Terra-Notebook, auf dem ich Windows 10 und Mint Linux im Dualboot betreibe. Unter Windows habe ich das Cordova (auch für Android) mit Visual Studio 2017 im Griff (und im Prinzip auch mit dem Android Studio – das macht aber keinen Spass). Die Linux-Version kann ich aber seit Monaten nicht mehr aktualisieren oder da ein Programm installieren. Die Sache hier war für mich der Anlass, dass Problem mal anzugehen. Denn egal was ich probiert habe die letzte Zeit – mit der Fehlermeldung, dass die Quellen nicht zu lesen wären, haben sämtliche Aktualisierungsversuche als auch Installationsversuche abgebrochen.
Ich bin nun auf den Lösungsansatz gestoßen, dass man die Datei mit einem geeigneten Repo füllen sollte. Etwa das:

sudo nano /etc/apt/sources.list
deb http://de.archive.ubuntu.com/ubuntu bionic main restricted

Habe ich gemacht – keine Wirkung!
Dann habe ich endlich die Meldung genauer angesehen – Linux hat nicht die Datei /etc/apt/sources.list beim Installieren/Aktualisieren ausgelesen, sondern die Datei /etc/apt/sources.list.d/vivaldi.list.
Aus irgendeinem Grund wurde der Pfad umgebogen. Wo genau, habe ich noch nicht raus, aber einfach das Repo da reingeschrieben. Und gut ist es – aktualisieren und installieren geht wieder.
Jetzt kann ich auch mal den Linux-Rechner nutzen und versuchen, da Cordova-Apps für Android zu kompilieren. Wenn das auch da nicht geht, habe ich ja immer noch Visual Studio 2017 und meinen Docker-Container.

Und so ganz unwahrscheinlich ist es nicht, dass ich darauf beschränkt bleibe. Denn bei dem Mint-Linux ist node.js und damit auch npm in einer alten Version dabei. Was nicht schlimm wäre, wenn nicht jede Art der Installation, die ich versucht habe, immer diese uralte Version 8 installiert hätte. Mit apt bzw. apt-get entfernt, neu installiert, andere Quellen genommen, verschiedene Package-Manager ausprobiert -> immer die Version 8, obwohl es schon die Version 18 gibt. Ein Problem führt bei den ganzen Aktionen – wie eigentlich immer – zum nächsten.

Ich bin jetzt auf das Level zurückgegangen, dass ich die Quellcodes von Git geholt und dann bei mir neu kompiliert und installiert habe.

Also klassisch

git clone https://github.com/joyent/node.git

Und dann:

./configure
make
make install

Dazu gibt es im Netz eine ziemlich gute Anleitung.

Der kleine Hinweis dort, dass das Kompilieren ein „bisschen länger“ dauert, war aber untertrieben. Ich bin mit der Erwartung von vielleicht 30 Minuten maximal in den make-Befehl rein und nach gut 5 Stunden war noch kein Ende zu sehen. Das Zeug ist dann über Nacht durchgelaufen und heute morgen war es erledigt. Das dauert also brutal lang, wobei mein Terra-Notebook auch schon in die Jahre gekommen ist.

Anyway – die Sache ging durch und nun habe ich node.js bzw. npm in der Version 18. Cordova ist damit auch eben fix installiert und wie es mit Android aussieht, schaue ich mir später an. Das ist ja die einzige kritische Stelle.

 

Preisexplosion beim Raspi

Ich muss zugeben, dass ich mir lange keine Preise für Hardware angesehen habe. Und schon gar nicht für den Raspberry Pi. Hin und wieder krame ich meinen alten Raspi der Version 1 raus und experimentiere damit rum. Aber die Version 1 ist wirklich so schwach auf der Brust, dass man damit eigentlich nur testen kann, welche Minimalhardware für gewisse Dinge notwendig ist und dabei braucht man viel Zeit und Geduld, bis die Programme starten bzw. fertig sind. Und wirklich nützliche Anwendungen habe ich in dem Bereich wenig gefunden, weil ich keine Hardwaresteuerung programmiere. Einzig die Ausführung von einem Python-Skript zur Spamabwehr ist derzeit eine produktive Anwendung des kleinen Raspi. Aber obwohl ich immer noch unter massivem Spambeschuss stehe, haben sich mittlerweile wohl die Antispam-Cloud-Dienste und die internen Spam-Abwehrmechanismen auf die neue Art des Spams eingestellt, die vor einigen Wochen wie eine Schlammlawine durchs Netz gewalzt ist. Der Raspi hat also als Torwächter wieder weniger zu tun. Bei einer anderen Anwendung hat aber die extrem schwache Hardware die Hürden nicht geschafft. Ich wollte für die kommende Cordova-Vorlesung, die ich an der TH Bingen ab übernächster Woche halte, ein Linux-System so konfigurieren, dass Cordova-Android-Apps kompiliert und nach Möglichkeit auch in einem Emulator (oder zur Not auf einem per USB angeschlossenen SmartPhone) ausgeführt werden. Da für Cordova eine ganze Reihe an recht alten Bibliotheken (JDK 8) auf der einen Seite und den elend vielen Ressourcen im Fall von Android auf der anderen Seite verlangt werden, ist meine Workstation nicht passenden konfiguriert – von meinem Matebook mit der kleinen SSD ganz zu schweigen. Und ich habe keine Lust, nur für die Vorlesung meine gesamten Konfigurationen durcheinander zu bringen und zig Sachen da zu installieren, die ich sonst nicht mehr brauche.

Zwar habe ich einen passenden Docker-Container noch von der letzten Vorlesung vorbereitet und auf den neusten Stand gebracht und auch mein altes Terra-Notebook hat Cordova sogar mit Visual Studio verfügbar (das geht maximal bis Visual Studio 2017 und das habe ich aus dem Grund auch noch auf dem alten Notebook gelassen). Aber unter meinen Linux-Systemen klappt die Installation von Cordova und den Android-Ressourcen nicht so richtig. In dem parallel auf dem alten Notebook installierten Linux ist irgendwas zerschossen und ich kann gar keine Aktualisierungen vornehmen. Das muss ich vermutlich komplett neu aufsetzen. Und bei den virtuellen Maschinen habe ich sowohl bei VM Ware als auch VirtualBox eine Reihe von anderen – und ganz verschiedenen – Problemen. Alles nix Tragisches, aber es kostet Zeit und wenn ein Problem gelöst ist, kommt das nächste. Unbefriedigend und es raubt Zeit.

Da kam mir die Idee, entgegen meiner bisherigen Planungen vielleicht doch einen neuen Raspi zu kaufen und den als Linux-System ins lokale Netz zu hängen und je nach notwendigem Ziel immer wieder neu aufzusetzen. Also so eine Art Hardware-Docker-Container-VM-Ersatz. Ich hatte für den ersten Raspi so um die 35 – 40 EUR ausgegeben, bin mit der Erwartung gerade auf die Suche gegangen und fast vom Glauben abgefallen. Die wollen ja teils weit über 200 EUR für die Platine mit ein bisschen Krimskrams dazu. Ne, wirklich nicht. Das hat ja gar nichts mehr mit der ursprünglichen Idee einer möglichst billigen Platine zu tun. Ich schaue mal weiter oder vielleicht gebe ich doch alternativen Platinen eine Chance, bei denen nicht noch zusätzlich ein Hype die Preise hochtreibt. Oder lasse es.

Derzeit kann man wohl weder Sprit bzw. Öl als auch Hardware kaufen. Benzin muss leider ab und zu sein (auch wenn ich weniger fahre und zudem wenn möglich auf das Rad oder eBike umsteige), aber Hardwarekauf kann verschoben werden, bis die Preise wieder normal sind.

Nehmen wir mal an, …

…, dass mein ebike nicht wieder ständig ausgeht, wenn ich gleich damit in mein Zweitbüro nach Eppstein fahre. Ich kann die Strecke von etwa 35 Kilometer auch gut mit dem normalen Fahrrad fahren, aber Hin- und Rückweg an einem Tag ist bei den Höhenmetern heftig. Und wenn ich das mit dem ebike ohne Motor fahren soll, ist das wegen dem hohen Gewicht des Rads kein Spass. Denn in der letzten Zeit schaltet sich der Motor immer mal wieder ab während der Fahrt. Bisher habe ich ihn immer wieder anbekommen und ich habe mal alle Steckverbindungen kontrolliert und mit Kontaktspray gepflegt. Also treffe ich die Annahme (assert), dass die Sache gutgehen sollte. Und die Fahrt ist der Test.

Assert!

Das ist der Aufhängepunkt, denn bei LinkedIn Learning gibt es heute den neuen  Entwickler-Tipp der Woche zu Python mit dem Thema „Mit assert Annahmen formulieren„. Im Rahmen der sogenannten testgetriebenen Entwicklung (TDD) bzw. des Unit Testings wird sehr oft mit Asserts gearbeitet und diese werden dazu genutzt, für Tests Annahmen zu formulieren, die erfüllt sein müssen. Aber auch im Rahmen der -„normalen“ Python-Programmierung gibt es dieses Schlüsselwort assert, um eine gewisse Annahme zu treffen.

Mehrfache Rückgabewerte in einer Funktion liefern – Tutorial zu Python

Es ist Mittwoch und wie üblich da Probe mit meiner Band. Ebenso üblich ist mittlerweile, dass bei LinkedIn Learning der  Entwickler-Tipp der Woche zu Pythonveröffentlicht wird. Die Woche geht es darum, wie man bei einer Funktion mehrere Rückgabewerte liefern kann.

Neuer Lehrauftrag an der TH Bingen im kommenden Semester

Eben habe ich meinen Lehrauftrag für das nächste Semester an der TH Bingen unterschrieben und bin wegen der überbordenden Bürokratie auf 180. Ich halte Ende März wieder eine Vorsemester-Veranstaltung zur Entwicklung von plattformneutralen Apps auf Basis von Cordova. Das habe ich schon ein paar mal gemacht und auch wenn Cordova nicht mehr der neuste Schrei ist, finde ich die Idee immer noch sehr interessant. Mit Flutter und Xamarin werde ich aber auch ein paar Alternativen – wenngleich mit anderem Ansatz – einfließen lassen.

Obwohl es als Lehrbeauftragter nur recht kleines Geld gibt – ich halte solche Vorlesungen schon seit mehreren Jahren in verschiedenen Varianten und zu mehreren Themen (früher an der Hochschule RheinMain in Wiesbaden und seit 2016 an der Hochschule Bingen) und auch sehr gerne. Aber der bürokratische Aufwand, der mittlerweile damit einhergeht, verleitet den Spass.

Es ist ist unmöglich, was da an Formularen von der TH Bingen im Vorfeld gefordert wird.

Mehrfach zu unterzeichnende Lehraufträge. Auf Papier. Ok, das kann man noch tolerieren, wenngleich es natürlich DocuSign & Co gibt. Gerade bei einer technischen Hochschule sollte man erwarten, dass solche Techniken da bekannt sind und angewendet werden. Aber sei es drum – mit dem Zeug kann ich leben.

Aber nicht damit, dass ich zig Datenschutzverordnungen und sonstige Formulare ausfüllen musste. In 3-facher Ausführung und von A-Z von Hand. Name, Adresse, Funktion, Ort, Datum, Unterschrift. Dass ich meine Stunden dann auch wieder auf Papier dokumentieren und abrechnen muss, ist nur ein weiterer Stein in der Bürokartiemauer.

So lächerlich, umständlich, unbequem und Steinzeit, dass es mir vollkommen verleitet wird, noch einmal so einen Lehrauftrag anzunehmen. Die Zeit, die ich da brauche, ist zwar nicht die Welt. Aber diese lächerliche Bürokratie regt mich auf. Ich komme mir da – vor allen Dingen mit den Strafandrohungen in diesen angeblichen Datenschutzformularen – vor wie ein Schwerverbrecher, der um Begnadigung ersucht. Solche Zumutungen habe ich nicht einmal gehabt als ich für Polizei und ähnlichen Behörden oder Firmen mit sensiblen Daten gearbeitet habe. Auf der einen Seite kaum Geld zahlen wollen und auf der anderen Seite noch unverschämte Forderungen haben und Steine in den Weg legen – geht es noch? 🙁

Wobei die TH Bingen an sich nicht der richtige Adressat für meinen Zorn ist – die zuständigen Behörden im Hintergrund gehören endlich mal aus der Steinzeit abgeholt. Da muss man sich nicht wundern, dass kein IT-ler für Behörden irgendetwas machen will.

Geschweifte Klammern unter Python?

Python gilt auch deshalb als sehr klar und effizient, weil man an diversen Stellen auf Klammern verzichten kann und teils sogar muss. Insbesondere der Verzicht auf geschweifte Klammern zur Kennzeichnung von Blöcken gilt als eine der zentrale Aspekte. Aber nicht jeder Umsteiger will auf einen gewohnten Programmierstil verzichten. Es gibt auch in Python die Möglichkeit, mit etwas Aufwand Klammerung wie aus anderen Sprachen gewohnt einzusetzen. Wie das geht und worauf Sie zu achten haben, zeige ich in dem heute veröffentlichten Entwickler-Tipp der Woche zu Python von LinkedIn Learning. Wobei man im Python-API mit einem Easter egg klarmacht, dass man eigentlich nie diese Art der Klammerung machen soll.

10-jähriger Raspi-Burtstag

Da schau – heute vor 10 Jahren (allerdings wegen Schaltjahr einem 29. Feb.) wurde der Raspberry Pi vorgestellt. Das war mir gar nicht bewusst als ich vor ein paar Tagen meinen Raspi als Spam-Wächter reaktiviert habe. Wann ich mir meinen Raspi gekauft habe, erinnere ich mich nicht mehr. Aber es war die erste, wirklich extrem schwachbrüstige Version.

Alles Gute zum Burtstag kleiner Zwerg. Auch wenn ich nie so richtig wusste, was ich mit der Platine so richtig anfangen sollte, hat es doch immer Spass gemacht, auf dem Minimalrechner Dinge überhaupt zum Laufen zu bringen oder erstmal auszuprobieren, bevor diese dann auf „richtigen“ Linux-Rechnern eingesetzt wurde. Richtig stolz war ich, dass ich sogar – zumindest theoretisch – den Raspi zum Schürfen von Krypto-Coins in ein Mining-Bergwerk einschleusen konnte. Und ich konnte wie gesagt immer neue Dinge rund um Linux und Server-Administration ausprobieren, ohne irgendwelche System zu gefährden. Der Raspi ist wirklich mittlerweile Kult, auch wenn ich vermutlich keinen der neueren Generation noch ausschaffe.

(Liebe) Spamer gebt gut acht, der kleine Raspi wacht

Nachdem ich mein Python-Skript zur Identifizierung und Löschung von Spam auf Basis bestimmter Schlagworte im Betreff ein bisschen getestet habe, habe ich es sowohl auf meinem Server als auch dem Raspberry Pi als CronJob bereitgestellt. Mal sehen, wie gut die Putzkolonne das E-Mail-Postfach frei hält. Die letzten Nächte hatte ich – trotz SpamAssasin & Co jeden Morgen gut 20 Dreckmails im Postfach. Ich bin guter Hoffnung, dass Raspi einen guten Torwächter abgibt und da das Python-Skript redundant auch auf dem eigentlichen Server per CronTab aufgerufen wird, werde ich mal schauen, wie ich das in Zukunft austariere. Aber vorher werde ich das Skript noch optimieren.

Python-Skript zur Spam-Abwehr

Die momentane Überflutung mit E-Mail-Spam auf meinem eigenen Server geht mir gewaltig auf die Nerven. Ich habe die Woche etwas Zeit gehabt und immer mal wieder diverse Wege ausprobiert, um diesen Angriffen etwas entgegenzusetzen. Und dabei – das ist das Positive – doch wieder was gelernt. Ich habe zig Einstellungen und Optionen an meinem Server verändert, was aber nur begrenzten Erfolg hatte und auch nicht ungefährlich ist. Sogar den Email-Server habe ich gewechselt.

Klar verwende ich SpamAssassin und habe auch Blacklist- und Whitelist-Einstellungen. Aber das hilft in meinem Fall nicht wirklich was. Oder anders ausgedrückt – ohne das Zeug würde ich vermutlich die 10-fache Menge an Spam bekommen, aber was immer noch durchkommt, ist erschreckend. Vor allen Dingen greifen die Einstellungen, dass man Absender blockiert oder freigibt, nicht. Wie gesagt – bekannte Spammer zu blocken ist garantiert sinnvoll, um 90% des Drecks wegzuhalten, aber nicht ausreichend. Denn die Spammer in der derzeitigen Flut verwenden Einmal-Adressen. Es ist daher leider vollkommen nutzlos, den Server, die Domain oder gar einen einzelnen Absender zu blockieren.

Leider kann ich auf meinem Server kein Greylisting aktivieren. Grundsätzlich ist es verfügbar, aber beim Aktivieren bekomme ich einen Bug im Serverskript angezeigt :-(. Dabei wäre Greylisting in vielen Fällen garantiert sinnvoll. Im Gegensatz zu Whitelisting (bekannte Adresse immer durchlassen) und Blacklisting (bekannte Adressen immer blockieren) lehnt man bei Greylisting unbekannte Adressen genau 1x mit einer passenden Meldung ab und trägt die Absenderadresse in eine DB ein, um bei der nächsten Zustellung den Absender durchzulassen. Seriöse Versender bzw. SMTP-Server senden einfach nach einer ersten Fehlermeldung des Adressaten automatisch nochmal (ohne dass es der Absender bemerkt), Spammer in der Regel nicht. Aber wie gesagt – kann ich (derzeit) nicht aktivieren. Mal sehen, ob ich den Fehler noch rausbekomme, aber ich bin einfach kein (echter) Admin – sondern Programmierer.

Natürlich habe ich auch SPF-Spamschutz aktiviert, aber dennoch erscheint mir das als ein nutzloser Kampf gegen Windmühlen. Eigentlich helfen nur Inhaltsfilter, denn die Spam-Flut lässt sich derzeit bei mir auf etwa 5 – 10 Schlagworte eingrenzen.

Solche Filter kann ich in Thunderbird sehr schön anlegen und auch meine GMX-Accounts erlauben das. Nur die E-Mail-Programme, die ich bisher für mein SmartPhone gefunden habe, haben dieses Feature nicht. Deshalb habe ich sogar mal versucht, meine rjs.de-Adresse auf eine GMX-Adresse weiterzuleiten, dort mit Inhaltsfiltern zu reinigen und dann zurück auf eine neue rjs.de-Adresse weiterzuleiten. Funktioniert, aber ist mir dann doch zu umständlich gewesen. Außerdem will ich meine bisherige E-Mail-Adresse nicht wegen diesen Dreckschweinen aufgeben bzw. so kastrieren.

Überhaupt – das Filtern verlagert die Sache – soweit ich es hinbekomme – vom Server in den Client, denn bei beiden POP3/IMAP-Servern, die ich verwende, gibt es dieses Filtern nach dem Inhalt leider nicht – soweit ich es herausgefunden habe .

Bei POP3-Accounts ist das Filtern mit einem E-Mail-Client aber sowieso ziemlich unnütz und deshalb habe ich jetzt mal die Geschichte komplett auf IMAP umgestellt. Hätte ich schon lange tun müssen. Aber auch dann muss ein Client mit Filtern regelmäßig das Konto überwachen (etwa ein entsprechend konfigurierter Thunderbird auf einem meiner Rechner), damit ein anderer Client ohne die passenden Filter (etwa auf dem SmartPhone) gar nicht erst den Schmutz lädt.

Die Grundidee schien mir aber ok, da ich anders nicht weiter kam. Aber einen PC Tag und Nacht laufen lassen und alle paar Minuten Thunderbird das Konto checken lassen? Das kostet zu viel Strom und ist schon auf den zweiten Blick nicht wirklich optimal.

Mir kam dann die Idee, meinen alten Raspberry Pi das machen zu lassen. Braucht kaum Strom und die Platine verstaubt sowieso vor sich hin, nachdem ich den Zwerg vom Kryptomining wieder abgezogen habe. Also damit eine Weile experimentiert. Da ich an der Platine weder Maus und Tastatur noch Monitor hängen habe und auch W-LAN nicht eingerichtet war, musste ich das Kistchen erst einmal etwas aktualisieren bzw. neu einrichten. Natürlich kann ich mit klassischem SSH mit X-Umleitung darauf zugreifen, aber ich arbeite auch bei Fernzugriff gerne mit dem Desktop. Nur komischer Weise ging der Zugriff über VNC auf den Raspi nicht. Obwohl auf der Raspi auch ein VNC-Server automatisch mit startet und ich das schon früher so gemacht habe. Ich habe es absolut nicht hinbekommen und in meiner Verzweiflung sogar xrdp installiert und – oh Wunder – der Remotedesktop-Zugriff ging einwandfrei – von Windows (!) aus.

Aber da es sich bei meinem Raspi um die Version 1 handelt, konnte ich da kein vernünftiges E-Mail-Programm installieren. Viel experimentiert bis hin zur versuchten Installation von iceweasel und icedove, aber erfolglos. Der Weg war mir dann einfach zu steinig und ich habe ihn als Sackgasse begraben.

Und dann kam mir ein Gedanke! Warum kein Python-Skript schreiben und damit das IMAP-Postfach regelmäßig abfragen? Die ursprüngliche Idee war, dass ich das dann auf dem Raspi laufen lasse, aber relativ schnell kam ich auf den Dreh, dass das natürlich auch auf dem Server selbst erfolgen kann. Ich habe ja in meinen regelmäßigen Entwickler-Tipp zu Python bei LinkedIn Learning schon einen Tipp veröffentlich, wie man per CronTab zeitgesteuert Python-Skripte ausführen kann. Was aber natürlich auch für den Raspi interessant wäre.

Das Skript, das ich dann programmiert habe, nutzt im Wesentlichen imaplib, ist aber noch nicht ganz fertig und auch noch nicht auf dem Server bzw. Raspi installiert. Aber wenn ich die derzeitige Vorversion in IDLE laufen lasse, kann ich recht zuverlässig im Betreff von E-Mails (theoretisch auch in der gesamten Mail) Schlagworte finden, die ich als SPAM empfinde und dann die Mails vom Skript automatisiert löschen lassen.

Ich werde von dem Skript noch eine Datei mit den Schlagworten einlesen lassen, reguläre Ausdrücke mit dem Modul re integrieren, das Skript eine Weile manuell testen, und dann in einen Cron-Job auf dem Server und/oder Raspi einbauen. Das sollte eine brauchbare Ergänzung meiner Spamabwehr werden und ich habe wie gesagt wieder neue Sachen gelernt, was dem Mist etwas Positives abgewinnt.

Und wenn mein Vorrat an bereits eingespielten Videos für die regelmäßigen Entwickler-Tipps zu Python zur Neige geht, habe ich damit ein interessantes Thema für die neuen Tipps, die ich dann vermutlich einspiele.

 

Ist denn schon Ostern?

Bis Ostern ist es noch etwas hin, aber das bedeutet nicht, dass man nicht Ostereier suchen kann. Wobei man es bei LinkedIn Learning auch besser hätte timen und diesen Entwickler-Tipp der Woche zu Python wirklich um Ostern freischalten können. Aber sei es drum – in modernen Zeiten gibt es ja auch schon Weihnachtssachen Monate vor dem Fest zu kaufen und von daher sind Ostereier Ende Februar noch im Rahmen.

Viele Softwareprodukte stellen diese Easter eggs zur Verfügung. Das sind versteckte Funktionalitäten, die nicht unbedingt sinnvoll sind, aber ganz lustig. Und auch in Programmiersprachen gibt es so etwas. Natürlich hat auch Python so einige versteckte Ostereier und ein paar davon zeige ich in dem Entwickler-Tipp.

Spam-Terror

Im Moment werde ich geradezu mit E-Mail-Spam geflutet. Zumindest bei meinem eigenen Server. Ich habe keine Ahnung, warum das von einem auf den anderen Moment explodiert ist. Nun kann ich in meinem E-Mail-Programm auf dem Desktop ganz gut Filter gegen den Müll einsetzen. Einfach die üblichen Busswords, die derzeit die Flut ausmachen (da haben mir etwa 5 – 10 gelangt, um 95% des Spams zu erfassen), als Filter verwendet und gut ist. Zumindest was die derzeitige Welle angeht, die komplett das horizontale Niveau anspricht.

Aber die E-Mail-Programme, die ich bisher für mein SmartPhone gefunden habe, taugen hinsichtlich Spam-Schutz keinen Schuss Pulver. Kein einziges. Die Dinger haben alle denkbaren ach so tollen Features, aber das einfache Anlegen von Filtern aufgrund von Keywords habe ich nirgendwo gefunden. Maximal kann man Absender bannen, aber das ist wirkungslos, denn die Absenderadressen sind Einmal-Adressen. Diese Art der Filterung bzw. des Spamschutzes ist von vorgestern und wirklich nutzlos.

Ich habe jetzt mal den Server versucht besser gegen Spam zu konfigurieren und hoffe, dass ich damit nichts kaputt gemacht habe und/oder fehlerhaft korrekte Mails abweise. Ich bin ja Programmierer und kein Admin. Aber ich kann mir sonst nicht mehr helfen, um dieser Flut Herr zu werden.

Die Konfiguration der Spam-Abwehr habe ich gleich dazu genutzt, auch die Zertifikate als auch Verschlüsselungseinstellungen zu verschärfen. Hilft nichts gegen Spam, sollte aber an anderen Stellen Verbesserungen und mehr Sicherheit bringen.

Fingerprinting

Ich bin gerade über einen Beitrag gestolpert, der die Vermeidung von Spuren im Internet zum Thema hat. Ich finde den Beitrag wirklich gut. Nicht zu technisch, aber auch nicht zu trivial wie sonst meistens.

Nun achte ich natürlich stark darauf, dass ich wenige Spuren im Internet hinterlasse bzw. die Spuren ganz bewusst lege, um Datenspione gezielt irrezuführen. Aber so ganz man kann nicht komplett unsichtbar bleiben. Sonst wird es zu mühselig und viele Dinge im Internet funktionieren sogar gar nicht.

Klar akzeptiere ich Cookies. Vollkommen uneingeschränkt. Und ebenso selbstverständlich werden die beim Schließen eines Browser komplett beseitigt. Ein Nullsummenspiel sozusagen. Cookies sind aber sowieso harmlos und werden ja nur als Ablenkungsmanöver missbraucht, um Anwender solange mit nervigen Meldungen mürbe zu machen, damit Datenschutz nur noch als Belästigung gesehen wird und sie nicht mehr auf echte Datenschutzprobleme achten. Tja – die DSGVO. Vielleicht gut gedacht, aber grottenschlecht gemacht.

Natürlich bin ich auch nicht bei Fratzenbuch, Google, Amazon etc angemeldet, wenn ich andere Webseiten besuche oder gar in Suchmaschinen etwas suche und ja – DuckDuckGo und Ecosia statt Google oder Bing sind selbstverständlich.

Tracking wird mit Browsereinstellungen und ein paar Zusatztools blockiert und wenn es mir wichtig ist, nutze ich auch ein VPN (ist ja in Opera integriert) oder gar Tor. Dazu kommen regelmäßige Einsätze von Reinigungstools wie CCleaner, PrivZer und BleachBit.

Aber das Fingerprinting ist und bleibt ein Problem. Das zu verhindern ist nicht ganz so einfach. Im Gegensatz zum Fingerprinting selbst. Ich bin ja kein Hacker, aber selbst in meinen gewöhnlichen JavaScript-Büchern und meinen Videotrainings für LinkedIn Learning (LiL) zeige ich, wie einfach das im Grunde ist.

Nun habe ich gerade eine Webseite (Cover Your tracks) ausprobiert, die in dem Beitrag empfohlen wird, um zu testen, wie sicher der Browser ist. Und tatsächlich sind meine Standardbrowser nicht vernünftig gegen Fingerprinting gesichert. Vivaldi und Opera so gut wie gar nicht und es konnte ein eindeutiger Fingerprint ermittelt werden, Firefox ist etwas besser, aber auch noch nicht wirklich sicher und nur der Tor-Browser stoppt das Fingerprinting effektiv. Edge, Chrome etc. oder gar IE werde ich nicht testen, denn die Browser verwende ich sowieso nicht, da sie aus meiner Sicht noch in anderer Hinsicht unbrauchbar sind.

Ich werde mal auf die Suche gehen, ob es geeignete Erweiterungen gibt, mit denen ich Vivaldi, Opera und Firefox richtig schützen kann. Denn so sicher der Tor-Browser ist – darüber ist das Surfen langsamer und machen Seiten gehen auch nicht.

Videoaufnahmen laufen und der neue Entwicklertipp ist da

Nachdem ich gestern schon in mein Büro nach Eppstein gefahren bin – glücklicher Weise, denn bei einem Wasserhahn hatte sich was gelöst und es hat munter das Wasser gespringkelt 🙁 – und dort (nach einer provisorischen Kemptner-Notaktion) alles aufgebaut und eingerichtet habe, habe ich bereits gestern das Testvideo aufgenommen und auf Sharepoint hochgeladen. Dementsprechend konnte ich heute morgen direkt mit den Aufnahmen beginnen. Parallel ist aber auch wieder mein regelmäßiger Entwickler-Tipp zu Python bei LinkedIn Learning freigeschaltet worden. In diesem behandle ich das Erstellen eines Webservers mit Python, der den Inhalt eines Verzeichnisses über http verfügbar macht. Das geht mit Python fast schon erschreckend einfach.

Video-Calling

Es ist mal wieder Studiozeit. Ab morgen mache ich Aufnahmen für LinkedIn Learning (LiL), wobei das aufgrund von Corona immer noch in meinem Büro in Eppstein statt in Graz stattfindet. Ich werde schon heute am späten Abend rüberfahren und alles einrichten, damit ich morgen gleich mit den Aufnahmen loslegen kann. Ich habe nur 3 Tage Zeit, weil die Aufnahmesession zwischen eine regelmäßige Python-Schulung gequetscht werden musste, die im Februar jeden Montag und Dienstag stattfindet.

Ich ergänze in den Aufnahmen ein Training um ein noch nicht ausreichend behandeltes Thema (werden einfach 3 Erweiterungsvideos, die ohne großes Tamtam in das bestehende Training ergänzt werden) und ich nehme ein altes Training neu auf. Ich halte bei so Posts ein wenig mit den konkreten Themen hinter dem Berg (wie eine Autofirma mit einem Erlkönig), denn es ist nie klar, wie lange es zwischen Aufnahme und Veröffentlichung dauert und da will ich so früh keine Pferde scheu machen.

Nur soweit komme ich aus der Deckung – die Überarbeitung betrifft das 3. Training, das ich jemals für LiL bzw. damals Video2Brain aufgenommen habe. Und das war 2008, geht um ein Entwicklungstool und wurde auf DVD veröffentlicht. Zwar wurde das Training seit der Zeit immer wieder angepasst und sogar schon mal neu eingespielt, aber es ist trotzdem im Kern jetzt 14 Jahre alt. In der neuen Version wird es auf gut 30% der Zeit eingedampft und auf das Kerntool reduziert. Die Randtechniken, die bisher mit behandelt wurden, sind mittlerweile in eigene Trainings ausgelagert worden (meist auch von mir) und da viel besser aufgehoben.

Speicherbedarf eines Objekts feststellen – aus meinem Tutorial zu Python

Es ist wieder Mittwoch und damit der übliche Wochentag, an dem mein regelmäßiger Entwickler-Tipp zu Python bei LinkedIn Learning freigeschaltet wird. Der Tipp hat zum Thema, wie man den Speicherbedarf eines Objekts unter Python bestimmen kann.