Tag Archive: util

Pattern Matching – Java im Vergleich zu Perl

“Perl is born to pattern match.” – Ich denke das kann man ohne Übertreibung so schreiben. Perl löst dieses Problem einfach extrem effizient und elegant. Das folgende kleine Skript zeigt ein paar Beispiele für reguläre Ausdrücke und deren Anwendung in Perl. Wobei ich hoffe, dass mich nicht gleich ein Blitz erschlägt, da ich es wage Perl-Code in unseren Blog zu schreiben, der ja ansonsten eher von Java dominiert wird ;-) .
(weiterlesen …)

Thomas Jaspers

 

Agile Testing Days Berlin, der erste Tag

Der erste Tag der agilen Testtage in Berlin ist vorüber. Vor Wochen hatte ich die Konferenz noch als kleindeutsch abgeschrieben. Nachdem ich auf der Agile 2009 in Chicago aber von vielen gehört hatte, dass sie hier sein würden, hatte ich schon die Vermutung, dass sie größer und internationaler wird, als ich zuerst annahm. Diese Vermutungen haben sich heute bestätigt. Es haben sich viele interessante Gespräche und Kontakte ergeben. Zu der angenehmen Atmosphäre trägt mit Sicherheit auch das gut ausgestattete und architektonisch interessant gebaute Konferenzhotel bei.

Kleiner Wehrmutstropfen am Abend: die ganzen Sprecher haben sich zum “Speaker Dinner” verabschiedet. Die normalen Leute bleiben also unter sich, und Thomas und ich werden gleich mal sehen, wo wir noch andere Agile Tester zum Abendessen auftreiben.

Designing a Lean Software Development Process, von Mary und Tom Poppendieck

Besucht und geschrieben von: Andreas

Laut dem Abstract des Tutorials sollten Möglichkeiten aufgezeigt werden, die (stagnierenden) Produktivitätssteigerungen, die sich allein durch agile Softwareentwicklung ergeben, zu analysieren und Möglichkeiten zur Verbesserung aufzuzeigen.
(weiterlesen …)

Andreas Ebbert-Karroum

 

JUG Köln – 5. Oktober – Vortragsfolien von Eclipse RAP

Bei meinem Vortrag heute bei der Java User Group waren zahlreiche Zuhörer anwesend. Vielleicht wollten sie aber nur an das kostenlose Buffet oder warteten auf den folgenden Vortrag :-) Spaß beiseite, es war ein guter Abend. Neben meinem Vortrag über Eclipse RAP (zu dem sich unten die Slides finden) zeigte Andreas Schreiber vom DLR wie die Forscher mit verschiedenen Programmiersprachen ihre echten Probleme lösen; ganz im Gegensatz dazu, wie wir manchmal Probleme lösen die wir ohne Programmiersprachen garnicht hätten. Er zeigte wie man zum Beispiel Phyton an Java anbinden kann und warum das Sinn macht. Dr. Simon Wiest brachte nicht nur leuchtende Bären mit um den Zustand seines Hudson Builds zu visualisieren, sondern auch einige Ideen und Ansätze wie man Builds beschleunigen kann. Der Abend endete mit ein paar Kölsch und Diskussionen wie man denn mit Nabaztags einen sinnvollen Buildmonitor bauen kann ohne nur deren Ohren zu rotieren :-)

Fabian Lange

 

Commite jeden tag, oder wirf es weg – Lebe Agilität jeden Tag

Eines der größeren Proleme in agilen Softwareentwicklungsteams ist der Aufwand. Natürlich, denn Aufwand ist Geld, und da wir alle gerne Geld haben, wollen wir auch möglichst wenig Aufwand. In Planungsmeetings wird aber oft vereinfachend mit Aufwand umgegangen “oh das ist eine Woche Aufwand”. Wie kann denn aber diese eine Woche umgesetzt werden, wenn man es nicht schafft die Aufgaben für die 5 Tage zu definieren?

