Results for category "Effizient arbeiten"

16 Articles

Entwickeln mit Scrum/Agilo

Wegen eines privaten Projekts habe ich in den letzten paar Tagen eine kleine Entwicklungsumgebung aufgebaut. Dazu dient mir auf meinem Notebook eine VirtualBox (Ubuntu 10.04, Tomcat, MySQL 5.2, Apache 2, Trac + Agilo, SVN) als Deployment- und Entwicklungsplattform. Die Installation des ganzen Environments erledigte ich recht schnell anhand von http://wiki.ubuntuusers.de/Trac und http://www.agile42.com/cms/pages/download-install/

Nachdem ich mich mit Agilo ein bißchen auseinandersetzte, stellte ich fest, dass das Anlagen von Teams nicht funktionierte, die Fehlermeldung

 An error occurred while getting None from the database: no such table: agilo_sprint

war mehr als eindeutig: bei der Installation von Agilo wurden in meiner Version drei Tabellen schlichtweg nicht erstellt.
Nach kurzer Suche wurde ich fündig und legte mit sqlite3 trac.db die fehlenden Tabellen für die Benutzer manuell an:

CREATE TABLE agilo_team (
  name text,
  description text,
  UNIQUE (name)
);
CREATE TABLE agilo_team_member (
  name text,
  team text,
  description text,
  ts_mon real,
  ts_tue real,
  ts_wed real,
  ts_thu real,
  ts_fri real,
  ts_sat real,
  ts_sun real,
  UNIQUE (name)
);
CREATE TABLE agilo_calendar_entry (
  date integer,
  teammember text,
  hours real,
  UNIQUE (date,teammember)
);

agilo_calendar_entry wurde ebenfalls nicht angelegt, wie ich später feststellte.

Weiterhin stellte ich fest, dass beim Erstellen eines Sprints der Fehler

AttributeError: 'NoneType' object has no attribute 'toordinal'

auftrat. Google sei dank fixte ich das Problem, indem ich bei den Sprint-Daten Start- und Endzeitpunkt manuell eintrug. Anscheinend funktioniert das Feld Duration in days in der Sprint-Administration noch nicht so ganz.

Soweit dazu, eventuell gibt es ja die ein oder andere Person, die ebenfalls über diese beiden Fehler stolpert.

Für mich als Scrum-Neuling – produktiv hatte ich diese Entwicklungsmethode noch nicht eingesetzt – wurde ich beim näheren Betrachten der Optionen von Agilo erst einmal erschlagen. Deshalb folgt hier eine grobe Auflistung der Begrifflichkeiten und Funktionalitäten, wie sie in der Standard-Installation definiert sind.

  • Ticket-Typen
    • Requirement sind Tickets, die auf die Fragen Welches Problem zu lösen ist und warum es zum Problem wird. Requirements sollen SMART (Simple, Measurable, Achievable, Realistic and Traceable) sein. Nachdem ein Requirement angelegt wurde, kann über “Edit” 0..n User Stories zugewiesen werden.
    • User Story ist ein Ticket, das beschreibt was der Benutzer mit dem System erreichen will und warum (Nutzen dieser Funktionalität). Nachdem eine User-Story angelegt ist, kann über “Edit” auf einen neuen Task verwiesen werden. Eine User Story kann 0..n Tasks besitzen.
    • Tasks sind Tickets, die eine Aufgabe, die von einem Team Member zu erledigen ist, detailiert erklärt. Jeder Task soll ausführlich sein und sich auf eine Aufgabe beziehen.
  • Backlog
    • Das Product Backlog beinhaltet die User Stories und darunter jeweils die Requirements, die einer User Story zugeordnet sind.
    • Das Sprint Backlog beinhaltet die Requirements (und die User Story bzw. Tasks die dem Requirement zugewiesen worden sind) und offene Bugs. Es werden nur die Requirements/Tasks angezeigt, die dem Sprint zugewiesen worden sind.
    • Sprint bezeichnet den Zeitraum, in dem mehrere Tasks/Requirements gelöst werden. Im Administrations-Interface müssen jeweils neue Sprints mit Start- und End-Datum angelegt werden.
    • Milestone bezeichnet einen Zeitraum, der wiederum aus mehreren Sprints besteht

Die Frage nach dem “Wie gehe ich nun vor?” ist über oben die dargestellte Struktur eigentlich relativ klar:

  • Anlegen der User Stories (WELCHE Funktionalität wird benötigt um einen Business Value zu erreichen?)
  • Erstellen der Requirements (WELCHE Probleme einer User Story gilt es zu lösen?) und Zuweisen der Requirements an eine User Story
  • Erstellen der zugehörigen Tasks (WAS ist bei einer User Story technisch zu tun?), die einer User Story angehören
  • Erstellen eines Meilensteins. Requirements müssen dem Meilenstein zugewiesen werden
  • Erstellen von ein oder mehreren Sprints. Tasks, User Stories und Bugs müssen den Sprints zugewiesen werden

