<?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 &#187; Werkzeuge</title>
	<atom:link href="http://www.pincservices.de/wordpress/category/werkzeuge/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>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>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>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>XML to the XStream</title>
		<link>http://www.pincservices.de/wordpress/xml-to-the-xstream</link>
		<comments>http://www.pincservices.de/wordpress/xml-to-the-xstream#comments</comments>
		<pubDate>Thu, 26 Mar 2009 06:57:49 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Werkzeuge]]></category>
		<category><![CDATA[Mapping]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XStream]]></category>

		<guid isPermaLink="false">http://www.pincservices.de/wordpress/?p=170</guid>
		<description><![CDATA[Wer stand noch nicht vor dem Problem das &#8220;Allheilmittel&#8221;-Format XML parsen zu müssen?
Allein das Implementieren des DOM-Parsers war immer schon ein Aufwand, der zumindest mich immer davon abgeschreckt hatte. Wenn das alleine aber schon nicht genug gewesen wäre, wollen die Werte ja auch weiterverarbeitet werden. D.h. es muss noch ein Mapper geschrieben werden. Aufwand über [...]]]></description>
			<content:encoded><![CDATA[<p>Wer stand noch nicht vor dem Problem das &#8220;Allheilmittel&#8221;-Format XML parsen zu müssen?</p>
<p>Allein das Implementieren des DOM-Parsers war immer schon ein Aufwand, der zumindest mich immer davon abgeschreckt hatte. Wenn das alleine aber schon nicht genug gewesen wäre, wollen die Werte ja auch weiterverarbeitet werden. D.h. es muss noch ein Mapper geschrieben werden. Aufwand über Aufwand&#8230;</p>
<p>Doch wie so oft, ist ein &#8220;Retter in weißer Rüstung&#8221; zur Hilfe geeilt. Nachdem mehrere &#8220;Prinzen&#8221;, wie JAXB auf den Plan getreten sind, erschien letztens noch einer: <a href="http://xstream.codehaus.org/" onclick="return TrackClick('http%3A%2F%2Fxstream.codehaus.org%2F','XStream')" target="_blank">XStream</a>. Eine Bibliothek mit der XML-Mapping in beide Richtungen mit wenigen Zeilen möglich ist. Insbesondere das Einlesen ist extrem einfach.</p>
<pre class="brush: xml;">
&lt;person&gt;
  &lt;firstname&gt;Joe&lt;/firstname&gt;
  &lt;lastname&gt;Walnes&lt;/lastname&gt;
  &lt;phone&gt;
    &lt;code&gt;123&lt;/code&gt;
    &lt;number&gt;1234-456&lt;/number&gt;
  &lt;/phone&gt;
  &lt;fax&gt;
    &lt;code&gt;123&lt;/code&gt;
    &lt;number&gt;9999-999&lt;/number&gt;
  &lt;/fax&gt;
&lt;/person&gt;
</pre>
<pre class="brush: java; toolbar: false;">
Person newJoe = (Person)xstream.fromXML(xml);
</pre>
<p>Und schon hat man sein Objekt. Hierbei sollte man jedoch Vorsicht walten lassen. Xstream ruft standardmäßig keinen Konstruktor auf. Das bedeutet, eigene Variablen, die nicht in der XML-Datei stehen werden gegebenenfalls nicht initialisiert. Wer darauf angewiesen ist, muss einen eigenen <a href="http://xstream.codehaus.org/converter-tutorial.html" onclick="return TrackClick('http%3A%2F%2Fxstream.codehaus.org%2Fconverter-tutorial.html','Converter')" target="_blank">Converter </a>registrieren.</p>
<p>Das Schreiben mit XStream ist ebenso einfach, wenngleich nicht so elegant. Vor allem bei Klassen, die viele Hilfsfelder haben, müssen diese mittels <code>omitField</code> von der Serialisierung ausgeklammert werden. Ein <code>transient</code> vor dem Attribut hilft da glücklicherweise. Es sei hier angemerkt, dass auf Feldebene gearbeitet wird. Man kann also keine Felder &#8220;verstecken&#8221;, da auch vor <code>private</code> nicht Halt gemacht wird.<br />
Hier wäre die Möglichkeit schön, alternativ alle Felder auszuschalten und nur explizit Felder freigeben zu können. Alternativ wäre interessant eher über die öffentlichen Zugriffsmethoden zu gehen.<br />
Ebenfalls ist noch keine Vererbungsprüfung möglich. D.h. wenn ich gleiche Felder in verschiedenen Subklassen existieren, muss jede Subklasse einzeln behandelt werden, was es insbesondere bei Plugin-Architekturen schwierig macht, da dort die Subklassen nicht immer bekannt sind.</p>
<p>Zusammenfassend würde ich sagen, dass XStream ein netter Anfang ist, aber noch einiges an Optimierungspotenzial enthält.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pincservices.de/wordpress/xml-to-the-xstream/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PINC-SOOW published</title>
		<link>http://www.pincservices.de/wordpress/pinc-soow-published</link>
		<comments>http://www.pincservices.de/wordpress/pinc-soow-published#comments</comments>
		<pubDate>Sun, 22 Feb 2009 21:41:24 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Werkzeuge]]></category>

		<guid isPermaLink="false">http://www.pincservices.de/wordpress/?p=153</guid>
		<description><![CDATA[PINC-SOOW ist ein kleiner Wrapper für Savant3, einer PHP-Templating-Engine. Da ich bereits einige Seiten mit Savant erstellt habe &#8211; inklusive pincservices.de &#8211; dachte ich, es wäre interessant einen Aufsatz dafür zu schreiben. SOOW steht dabei für Savant-Object-Oriented-Wrapper. Die Idee dahinter ist, die Erstellung für Laien etwas intuitiver zu gestalten und leichter erweiterbar.
Der Wrapper basiert auf [...]]]></description>
			<content:encoded><![CDATA[<p>PINC-SOOW ist ein kleiner Wrapper für <a href="http://www.phpsavant.com" onclick="return TrackClick('http%3A%2F%2Fwww.phpsavant.com','Savant3')" target="_blank">Savant3</a>, einer PHP-Templating-Engine. Da ich bereits einige Seiten mit Savant erstellt habe &#8211; inklusive <a href="http://www.pincservices.de" onclick="return TrackClick('http%3A%2F%2Fwww.pincservices.de','pincservices.de')">pincservices.de</a> &#8211; dachte ich, es wäre interessant einen Aufsatz dafür zu schreiben. SOOW steht dabei für Savant-Object-Oriented-Wrapper. Die Idee dahinter ist, die Erstellung für Laien etwas intuitiver zu gestalten und leichter erweiterbar.</p>
<p>Der Wrapper basiert auf dem Widget-Prinzip. D.h. alles ist ein Widget. Von der Seite bis zum Formular. Aktuell stehen folgende Widgets zur Verfügung:</p>
<ul>
<li>Page: Eine normale Seite</li>
<li>Section: Seitenbereich, kann auch eine komplette Unterseite darstellen</li>
<li>Form: normales Formular</li>
<li>Menu: diverse Ausprägungen eines Menüs</li>
</ul>
<p>Jedes Widget kann mit einem Template individualisiert werden. Diese können unter <em>custom/templates</em> erstellt werden, da sich unter <em>widgets</em> die Standardtemplates befinden und diese auch nicht geändert werden sollten. Beispiele befinden sich in dem Verzeichnis <em>samples</em>.</p>
<p>Download: <a href="http://www.pincservices.de/downloads/pinc-soow.zip" onclick="return TrackClick('http%3A%2F%2Fwww.pincservices.de%2Fdownloads%2Fpinc-soow.zip','pinc-soow.zip')">pinc-soow.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pincservices.de/wordpress/pinc-soow-published/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Meistere deinen Geist &#8230;&#8221;</title>
		<link>http://www.pincservices.de/wordpress/meistere-deinen-geist</link>
		<comments>http://www.pincservices.de/wordpress/meistere-deinen-geist#comments</comments>
		<pubDate>Sun, 23 Nov 2008 23:33:01 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Projektverwaltung]]></category>
		<category><![CDATA[Werkzeuge]]></category>
		<category><![CDATA[mind mapping]]></category>
		<category><![CDATA[mindmeister]]></category>
		<category><![CDATA[tool]]></category>

		<guid isPermaLink="false">http://www.pincservices.de/wordpress/?p=75</guid>
		<description><![CDATA[Im letzten Artikel &#8220;Befreie deinen Geist &#8230;&#8221; habe ich ein Werkzeug vorgestellt, mit dem man einfach und schnell Mindmaps erstellen kann. Allerdings nur offline. Wer das ganze online machen mÃ¶chte sollte hier vorbeischauen: http://www.mindmeister.com/ (Link provided by Simonidossos).
]]></description>
			<content:encoded><![CDATA[<p>Im letzten Artikel <a href="http://www.pincservices.de/wordpress/befreie-deinen-geist" onclick="return TrackClick('http%3A%2F%2Fwww.pincservices.de%2Fwordpress%2Fbefreie-deinen-geist','%22Befreie+deinen+Geist+...%22')" target="_self">&#8220;Befreie deinen Geist &#8230;&#8221;</a> habe ich ein Werkzeug vorgestellt, mit dem man einfach und schnell Mindmaps erstellen kann. Allerdings nur offline. Wer das ganze online machen mÃ¶chte sollte hier vorbeischauen: <a href="http://www.mindmeister.com/" onclick="return TrackClick('http%3A%2F%2Fwww.mindmeister.com%2F','http%3A%2F%2Fwww.mindmeister.com%2F')" target="_blank">http://www.mindmeister.com/</a> (Link provided by <a href="http://landofideas.blogspot.com" onclick="return TrackClick('http%3A%2F%2Flandofideas.blogspot.com','Simonidossos')" target="_blank">Simonidossos</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pincservices.de/wordpress/meistere-deinen-geist/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Befreie deinen Geist &#8230;&#8221;</title>
		<link>http://www.pincservices.de/wordpress/befreie-deinen-geist</link>
		<comments>http://www.pincservices.de/wordpress/befreie-deinen-geist#comments</comments>
		<pubDate>Sun, 23 Nov 2008 23:02:33 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Projektverwaltung]]></category>
		<category><![CDATA[Werkzeuge]]></category>
		<category><![CDATA[freemind]]></category>
		<category><![CDATA[mind mapping]]></category>
		<category><![CDATA[tool]]></category>

		<guid isPermaLink="false">http://www.pincservices.de/wordpress/?p=65</guid>
		<description><![CDATA[So trivial die Worte im Film &#8220;Matrix&#8221; auch klingen mÃ¶gen, so schwer tut man sich in der RealitÃ¤t damit. Insbesondere wenn man gerade mitten in einer Konzeption fÃ¼r ein neues Produkt, Feature oder allgemeinen Idee steckt. Jetzt wird der ein oder andere aufschreien: &#8220;Mindmapping&#8221;Â  &#8211; und ja meine Freunde der Kommunikationsseminare zwischen 1995 und 2000, [...]]]></description>
			<content:encoded><![CDATA[<p>So trivial die Worte im Film &#8220;Matrix&#8221; auch klingen mÃ¶gen, so schwer tut man sich in der RealitÃ¤t damit. Insbesondere wenn man gerade mitten in einer Konzeption fÃ¼r ein neues Produkt, Feature oder allgemeinen Idee steckt. Jetzt wird der ein oder andere aufschreien: &#8220;Mindmapping&#8221;Â  &#8211; und ja meine Freunde der Kommunikationsseminare zwischen 1995 und 2000, die Antwort lautet Mindmapping. Aber nicht irgendwie sondern schlicht und einfach mit <a href="http://freemind.sourceforge.net/wiki/index.php/Main_Page" onclick="return TrackClick('http%3A%2F%2Ffreemind.sourceforge.net%2Fwiki%2Findex.php%2FMain_Page','FreeMind')" target="_blank">FreeMind</a>.</p>
<p>FreeMind bietet viel freie FlÃ¤che zum Erstellen von Gedankenblasen &#8211; die mÃ¼ssen wirklich nicht immer sinnvoll gefÃ¼llt sein *gg*. ZusÃ¤tzlich lassen sich auch gleich ein paar Icons hinzufÃ¼gen um den Blick des Betrachters etwas zu fÃ¼hren, da es, wie so oft bei freien Gedanken, schnell unÃ¼bersichtlich werden kann. Zwar hat man das bei FreeMind im Sinne des Mindmappings damit zu lÃ¶sen versucht, dass die Gedanken baumstrukturiert dargestellt werden (siehe <a href="http://freemind.sourceforge.net/wiki/index.php/Screenshots" onclick="return TrackClick('http%3A%2F%2Ffreemind.sourceforge.net%2Fwiki%2Findex.php%2FScreenshots','Screenshots')" target="_blank">Screenshots</a>) und TeilbÃ¤ume ausblendbar sind.</p>
<p><a href="http://freemind.sourceforge.net/FreeMind-learning-german.png" onclick="return TrackClick('http%3A%2F%2Ffreemind.sourceforge.net%2FFreeMind-learning-german.png','Beispiel-Screenshot')" target="_blank"><img class="alignnone" title="Beispiel-Screenshot" src="http://freemind.sourceforge.net/FreeMind-learning-german.png" onclick="return TrackClick('http%3A%2F%2Ffreemind.sourceforge.net%2FFreeMind-learning-german.png','Beispiel-Screenshot')" alt="" width="412" height="300" /></a></p>
<p>Leider fÃ¼hrt dies aber gerade bei umfangreicheren Konstrukten am Anfang genau ins Gegenteil und man ist mehr damit beschÃ¤ftigt welche &#8220;Gedanken&#8221; auf welche Ebene gehÃ¶ren und in welchem geschlossenen Teilbaum sich gerade der benÃ¶tigte &#8220;Gedanke&#8221; befindet. AuÃŸerdem sollte man unter Linux frÃ¼hestens bei Version 0.8.1 beginnen, da vorher die Eingabe und Darstellung so fehlerhaft ist (z.B. Mausklicks funktionieren nur sporadisch, Darstellungsfehler beim Verschieben von Knoten), dass man nach einigen Minuten schon frustriert aufgeben will.</p>
<p>Leider lÃ¤sst auch die aktuelle Version (0.8.1) noch Einiges an Benutzerfreundlichkeit offen &#8211; z.B. lassen sich spontane Gedankenzweige nicht unverknÃ¼pft anlegen oder Knoten lassen sich noch nicht mit Notizen versehen, was insbesondere in Kombination damit unpraktisch ist, dass Knoten standardmÃ¤ÃŸig einzeilig sind (man muss entweder Alt+Eingabe drÃ¼cken oder im KontextmenÃ¼ &#8220;Knoten in einem separaten Editor bearbeiten &#8230;&#8221; auswÃ¤hlen um mehrere Zeilen schreiben zu kÃ¶nnen).</p>
<p>Und wieder muss ich mich bei <a href="http://landofideas.blogspot.com/" onclick="return TrackClick('http%3A%2F%2Flandofideas.blogspot.com%2F','Simonidossos')" target="_blank">Simonidossos</a> fÃ¼r eine exzellente Empfehlung bedanken.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pincservices.de/wordpress/befreie-deinen-geist/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