Zur Lösung des Problems schlage ich eine radikale Strategie vor: Werft am Ende eines Tages alles unfertige weg!

(weiterlesen …)

Fabian Lange

 

FitNesse vs. Robot Framework – Agile Testing Tools

Die Auswahl der “Kontrahenten”

Aus dem doch recht großen Pool an – kommerziellen und frei verfügbaren –Tools für agiles Testen möchte ich im Folgenden einen genaueren Blick auf FitNesse und das Robot Framework werfen. Beide Tools sind frei verfügbar und wie man an den Projektseiten sehen kann werden beide Projekte kontinuierlich weiterentwickelt. Auch finden sich bei Beiden aktuelle Support-Mailinglisten, was sich bei einem ernsthaften Einsatz sicherlich sehr hilfreich ist. Natürlich ist die Auswahl der Kontrahenten ein Stück weit willkürlich, da es noch eine ganze Reihe weiterer Tools in diesem Umfeld gibt. Zum Beispiel Concordion, welches ebenfalls frei verfügbar ist, oder Liquid als eine kommerzielle Alternative. Da Zeit aber – leider – eine begrenzte Ressource ist, musste ich hier eine Vorauswahl treffen. Ich hoffe aber in einem späteren Artikel noch auf weitere Tools eingehen zu können.

(weiterlesen …)

Thomas Jaspers

 

iCalender Dateiverarbeitung, Groovy!

Heute Nacht wollte ich eigentlich planen, welche Sessions ich auf der Agile 2009 besuchen möchte, die nächste Woche in Chicago stattfindet. I freue mich schon sehr auf die Konferenz und kann mich nur schwer zwischen den vielen Sessions entscheiden, weil ich so viele verpassen werde! Planung erfordert natürlich ein mindestmaß an Organisation. Auf der Homepage der Konferenz kann man sich durch das Importieren von iCalendar-Dateien die Termine der Sessions in den Kalender einpflegen. Eine großartige Idee … die leider nicht funktioniert, wenn man in einer anderen Zeitzone als Chicago lebt, oder Outlook als seinen Kalender benutzt. Meine Vermutung ist, dass eines der beiden Kriterien auf die meisten Benutzer zutrifft. Deshalb frage ich mich ernsthaft wie gut das Feature auf der Webseite getestet wurde. Naja, egal, mir hat es in den Fingern gekribbelt und ich habe einen Blick in dieSpezifikationen von iCalendar geworfen und ein kleines Groovy-Skript fabriziert, dass die bestehenden iCalendar-Dateien konvertiert.

>> Alle sessions sind konvertiert und können hier heruntergeladen werden. Fertig um in den Kalender importiert zu werden – auch nach Outlook.

Es gab mit den originären Dateien zwei Probleme. Hier ist eine Beispieldatei:

BEGIN:VCALENDAR
VERSION:2.0
PRODID:Agile2009
METHOD:PUBLISH
CALSCALE:GREGORIAN
X-WR-CALNAME:Agile2009
X-WR-CALDESC:Agile2009
BEGIN:VEVENT
UID:1220
DTSTART:20090825T140000
DTEND:20090825T173000
SUMMARY:User Stories for Agile Requirements
LOCATION:Columbus IJ
URL;VALUE=URI:http://agile2009.agilealliance.org/node/1220
DTSTAMP:20090209T022940Z
LAST-UPDATED:20090723T173948Z
END:VEVENT
END:VCALENDAR

Zeitzonen

Die Start- und Endzeit beinhalten keine Information über die Zeitzone, also wird die lokale Zeit angenommen. iCalender spezifiziert, dass die Zeit UTC ist, wenn ein “Z” angehangen wird. Die Transformation ist also sehr einfach: fünf Stunden draufzählen um von Chicago zu UTC zukommen, und ein “Z” anhängen.

Outlook

