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.

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.

Python und UML

Ich schule immer wieder UML und in dem aktuellen Entwickler-Tipp zu Python bei LinkedIn Learning betrachte ich die Verbindung zwischen UML und Python. So ganz perfekt spielen die Welten nicht zusammen, aber grundsätzlich kann man schon aus UML Python-Code erzeugen und vor allen Dingen aus Python-Code UML-Klassendiagramme generieren, um eine Übersicht von Klassenbeziehungen zu bekommen.

Da simmer dabei, dat is prima! :-)

Bei LinkedIn Learning gab es eine Umfrage hinsichtlich der beliebtesten LinkedIn Learning-Kursen 2021 zur beruflichen Weiterentwicklung. Diese Kurse absolvieren deutsche Fach- und Führungskräfte, um zu lernen, wie sie sich am besten an die neuen Gegebenheiten der modernen Geschäftswelt anpassen, sich beruflich weiterentwickeln, ihr Unternehmen bestmöglich unterstützen und persönliche Fortschritte erzielen können. In dieser Liste der 10 beliebtesten LinkedIn Learning-Kurse in Deutschland bin ich mit meinem Python-Kurs vertreten 🙂

Variablen tauschen – Tutorial zu Python

Schon seltsamer Zufall. Ich halte gerade eine Remote-Schulung zu C# und habe eben als Abschluss-Übung ein Beispiel durchgespielt, in dem die Teilnehmer mit einer Methode den Inhalt von zwei Variablen vertauschen sollen. Eben schaue ich, was der heute veröffentlichte Entwickler-Tipp zu Python für ein Thema hat. Tja – Variablen tauschen mit Python. Ich wusste es wirklich nicht, denn die Reihenfolge der Tipps und deren Veröffentlichung wird bei LinkedIn Learning entschieden. Bei Python geht so ein Vertauschen allerdings extrem elegant und kompakt. Weit weniger aufwändig als etwa in C#.

Objekte mit der dir()-Methode analysieren

Das Jahr 2022 ist angelaufen und in der Spur. Mittwoch ist damit der Tag für meinen regelmäßigen Entwickler-Tipp zu Python bei LinkedIn Learning. Dabei geht es um die Aussage, dass alles in Python ein Objekt ist. Dabei ist ein Objekt von der internen Struktur im Grunde immer ein Key-Value-System und mit der dir-Funktion, der man als Parameter ein Objekt übergibt, kann diese analysieren.

Der erste neue Tipp des Jahres

Nachdem es zwischen den Jahren keinen neuen Tipp gab, wurde heute bei LinkedIn Learning wieder der nächste regelmäßige Entwickler-Tipp zu Python freigeschaltet. Der erste Tipp im Jahr 2022. Dieses Mal verbinde ich die Themen Python und Docker. Gerade mit Docker habe ich ja Anfang letzten Jahres etwas mehr beschäftigt, um eine Cordova-Umgebung für meine Vorlesung bei der TH Bingen bereitzustellen. Damit kann man ja alle möglichen verschiedenen Konfigurationen und Systeme bereitstellen, ohne immer wieder seinen Rechner umkonfigurieren zu müssen. Auch für Python.

Wenn man Docker installiert hat, dann kann man ein Python-Image laden und auf dem Rechner installieren. Das heißt, man hat eine virtuelle Laufzeitumgebung für Python. Das ist vor allen Dingen dann interessant, wenn man verschiedene Versionen von Python benötigt. Dazu muss allerdings auf dem Rechner Docker installiert sein. Das Zusammenspiel zwischen Python und Docker geht in zwei Richtungen. Nicht nur kann man mit Docker eine Python-Umgebung, eine virtuelle Python-Umgebung schaffen, es gibt auch die Möglichkeit, ein Docker-SDK für Python zu installieren.

Der letzte Tipp mit leichter Verspätung, der aktuelle dafür schon heute am frühen Morgen

Mein regelmäßiger Entwickler-Tipp zu Python wurde letzte Woche bei LinkedIn Learning erst an Freitag freigeschaltet, aber der Entwickler-Tipp zu Python in der Woche ist heute – als am üblichen Mittwoch – schon früh  am Morgen da.

Ich begebe mich dieses Mal etwas in die Welt der Administration bzw. von Administratoren. Eigentlich für mich ein etwas fremdes Gebiet, denn ich bewege mich sonst in der Regel rein im Umfeld der Programmierung. Genaugenommen sogar überwiegend der Anwendungs- und Web-Entwicklung. Aber über die Jahre kommt man auch immer wieder mit Themen aus dem Admin-Bereich in Berührung. Ich behaupte, dass ich mittlerweile theoretisch sogar als Admin arbeiten könnte. Vielleicht wäre ich kein wirklich guter Admin, aber die meisten administrativen Dinge – insbesondere unter Linux – würde ich wohl hingekommen.

