Aufnahmen soweit fertig und neuer Entwicklertipp der Woche

Ich sollte mit den Aufnahmen zu meinem neuen Videotraining bei LinkedIn Learning durch sein. Zumindest bis auf ein paar Abschlussarbeiten oder wenn ich etwas übersehen habe. Da morgen Feiertag ist, fahre ich nachher wieder von meinem Zweitbüro in Eppstein zurück nach Hause, wobei ich morgen abend oder am Freitag nochmal herkomme, weil noch ein weiteres Projekt für LiL diese Woche ansteht. Zwischenzeitlich ist auch der neueste Entwicklertipp der Woche zu Python verfügbar. Der Zugriff auf das „Top-level script environment“ in Python ist das aktuelle Thema.  Ein module-Objekt wird in Python durch verschiedene Attribute charakterisiert. Unter anderem gibt es Attributnamen, die mit einem doppelten Unterstrich vor- und nachgestellt werden, und diese kann man über ein name-Attribut auswerten. Wenn nun Python als ausführbarer Code auf der obersten Ebene, dem sogenannten Top-Level Script Environment, ausgeführt wird, dann wird in diesem name-Attribut der Wert main stehen (mit Underscores vorne und hinten gekennzeichnet). Das kann man aktiv verwenden.

In and out

Diese Woche bin ich wieder am Aufnehmen eines Videotrainings für LinkedIn Learning sowie der Erledigung einer weiteren Zusatzaufgabe, bei der ich bei einer Übersetzung eines Kurses fachliche Korrekturen einpflegen soll. Ich schaffe also weiteren Input und gleichzeitig gibt es aber bei  LinkedIn Learning neuen Output von mir.

Mein neuer Eclipse-Grundkurs wurde freigeschaltet. Das ist die aktuellste Version eines Videotrainings, das ich ursprünglich schon vor vielen Jahre aufgenommen und mittlerweile einige Male überarbeitet habe. Eclipse gilt als Schweizer Taschenmesser für die Softwareentwicklung. Die IDE, die ursprünglich überwiegend in der die Java-Entwicklung zum Einsatz kam, kann mittlerweile für fast alle denkbaren Programmiersprachen und Software-Techniken verwendet werden.

Polymorphismus in Python – aus meinem Tutorial zu Python

Mittwoch und bei LinkedIn Learning ist der neue Entwicklertipp der Woche ist verfügbar. Dieser Tipp zeigt, wie man in Python Polymorphismus implementieren bzw. nachbilden kann. In den meisten objektorientierten Programmiersprachen gibt es ein polymorphes Verhalten aufgrund einer Technologie, die man Überladen, Overload, nennt. In Python ist so etwas nicht vorhanden in dem Sinne, aber man kann es nachbilden. Dazu verlagert man die Funktionalität direkt in eine Funktion oder Methode und diese entscheidet, wie sie sich verhält. Im Gegensatz zur echten Polymorphie mit Überladen, wo es verschiedene Methoden gleichen Namens, gleichen Bezeichners, aber einer eindeutigen Unterscheidung im den Gültigkeitsbereich gibt, haben wir hier nur eine Methode oder Funktion.

Business a usal – so langsam komme ich wieder in den Arbeitrythmus

Ralph Steyer jQuery

Nach meinem Radurlaub habe ich noch eine Weile meine Arbeit auf Sparflamme gehalten, aber sukzessive hochgefahren. Muss ja. Ich bereite gerade ein neues Videotraining für LinkedIn Learning (LiL) vor, dass ich übernächste Woche aufnehmen will – zusammen mit einer fachlichen Lektorarbeit für ein anderes Training. Dazu bereite ich eine jQuery-Schulung für nächste Woche vor.

Ebenso ist am heutigen Mittwoch wieder ein neuer Entwickler-Tipp der Woche zu Python bei LinkedIn Learning freigeschaltet worden. Thema ist, wie man die Quersumme einer Zahl berechnen kann. Das ist gar nicht so unwichtig oder speziell. Denn die Quersumme  (die Summe aller Ziffern einer Zahl) kann man verwenden, um darüber die Veränderungen von Dingen beobachten. Das ist so was Ähnliches wie eine einfache Version eines Hashwerts.

