<?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>Philipps Blog</title>
	<atom:link href="http://www.philipp.haussleiter.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.philipp.haussleiter.de</link>
	<description>my personal Site of Things</description>
	<lastBuildDate>Mon, 30 Jan 2012 22:07:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Testing Play! Applications with HTTP Basic Auth</title>
		<link>http://www.philipp.haussleiter.de/2012/01/testing-play-applications-with-http-basic-auth/</link>
		<comments>http://www.philipp.haussleiter.de/2012/01/testing-play-applications-with-http-basic-auth/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 21:52:03 +0000</pubDate>
		<dc:creator>philipp</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Play! Framework]]></category>

		<guid isPermaLink="false">http://www.philipp.haussleiter.de/?p=1447</guid>
		<description><![CDATA[Um eine Play!-Anwendung zu testen, welche HTTP-Basic-Auth verlangt ist es notwendig, die Standard-Datei ApplicationTest.java anzupassen: Verändert werden muss die Test-Methode testThatIndexPageWorks(): Aus @Test public void testThatIndexPageWorks() { Response response = GET("/"); assertIsOk(response); assertContentType("text/html", response); assertCharset(play.Play.defaultWebEncoding, response); } Wird: @Test public void testThatIndexPageWorks() { Request request = FunctionalTest.newRequest(); request.user = "test"; request.password = "test"; request.url = [...]]]></description>
			<content:encoded><![CDATA[<p>Um eine Play!-Anwendung zu testen, welche <a href="http://de.wikipedia.org/wiki/HTTP-Authentifizierung">HTTP-Basic-Auth</a> verlangt ist es notwendig, die Standard-Datei <em>ApplicationTest.java</em> anzupassen:<br />
Verändert werden muss die Test-Methode <em>testThatIndexPageWorks()</em>:</p>
<p>Aus </p>
<pre>
    @Test
    public void testThatIndexPageWorks() {
        Response response = GET("/");
        assertIsOk(response);
        assertContentType("text/html", response);
        assertCharset(play.Play.defaultWebEncoding, response);
    }
</pre>
<p>Wird:</p>
<pre>
    @Test
    public void testThatIndexPageWorks() {
        Request request = FunctionalTest.newRequest();
        request.user = "test";
        request.password = "test";
        request.url = "/";
        Response response = GET(request, "/");
        assertIsOk(response);
        assertContentType("text/html", response);
        assertCharset("utf-8", response);
    }
</pre>
<p>Wobei User = <em>test</em> und Passwort = <em>test</em>.<br />
Bei allen weiteren Test-Methoden verfährt man analog, oder erstellt sich eine Factory-Methode für den Request.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.philipp.haussleiter.de/2012/01/testing-play-applications-with-http-basic-auth/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Play! Applications und der App-Context</title>
		<link>http://www.philipp.haussleiter.de/2012/01/play-applications-und-der-app-context/</link>
		<comments>http://www.philipp.haussleiter.de/2012/01/play-applications-und-der-app-context/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 20:44:10 +0000</pubDate>
		<dc:creator>philipp</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Play! Framework]]></category>

		<guid isPermaLink="false">http://www.philipp.haussleiter.de/?p=1445</guid>
		<description><![CDATA[Es ist möglich, eine Play!-Anwendung sehr einfach in eine WAR-Struktur zu übertragen und in einen Application-Server zu deployen. Dies ist recht gut unter Deployment options in der Play!-Dokumentation recht gut erklärt. Was hier allerdings verschwiegen wird ist, wie man den notwendigen Context beim Routing konfiguriert. (Der Context ist der Pfad der Anwendung, welcher standardmäßig vom [...]]]></description>
			<content:encoded><![CDATA[<p>Es ist möglich, eine Play!-Anwendung sehr einfach in eine WAR-Struktur zu übertragen und in einen Application-Server zu deployen.<br />
Dies ist recht gut unter <a href="http://www2.playframework.org/documentation/1.2.4/deployment">Deployment options</a> in der Play!-Dokumentation recht gut erklärt. Was hier allerdings verschwiegen wird ist, wie man den notwendigen Context beim Routing konfiguriert. (Der Context ist der Pfad der Anwendung, welcher standardmäßig vom Namen des WAR-Archivs abgeleitet wird, oder per Descriptor konfiguriert wird) &#8211; heißt das Archiv testapp.war ist der Context <em>/testapp</em>.</p>
<p>Innerhalb einer Play!-App muss der Context sowohl in der Config Datei, als auch im Routing definiert werde:</p>
<p>application.conf</p>
<pre>...
context=testapp
...</pre>
<p>Danach lässt sich in der routes Datei der Context in die Routen konfigurieren:</p>
<pre># Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~

%{ context = play.configuration.getProperty('context', '') }%

# Home page
GET     ${context}                                        Application.index
GET     ${context}/                                       Application.index

# Map static resources from the /app/public folder to the /public path
GET     ${context}/public/                                staticDir:public
GET     ${context}/Users/like/{uid}                       Users.like
GET     ${context}/Users/{uid}/show                       Users.show
...</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.philipp.haussleiter.de/2012/01/play-applications-und-der-app-context/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bitcoin Vortrag beim Chaos-BBQ 2011</title>
		<link>http://www.philipp.haussleiter.de/2012/01/bitcoin-vortrag-beim-chaos-bbq-2011/</link>
		<comments>http://www.philipp.haussleiter.de/2012/01/bitcoin-vortrag-beim-chaos-bbq-2011/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 16:00:33 +0000</pubDate>
		<dc:creator>philipp</dc:creator>
				<category><![CDATA[CCC]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[bitcoin]]></category>
		<category><![CDATA[ccc]]></category>

		<guid isPermaLink="false">http://www.philipp.haussleiter.de/?p=1440</guid>
		<description><![CDATA[Im Juli des letzten Jahres habe ich beim Chaos-BBQ in Dortmund einen Vortrag über Bitcoin gehalten. Da ich heute darauf angesprochen worden bin, stelle ich die Slides hier online. 2011-07-10-Bitcoin]]></description>
			<content:encoded><![CDATA[<p>Im Juli des letzten Jahres habe ich beim <a href="http://events.ccc.de/2011/05/11/chaos-bbq-weekend/">Chaos-BBQ in Dortmund</a> einen Vortrag über Bitcoin gehalten.<br />
Da ich heute darauf angesprochen worden bin, stelle ich die Slides hier online.</p>
<p><a href='http://www.philipp.haussleiter.de/wp-content/uploads/2012/01/Bitcoin.pdf'>2011-07-10-Bitcoin</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.philipp.haussleiter.de/2012/01/bitcoin-vortrag-beim-chaos-bbq-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Workstation Vorschlag, Dezember 2011</title>
		<link>http://www.philipp.haussleiter.de/2011/12/workstation-vorschlag-dezember-2011/</link>
		<comments>http://www.philipp.haussleiter.de/2011/12/workstation-vorschlag-dezember-2011/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 21:50:41 +0000</pubDate>
		<dc:creator>philipp</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.philipp.haussleiter.de/?p=1426</guid>
		<description><![CDATA[Vorwort Hallo zusammen, da ich in letzter Zeit von vielen Seiten nach Vorschlägen und Ideen für eine aktuelle Workstation gefragt werde, habe ich mir mal die Zeit genommen, um so ein System unter aktuellen Gegebenheiten zusammen zu stellen: Das System soll folgende Anforderungen erfüllen: Ausreichend Speicher und CPU, um eine oder mehrere Test-VMs neben den [...]]]></description>
			<content:encoded><![CDATA[<h2>Vorwort</h2>
<p>Hallo zusammen,</p>
<p>da ich in letzter Zeit von vielen Seiten nach Vorschlägen und Ideen für eine aktuelle Workstation gefragt werde, habe ich mir mal die Zeit genommen, um so ein System unter aktuellen Gegebenheiten zusammen zu stellen:</p>
<p>Das System soll folgende Anforderungen erfüllen:</p>
<ol>
<li>Ausreichend Speicher und CPU, um eine oder mehrere Test-VMs neben den Entwicklungstools zu betreiben.</li>
<li>Es soll aktuelle Hardware verwendet werden, allerdings sollen die Ausgaben im vertretbaren Rahmen bleiben.</li>
<li>Das System sollte zukänftige Erweiterungen ermöglichen.</li>
</ol>
<p>Anforderungen die das System <strong>nicht</strong> erfüllen soll:</p>
<ol>
<li>Das System bietet keine interne Backupfunktion, d.h. es enthält keinerlei redundantes Raid, oder nutzt separate Backupplatten &#8211; dies lässt sich am besten über externe Laufwerke bewerkstelligen</li>
<li>Keine High-End Maschine, die mit größeren Servern miteifern möchte</li>
<li>Keine High-End Maschine, die mit High-End Gaming Systemen miteifern möchte</li>
</ol>
<h2>Mainboard</h2>
<p>Bei dem Mainboard habe ich mich für das <em><a href="http://ark.intel.com/products/50095/Intel-Desktop-Board-DH67GD">Intel® DH67GDB3</a></em>. Unter anderem bietet es, neben der Unterstützung für die aktuelle Sandy Bridge Architektur, auch weitere Features wie:</p>
<ul>
<li>FW, SATA3, USB 3.0, eSATA</li>
<li>max. 32GB Ram</li>
<li>DVI, HDMI und Display-Port</li>
</ul>
<p style="text-align: center;"><a href="http://www.philipp.haussleiter.de/wp-content/uploads/2011/12/DH67GDB3.jpg"><img class="size-medium wp-image-1428" title="DH67GDB3" src="http://www.philipp.haussleiter.de/wp-content/uploads/2011/12/DH67GDB3-300x300.jpg" alt="" width="300" height="300" /></a><br />
Quelle: http://www.intel.com</p>
<h4>Preis: ca. 100 EUR</h4>
<h2>CPU</h2>
<p>Als CPU habe ich mich &#8211; passend zum Mainboard &#8211; für einen <em><a href="http://ark.intel.com/products/52210/Intel-Core-i5-2500K-Processor-%286M-Cache-3_30-GHz%29">Intel® CoreTM i5-2500K &#8220;Sandy Bridge&#8221;</a></em>. Diese CPU enthält, wie einiger der neueren Modelle, einen Grafikkern, sodass die Ausgänge des Mainboards vollständig unterstütz werden. Weiterhin bietet diese CPU 4 Kerne und alle aktuellen Intel-Befehlserweiterungen. Das ganze mit einem <a href="http://de.wikipedia.org/wiki/Thermal_Design_Power">TDP</a> von 95W. Weiterhin bietet diese CPU einen flexiblen Multiplikator. Damit lässt sich &#8211; rein theoretisch die Taktfreqzenz von 3.3 bis auf 3.7 GHz hochschrauben.</p>
<p style="text-align: center;"><a href="http://www.philipp.haussleiter.de/wp-content/uploads/2011/12/i5-2500K.png"><img class="aligncenter size-medium wp-image-1429" title="i5-2500K" src="http://www.philipp.haussleiter.de/wp-content/uploads/2011/12/i5-2500K-300x300.png" alt="" width="300" height="300" /></a><br />
Quelle: http://www.intel.com</p>
<h4>Preis: ca. 200 EUR</h4>
<h2>Arbeitsspeicher</h2>
<p>Beim Arbeitsspeicher fiel die Wahl auf 16GB (4x4GB) &#8211; unspektakuläre, aber verlässliche &#8211; Bausteine von Kingston. Und zwar zweimal das <em>Kingston ValueRAM DIMM 8 GB DDR3-1333 Kit</em>.<br />
Das dieses System kein <a href="http://de.wikipedia.org/wiki/Fehlerkorrekturverfahren#ECC-_und_Parit.C3.A4tspr.C3.BCfung">ECC</a> unterstützt, lässt sich das Geld hier beim Speicher sparen.</p>
<h4>Preis: ca. 80 EUR</h4>
<h2>Grafikkarte</h2>
<p>Die Grafikkarte ist hier optional, da CPU und Mainboard zusammen, eine ausreichend schnelle Darstellung bieten.</p>
<h2>Festplatte</h2>
<p>Aktuell sicherlich ein heikles Thema, da aufgrund des Hochwasser in Thailand die Festplattenpreise arg angestiegen sind. Das bringt uns in die seltsame Lage, dass <a href="http://de.wikipedia.org/wiki/Solid-State-Drive">SSD</a>s aktuell in einem guten Preis-/Leistungs-Verhältnis zu Festplatten stehen. Ich würde für dieses System demnach eine Mischung aus schneller SSD und kleinerer HDD empfehlen. Meine Wahl fiel hier auf die <em><a href="http://www.intel.com/content/www/us/en/solid-state-drives/solid-state-drives-510-series.html">Intel® 510 Series 2,5&#8243; SSD 120 GB</a></em> und die <em><a href="http://www.wdc.com/en/products/products.aspx?id=110">Western Digital WD3200AAKS 320 GB</a></em>.</p>
<p style="text-align: center;"><a href="http://www.philipp.haussleiter.de/wp-content/uploads/2011/12/WD3200AAKS.jpg"><img class="size-full wp-image-1431" title="WD3200AAKS" src="http://www.philipp.haussleiter.de/wp-content/uploads/2011/12/WD3200AAKS.jpg" alt="" width="300" height="300" /></a><br />
Quelle: http://www.wdc.com</p>
<p style="text-align: center;"><a href="http://www.philipp.haussleiter.de/wp-content/uploads/2011/12/Intel_510.jpg"><img class="aligncenter wp-image-1432" title="Intel_510" src="http://www.philipp.haussleiter.de/wp-content/uploads/2011/12/Intel_510-300x300.jpg" alt="" width="300" height="300" /></a><br />
Quelle: http://www.intel.com</p>
<h4>Preis: ca. 230 EUR (SSD) und 100 EUR (HDD)</h4>
<h2>Laufwerke</h2>
<p>Für die Installation von Software (bis die Nutzung von <a href="http://www.netboot.me/">netboot.me</a> soweit ist) und das Ausliefern von Software-Deployments bietet es sich immer noch an einen DVD-Brenner zu verbauen. Meine Wahl fiel hier auf das <em><a href="http://www.lgsolutions.com/products/digital-storage/optical-disc-drives/dvd-drives-internal/gh22ls70-internal-22x-super-multi-dvd-rewriter">LG GH22LS70</a></em>. Neben den gängigen Funktionen bietet das Laufwerk unter anderem auch <a href="http://de.wikipedia.org/wiki/Lightscribe">Lightscribe</a>, welches &#8211; bei geeigneten Medien &#8211; ein einfaches Beschriften ermöglicht.</p>
<h4>Preis: ca. 25 EUR</h4>
<h2>Gehäuse</h2>
<p>Ich habe mich bei der Auswahl der Komponenten an den alten &#8220;Pizzaschachteln&#8221; (z.B. alte Sun/SGI-Workstations) orientiert. Aktuell teilt sich die Masse an Systemen für Entwickler sowieso in Tower-Workstations oder Notebooks &#8211; von einigen hippen Buden, die iMacs nutzen mal abgesehen. War es bis vor wenigen Jahren noch einigermaßen schwierig ein Gehäuse dieser Bauart von der Stange zu bekommen, gibt es Dank des Trends hin zu HTPC Systemen (Wohnzimmer-Multimedia-Video-Systeme), einie eingermaßen große Auswahl.<br />
Meine Wahl fiel hier auf das <em><a href="http://www.lian-li.com/v2/en/product/product06.php?pr_index=220&amp;cl_index=1&amp;sc_index=25&amp;ss_index=64">Lian Li PC-C37B</a></em>, welches trotz der geringen Abmessungen ein normales ATX-Netzteil, sowie ein Standard Micro-ATX Mainboard aufnehmen kann. Weiterhin sind Steckkarten in halber Bauhöhe möglich.</p>
<p style="text-align: center;"><a href="http://www.philipp.haussleiter.de/wp-content/uploads/2011/12/c37d03.jpg"><img class="size-medium wp-image-1427 aligncenter" title="c37d03" src="http://www.philipp.haussleiter.de/wp-content/uploads/2011/12/c37d03-300x188.jpg" alt="" width="300" height="188" /></a><br />
Quelle: http://www.lian-li.com</p>
<h4>Preis: ca. 100 EUR</h4>
<h2>Netzteil</h2>
<p>Mit 530W ist das <em><a href="http://www.be-quiet.net/be-quiet.net/index.php?StoryID=17&amp;ProductID=43">be quiet! Pure Power L7 530W</a></em> für dieses System vollkommen ausreichend. Zudem belastet es die Umwelt nicht mit störenden Geräuschen und bietet eine stabile Stromversorung.</p>
<p style="text-align: center;"><a href="http://www.philipp.haussleiter.de/wp-content/uploads/2011/12/be_quiet_Pure_Power_L7_530W.jpg"><img class="size-medium wp-image-1430" title="be_quiet!_Pure_Power_L7_530W" src="http://www.philipp.haussleiter.de/wp-content/uploads/2011/12/be_quiet_Pure_Power_L7_530W-300x200.jpg" alt="" width="300" height="200" /></a><br />
Quelle: http://www.be-quiet.net</p>
<h4>Preis: ca. 60 EUR</h4>
<h2>Fazit</h2>
<p>Für knapp 900 EUR bietet das System ausreichend Leistung &#8211; auch für anspruchsvolle Aufgaben. Durch den Kauf von größeren Festplatten, mehr Arbeitsspeicher und das Hinzufügen einer leistungsstarken Grafikkarte, bietet das System auch noch genug Raum für Erweiterungen. Im Preis nicht enthalten ist allerdings die notwendige Peripherie wie Tastatur und Maus, hier empfehle ich persönlich die Standardtastaturen von Cherry, daneben nutze ich schon seit Jahre eine einfache Logitech Kabelmause (MX 310).</p>
<h2>Ein Wort zur Software</h2>
<p>Ich bin seit einiger Zeit begeisterter Nutzer von <em><a href="http://linuxmint.com/">Linux Mint</a></em>. Diese Distribution verbindet die erfolgreichen Sourcen von Ubuntu (aktuell Ubuntu 11.10) mit einem einheitlichen und ansprechbarem Äußeren. Nett ist auch die gute Vorauswahl an installieren Programmen. So ist es zum Beispiel möglich, nach der Installation all seiner Anwendungen, sich ein DVD Image mit allen notwendigen Packages zu erstellen, um im Falle einer Neuinstallation schnell seinen alten Stand wieder zu erhalten.</p>
<p style="text-align: center;"><a href="http://www.philipp.haussleiter.de/wp-content/uploads/2011/12/lisa_light.png"><img class="size-medium wp-image-1434" title="lisa_light" src="http://www.philipp.haussleiter.de/wp-content/uploads/2011/12/lisa_light-300x189.png" alt="" width="300" height="189" /></a><br />
Quelle: http://www.linuxmint.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.philipp.haussleiter.de/2011/12/workstation-vorschlag-dezember-2011/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WIP &#8211; Working in Progress</title>
		<link>http://www.philipp.haussleiter.de/2011/12/wip-working-in-progress/</link>
		<comments>http://www.philipp.haussleiter.de/2011/12/wip-working-in-progress/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 20:23:20 +0000</pubDate>
		<dc:creator>philipp</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Virtualisierung]]></category>

		<guid isPermaLink="false">http://www.philipp.haussleiter.de/?p=1424</guid>
		<description><![CDATA[I just installed OpenIndiana with a ZFS Raid z1 on an old 1HE Rack Server. I was also able to make VirtualBox running . It looks like there will be some fun in the nearer future!]]></description>
			<content:encoded><![CDATA[<p>I just installed <a href="http://openindiana.org">OpenIndiana</a> with a <a href="http://en.wikipedia.org/wiki/ZFS">ZFS</a> Raid z1 on an old 1HE Rack Server. I was also able to make VirtualBox running <img src='http://www.philipp.haussleiter.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . It looks like there will be some fun in the nearer future!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.philipp.haussleiter.de/2011/12/wip-working-in-progress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jenkins/Hudson Password Hash Format</title>
		<link>http://www.philipp.haussleiter.de/2011/11/jenkins-password-hash-format/</link>
		<comments>http://www.philipp.haussleiter.de/2011/11/jenkins-password-hash-format/#comments</comments>
		<pubDate>Sun, 20 Nov 2011 15:37:47 +0000</pubDate>
		<dc:creator>philipp</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://www.philipp.haussleiter.de/?p=1416</guid>
		<description><![CDATA[Nice to know: The Build-In Security Realm of Jenkins/Hudson is based on acegisecurity. The Hash is Sha256 based. For a Salt foo and a password bar , you have to Hash bar{foo} , that&#8217;s then 77ce9123f864f6749a2b2c99b988089c21d33e39247f7b1276dfad01a112f038 (via hashgenerator.de) You find the Hashes in &#60;Jenkins-Dir&#62;/users/&#60;username&#62;/config.xml it is then storred as &#160; &#60;?xml version="1.0" encoding="UTF-8" standalone="yes"?&#62; &#60;user&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Nice to know:</p>
<p>The Build-In Security Realm of Jenkins/Hudson is based on <a href="http://sourceforge.net/projects/acegisecurity">acegisecurity</a>. The Hash is Sha256 based. For a Salt</p>
<pre><em>foo</em></pre>
<p>and a password</p>
<pre><em>bar</em></pre>
<p>, you have to Hash</p>
<pre><em>bar{foo}</em></pre>
<p>, that&#8217;s then</p>
<pre>77ce9123f864f6749a2b2c99b988089c21d33e39247f7b1276dfad01a112f038</pre>
<p>(via <a href="http://www.hashgenerator.de">hashgenerator.de</a>)</p>
<p>You find the Hashes in &lt;Jenkins-Dir&gt;/users/&lt;username&gt;/config.xml</p>
<p>it is then storred as</p>
<p>&nbsp;</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;
&lt;user&gt;
    &lt;fullName&gt;user&lt;/fullName&gt;
    &lt;properties&gt;
        &lt;jenkins.security.ApiTokenProperty&gt;
            &lt;apiToken&gt;…&lt;/apiToken&gt;
        &lt;/jenkins.security.ApiTokenProperty&gt;
        &lt;hudson.model.MyViewsProperty&gt;
            &lt;views&gt;
                &lt;hudson.model.AllView&gt;
                    &lt;owner reference="../../.."/&gt;
                    &lt;name&gt;Alle&lt;/name&gt;
                    &lt;filterExecutors&gt;false&lt;/filterExecutors&gt;
                    &lt;filterQueue&gt;false&lt;/filterQueue&gt;
                    &lt;properties/&gt;
                &lt;/hudson.model.AllView&gt;
            &lt;/views&gt;
        &lt;/hudson.model.MyViewsProperty&gt;
        &lt;hudson.security.HudsonPrivateSecurityRealm_-Details&gt;
            &lt;passwordHash&gt;foo:77ce9123f864f6749a2b2c99b988089c21d33e39247f7b1276dfad01a112f038&lt;/passwordHash&gt;
        &lt;/hudson.security.HudsonPrivateSecurityRealm_-Details&gt;
        &lt;hudson.tasks.Mailer_-UserProperty&gt;
            &lt;emailAddress&gt;mail@example.com&lt;/emailAddress&gt;
        &lt;/hudson.tasks.Mailer_-UserProperty&gt;
    &lt;/properties&gt;
&lt;/user&gt;</pre>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.philipp.haussleiter.de/2011/11/jenkins-password-hash-format/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>maven is not ant</title>
		<link>http://www.philipp.haussleiter.de/2011/11/maven-is-not-ant/</link>
		<comments>http://www.philipp.haussleiter.de/2011/11/maven-is-not-ant/#comments</comments>
		<pubDate>Wed, 09 Nov 2011 23:00:30 +0000</pubDate>
		<dc:creator>philipp</dc:creator>
				<category><![CDATA[Build]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tooling]]></category>

		<guid isPermaLink="false">http://blogs.innoq.com/phl/?p=167</guid>
		<description><![CDATA[Neben vielen berechtigten Kritikpunkten die manch einer dem Build-Tool Maven vorwerfen kann, ist oftmals der falsche Einsatz einer der Hauptgründe für die schlechte Perfomance (d.h. lange Build-Zeiten) die fehlerhafte Nutzung von Maven Features. Oft sieht man, dass Module untereinander durch relative Pfadangaben verknüpft sind. Dies mag bei Ant-Builds ein gängiges Mittel sein, aber wenn man [...]]]></description>
			<content:encoded><![CDATA[<p>Neben vielen berechtigten Kritikpunkten die manch einer dem Build-Tool Maven vorwerfen kann, ist oftmals der falsche Einsatz einer der Hauptgründe für die schlechte Perfomance (d.h. lange Build-Zeiten) die fehlerhafte Nutzung von Maven Features.</p>
<p>Oft sieht man, dass Module untereinander durch relative Pfadangaben verknüpft sind. Dies mag bei Ant-Builds ein gängiges Mittel sein, aber wenn man sich vor Augen hält, dass jeder Modul eines Projektes für sich genommen ausgecheckt und gebaut werden können soll, so ist klar, dass man eine abstractere Art und Weise benötigt, einzelne Module miteinander zu verbinden.</p>
<p>Und auch hierfür eignet sich das Mitte der Dependencies. Zu einem vollständigen (und nützlichem) Maven-Build-System gehört zwangsläufig auch ein (eigenes) funktionierendes Maven-Repository (sei es nun Archiva oder Nexus). So ein Repository dient nicht nur zum Lagern von Artefakten, sondern auch als Dreh- und Angelpunkt der einzelnen Module untereinander.</p>
<p>Nehmen wir an, ein Projekt besitzt folgende Struktur:</p>
<pre>Root
  |-Modul A
  |-Modul B
    |-Modul C</pre>
<p>Nehmen wir weiterhin an, dass Modul A von C abhängt, weil C zum Beispiel XSD Scripte enthält, die separat von einem Fachler aktualisiert werden, aber für die Generierung von Java-Klassen in A benötigt werden.</p>
<p>Würde es nach Ant-Manier gehen, so wäre folgendes denkbar:</p>
<pre>&lt;project&gt;
...
    &lt;build&gt;
        &lt;plugins&gt;
            ...
            &lt;plugin&gt;
                &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
                &lt;artifactId&gt;xmlbeans-maven-plugin&lt;/artifactId&gt;
                &lt;version&gt;2.3.3&lt;/version&gt;
                &lt;executions&gt;
                    &lt;execution&gt;
                        &lt;phase&gt;generate-sources&lt;/phase&gt;
                        &lt;goals&gt;
                            &lt;goal&gt;xmlbeans&lt;/goal&gt;
                        &lt;/goals&gt;
                    &lt;/execution&gt;
                &lt;/executions&gt;
                &lt;inherited&gt;true&lt;/inherited&gt;
                &lt;configuration&gt;
                    ...
                    &lt;schemaDirectory&gt;../B/C/xsd&lt;/schemaDirectory&gt;
                    &lt;classGenerationDirectory&gt;${project.build.directory}/classes&lt;/classGenerationDirectory&gt;
                &lt;/configuration&gt;
            &lt;/plugin&gt;
            ...
        &lt;/plugins&gt;
    &lt;/build&gt;
...
&lt;/project&gt;</pre>
<p>Dies dürfte aber spätestens beim Release Build scheitern, weil hier jedes Modul für das Releas separat innerhalb des eigenen Target-Dirs ausgecheckt wird (spätestens hier kommt es dann mit den relativen Pfaden nicht mehr hin).</p>
<p>Was also tun?<br />
Abhilfe schaft das <a href="http://maven.apache.org/plugins/maven-dependency-plugin/">maven-dependency-plugin</a>, welches dem aktuellen Modul erlaub direkt auf die Daten eines einzelnen Artefacts zugreifen zu können. Damit das Artefact durch das Plugin verarbeitet werden kann, sollte es (logischerweise) auch als Dependency im eingetragen sein. So ist sogar sicher gestellt, dass immer der aktuellste Codestand verwendet wird, denn sollt ein Artefact im Repository neuere sein als das, welches lokal vorgehalten wird, so wird dieses heran gezogen.</p>
<p>Die obige Konfiguration würde sich also wie folgt ändern:</p>
<pre>&lt;project&gt;
...
    &lt;dependencies&gt;
        ...
        &lt;dependency&gt;
            &lt;groupId&gt;com.example&lt;/groupId&gt;
            &lt;artifactId&gt;C&lt;/artifactId&gt;
            &lt;version&gt;${project.version}&lt;/version&gt;
        &lt;/dependency&gt;
        ...
    &lt;/dependencies&gt;
    &lt;build&gt;
        &lt;plugins&gt;
            ...
            &lt;plugin&gt;
                &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
                &lt;artifactId&gt;maven-dependency-plugin&lt;/artifactId&gt;
                &lt;version&gt;2.3&lt;/version&gt;
                &lt;executions&gt;
                    &lt;execution&gt;
                        &lt;id&gt;src-dependencies&lt;/id&gt;
                        &lt;phase&gt;generate-sources&lt;/phase&gt;
                        &lt;goals&gt;
                            &lt;!-- use copy-dependencies instead if you don't want to explode the
                                sources --&gt;
                            &lt;goal&gt;unpack&lt;/goal&gt;
                        &lt;/goals&gt;
                        &lt;configuration&gt;
                            &lt;artifactItems&gt;
                                &lt;artifactItem&gt;
                                    &lt;groupId&gt;com.example&lt;/groupId&gt;
                                    &lt;artifactId&gt;C&lt;/artifactId&gt;
                                    &lt;version&gt;${project.version}&lt;/version&gt;
                                    &lt;classifier&gt;resources&lt;/classifier&gt;
                                    &lt;type&gt;zip&lt;/type&gt;
                                    &lt;includes&gt;**/*.xsd&lt;/includes&gt;
                                    &lt;overWrite&gt;true&lt;/overWrite&gt;
                                    &lt;outputDirectory&gt;${project.build.directory}/C&lt;/outputDirectory&gt;
                                &lt;/artifactItem&gt;
                            &lt;/artifactItems&gt;
                        &lt;/configuration&gt;
                    &lt;/execution&gt;
                &lt;/executions&gt;
            &lt;/plugin&gt;            
            &lt;plugin&gt;
                &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
                &lt;artifactId&gt;xmlbeans-maven-plugin&lt;/artifactId&gt;
                &lt;version&gt;2.3.3&lt;/version&gt;
                &lt;executions&gt;
                    &lt;execution&gt;
                        &lt;phase&gt;generate-sources&lt;/phase&gt;
                        &lt;goals&gt;
                            &lt;goal&gt;xmlbeans&lt;/goal&gt;
                        &lt;/goals&gt;
                    &lt;/execution&gt;
                &lt;/executions&gt;
                &lt;inherited&gt;true&lt;/inherited&gt;
                &lt;configuration&gt;
                    ...
                    &lt;schemaDirectory&gt;${project.build.directory}/C/xsd&lt;/schemaDirectory&gt;
                    &lt;classGenerationDirectory&gt;${project.build.directory}/classes&lt;/classGenerationDirectory&gt;
                &lt;/configuration&gt;
            &lt;/plugin&gt;
            ...
        &lt;/plugins&gt;
    &lt;/build&gt;
...
&lt;/project&gt;</pre>
<p>Zu beachten ist hier, dass die Reihenfolge der beiden Plugins wichtig ist, weil ansonsten die Code-Generierung nicht auf die entpackten Dateien der Dependency zugreifen kann. Ich gebe zu, es handelt sich hier um ein einfaches Beispiel, aber zumindest der Drang, sich durch relative Pfade innerhalb von Maven-Files zu helfen ist meiner Beobachtung nach recht weit verbreitet :-/.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.philipp.haussleiter.de/2011/11/maven-is-not-ant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Upload von Third-Party Artefakten in ein Maven Repository per SCP</title>
		<link>http://www.philipp.haussleiter.de/2011/11/upload-von-third-party-artefakten-in-ein-maven-repository-per-scp/</link>
		<comments>http://www.philipp.haussleiter.de/2011/11/upload-von-third-party-artefakten-in-ein-maven-repository-per-scp/#comments</comments>
		<pubDate>Sun, 06 Nov 2011 17:50:40 +0000</pubDate>
		<dc:creator>philipp</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.philipp.haussleiter.de/?p=1412</guid>
		<description><![CDATA[Manchmal gibt es den Fall, dass es notwendig ist, eine externe Bibliothek in einem Maven Projekt einzubinden. Um nun im Build Zyklus des Maven-Projektes keinen Bruch zu erhalten bietet es sich an, dass Artefakt manuell als Maven Artefakt im Repository zur Verfügung zu stellen. Wir benutzen bei consolving.de u.a. ein öffentliches Maven Repository ( maven.javastream.de [...]]]></description>
			<content:encoded><![CDATA[<p>Manchmal gibt es den Fall, dass es notwendig ist, eine externe Bibliothek in einem Maven Projekt einzubinden. Um nun im Build Zyklus des Maven-Projektes keinen Bruch zu erhalten bietet es sich an, dass Artefakt manuell als Maven Artefakt im Repository zur Verfügung zu stellen.</p>
<p>Wir benutzen bei consolving.de u.a. ein öffentliches Maven Repository ( maven.javastream.de ) in dem wir einige OSS Artefakte den Entwicklern unter unseren Kunden zur Verfügung stellen. Hierbei handelt es sich nicht um ein vollständiges Repository System wie Archiva oder Nexus, sondern um ein lokales Repositry, welche statisch per Web-Server zur Verfügung stellt wird. Das ganze wird befüllt durch einen Jenkins-CI Server, der im Hintergrund alle Projekte periodisch neu dorthin deployed.</p>
<p>Es sind vier Schritte notwendig damit ein Deployment über SCP möglich ist:</p>
<ol>
<li>Das Verzeichnis des Repositories muss per scp erreichbar sein &#8211; hierzu bietet es sich an, den SSH-Key auf dem Server zu hinterlegen.</li>
<li>Einrichten der notwendigen Credentials unter der ~/.m2/settings.xml
<pre>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;
&lt;settings&gt;
     &lt;servers&gt;
         &lt;server&gt;
             &lt;id&gt;maven.javastream.de&lt;/id&gt;
             &lt;username&gt;##user##&lt;/username&gt;
             &lt;privateKey&gt;##user##&lt;/privateKey&gt;
         &lt;/server&gt;
     &lt;/servers&gt;
 &lt;/settings&gt;</pre>
</li>
<li>Vorbereiten des Third-Parts Projektes<br />
Ein vollständiges Maven-Artefakt besteht aus drei Teilen: 1. das Binary, 2. die Sourcen und 3. die JavaDoc Dateien. Alle drei Teile sollten als JAR gepackt werden.<br />
Nachfolgend ein Script, welches die drei notwendigen Teile in Archive packt:</p>
<pre>#!/bin/bash

# Direkt aus dem Directory zu packen scheint die einzige Möglichkeit zu sein, dass die einzelnen Dateien direkt im Root des JARs liegen.
cd src
jar -c . &gt; ../src.jar
cd ..

cd doc
jar -c . &gt; ../doc.jar
cd .

cd lib
jar -c . &gt; ../lib.jar
cd .</pre>
</li>
<li>Zuletzt werden nun die drei JARs per Maven-Command in das Repository geladen:
<pre>#!/bin/bash

#Binary
mvn deploy:deploy-file -DgroupId=de.javastream \
  -DartifactId=example \
  -Dversion=1.0 \
  -Dpackaging=jar \
  -Dfile=lib.jar \
  -DrepositoryId=maven.javastream.de \
  -Durl=scp://maven.javastream.de/home/javastream.de/maven

# Javadoc
mvn deploy:deploy-file -DgroupId=de.javastream \
  -DartifactId=example \
  -Dversion=1.0 \
  -Dclassifier=javadoc \
  -Dpackaging=jar \
  -Dfile=doc.jar \
  -DrepositoryId=maven.javastream.de \
  -Durl=scp://maven.javastream.de/home/javastream.de/maven

# Sourcen
mvn deploy:deploy-file -DgroupId=de.javastream \
  -DartifactId=example \
  -Dversion=1.0 \
  -Dclassifier=sources \
  -Dpackaging=jar \
  -Dfile=src.jar \
  -DrepositoryId=maven.javastream.de \
  -Durl=scp://maven.javastream.de/home/javastream.de/maven</pre>
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.philipp.haussleiter.de/2011/11/upload-von-third-party-artefakten-in-ein-maven-repository-per-scp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Play! Framework Model, View &amp; Controller</title>
		<link>http://www.philipp.haussleiter.de/2011/10/play-framework-model-view-controller/</link>
		<comments>http://www.philipp.haussleiter.de/2011/10/play-framework-model-view-controller/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 22:19:32 +0000</pubDate>
		<dc:creator>philipp</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Play! Framework]]></category>

		<guid isPermaLink="false">http://www.philipp.haussleiter.de/?p=1404</guid>
		<description><![CDATA[Im letzten Post wurde eine kurze Beschreibung in den Aufbau einer Play! Anwendung gegeben. Nachfolgend soll eine einfache kleine Anwendung erstellt werden. Die Anwendung soll die Links von verschiedenen Webseiten als Bookmarks speichern. Hierzu benötigen wir ein Model für ein Bookmark: package models; import java.util.Date; import javax.persistence.Entity; import javax.persistence.Temporal; import javax.persistence.TemporalType; import play.data.validation.Required; import play.db.jpa.Model; [...]]]></description>
			<content:encoded><![CDATA[<p>Im letzten Post wurde eine kurze Beschreibung in den Aufbau einer Play! Anwendung gegeben.<br />
Nachfolgend soll eine einfache kleine Anwendung erstellt werden.</p>
<p><img src="http://www.philipp.haussleiter.de/wp-content/uploads/2011/10/MVC.png" alt="App1: Model, Views, Controller" /></p>
<p>Die Anwendung soll die Links von verschiedenen Webseiten als Bookmarks speichern.<br />
Hierzu benötigen wir ein Model für ein Bookmark:</p>
<pre>package models;

import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import play.data.validation.Required;
import play.db.jpa.Model;
@Entity
public class Bookmark extends Model {
    @Temporal(TemporalType.DATE)
    public Date createdAt;
    @Required
    public String title;
    @Required
    public String url;
    public Bookmark(){
        createdAt = new Date();
    }
}</pre>
<p>Wie der geneigte Java-Entwickler auf den ersten Blick erkennen mag, handelt es sich um ein normales JPA Model. Einzig der public Accessor für die einzelnen Attribute erscheint befremdlich.<br />
Zur Beruhigung sei gesagt, dass hier eine der Vereinfuchungen von Play! in Aktion tritt. Zur Laufzeit werden hier die notwendigen Getter/Setter erstellt (diese können aber auch selbst definiert werden), sowie der direkte Zugriff auf die Attribut verhindert. (vgl. http://www.playframework.org/documentation/1.2.3/model#properties ).</p>
<p>Weiterhin unbekannt ist hier die Anotation @Required. Play! unterstützt hier eine on-Model-Validation. Das Attribut wird als Required gekennzeichnet, es ist also notwendig, dass diese Attribut zu Persistierung gesetzt ist. Wie die Validierung im Controller verwendet wird, dazu später mehr.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.philipp.haussleiter.de/2011/10/play-framework-model-view-controller/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Startup mit dem Play Framework</title>
		<link>http://www.philipp.haussleiter.de/2011/08/startup-mit-dem-play-framework/</link>
		<comments>http://www.philipp.haussleiter.de/2011/08/startup-mit-dem-play-framework/#comments</comments>
		<pubDate>Thu, 11 Aug 2011 20:50:07 +0000</pubDate>
		<dc:creator>philipp</dc:creator>
				<category><![CDATA[Edu]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Play! Framework]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.philipp.haussleiter.de/?p=1392</guid>
		<description><![CDATA[Wie einige vielleicht ja schon wissen beschäftige ich mich jetzt schon seit einige Zeit mit dem recht neuen, aber mittlerweile immer bekannterem, Java-basiertem Web-Framework Play!. Anders als bei vielen neueren Frameworks wird nicht durch die Mittel einer dynamischen Sprache, sondern durch die Vereinfachung der bestehenden Sprachmittel von java versucht die Entwicklung einer Web-Anwendung zu beschleunigen [...]]]></description>
			<content:encoded><![CDATA[<p>Wie einige vielleicht ja schon wissen beschäftige ich mich jetzt schon seit einige Zeit mit dem recht neuen, aber mittlerweile immer bekannterem, Java-basiertem Web-Framework <a href="http://www.playframework.org">Play!</a>. Anders als bei vielen neueren Frameworks wird nicht durch die Mittel einer dynamischen Sprache, sondern durch die Vereinfachung der bestehenden Sprachmittel von java versucht die Entwicklung einer Web-Anwendung zu beschleunigen und zu vereinfachen. Das bedeuten unter anderem das konsequente Weglassen der bisherigen Package-Struktur. Auf der anderen Seite werden altbewährte Bibliotheken aus der Java-Welt verwendet (z.B. JPA, Hibernate, Lucene, usw.). Da es eine ganze Menge an englischsprachigen Tutorials gibt und ich mir schon länger vorgenommen habe in einem kleinen Tutorial die grundlegenden Züge einer Play!-Anwendung zu beschreiben, wird dieser Text mal wieder in Deutsch sein <img src='http://www.philipp.haussleiter.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<p>Play verwendet &#8211; wie fast alle aktuellen Web-Frameworks ein <a href="http://de.wikipedia.org/wiki/Model_View_Controller">MVC-Pattern</a>,</p>
<p>So sollte es einem Entwickler (egal ob Ruby, Java oder Python), der mit der aktuellen Techniken vertraut ist, relativ leicht fallen, sich mit dem typischen Aufbaue einer Play-Anwendung zurecht zu finden.</p>
<p>Die Installation des Frameworks ist auf <a href="http://www.playframework.org/documentation/1.2.2/install">der Seite des Projektes</a> gut erklärt. Neben einer aktuellen JVM sind keine weiteren Vorausetzungen zu erfüllen. Wichtig ist nur, dass das &#8220;play&#8221; Script im aktuellen Pfad erreichbar ist.</p>
<p>Nachfolgend möchte ich eine kleine Bookmark-Verwaltung erstellen.</p>
<p>Mit einem</p>
<p># play new bookmarks</p>
<p>Wird die Grundstruktur einer Play-Anwendung erstellt.</p>
<p><img src="http://www.philipp.haussleiter.de/wp-content/uploads/2011/08/FolderListing.png" alt="Folder Structure" /></p>
<p>Das oberste Verzeichnis enthält alle Modelle, Controller und Views der Anwendung (dazu später mehr). Unter &#8220;conf&#8221; befinden sich folgende Dateien:</p>
<p>- application.conf: Konfiguration der Anwendung &#8211; Art der DB, Caching, Konfiguration der Module<br />
- dependencies.yml: Play unterstützt Module, die verschiedene Funktionen kapseln können. Seit Version 1.2 werden die Abhängigkeiten einer Anwendung durch Einträge in dieser Datei gesetzt.<br />
- messages: Diese Datei wird für die Internationalisierung einer Anwendung benötigt (amerikanische Strings). Um eine neue Sprache hinzu zu fügen legt man eine neue Datei mit dem entsprechenden Ländercode an &#8211; z.B. messages.de für deutsch.<br />
- routes: Play ermöglicht es, durch Einträge in dieser Datei, das Routing der Anwendung zu beeinflussen. Es erfolgt ein Mapping von URL auf Controller-Actions (dazu später mehr).</p>
<p>Das lib Verzeichnis kann verwendet werden um Java Libs zu verwenden, die nicht als Modul für Play! zur Verfügung stehen. Alle Jars im libs-Verzeichnis werden automatisch in den Classpath der Anwendung aufgenommen.</p>
<p>Das test Verzeichnis enthält die die Testdateien (Junit-/Selenium-Tests sowie ew. Fixures mit Testdaten).</p>
<p>Nach dem ersten Start der Anwendung werden noch zwei weitere Verzeichnisse erstellt:<br />
Ein tmp-Verzeichnis (welches die kompilierten Klassen, sowie Caching Dateien enthält) und ein<br />
db-Verzeichnis, welches bei der Wahl einer h2 Datenbank, die entsprechende Datenkbankdatei enthält (auch dazu später mehr).</p>
<p>Dies soll für die ersten 5 Minuten genügen <img src='http://www.philipp.haussleiter.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.philipp.haussleiter.de/2011/08/startup-mit-dem-play-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