Und bei dem aktuellen Tipp geht es ja immer noch um Python. Nur halt um einen Einsatzzweck, der für Admins von Interesse ist – wie man mit Python zeitgesteuerte Befehle auf dem Server ausführen kann. Konkret nutze ich dabei Linux als Serversystem und zeige, wie man CronJobs erstellen bzw. CronTabs mit Python schreiben kann.

Ausnahmsweise Donnerstag

Diese Woche ist erst am Donnerstag der neue Entwickler-Tipp zu Python bei LinkedIn Learning freigeschaltet worden. Es geht hier darum, wie man aus Python eine automatische Quelltextdokumentation generieren kann. So eine Dokumentation von Softwareprojekten ist eine oft leidige, aber immens wichtige Aufgabe und in nahezu allen modernen Programmiersprachen gibt es Möglichkeiten, diese Dokumentation aus dem Quellcode heraus etwas zu erleichtern, indem man bestimmte Token in den Quellcode schreibt und daraus eine HTML-Dokumentation oder auch in einem anderen Format erzeugt werden. In Python kann man etwa pydoc bzw. dessen Fork pydoc3 verwendet werden, was in dem Tipp gezeigt wird.

Werte mehreren Variablen in einer Zeile zuweisen – neu in meinem Tutorial zu Python

Auch wenn ich derzeit in Marburg auf Schulung bin, erscheint natürlich am Mittwoch bei LinkedIn Learning wieder ein neuer, aktueller Entwickler-Tipp zu Python. Thema ist die elegante Zuweisung der Werte bei mehreren Variablen.

Neu erschienen – mein JavaFX Grundkurs bei LiL

Über den Sommer habe ich mehrere Training bzw. Aktualisierungen für LinkedIn Learning eingespielt, deren endgültige Fertigstellung bzw. Produktion sich dann doch ziemlich hingezogen haben. Nicht zuletzt Corona hat Arbeitsabläufe und Kapazitäten sowie Prioritäten im Griff,. Aber die Woche ging es wie beim Bretzelbacken und neben der Aktualisierung meines Training zu den Neuerungen der verschiedenen Versionen von Java und meinem aktuellen Entwickler-Tipp zu Python ist diese Woche auch der JavaFX Kurs erschienen. Dabei geht es neben JavaFX auch um FXML und den Sceen Builder sowie NetBeans, Maven, Ant, Gradle, JDK etc..

Ich habe schon früher Kurse zu JavaFX eingespielt (sogar schon zu Zeiten von Video2Brain (V2B), aber auch dann Aktualisierungen für LiL), aber die sind mittlerweile komplett veraltet. Der neue JavaFX Kurs ist deshalb vollkommen neu konzipiert und vollständig neu eingespielt. Außer ein paar Ideen für Beispiele ist nichts mehr identisch zu den alten Kursen.

Was übrigens auch JavaFX als Technologie betrifft. Diese hat sich zum Teil komplett inkompatibel zu älteren Versionen weiterentwickelt. Offiziell heisst sie jetzt sogar nicht mehr JavaFX, sondern OpenJFX und wird nicht mehr von Orcale verantwortet, sondern einer OpenSource-Organisation. Wobei sich der Bezeichner „OpenJFX“ wohl nicht so richtig etablieren will und man deshalb an den meisten Stellen doch wieder den ursprünglichen Bezeichner „JavaFX“ beibehält.

Aktualisierung meines Trainings zu den Neuerungen von Java

Bei LinkedIn Learning habe ich ein Training am Start, das sich um die Neuerungen der verschiedenen Versionen von Java kümmert. Bekanntlich erscheinen neue Versionen von Java mittlerweile alle 6 Monate und deshalb wird dieses Training immer wieder erweitert bzw. auf den neuen Stand gebracht. Derzeit behandle ich in diesem Training die Neuerung von Java 14, 15 und 16. Die Neuerungen der Version 17 spiele ich Ende dieser Woche neu ein und dann wird das Training noch einmal aktualisiert/erweitert und auf eine Art „Endstand“ gebracht. Denn die Version 17 ist nach vielen Jahren wieder eine LTS-Version, die in der Praxis auf viele Jahre die relevante neuste Version bilden wird. Wie der Name LTS – Long-Term-Support – aussagt, werden nur diese Versionen explizit über einen langen Zeitraum unterstützt. Während private Programmierer gerne schnell auf neue Versionen umsteigen, wird man in der professionellen Programmierung bzw. bei Business-Anwendungen fast immer nur solche LTS-Versionen berücksichtigen.

Neuer Tipp zum Verketten von Vergleichsoperatoren

Bei LinkedIn Learning ist wieder ein aktueller Entwickler-Tipp zu Python verfügbar. Es geht dieses Mal um die Verkettung von Vergleichsoperatoren. Dabei geht es darum, mehrere Bedingungen zu verknüpfen und über eine einfache Schreibweise das zu machen. Und wer es noch nicht mitbekommen hat – in der Woche der Veröffentlichung ist der aktuelle Tipp frei (d.h. kostenlos) verfügbar.