Was zum Teufel sind Katas?

Noch nie von Programmier-Katas gehört? Ich auch nicht. Das Wikipedia-Orakel lässt verlauten:

Die Mehrzahl der [Katas] in den Kampfkünsten sind Einzelformen, bei denen ein einzelner Kampfkünstler die Abfolge ausführt, die einen Kampf mit einem imaginären Gegner darstellen kann, aber auch einfach eine Aneinanderreihung verschiedener Bewegungen sein können

Was bedeutet dies nun bezogen auf den sterblichen Programmierer? Für ihn sind Katas kleine Programmier-Aufgaben, die er immer wieder Lösen kann. Dabei löst man nicht ein Kata nach dem anderen, sondern nur ein Kata immer wieder.

Das hört sich unsinnig an? Dieser Meinung war ich auch bis ich es selbst einmal probiert hatte.

Mein erstes Kata ist von Roy Osherove. Wer das mit dem Kata einmal ausprobieren möchte (und dies empfehle ich ausdrücklich), sollte auf der folgenden Seite erst einmal nur bis zum Beginn der Nummerierung lesen, denn dies stellt die Aufgabe dar. Außerdem empfehle ich, die Videos noch nicht anzuschauen. Der Link zum Kata befindet sich im letzten Wort dieses Satzes :D.

Wer damit dann fertig ist, sollte sich eines der Videos (in meinem Fall das Java Video) anschauen und mal die Schönheit, Sauberkeit und Lesbarkeit des eigenen Codes mit dem im Video vergleichen. Ich war echt überrascht und plötzlich vom Sinn solcher Programmier-Katas überzeugt: Manchmal macht Übung den Meister.

Im normalen Programmieralltag ist es schwer, überhaupt nur in die Nähe von Perfektion zu kommen. Das liegt vor allem daran, dass die meisten Probleme nur einmal auftreten und als erledigt gelten, sobald eine funktionierende Lösung vorliegt. Sich hier dann beim nächsten Auftreten eines ähnlichen Problems zu steigern wird schwer weil man entweder die alte Lösung noch im Kopf hat und sie einfach nachbaut (sie hat sich ja schon als funktionierend erwiesen), oder weil man sie nicht mehr weiß und damit wieder von vorne anfängt.

Bei einem Kata hat man dagegen die Möglichkeit, kontinuierlich an allem zu feilen, was das Problem hergibt, um schließlich eine annähernd perfekte Lösung zu kennen. Nur: Was bringt es mir eine perfekte (oder sehr sehr Gute) Lösung zu kennen? Die Antwort lautet: Um zu erfahren, wie sich guter Code anfühlt. Mit dem Sinn für guten Code kann man dann schnell schlechten Code (oder schlechtes Code-Design), der einem von den Fingern fließt, erkennen und hoffentlich schon während dem Entstehungsprozess verbessern. (Es gibt noch viele weitere Antworten, die mir hierzu einfallen würden, allerdings sei es jedem selbst überlassen, sie zu finden.)

Große Empfehlung: Probier das Kata aus, es sind nur 30 Minuten deines Lebens!

PS: Die meisten Katas sind speziell für Anwender des TDD (Test-Driven Development) geschrieben, was man auch ziemlich einfach an der Struktur der Katas erkennen kann. Nichts desto trotz kann man die Aufgaben natürlich auch mit normalem „Brute-Force“ programmieren lösen.

TDD – Der Umstieg

Der Begriff TDD – in Langform Test-Driven Development – war für mich bis vor kurzem bedeutungslos. Erst die zufällige, regen-bedingte Lektüre von Clean Coder: Verhaltensregeln für professionelle Programmierer (geschrieben von UncleBob, einer Ikone im Programmiergeschäft) hat mich mit der Nase drauf gestoßen. Ich denke die allermeisten Nicht-Profis sind bisher relativ gut mit der Methode „programmieren, manuelles testen, debuggen, weiter programmieren“ gefahren. Je komplexer das Projekt, desto ausgedehnter werden mithin die Debug-Sessions und desto verworrener wird der Code. Mit TDD hat theoretisch beides ein Ende oder wird praktisch betrachtet zumindest stark minimiert. Zudem soll TDD einem beim guten und sauberen Design der Software helfen, denn auch Code-Design ist vor allem für Anfänger aber auch für Fortgeschrittene und einige Profis keine leicht zu lösende Aufgabe.