Das zweite Problem wird offenbar, wenn man versucht mehr als eine Session in Outlook zu importieren. Beim ersten Mal erstellt Outlook automatisch einen neuen Kalender “Agile2009″. Cool. Bei der zweiten Session landet diese aber wieder in einem neuen Kalender “Agile2009 (1)”. Extrem uncool. Um das zu beheben, müssen die beiden Properties X-WR-CALNAME und X-WR-CALDESC entfernt werden. Dies scheint leider ein bekanntes Problem mit Outlook zu sein. Zum Glück lässt sich das ebenfalls einfach beheben.

Groovy

Um die Konvertierung zu automatisieren, habe ich ein kleines Groovy-Skript geschrieben, welches sich erst alle gültigen Session-IDs besorgt, dann die iCalendar-Dateien herunterlädt und die beiden Fehler behebt, und mir auch noch den Text ausgibt, den ich in unser WordPress kopieren muss. Das Skript kann mit Sicherheit noch verbessert werden, aber es tut erstmal seinen Job. Was ich wirklich liebe an Groovy, ist die Möglichkeit Strings wie ein Array zu zerschneiden, und dabei mit negativen Indexen auch von hinten zählen zu können, sowie die Möglichkeiten durch das regex-Handling, das macht Aufgaben wie diese um ein Vielfaches einfacher :)

public class ConvertCalendar{
 
private static final String VCAL_TIME_FMT = "yyyyMMdd'T'HHmmss";
 
public static void main(def args){
// use the smartphone page to get all valid session numbers
// http://agile2009.pairwith.us/sessions
InputStream sessionStream = new URL("http://agile2009.pairwith.us/sessions").openConnection().inputStream
 
String sessions = org.apache.commons.io.IOUtils.toString(sessionStream);
 
List calList = new ArrayList();
 
// href="/sessions/5107"
sessions.eachMatch(/href="\/sessions\/\d{1,4}"/) {
	InputStream calendarStream = new URL("http://agile2009.agilealliance.org/session_ical/" + it[16 .. -2]).openConnection().inputStream
	String calendar = org.apache.commons.io.IOUtils.toString(calendarStream);
 
	File calendarFile = new File("./cals/temp - calendar.ics");
	def calendarFileWriter = new FileWriter(calendarFile)
	def calendarFileName = "";
	calendar.eachLine {
		def vCalLine = it;
		if (vCalLine ==~ /^X-WR-CALNAME:.*/ || vCalLine ==~ /^X-WR-CALDESC:.*/) {
			// ignore that line
		} else if (vCalLine ==~ /^DTSTART:.*/ ) {
			def origDate = Date.parse(VCAL_TIME_FMT, vCalLine[-15..-1])
			vCalLine = vCalLine[0..-16] + DateUtils.addHours(origDate,5).format(VCAL_TIME_FMT) + "Z";
			calendarFileWriter.write("${vCalLine}\n")
			calendarFileName = origDate.format("yyyy-MM-dd'T'HHmm");
		} else if (vCalLine ==~ /^DTEND:.*/) {
			def origDate = Date.parse(VCAL_TIME_FMT, vCalLine[-15..-1])
			vCalLine = vCalLine[0..-16] + DateUtils.addHours(origDate,5).format(VCAL_TIME_FMT) + "Z";
			calendarFileWriter.write("${vCalLine}\n")
		} else if (vCalLine ==~ /^SUMMARY:.*/) {
			calendarFileName = calendarFileName + " " + vCalLine[8..-1].replaceAll("[^\\w\\s]", "")
			println "Processing " + calendarFileName
			calendarFileWriter.write("${vCalLine}\n")
		} else {
			calendarFileWriter.write("${vCalLine}\n")
		}
	}
	calendarFileWriter.close();
	calendarFile.renameTo(new File("./cals/"+calendarFileName+".ics"))
 
	calList.add(calendarFileName+".ics")
	calendarStream.close();
}
 
println "Text to paste into Wordpress after uploading: "
println "<ul>"
Collections.sort(calList)
calList.each {
	println "<li><a href="\">${it}</a></li>"
}
println "</ul>"
 
}}
Andreas Ebbert-Karroum