Unittests für die Kommandozeile

Unsere Kaffeemaschine wird zwangsläufig über die Kommandozeile aufgerufen. Das wäre selbst dann noch der Fall, wenn wir eine graphische Oberfläche hätten und der Benutzer zum Start auf ein Icon doppelt geklickt hätte. Unter der Haube werkelt halt immer noch die gute alte Konsole. Da ist es nur logisch, auch diesen Aufruf einigen Unittests zu unterziehen.

Die Rechtschreibkorrektur schlug als Alternative für das ihr unbekannte „Unittests“ übrigens „Unsitte“ vor 🙂 Weit gefehlt! Es wäre eher eine Unsitte, Unittests nicht durchzuführen.

Das Dumme an unserer bisher so eleganten Lösung für die Kommandozeilen-Parameter ist, dass wir so recht gar nicht wissen, wie die Parameter eigentlich in unser Programm gelangen. Da scheint etwas Magie im Hintergrund zu werkeln! Und in der Tat, genau so ist es.

Unittests für die Kommandozeile weiterlesen

Ähnliche Artikel:

Zurück an die Arbeit!

Es ist gut, dass das mal jemand ausspricht beziehungsweise schreibt. Zu oft ist man in der Tretmühle gefangen, ohne sie wahrzunehmen. Mag sie nun mit Worten wie „das haben wir schon immer so gemacht“ ausgesprochen oder stillschweigend gelebt werden. Viel zu oft habe ich in meinem Umfeld darauf hingewiesen, leider meistens erfolglos. Nun steht es geschrieben, und das ist ja etwas anderes. Hier meldet sich jemand zu Wort, der es wissen muss. Ein hochbezahlter „Externer Berater“. Jetzt passiert endlich etwas. Hoffentlich.

Nun bin ich ja nie der gewesen, der gerne Theater spielt. Authentizität liegt eher in meiner Natur als irgendeine Rolle zur Schau zu stellen. Doch zu erfahren, dass ich unbewusst wohl doch zu den Schauspielern gehöre, ist schon ein harter Schlag. Wie konnte es dazu kommen? Ach so, worum geht es eigentlich? Es geht um Arbeit, die keine Arbeit ist. Denn einen erheblichen Teil unserer Arbeitszeit arbeiten wir eigentlich gar nicht, sagt Lars Vollmer. In seinem neuen Buch „Zurück an die Arbeit“ geht er ziemlich hat mit uns ins Gericht. Meetings, Mitarbeitergespräche, Budgetverhandlungen und dergleichen mehr sind also keine Arbeit, sagt er. Das ist Theater, eine Posse, bestenfalls noch sozial notwendiges Geplänkel, aber nicht produktiv, es dient nicht dem Kunden.

Zurück an die Arbeit! weiterlesen

Ähnliche Artikel:

Anforderungsmanagement

Die einen ignorieren es, andere wollen es dogmatisch mit tausenden von Dokumenten abgesichert wissen: Anforderungsmanagement. Es ist ein schwieriges Thema, und wie der Volksmund so schön sagt: „Allen Leuten recht getan ist eine Kunst, die niemand kann!“

Einig sind sich viele zumindest darin, dass so etwas nötig ist. „Wer nicht weiß, wo er hin will, braucht sich nicht zu wundern, wenn er ganz woanders ankommt.“ Doch wie viel Aufwand für die Erfassung und Dokumentation der Anforderungen (engl. „requirements“) ist wirklich sinnvoll?

Anforderungen sollten …

  • vollständig
  • atomar
  • eindeutig
  • verständlich
  • identifizierbar
  • widerspruchsfrei
  • erfüllbar
  • überprüfbar

… sein. Siehe dazu auch den Artikel Anforderungsanalyse in der Wikipedia. Darin findest du nicht nur einige theoretische Erläuterungen, sondern auch weiterführende Links. An dieser Stelle will ich nur mit kurzen Worten beschreiben, was es mit diesen „Anforderungen an Anforderungen“ auf sich hat.

Anforderungsmanagement weiterlesen

Ähnliche Artikel:

PyDay: Die listige Python (2)

Letzte Woche beschrieb ich ein Problem, heute nun die Lösung. Oder hast du es bereits selbst herausgefunden?

Wir erinnern uns: Es ging um die Sortierung einer Kundenliste nach Umsätzen. Dazu hatte ich eine einfache Klasse entworfen, die den Namen und den aktuellen Umsatz des Kunden enthält. Das Problem war nun, dass Klassenobjekte nicht sortierbar sind, weil deren Reihenfolge nicht definiert ist.

Ich dachte zunächst, mir mit einem simplen (aber genialen!) Trick helfen zu können. Ergänze ich die folgende Methode in der Klasse, …

  1. def __str__(self):
  2.     return self._name

