Archiv für den Monat: Oktober 2019

PowerShell versus Python – GetMember versus dir()

Bei PowerShell ist Get-Member nicht umsonst eines der wichtigsten Cmdlets. Dank Get-Member erfährt man, welche Members eine Objekt besitzt. Und das ist bei einer Scripting-Umgebung, bei der alles ein Objekt ist, sehr viel wert.

Auch bei Python ist alles ein Objekt (eigentlich andersherum, da Python ca. 15 Jahre älter ist), leider gibt es ein direktes Pendant zu Get-Member (zumal es auch keine Pipeline gibt). Es gibt aber eine Function, die Get-Member relativ nahe kommt. Sie trägt den ungewöhnlichen Namen dir(). Warum ungewöhnlich? Weil dieser Name seit den Zeiten von GW-Basic für einen Befehl/Function steht, die einen Verzeichnisinhalt auflistet. Aber ganz unpassend ist der Name nicht.

Der folgende Befehl geht noch ein wenig weiter, in dem dank List Comprehensions nur Members eines Objekts ausgegeben werden, die nicht mit einem Unterstrich beginnen (damit wird die Ausgabe bereits etwas übersichtlicher).

[name for name in dir(hits) if not name.startswith("_")]

Die Ausgabe besteht natürlich nicht aus Objekten, sondern lediglich aus Strings. Aber immerhin.

In diesem Vergleich punktet PowerShell. Nicht nur, weil Get-Member mehr Möglichkeiten bietet, sondern weil bei der Rückgabe von dir() etwas Wichtiges fehlt: Die Metadaten über ein Member, also z.B. den Datentyp einer Property.

Tipp des Tages: Verzeichnisse aus der path-Umgebungsvariablen entfernen

Hin und wieder kann es erforderlich sein, einzelne Verzeichnisse aus der path-Umgebungsvariablen zu entfernen. Was sich zunächst schwierig anhören könnte, ist in der Praxis dann doch ein relativ einfacher Befehl.

Der folgende Befehl entfernt alle Verzeichnisse, die ein Python36 enthalten, aus der Path-Umgebungsvariablen.

$env:path = $env:path.split(";").where{$_ -notmatch "Python36"} -join ";"

Die Änderung gilt natürlich nur für die aktuelle PowerShell-Sitzung. Soll sie dauerhaft sein, muss der neue Wert der Umgebungsvariablen über die SetEnvironmentVariable()-Methode der Environment-Klasse für den aktuellen Benutzer oder systemweit gespeichert werden.

Praxistipp: Das Anmeldekonto für einen Systemdienst aktualisieren

Zu den wenigen Einstellungen, die für einen Systemdienst nicht per Set-Service vorgenommen werden können gehört das Ändern des System- oder Benutzerkontos, unter dem der Dienst ausgeführt werden soll. Diese Einstellung muss per WMI, der Klasse Win32_Service und ihrer Change()-Methode vorgenommen werden. Benutzername und Kennwort werden dabei im Klartext übergeben. Eine kleine Herausforderung besteht darin, dass für alle nicht verwendeten Parameter ein $null übergeben werden muss.

Bill Stewart hat ein schönes Skript erstellt ( Set-ServiceCredential.ps1), mit dem das Systemkonto für einen Systemdienst aktualisiert werden kann:

https://gist.github.com/Bill-Stewart/ab3a228903c5d6fb3c12dc1d92d3d1e8

Mir ist das Skript aber etwas zu umfangreich und formal. Die folgende Function erledigt die Einstellung etwas kürzer:

function Set-ServiceAccount { [CmdletBinding()] param([String]$Servicename, [String]$Username, [String]$Password) Stop-Service -Name $ServiceName $service = Get-WmiObject Win32_Service -Filter "Name='$ServiceName'" $ret = $service.change($null,$null,$null,$null,$null,$null,$Username,$Password,$null,$null,$null) if ($ret.ReturnValue -eq 0) { Write-Verbose "Kontoinformation wurde erfolgreich aktualisiert." Start-Service -Name $ServiceName } else { Write-Warning "Die Kontoinformation konnte nicht aktualisiert werden - ReturnValue=$($ret.ReturnValue)" } }

Ging alles gut, ist der ReturnValue = 0. Ansonsten eine Zahl, die einen Fehlercode darstellt. 22 bedeutet z.B., das das Konto nicht stimmt (in dem Skript von Bill Stewart werden alle Fehlercodes abgefragt und durch Fehlermeldungen ersetzt).

Tipp des Tages: Befehlsverlauf (History) durchsuchen mit PsReadline

