<?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>Patrick Gotthard</title>
	<atom:link href="http://www.patrick-gotthard.de/feed" rel="self" type="application/rss+xml" />
	<link>http://www.patrick-gotthard.de</link>
	<description>Softwareentwickler und Systemadministrator</description>
	<lastBuildDate>Wed, 16 May 2012 13:15:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Mac OS Lion von Windows aus per VNC fernsteuern</title>
		<link>http://www.patrick-gotthard.de/9176/mac-os-lion-von-windows-aus-per-vnc-fernsteuern</link>
		<comments>http://www.patrick-gotthard.de/9176/mac-os-lion-von-windows-aus-per-vnc-fernsteuern#comments</comments>
		<pubDate>Tue, 15 May 2012 18:46:59 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Artikel]]></category>
		<category><![CDATA[Mac OS Lion]]></category>
		<category><![CDATA[TightVNC]]></category>
		<category><![CDATA[VNC]]></category>

		<guid isPermaLink="false">http://www.patrick-gotthard.de/?p=9176</guid>
		<description><![CDATA[Dieser Artikel erläutert, wie man Mac OS Lion von Windows aus per VNC fernsteuern kann.]]></description>
			<content:encoded><![CDATA[<p>Vor kurzem habe ich <a href="https://www.virtualbox.org/">VirtualBox</a> auf meinem MacBook installiert, um einen Entwicklungsserver zu virtualisieren. Zum komfortablen Anfertigen und Rückspielen von Snapshots benötige ich deshalb Remotezugriff. Da Mac OS von Haus aus <a href="http://de.wikipedia.org/wiki/Virtual_Network_Computing">VNC</a> unterstützt, bietet sich diese Möglichkeit natürlich an. Doch am Anfang wollte das Vorhaben nicht wie erwartet funktionieren. Doch die Lösung ist eigentlich ganz simpel&#8230;<span id="more-9176"></span></p>
<p>Zunächst muss natürlich die VNC Freigabe in den Systemeinstellungen aktiviert werden:</p>
<p><img class="aligncenter size-large wp-image-9177" title="VNC unter Mac OS Lion aktivieren" src="http://www.patrick-gotthard.de/wp-content/uploads/mac-os-lion-vnc-activation-600x516.png" alt="" width="600" height="516" /></p>
<p>Die ersten Versuche, mich mit <a href="http://www.tightvnc.com/">TightVNC</a> zu dem MacBook zu verbinden, schlugen mit der Fehlermeldung, dass die angeforderte Verschlüsselung nicht unterstützt wird, fehl. Diese Fehlermeldung ist recht irreführend, denn eine simple Einstellung unter Mac OS ist schuld. Es muss zwingend ein separates VNC Passwort festgelegt werden (nach erfolgreichem Verbindungsaufbau muss man sich noch einmal am System selbst anmelden), damit man sich per VNC verbinden kann:</p>
<p><img class="aligncenter size-large wp-image-9178" title="VNC Passwort unter Mac OS Lion festlegen" src="http://www.patrick-gotthard.de/wp-content/uploads/mac-os-lion-vnc-password-600x516.png" alt="" width="600" height="516" /></p>
<p>Nachdem das Passwort festgelegt ist, sollte die Verbindung problemlos zustande kommen. Und ich bin wirklich überrascht, wie gut der VNC Server funktioniert: eine so schnelle VNC Verbindung habe ich bisher noch nicht erlebt. Selbst die Fensteranimationen laufen fast flüssig <img src='http://www.patrick-gotthard.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.patrick-gotthard.de/9176/mac-os-lion-von-windows-aus-per-vnc-fernsteuern/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PuTTY Tunnel Manager</title>
		<link>http://www.patrick-gotthard.de/9167/putty-tunnel-manager</link>
		<comments>http://www.patrick-gotthard.de/9167/putty-tunnel-manager#comments</comments>
		<pubDate>Mon, 14 May 2012 19:26:58 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Artikel]]></category>
		<category><![CDATA[PuTTY]]></category>
		<category><![CDATA[PuTTY Tunnel Manager]]></category>
		<category><![CDATA[SSH]]></category>

		<guid isPermaLink="false">http://www.patrick-gotthard.de/?p=9167</guid>
		<description><![CDATA[Mit dem PuTTY Tunnel Manager kann man SSH Tunnel aufbauen, ohne die Kommandozeile dauerhaft geöffnet haben zu müssen.]]></description>
			<content:encoded><![CDATA[<p>Wer häufiger mit SSH Tunneln arbeitet, aber keinen Zugriff auf die Kommandozeile benötigt, kennt unter Windows vielleicht das Problem, dass einen das durchgehend geöffnete <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html">PuTTY</a> Fenster stört. Heute habe ich jedoch den <a href="http://code.google.com/p/putty-tunnel-manager/">PuTTY Tunnel Manager</a> gefunden, mit dem dieses Problem sehr leicht aus der Welt geschafft werden kann.<span id="more-9167"></span></p>
<p>Dazu lädt man zunächst die neuste Version des PuTTY Tunnel Managers von der <a href="http://code.google.com/p/putty-tunnel-manager/downloads/list">Downloadseite</a> herunter (<strong>ptman.exe</strong>) und wirft diese einfach in das Installationsverzeichnis von PuTTY. Nach dem Start des Tools erscheint ein neues Icon im System Tray.</p>
<p>Über dessen Kontextmenü können die Einstellungen des Programms sowie bereits in PuTTY eingerichtete SSH Tunnel aufgebaut werden:</p>
<p><img class="aligncenter size-full wp-image-9169" title="PuTTY Tunnel Manager Kontextmenü" src="http://www.patrick-gotthard.de/wp-content/uploads/ptman-kontextmenue.png" alt="" width="372" height="163" /></p>
<p>In den Einstellungen können bequem neue Tunnel eingerichtet werden &#8211; und das wesentlich übersichtlicher als bei PuTTY selbst.</p>
<p>&nbsp;</p>
<p>Über die Option <strong>Use PuTTY Tunnel Manager to store tunnels</strong> werden die eingerichteten Tunnel von PuTTY importiert und gleichzeitig aus PuTTY gelöscht, sodass PuTTY selbst keine Tunnel mehr aufbaut, sobald man sich mit einem entsprechenden Server verbindet.</p>
<p><img class="aligncenter size-full wp-image-9172" title="PuTTY Tunnel Manager Einstellungen" src="http://www.patrick-gotthard.de/wp-content/uploads/ptman-einstellungen.png" alt="" width="429" height="524" /></p>
<p>Mit einem linken Mausklick auf das Icon können alle aufgebauten Tunnel übersichtlich dargestellt werden:</p>
<p><img class="aligncenter size-full wp-image-9175" title="PuTTY Tunnel Manager - Offene Tunnel" src="http://www.patrick-gotthard.de/wp-content/uploads/ptman-offene-tunnel.png" alt="" width="258" height="144" /></p>
<p>Insgesamt finde ich das Tool sehr gelungen und es landet nun definitiv in meiner dauerhaften Toolkiste <img src='http://www.patrick-gotthard.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.patrick-gotthard.de/9167/putty-tunnel-manager/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JRuby manuell unter Linux installieren</title>
		<link>http://www.patrick-gotthard.de/9165/jruby-manuell-unter-linux-installieren</link>
		<comments>http://www.patrick-gotthard.de/9165/jruby-manuell-unter-linux-installieren#comments</comments>
		<pubDate>Sun, 13 May 2012 14:51:22 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Artikel]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JRuby]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.patrick-gotthard.de/?p=9165</guid>
		<description><![CDATA[Diese Anleitung beschreibt die manuelle JRuby Installation unter Linux.]]></description>
			<content:encoded><![CDATA[<p><a href="http://jruby.org/">JRuby</a> ist eine in Java geschriebene Ruby Implementierung, die den größten Teil des Ruby Sprachumfangs nachbilden kann und die Interaktion der Sprachen in beide Richtungen zulässt. Zwar bieten die meisten Linux Distributionen die Möglichkeit, JRuby über die Paketverwaltung zu installieren, häufig handelt es sich dabei jedoch nicht um die neuste verfügbare Version. Dieser Artikel beschreibt deshalb die manuelle JRuby Installation unter Linux.<span id="more-9165"></span></p>
<p>Zunächst wechselst du in das Verzeichnis <strong>/usr/lib</strong>:</p>
<pre class="brush:shell">cd /usr/lib</pre>
<p>Danach kopierst du dir von der <a href="http://jruby.org/download">JRuby Downloadseite</a> den Downloadlink der gewünschten JRuby Version im <strong>tar.gz</strong> Format in die Zwischenablage und lädst das Paket herunter:</p>
<pre class="brush:shell">wget &lt;URL&gt;</pre>
<p>Das heruntergeladene Archiv wird nun entpackt und kann dann gelöscht werden:</p>
<pre class="brush:shell">tar xzf jruby-bin-&lt;Version&gt;.tar.gz
rm jruby-bin-&lt;Version&gt;.tar.gz</pre>
<p>Jetzt müssen nurnoch JRuby Umgebungsvariablen eingerichtet werden. Öffne dazu die Datei <strong>/etc/environment</strong> mit einem Texteditor</p>
<pre class="brush:shell">nano /etc/environment</pre>
<p>und erweitere zunächst den Path um folgende Angabe:</p>
<pre class="brush:plain">:/usr/lib/jruby-&lt;Version&gt;</pre>
<p>Danach wird in der Datei noch die Umgebungsvariable <strong>JRUBY_HOME</strong> gesetzt:</p>
<pre class="brush:shell">JRUBY_HOME="/usr/lib/jruby-&lt;Version&gt;"</pre>
<p>Abspeichern und fertig. Um die erfolgreiche Installation zu testen, muss sich nun einmal ab- und wieder angemeldet werden. Danach wird der Befehl</p>
<pre class="brush:shell">jruby -v</pre>
<p>ausgeführt und sollte ein ähnliches Ergebnis liefern:</p>
<pre class="brush:plain">jruby 1.6.7.2 (ruby-1.8.7-p357) (2012-05-01 26e08ba) (OpenJDK 64-Bit Server VM 1.7.0_03) [linux-amd64-java]</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.patrick-gotthard.de/9165/jruby-manuell-unter-linux-installieren/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>SQL Queries mit Spring aus dem Java Quellcode auslagern</title>
		<link>http://www.patrick-gotthard.de/9146/sql-queries-mit-spring-aus-dem-java-quellcode-auslagern</link>
		<comments>http://www.patrick-gotthard.de/9146/sql-queries-mit-spring-aus-dem-java-quellcode-auslagern#comments</comments>
		<pubDate>Fri, 04 May 2012 16:00:08 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Artikel]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.patrick-gotthard.de/?p=9146</guid>
		<description><![CDATA[Dieser Artikel zeigt, wie man SQL Queries mit Spring aus dem Java Quellcode auslagern kann.]]></description>
			<content:encoded><![CDATA[<p>Wer häufiger mit Datenbanken arbeitet, kennt das Problem: längere SQL Queries werden in Java meist mit einem StringBuilder zusammengesetzt und sind schwieriger zu warten als ausgelagerte Queries (z.B. wenn man die Query einmal kopieren und direkt im Query Browser testen möchte). Heute habe ich eine ebenso einfache wie auch geniale Möglichkeit kennengelernt, um SQL Queries mit Spring auszulagern.<span id="more-9146"></span></p>
<p>Vor einiger Zeit habe ich bereits beschrieben, wie man <a title="Properties und Umgebungsvariablen in der Spring Konfiguration nutzen" href="http://www.patrick-gotthard.de/143/properties-und-umgebungsvariablen-in-der-spring-konfiguration-nutzen">Properties mit dem PropertySourcesPlaceholderConfigurer von Spring einbinden</a> kann. Diesen Mechanismus kann man auch dafür nutzen, um SQL Queries auszulagern.</p>
<p>Als Ausgangsbasis dient folgende SQL Query, die &#8211; soweit wie möglich &#8211; lesbar formatiert im Quellcode untergebracht wurde:</p>
<pre class="brush:java">public class InlineSQLExample {

	public User getUser() {

		final StringBuilder sqlBuilder = new StringBuilder();
		sql.append(" SELECT ");
		sql.append(" 	* ");
		sql.append(" FROM ");
		sql.append(" 	users ");
		sql.append(" WHERE ");
		sql.append(" 	username = :username AND ");
		sql.append(" 	password = :password ");
		final String sql = sqlBuilder.toString();

		// do some db stuff here
	}
}</pre>
<p>Die Query schreibt man nun in eine ganz normale Properties Datei im XML Format und vergibt einen aussagekräftigen und gleichzeitig eindeutigen Schlüssel:</p>
<pre class="brush:xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"&gt;
&lt;properties&gt;
	&lt;comment&gt;This comment is optional&lt;/comment&gt;
	&lt;entry key="getUserQuery"&gt;
		SELECT
			*
		FROM
			users
		WHERE
			username = :username AND
			password = :password
	&lt;/entry&gt;
&lt;/properties&gt;</pre>
<p>Unter der Annahme, dass die Properties Datei mit <strong>GetUserQuery.xml</strong> benannt worden ist und auf oberster Ebene im Classpath liegt, können die Einträge (im Beispiel nur ein Eintrag) aus der Properties Datei wie folgt über die Spring Konfigurationsdatei verfügbar gemacht werden:</p>
<pre class="brush:xml">&lt;bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"&gt;
	&lt;property name="location" value="classpath:GetUserQuery.xml" /&gt;
&lt;/bean&gt;</pre>
<p>Die Query kann dann über die Annotation <strong>@Value</strong> in die entsprechende Klasse eingesetzt werden. Das obige Beispiel sieht dann so aus:</p>
<pre class="brush:java">public class OutsourcedSQLExample {

	@Value("${getUserQuery}")
	private String sql;

	public User getUser() {
		// do some db stuff here
	}
}</pre>
<p>Die Vorteile liegen klar auf der Hand: die SQL Queries können unkompliziert bearbeitet und kopiert werden, ohne das StringBuilder.append() Gerüst drum herum bauen zu müssen. Außerdem steigt die Lesbarkeit und damit auch Wartbarkeit immens.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.patrick-gotthard.de/9146/sql-queries-mit-spring-aus-dem-java-quellcode-auslagern/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>techspread.de und patrick-gotthard.de zusammengeführt</title>
		<link>http://www.patrick-gotthard.de/9065/techspread-de-und-patrick-gotthard-de-zusammengefuehrt</link>
		<comments>http://www.patrick-gotthard.de/9065/techspread-de-und-patrick-gotthard-de-zusammengefuehrt#comments</comments>
		<pubDate>Wed, 02 May 2012 19:25:08 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.patrick-gotthard.de/?p=9065</guid>
		<description><![CDATA[Soeben habe ich www.techspread.de und www.patrick-gotthard.de zusammengeführt]]></description>
			<content:encoded><![CDATA[<p>Vor kurzem habe ich meine alte Domain patrick-gotthard.de wieder ins Leben zurückgeholt. Doch schnell habe ich gemerkt, dass ich damit techspread.de komplett vernachlässige. Deshalb habe ich die beiden Blogs nun unter patrick-gotthard.de zusammengeführt.<span id="more-9065"></span></p>
<p>Thematisch werde ich hier in Zukunft wohl eher auf die Java Entwicklung eingehen, aber es werden auch hin und wieder andere Artikel eingestreut. Ich hoffe, ihr nimmt mir diesen drastischen Schritt nicht weiter übel, ich wollte dem Blog nur wieder etwas mehr Persönlichkeit einhauchen. Schon damals fanden einige, dass ich lieber auf www.patrick-gotthard.de hätte weitermachen sollen, ich hoffe, das hat sich nicht geändert <img src='http://www.patrick-gotthard.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.patrick-gotthard.de/9065/techspread-de-und-patrick-gotthard-de-zusammengefuehrt/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>JVM Shutdown Hooks &#8211; Aktionen beim Beenden der JVM ausführen</title>
		<link>http://www.patrick-gotthard.de/421/jvm-shutdown-hooks-aktionen-beim-beenden-der-jvm-ausfuehren</link>
		<comments>http://www.patrick-gotthard.de/421/jvm-shutdown-hooks-aktionen-beim-beenden-der-jvm-ausfuehren#comments</comments>
		<pubDate>Sun, 22 Apr 2012 10:29:36 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Artikel]]></category>
		<category><![CDATA[Shutdown Hook]]></category>

		<guid isPermaLink="false">http://www.patrick-gotthard.de/?p=421</guid>
		<description><![CDATA[Dieser Artikel zeigt, wie man Aktionen beim Beenden der JVM über JVM Shutdown Hooks ausführen lassen kann.]]></description>
			<content:encoded><![CDATA[<p>Ich habe mir schon ein paar Mal die Frage gestellt, wie man auf das ungeplante Beenden einer Anwendung reagieren kann, also z.B. wenn der Benutzer ein Kommandozeilenprogramm per STRG + C abbricht. Heute habe ich mich mal schlau gemacht und bin bei den relativ unbekannten <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29">JVM Shutdown Hooks</a> fündig geworden.<span id="more-421"></span></p>
<p>Solche JVM Shutdown Hooks sind sehr einfach zu implementieren. Es muss einfach ein Thread erzeugt werden, der als Shutdown Hook in die JVM eingebunden und automatisch beim Beenden der JVM ausgeführt wird.</p>
<p>Zur Erläuterung dient  folgendes, sehr einfaches Beispiel. Zunächst habe ich ein Runnable implementiert:</p>
<pre class="brush:java">public class ShutdownHook implements Runnable {

	@Override
	public void run() {
		System.out.println("Called the shutdown hook!");
	}

}</pre>
<p>Der Code innerhalb der run-Methode wird später automatisch beim Beenden der JVM ausgeführt. Dazu kommt dann noch eine Klasse zur Ausführung der Anwendung:</p>
<pre class="brush:java">public class Main {

	public static void main(String[] args) {
		Thread shutdownHook = new Thread(new ShutdownHook());
		Runtime.getRuntime().addShutdownHook(shutdownHook);
	}

}</pre>
<p>Aus dem Runnable wird hier zunächst ein Thread-Objekt erzeugt. Wer möchte, kann auch gleich bei der Implementierung des Shutdown Hooks von Thread ableiten, die Implementierung von Runnable ist aber in der Regel vorzuziehen. Danach wird der erzeugte Thread einfach bei der JVM als Shutdown Hook registriert und somit automatisch beim Beenden der JVM ausgeführt.</p>
<p>Shutdown Hooks sollten jedoch mit Bedacht eingesetzt werden. In einigen Situationen steht der JVM nur eine begrenzte Zeit zum Beenden zur Verfügung, z.B. wenn der Benutzer das System herunter fährt. Weitere Details findet man in der Java Dokumentation.</p>
<h3>Quellen und weiterführende Links</h3>
<ul>
<li><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29">Offizielle Java Dokumentation zur addShutDownHook Methode</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.patrick-gotthard.de/421/jvm-shutdown-hooks-aktionen-beim-beenden-der-jvm-ausfuehren/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache Derby Datenbank in Anwendung einbinden</title>
		<link>http://www.patrick-gotthard.de/409/apache-derby-datenbank-in-anwendung-einbinden</link>
		<comments>http://www.patrick-gotthard.de/409/apache-derby-datenbank-in-anwendung-einbinden#comments</comments>
		<pubDate>Wed, 18 Apr 2012 15:27:30 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Artikel]]></category>
		<category><![CDATA[Apache Derby]]></category>
		<category><![CDATA[Maven]]></category>

		<guid isPermaLink="false">http://www.patrick-gotthard.de/?p=409</guid>
		<description><![CDATA[Dieser Artikel zeigt, wie man Apache Derby ohne Persistenzframework in eigene Java Anwendungen einbinden kann.]]></description>
			<content:encoded><![CDATA[<p>Apache Derby ist eine in Java implementierte SQL-Datenbank, die entweder eigenständig gestartet oder auch in ein Java-Programm eingebunden werden kann. Letzteres ist vor allem dann sinnvoll, wenn die Installation eines separaten Datenbankservers aus irgendeinem Grund zu aufwändig ist (zum Beispiel, wenn es um ein einfaches Anwenderprogramm geht). Dieser Artikel zeigt, wie man Apache Derby ohne Persistenzframework in eine Anwendung einbetten kann.<span id="more-409"></span></p>
<p>Zunächst benötigt man die entsprechende Derby Bibliothek. Bei Maven trägt man einfach folgende Abhängigkeit in die <strong>pom.xml</strong> ein:</p>
<pre class="brush:xml">&lt;dependency&gt;
	&lt;groupId&gt;org.apache.derby&lt;/groupId&gt;
	&lt;artifactId&gt;derby&lt;/artifactId&gt;
	&lt;version&gt;10.8.2.2&lt;/version&gt;
&lt;/dependency&gt;</pre>
<p>Ansonsten lädt man sich von der <a href="http://db.apache.org/derby/derby_downloads.html">Apache Derby Downloadseite</a> das neuste lib-Paket herunter. In dem Paket sind mehrere jar Dateien enthalten, es wird daraus aber nur die <strong>derby.jar</strong> benötigt. Sobald die Bibliothek eingebunden ist, kann die Datenbank verwendet werden. Ich zeige nun eine simple Klasse, mit der man die Datenbank starten und stoppen kann, wobei beim ersten Start automatisch die Tabelle <em>users</em> angelegt wird.</p>
<pre class="brush:java">package de.patrickgotthard.derbyapp;

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Database {

	private Connection connection;
	private final String database = "userdb";

	public void start() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
		Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
		if (new File(database).exists()) {
			connection = DriverManager.getConnection("jdbc:derby:" + database);
		} else {
			connection = DriverManager.getConnection("jdbc:derby:" + database + ";create=true");
			initTables();
		}
	}

	private void initTables() throws SQLException {
		connection.prepareStatement("CREATE TABLE users (username VARCHAR(50), password VARCHAR(32))").execute();
	}

	public void stop() {
		try {
			DriverManager.getConnection("jdbc:derby:" + database + ";shutdown=true");
		} catch (final Exception e) {
			e.printStackTrace();
		}
	}

}</pre>
<p>Die Klasse sollte nun nach belieben für den eigenen Zweck angepasst werden. Ohne Persistenzframework wird natürlich die reine JDBC API verwendet.</p>
<p>Es soll nicht unerwähnt bleiben, dass laut Dokumentation beim Stoppen der Datenbank immer eine SQLException geworfen wird. Das ist vollkommen normal und kann ignoriert werden. Sollte eine Datenbank nicht korrekt gestoppt (zum Beispiel wenn man das Programm einfach abschießt) und dann wieder gestartet werden, startet die Datenbank einfach ein wenig langsamer, da Recovery-Routinen angestoßen werden.</p>
<h3>Quellen und weiterführende Links</h3>
<ul>
<li><a href="http://db.apache.org/derby/">Apache Derby Webseite</a></li>
<li><a href="http://www.torsten-horn.de/techdocs/java-sql.htm">Thorsten Horn &#8211; SQL mit Java</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.patrick-gotthard.de/409/apache-derby-datenbank-in-anwendung-einbinden/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scala 2.9.2 veröffentlicht</title>
		<link>http://www.patrick-gotthard.de/414/scala-2-9-2-veroeffentlicht</link>
		<comments>http://www.patrick-gotthard.de/414/scala-2-9-2-veroeffentlicht#comments</comments>
		<pubDate>Tue, 17 Apr 2012 06:34:38 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://www.patrick-gotthard.de/?p=414</guid>
		<description><![CDATA[Am 13.04.2012 wurde Version 2.9.2 der Programmiersprache Scala veröffentlicht.]]></description>
			<content:encoded><![CDATA[<p>Vor ein paar Tagen wurde Version 2.9.2 der Programmiersprache Scala (<strong>Sca</strong>leable <strong>La</strong>nguage) veröffentlicht. Scala kann sowohl in einer Java Laufzeitumgebung, als auch auf Android (<a href="http://de.wikipedia.org/wiki/Dalvik_Virtual_Machine">DalvikVM</a>) oder unter .NET ausgeführt werden und wartet mit vielen interessanten Sprachfunktionen auf.<span id="more-414"></span></p>
<p>Bisher habe ich leider noch keine Zeit gefunden, mich einmal näher mit Scala auseinanderzusetzen. Dieses Vorhaben steht aber definitiv auf meiner TODO Liste. Hat jemand von euch schon einmal Erfahrungen mit Scala gemacht und kann einen kleinen Vergleich zu Java anstellen (wie gut ist z.B. die Dokumentation, wie schwer ist die Einarbeitung etc.)?</p>
<h3>Quellen und weiterführende Links</h3>
<ul>
<li><a href="http://www.heise.de/developer/meldung/Scala-2-9-2-veroeffentlicht-1525767.html">heise Developer - Scala 2.9.2 veröffentlicht</a></li>
<li><a href="http://www.scala-lang.org/node/12603">Scala 2.9.2 Changelog</a></li>
<li><a href="http://www.scala-lang.org/">Scala Webseite</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.patrick-gotthard.de/414/scala-2-9-2-veroeffentlicht/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache Lucene und Solr in Version 3.6 veröffentlicht</title>
		<link>http://www.patrick-gotthard.de/351/apache-lucene-und-solr-in-version-3-6-veroeffentlicht</link>
		<comments>http://www.patrick-gotthard.de/351/apache-lucene-und-solr-in-version-3-6-veroeffentlicht#comments</comments>
		<pubDate>Fri, 13 Apr 2012 13:51:38 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[Solr]]></category>

		<guid isPermaLink="false">http://www.patrick-gotthard.de/?p=351</guid>
		<description><![CDATA[Gestern wurde Version 3.6 des Indizierungs- und Suchframeworks Apache Lucene und des darauf aufbauenden Suchservers Apache Solr veröffentlicht. Das Framework kann in verschiedensten Projektgrößen eingesetzt werden. So ist das Framework sowohl in einfachen Anwendung zu finden, kommt aber auch bei Twitter und Wikipedia zum Einsatz. Quellen und weiterführende Links heise Developer: Such-Engine: Apache Lucene und [...]]]></description>
			<content:encoded><![CDATA[<p>Gestern wurde Version 3.6 des Indizierungs- und Suchframeworks Apache Lucene und des darauf aufbauenden Suchservers Apache Solr veröffentlicht. Das Framework kann in verschiedensten Projektgrößen eingesetzt werden. So ist das Framework sowohl in einfachen Anwendung zu finden, kommt aber auch bei Twitter und Wikipedia zum Einsatz.<span id="more-351"></span></p>
<h3>Quellen und weiterführende Links</h3>
<ul>
<li><a href="http://www.heise.de/developer/meldung/Such-Engine-Apache-Lucene-und-Solr-in-Version-3-6-1525032.html">heise Developer: Such-Engine: Apache Lucene und Solr in Version 3.6</a></li>
<li><a href="http://lucene.apache.org/">Apache Lucene Webseite</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.patrick-gotthard.de/351/apache-lucene-und-solr-in-version-3-6-veroeffentlicht/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>logback einbinden, konfigurieren und nutzen</title>
		<link>http://www.patrick-gotthard.de/332/logback-einbinden-konfigurieren-und-nutzen</link>
		<comments>http://www.patrick-gotthard.de/332/logback-einbinden-konfigurieren-und-nutzen#comments</comments>
		<pubDate>Sat, 07 Apr 2012 13:00:30 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Artikel]]></category>
		<category><![CDATA[logback]]></category>
		<category><![CDATA[SLF4J]]></category>

		<guid isPermaLink="false">http://www.patrick-gotthard.de/?p=332</guid>
		<description><![CDATA[Nachdem ich eben schon einen Artikel mit vielen guten Gründen veröffentlicht habe, warum man von log4j auf logback wechseln sollte, demonstriere ich jetzt, wie man logback in die eigene Anwendung einbindet und nutzt. logback einbinden Zunächst werden die Module logback-core und logback-classic benötigt. Bei Maven fügt man hierzu einfach folgende Abhängigkeit hinzu: &#60;dependency&#62; &#60;groupId&#62;ch.qos.logback&#60;/groupId&#62; &#60;artifactId&#62;logback-classic&#60;/artifactId&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem ich eben schon einen Artikel mit vielen guten Gründen veröffentlicht habe, <a href="http://www.patrick-gotthard.de/artikel/logback-der-nachfolger-von-log4j">warum man von log4j auf logback wechseln sollte</a>, demonstriere ich jetzt, wie man logback in die eigene Anwendung einbindet und nutzt.<span id="more-332"></span></p>
<h2>logback einbinden</h2>
<p>Zunächst werden die Module <strong>logback-core</strong> und <strong>logback-classic</strong> benötigt. Bei Maven fügt man hierzu einfach folgende Abhängigkeit hinzu:</p>
<pre class="brush:xml">&lt;dependency&gt;
	&lt;groupId&gt;ch.qos.logback&lt;/groupId&gt;
	&lt;artifactId&gt;logback-classic&lt;/artifactId&gt;
	&lt;version&gt;1.0.1&lt;/version&gt;
&lt;/dependency&gt;</pre>
<p>Ansonsten ist normalerweise keine spezielle Konfiguration notwendig. logback verwendet folgenden Initialisierungsprozess:</p>
<ul>
<li>suche nach <strong>logback.groovy</strong> im Classpath</li>
<li>suche nach <strong>logback-test.xml</strong> im Classpath</li>
<li>suche nach <strong>logback.xml</strong> im Classpath</li>
<li>schreibe Logmeldungen in die Standardausgabe (Nutzung des <strong>DefaultConfigurers</strong>)</li>
</ul>
<p>Sobald ein Kriterium (ausgenommen der Fallback Lösung am Ende) eintrifft, wird die entsprechende Konfigurationsdatei verwendet. Die Datei <strong>logback-test.xml</strong> nimmt eine kleine Sonderstellung ein. Wenn diese Datei bei der Verwendung von Maven in dem Ordner <strong>src/test/resources</strong> abgelegt wird, sorgt Maven dafür, dass diese Datei nicht mit in das Artefakt aufgenommen wird. Gleiches gilt laut Dokumentation analog für Ant. So können für die auszuliefernde Anwendung und für die Testdurchführung zwei unterschiedliche Konfigurationsdateien verwendet werden.</p>
<h2>logback konfigurieren</h2>
<p>Da das Logging in jedem Projekt sehr spezifische Anforderungen erfüllen muss, kann ich natürlich kein allumfassendes Musterbeispiel geben. Deshalb soll das folgende Beispiel nur als Einstieg für logback Neulinge dienen und dann mit Hilfe der logback Dokumentation an die jeweiligen Erfordernisse angepasst werden. Es zeigt die Konfiguration des oben angesprochenen <strong>DefaultConfigurers</strong>, der genutzt wird, falls keine Konfigurationsdatei gefunden werden konnte:</p>
<pre class="brush:xml">&lt;configuration&gt;

	&lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"&gt;
		&lt;encoder&gt;
			&lt;pattern&gt;%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n&lt;/pattern&gt;
		&lt;/encoder&gt;
	&lt;/appender&gt;

	&lt;root level="debug"&gt;
		&lt;appender-ref ref="STDOUT" /&gt;
	&lt;/root&gt;

&lt;/configuration&gt;</pre>
<p>Hier wird zunächst ein ConsoleAppender namens <strong>STDOUT</strong> definiert. Der Formatierungsstring kann in folgende relevante Einzelteile zerlegt werden:</p>
<table border="0">
<thead>
<tr>
<td>Teil</td>
<td>Erklärung</td>
</tr>
</thead>
<tbody>
<tr>
<td>%d{HH:mm:ss.SSS}</td>
<td>Zeit mit Stunden, Minuten, Sekunden und Millisekunden</td>
</tr>
<tr>
<td>[%thread]</td>
<td>Name des aktuellen Threads</td>
</tr>
<tr>
<td>%-5level</td>
<td>Log Level linksausgerichtet darstellen und bis 5 Zeichen mit Leerzeichen auffüllen</td>
</tr>
<tr>
<td>%logger{36}</td>
<td>Name des Loggers ausgeben. Wird per intelligentem Algorithmus auf maximal 36 Zeichen reduziert (siehe <a href="http://logback.qos.ch/manual/layouts.html#conversionWord">Dokumentation</a>).</td>
</tr>
<tr>
<td>%msg</td>
<td>Ausgabe der festgelegten Log Meldung</td>
</tr>
<tr>
<td>%n</td>
<td>Zeilenumbruch</td>
</tr>
</tbody>
</table>
<p>Danach wird der eben definierte Appender dem so genannten <strong>root</strong> Logger zugewiesen. Dieser greift immer dann, wenn keine speziellere Konfiguration für z.B. ein Package festgelegt wurde.</p>
<p>Dieses einfache Beispiel sollte nun für die gewünschten Logging Eigenschaften angepasst werden. So möchte man z.B. die Log Meldungen sowohl in eine (täglich wechselnde) Datei als auch auf die Standardausgabe schreiben und eine andere Formatierung verwenden. Hierfür nimmt man sich die excellente <a href="http://logback.qos.ch/manual/index.html">logback Dokumentation</a> zur Hand.</p>
<h2>logback nutzen</h2>
<p>Folgend zeige ich eine beispielhafte Verwendung von logback. Man sollte darauf achten, nicht direkt die Klassen von logback, sondern die von der <a href="http://www.slf4j.org/">SLF4J</a> API bereitgestellten Klassen zu nutzen. So kann später ohne Probleme auf ein anderes von SLF4J unterstütztes Logging Framework umgestellt werden.</p>
<pre class="brush:java">package de.patrickgotthard.logback;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {

	private static final Logger LOG = LoggerFactory.getLogger(Main.class);

	public static void main(final String[] args) {
		LOG.debug("Starting application");
		try {
			throw new Exception("FooBar");
		} catch (final Exception e) {
			LOG.error("Starting the application failed", e);
		}
		LOG.debug("Closing application");
	}

}</pre>
<p>Mit der eben gezeigten Standardkonfiguration erfolgt folgende Konsolenausgabe:</p>
<pre class="brush:plain">05:44:17 [main] DEBUG de.patrickgotthard.logback.Main - Starting application
05:44:17 [main] ERROR de.patrickgotthard.logback.Main - Starting the application failed
java.lang.Exception: FooBar
	at de.patrickgotthard.logback.Main.main(Main.java:13) ~[classes/:na]
05:44:17 [main] DEBUG de.patrickgotthard.logback.Main - Closing application</pre>
<p>Ich denke, das sollte als Einstieg in logback zunächst einmal reichen. Schnapp dir die Dokumentation und schau selber, welche mächtigen Features logback sonst noch zu bieten hat <img src='http://www.patrick-gotthard.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.patrick-gotthard.de/332/logback-einbinden-konfigurieren-und-nutzen/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