Eine Zahl in Faktoren zerlegen – neu in meinem Tutorial zu Python

Seit Dienstag der letzten Woche bis gestern habe ich zusammen mit meinem einen Sohn eine Radtour vom Bodensee Ecke Konstanz über Schaffhausen und die Rhein-Fälle, den Zürich-See, den Walen-See, Lichtenstein, Vorarlberg und dann auf der deutschen Seite des Bodensees zurück gemacht. 8 Tage waren wir unterwegs, wobei 2 Tage für die An- und Abreise gedient haben.

Auf so einer – für mich zumindest – langen Radtour über 6 Tage auf dem Rad haben wir Gepäck gespart, soweit es ging. Damit das bewegende Gewicht im Rahmen bleibt. Also auch keinen Rechner dabei. Nur halt SmartPhones, was in modernen Zeiten ja klar und irgendwie auch notwendig ist. Außerdem wollte ich in meinem ersten wirklichen Urlaub seit langer Zeit auch mal komplett von der IT und dem täglichen Business abschalten und habe mich weitgehend abwesend gemeldet.

Trotzdem habe ich natürlich meine E-Mails gelesen und letzte Woche die Meldung von LinkedIn Learning mitbekommen, dass mein Kurs jetzt verfügbar ist. Diese Info bekomme ich jede Woche per E-Mail, wenn in meinem Kurs der neuste Entwickler-Tipp der Woche zu Python bei LinkedIn Learning veröffentlicht wurde. Also „Business as usual“ dachte ich.

Mittwoch ist der neue Tipp am Morgen wie üblich freigeschaltet worden und am Donnerstag oder Freitag kam für mich die übliche Mail, damit ich diese Information auf LinkedIn und anderen sozialen Netzwerken teile, um die Anzahl der Kursansichten zu erhöhen. Nur war ich eben in Urlaub und habe die Zeit ausnahmsweise mal auf mein  sonst übliches Teilen als auch das Posten im Blog oder das Kontrollieren des Kurses verzichtet.

Nachdem ich gestern heimgekommen bin, ist mir aber aufgefallen, dass der neuste Tipp noch der war, der bereits vor meinem Urlaub schon freigeschaltet war – wie man grafische Oberflächen mit PyQt erstellen kann. Sieht so aus als hätte die Matrix eine Fehlfunktion gehabt und meine Urlaubszeit versehentlich auf die Veröffentlichungsroutine gespiegelt ;-).

Aber natürlich ist das kein Problem. Es geht ja nichts verloren und mittlerweile ist der Kurs auch schon ziemlich umfangreich. Ob das Wachstum da eine Woche steht oder nicht, ist nicht wirklich von Bedeutung.

Und heute kam jetzt wieder eine Aktualisierung. Es geht darin darum, wie man eine Zahl in Faktoren zerlegen kann. Wenn man eine Zahl vorliegen hat, kann es zu verschiedenen Zwecken interessant sein, die einzelnen Ziffern der Zahl einzeln zu haben, das heißt, diese Zahl in ihre Faktoren zu zerlegen. Dazu gibt es verschiedene Möglichkeiten, von denen ich vier in dem Video zeige.

Lambda-Ausdrücke in JavaScript

Diverse Trainings von mir bei LinkedIn Learning (LiL) werden nach und nach modifiziert bzw. erweitert, wenn mir etwas einfällt und/oder die Entwicklung von Technologien über die Zeit das sinnvoll macht. In meinem aktuellen JavaScript Grundkurs 2: Programmiertechniken und Frameworks war das gerade wieder der Fall und gestern wurden die Erweiterungen freigeschaltet. Ich hatte da bisher Lambda-Ausdrücke sehr stiefmütterlich behandelt. Was 2 Gründen geschultet war:

  1. Ältere Browser haben diese nicht unterstützt.
  2. Anonyme Funktionen bzw. innere Funktionen decken in JavaScript im Grunde alles ab, was Lambda-Ausdrücke leisten. Diese Sprachvorteile haben die meisten anderen Programmiersprachen nicht und Lambda-Ausdrücke kompensieren dort hauptsächlich diesen Mangel. Die Notwendigkeit für Lambda-Ausdrücke in JavaScript besteht also im Grunde nicht oder besser nicht so stark.