… dann wird dieses möglich (Zeile 7):

  1. kunde1 = Kunde('Müller', 69000)
  2. kunde2 = Kunde('Meier', 42000)
  3. kunde3 = Kunde('Schulze', 23000)
  4.  
  5. print(kunde1, kunde2, kunde3)

Leider funktioniert das nicht mit der sort-Funktion. Daher nun der andere Trick, der auf jeden Fall funktioniert. Wir brauchen dazu eine zusätzliche Funktion, die eine solche Klasse wie oben übergeben bekommt und den Umsatz als Rückgabewert liefert:

  1. def umsatz_von_kunde(kunde):
  2.     return kunde.umsatz()

Nun können wir nach Instanzierung der drei Kunden die Liste zusammensetzen (Zeile 10), probeweise ausgeben (12-14), sortieren lassen (16) und noch einmal ausgeben (ab 17):

  1. kundenliste = [kunde1, kunde2, kunde3]
  2.  
  3. print('Vor der Sortierung:')
  4. for kunde in kundenliste:
  5.     print ('   {0}: {1}'.format(kunde.name(), kunde.umsatz()))
  6.  
  7. kundenliste.sort(key=umsatz_von_kunde)
  8. print('Nach der Sortierung:')
  9. for kunde in kundenliste:
  10.     print ('   {0}: {1}'.format(kunde.name(), kunde.umsatz()))

In Zeile 16 erhält die Sort-Methode mit dem benannten Parameter „key“ die Referenz auf die Funktion, die den für die Sortierung verwendeten Wert liefert. Kleine Änderung, große Wirkung! Genial, oder?

Ähnliche Artikel:

SNEK5-Abend

Der Samstag Abend war einem besonderen Event vorbehalten. Dieses hat bei den „EK“-Veranstaltungen von Karl Donaubauer und seinem Team schon ein paar mal statt gefunden, aber bisher hatte ich keine Gelegenheit, daran teilzunehmen. Diesmal hat es geklappt.

Der „Abend“ ist gewissermaßen eine Ergänzung zu den Vorträgen. In lockerer Runde diskutierten etwa 60 Teilnehmer der SNEK5 über aktuelle Themen. DIe Referenten hatten Tische vorbereitet, an denen sie die Themen ihrer Vorträge weiter zu vertiefen anboten. Der gebuchte Catering-Service sorgte für Essen und kalte Getränke, so dass die Zeit nicht mit dem Warten auf ein Essen im Restaurant vertrödelt wurde.

Viel gibt es dazu nicht zu sagen, daher hier nur ein paar Fotos zur Illustration.

Diese Diashow benötigt JavaScript.

Ähnliche Artikel:

PyDay: Die listige Python

Python 3 (Johannes Ernesti und Peter Kaiser)
Python 3 (Johannes Ernesti und Peter Kaiser)
Inzwischen ist euch sicher bekannt, dass die Programmiersprache Python einige interessante Elemente enthält. Das lässt den Code sehr kompakt und dennoch elegant aussehen. Insbesondere einige eingebaute Funktionen sind dabei extrem hilfreich.

In dem nebenstehend verlinkten Buch (Affiliate-Link!) habe ich für den Datentyp „list“ eine solche Funktion gefunden, die das Sortieren einer Liste betrifft, die ich euch gern demonstrieren möchte.

Gehen wir beispielhalber zunächst von der normalen Sortierfunktion aus. Dabei gibt es eine nachvollziehbare Voraussetzung: Die Elemente der Liste müssen sortierbar sein! Was im ersten Moment ziemlich trivial klingt, kann bei näherer Betrachtung überraschende Unmöglichkeiten enthalten. In dem Buch erläutern die Autoren dies am Beispiel komplexer Zahlen, für die nämlich keine Sortierungsvorschrift existiert.

Einfaches

Eine simple Liste von Zahlen ist natürlich sortierbar, was man sehr einfach in der Python-Konsole (unter Windows einfach „Start –> Ausführen –> Python“, unter Linux einfach Konsole starten, „python“ eingeben und RETURN drücken) nachvollziehen kann. Zunächst definieren wir in Zeile 1 eine Liste von Zahlen, die ich mangels größerer Fantasie einfach aus dem Datum und der Uhrzeit erstellt habe, als ich diesen Artikel geschrieben habe. Zeile 2 gibt diese testweise auf der Konsole aus. Wie wir sehen, entspricht die Reihenfolge noch genau der Eingabe. In Zeile 4 sortieren wir die Liste, Zeile 5 dient wieder der Ausgabe und zeigt nun die sortierte Liste. So weit, so gut.

  1. meineliste = [23, 12, 2015, 14, 43]
  2. meineliste
  3. [23, 12, 2015, 14, 43]
  4. meineliste.sort()
  5. meineliste
  6. [12, 14, 23, 43, 2015]

Spannenderes

