Python3 – Variablen

Variablen

Variablennamen in Python sind erstmal Case Sensitiv. Ansonsten gilt:

  • A-Za-z
  • 0-9 (nur nicht an erster Stelle)
  • _

Ein Dollar Zeichen am Anfang wird nicht benötigt. Spart auf Dauer auch wieder einiges an getippten Zeichen.

Und dann gibt es einen großen Unterschied zu sprachen wie Java oder C. In diesen werde nämlich Variablen typisiert. Das ist in Python jedoch nicht der Fall. Eine Variable in Python hat keinen Typ. Wohl aber das Objekt, auf welche die Variable verweist.

Somit funktioniert das folgende problemlos:

Sprich eben noch auf ein int Objekt verwiesen, kann die variable im nächsten Moment auf einen String zeigen. Variablen können auf alles verweisen, auch auf Funktionen. Dazu später mehr.

Es bleibt noch zu merken das eine Variable erst zur Laufzeit entsteht und zwar zum Zeitpunkt der ersten Zuweisung.

Gültigkeit

Bei der Gültigkeit einer Variable gibt es einen etwas eigenwilligen Ansatz. Der ist aber auch der Tatsache geschuldet böse Globalen Variablen zu vermeiden. Für die Beispiele ein Hintergrund: def leitet eine Funktion ein. Dann fangen wir an:

Dies funktioniert, da  s nicht innerhalb der Funktion lokal definiert ist. Es wird (lesend) auf die globale Variable s zugegriffen.

Hier erfolgt aus Ausgabe:

Die Variable s in der Funktion f bleibt nun eine lokale Variable innerhalb der Funktion und hat wie jede andere in Funktionen definierten Variablen keinen Einfluss außerhalb der Funktion.

Der mix geht jetzt natürlich nicht:

Dieses Chaos ergibt zu recht ein: UnboundLocalError: local variable ‘s’ referenced before assignment

Das Chaos könnte man nun mit dem global Schlüsselwort gültig machen. Aber sollte man das wirklich mal brauchen läuft mit dem Code sowieso irgend etwas falsch.

Der Schnellkurs

Bei Fragen hinterlasse mir  einfach ein Kommetar.

Python3 – Hallo Welt, Syntax und der Interaktive Modus

Hallo Welt

Hallo Welt ist in Python schnell geschafft. Vorausgesetzt ihr habt Python3 erfolgreich installiert (wobei es fast auf jedem aktuellen *NIX von alleine mitkommt), braucht ihr nur eine Datei die auf .py endet.

Beispiel: hallo_welt.py