Dennoch war es Zeit, das Thema zu ergänzen. Denn mittlerweile sollten die Browser, die Lambda-Ausdrücke nicht unterstützen, verschwunden sein, viele Programmierer setzen diese Lambda-Asudrücke in der Praxis ein (oft, weil vom Konzept analog zu anderen Sprachen) und die Syntax ist oft kompakter als bei anonymen Funktionen.

Deshalb habe ich gleich drei Videos rund um Lambda-Ausdrücke in JavaScript ergänzt:

OpenStreetMap statt Google oder Bing

Im Rahmen meiner Vorlesung zur Entwicklung von plattformneutralen Apps mit Cordova an der TH Bingen ist mir aufgefallen, dass die Verwendung des Google Map-APIs nicht mehr so funktioniert hat, wie ich es gewohnt war. Ältere, aber erprobte/getestete Codes haben einen Fehler produziert. Ich stelle den Studenten schon seit ein paar Semestern als eine mögliche Semesterarbeit eine App als Aufgabe, die unter anderem die aktuelle Position in einer Karte zeigen soll. Dabei habe ich bisher Google Maps und als Alternative Bing Maps verwendet. Die jeweiligen APIs ließen sich bisher problemlos verwenden. Nur benötigt man mittlerweile bei neuen Versionen der APIs dafür API-Keys. Die sind zwar kostenfrei zu bekommen (mit ein paar Einschränkungen hinsichtlich der erlaubten Verwendung), aber die Generierung ist dennoch mittlerweile etwas umständlich bzw. ich komme mit den unendlich vielen Details und unübersichtlichen Entwicklerwebseiten einfach nicht klar. Die speziellen Features der neuen Versionen habe ich auch bisher nicht benötigt.

Die Version 2 des Google Maps API hat aber keinen API-Key erfordert und war deshalb sowohl für meine Beispiel-Apps als auch viele Webseiten immer noch eine sehr gute Wahl. Nur das Problem in der Vorlesung beim Verwenden der alten Codes hat mich zu der Info auf den Entwicklerseiten von Google gebracht:

The Maps JavaScript API v2 is no longer available as of May 26, 2021. As a result, your site’s v2 maps will stop working, and will return JavaScript errors. To continue using maps on your site, migrate to the Maps JavaScript API v3. This guide will help you through the process.

Ganz toll – einfach die API-Version eingestellt und die bisherigen Webseiten und Apps sind an die Wand gefahren. Bei Bing Maps war es nicht besser – die alten Codes funktionieren auch nicht mehr.

Oft haben das die Betreiber von Webseiten auch gar nicht bemerkt bisher, denke ich. Gestern war ich auf einer entsprechenden Webseite eines Gleitschirmvereins, wo die Karte nicht mehr funktioniert. Klar – man kann argumentieren, dass Entwickler die Verantwortung haben, die Funktion ihrer Produkte regelmässig zu kontrollieren. Aber das ist m.E. nur die eine Seite der Medaille. Man kann auch argumentieren, dass es eine Art „Bestandschutz“ gibt. Was einmal getestet ist, sollte auf Dauer funktionieren. Da sieht man mal wieder, in welche Abhängigkeiten man sich begibt, wenn man fremde Ressourcen und Leistungen nutzt. Die aktuellen Probleme bei einigen Cloud-Anbietern passen in diese Problematik.

Und me culpa – auch auf einer meiner Seiten hatte ich eine Karte mit dem Google Maps API, die nicht mehr korrekt angezeigt wurde und was ich bisher nicht bemerkt hatte – es hatte sich bisher auch kein Besucher beschwert.

Einer meiner Studenten hatte sich vor einigen Tagen wegen dieser ganzen Umstände mit dem Google Maps bzw. Bing Maps API so geäußert, dass er auf OpenStreetMap umsteigen würde. Fand ich eine gute Idee und deshalb hatte ich schon vor ein paar Tagen damit sowie Mapbox experimentiert. Auch in Verbindung mit einer Django-Webseite, weil ich die nächsten Wochen dazu ein Videotraining bei  LinkedIn Learning einspielen will, wo ich diese Techniken in Beispielen nutzen will.

