<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Blogisticon</title>
	<atom:link href="http://blog.holisticon.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.holisticon.de</link>
	<description>Das Holisticon-Blog</description>
	<lastBuildDate>Fri, 18 May 2012 08:23:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Freundliche Eindringlinge auf dem Entwicklertag 2012</title>
		<link>http://blog.holisticon.de/2012/05/freundliche-eindringlinge-auf-dem-entwicklertag-2012/</link>
		<comments>http://blog.holisticon.de/2012/05/freundliche-eindringlinge-auf-dem-entwicklertag-2012/#comments</comments>
		<pubDate>Fri, 18 May 2012 08:23:19 +0000</pubDate>
		<dc:creator>Norman Erck</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Publikation]]></category>
		<category><![CDATA[Rundumsichtig]]></category>
		<category><![CDATA[#etka12]]></category>
		<category><![CDATA[Aktoren]]></category>
		<category><![CDATA[CDI]]></category>
		<category><![CDATA[Mobile]]></category>

		<guid isPermaLink="false">http://blog.holisticon.de/?p=5523</guid>
		<description><![CDATA[Dieses Jahr wurde ich zum Karlsruher Entwicklertag auf dem Conference Day eingeladen, um den Teilnehmern mit dem Vortrag &#8220;Freundliche Eindringlinge &#8211; Moderne Web-Applikationen mit CDI&#8221; eine Einführung in die Context und Dependency Injection im Java-Standard zu geben. Ich habe natürlich nicht nur meinem Vortrag gehalten, sondern mir auch Vorträge von anderen angehört. Begrüßung In der [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.holisticon.de/wp-content/uploads/2012/05/ET-schatten_0.png"><img src="http://blog.holisticon.de/wp-content/uploads/2012/05/ET-schatten_0.png" alt="Entwicklertag Logo" width="145" height="43" class="alignleft size-full wp-image-5546 colorbox-5523" /></a>Dieses Jahr wurde ich zum <a href="http://entwicklertag.de/" title="Entwicklertag 2012">Karlsruher Entwicklertag</a> auf dem Conference Day eingeladen, um den Teilnehmern mit dem Vortrag &#8220;Freundliche Eindringlinge &#8211; Moderne Web-Applikationen mit CDI&#8221; eine Einführung in die Context und Dependency Injection im Java-Standard zu geben. Ich habe natürlich nicht nur meinem Vortrag gehalten, sondern mir auch Vorträge von anderen angehört.<span id="more-5523"></span></p>
<h3>Begrüßung</h3>
<p>In der Begrüßung vermittelte <a href="http://ka.stadtwiki.net/Margret_Mergen">Margret Mergen</a> (Bürgermeisterin der Stadt Karlsruhe) viele interessante Fakten zu Karlsruhe. Sie bezeichnete die Stadt als das &#8220;Silicon Valley Deutschlands&#8221; und nahm damit Bezug auf die räumliche Nähe der über 3.000 IT Firmen mit über 25.000 ITlern. Ebenfalls interessant war die Tatsache, dass jede vierte Informatiker aus Karlsruhe kommt.  </p>
<h3>Freundliche Eindringlinge &#8211; Moderne Web-Applikationen mit CDI</h3>
<p>Wie den Teilnehmern des Entwicklertages versprochen, möchte ich an dieser Stelle die Tonspur und die Beispielapplikation zur Verfügung stellen. Da ich bereits darüber gebloggt habe, veröffentliche ich hier nur den Link zu meinem Beitrag <a href="http://blog.holisticon.de/2012/01/freundliche-eindringlinge-moderne-web-applikationen-mit-cdi/">Freundliche Eindringlinge &#8211; Moderne Web-Applikationen mit CDI</a>.</p>
<p>Zum Vortrag kann ich nur sagen, dass es Spaß gemacht hat, ihn in den schönen Räumen der <a href="http://www.karlsruhe.ihk.de/">IHK Karlsruhe</a> halten zu dürfen und dass ich auch das Glück einer aktiven Zuhörerschaft mit spannenden Fragen hatte.</p>
<p><a href="http://entwicklertag.de/conference-day/freundliche-eindringlinge-moderne-web-applikationen-mit-cdi" title="Infos &amp; Folien Entwicklertag 2012">Freundliche Eindringinge @ Entwicklertag 2012</a></p>
<h3>Rechtliche Aspekte zu Cloud Computing</h3>
<p>Prof. Dr. Rupert Vogel, Tobias Haar und Dr. Oliver Meyer-van Raay beleuchteten die rechtlichen Aspekte zum Thema Cloud. Nach der Definition des <a href="https://www.bsi.bund.de/DE/Themen/CloudComputing/CloudComputing_node.html" title="BSI: Cloud Computing">Cloud-Begriffs</a>, den Ausprägungen (<a href="http://de.wikipedia.org/wiki/IaaS#Infrastructure_as_a_Service_.28IaaS.29" title="IaaS">IaaS</a>, <a href="http://de.wikipedia.org/wiki/Platform_as_a_Service" title="PaaS">PaaS</a>, <a href="http://de.wikipedia.org/wiki/IaaS#Software_as_a_Service_.28SaaS.29" title="SaaS">SaaS</a>) und der Erkenntnis, dass es sich beim Thema Cloud Computing nicht um einen Rechtsbegriff handelt, wurden alle relevanten Rechtsbereiche erörtert.</p>
<h4>IT-Recht</h4>
<p>Sofern es sich um eine B2B-Beziehung handelt, kann die Rechtswahl selbst übernommen werden, d.h., ich kann mir ein Land aussuchen, gemäß dessen Rechtsprechung ich agieren möchte. Als Tipp wurde genannt, dass immer der Kunde auf Rechtswahl drängen sollte.</p>
<p>Handelt es sich jedoch um eine B2C-Beziehung, muss nach Recht des Verbrauchers verfahren werden, also nach dem Recht, das am günstigsten für den Verbraucher ist. Hier spielt in der Regel das Land, in dem der Verbraucher firmiert, eine Rolle. Ebenfalls interessant dazu ist, dass im Zweifelsfall das Recht des Landes, in dem der Schaden eintritt, gilt.<br />
Zum Thema Vertragsgestaltung wurde erwähnt, dass es sich um Mietverträge nach deutschem Recht handelt, sodass der Vermieter für die Leistung verantwortlich ist. Um auf der sicheren Seite zu sein, müssen Service Level Agreements vereinbart werden. Spannend ist auch das Thema &#8220;Exit Management&#8221;. Wir wird mit Daten verfahren?</p>
<p>Zur Vertragsgestaltung wurde der Tipp gegeben, den Vetrag immer so zu gestalten, dass ein 60jähriger Richter diesen auch verstehen kann. Also nicht &#8220;Leistung 98% verfügbar&#8221;, sondern lieber alles detailliert beschreiben. Was ist denn beispielsweise &#8220;die Leistung&#8221;? Und was heißt &#8220;verfügbar&#8221;?</p>
<p>Ein Blick in das Amazon Web Services Customer Agreement zeigte, dass Amazon den Service einfach mal abschalten kann&#8230;</p>
<h4>Urheberrecht</h4>
<p>Beim Urheberrecht sind in der Regel drei Parteien betroffen. Der Kunde, der Cloud-Anbieter und das Software-Haus. Aufgepasst werden muss vor allem im Bereich des Software-Hauses. Wurde eine Lizenz für die Cloud erworben? Wie sieht es mit der Handhabung von Vervielfältigungen aus? Ist es nicht eine Vermietung, wenn ich die Software in der Cloud zur Verfügung stelle? All dies muss zwischen den Parteien vereinbart werden.</p>
<p>Wie steht es um Software, die ein Angestellter oder ein Freelancer für ein Unternehmen entwickelt hat? Kann diese einfach in die Cloud gehen? Beim Angestellten ist das recht einfach, hier hat der Arbeitgeber Verwertungsrechte. Bei Freelancern ist das ein wenig schwieriger, weil hier unter Umständen eine neue Nutzungsart hinzukommt.</p>
<h4>Datenschutz/-sicherheit</h4>
<p>Hier gilt das Territorialitätsprinzip, also die Rechtsprechung des Landes in dem die Daten verarbeitet werden. Problematisch wird das Ganze natürlich nur bei personenbezogenen Daten. Hier muss eine Anonymisierung stattfinden und optimalerweise auch noch eine Verschlüsselung, damit die Cloud-Anbieter diese Daten nicht im Zugriff haben. Spannend wird es auch beim Thema der Auftragsdatenverarbeitung: hier sollte man sich einen geeigneten Anbieter á la Microsoft oder Salesforce, die den Richtlinien der EU entsprechen, suchen.</p>
<p>Mehr dazu kann in den Vortragsfolien auf der <a href="http://entwicklertag.de/vortraege/rechtliche-aspekte-zu-cloud-computing" title="Rechtliche Aspekte zu Cloud Computing">Webseite des Entwicklertages 2012</a> nachgelesen werden.</p>
<p>In der Fragerunde zum Vortrag wurde noch erwähnt, dass man im rechtlichen Sinne nicht vom Besitz von Daten sprechen kann, sondern nur vom Zugriff.</p>
<p><a href="http://entwicklertag.de/vortraege/rechtliche-aspekte-zu-cloud-computing" title="Rechtliche Aspekte zu Cloud Computing">Rechtliche Aspekte zu Cloud Computing @ Entwicklertag 2012</a></p>
<h3>Software Engineering von Mobile Apps</h3>
<p>Stefan Hellfeld zeigte sehr schön die Entwicklung der mobilen Endgeräte an seiner eigenen Handy-Historie auf. Danach machte er darauf aufmerksam, wer eigentlich aktuell die Software für mobile Endgeräte verkauft: Betriebssystem- und Gerätehersteller. Auch erfunden hat das Ganze nicht Apple mit dem App Store, sondern Nokia mit Symbian schon einige Jahre zuvor.</p>
<h4>Was?</h4>
<p>Was ist das größte Problem, wenn man eine Software in den App Store bringt? Die Konkurrenz! Wie kann man sich, abgesehen vom Preis, von seinen Konkurrenten absetzen? Durch Innovation! Wie diese Innovation vorangeschritten ist, zeigt die Gegenüberstellung einiger Features des Smartphones (GSM, GPRS, Kamera, Bewegungssender) gegenüber verschiedenen Features von Software (Virtuelle Realität, Wecker, Aufzeichnung, MP3-Player). Hier steht es 9:26 für die Software. Herr Hellfeld legte nahe, sich als Entwickler von Mobilen Apps als Integrator zu sehen und so mehrere Hardwarekomponenten für die Lösung eines Problems zu verknüpfen.</p>
<h4>Wie?</h4>
<p>Da wir jetzt wussten, <em>was</em> wir zu programmieren hatten, stellte sich natürlich die Frage nach dem <em>Wie</em>. Hier verglich Herr Hellfeld die mobile Entwicklung für iOS mit der klassischen Software-Entwicklung. Bei letzterer wurden in der Regel Lizenzen für IDEs gekauft und fertig war man, was die Ausgaben im Entwicklungsprozess anging. In der mobilen Entwicklung ist die IDE zwar kostenlos (sofern man einen Mac hat), aber man braucht Lizenzen für die Entwickler, muss auf externen Geräten testen und die Software dann auch noch im App Store zur Abnahme einreichen. </p>
<h4>Zukunft iOS, Android, Windows Phone &amp; JavaME</h4>
<p>Es gibt schon jetzt mehr Smartphones als Handys. Android Apps sind im Schnitt teurer als iOS Apps, und JavaME liegt hinsichtlich des Marktanteils noch 15% hinter iOS und Android. Herr Hellfeld ist der Meinung, dass iOS weiter wachsen wird, Android auch &#8211; und zwar stärker &#8211; und Microsoft wird es zukünftig mit den beiden aufnehmen, da es noch keine richtige Office-Integration auf iOS oder Android gibt und es Windows Phone noch an Tablets fehlt.</p>
<h4>Organisation</h4>
<p>Was wird alles benötigt, um starten zu können? Eine Entwicklungsumgebung und ein SDK, ein Team, wobei sich die optimale Anzahl Mitarbeiter seiner Ansicht nach aus der Wurzel der Projektdauer in Personentagen ermittelt. Ferner benötigt man ein gutes Management, bei dem Enwickler 16 LOC (lines of code) pro Tag schaffen, die direkt in der Software verwendet werden, ein Vorgehensmodell und jede Menge Testgeräte. Es gibt zwar Simulatoren, aber diese ersetzen nicht die Tests auf Endgeräten.</p>
<p>Sicherlich neu in der mobilen Entwicklung ist die Rolle des Kunden, da man hier jetzt mit &#8220;Experten&#8221; redet, die genau wissen, wie eine mobile App auszusehen und wie sie sich anzufühlen hat.</p>
<h4>Nativ, WebApp oder Hybrid?</h4>
<p>Die Abgrenzung der unterschiedlichen App-Typen ist ja mittlerweile in aller Munde. Interessant ist jedoch Herr Hellfelds Abgrenzung im Detail. Native Apps sind bei ihm Apps, die nativ programmiert wurden, bei denen sich jedoch auch alle Daten auf dem Smartphone befinden. Hybrid sind bei ihm einerseits die Lösungen, die via Titanium oder PhoneGap auf beliebig viele Plattformen gebracht werden können, als auch Apps, die nativ implementiert wurden, aber ihre Daten aus dem Internet beziehen.</p>
<p>Als Best-Practice-Beispiele nannte er die Apps von Facebook und N-tv, die beide auf eine hybride Lösung setzen. Die UI-Elemente sind nativ implementiert, da sie flüssig sein müssen; die Informationsdarstellung erfolgt in Webviews.</p>
<p>Als gutes Feature von iOS wurde erwähnt, dass man es geschafft habe, auch Apps elegant abstürzen zu lassen, so dass sich der Nutzer selbst hinterfragt, bevor er davon ausgeht, dass die App fehlerhaft ist.</p>
<p>Spannend war auch ein Vergleich der Effizienz der Entwicklung zwischen iOS (Xcode) und Windows Phone (Visual Studio mit Expression Blend). So bräuchte man in Xcode für die Entwicklung einer Taschenlampen-App 80 Sekunden und in Visual Studio nur 32 Sekunden.</p>
<h4>Zukunft der Apps</h4>
<p>Apps sind in der Zukunft agil, sie passen sich an Anwender, Kontext, Gerät und Informationskanal an, sie sind intelligent, denken mit und treffen banale Entscheidungen, und darüber hinaus bilden sie Menschen auf Informationssystemen ab.<br />
<a href="http://entwicklertag.de/conference-day/software-engineering-von-mobile-apps" title="Software Engineering von Mobile Apps">Software Engineering von Mobile Apps @ Entwicklertag 2012</a></p>
<h3>Entspannte Nebenläufigkeit &#8211; Aktoren in Scala und Java</h3>
<p>Andi Scharfstein und Ben Romberg motivierten Aktoren mit dem <a href="http://en.wikipedia.org/wiki/Northeast_blackout_of_2003" title="Wikipedia Northeast blackout">&#8220;Northeast blackout of 2003&#8243;</a>. Als Ursache wurde eine Race Condition identifiziert. Um Race Conditions zu vermeiden, sollen Aktoren eingesetzt werden. Es muss also, getreu dem Aktoren-Paradigma, Datenfluss nur in gekapselten Systemen agiert werden.</p>
<p>Aktoren haben dabei einen eindeutigen Namen (Adresse), ein Verhalten (Code), einen Zustand (Daten) sowie eine Mailbox. Aktoren können Nachrichten verschicken, den eigenen Zustand bzw. ihr Verhalten ändern und neue Aktoren erstellen. In der Theorie laufen Aktoren parallel zueinander; es gibt keine Aussage zum Nachrichtenverhalten, und somit können Nachrichten theoretisch verloren gehen oder auch ihre Reihenfolge verändern.</p>
<p>In einem Bespiel, in dessen Rahmen Spielstände von Mannschaften verändert wurden (ja, es ist ja bald EM), wurde das <a href="http://akka.io/" title="Akka Framework">Akka-Framework</a> vorgestellt.</p>
<p>Für den Einsatz wurde vorgeschlagen, dass über Nachrichten kommuniziert werden soll und Nachrichten nur als immutable Objekte verwendet werden sollen, um Race Conditions zu vermeiden.</p>
<p>Als Fazit machten die Vortragenden Werbung für den Einsatz von Aktoren, da der Einarbeitungsaufwand gering sei, man nur seine Herangehensweise ändern müsse und so sehr performante nebenläufige Applikationen ohne Race Conditions bauen könne.</p>
<p>Mich haben die Jungs überzeugt und ich werde den nächsten passenden Anwendungsfall mal mit Aktoren umsetzen.</p>
<p><a href="http://entwicklertag.de/vortraege/entspannte-nebenl%C3%A4ufigkeit-aktoren-scala-und-java" title="Entspannte Nebenläufigkeit">Entspannte Nebenläufigkeit &#8211; Aktoren in Scala und Java @ Entwicklertag 2012</a></p>
<h3>Subjektorientorierung</h3>
<p>Albert Fleischmann hat ein neues Modell für den Softwareentwicklungsprozess entwickelt. Eingangs rief er den Zuhörern den deutschen Satzbau im Aktiv mit Subjekt, Prädikat und Objekt ins Gedächtnis (Wer macht was womit?) Im Vergleich dazu skizzierte er unterschiedliche Modelle der Softwareentwicklung (Flussdiagramm, ER-Diagramm, UML etc.), die im nicht ausreichenden Maße Subjekt, Prädikat und Objekt beschreiben. Sein Anliegen war es, Anwender für die Subjektorientierung zu motivieren. Als Fallbeispiel stellte er die Steuerung eines ferngesteuerten Vogels vor, die er später in ein Bespiel zu einem Transportunternehmen verwandelte. Spätestens hier hatte er mich leider komplett abgehängt. Als nach 40 Minuten Motivation innerhalb von fünf Minuten das Modell vorgestellt werden sollte, konnte ich leider nicht mehr das Konzept und den Nutzen der Subjektorientierung verstehen. Falls die Folien online gestellt werden, werde ich auf jeden Fall noch mal hineinschauen.</p>
<p><a href="http://entwicklertag.de/vortraege/subjektorientierung" title="Subjektorientierung">Subjektorientierung @ Entwicklertag 2012 </a></p>
<h3>Fazit</h3>
<p>Für mich eine sehr gelungene Veranstaltung &#8211; von der Organisation über die Referenten bis hin zum Veranstaltungsort. Dafür möchte ich mich bei den Veranstaltern und Referenten herzlich bedanken, und vielleicht bin ich ja nächstes Jahr auch wieder dabei.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.holisticon.de/2012/05/freundliche-eindringlinge-auf-dem-entwicklertag-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DSDM Atern, jetzt auch auf Deutsch</title>
		<link>http://blog.holisticon.de/2012/05/dsdm-atern-jetzt-auch-auf-deutsch/</link>
		<comments>http://blog.holisticon.de/2012/05/dsdm-atern-jetzt-auch-auf-deutsch/#comments</comments>
		<pubDate>Wed, 16 May 2012 08:14:24 +0000</pubDate>
		<dc:creator>Carsten Sahling</dc:creator>
				<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Agil]]></category>
		<category><![CDATA[Atern]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://blog.holisticon.de/?p=5450</guid>
		<description><![CDATA[Atern ist ein agiles Framework, das bislang vorwiegend in England verwendet wird. Obwohl es schon seit 1994 existiert und damit eher zu den agilen Oldtimern gehört, hat Atern zumindest in Deutschland praktisch keine Relevanz. Aus meiner Sicht liegt das hauptsächlich an zwei Aspekten: zum einen hat Scrum inzwischen einen Mainstream-Status erreicht, der es anderen agilen [...]]]></description>
			<content:encoded><![CDATA[<p>Atern ist ein agiles Framework, das bislang vorwiegend in England verwendet wird. Obwohl es schon seit 1994 existiert und damit eher zu den agilen Oldtimern gehört, hat Atern zumindest in Deutschland praktisch keine Relevanz. Aus meiner Sicht liegt das hauptsächlich an zwei Aspekten: zum einen hat Scrum inzwischen einen Mainstream-Status erreicht, der es anderen agilen Ansätzen (vielleicht mit Ausnahme von Kanban) erschwert, Fuß zu fassen. Zum anderen wirkt Atern mit seinen 12 Rollen, einem ausgeprägten Phasenkonzept und etlichen Artefakten auf den ersten Blick nicht sehr leichtgewichtig.<span id="more-5450"></span></p>
<p>Das täuscht aber meiner Meinung nach. Alle wichtigen agilen Elemente sind vorhanden: Timeboxing, Daily StandUps, iterativ-inkrementelle Entwicklung, Reviews, viel Kommunikation mit den Stakeholdern und alles, was bei agilen Methoden gut und wichtig ist. Nicht umsonst zählt einer der DSDM-Veteranen Arie van Bennekum zu den 17 Erstunterzeichnern des agilen Manifests. Der agile Kern also ist unumstritten. </p>
<p>Das Rollenmodell und das Phasenkonzept sind einen eigenen Artikel wert, der in Kürze hier erscheinen wird. Nur soviel sei verraten: Rollen können natürlich in Personalunion von einer Person ausgefüllt werden, allerdings muss dies dann eine bewusste Entscheidung sein, die zum jeweiligen Kunden- und Projektkontext passen muss. Atern scheint mir gerade in Konzernen eine tolle agile Alternative, in Umfeldern, in denen es viel Administratives um ein Projekt herum gibt, und wo pure Selbstorganisation und agile Planung hierarchisch organisierte Unternehmen überfordern. Schon deshalb bin ich sicher, dass wir noch viel von DSDM Atern in Deutschland hören werden.</p>
<p>Aber was schreibe ich mir hier einen Wolf: Gut erklärt ist halb gewonnen: unter <a href="http://www.dsdm.org/international/german" title="http://www.dsdm.org/international/german" target="_blank">http://www.dsdm.org/international/german</a> ist ein Interview mit mir zu finden, in dem die Unterschiede zwischen Scrum und Atern erklärt werden. Es wurde aufgenommen anlässlich der ersten DSDM-Zertifizierung auf deutschem Boden, bei uns in der Friedensallee in Hamburg. Zeitgleich erscheint auch meine <a href="http://www.dsdm.org/Ebooks/DSDM_Atern_Taschenbuch/index.html#/10/" title="Übersetzung des DSDM Atern Pocketbook" target="_blank">Übersetzung des DSDM Atern Pocketbook</a>, so dass auch Sprachbarrieren keine Ausrede mehr sind <img src='http://blog.holisticon.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley colorbox-5450' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.holisticon.de/2012/05/dsdm-atern-jetzt-auch-auf-deutsch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac OS X &#8211; Tipps &amp; Tricks für Entwickler: Hidden Files</title>
		<link>http://blog.holisticon.de/2012/05/mac-os-tipps-tricks-fur-entwickler-hidden-files/</link>
		<comments>http://blog.holisticon.de/2012/05/mac-os-tipps-tricks-fur-entwickler-hidden-files/#comments</comments>
		<pubDate>Tue, 15 May 2012 08:24:04 +0000</pubDate>
		<dc:creator>Jo Ehm</dc:creator>
				<category><![CDATA[Rundumsichtig]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[OS X Development Tricks]]></category>
		<category><![CDATA[Show Hidden Files]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Versteckte Dateien anzeigen]]></category>

		<guid isPermaLink="false">http://blog.holisticon.de/?p=5389</guid>
		<description><![CDATA[Die Benutzerfreundlichkeit eines Mac ist unumstritten. Begibt man sich jedoch als Software-Entwickler auf OS X, kommt einem diese Benutzerfreundlichkeit u.U. zunächst ein wenig hinderlich vor, da man einige kleine Details vermisst, die man  z.B. von Windows her kennt (oder dort leicht einstellen kann). So zum Beispiel, dass im Finder per Default keine versteckten Dateien angezeigt [...]]]></description>
			<content:encoded><![CDATA[<p>Die Benutzerfreundlichkeit eines Mac ist unumstritten. Begibt man sich jedoch als Software-Entwickler auf OS X, kommt einem diese Benutzerfreundlichkeit u.U. zunächst ein wenig hinderlich vor, da man einige kleine Details vermisst, die man  z.B. von Windows her kennt (oder dort leicht einstellen kann). So zum Beispiel, dass im Finder per Default keine versteckten Dateien angezeigt werden oder dass man einen Ordner nicht direkt im Terminal öffnen kann. Diese und andere Kleinigkeiten lassen sich aber auch unter OS X recht leicht einrichten oder konfigurieren. Beginnen möchte ich diese Serie von Blog-Beiträgen zu rudimentären Tipps &amp; Tricks für den Entwicklungsalltag heute mit dem Thema versteckte Dateien:<span id="more-5389"></span></p>
<h3>Hidden Files</h3>
<p>Die komfortabelste Lösung, versteckte Dateien in Finder ein- und auszublenden ist, sich jeweils eine einfache Automator-Aktion zu schreiben. Hierzu einfach das Programm <em>Automator</em> starten, als Vorlage &#8220;Dienst&#8221; auswählen und eine neue Aktion &#8220;Shell-Skript ausführen&#8230;&#8221; wie folgt anlegen (click to enlarge):</p>
<p><a href="http://blog.holisticon.de/wp-content/uploads/2012/05/show_hidden_files.png"><img class="wp-image-5392 alignnone colorbox-5389" style="margin-top: 5px; margin-bottom: 15px;" src="http://blog.holisticon.de/wp-content/uploads/2012/05/show_hidden_files.png" alt="" width="643" height="197" /></a></p>
<p>Nun einfach &#8220;Speichern unter&#8230;&#8221;, einen sprechenden Namen vergeben unter dem die Aktion dann als Dienst auftauchen soll (z.B. &#8220;Show Hidden Files&#8221;) und fertig. Nach dem gleichen Verfahren eine zweite Aktion &#8220;Hide Hidden Files&#8221; erstellen, wobei die erste Zeile des Skripts dann entsprechend wie folgt lautet:</p>
<p><tt>defaults write com.apple.finder AppleShowAllFiles FALSE</tt></p>
<p>Gespeichert sind diese Automator-Aktionen unter <tt>~/Library/Services</tt> (nur für den Fall, dass man sie irgendwann mal wieder entfernen möchte). Aufrufen lassen sich diese Dienste jetzt über das Finder-Menü:</p>
<p><a href="http://blog.holisticon.de/wp-content/uploads/2012/05/hidden_files_usage.png"><img class="size-full wp-image-5408 alignnone colorbox-5389" style="margin-top: 5px; margin-bottom: 15px;" src="http://blog.holisticon.de/wp-content/uploads/2012/05/hidden_files_usage.png" alt="" width="580" height="207" /></a></p>
<p>Damit aber nicht genug: richtig komfortabel wird es erst, wenn wir diesen Diensten noch Tastaturkürzel zuweisen. Hierzu einfach wie oben zu sehen auf &#8220;Dienste-Einstellungen&#8230;&#8221; gehen und dort jeweils rechts neben dem gewünschten Dienst einmal doppelklicken (sodass das Eingabefeld erscheint) und dann die gewünschte Tastenkombination drücken &#8211; schon wieder fertig.</p>
<p><a href="http://blog.holisticon.de/wp-content/uploads/2012/05/services-shortcuts.png"><img class="alignnone size-full wp-image-5417 colorbox-5389" style="margin-top: 5px; margin-bottom: 15px;" src="http://blog.holisticon.de/wp-content/uploads/2012/05/services-shortcuts.png" alt="" width="594" height="238" /></a></p>
<p>Wem das Erstellen dieser Automationen noch zu aufwändig ist, der kann auch einfach die nachfolgende ZIP-Datei herunter laden, entpacken und die beiden enthaltenen Dateien einfach nach <tt>~/Library/Services</tt> kopieren <img src='http://blog.holisticon.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley colorbox-5389' /> </p>
<p><a href="http://blog.holisticon.de/wp-content/uploads/2012/05/hidden-files-services.zip">hidden-files-services.zip</a></p>
<p>Stay tuned&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.holisticon.de/2012/05/mac-os-tipps-tricks-fur-entwickler-hidden-files/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kummerkasten</title>
		<link>http://blog.holisticon.de/2012/05/kummerkasten/</link>
		<comments>http://blog.holisticon.de/2012/05/kummerkasten/#comments</comments>
		<pubDate>Thu, 10 May 2012 08:21:46 +0000</pubDate>
		<dc:creator>Rolf Dräther</dc:creator>
				<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Rundumsichtig]]></category>

		<guid isPermaLink="false">http://blog.holisticon.de/?p=5282</guid>
		<description><![CDATA[Wer kennt das nicht? Da war noch was, das man in der nächsten Retrospektive unbedingt ansprechen wollte &#8211; und nun sitzt man hier, will seine Zettel schreiben und es ist weg. Das kann passieren. Bei längerer Sprintdauer eher als bei 1-Wochen-Sprints. Da hilft nur sofort aufschreiben! Man kann sich entschließen, im Team das agile Logbuch [...]]]></description>
			<content:encoded><![CDATA[<p>Wer kennt das nicht? Da war noch was, das man in der nächsten Retrospektive unbedingt ansprechen wollte &#8211; und nun sitzt man hier, will seine Zettel schreiben und es ist weg. Das kann passieren. Bei längerer Sprintdauer eher als bei 1-Wochen-Sprints. Da hilft nur <strong>sofort aufschreiben!</strong></p>
<p>Man kann sich entschließen, im Team das <strong><a title="Das agile Logbuch" href="http://www.holisticon.de/cms/ProjektProzessManagement/AgilesLogbuch">agile Logbuch</a></strong> zu verwenden und jeden Tag über das Geschehene zu reflektieren. Dann hat man am Ende des Sprints eine Sammlung all seiner Gedanken, die in die Retrospektive einfließen können.</p>
<p>Als einen anderen Ansatz wider das Vergessen habe ich bei einem Team den <strong>Kummerkasten</strong> kennengelernt. Was ist das?<span id="more-5282"></span></p>
<p><a href="http://blog.holisticon.de/wp-content/uploads/2012/05/RoterBriefkastenKlein.jpg"><img class="alignright size-medium wp-image-5285 colorbox-5282" src="http://blog.holisticon.de/wp-content/uploads/2012/05/RoterBriefkastenKlein-300x253.jpg" alt="Kummerkasten" width="300" height="253" /></a>Befragen wir zuerst Wikipedia zum Begriff. Dort finden wir: &#8221;Der abstrahierende Begriff Kummerkasten bezeichnet jede Form von Behältnis, das für einen oder mehrere Individuen als Aufbewahrungsort für seelisch belastende Gedanken und Gefühle gilt. Dabei kann es sich auch um einen Kasten im wörtlichen Sinne handeln, in den üblicherweise Schriftgut oder symbolträchtige Gegenstände geladen werden. [...] Der Begriff Kummerkasten hat sich auch in Firmen und anderen Organisationen etabliert. Dabei handelt es sich um Briefkästen, in denen Mitarbeiter oder Mitglieder anonym ihre zu Papier gebrachten Sorgen oder Beschwerden weitergeben können.&#8221;</p>
<p><em>Quelle: http://de.wikipedia.org/wiki/Kummerkasten</em></p>
<p>Das Team hatte einen <strong>agilen Kummerkasten</strong> aufgestellt, den man mit allem füttern konnte, was in der nächsten Retrospektive nicht vergessen werden sollte. Dazu lagen ein Stift und verschiedenfarbige Zettel immer in der Nähe:</p>
<ul>
<li><span style="color: #000000;">Grün</span>: Mir ist etwas Positives aufgefallen, das ich auf jeden Fall lobend erwähnen möchte!</li>
<li>Rot: Ich habe etwas Problematisches bemerkt, das wir nicht sofort klären müssen, das aber spätestens in der Retrospektive besprochen werden muss!</li>
<li>Gelb: Mir ist eine Verbesserungsmaßnahme eingefallen, die ich in der kommenden Retrospektive mit allen besprechen und bis dahin nicht vergessen will!</li>
</ul>
<p>So konnte man jederzeit mit wenigen Worten seine Gedanken aufschreiben und einfach einwerfen. Vor der Retrospektive leerte der Scrum Master den Kasten und nahm die Zettel mit in das Meeting. Der Autor bekam die Möglichkeit, genauer auf sein Anliegen einzugehen. Dann landeten sie zusammen mit den während der Retrospektive neu geschriebenen Zetteln in einer der Rubriken: Was war gut? Was wollen wir verbessern? Verbesserungs-Maßnahmen. Nichts ging verloren. Nichts konnte in Vergessenheit geraten.</p>
<p>Eine wunderbar einfaches Tool, das omnipräsent im Teamraum hängt und immer funktioniert, ganz ohne Bits und Bytes.<br />
Einfach mal ausprobieren!</p>
<p>Foto: © stoonn, http://www.sxc.hu/photo/1360564</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.holisticon.de/2012/05/kummerkasten/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Drittes Hamburg Web Performance Meetup</title>
		<link>http://blog.holisticon.de/2012/05/drittes-hamburg-web-performance-meetup-2/</link>
		<comments>http://blog.holisticon.de/2012/05/drittes-hamburg-web-performance-meetup-2/#comments</comments>
		<pubDate>Tue, 08 May 2012 08:13:30 +0000</pubDate>
		<dc:creator>Jan Weinschenker</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Rundumsichtig]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[kundenzufriedenheit]]></category>
		<category><![CDATA[Metriken]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[webperf]]></category>

		<guid isPermaLink="false">http://blog.holisticon.de/?p=5323</guid>
		<description><![CDATA[Das dritte Hamburg Web Performance Meetup fand am 25. April in den Räumlichkeiten von Telefónica in der City Nord statt. Den fast vierzig Teilnehmern, die sich trotz eines zeitgleich laufenden, hochkarätigen Champions-League-Spiels nicht vor den Fernseher gesetzt hatten, wurden zwei interessante Vorträge geboten. Den Anfang machten Jan Vogel (DI UNTERNEHMER) und Uwe Beßle (Iteratec) mit [...]]]></description>
			<content:encoded><![CDATA[<p><img class="colorbox-5323"  style="margin-left: 1em;" src="http://photos1.meetupstatic.com/photos/event/6/3/1/c/highres_71725372.jpeg" alt="Web Performance HH" align="right" /></p>
<p>Das dritte <a title="Drittes Hamburg Web Performance Meetup bei meetup.com" href="http://www.meetup.com/Hamburg-Web-Performance-Group/events/57384682/" rel="external">Hamburg Web Performance Meetup</a> fand am 25. April in den Räumlichkeiten von Telefónica in der City Nord statt. Den fast vierzig Teilnehmern, die sich trotz eines zeitgleich laufenden, hochkarätigen Champions-League-Spiels nicht vor den Fernseher gesetzt hatten, wurden zwei interessante Vorträge geboten.</p>
<p>Den Anfang machten <a href="https://www.xing.com/profile/Jan_Vogel" target="_blank">Jan Vogel</a> (<a href="http://www.di-unternehmer.com/" target="_blank">DI UNTERNEHMER</a>) und <a href="https://www.xing.com/profile/Uwe_Bessle" target="_blank">Uwe Beßle</a> (<a href="http://iteratec.de/" target="_blank">Iteratec</a>) mit dem Thema &#8220;Optimierung der gefühlten Performance &#8211; Web Performance Management für Fortgeschrittene&#8221;. Die beiden präsentierten ihre Erfahrungen, die sie im Umfeld einer der weltweit größten eCommerce-Sites gemacht haben. Vorgestellt wurden u.a. eigene Metriken für Performance und Kundenzufriedenheit.</p>
<p>Im Rahmen des Projekts wurden End-User-Tests mit etwa 1.500 Probanden sowie automatisierte Tests mit dem Tool <a href="http://www.webpagetest.org" target="_blank">WebPagetest</a> (WPT) durchgeführt. Mit Best-Practise-Beispielen zu WPT und einem regen und ausführlichen Frage-und-Antwort-Teil endete dieser Vortrag.</p>
<p>Der zweite Teil des Abends bestritten <a href="https://www.xing.com/profile/Oliver_Ochs" target="_blank">Oliver Ochs</a> und <a href="https://www.xing.com/profile/Jan_Weinschenker" target="_blank">meine Wenigkeit</a> mit unserer Präsentation &#8220;Building Performance, ein Frontend-Build-Prozess&#8221;.</p>
<p>Wir haben einen auf Maven basierenden Build-Prozess vorgestellt, mit dem die Frontent-Komponente des <a href="http://dsl.o2online.de" target="_blank">DSL-Portals</a> von Telefónica O<sub>2</sub> erstellt wird. In mehreren Schritten sorgt dieser Build-Prozess automatisiert dafür, dass HTML, CSS, JavaScript und Bildelemente hinsichtlich der Web Performance optimiert werden. Dabei kommen unter anderem Werkzeuge wie OptiPng, Web Ressource Optimizer, JSLint, CSSLint und der Google Closure Optimizer zum Einsatz, die als Maven-Plugins ohne großen Aufwand in den Prozess integriert werden.</p>
<p>Der Abend endete mit einer Verlosung von Fachbüchern des Sponsors unseres Web Performance Meetups in Hamburg, dem <a href="http://www.oreilly.de/" rel="external">O&#8217;Reilly</a> Verlag.</p>
<p>Unser Vortrag zum Frontend-Build-Prozess ist bei SlideShare verfügbar:</p>
<ul>
<li>
<div style="margin-top: 1em;"><strong><a title="Building Performance - ein Frontend-Build-Prozess für Java mit Maven" href="http://www.slideshare.net/oliverochs/building-performance-ein-frontendbuildprozess-fr-java-mit-maven">Building Performance &#8211; ein Frontend-Build-Prozess für Java mit Maven</a></strong></div>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.holisticon.de/2012/05/drittes-hamburg-web-performance-meetup-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SEACON 2012: Der Countdown läuft</title>
		<link>http://blog.holisticon.de/2012/05/seacon-2012-der-countdown-lauft/</link>
		<comments>http://blog.holisticon.de/2012/05/seacon-2012-der-countdown-lauft/#comments</comments>
		<pubDate>Fri, 04 May 2012 08:20:40 +0000</pubDate>
		<dc:creator>Holger Koschek</dc:creator>
				<category><![CDATA[Rundumsichtig]]></category>

		<guid isPermaLink="false">http://blog.holisticon.de/?p=5239</guid>
		<description><![CDATA[In weniger als fünf Wochen öffnet im Hotel Grand Elysée in Hamburg die SEACON ihre Pforten. Die Konferenz am 4. und 5. Juni steht 2012 unter dem Motto “Denkzelle oder Lernfabrik: Innovation in kleinen und großen Unternehmen”. Rund um dieses Thema hat der SEACON-Fachbeirat (Dr. Carola Lilienthal, Jochen Meyer, Bernd Oestereich, Henning Wolf und Holisticon-Mitarbeiter Holger Koschek) [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.holisticon.de/wp-content/uploads/2011/11/SEACON2012-Logo.jpg"><img class="alignleft size-full wp-image-3478 colorbox-5239" style="margin-right: 10px;" src="http://blog.holisticon.de/wp-content/uploads/2011/11/SEACON2012-Logo.jpg" alt="" width="248" height="62" /></a>In weniger als fünf Wochen öffnet im Hotel Grand Elysée in Hamburg die SEACON ihre Pforten. Die Konferenz am 4. und 5. Juni steht 2012 unter dem Motto “Denkzelle oder Lernfabrik: Innovation in kleinen und großen Unternehmen”. Rund um dieses Thema hat der SEACON-Fachbeirat (Dr. Carola Lilienthal, Jochen Meyer, Bernd Oestereich, Henning Wolf und Holisticon-Mitarbeiter Holger Koschek) ein spannendes Programm zusammengestellt. Nach dem Premierenerfolg im vergangenen Jahr wird es auch 2012 wieder einen Architekturtag geben (6. Juni).</p>
<p>Das Konferenzprogramm und weitere Informationen rund um die SEACON sind auf der <a href="http://www.sigs-datacom.de/seacon2012/seacon2012.html" target="_blank">Konferenzseite</a> des Veranstalters SIGS DATACOM zu finden. In der <a href="https://www.xing.com/go/group/70381.537d17/5855535" target="_blank">XING-Gruppe</a> geben die Referenten erste Details ihrer Vorträge bekannt. Gezwitschert wird unter <a href="https://twitter.com/#!/seacon_de" target="_blank">@seacon_de</a>. Aber all das kann den Besuch der SEACON nicht ersetzen. Deshalb freue ich mich auf ein Kennenlernen (oder Wiedersehen) am 4. Juni.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.holisticon.de/2012/05/seacon-2012-der-countdown-lauft/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Liferay/Tomcat Bundle – Logging mal richtig</title>
		<link>http://blog.holisticon.de/2012/05/liferaytomcat-bundle-logging-mal-richtig/</link>
		<comments>http://blog.holisticon.de/2012/05/liferaytomcat-bundle-logging-mal-richtig/#comments</comments>
		<pubDate>Fri, 04 May 2012 08:09:45 +0000</pubDate>
		<dc:creator>Enno Thieleke</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[java.util.logging]]></category>
		<category><![CDATA[Liferay]]></category>
		<category><![CDATA[log4j]]></category>
		<category><![CDATA[Logging]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://blog.holisticon.de/?p=5067</guid>
		<description><![CDATA[Wer möchte wissen, wie man Liferay und Tomcat in Punkto Logging richtig verbindet? Jeder vernünftig denkende Mensch, der gerade wissen möchte, wie man Liferay und Tomcat in Punkto Logging richtig verbindet. Ganz generell Also, ich habe mich mal mit den Logging-Details von Liferay und Tomcat beschäftigt und muss sagen: das geht besser! Evaluiert habe ich [...]]]></description>
			<content:encoded><![CDATA[<p>Wer möchte wissen, wie man <a href="http://www.liferay.com/">Liferay</a> und <a href="http://tomcat.apache.org/">Tomcat</a> in Punkto Logging richtig verbindet? Jeder vernünftig denkende Mensch, der gerade wissen möchte, wie man Liferay und Tomcat in Punkto Logging richtig verbindet.<br />
<span id="more-5067"></span></p>
<h3>Ganz generell</h3>
<p>Also, ich habe mich mal mit den Logging-Details von Liferay und Tomcat beschäftigt und muss sagen: das geht besser! Evaluiert habe ich Liferay 6.0.6 im Bundle mit Tomcat 6.0.29. Eine momentan sehr gängige Kompilation, da Liferay 6.1 noch sehr jung ist und man sich Kinderkrankheiten nicht gerne mit an Bord holt.</p>
<h3>Tomcat</h3>
<p>Sehr interessant. Tomcat ist aus dem Hause <a href="http://apache.org/">Apache</a>. Der wahrscheinliche gängigste Logger ist <a href="http://logging.apache.org/log4j/">log4j</a> und kommt aus dem Hause&#8230; Apache. Also wird Tomcat ausgeliefert mit&#8230; richtig, <a href="http://docs.oracle.com/javase/6/docs/api/java/util/logging/package-summary.html">java.util.logging</a>. [Metapher von der Redaktion zensiert.] In Tomcat ist das Logging über eine dünne Zwischenschicht realisiert – <a href="http://tomcat.apache.org/tomcat-6.0-doc/logging.html">JULI</a>. JULI ist eigentlich nur das bekannte Commons Logging aus dem Hause&#8230; Apache – allerdings in einem anderen <em>Java Package</em>, damit auch ja jeder sein eigenes Commons Logging mitbringt und ja nichts modular ist. Was soll&#8217;s, der Tomcat ist trotzdem recht gut. Außerdem gibt es ja die „<a href="http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.29/bin/extras/">Extras</a>“, in denen eine JULI –Variante existiert, mit der auch log4j funktioniert.</p>
<h3>Liferay</h3>
<p>Liferay bringt sein eigenes Logging mit – natürlich Apache log4j. Aber ich wäre nicht ich, wenn ich hier nichts Negatives anzumerken hätte: Wenn man Liferay im Bundle mit Tomcat ausliefert und Tomcat von Haus aus nur java.util.logging mitbringt, wobei aber log4j als Logger möglich ist, und Liferay eh log4j enthält, warum kann man das nicht alles verbinden und Liferay im Bundle mit Tomcat gleich mit einem schlüssigen Logging-Gesamtkonzept ausliefern? Richtig, weil Liferay in Wahrheit die Eierlegende-Wollmilchsau-Web-Applikation sein soll. Und trotzdem sind Mühen in Anpassungen des Tomcats im Bundle geflossen. Huch, den letzten Satz streichen!</p>
<h3>Und jetzt zusammen</h3>
<p>Nun, die Richtung ist soweit klar: Tomcat und Liferay sollen beide mit log4j arbeiten, und am besten noch mit demselben, d.h., die log4j-Bibliothek soll nur einmal in der gesamten <em>ClassLoader</em>-Hierarchie existieren. Dafür muss man nicht viel machen, man verschiebt einfach nur die entsprechende Jar-Datei von $CATALINA_HOME/webapps/ROOT/WEB-INF/lib/log4j.jar nach $CATALINA_HOME/lib. Als nächstes brauchen wir <a href="http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.29/bin/extras/">die alternative JULI-Variante aus den Tomcat-Extras</a>, damit log4j auch von Tomcat und nicht nur von Liferay erkannt wird. Zwei Dateien sind notwendig:</p>
<ul>
<li>tomcat-juli.jar -&gt; $CATALINA_HOME/bin</li>
<li>tomcat-juli-adapters.jar -&gt; $CATALINA_HOME/lib</li>
</ul>
<p>Und für die Funktionstüchtigkeit von log4j brauchen wir noch eine log4j.properties-Datei. Diese legen wir ebenfalls in $CATALINA_HOME/lib. Hier habe ich mal eine Beispieldatei:</p>
<pre class="brush: plain; collapse: true; light: false; title: ; toolbar: true; notranslate">
#
# Default properties (can be referenced)
#

default.DatePattern='.'yyyy-MM-dd
default.ConversionPattern=%d{HH:mm:ss.SSS} %p [%c{1}:%L] %m%n

#
# Appenders
#

log4j.appender.ROOT=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ROOT.File=${catalina.base}/logs/root.log
log4j.appender.ROOT.Append=true
log4j.appender.ROOT.Encoding=UTF-8
log4j.appender.ROOT.DatePattern=${default.DatePattern}
log4j.appender.ROOT.layout=org.apache.log4j.PatternLayout
log4j.appender.ROOT.layout.ConversionPattern=${default.ConversionPattern}

# The appender below is an example for a special purpose logger
#log4j.appender.CATALINE/LOCALHOST=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.CATALINE/LOCALHOST.File=${catalina.base}/logs/catalina-localhost.log
#log4j.appender.CATALINE/LOCALHOST.Append=true
#log4j.appender.CATALINE/LOCALHOST.Encoding=UTF-8
#log4j.appender.CATALINE/LOCALHOST.DatePattern=${default.DatePattern}
#log4j.appender.CATALINE/LOCALHOST.layout=org.apache.log4j.PatternLayout
#log4j.appender.CATALINE/LOCALHOST.layout.ConversionPattern=${default.ConversionPattern}

#
# Loggers
#

log4j.rootLogger=INFO, ROOT

# The logger below is an example for a special purpose
#log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=INFO, CATALINE/LOCALHOST
#log4j.additivity.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=false
</pre>
<p>Ok, fast geschafft. In Liferay ist natürlich noch eine unglaublich clevere log4j-Konfigurationslogik hinterlegt, die es auszuhebeln gilt. In der system.properties-Datei in $CATALINA_HOME/webapps/ROOT/WEB-INF/lib/portal-impl.jar ist ein <em>Property</em> zu finden, das dafür sorgt, dass log4j von Liferay konfiguriert wird: „log4j.configure.on.startup“. Natürlich setzen wir dieses auf „false“. Wir kommen einem schlüssigen Gesamtkonzept immer näher. Um java.util.logging daran zu hindern, für Tomcat initialisiert zu werden, muss noch die Datei $CATALINA_HOME/conf/logging.properties entfernt werden.</p>
<p>Wenn man jetzt Tomcat startet, dann bekommt man&#8230; 500kB Log-Nachrichten? Ja, heutige Applikationen sind unglaublich geschwätzig. Als wir Liferay daran gehindert haben, log4j für sich zu konfigurieren, haben wir auch die <em>Priority</em> pro <em>Logger</em> auf Standard gelassen (INFO). Mit einem kleinen Tool können wir sämtliche <em>Priority</em>- und <em>Logger</em>-Einstellungen aus der META-INF/portal-log4j.xml-Datei in $CATALINA_HOME/webapps/ROOT/WEB-INF/lib/portal-impl.jar extrahieren.</p>
<pre class="brush: java; collapse: true; light: false; title: ; toolbar: true; notranslate">
package noorg;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Iterator;

import javax.xml.namespace.NamespaceContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Log4jXml2Properties {

	public static void main(String[] args) throws Exception {
		InputStream in = null;
		try {
			in = new FileInputStream(&quot;portal-log4j.xml&quot;);
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			dbf.setNamespaceAware(true);
			DocumentBuilder db = dbf.newDocumentBuilder();
			Document d = db.parse(in);
			XPathFactory xpf = XPathFactory.newInstance();
			XPath xp = xpf.newXPath();
			xp.setNamespaceContext(new NamespaceContext() {

				@Override
				public String getNamespaceURI(String prefix) {
					return &quot;http://jakarta.apache.org/log4j/&quot;;
				}

				@Override
				public String getPrefix(String namespaceURI) {
					return &quot;log4j&quot;;
				}

				@Override
				public Iterator&lt;String&gt; getPrefixes(String namespaceURI) {
					return Arrays.asList(&quot;log4j&quot;).iterator();
				}
			});
			NodeList categories = (NodeList) xp.evaluate(&quot;/log4j:configuration/category&quot;, d, XPathConstants.NODESET);
			for (int i = 0; i &lt; categories.getLength(); ++i) {
				Node category = categories.item(i);
				String name = (String) xp.evaluate(&quot;@name&quot;, category, XPathConstants.STRING);
				String priority = (String) xp.evaluate(&quot;priority/@value&quot;, category, XPathConstants.STRING);
				System.out.println(&quot;log4j.logger.&quot; + name + &quot;=&quot; + priority);
			}
		} finally {
			if (in != null)
				try {
					in.close();
				} catch (IOException ignore) {}
		}
	}
}
</pre>
<p>Und hier das Endergebnis als log4j.properties:</p>
<pre class="brush: plain; collapse: true; light: false; title: ; toolbar: true; notranslate">
#
# Default properties (can be referenced)
#

default.DatePattern='.'yyyy-MM-dd
default.ConversionPattern=%d{HH:mm:ss.SSS} %p [%c{1}:%L] %m%n

#
# Appenders
#

log4j.appender.ROOT=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ROOT.File=${catalina.base}/logs/root.log
log4j.appender.ROOT.Append=true
log4j.appender.ROOT.Encoding=UTF-8
log4j.appender.ROOT.DatePattern=${default.DatePattern}
log4j.appender.ROOT.layout=org.apache.log4j.PatternLayout
log4j.appender.ROOT.layout.ConversionPattern=${default.ConversionPattern}

# The appender below is an example for a special purpose logger
#log4j.appender.CATALINE/LOCALHOST=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.CATALINE/LOCALHOST.File=${catalina.base}/logs/catalina-localhost.log
#log4j.appender.CATALINE/LOCALHOST.Append=true
#log4j.appender.CATALINE/LOCALHOST.Encoding=UTF-8
#log4j.appender.CATALINE/LOCALHOST.DatePattern=${default.DatePattern}
#log4j.appender.CATALINE/LOCALHOST.layout=org.apache.log4j.PatternLayout
#log4j.appender.CATALINE/LOCALHOST.layout.ConversionPattern=${default.ConversionPattern}

#
# Loggers
#

log4j.rootLogger=INFO, ROOT

# The logger below is an example for a special purpose
#log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=INFO, CATALINE/LOCALHOST
#log4j.additivity.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=false

#
# Categories and priorities
#

log4j.logger.com.ecyrd.jspwiki=ERROR
log4j.logger.com.germinus.easyconf=ERROR
log4j.logger.com.liferay=ERROR
log4j.logger.com.liferay.documentlibrary=ERROR
log4j.logger.com.liferay.documentlibrary.util=ERROR
log4j.logger.com.liferay.documentlibrary.util.CMISHook=INFO
log4j.logger.com.liferay.documentlibrary.util.DLIndexer=ERROR
log4j.logger.com.liferay.documentlibrary.util.HookFactory=ERROR
log4j.logger.com.liferay.jdbc=ERROR
log4j.logger.com.liferay.mail.service.impl.MailServiceImpl=ERROR
log4j.logger.com.liferay.mail.util=ERROR
log4j.logger.com.liferay.mail.util.DummyHook=ERROR
log4j.logger.com.liferay.mail.util.HookFactory=ERROR
log4j.logger.com.liferay.mail.util.MailSessionFactoryBean=ERROR
log4j.logger.com.liferay.portal.action.JSONServiceAction=INFO
log4j.logger.com.liferay.portal.action.LayoutAction=WARN
log4j.logger.com.liferay.portal.bean.BeanLocatorImpl=WARN
log4j.logger.com.liferay.portal.cache=WARN
log4j.logger.com.liferay.portal.cache.ehcache.EhcachePortalCacheManager=ERROR
log4j.logger.com.liferay.portal.cache.ehcache.LiferayBootstrapCacheLoaderFactory=INFO
log4j.logger.com.liferay.portal.cache.ehcache.LiferayCacheEventListenerFactory=INFO
log4j.logger.com.liferay.portal.cache.ehcache.LiferayCacheManagerPeerProviderFactory=INFO
log4j.logger.com.liferay.portal.captcha.CaptchaImpl=INFO
log4j.logger.com.liferay.portal.cluster=INFO
log4j.logger.com.liferay.portal.convert=DEBUG
log4j.logger.com.liferay.portal.dao.db=INFO
log4j.logger.com.liferay.portal.dao.db.BaseDB=INFO
log4j.logger.com.liferay.portal.dao.jdbc.aop=ERROR
log4j.logger.com.liferay.portal.dao.jdbc.pool=ERROR
log4j.logger.com.liferay.portal.dao.jdbc.util.DataSourceFactoryBean=INFO
log4j.logger.com.liferay.portal.dao.orm.common.SQLTransformer=ERROR
log4j.logger.com.liferay.portal.dao.orm.hibernate.SessionFactoryImpl=ERROR
log4j.logger.com.liferay.portal.dao.shard=ERROR
log4j.logger.com.liferay.portal.deploy=INFO
log4j.logger.com.liferay.portal.deploy.hot.HookHotDeployListener=INFO
log4j.logger.com.liferay.portal.deploy.hot.PluginPackageHotDeployListener=ERROR
log4j.logger.com.liferay.portal.deploy.hot.ThemeLoaderHotDeployListener=ERROR
log4j.logger.com.liferay.portal.deploy.hot.messaging.HotDeployMessageListener=ERROR
log4j.logger.com.liferay.portal.editor=ERROR
log4j.logger.com.liferay.portal.editor.fckeditor.ConnectorAction=ERROR
log4j.logger.com.liferay.portal.events.EventsProcessor=ERROR
log4j.logger.com.liferay.portal.events.FixOracleAction=INFO
log4j.logger.com.liferay.portal.events.GarbageCollectorAction=ERROR
log4j.logger.com.liferay.portal.events.LogMemoryUsageAction=DEBUG
log4j.logger.com.liferay.portal.events.LoginPostAction=ERROR
log4j.logger.com.liferay.portal.events.LoginPreAction=ERROR
log4j.logger.com.liferay.portal.events.LogoutPostAction=ERROR
log4j.logger.com.liferay.portal.events.LogoutPreAction=ERROR
log4j.logger.com.liferay.portal.events.LogSessionIdAction=DEBUG
log4j.logger.com.liferay.portal.events.LogThreadCountAction=DEBUG
log4j.logger.com.liferay.portal.events.ServicePreAction=ERROR
log4j.logger.com.liferay.portal.events.ShutdownHook=ERROR
log4j.logger.com.liferay.portal.events.StartupAction=ERROR
log4j.logger.com.liferay.portal.events.StartupHelper=INFO
log4j.logger.com.liferay.portal.image.HookFactory=ERROR
log4j.logger.com.liferay.portal.image.ImageProcessorImpl=ERROR
log4j.logger.com.liferay.portal.image.SpriteProcessorImpl=WARN
log4j.logger.com.liferay.portal.kernel.bean.PortalBeanLocatorUtil=ERROR
log4j.logger.com.liferay.portal.kernel.cache.cluster.BasePortalCacheClusterChannel=WARN
log4j.logger.com.liferay.portal.kernel.dao.orm.QueryUtil=WARN
log4j.logger.com.liferay.portal.kernel.deploy=INFO
log4j.logger.com.liferay.portal.kernel.servlet.PortletContextListener=INFO
log4j.logger.com.liferay.portal.kernel.servlet.ServletContextPool=ERROR
log4j.logger.com.liferay.portal.kernel.servlet.ServletContextUtil=INFO
log4j.logger.com.liferay.portal.kernel.upgrade=INFO
log4j.logger.com.liferay.portal.kernel.util.JavaProps=ERROR
log4j.logger.com.liferay.portal.kernel.util.ServerDetector=INFO
log4j.logger.com.liferay.portal.lar=ERROR
log4j.logger.com.liferay.portal.lucene=INFO
log4j.logger.com.liferay.portal.lucene.IndexWriterFactory=INFO
log4j.logger.com.liferay.portal.lucene.LuceneFileExtractor=ERROR
log4j.logger.com.liferay.portal.model.Image=ERROR
log4j.logger.com.liferay.portal.model.ModelHintsImpl=ERROR
log4j.logger.com.liferay.portal.plugin.PluginPackageUtil=INFO
log4j.logger.com.liferay.portal.pop=ERROR
log4j.logger.com.liferay.portal.sanitizer.DummySanitizerImpl=ERROR
log4j.logger.com.liferay.portal.scheduler.quartz.PortalJobStore=ERROR
log4j.logger.com.liferay.portal.search.lucene.LuceneIndexSearcherImpl=ERROR
log4j.logger.com.liferay.portal.security.auth.CASAutoLogin=WARN
log4j.logger.com.liferay.portal.security.auth.LDAPAuth=WARN
log4j.logger.com.liferay.portal.security.auth.OpenSSOAutoLogin=WARN
log4j.logger.com.liferay.portal.security.auth.PrincipalThreadLocal=ERROR
log4j.logger.com.liferay.portal.security.auth.ScreenNameGeneratorFactory=ERROR
log4j.logger.com.liferay.portal.security.auth.ScreenNameValidatorFactory=ERROR
log4j.logger.com.liferay.portal.security.auth.SiteMinderAutoLogin=WARN
log4j.logger.com.liferay.portal.security.ldap=ERROR
log4j.logger.com.liferay.portal.security.ldap.PortalLDAPUtil=ERROR
log4j.logger.com.liferay.portal.security.permission.AdvancedPermissionChecker=ERROR
log4j.logger.com.liferay.portal.security.permission.BasicPermissionChecker=INFO
log4j.logger.com.liferay.portal.security.permission.ResourceActionsUtil=WARN
log4j.logger.com.liferay.portal.security.pwd.RegExpToolkit=WARN
log4j.logger.com.liferay.portal.service.impl.LayoutLocalServiceImpl=ERROR
log4j.logger.com.liferay.portal.service.impl.PermissionLocalServiceImpl=ERROR
log4j.logger.com.liferay.portal.service.impl.PortalLocalServiceImpl=INFO
log4j.logger.com.liferay.portal.service.impl.PortalServiceImpl=INFO
log4j.logger.com.liferay.portal.service.impl.PortletLocalServiceImpl=WARN
log4j.logger.com.liferay.portal.service.impl.ReleaseLocalServiceImpl=INFO
log4j.logger.com.liferay.portal.service.impl.ResourceLocalServiceImpl=ERROR
log4j.logger.com.liferay.portal.service.impl.ServiceComponentLocalServiceImpl=INFO
log4j.logger.com.liferay.portal.service.impl.ThemeLocalServiceImpl=INFO
log4j.logger.com.liferay.portal.service.impl.ThemeServiceImpl=ERROR
log4j.logger.com.liferay.portal.service.persistence.PermissionPool=ERROR
log4j.logger.com.liferay.portal.service.persistence.ResourcePool=ERROR
log4j.logger.com.liferay.portal.servlet=ERROR
log4j.logger.com.liferay.portal.servlet.FriendlyURLServlet=ERROR
log4j.logger.com.liferay.portal.servlet.ImageServlet=ERROR
log4j.logger.com.liferay.portal.servlet.LanguageServlet=WARN
log4j.logger.com.liferay.portal.servlet.LuceneServlet=INFO
log4j.logger.com.liferay.portal.servlet.MainServlet=ERROR
log4j.logger.com.liferay.portal.servlet.PortalSessionCreator=ERROR
log4j.logger.com.liferay.portal.servlet.PortalSessionDestroyer=ERROR
log4j.logger.com.liferay.portal.servlet.SharedSessionUtil=ERROR
log4j.logger.com.liferay.portal.servlet.SoftwareCatalogServlet=ERROR
log4j.logger.com.liferay.portal.servlet.filters=ERROR
log4j.logger.com.liferay.portal.servlet.filters.autologin.AutoLoginFilter=ERROR
log4j.logger.com.liferay.portal.servlet.filters.cache=ERROR
log4j.logger.com.liferay.portal.servlet.filters.doubleclick=ERROR
log4j.logger.com.liferay.portal.servlet.filters.fragment=ERROR
log4j.logger.com.liferay.portal.servlet.filters.gzip=ERROR
log4j.logger.com.liferay.portal.servlet.filters.language=ERROR
log4j.logger.com.liferay.portal.servlet.filters.minifier=ERROR
log4j.logger.com.liferay.portal.servlet.filters.sessionid.SessionIdFilter=ERROR
log4j.logger.com.liferay.portal.servlet.filters.sessionid.SessionIdServletRequest=ERROR
log4j.logger.com.liferay.portal.servlet.filters.strip=ERROR
log4j.logger.com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter=ERROR
log4j.logger.com.liferay.portal.spring=ERROR
log4j.logger.com.liferay.portal.spring.context.ArrayApplicationContext=ERROR
log4j.logger.com.liferay.portal.spring.context.PortalApplicationContext=ERROR
log4j.logger.com.liferay.portal.spring.context.PortletApplicationContext=ERROR
log4j.logger.com.liferay.portal.spring.context.TunnelApplicationContext=ERROR
log4j.logger.com.liferay.portal.spring.hibernate.DialectDetector=INFO
log4j.logger.com.liferay.portal.spring.jpa.DatabaseDetector=INFO
log4j.logger.com.liferay.portal.spring.jpa.LocalContainerEntityManagerFactoryBean=INFO
log4j.logger.com.liferay.portal.struts=ERROR
log4j.logger.com.liferay.portal.struts.MultiMessageResources=ERROR
log4j.logger.com.liferay.portal.struts.PortalRequestProcessor=ERROR
log4j.logger.com.liferay.portal.struts.PortletRequestProcessor=WARN
log4j.logger.com.liferay.portal.struts.StrutsURLEncoder=ERROR
log4j.logger.com.liferay.portal.struts.StrutsUtil=ERROR
log4j.logger.com.liferay.portal.theme.ThemeLoader=INFO
log4j.logger.com.liferay.portal.tools.BaseDeployer=INFO
log4j.logger.com.liferay.portal.tools.DBUpgrader=ERROR
log4j.logger.com.liferay.portal.tools.PortletDeployer=INFO
log4j.logger.com.liferay.portal.tools.ThemeDeployer=INFO
log4j.logger.com.liferay.portal.tools.sql=INFO
log4j.logger.com.liferay.portal.upgrade=INFO
log4j.logger.com.liferay.portal.upgrade.UpgradeProcessUtil=INFO
log4j.logger.com.liferay.portal.util=ERROR
log4j.logger.com.liferay.portal.util.CookieKeys=ERROR
log4j.logger.com.liferay.portal.util.EntityResolver=ERROR
log4j.logger.com.liferay.portal.util.FileImpl=WARN
log4j.logger.com.liferay.portal.util.HttpImpl=INFO
log4j.logger.com.liferay.portal.util.MaintenanceUtil=DEBUG
log4j.logger.com.liferay.portal.util.MimeTypesUtil=ERROR
log4j.logger.com.liferay.portal.util.PortalInstances=ERROR
log4j.logger.com.liferay.portal.util.PortalImpl=INFO
log4j.logger.com.liferay.portal.velocity=ERROR
log4j.logger.com.liferay.portal.velocity.ClassLoaderVelocityResourceListener=ERROR
log4j.logger.com.liferay.portal.velocity.LiferayResourceLoader=ERROR
log4j.logger.com.liferay.portal.velocity.ServletVelocityResourceListener=ERROR
log4j.logger.com.liferay.portal.verify=INFO
log4j.logger.com.liferay.portal.verify.VerifyUser=INFO
log4j.logger.com.liferay.portal.webdav=ERROR
log4j.logger.com.liferay.portal.xml.SAXReaderImpl=WARN
log4j.logger.com.liferay.portlet.InvokerPortlet=ERROR
log4j.logger.com.liferay.portlet.PortletPreferencesImpl=ERROR
log4j.logger.com.liferay.portlet.RenderRequestFactory=ERROR
log4j.logger.com.liferay.portlet.RenderResponseFactory=ERROR
log4j.logger.com.liferay.portlet.admin=ERROR
log4j.logger.com.liferay.portlet.admin.action.EditServerAction=INFO
log4j.logger.com.liferay.portlet.asset.util.AssetUtil=ERROR
log4j.logger.com.liferay.portlet.blogs.service.impl.BlogsEntryLocalServiceImpl=INFO
log4j.logger.com.liferay.portlet.blogs.util=INFO
log4j.logger.com.liferay.portlet.documentlibrary.lar=WARN
log4j.logger.com.liferay.portlet.documentlibrary.webdav=WARN
log4j.logger.com.liferay.portlet.enterpriseadmin.action.EditUserPortraitAction=ERROR
log4j.logger.com.liferay.portlet.enterpriseadmin.util.OrganizationIndexer=WARN
log4j.logger.com.liferay.portlet.enterpriseadmin.util.OrganizationSearchTerms=WARN
log4j.logger.com.liferay.portlet.journal=ERROR
log4j.logger.com.liferay.portlet.journal.lar=WARN
log4j.logger.com.liferay.portlet.journal.service.impl.JournalContentSearchLocalServiceImpl=INFO
log4j.logger.com.liferay.portlet.journal.util.JournalUtil=ERROR
log4j.logger.com.liferay.portlet.journal.util.PropertiesTransformerListener=WARN
log4j.logger.com.liferay.portlet.journal.util.RegexTransformerUtil=INFO
log4j.logger.com.liferay.portlet.journalcontent.JournalContentPortletLayoutListener=ERROR
log4j.logger.com.liferay.portlet.journalcontent.util.JournalContentUtil=ERROR
log4j.logger.com.liferay.portlet.mail=WARN
log4j.logger.com.liferay.portlet.messageboards.pop.MessageListenerImpl=ERROR
log4j.logger.com.liferay.portlet.messageboards.service.impl.MBCategoryLocalServiceImpl=ERROR
log4j.logger.com.liferay.portlet.messageboards.service.impl.MBMessageLocalServiceImpl=ERROR
log4j.logger.com.liferay.portlet.messageboards.util.MBUtil=ERROR
log4j.logger.com.liferay.portlet.portletconfiguration.action=ERROR
log4j.logger.com.liferay.portlet.shopping.action.PayPalNotificationAction=DEBUG
log4j.logger.com.liferay.portlet.webproxy=INFO
log4j.logger.com.liferay.portlet.wiki.importers=WARN
log4j.logger.com.liferay.samplestruts=INFO
log4j.logger.com.liferay.sampletest=INFO
log4j.logger.com.liferay.testhook=INFO
log4j.logger.com.liferay.util.JNDIUtil=ERROR
log4j.logger.com.liferay.util.dao=ERROR
log4j.logger.com.liferay.util.dao.orm.CustomSQLUtil=INFO
log4j.logger.com.liferay.util.mail=WARN
log4j.logger.com.liferay.util.portlet.PortletRequestUtil=INFO
log4j.logger.com.liferay.util.servlet.ServletRequestUtil=INFO
log4j.logger.com.liferay.util.servlet.ServletResponseUtil=ERROR
log4j.logger.com.mchange=WARN
log4j.logger.com.opensymphony.oscache=ERROR
log4j.logger.com.opensymphony.oscache.plugins.clustersupport.JavaGroupsBroadcastingListener=ERROR
log4j.logger.com.sample=INFO
log4j.logger.com.sun=ERROR
log4j.logger.com.sun.faces=ERROR
log4j.logger.de.hunsicker=ERROR
log4j.logger.de.nava.informa=ERROR
log4j.logger.httpclient.wire=ERROR
log4j.logger.net.htmlparser.jericho=ERROR
log4j.logger.net.sf.ehcache=ERROR
log4j.logger.net.sf.ehcache.config.ConfigurationFactory=INFO
log4j.logger.net.sf.ehcache.config.DiskStoreConfiguration=ERROR
log4j.logger.net.sf.hibernate=ERROR
log4j.logger.org.apache.axis=INFO
log4j.logger.org.apache.bsf=FATAL
log4j.logger.org.apache.commons.digester=ERROR
log4j.logger.org.apache.commons.beanutils=ERROR
log4j.logger.org.apache.commons.fileupload=ERROR
log4j.logger.org.apache.commons.httpclient=ERROR
log4j.logger.org.apache.commons.validator=ERROR
log4j.logger.org.apache.jackrabbit=ERROR
log4j.logger.org.apache.myfaces=ERROR
log4j.logger.org.apache.struts=ERROR
log4j.logger.org.apache.struts.action.RequestProcessor=ERROR
log4j.logger.org.apache.struts.tiles.TilesRequestProcessor=ERROR
log4j.logger.org.apache.velocity=ERROR
log4j.logger.org.apache.xbean=ERROR
log4j.logger.org.hibernate=ERROR
log4j.logger.org.hibernate.event.def.AbstractFlushingEventListener=OFF
log4j.logger.org.hibernate.util.JDBCExceptionReporter=ERROR&lt;a class=&quot;edit-timestamp hide-if-no-js&quot; tabindex=&quot;4&quot; href=&quot;http://blog.holisticon.de/wp-admin/post.php?post=5067&amp;action=edit#edit_timestamp&quot;&gt;Bearbeiten&lt;/a&gt;
log4j.logger.org.jabsorb=ERROR
log4j.logger.org.jgroups=ERROR
log4j.logger.org.openid4java=ERROR
log4j.logger.org.pdfbox=INFO
log4j.logger.org.portletbridge=INFO
log4j.logger.org.quartz=ERROR
log4j.logger.org.springframework=ERROR
</pre>
<p>So, nun werden nur die Nachrichten protokolliert, die auch gewünscht sind. Leider hat diese Konfiguration einen Nachteil, der aber nicht an der Konfiguration selbst liegt, sondern (wieder einmal) an Liferay, denn in Liferay werden manche Nachrichten und Fehler in <em>System.out</em> bzw. <em>System.err</em> geschrieben. Ja, ein solides System in der Version 6.0.6 schreibt schon mal direkt in die Konsole – ganz normal.</p>
<h3>Das Wort zum Abschluss</h3>
<p>Ich hoffe, dass damit dem einen oder anderen geholfen ist. Wenn jemand noch Verbesserungsvorschläge hat oder der Meinung ist, dass das totaler Käse sei, der möge doch bitte einen Kommentar hinterlassen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.holisticon.de/2012/05/liferaytomcat-bundle-logging-mal-richtig/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Holisticon empfiehlt: NoSQL</title>
		<link>http://blog.holisticon.de/2012/04/holisticon-empfiehlt-nosql/</link>
		<comments>http://blog.holisticon.de/2012/04/holisticon-empfiehlt-nosql/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 08:19:23 +0000</pubDate>
		<dc:creator>Enno Thieleke</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[RDBMS]]></category>

		<guid isPermaLink="false">http://blog.holisticon.de/?p=5054</guid>
		<description><![CDATA[Sie fragen sich, was NoSQL ist? Sie möchten wissen, ob NoSQL die richtige Lösung für Ihre Anforderungen ist? Ganz egal, wie tief Sie und ich die Fragestellung ausweiten, ich kann Sie nicht davon abbringen, mehr zu lesen. Holisticon hat in einem Whitepaper (gut: es ist wohl etwas mehr als nur ein Whitepaper) zusammengefasst, was NoSQL [...]]]></description>
			<content:encoded><![CDATA[<p>Sie fragen sich, was NoSQL ist? Sie möchten wissen, ob NoSQL die richtige Lösung für Ihre Anforderungen ist? Ganz egal, wie tief Sie und ich die Fragestellung ausweiten, ich kann Sie nicht davon abbringen, mehr zu lesen.</p>
<p><span id="more-5054"></span>Holisticon hat in einem Whitepaper (gut: es ist wohl etwas mehr als nur ein Whitepaper) zusammengefasst, was NoSQL ist, wo man es ansiedelt und wie man es abgrenzt. Und um auf die einleitende Fragestellung zurückzukommen, es wird Ihnen helfen, diese zu beantworten.</p>
<p>Ja, und wo ist jetzt dieses Whitepaper?<br />
Na, auf unserer Hompage, fein säuberlich kategorisiert – also kurz: <a href="http://holisticon.de/cms/Technologie/NoSQL">hier</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.holisticon.de/2012/04/holisticon-empfiehlt-nosql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drittes Hamburg Web Performance Meetup</title>
		<link>http://blog.holisticon.de/2012/04/drittes-hamburg-web-performance-meetup/</link>
		<comments>http://blog.holisticon.de/2012/04/drittes-hamburg-web-performance-meetup/#comments</comments>
		<pubDate>Mon, 23 Apr 2012 12:28:14 +0000</pubDate>
		<dc:creator>Oliver Ochs</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Technologie]]></category>

		<guid isPermaLink="false">http://blog.holisticon.de/?p=5040</guid>
		<description><![CDATA[Das Hamburg Web Performance Meetup geht in die dritte Runde. Wir treffen uns am kommenden Mittwoch um 19:00 Uhr bei Telefonica (Überseering 33a, Hamburg). Geplant sind wieder zwei Talks: Jan Vogel (DI UNTERNEHMER) und Uwe Beßle (Iteratec) &#8211; Optimierung der &#8220;gefühlten&#8221; Performance &#8211; Web Performance Management für Fortgeschrittene Anhand konkreter Erfahrungen im Umfeld einer der [...]]]></description>
			<content:encoded><![CDATA[<p>Das Hamburg Web Performance Meetup geht in die dritte Runde. Wir treffen uns am kommenden Mittwoch um 19:00 Uhr bei Telefonica (Überseering 33a, Hamburg).</p>
<p><img class="colorbox-5040"  src="http://photos1.meetupstatic.com/photos/event/6/3/1/c/highres_71725372.jpeg" alt="Hamburg Web Performance Group" /></p>
<p>Geplant sind wieder zwei Talks:</p>
<p><strong><a href="https://www.xing.com/profile/Jan_Vogel" target="_blank">Jan Vogel</a> (<a href="http://di-unternehmer.com/" target="_blank">DI UNTERNEHMER</a>) und <a href="https://www.xing.com/profile/Uwe_Bessle" target="_blank">Uwe Beßle</a> (<a href="http://iteratec.de/" target="_blank">Iteratec</a>) &#8211; Optimierung der &#8220;gefühlten&#8221; Performance &#8211; Web Performance Management für Fortgeschrittene</strong></p>
<p>Anhand konkreter Erfahrungen im Umfeld einer der größten eCommerce Sites wird vorgestellt, wie es gelingt, das subjektive Kundenempfinden zum Maßstab für das kontinuierliche Web-Performance-Management der komplexen Anwendungslandschaft einer großen eCommerce-Site zu machen. Dabei wird die Entwicklung und Definition von Ladezeit-Indikatoren und deren Messung mit dem Open Source-Tool WebPagetest beleuchtet. Es wird vorgestellt, wie die Auswirkung von Ladezeiten auf die Kundenzufriedenheit mittels einer Remote-Studie abgeleitet werden kann. Abgerundet wird der Vortrag mit einer Darstellung von Best-Practise-Beispielen bei der Arbeit mit WPT und WPT-Monitor.</p>
<p><strong><a href="https://www.xing.com/profile/Jan_Weinschenker" target="_blank">Jan Weinschenker</a> und <a href="https://www.xing.com/profile/Oliver_Ochs" target="_blank">Oliver Ochs</a> (<a href="http://holisticon.de/" target="_blank">Holisticon AG</a>) &#8211; Building Performance, ein Frontend-Build-Prozess</strong></p>
<p>In diesem Vortrag geht es um eine konkrete Website. Im ersten Teil des Vortrags stellen wir die wichtigsten Optimierungsmaßnahmen vor, die außerhalb eines Builds durchgeführt wurden. Für eine dauerhafte, nachhaltige Performance-Optimierung müssen die Maßnahmen automatisiert bzw. in den Build-Prozess integriert werden. Im zweiten Teil des Vortrags zeigen wir einen beispielhaften Build-Prozess für Java-Webanwendungen, der Teile der Optimierungsmaßnahmen durchführt. Andere Teile müssen durch eine geeignete Architektur sichergestellt werden, wofür wir ebenfalls Ideen liefern.</p>
<p>Das Event ist leider sowohl bei <a href="http://www.meetup.com/Hamburg-Web-Performance-Group/" target="_blank">Meetup.com</a> als auch in der <a href="https://www.xing.com/events/hamburg-web-performance-meetup-1005326" target="_blank">XING-Gruppe</a> bereits ausgebucht.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.holisticon.de/2012/04/drittes-hamburg-web-performance-meetup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Der Kunde im Projekt</title>
		<link>http://blog.holisticon.de/2012/04/der-kunde-im-projekt/</link>
		<comments>http://blog.holisticon.de/2012/04/der-kunde-im-projekt/#comments</comments>
		<pubDate>Thu, 19 Apr 2012 08:23:25 +0000</pubDate>
		<dc:creator>Rolf Dräther</dc:creator>
				<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Rundumsichtig]]></category>
		<category><![CDATA[Agil]]></category>
		<category><![CDATA[Anforderungen]]></category>
		<category><![CDATA[Kunde]]></category>

		<guid isPermaLink="false">http://blog.holisticon.de/?p=4534</guid>
		<description><![CDATA[Der Kunde im Projekt &#8211; ist das wirklich sinnvoll? Schauen wir erst einmal, wie die verschiedenen Projektmanagement-Ansätze damit umgehen. Umgangs-Formen In klassischen Projekten entstehen, ehe die eigentliche Implementierung der Funktionalitäten beginnt, in der Regel mehr oder weniger schwergewichtige Dokumentationen und Feinkonzepte. Das Ziel ist dabei, möglichst genau festzuschreiben, was entwickelt werden soll. Je größer die [...]]]></description>
			<content:encoded><![CDATA[<p>Der Kunde im Projekt &#8211; ist das wirklich sinnvoll? Schauen wir erst einmal, wie die verschiedenen Projektmanagement-Ansätze damit umgehen.</p>
<h3>Umgangs-Formen</h3>
<p>In klassischen Projekten entstehen, ehe die eigentliche Implementierung der Funktionalitäten beginnt, in der Regel mehr oder weniger schwergewichtige Dokumentationen und Feinkonzepte. Das Ziel ist dabei, möglichst genau festzuschreiben, was entwickelt werden soll. Je größer die Vorhaben, desto komplexer sind jedoch die Herausforderungen, und ab einer gewissen Größe können nicht mehr alle Einzelheiten im voraus bedacht und spezifiziert werden. Hinzu kommt, dass das geschriebene Wort interpretierbar und damit missverständlich ist &#8211; wie im übrigen jede Kommunikation. Und: Man kann als Entwickler mit einem Stoß Papier (dem Feinkonzept) schlecht über die konkreten Anforderungen <strong>sprechen</strong>.</p>
<p>Agiles Vorgehen erkennt an, dass <span id="more-4534"></span>sich Anforderungen im Laufe der Zeit ändern können und werden. Das beste, umfangreichste, ausführlichste und feingranularste Konzept kann immer nur einen Schnappschuss des aktuellen Kenntnisstands des Kunden widerspiegeln und schon morgen (oder in einem Monat &#8230;) veraltet sein. Deshalb also direkt ran an die Quelle - und den Kunden ins Projekt geholt!</p>
<p><a href="http://blog.holisticon.de/wp-content/uploads/2012/04/pic_blog_kunde.jpg"><img class="alignright size-full wp-image-5033 colorbox-4534" title="pic_blog_kunde" src="http://blog.holisticon.de/wp-content/uploads/2012/04/pic_blog_kunde.jpg" alt="" width="227" height="137" /></a>Eine der radikalsten Formen findet man &#8211; wie der Name schon nahelegt &#8211; im Ansatz des Extreme Programming. Der Kunde wird zum Teil des Entwicklungsteams und ist permanent und rund um die Uhr für Fragen und Entscheidungen verfügbar. Auf diese Weise kann der Anteil der Vorab-Spezifikation und -Dokumentation extrem reduziert werden.</p>
<p>Nicht ganz so vereinnahmend sind andere agile Herangehensweisen in ihren Ansprüchen an den Kunden. Allen gemein ist jedoch, dass mindestens in festen Abständen (2-4 Wochen) auf der Basis lauffähiger Software-Stände mit dem Kunden das weitere Vorgehen im Projekt abgestimmt wird. Der klassische Schöpfungsakt eines Feinkonzepts wird im agilen Kontext in viele kleine Teilschritte zerlegt. Quasi <em>just in time</em> werden die fein ausspezifizierten Anforderungen geliefert und besprochen. Dies geschieht auf der Basis des aktuellen Projektforschritts.</p>
<p>Offensichtlich ist es also sinnvoll und hilfreich, den Kunden während des Projekts so nahe wie möglich an sich heranzuziehen.<br />
Wie eine solch enge Kooperation zwischen Entwicklern und Kunden aussehen kann, ist mir vor kurzem bei der Supervision eines Scrum-Projekts begegnet.</p>
<p>Das Projekt hatte zur Aufgabe, auf Basis einer bestehenden Anwendung neue Funktionalitäten für vergleichbare Prozesse anderer Bereiche des Unternehmens zu schaffen. Gleichzeitig sollte sich die produktive Anwendung weiterentwickeln. Das hatte zur Folge, dass mehrere Interessengruppen ihre Anforderungen an das neue System formulierten. Wollte man all das im voraus detailliert spezifizieren, wären endlose Diskussionen um nicht verifizierbare Details sicher nicht zu vermeiden.</p>
<h3>Key-User im Scrum-Team</h3>
<p>Um all dem vorzubeugen, wurden in diesem Projekt die Key-User der (bestehenden und der künftigen) Anwendung in das Scrum-Team aufgenommen. Sie nehmen aktiv am Daily Scrum teil, spezifizieren und priorisieren gemeinsam mit dem Product Owner, bauen Testdaten auf, testen im laufenden Sprint die fertig entwickelten Stories und präsentieren am Sprintende im Review &#8216;ihre&#8217; neuen Funktionalitäten. Das sichert eine ungeheuer tiefe Einbeziehung in die Entstehung des Produkts, fördert die Abstimmung zwischen der sich zum Teil widersprechenden Interessen der Stakeholder, schafft ein tiefes Verständnis für die entstehende Anwendung und garantiert eine Verfügbarkeit der fachlichen Ansprechpartner, die beispielhaft ist.<br />
Das ist <strong>&#8216;on-site customer&#8217; at its best</strong>!</p>
<h3>Einbeziehung der Endanwender</h3>
<p>Allerdings &#8211; wie so oft &#8211; schafft die Lösung eines Problems wieder neue. In diesem Fall war es so, dass das Team zunehmend das Gefühl hatte, dass das Review gar kein ausreichendes Kundenfeedback mehr liefert. Durch die tiefe Integration der Key-User, die auch noch selbst präsentierten, war das Review am Ende zu einer internen Veranstaltung des Teams und damit eigentlich überflüssig geworden.</p>
<p>Kann man sich nun die Frage stellen: Wer sind hier eigentlich die Kunden? Sind es wirklich die Key-User? Oder sind es nicht vielmehr die Kollegen der Key-User, also die Endanwender, die später mit der Anwendung arbeiten werden? Hat das Team die &#8216;richtigen&#8217; Kunden im Projekt?</p>
<p>Um wieder ausreichend externes Feedback zu bekommen, entschloss sich das Team, künftig am Sprintende in die Abteilungen der Key-User zu gehen und als Review gezielt vor den Endanwendern zu präsentieren. Ob diese Anpassung den gewünschten Erfolg haben wird? Das Ergebnis des Experiments steht noch aus.</p>
<p><em>Foto: © http://www.sxc.hu/photo/916599</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.holisticon.de/2012/04/der-kunde-im-projekt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