Eventuell werde ich die nächsten Tage noch den ein oder anderen Blog-Eintrag zu Agilo verfassen. Danke fürs Lesen,

CruiseControl / SVNBootstrapper: Server certificate verification failed: issuer not trusted

Heute habe ich endlich die Zeit gefunden, mich um unseren Buildserver zu kümmern.
Meine erste Aufgabe bestand darin, dass ich die kompletten Konfigurationsdateien so abstrahiert habe, dass die eine Projekt-Konfiguration letztendlich nur noch aus 10 Zeilen XML-Code besteht, in denen u.a. der Pfad zum SVN-Repository angegeben ist.
Dies funktionierte auch alles wunderbar, bis der SVNBootstrapper zum ersten Mal die Verbindung mit dem Repository aufnahm.

Im Log bekam ich folgenden Fehler zu sehen:

2009-09-28 14:15:20,739 [Thread-28] WARN  SVNBootstrapper  – svn: OPTIONS von ¯https://$host/svn/$project/trunk®: Server certificate verification failed: issuer is not trusted (https://$host)
2009-09-28 14:15:21,051 [Thread-27] INFO  Project          – Project $projectidle
2009-09-28 14:15:21,051 [Thread-27] INFO  ProjectController – $project Controller: build progress event: idle
2009-09-28 14:15:21,051 [Thread-27] ERROR Project          – exception attempting build in project $project
net.sourceforge.cruisecontrol.CruiseControlException: svn process exited with error code 1

Nach kurzer Recherche wurde ich fündig: Das Benutzerkonto, unter dem CruiseControl läuft, muss das Client-Zertifikat installieren. Dazu gibt es entweder die Möglichkeit, im Subversion-Konfigurationsverzeichnis die SSL-Settings anzupassen oder aber – einfacher – das Zertifikat im Zertifikate-Speicher zu installieren.
Wichtig ist dabei, dass CruiseControl unter einem lokalen Benutzer-Account als Dienst läuft und nicht als NetworkService oder Local System.
Unter dem Benutzer-Account unter dem CC läuft, muss man sich nun anmelden, Internet Explorer starten, auf die URL des WebDAV-Ordners gehen, das Zertifikat installieren und schließlich den CC-Dienst neu starten. Nun funktioniert alles wunderbar und das Projekt Build-Server geht langsam aber sicher dem Ende entgegen

Akzeptanztests für das GWT mit Hilfe von Selenium

Selenium ist ein Sammlung von Tools, mit deren Hilfe sich Akzeptanztests definieren lassen. Selenium IDE kann zum automatischen Aufzeichnen von Aktionen benutzt werden. Dabei wird SI als Plugin im Browser installiert.
So weit, so gut – ich wollte nun für unsere GWT-Applikation Selenium einsetzen, da das manuelle Testen einiges an Zeit in Anspruch nimmt.
Das Warten auf die Antwort der AJAX-Aufrufe löste ich pragmatisch durch pause(). Die User-Extension waitForCondition ignorierte ich für AJAX-Aufrufe erst einmal.

Für mich enstand nun folgendes Problem: die einzelnen Elemente der TreeView (com.google.gwt.user.client.ui.Tree) ließen sich nicht anklicken.

  • SI zeichnete die Clicks nicht auf. Der Grund dafür liegt darin, dass das onClick-Event nicht auf Layer oder Labels an den Browser gefeuert wird.
  • Über die ID (gwt-uid-…) konnte ich den Click (click -> id=gwt-uid-…) laut IDE zwar durchführen, im Browser passierte aber nichts.
  • Eine manuelle Festlegung der ID im GWT (treeItem.ensureDebugId(“element”)) führte zum selben Ergebnis: im Browser passierte rein gar nichts.

Als Fazit kann ich leider nur sagen, dass die Idee hinter Selenium zwar richtig gut ist. Allerdings funktioniert das Zusammenspiel zwischen GWT und Selenium für unsere Zwecke überhaupt nicht. Dementsprechend: Back to the roots und von Hand testen 🙁

Bei meiner Recherche nach möglichen Workarounds bin ich übrigens über CubicTest gestoßen. CubicTest ist ein Eclipse-Plugin mit denen sich Testfälle in der Eclipse-IDE visuell modellieren lassen. Die Tests könne danach unter anderem als Selenium-Tests exportiert werden.

Tool zum Resizen von Fenstern über mehrere Bildschirme