Wer sich jetzt fragt, was TDD ist, dem sei einer der hunderttausend Youtube Videos zum thema empfohlen, zB dieses hier: Test Driven Development Introduction oder auch der Wikipedia-Eintrag. Wichtig zu verstehen ist, dass TDD nicht nur einfach bedeutet, mehr und für alles Tests zu schreiben, sondern dass es eine komplette innere Einstellung beim Programmieren darstellt.

Der Selbstversuch soll mir nun zeigen ob die dem TDD nachgesagten Effekte stimmen. Außerdem soll er meine programmiertechnischen Fähigkeiten um ein paar Level erhöhen und professionalisieren.

Wie sieht der Selbstversuch nun aus? Ich füge dem Android Play Store einen weiteren Taschenrechner zu den gefühlt 100000 schon existierenden Taschenrechnern hinzu 😀 Laut allgemeinem Einvernehmen benötigt man etwa 5 Monate um das TDD-System zu verinnerlichen und um damit schließlich sogar effektiver als zuvor arbeiten zu können. Und ich denke in dieser Zeit wird der Taschenrechner bestimmt einiges lernen können. Falls mir das Endprodukt gefällt werde ich es unter eine offene Lizenz stellen. Solange der Rechner allerdings noch nicht fertig ist, wird er zwar auf GitHub einzusehen sein, aber lizenztechnisch gefesselt.

Mögen die Spiele Beginnen 😀

Ich empfehle auch meinen nächsten Blogposts zum Sinn von Katas: Was zum Teufel sind Katas?

Sainsmart LCD Keypad Library

Auf Ebay und Amazon taucht es massenweise auf: Das SainSmart 1602 LCD Keypad Shield.

Meist wird es im Paket mit einem Sainsmart Mega oder Uno angeboten. Diese Mega- und Uno-Boards entsprechen ziemlich genau den Arduino-Boards und lassen sich auch mit der Arduino IDE (Programmiersoftware) programmieren, was dank der OpenSource Politik von Arduino auch so gewollt ist. Die Sainsmart-Produkte sind zwar billiger, dafür unterstützt man beim Kauf eines echten Arduino die dahinter stehende Arbeit, bekommt ein „Thank-you-for-supporting“-Heft, eine schicke Verpackung und 6 Aufkleber.

Worum es hier jedoch eigentlich gehen soll: Die Firma Sainsmart bietet auf ihrer Webseite eine Bibliothek zum Ansteuern des Tastenfelds des LCD Keypad Shields an. Diese Bibliothek ist leider wirklich, wirklich schlimm, wenn nicht sogar falsch programmiert, weshalb ich hier jetzt gerne ein wenig bashing betreiben würde. Stattdessen gibt es hier aber nur den Ausweg: Unter https://github.com/Phaiax/sainsmartkeypad gibt es eine Bibliothek (für Arduino1.0), die es hoffentlich viel Besser macht. Please Fork!

Ein Beispiel ist nie verkehrt (ich werde es auch gleich mal auf Github hochladen). Erstellt einfach zwei neue Dateien im Arduino-Sketch (der Pfeil ganz rechts in der Dateileiste) mit den Namen ’sainsmartkeypad.h‘ und ’sainsmartkeypad.cpp‘ und kopiert den Code der entsprechenden Dateien von Github in diese Dateien. Schau in den Quellcode der Headerdatei um die erweiterten Einstellungsmöglichkeiten kennenzulernen. Die Hauptdatei könnte dann Beispielsweise so aussehen:

#include <LiquidCrystal.h>

#include "Arduino.h"

// github.com/Phaiax/sainsmartkeypad
#include "sainsmartkeypad.h"

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
SainsmartKeypad keypad(0);
int value = 0;
uint8_t key;

void setup() {
  lcd.begin(16, 2);
  lcd.setCursor(0,0);
  lcd.print("Keypad Example");
}

void loop() {
  key = keypad.getKey_fastscroll();

  // Try the other possibilities:
  // (Only one at a time.
  //  fastscroll, waitrelease and periodic
  //  won't work next to each other.)

  //key = keypad.getKey_waitrelease(); // without fastscroll but usable
  //key = keypad.getKey_periodic(); // not quite usable
  //key = keypad.getKey_instant(); // not quite usable

  if(key != SAMPLE_WAIT) // Do not refresh screen every loop
  {
     switch(key)
     {
       case UP_KEY:
        value++;
        break;
       case DOWN_KEY:
        value--;
        break;
     }
     lcd.setCursor(5,1);
     lcd.print(value);
     lcd.print("        ");
  }
}

 

 

Flächenberechnung mit Inkscape

Zwecks genauer Planung unseres Gartens war ich auf der Suche nach einem einfachen Gartenprogramm für unseren Garten. Es sollte den Garten von oben abbilden und die Möglichkeit bieten, die Flächeninhalte bestimmter Polygone anzugeben, beispielsweise um zu berechnen, wieviel m² Pflaster benötigt wird. Eine 3-D-Ansicht sowie Bibliotheken brauchte ich nicht. Also freundete ich mich mit Inkscape an.

Pläne mit Inkscape zu erstellen ist relativ trivial. Hierfür konnte ich sogar den Maßstab 1:1 benutzen, auch wenn der Garten bei kleinstem Zoom dann nicht mehr ganz auf den Bildschirm passt. Nur das Berechnen des Flächeininhalts von Polygonen kann Inkscape nicht von Haus aus. Ein Script musste her, welches diese Aufgabe übernimmt.

Inkscape benutzt zum Abspeichern der Polygone zum Glück ein XML-Format, aus welchem man leicht die verschiedenen Punkte eines Pfades herauslesen kann. Dank Wikipedia und Gauß bleibt mir die Entwicklung eines eigenen Algorithmus erspart. Wikipedia sagt folgendes:

Wenn die Eckpunkte eines ebenen einfachen (s.o.) Polygons durch kartesische Koordinaten (xi,yi) gegeben sind, kann man die Fläche des Polygons nach der Gaußschen Trapezformel berechnen:

2 A=\sum_{i=1}^n (y_i + y_{i+1})(x_i-x_{i+1})

Wobei die Indizes, die größer als n sind, immer modulo n betrachtet werden müssen, d.h. mit xn + 1 ist x1 gemeint.

Somit sollte das Berechnen des Polygons kein Problem mehr darstellen.

Mein Script ist in Pyton geschrieben, da ich die Erfahrung gemacht habe, dass man mit dieser Programmiersprache am schnellsten und einfachsten kleine Programme schnuddeln kann.

Script-Download: blumenimgarten.py

Das Script muss in eine Datei kopiert werden, beispielsweise blumenimgarten.py

Man kann das Script interaktiv aufrufen oder mit Parametern:

python blumenimgarten.py inkscapedatei.svg pfadID Factor [nonverbose]
python blumenimgarten.py garten.svg path1234 3450 nonverbose
35.105416684

Der Faktor hilft dem Script die in Inkscape benutzte Längeneinheit in Meter oder Zentimeter umzurechnen. Bei meinem Garten waren 1 m ungefähr 3500 Inkskape-Einheiten. Es gibt bestimmt eine Möglichkeit den Umrechnungsfaktor auszulesen oder zu berechnen, aber das war mir die Mühe nicht wert. Deshalb bietet das Script inkeraktiv an, den Faktor mit Hife einer 1cm / 1m Linie auszumessen.

Das Script ist übrigens nur in der Lage geschlossene Pfade zu vermessen. Wie man einen Pfad schließt sagt dir das Script, wenn du versuchst einen nicht geschlossenen Pfad zu vermessen. Außerdem kann das Script keine Kurven verarbeiten. Nur Polygone mit ausschließlich geraden Kanten. Die Ausgabe erfolgt im Quadrat der Einheit, die du beim Vermessen des Faktors benutzt hast. Benutzt du das Script mit einem 4. Parameter, wird ausschließlich das Ergebnis ausgegeben und kein zusätzlicher Text.

Viel Erfolg beim Vermessen.

——————

Dieser Artikel wurde aus meinem alten Blog hierher verschoben.

Hier noch ein hilfreicher Kommentar mit einer eventuell einfacheren Alternative von Casimir:

Alternativ: Als Pixelgraphik in Gimp öffnen und im Histogramm die Pixel ablesen.

 

 

 

Gruß vom Türmchen

Einen Gruß an den werten Leser meines neuen Blogs.

Quatsch beiseite.

Als erstes soll gesagt sein, dass dies nicht mein erstes Blog ist. Mein Erstes Blog hieß Bitbeschleuniger mit dem sagenhaft tollen Untertitel

1 / sqrt( c – vBit ) = ∞

Seid dem 20. April 2010 erschienen insgesamt 2 Artikel, von denen ich einen in dieses Blog übernehmen werde.

Ansonsten nutze ich das Blog als Anlaufstelle für diverse Android und Windows Phone-Apps die ich geschrieben habe und als Publikationsplatform für Codeschnipsel, Programme und Ideen, die vielleicht mal jemand gebrauchen könnte.

Einen Gruß vom Türmchen!