Der Befehlsverlauf (History) der PowerShell-Konsole besitzt den (kleinen) Nachteil, das er nicht automatisch gespeichert wird und damit beim nächsten Start der Konsole nicht mehr vorhanden ist. Was nicht jeder PowerShell-Anwender wissen dürfte, sobald PSReadline verwendet wird, gibt es einen eigenen Verlauf, der über die Pfeiltasten abgerufen wird (nicht per Get-History). Praktisch ist, dass sich dieser Verlauf auch durchsuchen lässt.

Ex-Scripting Guy Ed Wilson hatte ja bereits schon 2014 (also vor mehr als 5 Jahren) darüber geschrieben:

Lange her, aber immer noch aktuell – der Umgang mit dem Befehlsverlauf der PowerShell-Konsole

Im Grunde läuft es auf den Tastaturshortcut [Strg]+[r] hinaus. Über ihn wird der Befehlsverlauf von PsReadline nach allen Zeilen rückwärts durchsucht, die mit der danach eingegebenen Zeichenfolge beginnen. Für jeden weiteren Treffer drückt man erneut [Strg]+[r]. Für was die Vorwärtssuche per [Strg]+[s] gut sein soll, ist mir dagegen nicht klar. Vielleicht hat jemand eine Erklärung.

Im „neuen“ PSReadline zeigt Get-PSReadlineKeyHandler die Tastaturshortcuts auch sehr übersichtlich an.

Mein Besuch auf der PyCon 2019 in Berlin

vom 9. bis zum 11.10.2019 fand in Berlin die diesjährige PyCon Deutschland- und PyData-Konferenz statt. Die PyCon Deutschland findet jedes Jahr in einer anderen Stadt statt. Das letzte Jahr fand sie in Karlsruhe statt, dieses Mal war Berlin an der Reihe und Berlin ist bekanntlich immer eine Reise wert. Ich war nur am 10.10 dort, konnte aber trotzdem ein paar interessante Eindrücke sammeln.

Disclaimer: Ich bin kein Python-Profi. Ich habe mir die Sprache vor 2-3 Jahren selber beigebracht (das hätte ich bereits Mitte der 90er Jahre tun sollen, als Christian Gross darüber einen Artikel im VB-Magazin geschrieben hatte, aber das ist ein anderes Thema). Python ist für mich in erster Linie ein Hobby. Ich denke, dass Python die ideale Einsteigersprache ist und ideal dazu geeignet, Menschen die Grundlagen der Programmierung beizubringen. Ich gebe seit 2 Jahren Einführungskurse an der VHS in Esslingen. Python macht mir zwar sehr viel Spaß, für die Anwendungsentwicklung käme es aus verschiedenen Gründen aber nicht in Frage. Und das ist auch gut so, denn dafür gibt es ja C# und neuerdings X#, die beide keine Wünsche offen lassen.

Die Konferenz war offenbar komplett ausverkauft, also Warteliste. Am ersten Tag wurde eine Zahl von 1.100 TeilnehmerInnen vermeldet, was für die Veranstalter ein großer Erfolg sein dürfte. So viele waren am zweiten Tag aber nicht mehr zu sehen, auch wenn das Kosmos an der großen Karl Marx-Allee, das immer eine gute „Location“ für solche Veranstaltungen ist, relativ voll waren (vor allem während der Pausen bildeten sich die vertraut langen Schlangen am Buffet).

Zu den Inhalten kann ich nicht viel schreiben, da ich im Wesentlichen nur einen Nachmittag auf der Konferenz verbracht hatte. Ich kam gerade rechtzeitig zur Panel-Diskussion, bei der einige der Python Core-Developer auf der Bühne standen und über die besonderen Herausforderungen sprachen und gleichzeitig Werbung für neue „Mitglieder“ machen wollten. Das war eine gute Gelegenheit einmal ein paar jener Menschen kennenzulernen, durch die es überhaupt regelmäßig neue Python-Versionen gibt (auch wenn die Sprache bekanntlich von Guido van Rossum in Amsterdam erfunden wurde, spielt sich die Entwicklung, soweit ich es verstanden habe, seit vielen Jahren spielt sich fast ausschließlich in den USA ab). Wenn eines deutlich wurde, dass Core Developer zu sein eine zeitaufwändige Angelegenheit ist. Daher auch der Rat eines der Beteiligten: Wenn ihr unbedingt mitmachen wollt, sucht Euch zuerst ein überschaubares Package, bei dem ihr euch erst einmal an den „Open Source-Workflow“ gewöhnen könnt. Auf alle Fälle war die Veranstaltung genauso unterhaltsam wie informativ.

