<?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>Debilofant.de &#187; Deutsch</title>
	<atom:link href="http://debilofant.de/de/feed/" rel="self" type="application/rss+xml" />
	<link>http://debilofant.de</link>
	<description>Developer Blog</description>
	<lastBuildDate>Tue, 24 Apr 2012 22:49:16 +0000</lastBuildDate>
	<language>de-DE</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Foursquare Rogue queries</title>
		<link>http://debilofant.de/2012/04/foursquare-rogue-queries/</link>
		<comments>http://debilofant.de/2012/04/foursquare-rogue-queries/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 22:49:16 +0000</pubDate>
		<dc:creator>debilofant</dc:creator>
				<category><![CDATA[Lift-Webframework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Rogue]]></category>
		<category><![CDATA[Zend-Framework]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[rogue]]></category>

		<guid isPermaLink="false">http://debilofant.ersocon.net/?p=134</guid>
		<description><![CDATA[<p>Kleines Beispiel fur eine Einfachheit, die einen wirklich sprachlos macht. In meinem aktuellen Projekt, angel-profi.de von PHP, Zend Framework und... <a href="http://debilofant.de/2012/04/foursquare-rogue-queries/">Continue reading &#187;</a></p>
 ]]></description>
			<content:encoded><![CDATA[<p>Kleines Beispiel fur eine Einfachheit, die einen wirklich sprachlos macht. In meinem aktuellen Projekt, angel-profi.de von PHP, Zend Framework und Doctrine/Postgres auf lift und mongoDB umzuziehen, ging es darum die aktuellsten User anzuzeigen. Nun hatte ich dafur ca. 1-2h Stunden angesetzt. Allerdings war ich wirklich erstaunt, dass ich nach ca. 10 Minuten lesen/surfen und 5 Minuten coden fertig war. Hier der urpsruengliche Code in Doctrine fur die Anfrage (Die letzten acht user mit status 1 und Sortierung nach Registrierungsdatum):</p>
<p></p><pre class="crayon-plain-tag">/**
 * Returns the most recent, active accounts
 * 
 * @param int $count
 * @return \Doctrine\Common\Collections\ArrayCollection
 */
 public function loadLatestAccounts($count = 8)
 {
     $qb = $this-&gt;_entityManager-&gt;createQueryBuilder();

     $qb-&gt;select('a')
         -&gt;from('Apro\Entities\User', 'a')
         -&gt;setMaxResults($count)
         -&gt;where($qb-&gt;expr()-&gt;eq('a._status', ':status'))
         -&gt;orderBy('a._created', 'DESC')
         -&gt;setParameter('status', 1);

        return $this-&gt;_secureCollectionResult($qb-&gt;getQuery()-&gt;getResult());
 }</pre><p></p>
<p>Und nun dieselbe Abfrage mit Hilfe von lift und rogue:</p>
<p></p><pre class="crayon-plain-tag">val users = User where (_.status eqs 1) orderDesc(_.created) fetch(8)</pre><p></p>
<p>WHOOOOOOOOT?!<br />
Ja, so einfach kann es sein, von der Ausgabe mal ganz zu schweigen, die sieht aehnlich aus.</p>
]]></content:encoded>
			<wfw:commentRss>http://debilofant.de/2012/04/foursquare-rogue-queries/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bootstrap Twitter 2.0 mit Liftweb Pagination</title>
		<link>http://debilofant.de/2012/02/bootstrap-twitter-2-0-mit-liftweb-pagination/</link>
		<comments>http://debilofant.de/2012/02/bootstrap-twitter-2-0-mit-liftweb-pagination/#comments</comments>
		<pubDate>Sun, 26 Feb 2012 12:24:51 +0000</pubDate>
		<dc:creator>debilofant</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Lift-Webframework]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[bootstrap twitter]]></category>
		<category><![CDATA[lift]]></category>
		<category><![CDATA[liftweb]]></category>
		<category><![CDATA[pagination]]></category>

		<guid isPermaLink="false">http://debilofant.de/?p=126</guid>
		<description><![CDATA[<p>Wer das neu erschienene UI-Framework &#8220;Bootstrap 2.0&#8243; von Twitter verwendet und gleichzeitig das in Scala geschriebenen Framework Liftweb einsetzt, wird... <a href="http://debilofant.de/2012/02/bootstrap-twitter-2-0-mit-liftweb-pagination/">Continue reading &#187;</a></p>
 ]]></description>
			<content:encoded><![CDATA[<p>Wer das neu erschienene UI-Framework &#8220;Bootstrap 2.0&#8243; von Twitter verwendet und gleichzeitig das in Scala geschriebenen Framework Liftweb einsetzt, wird frueher oder spaeter an den Punkt gelangen die jeweils eingebaute Pagination verwenden zu wollen. Nun ist es so, dass Bootstrap mit einer Kombination auf <em>ul</em>,<em>li</em> und <em>a</em> Tags funktioniert, um die Pagination anzuzeigen. Das sieht in der Praxis dann so aus:</p>
<p></p><pre class="crayon-plain-tag">&lt;ul class=&quot;pagination&quot;&gt;
    &lt;li class=&quot;disabled&quot;&gt;
        &lt;a href&quot;#&quot;&gt;First Page&lt;/a&gt;
    &lt;/li&gt;
    &lt;li class=&quot;active&quot;&gt;
        &lt;a href=&quot;#&quot;&gt;1&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;a href=&quot;#&quot;&gt;2&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;a href=&quot;#&quot;&gt;2&lt;/a&gt;
    &lt;/li&gt;
&lt;/ul&gt;</pre><p></p>
<p>Natuerlich gehe ich davon aus, dass in den <em>hrefs</em> jeweils Links zu den Pages stehen, es sei denn der Link ist &#8220;disable&#8221; oder &#8220;active&#8221;. D.h. hier gibt es keinen Grund zu verlinken, da wir uns in diesem Fall schon auf der Seite befinden. Soweit so gut. Wie funktioniert nun die Pagination in einem Liftweb Projekt?</p>
<p>Zunaechst der Code-Ausschnitt fuer das Snippet, das eine Pagination enthaelt:</p>
<p></p><pre class="crayon-plain-tag">class MySnippet extends StatefulSnippet with PaginatorSnippet[MyModel] {

}</pre><p></p>
<p>Indem man das eigene Snippet mit einem PaginationSnippet vom Typ MyModel verwendet, laesst sich die eingebaute Logik fuer Pagination verwenden. MyModel sind dabei jeweils die Listenelemente, die man anzeigen moechte. In der HTML-Datei wuerde der Aufruf nun so aussehen (Designerfriendly Variante, die ich bevorzuge):</p>
<p></p><pre class="crayon-plain-tag">&lt;div class=&quot;lift:MySnippet.paginate&quot; xmlns:nav=&quot;navigate&quot;&gt;
    &lt;nav:first /&gt;
    &lt;nav:prev /&gt;
    &lt;nav:allpages /&gt;
    &lt;nav:next /&gt;
    &lt;nav:last /&gt;
&lt;/div&gt;</pre><p></p>
<p>Lift nimmt einem hierbei viel Arbeit ab und bindet &#8220;nav&#8221; zur entsprechenden Methode. Was nun allerdings ausgegeben wird sind reine Links bzw. Text. D.h. uns fehlt die ul und li Struktur, die wir zum gestalten bei Bootstrap benoetigen. Eine nahe liegende Idee zur Loesung sieht so aus:</p>
<p></p><pre class="crayon-plain-tag">&lt;div class=&quot;lift:MySnippet.paginate&quot; xmlns:nav=&quot;navigate&quot;&gt;
    &lt;ul class=&quot;pagination&quot;&gt;
        &lt;li&gt;
            &lt;nav:first /&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;nav:prev /&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;nav:allpages /&gt;
        &lt;/li&gt;
        &lt;!-- ... --&gt;
    &lt;/ul&gt;
    
&lt;/div&gt;</pre><p></p>
<p>Das ist zwar einfach, funktioniert aber aus zwei Gruenden nicht:<br />
1. Die inaktiven und ausgewaehlten Seiten kann man nicht speziell markieren.<br />
2. Lift verlinkt die inaktiven Seiten nicht, sondern gibt nur Text aus. D.h. die Styles von Bootstrap greifen hier nicht.</p>
<p>Meine Loesung sieht so aus, dass man die pageXml Methode im eigenen Snippet wie folgt ueberschreibt:</p>
<p></p><pre class="crayon-plain-tag">override def pageXml(newFirst: Long, ns: NodeSeq): NodeSeq = {

  var pageAccess = -1
  try {
    pageAccess = ns.text.toInt
  } catch {
    case _ : java.lang.NumberFormatException =&gt; None
  }

  if(first==newFirst || newFirst &gt;= count || newFirst &lt; 0)
    // In case of current page we show the active style
    if (curPage + 1 == pageAccess)
      &lt;li class=&quot;active&quot;&gt;&lt;a href=&quot;#&quot;&gt;{ns}&lt;/a&gt;&lt;/li&gt;
    else
      &lt;li class=&quot;disabled&quot;&gt;&lt;a href=&quot;#&quot;&gt;{ns}&lt;/a&gt;&lt;/li&gt;
  else
    &lt;li&gt;&lt;a href={pageUrl(newFirst)}&gt;{ns}&lt;/a&gt;&lt;/li&gt;
}</pre><p></p>
<p>Man zieht die li Elemente in das Snippet, um auch die Styles richtig setzen zu koennen. Dazu nutze ich noch einen recht unschoenen Cast, um an die Seitenzahl zu gelangen. Die inaktiven und selektierten Seiten verlinken ich nun, um Bootstrap zu sagen, dass diese Elemente zur Pagination gehoeren (was auch unschoen ist). Im HTML Part sieht das nun so aus:</p>
<p></p><pre class="crayon-plain-tag">&lt;div class=&quot;lift:MySnippet.paginate&quot; xmlns:nav=&quot;navigate&quot;&gt;
    &lt;ul class=&quot;pagination&quot;&gt;
        &lt;nav:first /&gt;
        &lt;nav:prev /&gt;
        &lt;nav:allpages /&gt;
        &lt;!-- ... --&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre><p></p>
<p>Damit hat man die Pagination des Bootstrap Frameworks und Liftweb Pagination kombiniert. Ich hoffe, dass es hilfreich war. Verbesserungen sind gerne willkommen!</p>
]]></content:encoded>
			<wfw:commentRss>http://debilofant.de/2012/02/bootstrap-twitter-2-0-mit-liftweb-pagination/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Failed to load class &#8220;org.slf4j.impl.StaticLoggerBinder&#8221; in LiftWeb</title>
		<link>http://debilofant.de/2012/02/failed-to-load-class-org-slf4j-impl-staticloggerbinder-in-liftweb/</link>
		<comments>http://debilofant.de/2012/02/failed-to-load-class-org-slf4j-impl-staticloggerbinder-in-liftweb/#comments</comments>
		<pubDate>Mon, 20 Feb 2012 19:56:48 +0000</pubDate>
		<dc:creator>debilofant</dc:creator>
				<category><![CDATA[Konfiguration]]></category>
		<category><![CDATA[Lift-Webframework]]></category>
		<category><![CDATA[Logging]]></category>
		<category><![CDATA[lift]]></category>
		<category><![CDATA[lift-framework]]></category>
		<category><![CDATA[liftweb]]></category>
		<category><![CDATA[logging]]></category>
		<category><![CDATA[slf4j]]></category>

		<guid isPermaLink="false">http://debilofant.de/?p=122</guid>
		<description><![CDATA[<p>Diese &#8220;interessante&#8221; Meldung erscheint in den Logs, wenn man keine sfl4j Dependency beim Builden angibt. In einem Gradle-Buil File wuerde... <a href="http://debilofant.de/2012/02/failed-to-load-class-org-slf4j-impl-staticloggerbinder-in-liftweb/">Continue reading &#187;</a></p>
 ]]></description>
			<content:encoded><![CDATA[<p>Diese &#8220;interessante&#8221; Meldung erscheint in den Logs, wenn man keine sfl4j Dependency beim Builden angibt. In einem Gradle-Buil File wuerde die Loesung so aussiehen:</p>
<p></p><pre class="crayon-plain-tag">dependencies {
    // Include liftweb dependencies here

    // Logging
    compile &quot;org.slf4j:slf4j-log4j12:1.6.4&quot;
}</pre><p></p>
<p>Ich hoffe, dass ich euch ein wenig helfen konnte.</p>
]]></content:encoded>
			<wfw:commentRss>http://debilofant.de/2012/02/failed-to-load-class-org-slf4j-impl-staticloggerbinder-in-liftweb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resource (CSS,JS) Selektor für Lift</title>
		<link>http://debilofant.de/2012/02/resource-cssjs-selektor-fur-lift/</link>
		<comments>http://debilofant.de/2012/02/resource-cssjs-selektor-fur-lift/#comments</comments>
		<pubDate>Thu, 16 Feb 2012 08:58:21 +0000</pubDate>
		<dc:creator>debilofant</dc:creator>
				<category><![CDATA[Konfiguration]]></category>
		<category><![CDATA[Lift-Webframework]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[lift]]></category>
		<category><![CDATA[lift-framework]]></category>
		<category><![CDATA[liftweb]]></category>
		<category><![CDATA[snippet]]></category>

		<guid isPermaLink="false">http://debilofant.de/?p=108</guid>
		<description><![CDATA[<p>In Zeiten von CDN und schneller Ladezeiten möchte man oft die statischen Daten &#8211; wie CSS oder JS &#8211; von... <a href="http://debilofant.de/2012/02/resource-cssjs-selektor-fur-lift/">Continue reading &#187;</a></p>
 ]]></description>
			<content:encoded><![CDATA[<p>In Zeiten von CDN und schneller Ladezeiten möchte man oft die statischen Daten &#8211; wie CSS oder JS &#8211; von der eigentlichen Webapp entkoppeln. Ein möglicher Ansatz ist das Angeben von absoluten URLs zu den Ressourcen (und evtl. entsprechender Subdomains) beim Einbinden von den Dateien. Dieser Beitrag beschreibt wie sich dieser Ansatz im Lift Framework realisieren lässt.</p>
<p>Lift bietet eine super Möglichkeit zwischen einer Production und einer Development Umgebung zu unterscheiden. Dies erreicht man indem man zwei Properties Dateien im <em>resources</em> Verzeichnis anlegt: <em>default.props</em> und <em>production.default.props</em></p>
<p>Der Inhalt ist dabei recht simpel und enthält jeweils nur die Hosts, die wir verwenden möchten. In der lokalen Entwicklungsumgebung sollte es also etwas sein, das lokal editierbar ist und in der Production-Konfiguration evtl. ein CDN (s.u.)</p>
<p></p><pre class="crayon-plain-tag">src.host.css=http://localhost:8080/css
src.host.js=http://localhost:8080/js</pre><p></p>
<p></p><pre class="crayon-plain-tag">src.host.css=http://cdn.css.mywebapp.com
src.host.js=http://cdn.js.mywebapp.com</pre><p></p>
<p>Lift verarbeitet diese Dateien automatisch. Die Entscheidung, ob die eine oder andere Datei gewählt wird, trifft Lift anhand des -Drun.mode Arguments des Servers.<br />
Jetzt geht es also nur noch darum diese Konfigurationen zu verarbeiten. Das Ziel sollte sein, dass wir recht einfach im View-Skript definieren können welche Datei eingebunden werden soll. Und das geschieht (&#8220;Designer-Friendly&#8221;) in etwa so:</p>
<p></p><pre class="crayon-plain-tag">&lt;span class=&quot;lift:ResourceSnippet.css?file=lib/core.css;media=screen&quot;&gt;&lt;/span&gt;</pre><p></p>
<p>Wie ihr sehen könnt, habe ich zwei Parameter an das Snippet übergeben, file und media. Und als Ergebnis möchten wir Folgendes:</p>
<p></p><pre class="crayon-plain-tag">&lt;link href=&quot;http://localhost:8080/css/lib/core.css&quot; type=&quot;text/css&quot; media=&quot;screen&quot; /&gt;</pre><p></p>
<p>Was nun also fehlt ist der Snippetcode:</p>
<p></p><pre class="crayon-plain-tag">object ResourceSnippet {
  def css(xhtml: NodeSeq): NodeSeq = {
    // File we want to be included
    val file : String =  S.attr(&quot;file&quot;) openOr &quot;&quot;

    // Media attribute
    val media : String = S.attr(&quot;media&quot;) openOr &quot;&quot;

    PCDataXmlParser.apply(cssFile(file, media)).get
  }

  def cssFile (file : String, media : String) : String = {
    String.format(&quot;&lt;link href=&quot;%s/%s&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;%s&quot;/&gt;&quot;,
                  Props.get(&quot;src.host.css&quot;).getOrElse(&quot;&quot;),
                  file,
                  media)
  }
}</pre><p></p>
<p>In dem Snippet definieren wir zwei Methoden (es geht auch in einer). Die Methode cssFile erstellt uns einen String, der dem Endergebnis entspricht. Das Aufrufen von ResourceSnippet.css bewirkt, dass die Parameter ausgelesen werden und der erstellte String aus der Methode cssFile in ein valides HTML (mit Hilfe des PCDataXmlParser) überführt wird. Für JS Dateien ist das Vorgehen analog. D.h. wir erweitern unseren Snippet-Code wie folgt:</p>
<p></p><pre class="crayon-plain-tag">object ResourceSnippet {
  def css(xhtml: NodeSeq): NodeSeq = {
    // File we want to be included
    val file : String =  S.attr(&quot;file&quot;) openOr &quot;&quot;

    // Media attribute
    val media : String = S.attr(&quot;media&quot;) openOr &quot;&quot;

    PCDataXmlParser.apply(cssFile(file, media)).get
  }

  def cssFile (file : String, media : String) : String = {
    String.format(&quot;&lt;link href=&quot;%s/%s&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;%s&quot;/&gt;&quot;,
                  Props.get(&quot;src.host.css&quot;).getOrElse(&quot;&quot;),
                  file,
                  media)
  }

  def jscFile (file : String, id : String) : String = {
    String.format(&quot;&lt;script src=&quot;%s/%s&quot; rel=&quot;stylesheet&quot; type=&quot;text/javascript&quot; id=&quot;%s&quot;&gt;&lt;/script&gt;&quot;,
      Props.get(&quot;src.host.js&quot;).getOrElse(&quot;&quot;),
      file,
      id)
  }

  def jsc (xhtml : NodeSeq): NodeSeq = {
    val file : String = S.attr(&quot;file&quot;) openOr &quot;&quot;
    val id : String = S.attr(&quot;id&quot;) openOr &quot;&quot;
    
    PCDataXmlParser.apply(jscFile(file, id)).get
  }
}</pre><p></p>
<p>Der Aufruf des Snippets für JS Dateien sieht dann so aus:</p>
<p></p><pre class="crayon-plain-tag">&lt;span class=&quot;lift:ResourceSnippet.js?file=lib/jquery.js;id=jquery&quot;&gt;&lt;/span&gt;</pre><p></p>
<p>Recht einfach, oder? Ich wünsche viel Spaß beim Ausprobieren! <img src='http://debilofant.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://debilofant.de/2012/02/resource-cssjs-selektor-fur-lift/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mehrere Jetty Server auf einer VM</title>
		<link>http://debilofant.de/2012/02/mehrere-jetty-server-auf-einer-vm/</link>
		<comments>http://debilofant.de/2012/02/mehrere-jetty-server-auf-einer-vm/#comments</comments>
		<pubDate>Thu, 09 Feb 2012 12:06:44 +0000</pubDate>
		<dc:creator>debilofant</dc:creator>
				<category><![CDATA[Jetty]]></category>
		<category><![CDATA[jetty]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[virtual]]></category>
		<category><![CDATA[vm]]></category>

		<guid isPermaLink="false">http://debilofant.de/?p=87</guid>
		<description><![CDATA[<p>In diesem Beitrag stelle ich kurz vor wie man mehrere Jetty Server(container) mit verschiedenen Ports auf einer Ubuntu (Linux) VM... <a href="http://debilofant.de/2012/02/mehrere-jetty-server-auf-einer-vm/">Continue reading &#187;</a></p>
 ]]></description>
			<content:encoded><![CDATA[<p>In diesem Beitrag stelle ich kurz vor wie man mehrere Jetty Server(container) mit verschiedenen Ports auf einer Ubuntu (Linux) VM einrichten kann. Dazu habe ich mir ein kleines Szenario konstruiert, das evtl. dazu passen könnte (Grafik unten). </p>
<p>Nehmen wir also an, dass man einen physikalischen Server hat, den man bereits zur besseren Auslastung mit 3 virtuellen Hosts ausgestattet hat (vm-a, vm-b, vm-c). Die vm-c nehmen wir als Router/Load Balancer für eine Webapp und für die Auslieferung vom statischen Content (css oder js z.B.). Auf der vm-a möchten wir nun zwei Jetty Server laufen lassen, die eine Webapp ausliefern und durch den Nginx von der vm-c angesprochen werden. Die zusätzliche vm-b könnte in diesem Fall für Datenbanken oder NoSQL bereitstehen (also an dieser Stelle nicht weiter wichtig).</p>
<p><a href="http://debilofant.de/wp-content/uploads/2012/02/mehrere-Jetty-Server.png"><img src="http://debilofant.de/wp-content/uploads/2012/02/JettyServerArchitecture1.png" alt="Jetty Server Architektur mit einem nginx als Load-Balancer" title="Jetty Server Architektur" width="587" height="656" class="aligncenter size-full wp-image-91" /></a></p>
<p>Idealerweise wäre natürlich eine Installation über den Synaptic Paket Manager, was allerdings in diesem Fall eher komplizierter ist. Ich zeige hier den etwas &#8220;dreckigeren&#8221; Weg, der aber zum Einstieg einfacher ist (meine subjektive Wahrnehmung). Deshalb loggt man sich nun per ssh auf seine VM ein. Für ein wenig Struktur legt man ein Verzeichnis &#8220;server&#8221; und lädt in dieses eine Jetty Variante herunter (ich verwende in der Beispielinstallation die Version 6.1.26). Mit unzip kann man das heruntergladene ZIP-Paket entpacken. Das sieht nun auf der Console so aus:</p>
<p></p><pre class="crayon-plain-tag">mkdir server; cd server
wget http://dist.codehaus.org/jetty/jetty-6.1.26/jetty-6.1.26.zip
unzip jetty-6.1.26.zip</pre><p></p>
<p>Nun hat man einen lauffähigen Jetty Server, den man ohne Bedenken starten könnte. Wir möchte allerdings mehrere, also erstellen wir zwei Verzeichnisse jetty-a und jetty-b. In diese legen wir jeweils eine Kopie des entpackten Server-Packages. Diese werden unsere getrennten Server sein.</p>
<p></p><pre class="crayon-plain-tag">mkdir jetty-a
mkdir jetty-b

cp -R jetty-6.1.26 jetty-a/
cp -R jetty-6.1.26 jetty-b/</pre><p></p>
<p>Theoretisch kommt man auch mit einer Installation aus. D.h. man müsste an dieser Stelle den Ordner nicht kopieren. Ich persönlich finde es jedoch übersichtlicher und auch strikter getrennt. So kann man sich in der Konfiguration an einer Jetty Variante auslassen ohne die andere zu beeinflussen.</p>
<p>Wenn man nun z.B. versucht jetty-a zu starten und danach jetty-b, erhält beim Start von jetty-b die Meldung, dass bereits ein Jetty-Prozess läuft. das liegt an mehreren Ursachen. Eine davon ist die Server ID in der etc/jetty.xml Datei. D.h. das ist die erste Änderung, die wir vornhemen. Dazu öffnet man z.B. mit <em>nano</em> jeweils die jetty.xml Dateien der einzelnen Varianten und ändern die Server ID in ServerA bzw. ServerB (Speichern nicht vergessen, bei Nano STRG+O). Zusätzlich vergeben wir in dieser Datei auch den Standard Port für die jeweilige Variante (für jetty-a 9090 und für jetty-b 9191).</p>
<p></p><pre class="crayon-plain-tag">sudo nano jetty-a/jetty-6.1.26/etc/jetty.xml
sudo nano jetty-a/jetty-6.1.26/etc/jetty.xml</pre><p></p>
<p>Dies alleine wird jedoch nicht reichen. Das Startskript unter bin/jetty.sh schaut bzgl. laufender Jetty Prozesse in der Datei /tmp/jetty.pid nach, ob Instanzen von Jetty aktiv sind. An dieser Stelle müssen wir eingreifen und diese Logik abändern, sodass das Startskript für jetty-a in der Dateie /tmp/jetty-a.pid nachschaut und das Skript für jetty-b entsprechend in /tmp/jetty-b.pid. Dazu öffnet man jeweils die Datei bin/jetty.sh und fügt folgende Zeilen direkt vor der ersten unkommentierten Zeile  ein (hier als beispiel für jetty-a, usernamen bitte entsprechend ersetzen):</p>
<p></p><pre class="crayon-plain-tag">JETTY_HOME=/home/{{username}}/server/jetty-a/jetty-6.1.26/
JETTY_PID=/tmp/jetty-a.pid</pre><p></p>
<p>Diese einfache Konfiguration reicht aus, um bei jetty Varianten zu starten. zunächst jetty-a:</p>
<p></p><pre class="crayon-plain-tag">sh /home/{{username}}/server/jetty-a/jetty-6.1.26/bin/jetty.sh start</pre><p></p>
<p>Und danach jetty-b:</p>
<p></p><pre class="crayon-plain-tag">sh /home/{{username}}/server/jetty-b/jetty-6.1.26/bin/jetty.sh start</pre><p></p>
<p>Ich habe in diesem Szenario ein Load Balancing vorgeschlagen. Denkbar ist jedoch auch eine Staging Umgebung oder ein Beta-Server, o.ä.<br />
Wie auch immer, ich hoffe, dass es euch weiter hilft und wünsche viel Spaß beim Ausprobieren!</p>
]]></content:encoded>
			<wfw:commentRss>http://debilofant.de/2012/02/mehrere-jetty-server-auf-einer-vm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Private Nexus-Repositories in Gradle konfigurieren</title>
		<link>http://debilofant.de/2012/02/private-nexus-repositories-in-gradle-konfigurieren/</link>
		<comments>http://debilofant.de/2012/02/private-nexus-repositories-in-gradle-konfigurieren/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 10:00:42 +0000</pubDate>
		<dc:creator>debilofant</dc:creator>
				<category><![CDATA[Gradle]]></category>
		<category><![CDATA[Konfiguration]]></category>

		<guid isPermaLink="false">http://debilofant.de/?p=81</guid>
		<description><![CDATA[<p>Falls man mit Gradle arbeitet und eigene Libraries oder APIs in einem privaten Nexus-Repo (das) ablegen möchte, das den Zugriff... <a href="http://debilofant.de/2012/02/private-nexus-repositories-in-gradle-konfigurieren/">Continue reading &#187;</a></p>
 ]]></description>
			<content:encoded><![CDATA[<p>Falls man mit Gradle arbeitet und eigene Libraries oder APIs in einem privaten Nexus-Repo (das) ablegen möchte, das den Zugriff nur durch Angabe von Benutzernamen und Passwort gewährt, kann man dies durch entsprechend coole Properties-Files erreichen. Wie man diese anlegt, warum man sie braucht und wie man diese in einem Gradle Build-File ausliest beschreibe ich nun in diesem Beitrag.</p>
<p>Zunächst brauchen wir eine Properties Datei, die ich in der Regel im root Verzeichnis unter dem versteckten Ordner .properties ablege. Den Namen kann man sich im Grunde frei ausdenken, ich verwende an dieser Stelle <em>nexus-credentials.properties-hidden</em>. Der Inhalt kann dann in etwa so aussehen:</p>
<p></p><pre class="crayon-plain-tag">user.name=privatenuxus
user.password=privatenuxuspassword</pre><p></p>
<p>Im Gralde build File kann man nun im Groovy Style eine kleine Hilfmethode schreiben, die einem diese Datei ausliest und direkt in eine Properties-Struktur ausliest:</p>
<p></p><pre class="crayon-plain-tag">...
def loadRepositoryProperties() {
    repositoryProperties = new Properties()

    file(&quot;.properties/nexus-credentials.properties-hidden&quot;).withReader { reader -&gt;
        repositoryProperties.load(reader)
    }

    return repositoryProperties
}
...</pre><p></p>
<p>Nun lässt sich der Zugriff auf das private Nexus Repo bequem steuern. Dazu konfiguriert man zunächst die Properties und verwendet diese dann an entsprechender Stelle. Easy, oder?</p>
<p></p><pre class="crayon-plain-tag">def propertiesRepository = loadRepositoryProperties()

repositories {
    maven {
        name &quot;My private Nexus&quot;
        credentials {
            username = propertiesRepository['user.name']
            password = propertiesRepository['user.password']
        }
        url &quot;http://my.privatenexus.com/content/repositories/release/&quot;
    }
}</pre><p></p>
<p>Unter der Url gibt man natürlich die URL zum repo an, ich habe hier nur einen Phantasienamen verwendet. <img src='http://debilofant.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Falls man nun auch noch GIT im Einsatz hat, bietet sich an dieser Stelle an die Properties Files aus der Verwaltung zu nehmen, damit diese nicht versehentlich irgendwo langen, wo man sie nicht haben möchte <img src='http://debilofant.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Das geht in der .gitignore Datei so:</p>
<p></p><pre class="crayon-plain-tag">*properties-hidden</pre><p></p>
<p>Ich hoffe es ist dem ein oder anderen damit geholfen. Viel Spaß und Erfolg damit <img src='http://debilofant.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://debilofant.de/2012/02/private-nexus-repositories-in-gradle-konfigurieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Properties Dateien in Scala lesen</title>
		<link>http://debilofant.de/2012/02/properties-dateien-in-scala-lesen/</link>
		<comments>http://debilofant.de/2012/02/properties-dateien-in-scala-lesen/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 09:29:53 +0000</pubDate>
		<dc:creator>debilofant</dc:creator>
				<category><![CDATA[Konfiguration]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[scala]]></category>

		<guid isPermaLink="false">http://debilofant.de/?p=74</guid>
		<description><![CDATA[<p>Oft möchte man seine App in einer gewissen Art und Weise konfigurieren, z.B. einen Api Key hinterlegen oder einen Datenbankzugriff... <a href="http://debilofant.de/2012/02/properties-dateien-in-scala-lesen/">Continue reading &#187;</a></p>
 ]]></description>
			<content:encoded><![CDATA[<p>Oft möchte man seine App in einer gewissen Art und Weise konfigurieren, z.B. einen Api Key hinterlegen oder einen Datenbankzugriff steuern. Meist unterscheiden sich die Daten einer Entwickler-Umgebung (Development) und einer Live-Umgebung (Production), was den ersten Anwendungsfall für simplProperties-Dateien darstellt. </p>
<p>Zudem legt man heutzutage seine Sourcen in einem Versionsverwaltungs-Tool ab (z.B. github oder bitbucket). Sofern es sich nicht unbedingt um ein privates Repository &#8211; auf einem eigenen Server &#8211; handelt, ist es immer sinnvoll solche Properties-Dateien aus der Versionsverwaltung auszuschließen (z.B. um das Ablegene von Passwörtern zu vermeiden).</p>
<p>Mit dem folgenden Code lassen sich <em>simple</em> Dateien (s.u.) in Scala auslesen und nutzen:</p>
<p></p><pre class="crayon-plain-tag">user.name=databaseuser
user.password=secure</pre><p></p>
<p></p><pre class="crayon-plain-tag">import scala.io.Source

val filename = &quot;database.properties&quot;
for (line &lt;- Source.fromFile(filename).getLines()) {
  println(line)
}</pre><p></p>
<p>Wie ihr seht, nutzt man hierzu die Klasse <code>scala.io.Source</code> um die Datei zeilenweise in einer for Schleife auszulesen. In dem Beispiel gebe ich die Zeilen nur aus. hier wäre es natürlich denkbar, dass man mit dem Benutzernamen und dem Passwort einen Datenbankzugriff konfigurieren kann.</p>
<p>Ich wünsche viel Erfolg beim Ausprobieren <img src='http://debilofant.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  !</p>
]]></content:encoded>
			<wfw:commentRss>http://debilofant.de/2012/02/properties-dateien-in-scala-lesen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Basics zu Äquivalenzklassen (Methoden zur Testfallreduzierung)</title>
		<link>http://debilofant.de/2012/01/basics-zu-aquivalenzklassen-methoden-zur-testfallreduzierung/</link>
		<comments>http://debilofant.de/2012/01/basics-zu-aquivalenzklassen-methoden-zur-testfallreduzierung/#comments</comments>
		<pubDate>Sun, 29 Jan 2012 01:37:14 +0000</pubDate>
		<dc:creator>debilofant</dc:creator>
				<category><![CDATA[Testing]]></category>
		<category><![CDATA[Äquivalenzklasse]]></category>
		<category><![CDATA[Defensive testing]]></category>
		<category><![CDATA[Testfallermittlung]]></category>

		<guid isPermaLink="false">http://debilofant.de/?p=67</guid>
		<description><![CDATA[<p>Die Äquivalenzklassenbildung ist eine Technik, die zur Reduzierung der Anzahl an Testfällen verwendet wird. Hierbei werden die möglichen Werte einer... <a href="http://debilofant.de/2012/01/basics-zu-aquivalenzklassen-methoden-zur-testfallreduzierung/">Continue reading &#187;</a></p>
 ]]></description>
			<content:encoded><![CDATA[<p>Die Äquivalenzklassenbildung ist eine Technik, die zur Reduzierung der Anzahl an Testfällen verwendet wird. Hierbei werden die möglichen Werte einer Eingabegröße in Klassen eingeteilt. Dadurch kann durch eine relativ kleine Anzahl an Testfällen eine angemessene Testabdeckung erzielt werden.</p>
<p>Eine Äquivalenzklasse besteht aus einer Menge an Daten, welche als äquivalent angesehen werden, d.h. sie liefern erwartungsgemäß bei einem Test dieselben Ergebnisse. Jeder Datenwert innerhalb einer Äquivalenzklasse ist also so gut wie jeder andere. Die Datenwerte können dabei entweder aus tatsächlichen Wertebereichen, wie z.B. 0 bis 100, oder aus Mengen an Datensätzen bestehen. Für den Test bietet dies folgende Erkenntnisse (nachzulesen in <em>A Practitioner&#8217;s Guide to Software Test Design</em> &#8211; Copeland, L., 2003):</p>
<ol>
<li>Falls ein Testfall einer Äquivalenzklasse einen Fehler aufdeckt, so decken auch alle anderen Testfälle der Äquivalenzklasse den Fehler auf.</li>
<li>Falls ein Testfall einer Äquivalenzklasse keinen Fehler aufdeckt, so decken auch alle anderen Testfälle der Äquivalenzklasse keine Fehler auf.</li>
</ol>
<p>Interessant ist also die tatsächliche Wahl der äquivalenten Daten einer Äquivalenzklasse. Allgemein betrachtet ergeben sich zwei Möglichkeiten:</p>
<ol>
<li>Verwendung von gültigen Wertebereichen (Testing-by-contract)</li>
<li>Verwendung von ungültigen Wertebereichen (Defensive testing)</li>
</ol>
<p>Bei dem Testing-by-contract Ansatz geht man davon aus, dass der zu testende Softwareteil (auch Modul genannt) nur Eingabeparameter erhält, welche es verarbeiten kann. Zudem werden dem Modul unabhängig von der Eingabe Daten zur Verfügung gestellt, welche es zur fehlerfreien Verarbeitung der Eingabeparameter braucht. Entsprechend werden hierbei nur Äquivalenzklassen mit gültigem Wertebereich erstellt und durch ihre Repräsentanten getestet.</p>
<p>Äquivalenzklassen mit Daten außerhalb des zulässigen Bereichs werden hierbei nicht berücksichtigt, weil man evtl. davon ausgeht, dass die unzulässigen Bereiche nicht erreicht werden. Problematisch ist bei diesem Ansatz die Tatsache, dass Probleme auftreten könne, sobald ein unzulässiger Bereich in einem ausgelieferten Produkt tatsächlich erreicht wird (z.B. das Jahr 2000 bei einer 1985 geschriebenen Software). Um diesem Problem entgegenzuwirken, werden beim defensive-testing Ansatz auch unzulässige Bereiche zugelassen. Dies bedeutet, dass neben einer Äquivalenzklasse im gültigen Bereich auch mindestens eine Äquivalenzklasse für den ungültigen Bereich erstellt werden und durch einen Repräsentanten getestet werden muss. Die Anzahl nötiger Testfälle erhöht sich zwangsläufig.</p>
<p>Ein kleines Beispiel dazu:</p>
<p>Man hat ein Softwaremodul, das die Wurzelfunktion implementiert und nur ganze Zahlen im Bereich 0 bis 64 akzeptiert. Beim Testing-by-contract Ansatz benötigt man (grob betrachtet) zwei Äquivalenzklassen mit entsprechenden Repräsentanten. Eine davon nennen wir mal die Ganzzahl-Äquivalenzklasse und die andere Dezimal-Äquivalenzklasse. Wir gehen davon aus, dass die Ganzzahl-Äquivalenzklasse alle Eingabeparameter enthält, bei denen das Modul als Ergebnis eine Ganzzahl liefert, z.B. 4 oder 16. Hieraus wählen wir einen Repräsentanten, die 16, was dem ersten Testfall entspricht. Für die zweite Äquivalenzklasse nehmen wir entsprechend die 17, da hier bekannt ist, dass keine Ganzzahl als Ergebnis zu erwarten ist.</p>
<p>Beim defensive-testing werden nun weitere Äquivalenzklassen hinzugefügt. Wir erwarten z.B., dass das Modul bei der Eingabe einer negativen Zahl, einer Dezimalzahl oder einer Zahl größer 64 eine Fehlermeldung liefern muss. Mit der Bildung der entsprechenden Äquivalenzklassen (Negativ-Äquivalenzklasse, Dezimaleingabe-Äquivalenzklasse und Zugroßeeingabe-Äquivalenzklasse) erhält man drei weitere Testfälle: z.B. (-1|0,3|65) oder (-5|20,1|1200). Das erste Beispiel wird sicherlich öfter Anklang finden, da beim Testen versucht wird auch die Grenzbereiche (0/64) ausreichend zu testen.</p>
]]></content:encoded>
			<wfw:commentRss>http://debilofant.de/2012/01/basics-zu-aquivalenzklassen-methoden-zur-testfallreduzierung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Die Klassifikationsbaum-Methode für Testfallermittlung</title>
		<link>http://debilofant.de/2012/01/die-klassifikationsbaum-methode-fur-testfallermittlung/</link>
		<comments>http://debilofant.de/2012/01/die-klassifikationsbaum-methode-fur-testfallermittlung/#comments</comments>
		<pubDate>Sun, 29 Jan 2012 01:33:27 +0000</pubDate>
		<dc:creator>debilofant</dc:creator>
				<category><![CDATA[Testing]]></category>
		<category><![CDATA[Äquivalenzklasse]]></category>
		<category><![CDATA[Klassifikationsbaum]]></category>
		<category><![CDATA[Testfallermittlung]]></category>

		<guid isPermaLink="false">http://debilofant.de/?p=63</guid>
		<description><![CDATA[<p>Die grundsätzliche Idee der Klassifikationsbaum-Methode is es den Eingabedatenraum des Testobjektes nach verschiedenen Test relevanten Gesichtspunkten jeweils getrennt voneinander in... <a href="http://debilofant.de/2012/01/die-klassifikationsbaum-methode-fur-testfallermittlung/">Continue reading &#187;</a></p>
 ]]></description>
			<content:encoded><![CDATA[<p>Die grundsätzliche Idee der Klassifikationsbaum-Methode is es den Eingabedatenraum des Testobjektes nach verschiedenen Test relevanten Gesichtspunkten jeweils getrennt voneinander in Klassen, die auch als Äquivalenzklassen verstanden werden können, zu zerlegen. Aus der Kombination geeigneter Klassen werden Testfälle ermittelt. Die Hauptinformationsquelle zur Findung der Klassen ist dabei die Spezifikation, die das geforderte Verhalten des Testobjektes beschreibt.</p>
<p>Der Tester kann durch die Automatisierung einzelner Aktivitäten bei der Testfallermittlung geleitet werden. Des Weiteren bietet die Klassifikationsbaum-Methode eine Möglichkeit zur grafischen Notation, die eine Visualisierung der Testfallermittlung unter Verwendung moderner grafischer Oberflächen ermöglicht. Nachfolgend möchte ich die Methode zunächst allgemein beschreiben und danach zum besseren Verständnis an einem Beispiel verdeutlichen.</p>
<p>Die Ermittlung der Test relevanten Aspekte erfolgt meist manuell durch den Tester mittels der funktionalen Spezifikation des Testobjektes. Diese dienen der einfachen Unterscheidung der möglichen Eingabedaten. Im Anschluss wird die Menge aller möglichen Eingaben unter dem jeweiligen Aspekt disjunkt in Klassen zerlegt. Alle Werte einer Klasse sind demzufolge äquivalent (bei Interesse kann man sich zusätzlich meinen Beitrag zu Äquivalenzklassen durchlesen). Im konkreten Testfall reicht ein Repräsentant aus. Die Zerlegung unter den Aspekten sind Klassifikationen.</p>
<p>In komplexen Systemen werden Klassen mit Hilfe vo Klassifikationen wiederum in weitere Klassen unterteilt. Das rekursive Vorgehen resultiert in einem Klassifikationsbaum, der die anschauliche Darstellung der mehrstufigen Zerlegung repräsentiert. Klassifikationen werden in der grafischen Darstellung des Baumes als benannte Rechtecke dargestellt. Darunter werden jeweilige Klassen angeordnet. Entsprechend werden die tiefer liegenden Klassifikationen mit ihren Klassen jeweils unter der zugehörigen Klasse notiert.</p>
<p>Im letzten Schritt der Methode werden die Testfälle gebildet. Aus der Kombination verschiedener Klassifikationen entsteht jeweils ein Testfall. Dieser wird in Form einer Zeile in einer Kombinationstabelle notiert. Die Namen der Spalten dieser Tabelle resultieren aus den Blättern (Klassen) des Baumes. Bei logisch unvereinbaren Kombinationen (z.B. Klassen ein und derselben Klassifikation) bleibt der Tabelleneintrag leer.</p>
<p>Die Ermittlung der Test relevanten Aspekte ist oft vom Tester abhängig. Genauer kommt es hierbei auf Kreativität und Verständnis des Problembereichs an. Dadurch ergibt sich die Möglichkeit, dass Fehler im Testobjekt aufgrund unvollständiger Klassifikationsbäume unerkannt bleiben.</p>
<p>Die Methode soll am folgenden Beispiel veranschaulicht werden: Ausgangspunkt ist eine Spezifikation einer Computer-Vision-Systems, welches mit einer Kamera verschiedene Objekte erkennen soll. Mögliche Test relevante Aspekte können hierbei Farbe und Form sein. Damit ergeben sich die Klassifikationen für Farbe und Form. Die Klassifikation Farbe lässt sich beispielhaft in drei Klassen unterteilen: Rot, Gelb und Blau. Bei der Form könnte das Objekt exemplarisch in Kreis, Dreieck oder Rechteck unterteilt sein. Zur Repräsentation einer tiefer liegenden Klassifikation wird die Art eines Dreiecks betrachtet. Hierbei wird zwischen gleichseitigen, gleichschenkligen und ungleichseitigen Dreiecken unterschieden. Mit Hilfe des Klassifikationsbaums können nun Testfälle bestimmt werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://debilofant.de/2012/01/die-klassifikationsbaum-methode-fur-testfallermittlung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PostgreSQL mit PostGIS auf Ubuntu installieren</title>
		<link>http://debilofant.de/2012/01/postgresql-mit-postgis-auf-ubuntu-installieren/</link>
		<comments>http://debilofant.de/2012/01/postgresql-mit-postgis-auf-ubuntu-installieren/#comments</comments>
		<pubDate>Sun, 29 Jan 2012 01:01:38 +0000</pubDate>
		<dc:creator>debilofant</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[PostGIS]]></category>
		<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://debilofant.de/?p=58</guid>
		<description><![CDATA[<p>Diese kleine Tutorial soll in einer Step-by-step Anleitung beschreiben, wie man die PostgreSQL DB mit Postgis-Erweiterung bei sich auf dem... <a href="http://debilofant.de/2012/01/postgresql-mit-postgis-auf-ubuntu-installieren/">Continue reading &#187;</a></p>
 ]]></description>
			<content:encoded><![CDATA[<p>Diese kleine Tutorial soll in einer Step-by-step Anleitung beschreiben, wie man die PostgreSQL DB mit Postgis-Erweiterung bei sich auf dem Entwicklungsserver installieren kann. ZUsätzlich installieren wir noch den PHP-PG-Admin, um bequem per Webinterface auf die DB zugreifen zu können. Also los gehts:</p>
<p>Im ersten Schritt benötigen wir den Postgresql Server aus den Quellen:</p>
<p></p><pre class="crayon-plain-tag">sudo apt-get install postgresql</pre><p></p>
<p>Je nach Version, die ihr haben wollt, geht das auch so (hier z.B für die 8.3):</p>
<p></p><pre class="crayon-plain-tag">sudo apt-get install postgresql-8.4</pre><p></p>
<p>Im nächsten Schritt geht es nun schon an PostGIS:</p>
<p></p><pre class="crayon-plain-tag">sudo apt-get install postgresql-8.4-postgis</pre><p></p>
<p>Da wir ja auch bequem per Webinterface Zugriff haben möchten, installieren wir nun auch den PHP-PG-Admin:</p><pre class="crayon-plain-tag">sudo apt-get install phppgadmin</pre><p></p>
<p>Um auf den Admin zugreifen zu können, muss man noch ganz kurz den Apache restarten (wenn es nicht schon bei der Installation automatisch passiert):</p><pre class="crayon-plain-tag">sudo /etc/init.d/apache2 restart</pre><p></p>
<p>Die Hauptarbeit ist nun getan. Allerdings fehlen uns noch die Zugangsdaten. Dazu wechselt man als root zum User postgres&#8230;</p><pre class="crayon-plain-tag">sudo su postgres</pre><p></p>
<p>&#8230; und legt einen Superuser für die Datenbank an:</p><pre class="crayon-plain-tag">createuser -l -P superuser</pre><p></p>
<p>Das &#8220;L, bzw -l&#8221; bedeutet, dass sich der User einloggen darf. Zudem soll der Zugang per Passwort geschützt sein (-P). Es folgt eine doppelte Passwortabfrage und die Frage, ob der User als Superuser angelegt werden soll. Ja, das soll er.</p>
<p>Das Grundsystem steht nun. Was uns noch fehlt, ist eine Datenbank mit der wir arbeiten möchten. Diese legen wir (am besten mit UTF-8 Encoding) mit diesem Befehl hier an:</p><pre class="crayon-plain-tag">createdb mydatabase --encoding=&quot;UTF-8&quot;</pre><p></p>
<p>Dieser Datenbank müssen wir noch den &#8220;Slang&#8221; (den Dialekt) von Postgis beibringen:</p>
<p></p><pre class="crayon-plain-tag">createlang plpgsql mydatabase</pre><p></p>
<p>Danach müsste alles erledigt sein. Ihr könnt euch nun im Web-Admin anmelden, neue User anlegen und mit der Datenbank arbeiten. Ich wünsche viel Spaß und Erfolg <img src='http://debilofant.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://debilofant.de/2012/01/postgresql-mit-postgis-auf-ubuntu-installieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