Eclipse-Entwickler kennen das: Sie besitzen zum Entwickeln zwar zwei Bildschirme, aber Eclipse unterstützt kein Multi-Display-Support bzw. keinen, der wirklich zuverlässig funktioniert.
Auf Codeplex wurde nun das Tool VirtualScreenMax releast, dass eine Anwendung auf mehrere Bildschirme resizt. Ich finde das Tool mehr als praktisch, denn nun habe ich Eclipse im Vollbild-Modus auf beiden Bildschirmen laufen und muss nicht mehr Detached-Outlines u.ä. benutzen.

DSH / Luntbuild / CodeBeamer

Bin gerade über die Distributed Shell – DSH gestoßen. Mit diesem Tool kann man unter Linux den selben Befehl an verschiedene Maschinen gleichzeitig absetzen. Ist bei einer größeren Serverfarm unter Umständen ganz hilfreich 😉

Weiterhin bin ich am Überlegen, ob wir von Trac auf CodeBeamer wechseln sollten. Bin da aber noch sehr unschlüssig, da z.B. die Integration von LuntBuild -soweit ich das gesehen habe- nicht existiert.

Für CodeBeamer spricht, dass man nicht für jedes Projekt eine neue Instanz erstellen muss, sondern alles in einer Seite hat. Mit einer der nächsten Trac-Versionen soll das zwar realisiert werden, aber bis die erscheint können noch ein paar Tage in’s Land gehen.

Meta-Programmierung mit JAXME, diff & patch und PHP

Gibt nicht viel Neues von mir. Auf Arbeit bin ich damit beschäftigt an unserem Projekt weiter zu arbeiten. Ich berichtete letzte Woche bereits, dass ich für das Projekt einen Code-Generator geschrieben habe.
Über Ostern habe ich den Code für den Code-Generator noch einmal neu geschrieben und dabei sind einige Sachen für unsere interne Software-Library abgefallen.
Ich habe mit Hilfe von JAXME einen kleines Tool geschrieben, dass mir aus Java-Quellcode alle Methoden, Felder, Imports und Exceptions ausliest und diese Informationen dann als XML-Schema auswirft. JAXME arbeitet nicht mit Reflections, kann also nur auf den reinen Quellcode angewandt werden.

Aus dem XML-Schema werden danach über PHP-Templates die passenden Quellcode-Dateien (z.B.: GWT-Serverimplementierungen) generiert und in die Zieldatei geschrieben.
Falls die Zieldatei bereits existiert, wird mit Hilfe von diff & patch -unter Windows setze ich dafür GnuWin32 ein- ein Patch gebaut und dieser dann auf den bereits existierenden Code angewendet. Dabei enstand als Nebenprodukt die Klasse Ckl_Text_DiffPatch, die eben diff & patch antriggert und den Patch automatisch einspielt.

Extreme Faulheit – Das DRY-Prinzip in Reinkultur

Meine Faulheit hat ein nicht mehr feierliches Maß angenommen: Ich habe gestern für eines unserer Projekte ein Meta-Tool in PHP geschrieben, das aus allen Java-TOs die zugehörigen Dateien erzeugt.
Mit zugehörigen Dateien meine ich damit: BOs, GWT-Service-Implentations, GWT-Service-Definitions, Model-Assemblers, sowie Einträge für web.xml und gwt.xml.
Trotz der Entwicklungszeit des Scripts von ca. 6h habe ich dadurch insgesamt knapp eine Woche an Entwicklungszeit für das Projekt an sich gespart.

Ich bin so faul 😉

phpUnderControl: Klick auf Dokumentation führt zu "artifacts… Invalid Directory"

Ich hatte vor ein paar Tagen eine Mail bekommen, in der ich um Hilfe bezüglich phpUnderControl geboten wurde. Einer der Fehler war, dass beim Klick auf “Documentation” nur der Fehler “artifacts… Invalid directory” erschien. Aus zeitlichen Gründen hatte ich das Thema CruiseControl/phpUnderControl auf Eis gelegt, mich heute Abend aber mal an die Problemlösung gemacht.

Der Fehler tritt auf, wenn im -Tag der falsch eingetragen wurde. Das ist der Fall, wenn das phpUc.php-Script zum Erzeugen des Beispiel-Projekts benutzt wird.
Die beiden artifactspublisher müssen folgendermaßen aussehen:

  <artifactspublisher dir="projects/${project.name}/build/api" dest="artifacts/${project.name}" subdirectory="api"/>
  <artifactspublisher dir="projects/${project.name}/build/coverage" dest="artifacts/${project.name}" subdirectory="coverage"/>

Bitte das dest-Attribut mit dem richtigen Verzeichnis beachten!