<?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>PINC-Blog</title>
	<atom:link href="http://www.pincservices.de/wordpress/feed" rel="self" type="application/rss+xml" />
	<link>http://www.pincservices.de/wordpress</link>
	<description></description>
	<lastBuildDate>Thu, 04 Mar 2010 19:21:36 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Griffon: Mit einem &#8220;Flügelschlag&#8221; außer Gefecht gesetzt</title>
		<link>http://www.pincservices.de/wordpress/griffon-mit-einem-flugelschlag-auser-gefecht-gesetzt</link>
		<comments>http://www.pincservices.de/wordpress/griffon-mit-einem-flugelschlag-auser-gefecht-gesetzt#comments</comments>
		<pubDate>Thu, 04 Mar 2010 19:20:28 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.pincservices.de/wordpress/?p=438</guid>
		<description><![CDATA[Es gibt ein Sprichwort: &#8220;Kleinchen heb die Beinchen jetzt kommen Steinchen&#8221;. So geschehen bei mir, als ich das erste Mal Griffon unter Windows ausprobieren wollte.
Es ließ sich Partout nicht starten und belegte mich mit der Meldung, dass meine &#8220;JAVA_HOME&#8221;-Variable auf ein invalides Verzeichnis verweisen würde. Leider konnte ich auf dem System nicht die JAVA_HOME direkt [...]]]></description>
			<content:encoded><![CDATA[<p>Es gibt ein Sprichwort: &#8220;Kleinchen heb die Beinchen jetzt kommen Steinchen&#8221;. So geschehen bei mir, als ich das erste Mal Griffon unter Windows ausprobieren wollte.</p>
<p>Es ließ sich Partout nicht starten und belegte mich mit der Meldung, dass meine &#8220;JAVA_HOME&#8221;-Variable auf ein invalides Verzeichnis verweisen würde. Leider konnte ich auf dem System nicht die JAVA_HOME direkt ändern, sondern musste diese in den Umgebungsvariablen des Benutzers &#8220;überschreiben&#8221;. Ist dann schon etwas unschön, aber gut &#8211; es ging erstmal ans Werk.</p>
<p>Nun ist man ja als alteingesessener Java-Entwickler daran gewöhnt, dass Pfade mit Leerzeichen nie gut ankommen. Also 1. Versuch: Leerzeichen entfernen &#8211; Kein Erfolg. Einmal ist keinmal, also nächster Versuch: Suchmaschine bemühen &#8211; wenig Erfolg. </p>
<p>Die Suche gab zwar nicht die vollständige Antwort, aber zumindest einen Anhaltspunkt. Der abschließende Backslash im Pfad könnte ein Problem sein. Zwar führte dieser Ansatz erstmal zu einem gewissen Erfolg, aber einfach mal eine Systemvariable überschreiben &#8211; auch wenn es nicht so große Unterschiede gab &#8211; fand ich nicht so &#8220;prickelnd&#8221;. Darum kam am Ende der Texteditor zum Einsatz, denn mir war aufgefallen, dass Groovy selbst z.B. keine Probleme mit dem Pfad hatte.</p>
<p>Und da war sie &#8211; die Lösung, die ich gesucht hatte:</p>
<pre class="brush: plain;">
@rem Remove trailing slash from JAVA_HOME if found
if &quot;%JAVA_HOME:~-1%&quot;==&quot;\&quot; SET JAVA_HOME=%JAVA_HOME:~0,-1%
</pre>
<p>Mit dieser Zeile wird einfach das abschließende Backslash entfernt. Diese Zeile in die <code>startGriffon.bat</code> unter <code>:have_JAVA_HOME</code> geschrieben und plötzlich funktioniert es auch mit dem Greif.</p>
<pre class="brush: plain;">
:have_JAVA_HOME
if &quot;%JAVA_HOME:~-1%&quot;==&quot;\&quot; SET JAVA_HOME=%JAVA_HOME:~0,-1%
@rem Validate JAVA_HOME
%COMMAND_COM% /C DIR &quot;%JAVA_HOME%&quot; 2&gt;&amp;1 | %FIND_EXE% /I /C &quot;%JAVA_HOME%&quot; &gt;nul
</pre>
<p>Leider wurde das Problem auch in der aktuellen Version 0.3 nicht gefixt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pincservices.de/wordpress/griffon-mit-einem-flugelschlag-auser-gefecht-gesetzt/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trac-Themes</title>
		<link>http://www.pincservices.de/wordpress/trac-themes</link>
		<comments>http://www.pincservices.de/wordpress/trac-themes#comments</comments>
		<pubDate>Thu, 28 Jan 2010 21:38:12 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Projektverwaltung]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[Werkzeuge]]></category>
		<category><![CDATA[htdocs_location]]></category>
		<category><![CDATA[Templates]]></category>
		<category><![CDATA[themes]]></category>
		<category><![CDATA[Trac]]></category>

		<guid isPermaLink="false">http://www.pincservices.de/wordpress/?p=410</guid>
		<description><![CDATA[2 Jahre ist es jetzt in etwa her, dass ich einen Artikel über Eigene Templates in Trac geschrieben habe. Seitdem ist ein wenig passiert. Diesen Änderungen möchte ich hiermit Rechnung tragen. Ich habe das ganze Trac-Themes genannt, weil es weniger um Templating an sich gehen soll, sondern eher um eine Möglichkeit gemeinsame Styles festlegen zu [...]]]></description>
			<content:encoded><![CDATA[<p>2 Jahre ist es jetzt in etwa her, dass ich einen Artikel über <a href="http://www.pincservices.de/wordpress/eigene-templates-in-trac" onclick="return TrackClick('http%3A%2F%2Fwww.pincservices.de%2Fwordpress%2Feigene-templates-in-trac','Eigene+Templates+in+Trac')">Eigene Templates in Trac</a> geschrieben habe. Seitdem ist ein wenig passiert. Diesen Änderungen möchte ich hiermit Rechnung tragen. Ich habe das ganze Trac-Themes genannt, weil es weniger um Templating an sich gehen soll, sondern eher um eine Möglichkeit gemeinsame Styles festlegen zu können.</p>
<p>Leider ist es mit Trac immer noch nicht möglich unter einem Environment mehrere Projekte bzw. Repositories laufen zu lassen. Darum wird für jedes Projekt eine eigene Trac-Umgebung angelegt. Wichtig hierbei ist insbesondere für Firmen, dass alle Projekte zumindest in der Grundstruktur gleich aussehen und die Firmenfarben tragen.</p>
<h3>&#8220;&#8230; was bisher geschah&#8221;</h3>
<p>Wer zuerst probieren will, wie und was er alles anpassen kann, sollte sich das Verzeichnis <code>templates</code> unterhalb seiner Trac-Umgebung anschauen. Standardmäßig liegt dort die Datei <code>site.html</code>. Wenn man sie das erste Mal aufmacht, kommt sie sehr unscheinbar daher, denn wie man sieht, sieht man nichts. Nur einen <code>html</code>-Tag und ein paar unbekannt anmutende Python-Attribute.<br />
Auf der Seite <a href="http://trac.edgewall.org/wiki/TracInterfaceCustomization" onclick="return TrackClick('http%3A%2F%2Ftrac.edgewall.org%2Fwiki%2FTracInterfaceCustomization','http%3A%2F%2Ftrac.edgewall.org%2Fwiki%2FTracInterfaceCustomization')">http://trac.edgewall.org/wiki/TracInterfaceCustomization</a> ist glücklicherweise bereits ein Beispiel-Code für den Inhalt dieser Datei. Für jene, die gerne lieber mehrere Dateien nutzen wollen hier gleich die Anpassung mit Einbindung externer Dateien:</p>
<pre class="brush: xml;">
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;
      xmlns:py=&quot;http://genshi.edgewall.org/&quot;
      xmlns:xi=&quot;http://www.w3.org/2001/XInclude&quot;
      py:strip=&quot;&quot;&gt;

  &lt;!--! Add site-specific style sheet --&gt;
  &lt;head py:match=&quot;head&quot; py:attrs=&quot;select('@*')&quot;&gt;
    ${select('*|comment()|text()')}
    &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot;
          href=&quot;${href.chrome('common/style.css')}&quot; /&gt;
  &lt;/head&gt;

  &lt;body py:match=&quot;body&quot; py:attrs=&quot;select('@*')&quot;&gt;
    &lt;!--! Add site-specific header --&gt;
    &lt;div id=&quot;siteheader&quot;&gt;
       &lt;xi:include href=&quot;site_header.cs&quot;&gt;
         &lt;xi:fallback /&gt;
       &lt;/xi:include&gt;
    &lt;/div&gt;

    ${select('*|text()')}

    &lt;!--! Add site-specific footer --&gt;
    &lt;div id=&quot;sitefooter&quot;&gt;
      &lt;xi:include href=&quot;site_footer.cs&quot;&gt;
        &lt;xi:fallback /&gt;
      &lt;/xi:include&gt;
    &lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Interessanterweise funktioniert das einfache Anlegen einer <code>site_header.cs</code> und <code>site_footer.cs</code> nicht immer &#8211; bzw. bei mir hat das noch nie funktioniert -, wie es auf manchen Seiten beschrieben wird.<br />
Mit diesem Grundgerüst ausgestattet lässt sich schon anfangen herumzuspielen. Für weiterführende Informationen zu Genshi und Clearsilver &#8211; den Engines im Hintergrund &#8211; sei auf folgende Seiten verwiesen:</p>
<ul>
<li><a href="http://genshi.edgewall.org/" onclick="return TrackClick('http%3A%2F%2Fgenshi.edgewall.org%2F','http%3A%2F%2Fgenshi.edgewall.org%2F')">http://genshi.edgewall.org/</a></li>
<li><a href="http://www.clearsilver.net/docs/" onclick="return TrackClick('http%3A%2F%2Fwww.clearsilver.net%2Fdocs%2F','http%3A%2F%2Fwww.clearsilver.net%2Fdocs%2F')">http://www.clearsilver.net/docs/</a></li>
</ul>
<h3>Neue und alte Freunde</h3>
<p>Ein altbekannter Helfer beim Erstellen von Templates ist auch in der Version 0.11.5 noch vorhanden. Der Konfigurationsparameter <code>template_dir</code>.</p>
<pre class="brush: plain;">
[inherit]
template_dir=
</pre>
<p>Mit diesem Parameter lässt sich das Verzeichnis für die Templates festlegen und wodurch verschiedene Seiten mit ein und demselben Template ausgestattet werden können.</p>
<p>Daneben ist ein neuer Freund dazugekommen der Parameter <code>htdocs_location</code>. Mit diesem Parameter werden alle internen URLs, die mit &#8220;common/&#8221; beginnen in die URL umgeschrieben, die als Wert angegeben wurde.</p>
<pre class="brush: plain;">
[trac]
htdocs_location=http://localhost/mytemplate
</pre>
<p>Führt, dazu, dass aus</p>
<pre class="brush: xml; gutter: false;">
&lt;link rel=&quot;stylesheet&quot; href=&quot;/trac/templating/chrome/common/css/trac.css&quot; type=&quot;text/css&quot; /&gt;
</pre>
<p>folgendes wird</p>
<pre class="brush: xml; gutter: false;">
&lt;link rel=&quot;stylesheet&quot; href=&quot;http://localhost/mytemplate/css/trac.css&quot; type=&quot;text/css&quot; /&gt;
</pre>
<p><strong>Achtung!</strong> Leider hat die Sache einen Haken. Eigene Links aus der <code>site.html</code> werden nicht übersetzt. Der folgende Code</p>
<pre class="brush: plain; gutter: false;">
${href.chrome('common/style.css')}
</pre>
<p>wird nur in <code>"/trac/templating/chrome/common/style.css"</code> umgewandelt, aber nicht weiter.</p>
<p>Wichtig ist außerdem zu beachten, dass <code>htdocs_location</code> nur für statische Inhalte, wie Bilder, JavaScript- und CSS-Dateien gedacht ist. Templates werden nicht automatisch von dort erkannt. Diese müssen explizit über <code>template_dir</code> konfiguriert werden. Leider ist es hier nur möglich lokale Verzeichnisse zu setzen. Wer z.B. versucht eine Internetadresse anzugeben, bekommt zwar keine Fehlermeldung, wird aber mit einem Standard-Template &#8220;belohnt&#8221;.</p>
<p>Abschließend möchte ich sagen, dass &#8211; gefühlt &#8211; wesentlich mehr über die <code>trac.ini</code> konfigurierbar ist, als es noch vor 2 Jahren der Fall war. Das macht definitiv Lust auf mehr, aber dennoch bleibt das ein oder andere noch zu tun.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pincservices.de/wordpress/trac-themes/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recipe: Apache 2 mit Tomcat 6 auf Ubuntu 9.10 für &#8220;Gourmets&#8221;</title>
		<link>http://www.pincservices.de/wordpress/recipe-apache-2-mit-tomcat-6-auf-ubuntu-9-10-fur-gourmets</link>
		<comments>http://www.pincservices.de/wordpress/recipe-apache-2-mit-tomcat-6-auf-ubuntu-9-10-fur-gourmets#comments</comments>
		<pubDate>Sat, 23 Jan 2010 10:43:11 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[mod_jk]]></category>
		<category><![CDATA[tomcat]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.pincservices.de/wordpress/?p=395</guid>
		<description><![CDATA[Das folgende Thema wurde schon an diversen Stellen mehr oder minder explizit beschrieben. Allerdings noch nicht aus meiner Sicht.
Was mir bei den meisten Howtos aufgefallen ist, dass sie schlechte Wartbarkeit hervorrufen und/oder irgendwas vergessen. Darum jetzt mein Versuch die Konfigurationsdateien der Welt unlesbar zu machen.
Die &#8220;Speisekarte&#8221; oder &#8220;Was will ich eigentlich&#8221;?
Tja. Für den einen oder anderen [...]]]></description>
			<content:encoded><![CDATA[<p>Das folgende Thema wurde schon an diversen Stellen mehr oder minder explizit beschrieben. Allerdings noch nicht aus meiner Sicht.</p>
<p>Was mir bei den meisten Howtos aufgefallen ist, dass sie schlechte Wartbarkeit hervorrufen und/oder irgendwas vergessen. Darum jetzt mein Versuch die Konfigurationsdateien der Welt unlesbar zu machen.</p>
<h2>Die &#8220;Speisekarte&#8221; oder &#8220;Was will ich eigentlich&#8221;?</h2>
<p>Tja. Für den einen oder anderen gezielten Sucher ist das schon klar, aber nochmal kurz für jene, die nur zufällig hier sind. Ich möchte in meiner URL nicht mehr <em>http://localhost:8080</em> eingeben müssen um auf meinen Tomcat zu gelangen, sondern nur noch sowas wie <em>http://tomcat.localhost</em>. Ich hätte jetzt auch sagen können <em>http://localhost</em>, aber das wäre gelogen.</p>
<h2>Installation der einzelnen Komponenten</h2>
<p>Für die Installation nehme man eine Maus, Synaptic Paketverwaltung und zwei aussagekräftige Suchbegriffe wie tomcat6 und apache2. Für die Verknüpfung der beiden ist dann noch das Paket <code>libapache2-mod-jk</code> notwendig. Man würze das ganze mit einer Prise &#8220;Anwenden&#8221; und violá Apache 2 und Tomcat 6 sind installiert. Auf zu Schritt 2: die Dateien.</p>
<h2>Die Dateien</h2>
<p>Nichts läuft ohne eine anständige Konfiguration. Zur Vorbereitung lege man sich im Editor seiner Wahl folgende Dateien zurecht. Am besten mit <strong>sudo</strong> öffnen um darauf auch Schreibrechte zu haben.</p>
<ul>
<li>/etc/apache2/sites-available/default</li>
<li>/etc/apache2/sites-available/mod_jk_vhosts</li>
<li>/etc/apache2/mods-available/jk.conf</li>
<li>/etc/apache2/workers.properties</li>
<li>/etc/tomcat6/server.xml</li>
<li>/etc/hosts</li>
</ul>
<p>Die Dateien <code>mod_jk_vhosts</code>, <code>jk.conf</code> und <code>workers.properties</code> existieren höchstwahrscheinlich noch nicht. Darum diese bitte selbst anlegen.</p>
<p>Soweit diese &#8220;Vorspeise&#8221; abgeschlossen ist, wollen wir uns dem &#8220;Hauptgang&#8221; widmen: der Konfiguration</p>
<h2>Die Konfiguration</h2>
<p>Für die Konfiguration gehe ich jede der oben genannten Dateien einzeln durch und stelle eine mögliche Konfiguration vor. Diese Konfigurationen sind nur auf das notwendigste beschränkt. Falls weitere Optionen oder Alternativen notwendig sind, verweise ich gerne auf die entsprechenden Fachseiten.</p>
<h3>mod_jk_vhost</h3>
<p>Beginnen möchte ich mit der <code>mod_jk_vhosts</code>, da diese am umfangreichsten ist. Ich präsentiere &#8230; den Inhalt:</p>
<pre class="brush: plain;">
ServerName localhost
# NameVirtualHost *:80
&lt;VirtualHost *:80&gt;
	ServerName 127.0.0.2
	ServerAlias tomcat.localhost
	ServerAlias www.tomcat.localhost
	ServerAdmin webmaster@tomcat.localhost
	#Take note of the jsp content directory placement
	DocumentRoot /var/lib/tomcat6/webapps/
	&lt;Directory &quot;/var/lib/tomcat6/webapps/&quot;&gt;
		Options Indexes FollowSymLinks +Includes
		AllowOverride All
		# DirectoryIndex index.jsp
	&lt;/Directory&gt;
	#Mount the folders with jsp pages
	JkMount /* worker1
&lt;/VirtualHost&gt;

&lt;VirtualHost *:80&gt;
	ServerName 127.0.0.3
	ServerAlias apache.localhost
	ServerAlias www.apache.localhost
	ServerAdmin webmaster@apache.localhost

	DocumentRoot /var/www
	&lt;Directory /&gt;
		Options FollowSymLinks
		AllowOverride None
	&lt;/Directory&gt;
	&lt;Directory /var/www/&gt;
		Options Indexes FollowSymLinks MultiViews
		AllowOverride None
		Order allow,deny
		allow from all
	&lt;/Directory&gt;

	ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
	&lt;Directory &quot;/usr/lib/cgi-bin&quot;&gt;
		AllowOverride None
		Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
		Order allow,deny
		Allow from all
	&lt;/Directory&gt;

	ErrorLog /var/log/apache2/error.log

	# Possible values include: debug, info, notice, warn, error, crit,
	# alert, emerg.
	LogLevel warn

	CustomLog /var/log/apache2/access.log combined

    Alias /doc/ &quot;/usr/share/doc/&quot;
    &lt;Directory &quot;/usr/share/doc/&quot;&gt;
	Options Indexes MultiViews FollowSymLinks
	AllowOverride None
	Order deny,allow
	Deny from all
	Allow from 127.0.0.0/255.0.0.0 ::1/128
    &lt;/Directory&gt;
&lt;/VirtualHost&gt;
</pre>
<p>Diese Datei wird anstelle der <code>/etc/apache2/sites-available/default</code> zukünftig für die Konfiguration des Apaches verwendet. Darum enthält sie auch große Teile der Original-Datei. Wenn der Inhalt der <code>default</code>-Datei anders aussieht, einfach den unteren Teil der <code>mod_jk_vhosts</code>-Datei mit dem Inhalt der <code>default</code>-Konfiguration abgleichen.</p>
<p>Zur Aktivierung der alternativen Konfiguration in der Konsole folgende Zeile ausführen:</p>
<pre class="brush: plain; gutter: false;">
sudo a2ensite mod_jk_vhosts
</pre>
<h3>jk.conf</h3>
<p>Die zweite Datei der ich mich widmen will, ist die <code>jk.conf</code>. Wie bereits erwähnt: sollte diese Datei noch nicht existieren, einfach unter dem oben genannten Pfad mit folgendem Inhalt speichern.</p>
<pre class="brush: plain;">
JkWorkersFile /etc/apache2/workers.properties
JkLogFile /var/log/apache2/mod_jk.log
JkLogLevel info
</pre>
<p>Die Konfiguration ist sehr minimalistisch. Mehr wird auch erstmal nicht benötigt. Es wird nur die Stelle für die Konfigurationsdatei angegeben, die Apache braucht um mit dem Tomcat zu sprechen und die Logging-Konfiguration, für den Fall, dass etwas schief läuft.<br />
Damit diese Konfiguration auch berücksichtigt wird muss sie mit
<pre class="brush: plain; gutter: false;">sudo ln -s /etc/apache2/mods-available/jk.conf /etc/apache2/mods-enabled/</pre>
<p> verlinkt werden.</p>
<h3>workers.properties</h3>
<p>Die <code>workers.properties</code> kann man als das Herzstück der Konfiguration bezeichnen, da sie die eigentliche Kommunikation zwischen Apache und Tomcat ermöglicht.</p>
<pre class="brush: plain;">
workers.tomcat_home=/usr/share/tomcat6
workers.java_home=/usr/lib/jvm/java-6-sun
ps=/
worker.list=worker1
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker.worker1.lbfactor=1
</pre>
<p>Der Kürze halber will ich an dieser Stelle nicht die einzelnen Parameter erklären, sondern nur auf die <a href="http://tomcat.apache.org/connectors-doc/reference/workers.html" onclick="return TrackClick('http%3A%2F%2Ftomcat.apache.org%2Fconnectors-doc%2Freference%2Fworkers.html','offizielle+Dokumentation')">offizielle Dokumentation</a> verweisen.</p>
<h3>server.xml</h3>
<p>Als dritte Datei kommen wir zur <code>/etc/tomcat6/server.xml</code>. Diese enthält die allgemeine Server-Konfiguration für den integrierten Tomcat von Ubuntu. An dieser Datei müssen zwei Änderungen durchgeführt werden:</p>
<ol>
<li>Aktivierung von Port 8009 und</li>
<li>Server-Aliase für unseren VirtualHost setzen.</li>
</ol>
<p>Für 1. einfach nach <code>port="8009"</code> suchen und die Zeile auskommentieren, sodass es in etwa so aussieht</p>
<pre class="brush: plain;">
...
&lt;!-- Define an AJP 1.3 Connector on port 8009 --&gt;
&lt;Connector port=&quot;8009&quot; protocol=&quot;AJP/1.3&quot; redirectPort=&quot;8443&quot; /&gt;
...
</pre>
<p>Die Server-Aliase werden im Abschnitt <code>Host</code> eingetragen.</p>
<pre class="brush: plain;">
...
&lt;Host name=&quot;localhost&quot; appBase=&quot;webapps&quot; unpackWARs=&quot;true&quot; autoDeploy=&quot;true&quot; xmlValidation=&quot;false&quot; xmlNamespaceAware=&quot;false&quot;&gt;
  ...
  &lt;Alias&gt;www.tomcat.localhost&lt;/Alias&gt;
  &lt;Alias&gt;tomcat.localhost&lt;/Alias&gt;
  &lt;Alias&gt;127.0.0.2&lt;/Alias&gt;
  &lt;Alias&gt;tomcat.localhost&lt;/Alias&gt;
&lt;/Host&gt;
...
</pre>
<h3><code>/etc/hosts</code></h3>
<p>Als letzten Schritt soll auch Ubuntu erfahren zu welchem Servernamen welche IP gehört. Darum in die <code>/etc/hosts</code> folgende Zeilen hinzufügen:</p>
<pre class="brush: plain;">
127.0.0.2 tomcat.localhost www.tomcat.localhost
127.0.0.3 apache.localhost www.apache.localhost
</pre>
<h2>Das &#8220;Dessert&#8221;</h2>
<p>Auf das Dessert freut man sich ja eigentlich am meisten. So auch hier. Nachdem alles konfiguriert wurde, einfach den Tomcat und den Apache neustarten:</p>
<pre class="brush: plain; gutter: false;">
sudo /etc/init.d/tomcat6 restart
sudo /etc/init.d/apache2 restart
</pre>
<p>Violá, wir sind finis &#8230; zumindest was meinen Versuchsaufbau angeht. Falls noch alles läuft, habe ich was falsch gemacht. Im Ernst: Falls Kommentare sind, weil etwas nicht funktioniert bitte ich um User-generierten Content <img src='http://www.pincservices.de/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />   </p>
]]></content:encoded>
			<wfw:commentRss>http://www.pincservices.de/wordpress/recipe-apache-2-mit-tomcat-6-auf-ubuntu-9-10-fur-gourmets/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Joda &#8211; &#8220;Bis 900 Jahre, wirst aussehen du nicht gut!&#8221;</title>
		<link>http://www.pincservices.de/wordpress/joda-bis-900-jahre-wirst-aussehen-du-nicht-gut</link>
		<comments>http://www.pincservices.de/wordpress/joda-bis-900-jahre-wirst-aussehen-du-nicht-gut#comments</comments>
		<pubDate>Tue, 15 Dec 2009 09:45:34 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[date api]]></category>
		<category><![CDATA[joda]]></category>

		<guid isPermaLink="false">http://www.pincservices.de/wordpress/?p=370</guid>
		<description><![CDATA[Mit diesen Worten hat Yoda in Starwars nicht nur eine der traurigsten Szenen aufgelockert, sondern auch gleich &#8211; unbeabsichtigt &#8211; ein Grundproblem der Javawelt adressiert. Die API für die Zeitverwaltung.
Wann wenn nicht jetzt?
Beim Stöbern in Quellcode bin ich letztens wiedermal über eine lustige Zeile gestoßen:

...
System.currentTimeInMillis() //we can get the time in milliseconds after 1 Jan [...]]]></description>
			<content:encoded><![CDATA[<p>Mit diesen Worten hat Yoda in Starwars nicht nur eine der traurigsten Szenen aufgelockert, sondern auch gleich &#8211; unbeabsichtigt &#8211; ein Grundproblem der Javawelt adressiert. Die API für die Zeitverwaltung.</p>
<h3>Wann wenn nicht jetzt?</h3>
<p>Beim Stöbern in Quellcode bin ich letztens wiedermal über eine lustige Zeile gestoßen:</p>
<pre class="brush: plain;">
...
System.currentTimeInMillis() //we can get the time in milliseconds after 1 Jan 1970 at 0:00:00am GMT
...
</pre>
<p>Auf den ersten Blick harmlos. Was soll da schon passieren? Ich will die Frage umformulieren: Was passiert danach? Mit dem Wert wird in der Regel angefangen zu arbeiten. D.h. Tage werden hinzugefügt, abgezogen um z.B. Startzeitpunkte zu ermitteln. Dabei wurde in dem Code, den ich gesehen habe in etwa folgendes gemacht:</p>
<pre class="brush: plain;">
final long now = System.currentTimeInMillis();
final long oneDay = 1000 * 60 * 60 * 24;
final long tomorrow = now + oneDay;
...
</pre>
<p>Sieht immer noch alles harmlos aus? Dann weiter &#8230;</p>
<h3>Ein Tag hat 24 Stunden</h3>
<p>An einer anderen Stelle wurde ein Vergleich zweier Daten durchgeführt. Hier die anonymisierte Fassung:</p>
<pre class="brush: plain;">
final long oneDay = 1000 * 60 * 60 * 24;

final Calendar calendar = Calendar.getInstance();
calendar.set(2009, 9, 24, 10, 0);
final long summerTime = calendar.getTimeInMillis();

final Calendar comparisonCalendar = Calendar.getInstance();
comparisonCalendar.set(2009, 9, 26, 10, 0);
final long winterTime = comparisonCalendar.getTimeInMillis();

final long difference = winterTime - summerTime;

if (difference == 2 * oneDay) {
    ...
}
</pre>
<p>Immer noch harmlos? Der ein oder andere wird jetzt sagen: klar. Leider steckt der Teufel im Detail. Was meistens vernachlässigt wird ist die europäische (Un)Sitte zwischen Sommer- und Winterzeit zu wechseln oder auch ganz allgemein alle 4 Jahre mal einen Tag im Februar mehr einzuplanen. Hier muss sich dieser Ansatz leider geschlagen geben.</p>
<p>Ich muss mich an dieser Stelle entschuldigen, denn ich habe den Code bereits so abgeändert, dass das Problem der Sommer- und Winterzeit offensichtlich wird. Der Originalcode sieht natürlich etwas anders aus. Aber nun sollte definitiv ersichtlich werden, warum das nicht funktionieren kann. Hier wird mit festen Zeitintervallen (<code>oneDay</code>) gearbeitet. Leider hat der Tag zum Zeitwechsel nicht 24, sondern entweder 23 oder 25 Stunden.</p>
<p>Geht man mit Java-Hausmitteln an dieses Problem landet man dann aber auch schnell in Code-Schnippseln wie dem Folgenden:</p>
<pre class="brush: plain;">
...
Calendar calendar = Calendar.getInstance();
Date now = calendar.getTime();
calendar.add(Calendar.HOUR_OF_DAY, 1);

...
</pre>
<p>oder die Alternative für den Vergleichscode:</p>
<pre class="brush: plain;">
...
Calendar calendar = Calendar.getInstance();
calendar.setTime(2009, 9, 24, 10, 0);
calendar.add(Calendar.HOUR_OF_DAY, 2);

Calendar comparisonCalendar = Calendar.getInstance();
comparisonCalendar.setTime(2009, 9, 26, 10, 0);
if (calendar.getTimeInMillis() == comparisonCalendar.getTimeInMillis()) {
...
</pre>
<p>Damit löst man zwar das Problem mit der Zeitumstellung, aber auf Dauer ist schön was anderes, denn ein weiterer Schwachpunkt der API, aus meiner Sicht, ist die schlechte Lesbarkeit. Denn wer sieht schon auf den ersten Blick, dass hier nicht der September, sondern der Oktober gemeint ist. Ja, man kann auch mit den <code>Calendar</code>-Konstanten arbeiten, aber auch das führt eher zu unnötig langen Codezeilen.</p>
<h3>&#8230; einer, der der Macht das Gleichgewicht bringen wird &#8230;</h3>
<p>Eine elegante Lösung hierfür bietet &#8211; nein nicht Skywalker, sondern &#8211; die <a href="http://joda-time.sourceforge.net/" onclick="return TrackClick('http%3A%2F%2Fjoda-time.sourceforge.net%2F','Joda-Bibliothek')">Joda-Bibliothek</a>. Diese erlaubt es das Millisecond-Massaker zu umgehen und die Schwächen der Standard-API zu minimieren. So sieht der Code von oben mit Joda etwa so aus:</p>
<pre class="brush: plain;">
...
DateTime dt = new DateTime();
DateTime oneDayLater = dt.plusDays(1);
DateTime oneDayEarlier = dt.minusDays(1);
...
</pre>
<p>Auch Vergleiche wirken wesentlich angenehmer:</p>
<pre class="brush: plain;">
final DateTime now = new DateTime();
final DateTime before = now.minusDays(100);
final Days days = Days.daysBetween(before, now);
if (days.getDays() == 2) {
...
</pre>
<h3>&#8220;Schneller, leichter, verführerischer&#8221;</h3>
<p>Auch wenn das nur ein erster Blick auf Joda war, zeigt sich hier schon die Eleganz und Mächtigkeit dieser Bibliothek. Wer sich nicht scheut ein wenig englisch zu lesen, sei für weitere Informationen auf das IBM-Tutorial <a href="http://www.ibm.com/developerworks/java/library/j-jodatime.html" onclick="return TrackClick('http%3A%2F%2Fwww.ibm.com%2Fdeveloperworks%2Fjava%2Flibrary%2Fj-jodatime.html','Joda-Time')" target="_blank">Joda-Time</a> und die Website <a href="http://joda-time.sourceforge.net" onclick="return TrackClick('http%3A%2F%2Fjoda-time.sourceforge.net','http%3A%2F%2Fjoda-time.sourceforge.net')" target="_blank">http://joda-time.sourceforge.net</a> selbst verwiesen.</p>
<p>Ansonsten, sehen wir uns in 900 Jahren um Mitternacht <img src='http://www.pincservices.de/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<pre class="brush: plain;">
final LocalDate localDate = new LocalDate();
final DateTime then = localDate.toDateMidnight().toDateTime().plusYears(900);
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.pincservices.de/wordpress/joda-bis-900-jahre-wirst-aussehen-du-nicht-gut/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Und plötzlich war alles dunkel &#8230;</title>
		<link>http://www.pincservices.de/wordpress/und-plotzlich-war-alles-dunkel</link>
		<comments>http://www.pincservices.de/wordpress/und-plotzlich-war-alles-dunkel#comments</comments>
		<pubDate>Sat, 14 Nov 2009 09:40:03 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Projektverwaltung]]></category>
		<category><![CDATA[Werkzeuge]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[Genshi]]></category>
		<category><![CDATA[gtk+]]></category>
		<category><![CDATA[Trac]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.pincservices.de/wordpress/?p=343</guid>
		<description><![CDATA[Ich weiss nicht, was passiert ist, aber nach dem Upgrade von Ubuntu auf 9.10 wurden diverse Entwickler-Tools unbenutzbar. Dabei handelt es sich insbesondere um Anwendungen, die nicht direkt aus dem Ubuntu-Repository stammen. Im Folgenden will ich auf Eclipse und Trac eingehen.
Eclipse 3.5
Nachdem auf GTK+ 2.18 aktualisiert wurde, funktionieren diverse Buttons in Eclipse nicht mehr. Schnell [...]]]></description>
			<content:encoded><![CDATA[<p>Ich weiss nicht, was passiert ist, aber nach dem Upgrade von Ubuntu auf 9.10 wurden diverse Entwickler-Tools unbenutzbar. Dabei handelt es sich insbesondere um Anwendungen, die nicht direkt aus dem Ubuntu-Repository stammen. Im Folgenden will ich auf Eclipse und Trac eingehen.</p>
<h3>Eclipse 3.5</h3>
<p>Nachdem auf GTK+ 2.18 aktualisiert wurde, funktionieren diverse Buttons in Eclipse nicht mehr. Schnell wird man dank Google auf der Suche nach einem Fix bzw. Workaround fündig (<a href="http://library.gnome.org/devel/gtk/2.18/gtk-migrating-ClientSideWindows.html" onclick="return TrackClick('http%3A%2F%2Flibrary.gnome.org%2Fdevel%2Fgtk%2F2.18%2Fgtk-migrating-ClientSideWindows.html','Migrating+to+client-side+windows')">Migrating to client-side windows</a>). Offensichtlich ist die Umgebungsvariable <code>GDK_NATIVE_WINDOWS</code> für das Problem verantwortlich. Diese muss auf den Wert <code>true</code> gesetzt werden, damit SWT-basierte Java-Oberflächen (Anmerkung: auch andere Java-Applikationen mit SWT haben das Problem) wieder in altem Glanz erstrahlen.</p>
<pre class="brush: bash;">
#!/bin/bash
env GDK_NATIVE_WINDOWS=true &lt;your/eclipse/path&gt;/eclipse
</pre>
<p><em>(Den Pfad <code>&lt;your/eclipse/path&gt;</code> bitte an das jeweilige Installationsverzeichnis von Eclipse anpassen.)</em></p>
<p>Leider ist dies nur ein bescheidener Workaround, denn sobald man Eclipse aus sich heraus neu startet (z.B. nach Upgrades oder Plugin-Installationen) existiert das alte Problem wieder. Genauso, wenn man den Workspace versucht zu wechseln, da sich Eclipse auch hier herunterfährt und neu startet.</p>
<p>Ein richtiger Fix ist für die Version 3.5.2 angedacht bzw. soll in der 3.6 schon integriert sein, welche für die SDK-Variante bereits existiert. Nur für JEE-Developer wird es wohl noch etwas dauern.</p>
<p>Von einem globalen Umsetzen der Variable <code>GDK_NATIVE_WINDOWS</code> wird an diversen Stellen explizit abgeraten. Hier sei aber anzumerken, dass die Eclipse-Installation aus den Ubuntu-Repositories genau das macht. Für alle, die etwas &#8220;wagemutiger&#8221; sind hier das Startskript mit <code>export</code>.</p>
<pre class="brush: bash;">
#!/bin/sh

# work around e#290395 / LP: #458703
export GDK_NATIVE_WINDOWS=true

xuldir=/usr/lib/xulrunner-$(/usr/bin/xulrunner-1.9.1 --gre-version)
LD_LIBRARY_PATH=$xuldir${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH} &lt;your/eclipse/path&gt;/eclipse
 &quot;$@&quot;
</pre>
<p><em>(Den Pfad <code>&lt;your/eclipse/path&gt;</code> bitte an das jeweilige Installationsverzeichnis von Eclipse anpassen.)</em></p>
<p>Dieses Skript am besten unter <code>/usr/local/bin</code> als <code>eclipse</code> ablegen und alle Links, die vorher direkt auf die Eclipse-Startdatei gegangen sind auf dieses Skript umbiegen.</p>
<h3>Trac</h3>
<p>Interessanterweise &#8211; was die primäre Motivation für diesen Kurzkommentar war &#8211; hat es auch das Bugtracking-Tool Trac erwischt. Zum Glück nicht so &#8220;heftig&#8221; wie Eclipse, aber dafür umso unverständlicher. </p>
<p>Ich habe lokal Trac mittels <code>easy_install</code> installiert gehabt. Nach dem Upgrade auf Ubuntu 9.10 erhielt ich plötzlich auf allen Trac-Seiten einen 500-Fehler. Nach kurzem Suchen fand ich in der <code>error.log</code>-Datei von Apache (Pfad unter Ubuntu: <code>/var/log/apache2/error.log</code>) folgenden Eintrag:</p>
<pre class="brush: plain; light: true;">
... [error] [client 127.0.0.1] ImportError: No module named genshi, ...
</pre>
<p>Warum das Modul plötzlich nicht mehr vorhanden war kann ich zum aktuellen Zeitpunkt nicht erklären, aber das war noch nicht das Ende.</p>
<p>Just in dem Moment wo ich mit </p>
<pre class="brush: plain; light: true;">
sudo easy_install Genshi
</pre>
<p>das entsprechende Modul installieren wollte, quittierte mir Ubuntu die Nachricht, dass <code>easy_install</code> nicht existiert. Ein kurzer Blick in Synaptic unter <code>python-setuptools</code> bestätigte die Vermutung, dass das Paket nicht installiert war. Ich möchte an dieser Stelle nicht ausschließen, dass es beim Upgrade in der Liste der zu deinstallierenden Pakete dabei war, aber dennoch ärgerlich. Also war auch hier nachinstallieren angesagt. </p>
<p>Zum Glück fügte sich dann alles sehr schnell. Das Genshi-Modul installierte sich ohne Probleme.</p>
<p>Abschließend musste noch der Workaround für einen Bug (<a href="http://trac.edgewall.org/ticket/7526" onclick="return TrackClick('http%3A%2F%2Ftrac.edgewall.org%2Fticket%2F7526','http%3A%2F%2Ftrac.edgewall.org%2Fticket%2F7526')">http://trac.edgewall.org/ticket/7526</a>)  eingebaut werden. Einfach die <code>compat.py</code> im <code>functional/tests</code>-Ordner in <code>testcompat.py</code><br />
umbenennen und die <code>compat.pyc</code> in <code>compat.pyc.old</code> umbenennen oder gleich löschen. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.pincservices.de/wordpress/und-plotzlich-war-alles-dunkel/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blog redesigned &#8230; to be continued</title>
		<link>http://www.pincservices.de/wordpress/blog-redesigned-to-be-continued</link>
		<comments>http://www.pincservices.de/wordpress/blog-redesigned-to-be-continued#comments</comments>
		<pubDate>Sun, 08 Nov 2009 07:04:36 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.pincservices.de/wordpress/?p=262</guid>
		<description><![CDATA[Wartungsarbeiten sind Arbeiten, die ungnädig und ewig warten, bis man sie macht. So geschehen mit diesem Blog und demnächst auch mit der Webseite http://www.pincservices.de.
Da der Blog seit einiger Zeit Brach lag, musste eine Runderneuerung her. Nachdem die Software auf den aktuellen Stand gebracht wurde, fiel mein Augenmerk auf das Frontend. Ich weiss gar nicht mehr [...]]]></description>
			<content:encoded><![CDATA[<p>Wartungsarbeiten sind Arbeiten, die ungnädig und ewig warten, bis man sie macht. So geschehen mit diesem Blog und demnächst auch mit der Webseite <a href="http://www.pincservices.de" onclick="return TrackClick('http%3A%2F%2Fwww.pincservices.de','http%3A%2F%2Fwww.pincservices.de')">http://www.pincservices.de</a>.</p>
<p>Da der Blog seit einiger Zeit Brach lag, musste eine Runderneuerung her. Nachdem die Software auf den aktuellen Stand gebracht wurde, fiel mein Augenmerk auf das Frontend. Ich weiss gar nicht mehr wie viele Jahre das alte Frontend ausgehalten hat, aber ich entschuldige mich hiermit nachdrücklich bei allen, die darunter leiden mussten.<br />
Seit heute morgen erstrahlt der Blog in neuem Gewand und auch die Nutzbarkeit ist &#8211; nach eigenen Erfahrungen &#8211; erheblich gestiegen. Nebenbei sind diverse &#8220;Gimmicks&#8221; ins Template geflossen, wobei ich nicht verrate welche.</p>
<p>Dennoch stehen &#8211; jetzt, wo man alles lesen kann &#8211; die nächsten Umbauten an. Mit der Aktualisierung sind einige Probleme beim Encoding aufgetreten und einige Artikel müssen nochmal visuell nachgebessert werden. Ausserdem fehlen noch einige Zutaten zum &#8220;perfekten Glück&#8221;.</p>
<p>Ich werd mich dann mal weiter darum kümmern &#8211; Also viel Spaß beim stöbern.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pincservices.de/wordpress/blog-redesigned-to-be-continued/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Webapps become wicket &#8230;</title>
		<link>http://www.pincservices.de/wordpress/webapps-become-wicket</link>
		<comments>http://www.pincservices.de/wordpress/webapps-become-wicket#comments</comments>
		<pubDate>Sat, 26 Sep 2009 00:59:55 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[wicket]]></category>

		<guid isPermaLink="false">http://www.pincservices.de/wordpress/?p=247</guid>
		<description><![CDATA[Im Allgemeinen sprießen Webframeworks wie Pilze aus dem Boden. Mal mehr und mal weniger erfolgreich. Allerdings haben die meisten immer den gleichen MVC-Ansatz. Daten werden im Model vorgehalten, der Controller kümmert sich um die Bereitstellung der Objekte und der Navigation und das View &#8220;holt&#8221; sich alles was es braucht aus dem Kontext. D.h. man hat [...]]]></description>
			<content:encoded><![CDATA[<p>Im Allgemeinen sprießen Webframeworks wie Pilze aus dem Boden. Mal mehr und mal weniger erfolgreich. Allerdings haben die meisten immer den gleichen MVC-Ansatz. Daten werden im Model vorgehalten, der Controller kümmert sich um die Bereitstellung der Objekte und der Navigation und das View &#8220;holt&#8221; sich alles was es braucht aus dem Kontext. D.h. man hat häufig eine Mischung aus HTML und einer expliziten Expression Language im View (z.B. JSTL).<br />
Der große Nachteil bei dieser Form von Aufteilung ist, dass man beim Testen häufig auf verschiedene Frameworks zurückgreifen muss um die Korrektheit der Anzeige zu gewährleisten bzw. stark auf manuelles Testen angewiesen ist. Im Speziellen sei hier die Problematik von Text-Lokalisierung erwähnt, die jedem Entwickler im Laufe seiner Arbeit schonmal &#8220;auf die Füße gefallen&#8221; sein wird.</p>
<p>Einen etwas anderen Ansatz verfolgt an dieser Stelle das Framework <a href="http://wicket.apache.org" onclick="return TrackClick('http%3A%2F%2Fwicket.apache.org','Wicket')">Wicket</a>. Hier wird bewusst auf eine explizite Expression Language verzichtet &#8211; soweit ich sehen kann. Alle Referenzen zwischen Controller und View werden über eine Wicket-Id-Tag (<code>&lt;span wicket:id="myMessage"&gt;&lt;/span&gt;</code>) aufgelöst. Damit steht zwar der Controller in der Pflicht alle Inhalte entsprechend umfangreicher aufzubereiten (z.B. explizite Änderungs-Propagierung), aber diese Vorgehensweise hat den elementaren Vorteil, dass Seiten wesentlich einfacher auch mit z.B. Junit-Tests geprüft werden können.</p>
<p>Es wäre alles zu schön um wahr zu sein, wenn es nicht schon auf den/meinen ersten Blick ein kleines Problem gäbe. Natürlich geht Wicket von einem MVC-Ansatz aus und benötigt damit HTML-Dateien zum Rendern. Leider wird standardmäßig davon ausgegangen, dass die HTML-Dateien im gleichen Verzeichnis liegen wie die entsprechende Klasse.<br />
<b-quote><i><br />
&#8220;First we need to create a web page. Wicket has a WebPage class suited for this task. All webpages need to be subclasses of WebPage. Another requirement is that the actual HTML file and the class name are equal: Index.html and Index, IndexPage.html and IndexPage or HelloWorld.html and HelloWorld. They also need to be in the same place on the classpath. The best way to develop is to put them in the same directory. This might seem strange in the beginning, especially when you are accustomed to separate html files and java files. However, since all pages are actually just components, it makes perfect sense in terms of reusability.&#8221;<br />
</i><br />
(siehe hierzu <a href="http://cwiki.apache.org/WICKET/newuserguide.html#Newuserguide-TheHTML" onclick="return TrackClick('http%3A%2F%2Fcwiki.apache.org%2FWICKET%2Fnewuserguide.html%23Newuserguide-TheHTML','http%3A%2F%2Fcwiki.apache.org%2FWICKET%2Fnewuserguide.html%23Newuserguide-TheHTML')">http://cwiki.apache.org/WICKET/newuserguide.html#Newuserguide-TheHTML</a>)<br />
</b-quote></p>
<p>Für jeden Webentwickler, der es gewohnt ist, dass HTML- respektive JSP(X)-Dateien gefälligst weit weg von den Klassen zu liegen haben, eine Umstellung die nur leidlich zu ertragen ist.<br />
Zum Glück haben die Wicket-Entwickler hier aber ein Einsehen und bieten in der Referenz-Dokumentation auch gleich mehrere <a href="http://cwiki.apache.org/WICKET/control-where-html-files-are-loaded-from.html" onclick="return TrackClick('http%3A%2F%2Fcwiki.apache.org%2FWICKET%2Fcontrol-where-html-files-are-loaded-from.html','L%C3%B6sungen')">Lösungen</a> an, wobei aus meiner Sicht, die Maven-Lösung zu empfehlen ist, da sie versionsunabhängig ist.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pincservices.de/wordpress/webapps-become-wicket/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GIT geht nicht gern mit Fremden: *** Please tell me who you are.</title>
		<link>http://www.pincservices.de/wordpress/git-geht-nicht-gern-mit-fremden-please-tell-me-who-you-are</link>
		<comments>http://www.pincservices.de/wordpress/git-geht-nicht-gern-mit-fremden-please-tell-me-who-you-are#comments</comments>
		<pubDate>Sat, 15 Aug 2009 18:18:50 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Werkzeuge]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[hudson]]></category>

		<guid isPermaLink="false">http://www.pincservices.de/wordpress/?p=224</guid>
		<description><![CDATA[Für alle, die es leid waren, sich mit Subversion herumzuschlagen &#8211; oder einfach mal neugierig auf ein anderes Versionssystem sind, haben bestimmt schonmal etwas von GIT gehört.
Ich will an dieser Stelle weder die üblichen Lobeshymnen, noch die allseitsbeliebten Hasstiraden anstimmen, sondern nur eine kleine Hilfestellung geben, wenn man sich dazu entschließen will das GIT-Plugin von [...]]]></description>
			<content:encoded><![CDATA[<p>Für alle, die es leid waren, sich mit Subversion herumzuschlagen &#8211; oder einfach mal neugierig auf ein anderes Versionssystem sind, haben bestimmt schonmal etwas von <a href="http://git-scm.com/" onclick="return TrackClick('http%3A%2F%2Fgit-scm.com%2F','GIT')">GIT</a> gehört.</p>
<p>Ich will an dieser Stelle weder die üblichen Lobeshymnen, noch die allseitsbeliebten Hasstiraden anstimmen, sondern nur eine kleine Hilfestellung geben, wenn man sich dazu entschließen will das GIT-Plugin von Hudson zu nutzen.</p>
<p>Die Installation ist zwar &#8211; wie immer &#8211; simpel, aber leider mag Hudson evtl. nicht gleich mit GIT &#8220;spielen&#8221;. Will man den Job starten kommt relativ schnell folgende Ausgabe in der Konsolenansicht.</p>
<blockquote><p>Gestartet durch Benutzer anonymous<br />
Checkout:workspace / /usr/local/apps/hudson_home/jobs/gitTest/workspace &#8211; hudson.remoting.LocalChannel@1063971<br />
Last Build : #2<br />
Checkout:workspace / /usr/local/apps/hudson_home/jobs/gitTest/workspace &#8211; hudson.remoting.LocalChannel@1063971<br />
Fetching changes from the remote Git repository<br />
Fetching upstream changes from file:///var/local/workspaces/experiments/sampleProject<br />
[workspace] $ git fetch file:///var/local/workspaces/experiments/sampleProject +refs/heads/*:refs/remotes/origin/*<br />
[workspace] $ git ls-tree HEAD<br />
Seen branch in repository origin/master<br />
Commencing build of Revision f7dc0e95f48a084d5192c3712f14b3353a98a876 (origin/master )<br />
Checking out Revision f7dc0e95f48a084d5192c3712f14b3353a98a876 (origin/master )<br />
[workspace] $ git checkout -f f7dc0e95f48a084d5192c3712f14b3353a98a876<br />
[workspace] $ git tag -a -f -m &#8220;Hudson Build #3&#8243; hudson-gitTest-3<br />
FATAL: Could not apply tag hudson-gitTest-3<br />
hudson.plugins.git.GitException: Could not apply tag hudson-gitTest-3<br />
at hudson.plugins.git.GitAPI.tag(GitAPI.java:265)</p>
<p>[haufenweise stacktrace]</p>
<p>&#8230; 12 more<br />
Caused by: hudson.plugins.git.GitException: Command returned status code 128:<br />
*** Please tell me who you are.</p>
<p>Run</p>
<p>git config &#8211;global user.email &#8220;you@example.com&#8221;<br />
git config &#8211;global user.name &#8220;Your Name&#8221;</p>
<p>to set your account&#8217;s default identity.<br />
Omit &#8211;global to set the identity only in this repository.</p>
<p>fatal: empty ident &lt;tomcat6@yourhost&gt; not allowed</p>
<p>at hudson.plugins.git.GitAPI.launchCommandIn(GitAPI.java:297)<br />
&#8230; 14 more
</p></blockquote>
<p>Offensichtlich ist GIT ein wenig schüchtern und mag nicht jeden an die digitale Wäsche ranlassen.</p>
<p>Leider findet man nicht wirklich eine Möglichkeit Hudson eine eigene Identität via Webfrontend zu geben. Der Trick liegt genau dahinter &#8211; und zwar im Dateisystem.</p>
<p>Genauer gesagt in der <code>/etc/passwd</code>. Aus irgendwelchen Gründen brauch GIT hier einen Eintrag im Feld für den fullName. Unter Ubuntu hat der Tomcat-User dort standardmäßig nichts gesetzt. Fügt man jetzt dort einfach &#8216;Tomcat 6,,,&#8217; ein, läuft es auch mit dem CI-Nachbarn.</p>
<p>Alle, die sich über die Gründe Gedanken machen, seien auf die <a href="http://git.or.cz/gitwiki/GitFaq#Gitcommitisdyingtellingme.22fatal.3Aemptyident.3Cuser.40myhost.3Enotallowed.22.2Cwhat.27swrong.3F" onclick="return TrackClick('http%3A%2F%2Fgit.or.cz%2Fgitwiki%2FGitFaq%23Gitcommitisdyingtellingme.22fatal.3Aemptyident.3Cuser.40myhost.3Enotallowed.22.2Cwhat.27swrong.3F','Git+FAQs')">Git FAQs</a> verwiesen.</p>
<p>So dann &#8211; viel Spaß beim Bauen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pincservices.de/wordpress/git-geht-nicht-gern-mit-fremden-please-tell-me-who-you-are/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hudson und Grails am heimischen Herd</title>
		<link>http://www.pincservices.de/wordpress/hudson-und-grails-am-heimischen-herd</link>
		<comments>http://www.pincservices.de/wordpress/hudson-und-grails-am-heimischen-herd#comments</comments>
		<pubDate>Wed, 12 Aug 2009 22:01:52 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Projektverwaltung]]></category>
		<category><![CDATA[Werkzeuge]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[hudson]]></category>
		<category><![CDATA[Trac]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.pincservices.de/wordpress/?p=217</guid>
		<description><![CDATA[Nachdem sich verschiedene Projekte bei mir angesammelt haben und ich für jedes in der Regel ein entsprechendes Trac-Projekt angelegt habe, fehlte mir immer mehr die projektübergreifende Oberfläche.
Mit den Wochen und Monaten schwängerte sich mein Geist mit dem Gedanken sich an Trac &#8220;zu vergreifen&#8221; und selbst so eine Oberfläche zu schreiben. Zum Glück kam mir eine [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem sich verschiedene Projekte bei mir angesammelt haben und ich für jedes in der Regel ein entsprechendes Trac-Projekt angelegt habe, fehlte mir immer mehr die projektübergreifende Oberfläche.</p>
<p>Mit den Wochen und Monaten schwängerte sich mein Geist mit dem Gedanken sich an Trac &#8220;zu vergreifen&#8221; und selbst so eine Oberfläche zu schreiben. Zum Glück kam mir eine neue Anforderung in den Weg, die mir die Arbeit teilweise abnahm: der Wunsch eines Continuous Integration Systems &#8211; kurz CI.</p>
<p>Da ich schon gute Erfahrungen mit Hudson gemacht hatte, war die Entscheidung schnell getroffen das System auch für mich einzusetzen. Die Vorteile:</p>
<ul>
<li>einfache Installation</li>
<li>Open Source</li>
<li>kostenfrei</li>
</ul>
<p>Allerdings musste gewährleistet werden, dass man damit Grails-Projekte bauen kann. Schaut man in die Plugin-Liste schreit es einen förmlich an: &#8220;Hier bin ich. Ist total easy-schneasy. Machs einfach!&#8221;</p>
<p>Aber wie so oft bei so offensichtlichen Aktionen liegt die Tücke im Detail. Leider hören &#8211; wie so oft &#8211; die Tutorials im Netz bei der Hälfte auf und vermitteln einem das Gefühl, dass man zu doof für die IT-Welt ist. Deshalb möchte ich hier einfach meine Erfahrungen bei der Einrichtung von Hudson mit den Grails- und Trac-Plugin auf einem Ubuntu-System vorstellen.</p>
<h3>System</h3>
<ul>
<li>Ubuntu 09.04</li>
<li>Tomcat 6 (aus den Ubuntu-Repository)</li>
<li>Trac (manuell installiert)</li>
<li>Grails 1.1.1</li>
</ul>
<p><em>Anmerkung</em><br />
Ob Trac jetzt manuell oder aus dem Repository installiert wurde, ist eigentlich egal.</p>
<h3>Hudson</h3>
<p>Als erstes ging es darum Hudson zu installieren. Zwar bietet Ubuntu auch hier an über eine kleine Erweiterung der Repositories Hudson als Daemon zu installieren, allerdings bin ich persönlich kein großer Freund davon. Deshalb Alternative: war-File downloaden und einfach im Tomcat deployen.</p>
<p style="color: red; font-weight: bold;">Achtung!!! Wenn man das macht, sollte man vorsichtig beim Neustart aus Hudson heraus sein. Die Applikation fährt interessanterweise den Tomcat runter, bekommt ihn aber danach nicht mehr gestartet.</p>
<p>Zwei Dinge muss man dabei beachten, die aber auch auf der Hudson-Seite dokumentiert sind.</p>
<ol>
<li>die Variable HUDSON_HOME muss gesetzt sein &#8211; habe ich bei mir direkt in das Tomcat-Startskript geschrieben (Faulheit siegt)</li>
<li>Es müssen teilweise noch Verzeichnis-Rechte angepasst werden, damit Hudson korrekt läuft</li>
</ol>
<p>Nachdem Hudson nun endlich sein Pracht im Browser präsentiert geht es weiter mit dem Grails-Plugin.</p>
<h3>Grails</h3>
<p>Die Installation von Plugins ist in Hudson sehr simpel &#8211; oder wie manch Web 2.0-Entwickler sagen würde: &#8220;kissy&#8221; (von KISS &#8211; Keep it stupid simple). Einfach Häkchen setzen und auf &#8220;Installieren&#8221; klicken. Wie schon erwähnt, kann es hierbei dazu kommen, dass Hudson den kompletten Tomcat versucht neu zu starten, was zumindest bei mir nicht funktioniert hat. Ggf. einfach den Tomcat manuell neu starten.</p>
<p>Nachdem das Plugin installiert ist, müssen noch einige Konfigurationen durchgeführt werden. Als erstes muss der &#8220;Grails Builder&#8221; in der globalen Konfiguration von Hudson angelegt werden. Hier kann man verschiedene Grails-Installationen angeben, was insbesondere durch die teilweise Inkompatibilität der Versionen von großem Vorteil ist. Da die Sache in zwei Textboxen geregelt wird, verzichte ich mal auf den obligatorischen Screenshot.<br />
Hat man jetzt die notwendigen Installationen angegeben kann man sich gütlich an die Konfiguration des Jobs machen. Hier muss ich vorausschicken, dass ich bereits einige Jobs angelegt hatte.</p>
<p>Unter dem Punkt &#8220;Build Verfahren&#8221; kann man über den Button &#8220;Build-Schritt hinzufügen&#8221; ein &#8220;Build with Grails&#8221; anlegen. Dabei lassen sich verschieden Werte konfigurieren. Nach einigem Herumprobieren waren aber nur drei relevant:</p>
<ol>
<li>Grails Installation (wurde eben in der globalen Konfiguration angelegt)</li>
<li>Targets</li>
<li>grails.work.dir</li>
</ol>
<p>Die Targets kann sich jeder selbst aussuchen aus der Liste, die &#8220;grails help&#8221; ausgibt. Bei mir sind das <code>"test-app -unit --non-interactive" war doc</code>.<br />
Wichtig ist allerdings vor allem der Parameter grails.work.dir!</p>
<p>Das Grails-Plugin erwartet standardmäßig, dass es Zugriff auf das Verzeichnis /usr/share/tomcat6/.grails besitzt um auf den scriptCache zugreifen zu können. Da dieses Verzeichnis aber nicht zwingend freigegeben werden soll, muss ein alternatives Verzeichnis über <code>grails.work.dir</code> gesetzt werden. Andernfalls müssen die Zugriffsrechte mittels <code>sudo chmod -R 777 /usr/share/tomcat6/.grails</code> gesetzt werden.<br />
Das Projekt-Verzeichnis hat noch eine weitere Bedeutung. Wenn man z.B. in Subversion seinen Code unter &#8220;trunk&#8221; eincheckt und keinen expliziten Modulpfad angelegt hat, wird automatisch trunk als Projektname auch in Hudson beim Bauen verwendet. Nun kann man sich vorstellen, dass bei mehreren Projekten, die alle in &#8220;trunk&#8221; liegen dies zu einer Überschneidung führt, die nicht unbedingt erwünscht ist.</p>
<p>Nichtsdestotrotz, bin ich hiermit bereits an das Ende meiner Vorstellung gekommen. Nach der Konfiguration des Jobs einfach auf &#8220;Jetzt bauen&#8221; klicken und schauen was passiert &#8211; ich hoffe mal es funktioniert. Ansonsten: bitte nicht hauen, bei mir läufts <img src='http://www.pincservices.de/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Trac</h3>
<p>Für alle, die jetzt fragend dastehen und wissen wollen: &#8220;aber er hat doch was von Trac erzählt&#8221;. Ja, das habe ich und ja, auch das geht sehr einfach. Nachdem man das Trac-Plugin installiert hat, erscheint ein Eingabefeld in der Job-Konfiguration, in dem man einen Link zum Trac-Projekt hinterlegen. Nachdem man diesen gespeichert hat, erscheint ein simpler Menüpunkt auf der Job-Seite &#8220;Trac&#8221;, der zu der entsprechenden Trac-Seite führt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pincservices.de/wordpress/hudson-und-grails-am-heimischen-herd/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Groovy: copy as</title>
		<link>http://www.pincservices.de/wordpress/groovy-copy-as</link>
		<comments>http://www.pincservices.de/wordpress/groovy-copy-as#comments</comments>
		<pubDate>Mon, 13 Jul 2009 22:02:02 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Shell-Script]]></category>

		<guid isPermaLink="false">http://www.pincservices.de/wordpress/?p=203</guid>
		<description><![CDATA[Ohne viel Geschwafel will ich einfach mal ein kleines Script vorstellen, mit dem sich das Kopieren auf der Konsole etwas lesbarer gestalten lässt.
Der Aufruf kann wie folgt aussehen: copy testFile to ../ as testFile2
Dabei wird die Datei testFile in das Elternverzeichnis kopiert und in testFile2 umbenannt.
Skript zum Download
]]></description>
			<content:encoded><![CDATA[<p>Ohne viel Geschwafel will ich einfach mal ein kleines Script vorstellen, mit dem sich das Kopieren auf der Konsole etwas lesbarer gestalten lässt.<br />
Der Aufruf kann wie folgt aussehen: <code>copy testFile to ../ as testFile2</code><br />
Dabei wird die Datei testFile in das Elternverzeichnis kopiert und in testFile2 umbenannt.</p>
<p><a href="http://www.pincservices.de/wordpress/wp-content/uploads/2009/07/copy" onclick="return TrackClick('http%3A%2F%2Fwww.pincservices.de%2Fwordpress%2Fwp-content%2Fuploads%2F2009%2F07%2Fcopy','Skript+zum+Download')">Skript zum Download</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pincservices.de/wordpress/groovy-copy-as/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