Aber erst einmal habe ich jetzt die Webseite, die ich betreue, auf OpenStreetMap umgestellt.

Die Seite arbeitet mit Joomla! und da taugt das OSModul ziemlich gut, um auf einfache Weise eine Karte von OpenStreetMap in eine Webseite zu integrieren.

 

Es muss nicht immer tkinter sein – die PyQt-Alternative

Wenn Sie grafische Oberflächen mit Python erzeugen wollen, ist das integrierte tkinter-Framework in der Regel die erste Anlaufstelle. Der Grund ist offensichtlich – tkinter steht standardmäßig im Python-API zur Verfügung und hiermit können Sie bereits wunderbar grafische Oberflächen erzeugen.

Es gibt allerdings Alternativen. Beispielsweise PyQt. Zwar muss man PyQt in der Regel erst einmal installieren, aber man erhält damit ein GUI-Framework, das  eigentlich auf C++ aufbaut, wovon es aber diverse Derivate für verschiedene Sprachen gibt. Eben auch für Python in Form von PyQt. Damit kann man Oberflächen recht leicht zwischen verschiedenen Programmierapachen bzw. Systemen portieren.

Die Grundidee basiert, wie bei allen grafischen Oberflächen mittlerweile, auf Widgets und einem sehr verwandten Konzept. In dem neusten Entwickler-Tipp der Woche zu Python bei LinkedIn Learning zeige ich den Ansatz, wie man grafische Oberflächen mit PyQt erstellen kann.

Da isses endlich – mein neues Training bei LiL zu Kryptografie und Steganografie mit Python

Gerade wurde mein neustes Training Kryptografie und Steganografie mit Python bei LinkedIn Learning (LiL) freigeschaltet. Als Sicherheitsthema mehr oder weniger „zeitlos“ und deshalb – da nicht zeitkritisch – ungewöhnlich lange in der Produktion gewesen, finde ich es persönlich aber wahnsinnig interessant. Mir hat da die Einarbeitung und das praktische Umsetzen von den theoretischen Konzepten mit Python bei dem Training so richtig viel Spaß gemacht.

Um ein bisschen abzuschweifen – ich werde immer wieder gefragt, ob ich noch viel mit Mathematik zu tun habe? In der Tat ist die Frage nicht ganz einfach zu beantworten, denn wie viele Mathematiker bin ich komplett in die Computerschiene geraten. Aber hin und wieder bricht auch in dieser IT-Welt die „echte“ Mathematik durch. Beispielsweise bei Kursen wie Mathematik-Grundbegriffe für Programmierer:innen von LiL, wo „Mathematik“ schon im Titel steckt. Oder auch LiL-Kurse wie Python: Statistische Auswertungen haben offensichtlich eine Verbindung zu Teilen der Mathematik – wenngleich in Bezug zu einer Programmiersprache. Ebenso kommt Mathematik rund um die Datenanalyse und das Maschinenlernen (Python für die Datenanalyse 1: Grundlagen und Python für die Datenanalyse 2: Machine Learning) im Hintergrund massiv zum Einsatz. Wenngleich alles auf einem einfachen und praxisorientiertem Level – aus Sicht von Mathematikern gesehen. Also mathematische Beweise habe ich etwa seit meinem Studium nicht mehr geführt.

In meinem neusten Training hingegen kommt die Mathematik sogar ebenso recht intensiv zum Einsatz – mehr als es der Titel Kryptografie und Steganografie mit Python deutlich macht. Denn die Verfahren, die hierbei eine Rolle spielen, erinnern mich durchaus an das Thema Zahlentheorie, das ich im 2. Semester hatte, und allgemein die Algebra und Logik sowie sogar ganz wenig die Stochastik. Aber das Training versucht dennoch die Mathematik mehr in den Hintergrund zu stellen und das praktische Probieren in den Fokus zu nehmen. Was liegt denn hinter den ganzen Fachbegriffen und Techniken und kann man das auch ganz einfach und praktisch sich veranschaulichen? Ich selbst brauche bei komplexen Themen immer einen maximal vereinfachten Ansatz und wenn ich den verstanden habe, kann ich mich Schritt-für-Schritt an die komplexen Level ranarbeiten. Getreu dem Motto, dass Mathematik ganz einfach ist – die Komplexität entsteht nur daraus, dass ganz viele einfache Dingen zusammengesetzt sind. Hat man die Einzelteile verstanden, versteht man auch das Gesamte.