Der nächste Vortrag handelte über das Thema Static Typing, das auch unter Python möglich ist. Dass es kaum jemand wirklich braucht, ließ der Sprecher, der bei Google als Developer Advocate tätig ist, aber auch durchblicken.

Dann war für mich die Konferenz auch fast schon wieder vorbei, da die folgenden Tracks etwas zu speziell waren. Von der parallel stattfindenden PyData-Konferenz (hier war unter anderem der Chef-Entwickler von Anaconda zu Gast) habe ich nichts mitbekommen.

Drei Kleinigkeiten am Rande:

>Die meisten Besucher waren (aus meiner Perspektive) relativ jung, Durchschnittsalter 28 Jahre.

>Ein erfreulich hoher Frauenanteil, u.a. waren die PyLadies präsent. Generell wird Diversität auf solchen Konferenzen groß geschrieben. Auch ein rein vegetarisches/veganes Buffet gibt es nicht auf jeder Konferenz (für mich war es ok, wer Fleisch bevorzugt, fand auf der Karl Marx-Allee eine reichhaltige Auswahl an Alternativen und musste vor allem nicht in der Schlange warten).

>Es gab eine Reihe von Ausstellern. Dabei handelt es sich aber mehrheitlich um bekannte Internetfirmen wie Zalando, Idealo oder Yelp, bei denen Python vermutlich in erster Linie zur Datenanalayse eingesetzt wird. IBM war auch anwesend und sponsorte die Abendveranstaltung am Donnerstag. Auch Microsoft war mit einem Stand vertreten, dort wurde aber lediglich die inzwischen etwas „lahme“ Gesichtserkennung vorgeführt, durch die das Alter und und der Gesichtsausdruck von Menschen erkannt wird, die an einer aufgestellten Kamera vorbeilaufen. Ein weiterer alter Bekannter war die Firma JetBrains, die für Python ihre PyCharm-IDE im Angebot hat, die um Unterstützung für die Packages zur Datenanalyse erweitert wurde.

Fazit: Der Besuch der PyCon Deutschland 2019 hat sich für mich gelohnt, wenngleich der Aufwand für einen solchen Kurzbesuch natürlich etwas hoch war. Ganz in der Nähe zum Veranstaltungsort befindet sich das Museum für Computerspiele, dem ich natürlich ebenfalls einen Besuch abgetattet habe. Wo kann man unter anderem einen Amiga 1000, ein Atari ST oder einen C64 mit Floppy-Kasten in einer Glasvitrine bewundern? (die Hauptattraktion ist natürlich die Möglichkeit, die Klassiker aus den 80er Jahren spielen zu können).

Ein paar Fotos, die während der Konferenz entstanden sind…

Buchtipp: Bulletproof SSL and TLS von Ivan Ristic

Vor kurzem musste ich mich im Zusammenhang mit einem WCF-Projekt wieder einmal mit SSL-Zertifikaten beschäftigen. Grundsätzlich kommt ja, in erster Linie dank StackOverflow, zum Ziel und muss sich nicht mit den Internas von Zertifikaten und „SSL“ beschäftigen, auf die Dauer ist das natürlich nicht befriedigend. Gerade bei einem so wichtigen Thema ist ein „Halbwissen“ (die Mengenangabe „Halbe“ ist nur metaphorisch gemeint, 1/100 Wissen wäre eher zutreffend) auf die Dauer etwas unbefriedigend.

Natürlich gibt es jede Menge Informationen zum Thema TLS/SSL im Web und in zahlreichen Büchern. Auf ein wirklich hervorragendes Buch bin ich eher per Zufall gestoßen:

Bulletproof SSL and TLS von Ivan Ristic

Das Buchcover zum Buch Bulletproof SSL and TLS

Der Autor hat sich nach eigener Aussage vor einigen Jahren auf das Thema spezialisiert und es zu einer Art „Lebensaufgabe“ gemacht. Das Buch gibt es natürlich bei Amazon, aber auch direkt vom Autor:

https://www.feistyduck.com/books/bulletproof-ssl-and-tls/

Das Buch ist sein Geld in jedem Fall wert (für Studenten gibt es eine Ermäßigung, allerdings muss man einen Nachweis seines Studenten- oder Lehrstatus nachträglich zur Verfügung stellen).

Wenn es einen kleinen Schwachpunkt gibt, dann das die aktuelle Ausgabe bereits zwei Jahre alt ist (was ein wenig im Widerspruch zur Ankündigung des Autors steht, in kurzen Intervallen Aktualisierungen zur Verfügung zu stellen – aber vermutlich fehlt dann doch irgendwann einfach die Zeit)