<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>codecentric Blog</title>
	
	<link>http://blog.codecentric.de</link>
	<description>Expertenwissen rund um agile Softwareentwicklung, Java und Performance Solutions.</description>
	<lastBuildDate>Wed, 15 May 2013 14:39:03 +0000</lastBuildDate>
	<language>de-DE</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/codecentric" /><feedburner:info uri="codecentric" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>JAX 2013: Enterprise Java Batch mit Spring</title>
		<link>http://feedproxy.google.com/~r/codecentric/~3/fv6u5EUOSyY/</link>
		<comments>http://blog.codecentric.de/2013/04/jax-2013-enterprise-java-batch-mit-spring/#comments</comments>
		<pubDate>Thu, 25 Apr 2013 09:22:47 +0000</pubDate>
		<dc:creator>Tobias Flohre</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JAX]]></category>
		<category><![CDATA[Konferenzen]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=18124</guid>
		<description><![CDATA[Dennis Schulte und ich haben gestern auf der JAX 2013 in Mainz einen Vortrag mit dem Titel &#8216;Enterprise Java Batch mit Spring&#8217; gehalten. Der Vortrag teilt sich in drei Bereiche auf: Im ersten Teil geht es um Grundlagen im Bereich &#8230; <a href="http://blog.codecentric.de/2013/04/jax-2013-enterprise-java-batch-mit-spring/">weiterlesen  <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Dennis Schulte und ich haben gestern auf der JAX 2013 in Mainz einen Vortrag mit dem Titel &#8216;Enterprise Java Batch mit Spring&#8217; gehalten. Der Vortrag teilt sich in drei Bereiche auf:<br />
Im ersten Teil geht es um Grundlagen im Bereich Spring Batch, während im zweiten Teil Enterprise-Aspekte beleuchtet werden. Spring Batch als Anwendungsframework schreibt nicht vor, wie es betrieben wird, außerdem gibt es noch weitere Fragen, die im Unternehmensumfeld zu klären sind, wie beispielsweise die Integration mit Fremdsystemen (Host-Scheduler), Vorgaben für Entwickler, Build-Pipelines und Testing. Im dritten Teil geht es um Neuigkeiten im Bereich Java Batch: Spring Batch 2.2, der Java Specification Request (JSR) 352 zur Standardisierung von Java Batch und die Integration von Spring Batch und Hadoop.<br />
Hier finden sich die zugehörigen Folien:</p>
<p><a href="http://blog.codecentric.de/files/2013/04/JAX-2013-Enterprise-Java-Batch-mit-Spring.pdf">JAX 2013 Enterprise Java Batch mit Spring</a></p>
<p><script async class="speakerdeck-embed" data-id="df4953a08fba0130b23622000a1c4609" data-ratio="1.41436464088398" src="//speakerdeck.com/assets/embed.js"></script>
<div class="dzone_button" style="float: right;     margin-top: 30px">
<iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&#038;url=http%3A%2F%2Fblog.codecentric.de%2F2013%2F04%2Fjax-2013-enterprise-java-batch-mit-spring%2F&#038;title=JAX+2013%3A+Enterprise+Java+Batch+mit+Spring" height="25" width="155" scrolling="no" frameborder="0"></iframe>
</div>
<img src="http://feeds.feedburner.com/~r/codecentric/~4/fv6u5EUOSyY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2013/04/jax-2013-enterprise-java-batch-mit-spring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.codecentric.de/2013/04/jax-2013-enterprise-java-batch-mit-spring/</feedburner:origLink></item>
		<item>
		<title>Der Softwerker</title>
		<link>http://feedproxy.google.com/~r/codecentric/~3/lDlcn7x_ubI/</link>
		<comments>http://blog.codecentric.de/2013/04/der-softwerker/#comments</comments>
		<pubDate>Tue, 09 Apr 2013 11:13:44 +0000</pubDate>
		<dc:creator>Mirko Novakovic</dc:creator>
				<category><![CDATA[Agilität]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Continuous Delivery]]></category>
		<category><![CDATA[DevOps]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=18075</guid>
		<description><![CDATA[Bin sehr stolz heute die erste Ausgabe unseres Magazins &#8220;Der Softwerker&#8221; zu präsentieren. Der Name ist dabei Programm. Software Craftsmanship ist unsere Leidenschaft bei codecentric und im Softwerker schreiben unsere Experten über Themen rund um Agile Softwareentwicklung, Continuous Delivery und &#8230; <a href="http://blog.codecentric.de/2013/04/der-softwerker/">weiterlesen  <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Bin sehr stolz heute die erste Ausgabe unseres Magazins &#8220;Der Softwerker&#8221; zu präsentieren.</p>
<p>Der Name ist dabei Programm. Software Craftsmanship ist unsere Leidenschaft bei codecentric und im Softwerker schreiben unsere Experten über Themen rund um Agile Softwareentwicklung, Continuous Delivery und moderne Technologien.</p>
<p>In dieser Ausgabe haben wir folgende Artikel für Euch aufbereitet:</p>
<ul>
<li><span style="line-height: 13px;">Software Craftsmanship ohne Craftsmanship? (Uwe Friedrichsen)</span></li>
<li>Die DevOps-Bewegung (Patrick Peschlow)</li>
<li>Der Big Data Developer (Pavlo Baron)</li>
<li>Spring komplett ohne XML &#8211; geht das? (Tobias Flohre)</li>
<li>Das Problem mit der Architekturqualität (Uwe Friedrichsen)</li>
<li>Erfolgreiche Festpreisprojekte durch flexiblen Inhalt (Mirko Novakovic)</li>
<li>Continuous Delivery in der Praxis (Marcel Birkner)</li>
</ul>
<p>Momentan gibt es die Ausgabe kostenlos nur in gedruckter Form, weil wir ein hochwertiges Magazin Format für den &#8220;Softwerker&#8221; gewählt haben. Registriert Euch einfach kostenlos auf http://www.codecentric.de/softwerker/ und wir schicken Euch jede Ausgabe zu.</p>
<p style="text-align: center;"><a href="http://www.codecentric.de/softwerker/"><img class="aligncenter size-full wp-image-18076" alt="softwerker" src="http://blog.codecentric.de/files/2013/04/softwerker.jpg" width="576" height="261" /></a></p>
<p style="text-align: center;">
<p style="text-align: left;">Bin gespannt auf Euer Feedback und Vorschläge für die nächsten Ausgaben.</p>
<div class="dzone_button" style="float: right;     margin-top: 30px">
<iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&#038;url=http%3A%2F%2Fblog.codecentric.de%2F2013%2F04%2Fder-softwerker%2F&#038;title=Der+Softwerker" height="25" width="155" scrolling="no" frameborder="0"></iframe>
</div>
<img src="http://feeds.feedburner.com/~r/codecentric/~4/lDlcn7x_ubI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2013/04/der-softwerker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.codecentric.de/2013/04/der-softwerker/</feedburner:origLink></item>
		<item>
		<title>Noch einmal – 10 Tipps zu Java Debugging mit Eclipse</title>
		<link>http://feedproxy.google.com/~r/codecentric/~3/znPajIwdX-M/</link>
		<comments>http://blog.codecentric.de/2013/04/noch-einmal-10-tipps-zu-java-debugging-mit-eclipse/#comments</comments>
		<pubDate>Mon, 08 Apr 2013 05:19:17 +0000</pubDate>
		<dc:creator>Daniel Reuter</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=18059</guid>
		<description><![CDATA[Dieser Blog ist leider nur in Englisch verfügbar. LINK]]></description>
				<content:encoded><![CDATA[<p>Dieser Blog ist leider nur in Englisch verfügbar. <a href="http://blog.codecentric.de/en/2013/04/again-10-tips-on-java-debugging-with-eclipse/">LINK</a>
<div class="dzone_button" style="float: right;     margin-top: 30px">
<iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&#038;url=http%3A%2F%2Fblog.codecentric.de%2F2013%2F04%2Fnoch-einmal-10-tipps-zu-java-debugging-mit-eclipse%2F&#038;title=Noch+einmal+%E2%80%93+10+Tipps+zu+Java+Debugging+mit+Eclipse" height="25" width="155" scrolling="no" frameborder="0"></iframe>
</div>
<img src="http://feeds.feedburner.com/~r/codecentric/~4/znPajIwdX-M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2013/04/noch-einmal-10-tipps-zu-java-debugging-mit-eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.codecentric.de/2013/04/noch-einmal-10-tipps-zu-java-debugging-mit-eclipse/</feedburner:origLink></item>
		<item>
		<title>Standup- oder Sofameeting</title>
		<link>http://feedproxy.google.com/~r/codecentric/~3/pWEBMHKvBLk/</link>
		<comments>http://blog.codecentric.de/2013/04/standup-oder-sofameeting/#comments</comments>
		<pubDate>Thu, 04 Apr 2013 11:40:40 +0000</pubDate>
		<dc:creator>Marc Clemens</dc:creator>
				<category><![CDATA[Agilität]]></category>
		<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=16296</guid>
		<description><![CDATA[Ob ein Meeting erfolgreich verläuft, hängt von vielen Faktoren ab, das richtige Format und der richtige Ort spielen dabei eine gewichtige Rolle. Anlass für meine Überlegungen war ein Meeting, das im Kontext von mehreren zusammenarbeitenden Teams (Scrum of Scrum) stattfand. &#8230; <a href="http://blog.codecentric.de/2013/04/standup-oder-sofameeting/">weiterlesen  <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Ob ein Meeting erfolgreich verläuft, hängt von vielen Faktoren ab, das richtige Format und der richtige Ort spielen dabei eine gewichtige Rolle.</p>
<p>Anlass für meine Überlegungen war ein Meeting, das im Kontext von mehreren zusammenarbeitenden Teams (Scrum of Scrum) stattfand. Ziel des Meetings war es, die Ergebnisse der einzelnen Teamretrospektiven abzugleichen und teamübergreifende Maßnahmen abzustimmen. Die Teams hatten in ihren Retrospektiven die anzusprechenden Maßnahmen identifiziert und ein Mitglied in das Abstimmungsmeeting delegiert. Die Delegierten haben sich in einer Ecke des offenen Arbeitsbereichs getroffen, und dort auf mehreren beweglichen Sofas  Platz genommen.</p>
<p>Als unbeteiligter Beobachter (Chicken) habe ich dieses Abstimmungsmeeting als träge und ineffizient empfunden. Die Teilnehmer haben dem Sprechenden nur mit halbem Ohr zugehört, die Sprechenden schweiften ab und der Moderator konnte die geplante Struktur des Meetings nicht halten. Als Ergebnis wurde die Timebox überschritten, ohne das am Ende das geplante Ziel erreicht wurde. Ich glaube, dass die gewählte Form und der Ort des Meetings erheblich dazu beigetragen haben.</p>
<p><span id="more-16296"></span></p>
<p><strong>Besprechnungsraum, Offene Teamfläche oder gar Arbeitsplatz</strong></p>
<p>Die meist genutzten Orte für Meetings sind Besprechungsräume. Dabei handelt es sich um dediziert vorgesehene, abgeschlossene Räume, meist mit für Besprechungen hilfreicher Ausstattung wie feste Beamer, Whiteboards oder Flipcharts.</p>
<p>Den größten Vorteil dieser Räume stellt die gute Abschirmung gegen Störungen von außen dar. Die Teilnehmer können ihre Aufmerksamkeit vollständig auf das Thema und das Meeting richten. Für Außenstehende findet so ein Meeting im stillen Kämmerlein statt. Weitere Nachteile sind eher „logistischer“ Natur. Solche Räume sind meist nicht in ausreichendem Maße vorhanden und müssen im Voraus reserviert werden. Spontane Meetings sind oft nicht möglich. Auch liegt ein verfügbarer Raum nicht immer in der Nähe der normalen Arbeitsplätze der Teilnehmer, so dass eine längere „Anreise“-Zeit benötigt wird.</p>
<p>Alternativen zu dedizierten Besprechungsräumen stellen ruhigere Bereiche auf offenen Flächen dar. Dabei kann es sich z. B. um einen extra dafür vorgesehenen Bereich einer Teamarbeitsfläche, die größere Kaffeeküche oder eine Ecke in der Kantine (außerhalb der Mittagzeit) handeln. Die logistische Ausstattung variiert, je nach Ort, meist sehr stark.</p>
<p>Ein solcher Ort erhöht die Transparenz für Außenstehende, da jeder, der vorbei kommt, zumindest sieht, dass ein Meeting stattfindet und wer daran teilnimmt. Auch eine spontane Teilnahme ist durch Dazugesellen, Zuhören und sogar Mitreden möglich. Vorzeitiges Verlassen und späteres Hinzustoßen kann ohne größere Störung erfolgen. Dies ist aber auch einer der gravierenden Nachteile. Teilnehmer werden sehr einfach von außen gestört und abgelenkt und verlieren so den Fokus auf das Meeting.</p>
<p>Ein sehr spezieller Ort ist der Arbeitsplatz eines oder mehrerer Teilnehmer. Logistisch hat es für die Teilnehmer durch den kurzen Weg einen Vorteil. Für die Teilnehmer ist es aber viel schwerer, sich auf das Meeting zu fokussieren, da der eigene Arbeitsplatz eine Quelle vieler Ablenkungen darstellt (Telefon, Emails, Instant-Messenger).</p>
<p><strong>Meetingformate</strong></p>
<p>Das Format des Meetings ist im Vergleich zum Ort mit viel weniger Restriktionen wählbar.</p>
<p>Die oben beschrieben Situation, bei der die Teilnehmer im Kreis auf Sofas sitzen, halte ich für ein extremeres Beispiel. Das Format erzeugt eine entspannte und lockere Atmosphäre. Was aber auch schnell zu einer trägen Beteiligung am Meeting führt. So muss ein Teilnehmer, der aktiv das Flipchart nutzen möchte, aus den tiefen Sofas aufstehen. Da ein Moderator meist steht, wird auf der &#8220;Ebene&#8221; der Sitzenden leicht eine Nebendiskussion begonnen. Aufgrund des bequemen Sitzens dauern die Diskussionen länger.</p>
<p>Das absolute Gegenteil stellen dazu Stand-Up Meetings dar, in die Teilnehmer das Meeting im Kreis stehend durchführen. Dieses Format fördert meist Aufmerksamkeit für den aktuell Sprechenden und das Meeting insgesamt, da sich die Teilnehmer auf natürlich Weise dem Sprechenden zuwenden. Die Moderation erfolgt auf gleicher Augenhöhe und Diskussionen werden selten in die Länge gezogen. Auch eine aktive Beteiligung, zum Beispiel an einem Whiteboard, erfolgt mit einer sehr niedrigen Hemmschwelle durch einen einfachen Schritt in Richtung des Boards.</p>
<p><strong>Fazit</strong></p>
<p>Ort und Format des Meetings haben Einfluss auf Ablauf und Wirkung eines Meetings. Dessen sollte ich mir als Organisator/Moderator bewusst sein und es mir, falls möglich, für die jeweilige Situation zu nutze machen oder, falls nicht die optimale Wahl verfügbar ist, die negativen Einflüsse durch anderen Mittel kompensieren.
<div class="dzone_button" style="float: right;     margin-top: 30px">
<iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&#038;url=http%3A%2F%2Fblog.codecentric.de%2F2013%2F04%2Fstandup-oder-sofameeting%2F&#038;title=Standup-+oder+Sofameeting" height="25" width="155" scrolling="no" frameborder="0"></iframe>
</div>
<img src="http://feeds.feedburner.com/~r/codecentric/~4/pWEBMHKvBLk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2013/04/standup-oder-sofameeting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.codecentric.de/2013/04/standup-oder-sofameeting/</feedburner:origLink></item>
		<item>
		<title>Aus dem Blickwinkel eines Mathematikers:  JMeter – Geliebtes Dreckstool</title>
		<link>http://feedproxy.google.com/~r/codecentric/~3/ub9oPt4TFeE/</link>
		<comments>http://blog.codecentric.de/2013/03/aus-dem-blickwinkel-eines-mathematikers-jmeter-geliebtes-dreckstool/#comments</comments>
		<pubDate>Thu, 28 Mar 2013 16:52:07 +0000</pubDate>
		<dc:creator>Dr. Raymond Georg Snatzke</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Mathematicians view]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=17937</guid>
		<description><![CDATA[Bei der codecentric AG setzen wir schon immer bevorzugt auf Open-Source-Werkzeuge und –Lösungen. Folgerichtig ist für mich als Java-Performance-Spezialist JMeter von Apache das Lasttest-Werkzeug der Wahl. Eine kurze Bemerkung zu Beginn: Dieser Blog-Artikel ist kein umfassender Überblick über JMeter, seine &#8230; <a href="http://blog.codecentric.de/2013/03/aus-dem-blickwinkel-eines-mathematikers-jmeter-geliebtes-dreckstool/">weiterlesen  <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Bei der codecentric AG setzen wir schon immer bevorzugt auf Open-Source-Werkzeuge und –Lösungen. Folgerichtig ist für mich als Java-Performance-Spezialist JMeter von Apache das Lasttest-Werkzeug der Wahl.</p>
<p>Eine kurze Bemerkung zu Beginn: Dieser Blog-Artikel ist kein umfassender Überblick über JMeter, seine Möglichkeiten und Beschränkungen, sondern stattdessen ein sehr persönlicher Blick auf dieses Werkzeug. Man könnte auch sagen: eine längst überfällige Abrechnung.<br />
<span id="more-17937"></span><br />
Nach einigen Jahren, in denen ich im Wesentlichen in den Bereichen Performance-Optimierung und –Monitoring beschäftigt war, arbeitete ich im letzten Projekt wieder mit JMeter. Während ich früher hauptsächlich den HTTP-Sampler von JMeter benutzt habe, war diesmal der JUnit-Sampler das wichtigste Interface zur Last-Erzeugung.</p>
<p>Mit JMeter Lasttests zu schreiben und durchzuführen ist eigentlich ganz einfach. Im bereits erwähnten Projekt sollten die reichlich vorhandenen funktionalen JUnit-Tests zur Lasterzeugung genutzt werden. Dazu müssen diese Tests lediglich JMeter in Form einer jar-Datei zur Verfügung gestellt werden. Im JUnit-Sampler von JMeter werden anschließend die gewünschte Test-Klasse und die darin enthaltene, auszuführende Test-Methode ausgewählt. Als Klammer um einen oder mehrere JUnit-Sampler fungiert bei JMeter eine sog. Thread-Gruppe, in der die Last (die Anzahl der parallelen Threads) eingestellt wird und die Dauer des Tests. Im Großen und Ganzen war’s das, der Lasttest (oder „Testplan“ im JMeter-Jargon) ist definiert. Man muss nur noch auf den Start-Knopf drücken und der Test wird ausgeführt. Wer weitere Details wünscht, findet diese im in leicht verständlicher Form. Man würde sich etwas mehr explizite Beispiele wünschen, insb. zum Thema Regex, aber insgesamt gesehen handelt es sich um eine exzellente Doku.</p>
<p>Irgendwie ist es mir gelungen, das Gefühl zu verdrängen, das sich bei der Arbeit mit JMeter typischerweise einstellt. Allerdings hat JMeter dieses Gefühl sehr, sehr schnell wieder zurückgebracht. Ich hatte vergessen, dass JMeter – wie jeder von seiner Tagesform abhängige andere Mensch auch – sich richtig launisch aufführen kann, manchmal sogar zickig.</p>
<p>Beispiele gefällig?</p>
<ul>
<li>Die Fehlermeldungen des JUnit-Samplers sind recht aussagekräftig – normalerweise. Aber man hüte sich vor auch nur den geringsten Abweichungen zu dem, was JMeter von den Konstruktoren der JUnit-Test-Klasse erwartet. Man kriegt ein knappes „failed to create an instance of the class” an den Kopf geworfen und wird ansonsten von JMeter in seinem Elend alleine gelassen. Auch Google hilft einem in diesem Fall nicht weiter. Vielleicht helfen ja unsere Erfahrungen: JMeter scheint sowohl den Standard-Konstruktor als auch den Konstruktor mit einem einzelnen String-Parameter zu erwarten. Und falls in den Konstruktoren bereits irgendwelche Libraries zum Einsatz kommen (z.B. log4j), benötigt JMeter auch diese.</li>
<li>Völlig rätselhaft war mir das Verhalten des „Regular Expression Extractor“-Controllers, mit dem man Variablen mittels Regex aus dem Ergebnis des letzten Samplers definieren kann. Der Inhalt dieser Variablen war flüchtig wie eine Seifenblase. Im direkt folgenden Sampler konnte man ihn noch verwenden, danach war er wie vom Winde verweht. Es ist mir nicht gelungen, den Variableninhalt in andere Variablen oder Strukturen zu transferieren und auch kein anderer der vielen denkbaren Workarounds funktionierte.</li>
<li>Besondere Spannung kommt auf, wenn ein JMeter-Testplan mehrere JUnit-Sampler enthält. Manchmal ändert JMeter die Test-Klassen und Test-Methoden aller Sampler auf die entsprechende Klasse und Methode des aktuellen Samplers ab. Bisher habe ich den Auslöser für diesen Bug noch nicht gefunden.</li>
</ul>
<p>Nette Features wie diese helfen dabei, die Aufmerksamkeit bei der Arbeit mit JMeter hoch zu halten. Anders ausgedrückt: Ich entwickelte eine handfeste Paranoia gegenüber JMeter, da ich nie sicher war, dass es wirklich das tut, was es soll. Außerdem hat dieses Verhalten den Effekt, den Fehler immer zuerst bei JMeter zu suchen, sobald irgendwo etwas schief geht.</p>
<p>Einige andere Dinge sind lediglich unpraktisch, z.B. die Verzeichnis-Pfade. JMeter liest und schreibt viele Dateien: Testpläne, Testparameter, Ergebnis-Dateien. Die Default-Verzeichnisse für diese Dateien sind aber unterschiedlich: Manchmal ist es das Verzeichnis, in dem der Testplan liegt; ein anderes Mal das JMeter-bin-Verzeichnis. Eine Logik habe ich dabei noch nicht entdeckt.</p>
<p>Führt man Tests über die JMeter-GUI durch und nicht über die Kommandozeile oder ein Skript, so spürt man schnell das dringende Verlangen, nach jedem Testlauf die GUI durchzustarten. Oftmals kann man nur dadurch sicherstellen, dass nicht irgendwelche Artefakte des letzten Tests noch in JMeter aktiv sind. Außerdem ist dies notwendig, um eine frische JVM zu kreieren, wenn &#8211; wie z.B. in einem typischen JUnit-Test-Szenario &#8211; alles in einer einzelnen JMeter-JVM läuft: JMeter, die JUnit-Test-Klassen und manchmal sogar auch noch das zu testende Java-System selbst.</p>
<p>So weit, so schlecht. JMeter ist also ein Dreckstool. Warum liebe ich es dennoch? Nun – JMeter hat praktisch keine Abhängigkeiten, ist schnell installiert, Open Source und kostenlos. Und zu all dem bietet es eine erstaunliche Flexibilität. Am häufigsten findet wahrscheinlich der HTTP-Sampler Verwendung, da er die ideale Schnittstelle ist, um Web-Anwendungen aus Anwendersicht zu testen. Andere Sampler, wie z.B. der hier beschriebene JUnit-Sampler, setzen auf einer tieferen, technischen Ebene an. Zur Zeit bietet JMeter ca. 20 verschiedene Sampler, die auf vielen unterschiedlichen Protokollen operieren.</p>
<p>Eine weitere nützliche Zugabe ist das sogenannte Performance-Plugin für Jenkins, das de facto ein JMeter-Plugin ist. Bei codecentric möchten wir so viel automatisieren wie nur irgend möglich und mit dem Performance-Plugin gelingt dies sogar mit JMeter-Performance-Tests.</p>
<p>Und wem das noch nicht reicht, der kann direkt den JMeter-Testplan hacken (der nur eine XML-Datei ist) – aber auch dabei muss man sich vor den Launen JMeters hüten, da nicht alle Modifikationen funktionieren, die logisch betrachtet möglich sein sollten – oder auch seinen eigenen Zusatz-Code schreiben.</p>
<p>JMeter erinnert mich an den Spruch eines alten Freundes, der mir über sein erstes Auto – einen kleinen Franzosen – Folgendes erzählt hat: „Ich wollte immer ein Auto mit Charakter. Und dieses Auto hat einen Charakter: Einen miesen zwar, aber es hat Charakter.“ Er liebte sein Auto.</p>
<p>Insgesamt gesehen: Werde ich JMeter wieder benutzen? Ganz gewiss. JMeter hilft einem, den Job zu erledigen, trainiert die Stressresistenz und nicht zu vergessen: Man lernt Demut.
<div class="dzone_button" style="float: right;     margin-top: 30px">
<iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&#038;url=http%3A%2F%2Fblog.codecentric.de%2Fen%2F2013%2F03%2Ffrom-a-mathematicians-point-of-view-jmeter-beloved-crap-tool%2F&#038;title=From+a+Mathematician%E2%80%99s+Point+of+View%3A+JMeter+%E2%80%93+Beloved+Crap+Tool" height="25" width="155" scrolling="no" frameborder="0"></iframe>
</div>
<img src="http://feeds.feedburner.com/~r/codecentric/~4/ub9oPt4TFeE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2013/03/aus-dem-blickwinkel-eines-mathematikers-jmeter-geliebtes-dreckstool/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.codecentric.de/2013/03/aus-dem-blickwinkel-eines-mathematikers-jmeter-geliebtes-dreckstool/</feedburner:origLink></item>
		<item>
		<title>Dokumentenklassifizierung mit Kofax Transformation Modules (KTM)</title>
		<link>http://feedproxy.google.com/~r/codecentric/~3/wyp6rH1kZ60/</link>
		<comments>http://blog.codecentric.de/2013/03/dokumentenklassifizierung-mit-kofax-transformation-modules-ktm/#comments</comments>
		<pubDate>Fri, 22 Mar 2013 07:00:56 +0000</pubDate>
		<dc:creator>Jürgen Voss</dc:creator>
				<category><![CDATA[ECM]]></category>
		<category><![CDATA[Erfassung]]></category>
		<category><![CDATA[Freiformerkennung]]></category>
		<category><![CDATA[Kofax Capture]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=17653</guid>
		<description><![CDATA[Viele unserer Kunden setzen Systeme zur automatischen Dokumentenklassifikation und Datenextraktion ein. Eines dieser Systeme ist das Kofax Produkt &#8216;Kofax Transformation Modules&#8217; (KTM). Diese Dokumenten-Erkennungssysteme ermitteln die Metadaten aus elektronischen Bildern (die gescannten Seiten der zu verarbeitenden Dokumente, Faxe oder eMails) &#8230; <a href="http://blog.codecentric.de/2013/03/dokumentenklassifizierung-mit-kofax-transformation-modules-ktm/">weiterlesen  <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Viele unserer Kunden setzen Systeme zur automatischen Dokumentenklassifikation und Datenextraktion ein. Eines dieser Systeme ist das Kofax Produkt &#8216;Kofax Transformation Modules&#8217; (KTM). Diese Dokumenten-Erkennungssysteme ermitteln die Metadaten aus elektronischen Bildern (die gescannten Seiten der zu verarbeitenden Dokumente, Faxe oder eMails) und übergeben die Daten an ein nachgelagertes System (z.B. an eine Postkorbanwendung).</p>
<p>In diesem Artikel in der Reihe der KTM-Blogs möchte ich die verschiedenen Möglichkeiten erläutern, die KTM zur Klassifizierung von Dokumenten bietet.</p>
<p>Die bisher erschienenen  KTM-Artikel über Formatlokatoren finden Sie hier:</p>
<p><a title="Kofax Transformation Modules – Formatlokatoren und dynamische reguläre Ausdrücke" href="http://blog.codecentric.de/2013/01/kofax-transformation-modules-formatlokatoren-und-dynamische-regulare-ausdrucke/">Kofax Transformation Modules – Formatlokatoren und dynamische reguläre Ausdrücke &#8211; Teil 1</a><br />
<a title="Kofax Transformation Modules – Formatlokatoren und dynamische reguläre Ausdrücke – Teil 2" href="http://blog.codecentric.de/2013/02/kofax-transformation-modules-formatlokatoren-und-dynamische-regulare-ausdrucke-teil-2/">Kofax Transformation Modules – Formatlokatoren und dynamische reguläre Ausdrücke &#8211; Teil 2</a></p>
<p>&nbsp;</p>
<p>Bevor Daten aus einem Dokument extrahiert werden können, muss ein System zunächst wissen, um welche Art Dokument es sich handelt. Aus einer Rechnung müssen beispielsweise andere Daten extrahiert werden, als aus einem Versicherungsvertrag. Bei der Rechnung will man typischerweise die Rechnungsnummer, das Rechnungsdatum, den Lieferanten und die Beträge extrahieren, wohingegen bei dem Versicherungsdokument die Werte Versicherungsnummer und Versicherungssparte von Interesse sind.</p>
<p><span id="more-17653"></span>Vor der eigentlichen Extraktion muss also zunächst bestimmt werden, welche Art von Dokument vorliegt. Dies wird bei KTM durch die vor der Extraktion stattfindende Klassifikation durchgeführt. Sobald ein Dokument klassifiziert wurde, können dann die passenden Metadaten extrahiert werden.</p>
<p>Die Klassifikation eines Dokuments kann durch KTM mit verschiedenen Methoden durchgeführt werden, die sich in der Komplexität und im Aufwand für die Dokumentenvorbereitung unterscheiden:</p>
<p>&nbsp;</p>
<p><b>1. Layoutklassifikation</b></p>
<p>Bei dieser Klassifikationsart versucht das System die Art des Dokuments anhand des grafischen Aufbaus zu bestimmen. Dieses Vorgehen ist die schnellste Art der Klassifizierung, da hierzu keinerlei OCR-Erkennung notwendig ist, da zur Klassifikation ja nicht der Dokumenteninhalt herangezogen wird. Allerdings ist diese Art der Klassifikation nur in Dokumentenbereichen nutzbar, in denen sich die Belege optisch klar voneinander trennen lassen. Beispiel wären bestimmte Antragsarten, die sich durch ihr Design (Aufbau, Firmenlogo, …) abgrenzen lassen. Ungeeignet sind hier beispielsweise zum Teil Formulare im Finanzdienstleistungs- oder Versicherungsbereich, da diese sich optisch häufig sehr ähneln.</p>
<p>Natürlich muss man KTM die Layoutklassifikation für die Dokumentenarten eines Kunden antrainieren. KTM hält den manuellen Aufwand hierzu aber sehr gering. Im Vorfeld müssen für die in Frage kommenden Dokumentarten jeweils einige Beispieldokumente zusammengetragen werden. Anschließend zeigt man KTM noch, welche Beispiele für welche Dokumentenklasse stehen. KTM lernt dann selbstständig die kennzeichnenden Strukturen der Layouts der einzelnen Dokumentarten. Das Antrainieren der Beispieldokumente kann einfach über die grafische Oberfläche des KTM Project Builders durchgeführt werden.</p>
<p>&nbsp;</p>
<p><b>2. Inhaltsklassifikation</b></p>
<p>Die (automatische) Inhaltsklassifikation ähnelt vom Vorgehen her der Layoutklassifikation, mit dem Unterschied, dass hier nicht die optische Struktur, sondern der tatsächliche Dokumenteninhalt zur Klassifizierung herangezogen wird. Dazu muss natürlich vorher ein OCR-Lesen der Dokumente erfolgen.</p>
<p>Das charmante daran ist, dass der Entwickler keinerlei Vorgaben zur Bedeutung des Inhalts machen muss. Ähnlich wie bei der Layoutklassifikation muss auch hier für jede Dokumentart ein Stapel an Beispieldokumenten zusammengetragen werden. Nach erfolgter OCR-Lesung der Beispieldokumente zeigt man KTM auch hier wieder, welcher Beispielstapel für welche Dokumentart steht. Anschließend lernt KTM dann selbstständig welche Worte, Phrasen oder Wortkombinationen charakteristisch für eine Dokumentart sind. Das Antrainieren der Beispieldokumente geschieht auch hier einfach über die grafische Oberfläche des KTM Project Builders.</p>
<p>&nbsp;</p>
<p><b>3. Instruktionsklassifikation</b></p>
<p>Bei der Layout- und Inhaltsklassifikation müssen dem KTM-System &#8216;nur&#8217; genug Beispielbelege zur Verfügung gestellt werden. Die eigentliche Arbeit des Lernens und Bewertens wird dann von KTM durchgeführt. Bei der Instruktionsklassifikation muss hingegen der Entwickler die Dokumente inhaltlich kennen und bewerten können. Je Dokumentart kann der Entwickler manuell Worte, Phrasen und Wortkombinationen hinterlegen, die eine Dokumentart kennzeichnen. Hier ist also fachspezifisches Wissen über das Beleggut notwendig.</p>
<p>Die Instruktionsklassifikation wird häufig bei Beleggut eingesetzt, das zum großen Teil aus Korrespondenz besteht. Kommen beispielsweise die Worte &#8216;Mahngebühr&#8217; und &#8216;Mahnung&#8217; beide auf einem Dokument vor, kann man das Dokument darüber in die Dokumentart &#8216;Mahnverfahren&#8217; klassifizieren.</p>
<p>Damit die Instruktionsklassifikation genutzt werden kann, muss vorher eine OCR-Lesung des Belegguts erfolgt sein. Die Eingabe der Instruktionen (Worte, Phrasen, Wortkombinationen) erfolgt über die grafische Oberfläche des KTM Project Builders.</p>
<p>&nbsp;</p>
<p><b>4. Skript-Klassifikation</b></p>
<p><b>4.1 Barcode</b></p>
<p>In manchen Anwendungsfällen kann ein auf den Dokumenten aufgebrachter Barcode ausreichend für die Klassifizierung des Dokuments sein. KTM bietet auch diese Möglichkeit, man muss dazu aber die KTM-eigene Skriptsprache benutzen.</p>
<p>Ausgangspunkt ist ein auf Projektebene definierter Barcode-Lokator (BCode), der die Dokumentenbarcodes erkennt. Ein Stückchen Skript auf der Projektebene hilft das Dokument auf die gewünschte Dokumentart zu klassifizieren:</p>
<div class="wp_syntax">
<table width="574">
<tbody>
<tr>
<td class="code">
<pre style="font-family: monospace;" lang="vb">' Class script: Project
Private Sub Document_BeforeClassifyXDoc(pXDoc As CASCADELib.CscXDocument, bSkip As Boolean)
  If pXDoc.Locators.ItemByName("BCode").Alternatives.Count&gt;0 Then
     If pXDoc.Locators.ItemByName("BCode").Alternatives(0).Confidence &gt; 0.95 Then
       pXDoc.Reclassify "Barcodeantrag"
       Exit Sub 'möglichst nur ein reclassify
     End If
  End If
End Sub</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>Das Skript wird im Event <em>Document_BeforeClassifyXDoc</em> aufgerufen, welches vor allen anderen Klassifizierungsmechanismen von KTM ausgeführt wird.</p>
<p>Zunächst wird überprüft, ob der Barcode-Lokator überhaupt etwas gefunden hat, und ob die Konfidenz über 95% lag. Falls ja erfolgt über den reclassify-Befehl die Klassifizierung auf die Dokumentart &#8216;Barcodeantrag&#8217;. Nach erfolgter Klassifizierung wird die Routine verlassen, damit keine weitere Klassifizierung durch ein folgendes Stück Skript erfolgen kann. Ein mehrfaches reclassify ist zwar inzwischen mit KTM möglich, sollte aber nur mit Vorsicht eingesetzt werden, da man damit leicht Endlosschleifen hervorrufen kann.</p>
<p><b><br />
4.2 Formatlokatoren, Erweiterte Zonenlokatoren und der ganze Rest&#8230;<br />
</b></p>
<p>Das in 4.1 anhand eines Barcodelokators beschriebene Prinzip der Skriptklassifizierung kann natürlich auch mit beliebigen anderen Lokatoren durchgeführt werden. Wichtig ist, dass der entsprechenden Lokator auf Projektebene definiert wird, da er sonst im Event <em>Document_BeforeClassifyXDoc</em> nicht ausgewertet werden kann, und er muss natürlich die Dokumentart eindeutig kennzeichnen. Der primäre Zweck dieser &#8216;Projektlokatoren&#8217; ist also nicht die Datenextraktion sondern sie dienen als Hilfsmittel zur Klassifikation.</p>
<p>Mit einem auf Projektebene definierten Formatlokator kann man beispielsweise den Typ eines Versicherungsantrags feststellen und dann das Dokument entsprechend klassifizieren. Das folgende Bild zeigt  einen Ausschnitt eines Haftpflichtversicherungsantrags:</p>
<p><a href="http://blog.codecentric.de/files/2013/03/Haftpflicht.png"><img class="alignnone size-full wp-image-17688" alt="Haftpflicht" src="http://blog.codecentric.de/files/2013/03/Haftpflicht.png" width="304" height="147" /></a></p>
<p>Mit einem Formatlokator (Antrag_Haft), der beispielsweise das Wort <strong>Haftpflichtversicherung</strong> oberhalb des Wortes <strong>Antrag</strong> in einer Region in der linken oberen Ecke des Dokuments sucht, kann der Antragstyp eindeutig bestimt werden.</p>
<p>Das passende Stück Skript sieht dann so aus (enstprechend dem Barcodebeispiel):</p>
<div class="wp_syntax">
<table width="574">
<tbody>
<tr>
<td class="code">
<pre style="font-family: monospace;" lang="vb">' Class script: Project
Private Sub Document_BeforeClassifyXDoc(pXDoc As CASCADELib.CscXDocument, bSkip As Boolean)
  If pXDoc.Locators.ItemByName("Antrag_Haft").Alternatives.Count&gt;0 Then
     If pXDoc.Locators.ItemByName("Antrag_Haft").Alternatives(0).Confidence &gt; 0.95 Then
       pXDoc.Reclassify "Antrag_Haftpflicht"
       Exit Sub 'möglichst nur ein reclassify
     End If
  End If
End Sub</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>Nutzt man einen &#8216;Erweiterten Zonenlokator&#8217; (Antrag_Haft_EZL) für die Klassifizierung muss man das Skript nur leicht an die Unterfelder des Zonenlokators anpassen:</p>
<div class="wp_syntax">
<table width="574">
<tbody>
<tr>
<td class="code">
<pre style="font-family: monospace;" lang="vb">' Class script: Project
Private Sub Document_BeforeClassifyXDoc(pXDoc As CASCADELib.CscXDocument, bSkip As Boolean)
  If pXDoc.Locators.ItemByName("Antrag_Haft_EZL").Alternatives.Count&gt;0 Then
     If pXDoc.Locators.ItemByName("Antrag_Haft_EZL").Alternatives(0).SubFields.ItemByName("UF_Zone0").Confidence &gt; 0.95 Then
       pXDoc.Reclassify "Antrag_Haftpflicht"
       Exit Sub 'möglichst nur ein reclassify
     End If
  End If
End Sub</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>Hat man das Prinzip der Skriptklassifizierung einmal verstanden, sind der Fantasie eigentlich keine Grenzen gesetzt. So könnte man beispielsweise über einen Datenbanklokator den Absender der Eingangsdokumente bestimmen (falls eine entsprechende Stammdatendatei vorliegt) und die Dokumente dann in vordefinierte Gruppen klassifizieren.</p>
<p>Oft haben Formulare eine eindeutige Formularnummer um 90° gedreht in der unteren linken Ecke aufgedruckt. Mit einem &#8216;Erweiterten Zonenlokator&#8217; kann diese um 90° gedrehte Nummer ausgelesen und zur Dokumentenklassifikation genutzt werden.</p>
<p>Ich hoffe Ihnen durch diesen Artikel einige Anregungen für die Arbeit mit Kofax Transformation Modules gegeben zu haben und wünsche viel Spaß beim Experimentieren <img src='http://blog.codecentric.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<p>Noch ein Hinweis für die Entwickler unter den Lesern: mein Kollege Frank Engelen aus dem codecentric Unternehmensbereich <a title="Agile Software Factory" href="http://www.codecentric.de/portfolio/agile-software-factory/" target="_blank">Agile Software Factory</a> hat aktuell einen sehr interessanten Artikel über Daten- / Dokumentklassifizierung unter Nutzung des Tools &#8216;RapidMiner&#8217; verfasst. Mit &#8216;etwas&#8217; Java KnowHow können Sie Ihre eigenen Klassifizierungsmechanismen entwickeln!</p>
<p>Hier der Link zum Artikel: <a href="http://blog.codecentric.de/en/2013/03/java-based-machine-learning-by-classification/">Taking a look at Java-based Machine Learning by Classification</a></p>
<p>&nbsp;</p>
<p>&nbsp;
<div class="dzone_button" style="float: right;     margin-top: 30px">
<iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&#038;url=http%3A%2F%2Fblog.codecentric.de%2Fen%2F2013%2F03%2F17710%2F&#038;title=Document+classification+with+Kofax+Transformation+Modules+%28KTM%29" height="25" width="155" scrolling="no" frameborder="0"></iframe>
</div>
<img src="http://feeds.feedburner.com/~r/codecentric/~4/wyp6rH1kZ60" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2013/03/dokumentenklassifizierung-mit-kofax-transformation-modules-ktm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.codecentric.de/2013/03/dokumentenklassifizierung-mit-kofax-transformation-modules-ktm/</feedburner:origLink></item>
	</channel>
</rss><!-- This Quick Cache file was built for ( 80 blog.codecentric.de/feed/ ) in 0.54466 seconds, on May 16th, 2013 at 12:36 pm UTC. --><!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on May 16th, 2013 at 1:36 pm UTC --><!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --><!-- Quick Cache Is Fully Functional :-) ... A Quick Cache file was just served for ( 80 blog.codecentric.de/feed/ ) in 0.00035 seconds, on May 16th, 2013 at 1:31 pm UTC. -->