Also kümmere ich mich in dem Training darum, was genau hinter Sicherheitstechniken wie Verschlüsselung und Signaturen steckt oder was unter Steganografie zu verstehen ist. Die Programmiersprache Python eignet sich hervorragend dazu, sich mittels praktischen Beispielen in diese Thematik einzuarbeiten, da wichtige Funktionen bereits in der API bereitgestellt werden. In diesem Videokurs erfahren Sie alles Wichtige zu AES und RSA und Sie lernen einfache Verschlüsselungs- und Angriffstechniken zu entwickeln und anzuwenden. Anhand von Code-Challenges am Ende eines Kapitels können Sie das Erlernte sofort testen und Ihre Lösung mit der angebotenen »Solution« vergleichen. Parallel zu vielen kleinen und einfachen Beispielen entsteht in dem Training ein komplexes Programm, das eine grafische Oberfläche bereitstellt und Daten sowohl verschlüsseln, verstecken und signieren sowie die Informationen wieder herstellen kann.

Ich gehe davon aus, die Zielgruppe von dem Training eher geringer ist als bei vielen anderen Grundlagenthemen von mir, aber was rein meine Interessen und das Fachliche angeht, sehe ich in dem Kurs vermutlich das Highlight meiner bisherigen Videotraining.

Der JSON-Kleber zwischen Python und JavaScript

Ich ömmel mich immer noch weg, wenn ich mich daran erinnere, wie JavaScript früher schlechtgeredet wurde. Oder wenn auch heute noch Leute abschätzig von JavaScript reden und dann ständig mit JSON arbeiten. Das ist wie bei den Unwissenden, die über Linux lästern oder angeblich niemals verwenden würden und dann ihr Android-Handy, ihren Smart-TV, ihr Entertainment-System im Auto etc. verwenden. JSON ist ja pures JavaScript, aber zudem mittlerweile ein Datenformat, was aus dem modernen Datenaustausch nicht mehr wegzudenken ist. Auf Klartextbasis kann man über JSON beliebige Datenstrukturen austauschen, man kann aber auch Programme konfigurieren und ähnliche Dinge machen. Und nahezu alle Sprachen unterstützen JSON mittlerweile. Natürlich auch Python.

In Python gibt es im Modul json Möglichkeiten, womit man JSON serialisieren und deserialisieren kann. Mit anderen Worten – man kann ein JSON-Objekt bzw. eine JSON-Datenstruktur nehmen und daraus einen String machen und einen so stringifizierten JSON-Ausdruck wieder zurück in ein Objekt wandeln. In dem aktuellen Entwickler-Tipp der Woche zu Python bei LinkedIn Learning geht es genau um das Thema.

all und any

In dem aktuellen Entwickler-Tipp der Woche zu Python bei LinkedIn Learning geht es um die Funktionen all und any. Das sind zwei Funktionen, mit denen Sie bei sequentiellen Datentypen überprüfen können, ob die Elemente darin True- oder False-Zuständen entsprechen. Dabei wird ja in Python alles, was ungleich 0 bzw. einem Leerstring ist, als True gewertet.

Mittwochs in meinem Tutorial zu Python – die Funktion map nutzen

In dem aktuellen Entwickler-Tipp der Woche zu Python bei LinkedIn Learning stelle ich die Funktion map vor, die in gewisser Weise einem Lambda-Ausdruck ähnelt. Man hat eine iterierbare Struktur und wendet auf jedes Element dieser Struktur eine bestimmte Funktionalität, sprich eine Funktion, an.

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“.

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.

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.

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.

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.

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.