Spannend wird es, wenn das Sortierkriterium entweder gar nicht existiert oder aus einer völlig anderen Quelle kommt. Wie wäre es beispielsweise, wenn ich meine Kundenliste nicht nach dem Namen, sondern nach deren Umsatz sortieren möchte?

Probieren wir folgendes:

class Kunde(object):
    def __init__(self, name, umsatz):
        self._name = name
        self._umsatz = umsatz
 
    def name(self):
        return self._name
 
    def umsatz(self):
        return self._umsatz
 
kunde1 = Kunde('Müller', 69000)
kunde2 = Kunde('Meier', 42000)
kunde3 = Kunde('Schulze', 23000)
 
kundenliste = [kunde1, kunde2, kunde3]
kundenliste.sort()

Was passiert dabei? Probier es aus, Fortsetzung folgt …

Ähnliche Artikel:

SNEK5: Warteschlange (Uwe Ricken)

Was ist eine Warteschlange? Wann muss der SQL-Server warten? Interessante Fragen, und jeder von uns weiß wohl, dass das gelegentlich vorkommt. Gewartet werden muss immer mal, wenn irgendeine Ressource nicht verfügbar ist. Das wiederum kann verschiedene Ursachen haben, von einem simplen (und oft nur kurzzeitigem) parallelen Zugriff bis hin zu einer begonnenen, aber leider nicht beendeten Transaktion eines anderen Users.

Eigentlich ist es ganz einfach. Eine SELECT-Abfrage wird, vom User kommend, in eine Warteschlange gestellt, die nach dem Muster First-In-First-Out abgearbeitet wird. Ist die Abfrage an der Reihe, wird sie an den Parser weitergegeben, es wird ein Plan für die Ausführung erstellt (zur Ermittlung des effizientesten Weges, die Daten zu beschaffen) und dann wird sie zur Ausführung vorgemerkt. Jetzt ist also bekannt, wie es gemacht werden soll.

SNEK5: Warteschlange (Uwe Ricken) weiterlesen

Ähnliche Artikel:

SNEK5: Sicher? (Thomas Trefz)

Ich habe ja schon des öfteren darauf hingewiesen, dass gewisse Sicherheitstricks nicht ungeprüft verworfen werden sollten. Ihr haltet mich für paranoid? Dann solltet ihr euch zunächst mal klar machen, welche Möglichkeiten ein Angreifer hat, um sich Zugang zu einem Netzwerk zu verschaffen. Die Technik ist dabei nur ein Teil des Problems, was uns Thomas Trefz sehr anschaulich vor Augen führt.

Wenn der SQL-Server seine Dienste standardmäßig auf Port 1433 anbietet, wenn gemischte Authentifizierung neben dem Windows-Login auch z.B. „sa/sa“ zulässt (oder noch besser „sa/-„), wenn eine Webanwendung wie Sharepoint ihre Daten jedem Interessierten bereitstellt, wenn private Daten gelegentlich auch auf dem Firmen–Laptop landen, dann … ja, dann reden wir wahrscheinlich über den ganz normalen Wahnsinn aus einem beliebigen Betrieb.

SNEK5: Sicher? (Thomas Trefz) weiterlesen

Ähnliche Artikel:

Pure Links

Warum glauben Leute, es genüge, eine Twitter-Nachricht abzusetzen, in der sich einzig und allein ein Link befindet? Was sollte mich motivieren, auf diesen Link zu klicken, wenn anscheinend nicht mal der Autor das Ziel interessant genug findet, um sich mit wenigen Worten darüber auszulassen?

Wie oft kommt es vor, dass außer einem Link nichts in einer eMail steht? Wie oft ist der Absender dann einer, den man scheinbar kennt, weil er Allerweltsnamen wie „Herbert“ oder „Lisa“ trägt? Meine eigene Adresse als Absender, mit oder ohne „Madonna nackt“ als Betreff. Die Wahrscheinlichkeit ist bei solchen Aufmachern nicht gerade klein, dass eine hinreichende Anzahl von Neugierigen diese Links dann anklickt, um sich — statt etwas neues von Lisa oder Madonna zu sehen (na was wohl?) — einen Trojaner einzufangen. Aber bei Twitter ist das ganz anders. Da kann uns nichts passieren, weil da sind alle lieb und brav. Man ist ja unter sich.

Glauben Sie? Nein, bitte glauben Sie das nicht. Warum? Aus Gründen.

@chjuengling

EDIT: Ja, bei dem automatischen Twitter-Post dieses Artikels ist es genau so. Muss ich nicht gut finden. Vielleicht finde ich eine Möglichkeit, das zu ändern.

EDIT 2: Und diese dämliche Silbentrennungsautomatik von WordPress muss auch endlich verschwinden.

Ähnliche Artikel:

%d Bloggern gefällt das: