Archiv für Allgemein

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!