Wie aus anderen Scriptsprachen bekannt, wird in der ersten Zeile nach der Shebang (#!) der Pfad zum Interpreter angegeben. Um z.B. in Virtuellen Umgebungen flexible zu bleiben, geben wir hier nicht den direkten Pfad aus, sondern beziehen ihn immer aus unserem Environment.

Die Datei muss jetzt nur noch ausführbar gemacht werden, und kann dann ausgeführt werden:

Syntax

Hier unterscheidet sich nun Python von den verbreiteten C Ähnlichen Programmiersprachen. Das mag am Anfang nun etwas gewöhnungsbedürftig sein, aber man lernt es wirklich lieben.

Blöcke werden in Python nicht mit geschweiften Klammern gebildet, sondern durch einen Doppelpunkt gestartet. Alles was zu dem Block gehört, bleibt jetzt mindestens 2, optimal und verbreitet 4 stellen eingerückt. Hier sei noch gesagt, stellt euren Editor so ein das er aus Tabs entsprechend Leerzeichen macht. Sonst kann es mal zum Chaos kommen wenn ihr mit mehren Leuten zusammenarbeitet.

Beispiel:

Zeilenenden

Zeilenende müssen im Gegensatz zu vielen anderen Sprachen nicht gekennzeichnet werden. Eine Zeile ist zu ende, wenn sie zu ende ist. Ausnahme, das Zeilenende ist aufgehoben. Eine ziemlich geniale Sache, spart man sich doch das Tippen unzähliger Zeichen.

Entwertet wird das Zeilenende entweder von Hand, mit einem \, oder ist es automatisch wenn eine Klammer ( { [ nicht geschlossen ist.  Auch gibt es in Python eine bestimmte Sorte Strings, die Mehrzeilig sein kann. Einfach entweder 3x ” oder 3x ‘.

In Python gibt es übrigens keinen Unterschied zwischen Strings in einfachen oder doppelten Anführungszeichen. Lediglich muss ich die einfachen innerhalb doppelter nicht escapen und umgekehrt.

Dann zum Beispiel

Kommentare

Was Kommentare angeht ist Python auch sehr einfach. Einfach das Hash Zeichen. Jeweils von # wird bis zum Zeilenende kommentiert.

Mehrzeilig geht auch mit einer Art Trick. Dieser wird auch benutzt um Methoden und Funktionen zu Dokumentieren. Und zwar mit einem Mehrzeiligen String (“””)

Interaktiver Modus

Ein nützliches Feature in Python ist der Interaktive Modus. Er ist praktisch um schnell mal was auszuprobieren. Print braucht man nicht, alles wird direkt ausgegeben. Gestartet wird er durch die Eingabe python3, beendet mit Strg + D

Der Schnellkurs

Das war auch schon der erste Einstieg. Bei Fragen hinterlasse mir  einfach ein Kommetar.

Schnelleinstieg in Python3

Bei Python handelt es sich um eine verbreitete Programmiersprache, die nicht nur einfach, sondern auch schnell und mächtig ist. Sie wurde 1990 von Guido van Rossum veröffentlicht. Inzwischen gibt es bereits mehrere Jahre die Version 3 von Python, die jedoch nicht kompatibel zum Vorgänger ist. In der Version 3 wurde so manche unschönheit der Version 2 beseitigt. Vor einigen Jahren hat sich die Frage 2 oder 3 noch gestellt, heute jedoch fängt man nur noch mit 3 an.

Für jeden, der bereits (etwas) Programmiererfahrung hat, habe ich hier einen Schnelleinstieg zusammengestellt, welcher die wichtigsten Grundlagen einfach zu vermitteln versucht.

Und wer dann Tiefer einsteigen will, der findet z.B. diesem Buch alle Details.

Themen

  • Hallo Welt und Syntax
  • Variablen
  • Bedingungen
  • Strings und Integer
  • Listen
  • Tupeln
  • Dictionarys
  • Schleifen
  • Splices
  • Funktionen
  • Lambda
  • Klassen
  • List- und Dict-Comprehensions

Python Flask: Mutable Objekte in der Session

(Alle Beispiele nur exemplarisch)
In Flask steht eine sehr praktische Session funktion zur Verfügung:

Aber das Problem:

Auf der dritten Seite wird man nun merken das der Wert inhalt3 fehlen wird.
Das ist kein Bug, sondern hier fehlt ein session.modified = True

Dies ist bei jedem mutablen Typ notwendig, um Flask über die änderung zu informieren.
Siehe dazu auch: Flask Dokumentation

Ubuntu, Windows und Strg Tasten Tauschen

Da ich inzwischen mit Mac und Linux Systemen im Wechsel arbeite,
möchte ich natürlich ein möglichst gleiches verhalten von allen Systemen.

Unter Ubuntu mit dem Awesome Desktop manager, reicht es für mich die linke Windows mit der linken Strg Taste zu tauschen. Das schafft Xmodmap.

Unter ~/.Xmodmap benötige ich die folgenden Einträge:

Hier geht man davon aus, das Keycode 37 die Taste Strg, und Keycode 133 die Windows Taste ist. Klarheit schaft hier das tool xev, das sich mit apt-get install xev installieren lässt.

Wer übrigens auch die Caps Lock Taste mal sinnvoll nutzen mag,
geht so:

Hier wurde ihr (code 66) die Funktion der Windows Taste zugewiesen. Macht die Tastenkombinationen in Awesome einfacher :)

Atom Editor -> Schriftbild unter Ubuntu

Wer mich kennt weiß ja das ich bis jetzt immer mit VIM Entwickle. Da ich aber auch gerne mal was neues probiere, habe ich nun Atom ausprobiert. Das Konzept gefällt mir ganz gut, die Bedienung ist dank dem Package vim-mode-plus auch fast wie gewohnt, nur das Schrift rendering war sehr unschön.

Das Problem scheint unter Ubuntu auch verbreitet zu sein, aber folgende Lösung habe ich hinbekommen:

Zuerst, das Styling des Editors kann man per CSS anpassen. Folgendes habe ich dazu angelegt:

Gerade der text-stroke hat das Schriftbild verbessert.

In den Einstellungen habe ich ansonsten noch die Font Family auf “source code pro” und die Line Height auf “1.2” angepasst.

Womöglich hilft das ja jemanden weiter.

Homematic xml api zugriff schützen

Benutzer der XML API auf der Homeatic Zentrale (CCU) hatten ziemlich sicher bereits die selbe Idee wie ich:  Unterwegs komfortabel die Heizung der Wohnung mit dem Handy zu regulieren. Problem ist jedoch die Sicherheit: Die XML API bietet keinerlei Authentifizierung an.  Der erste Versuch war das absichern mit VPN. Der Komfort bleibt hier jedoch etwas auf der Strecke, da man mit dem Handy immer zuerst eine VPN Verbindung nach Hause aufbauen muss. Einfacher geht es natürlich direkt per https (Dank DynDNS Dienst der FritzBox).

Die Autorisierung habe ich über einen Reverse Proxy  in Form von NGINX auf meiner qnap Nas realisiert. Dieser soll eine Passwort Abfrage vor die API setzen.  Anstelle einer NAS würde sich hier natürlich auch ein Raspberry PI anbieten. Längerfristig will ich zwar die CCU durch die NAS komplett ersetzen, dazu fehlt mir aber erst einmal die Zeit.

Was ist nun zu tun:

Über die APP Manager auf der Administrations- Oberfläche installiert man zuerst das NGINX Paket.  Nun verbindet man sich per SSH auf die NAS und wechselt dort in das NGINX Verzeichnis: /share/CACHEDEV1_DATA/.qpkg/Nginx/nginx. Direkt dort habe ich eine Passwort Datei mit dem Namen htpasswd angelegt (vim). Deren Inhalt ist eine Liste mit Usernamen und gehashten Passworte die auf diversen Websites oder mit dem Kommando htpasswd erzeugt werden können. Leider nur nicht direkt auf der Nas:

Der zweite Schritt ist nun die NGINX Konfiguration. Im Unterverzeichnis conf befindet sich die Datei nginx.conf.

In dieser gibt es einen Bereich der mit Server { eingeleitet wird.  Darin habe ich einen neunen location Bereich eingeleitet.

Wird die Adresse der nas anschließend gefolgt von /homeatic aufgerufen wird  NGINX die Anfrage an die CCU umleiten.

Wesentlich sind die Parameter auth_basic_user_file welcher den Pfad zur zuvor erstellen Passwortdatei enthält, charset um Zeichensatz Probleme mit der API zu lösen und proxy_pass welcher die Adresse der CCU im Lokalen Netzwerk angibt.

Zuletzt muss noch nginx auf der NAS neu gestartet werden. Was dazu der vorgesehene Weg ist habe ich nicht recherchiert. Ich habe ihn einfach gekillt und neu gestartet:

 

Fertig.

 

Check_MK vs Icinga?

Gestern auf dem Münchner Linux Stammtisch stand als Thema Monitoring auf dem Programm. Scheinbar so gut besucht wie nie, lauschten 62 Teilnehmer den Dozenten Mathias Kettner (mein Chef), der für Check_MK sprach, und Bernd Erk (von Netways), welcher Icinga 2 vorstellte.

Wie zu erwarten war, gab es natürlich eine Diskussion, welches Konzept das bessere ist. Einer der Diskussionspunkte war: “Ein Automatisches Discovery oder eine Manuelle bzw. CMDB gestützte Konfiguration?”

Klar, darüber kann man streiten. Discovery wurde als Argument für Check_MK gesehen, Manuelles Konfigurieren als Argument für Icinga. Was wohl aber gerne verdrängt wird: selbst der Manuelle Ansatz lässt sich mit Check_MK einfacher einrichten als mit Icinga. Statt mit dem Discovery zu arbeiten, kann man alle Checks auch manuell zuweisen. Ob man dies nun in Wato macht, in den Konfigurationsdateien, oder diese von einem externen Tool generieren lässt, kann man selbst entscheiden.

Link zu den Manual Checks
Link zu den Manual Checks in Wato

Einmal angeklickt, präsentieren sich die verschiedenen Check Typen:

Liste der Manual Checks in Wato
Unvollständige Liste der Manual Checks in Wato

Was ist nun aber der Vorteil, wenn man den manuellen Ansatz per Check_MK konfigurieren möchte? Die Regelbasierte Konfiguration:

Maske zum manuellen anlegen eines Checks
Maske zum manuellen Anlegen eines Checks

Statt einen Check “Explicit” einem Host zuweisen zu müssen, kann man alternativ dazu die frei definierbaren “Host Tags” verwenden, oder auch einen Regulären Ausdruck (bei Verwendung einer Tilde am Anfang des Hostnamens wird der folgende String als regulärer Ausdruck behandelt).

Das Ganze findet sich dann wie folgt in den Konfigurationsfiles wieder:

Da es sich hier um Python handelt, ist es ein Leichtes, dies extern generieren zu lassen. Die Verwendung von Schleifen ist dadurch hier auch möglich.

Meine Meinung ist: Der Wunsch einer Manuellen Konfiguration ist weder ein Argument gegen Check_MK noch eines für Icinga.

Und jetzt nicht böse sein Bernd, du hast gestern gesagt: Die durchschnittliche Icinga Umgebung sind 10-20 Hosts. Bei Check_MK liegt sie (meine Erfahrung beim Consulting) etwas höher: zwischen 500 und 1000. Warum das so ist, konnte sich gestern sicher jeder denken :-)

Backup von OMD

Wer sich schon mal gefragt hat wie man seine OMD Installation sichern oder gar auf einen neuen Server übertragen kann,
der kann sich über ein neues Feature freuen welches Lars Michelsen letzte Woche in OMD eingebaut hat. Es handelt sich um eine Backup und Restore Funktion.

Backup

Sichert man innerhalb der Site reicht bereits,  das Kommando mit einem Zielpfad aufzurufen.

Als Root ist vor dem Backup Zielpfad nur die Angabe des Sitenamen nötig. Gibt man übrigens anstelle eines Zielpfades ein minus ein, wird das Backup auf STDOUT geschrieben.

Restore

Dieser klappt zur Zeit nur als root:

Hier kann man jetzt praktischerweise gleich noch einen neuen Sitenamen mit angeben.  Ersetzt man den Pfad hier mit einem minus,  liest das Kommando von STDIN.

Alle Fragen dazu beantwortet:

 

Lego Mindstorms EV3 mit python

Seit heute bin ich Besitzer eine Lego Mindstorms EV3 Sets. Das erste Modell war nach der Anleitung leicht gebaut und lies sich per IR auch schon steuern. Das Programmieren mit der von Lego mitgelieferten Software mit Click und Bunt ist jedoch nicht mein Fall.

Wer mich kennt weiß das ich inzwischen am liebsten in Python programmiere, und so wollte ich es beim EV3 auch haben. Glücklicherweise gibt es bei GitHub bereits ein Projekt was sich damit befasst. Alles was man braucht ist eine Micro SD Karte von mindestens 2GB. In der GitHub Readme findet sich der Link zu einem Image file, welches man nur noch mit dd if=python-ev3.img of=/dev/<sdcard device> bs=2M auf die SD Karte bannen muss.

Die SD Karte steckt man dann noch in den Brick und startet ihn. Was mich anfangs sehr irritiert hatte, auf dem LCD steht auch nach dem Booten noch der Start Bildschirm, trozdem kann man sich schon mit ssh [email protected] und passwort: password verbinden.

Nach etwas suche im Internet habe ich sogar auch ein kleines Beispiel  Script gefunden und nach etwas Anpassung war mein erster Roboter fertig, der immerhin fahren kann, bei einem Hindernis dreht und das solange bis die Batterien leer sind, oder man den Taster betätigt.

Hier dann das Script dazu: