<?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>Phpmonkeys</title>
	<atom:link href="http://www.phpmonkeys.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.phpmonkeys.de</link>
	<description>Software Development in PHP</description>
	<lastBuildDate>Thu, 16 May 2013 20:51:12 +0000</lastBuildDate>
	<language>de-DE</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Gson &#8211; google json library (Teil 2)</title>
		<link>http://www.phpmonkeys.de/2013/05/16/gson-google-json-library-teil-2/</link>
		<comments>http://www.phpmonkeys.de/2013/05/16/gson-google-json-library-teil-2/#comments</comments>
		<pubDate>Thu, 16 May 2013 20:51:12 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[advanced]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[gson]]></category>
		<category><![CDATA[json]]></category>

		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=2009</guid>
		<description><![CDATA[Im ersten Teil zum Thema Gson gab es ja bereits einen kurzen Überblick, wie man Gson grundsätzlich nutzt. Im heutigen zwiten Teil gehen wir einen Schritt weiter und schauen uns die Deserializer genauer an. Diese sind vor allem dann sehr &#8230; <a href="http://www.phpmonkeys.de/2013/05/16/gson-google-json-library-teil-2/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Im <a href="http://www.phpmonkeys.de/2013/04/15/gson-google-json-library-teil-1/" title="Gson – google json library (Teil 1)" target="_blank">ersten Teil zum Thema Gson</a> gab es ja bereits einen kurzen Überblick, wie man Gson grundsätzlich nutzt. Im heutigen zwiten Teil gehen wir einen Schritt weiter und schauen uns die Deserializer genauer an. Diese sind vor allem dann sehr interessant, wenn man eine Fremd-Rest-API nutzen möchte. Die Json Struktur und die daraus direkt resultierenden Java-Objekte können nämlich nicht der Vorstellung entsprechen, die man von einer schönen API hat.<br />
<span id="more-2009"></span><br />
Normalerweise wandelt Gson ein Json in die Objekte um, die ausgehend von der Eingangsklasse definiert sind. Dort findet man üblicherweise Objekte wie String, Integer, Boolean etc und natürlich auch weitere Java Klassen. Möchte man beispielsweise statt eines String ein Enumerator erhalten, so muss man Gson etwas unterstützen. Angenommen wir haben folgenden Enumerator:</p>
<pre class="brush: java; title: ; notranslate">
public enum SocialMediaNetwork {
    
    TWITTER(&quot;tw&quot;, &quot;twitter&quot;), 
    GOOGLE_PLUS(&quot;gp&quot;,&quot;googleplus&quot;),
    UNKNOWN(&quot;&quot;,&quot;&quot;);
    
    // network short name
    private final String shortName;
    
    // network long name
    private final String longName;

    private SocialMediaNetwork(String shortName, String longName) {
        this.shortName = shortName;
        this.longName = longName;
    }

    public String getShortName() {
        return shortName;
    }

   public String getLongName() {
        return longName;
    }
    
    public static SocialMediaNetwork getEnumFromShortName(String shortName) {
        for(SocialMediaNetwork network: SocialMediaNetwork.values()) {
            if (network.getShortName().equals(shortName)) {
                return network;
            }
        }
        
        return UNKNOWN;
    }
}
</pre>
<p>Der Enumerator stellt fasst verschiedene SocialMedia-Netzwerke zusammen und stellt Strings bereit, die im weiteren Code benutzt werden. Hat man nun einen <code>shortName</code> kann man auch das passende Enum erzeugen. </p>
<p>Nehmen wir nun an, dass wir folgendes Json-Fragment haben:</p>
<pre class="brush: jscript; title: ; notranslate">
{
    &quot;id&quot;: &quot;26565946&quot;,
    &quot;network&quot;: &quot;tw&quot;
}
</pre>
<p>Dieses Objekt hat eine id, die wir durch einen String repräsentieren können und ein network, dass normalerweise ebenfalls ein String ist. Wir wandeln aber das network-Attribut in ein SocialMediaNetwork Enum um. Zuerst werfen wir noch einen kurzen Blick auf das Java-Objekt:</p>
<pre class="brush: java; title: ; notranslate">
public class Identifier {
   private String id;
   private SocialMediaNetwork network;

   public String getId() {
      return this.id;
   }

   public SocialMediaNetwork getNetwork() {
      return this.network;
   }
}
</pre>
<p>Nach dieser Vorarbeit kommen wir zum eigentlichen Deserializer. Dieser wandelt den <code>network</code>-String in unser Enum um. In weiser Voraussicht gibt es im Enum eine statische Methode, die man im Deserializer gleich nutzen kann und somit sieht der Code folgendermaßen aus:</p>
<pre class="brush: java; title: ; notranslate">
class SocialMediaNetworkDeserializer implements JsonDeserializer&lt;SocialMediaNetwork&gt;{

    public SocialMediaNetwork deserialize(JsonElement json, Type type, JsonDeserializationContext jdc) throws JsonParseException {
        return SocialMediaNetwork.getEnumFromShortName(json.getAsString());
    }
    
}
</pre>
<p>Der Deserializer implementiert immer den JsonDeserializer. Dieser bekommt als Generic noch den Typ des Objekts mitgegeben, in welchen das vorliegende Json deserialisiert werden soll. Das entspricht dann eben dem Rückgabewert der <code>deserialize</code>-Methode. In dieser Methode müssen wir die Logik implementieren, die dazu notwendig ist das Json-Artefakt in ein Java-Objekt zu deserialisieren. Wir nehmen dazu das JsonElement und stecken dieses als <code>String</code> in die statische Methode des <code>Enums</code>. Und erhalten schon unser Enum, oder wenn etwas schief geht den Fallback-Wert <code>UNKNOWN</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2013/05/16/gson-google-json-library-teil-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=16922&amp;popout=1&amp;url=http%3A%2F%2Fwww.phpmonkeys.de%2F2013%2F05%2F16%2Fgson-google-json-library-teil-2%2F&amp;language=de_DE&amp;category=text&amp;title=Gson+%26%238211%3B+google+json+library+%28Teil+2%29&amp;description=Im+ersten+Teil+zum+Thema+Gson+gab+es+ja+bereits+einen+kurzen+%C3%9Cberblick%2C+wie+man+Gson+grunds%C3%A4tzlich+nutzt.+Im+heutigen+zwiten+Teil+gehen+wir+einen+Schritt+weiter+und+schauen+uns...&amp;tags=advanced%2Cgoogle%2Cgson%2Cjson%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Gson &#8211; google json library (Teil 1)</title>
		<link>http://www.phpmonkeys.de/2013/04/15/gson-google-json-library-teil-1/</link>
		<comments>http://www.phpmonkeys.de/2013/04/15/gson-google-json-library-teil-1/#comments</comments>
		<pubDate>Mon, 15 Apr 2013 15:15:53 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[gson]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[rest]]></category>

		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=1976</guid>
		<description><![CDATA[Bei Rest-Services werden häufig die Daten im JSON-Format zurückgeliefert. Diese Daten möchte man auf leichte Art und Weise aus der JavaScript Notation in eine Objekt-Struktur der passenden Programmiersprache transferieren. Hier hilft die Google-Bibliothek GSON. Bevor man mit der Serialisierung/Deserialisierung starten &#8230; <a href="http://www.phpmonkeys.de/2013/04/15/gson-google-json-library-teil-1/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Bei Rest-Services werden häufig die Daten im <a href="http://de.wikipedia.org/wiki/JavaScript_Object_Notation" target="_blank">JSON-Format</a> zurückgeliefert. Diese Daten möchte man auf leichte Art und Weise aus der JavaScript Notation in eine Objekt-Struktur der passenden Programmiersprache transferieren. Hier hilft die <a href="https://code.google.com/p/google-gson/" target="_blank">Google-Bibliothek GSON</a>.<br />
<span id="more-1976"></span><br />
Bevor man mit der Serialisierung/Deserialisierung starten kann, muss man ein Gson-Objekt generieren. Die einfachste Möglichkeit hierfür ist:</p>
<pre class="brush: java; title: ; notranslate">
Gson gson = new Gson();
</pre>
<p>Besser ist es jedoch den vorhandenen Builder zu benutzen, da man so das Gson-Objekt im Vorfeld etwas konfigurieren kann. Dadurch kann man die Ausgabe oder auch die Serialisierung/Deserialisierung beeinflussen.</p>
<pre class="brush: java; title: ; notranslate">
Gson gson = new GsonBuilder().create();
// gson-object with pretty print output
Gson gsonPretty = new GsonBuilder().setPrettyPrinting().create();
</pre>
<p>Um die Umwandlung durchzuführen benötigt man natürlich entsprechende Java-Klassen. Als Beispiel nehme man folgenden JSON-String:</p>
<pre class="brush: jscript; title: ; notranslate">
{
  &quot;id&quot;: &quot;file&quot;,
  &quot;value&quot;: &quot;File&quot;,
  &quot;popup&quot;: {
    &quot;menuitem&quot;: [
      {&quot;value&quot;: &quot;New&quot;, &quot;onclick&quot;: &quot;CreateNewDoc()&quot;},
      {&quot;value&quot;: &quot;Open&quot;, &quot;onclick&quot;: &quot;OpenDoc()&quot;},
      {&quot;value&quot;: &quot;Close&quot;, &quot;onclick&quot;: &quot;CloseDoc()&quot;}
    ]
  }
}
</pre>
<p>Dazu kann man nun entsprechende Klassen implementieren. Der Einfachheit halber sind Getter und Setter nicht aufgelistet. Zum Beispiel:</p>
<pre class="brush: java; title: ; notranslate">
class Menu {
   private String id;
   private String value;
   private Popup popup;
}

class Popup {
   private List&lt;MenuItem&gt; menuitem;
}

class MenuItem {
   private String value;
   private String onclick;
}
</pre>
<p>Sobald der JSON-String und die Java-Klassen vorhanden sind, kann man mit dem zuvor erzeugten Gson-Objekt die Transformation durchführen.</p>
<pre class="brush: java; title: ; notranslate">
String jsonString = &quot;&lt;jsonString&gt;&quot;;
Menu menu = gson.fromJson(jsonString, Menu.class);
</pre>
<p>Jetzt kann das <code>menu</code>-Objekt verwendet werden. Möchte man hingegen ein vorhandenes Model in einen JSON String serialisieren so geht dies ganz einfach mit:</p>
<pre class="brush: java; title: ; notranslate">
Menu menu;
String json = gson.toJson(menu);
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2013/04/15/gson-google-json-library-teil-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=16922&amp;popout=1&amp;url=http%3A%2F%2Fwww.phpmonkeys.de%2F2013%2F04%2F15%2Fgson-google-json-library-teil-1%2F&amp;language=de_DE&amp;category=text&amp;title=Gson+%26%238211%3B+google+json+library+%28Teil+1%29&amp;description=Bei+Rest-Services+werden+h%C3%A4ufig+die+Daten+im+JSON-Format+zur%C3%BCckgeliefert.+Diese+Daten+m%C3%B6chte+man+auf+leichte+Art+und+Weise+aus+der+JavaScript+Notation+in+eine+Objekt-Struktur+der+passenden+Programmiersprache+transferieren.+Hier...&amp;tags=google%2Cgson%2Cjava%2Cjson%2Crest%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Samsung CLP-510N und Macos X Mountain Lion</title>
		<link>http://www.phpmonkeys.de/2013/02/23/samsung-clp-510n-und-macos-x-mountain-lion/</link>
		<comments>http://www.phpmonkeys.de/2013/02/23/samsung-clp-510n-und-macos-x-mountain-lion/#comments</comments>
		<pubDate>Sat, 23 Feb 2013 12:08:11 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[510N]]></category>
		<category><![CDATA[CLP]]></category>
		<category><![CDATA[MacOS]]></category>
		<category><![CDATA[Mountain Lion]]></category>
		<category><![CDATA[Samsung]]></category>

		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=1972</guid>
		<description><![CDATA[Seit Ende letzten Jahres nutze ich Mountain Lion. Das Update war sehr problemlos, jedoch war bisher eine Hardware Komponente nicht mehr funktional. Der Samsung CLP-510N wollte nicht mehr drucken. In der Zwischenzeit hatte ich mich mit Workarounds um das Problem &#8230; <a href="http://www.phpmonkeys.de/2013/02/23/samsung-clp-510n-und-macos-x-mountain-lion/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Seit Ende letzten Jahres nutze ich Mountain Lion. Das Update war sehr problemlos, jedoch war bisher eine Hardware Komponente nicht mehr funktional. Der Samsung CLP-510N wollte nicht mehr drucken. In der Zwischenzeit hatte ich mich mit Workarounds um das Problem gedrückt, aber das ist natürlich kein Zustand. Eine Nachfrage an Samsung brachte auch keine Besserung.<br />
<span id="more-1972"></span></p>
<p>Die Samsung Treiber sind seit Mountain Lion nicht mehr unterstützt und bei dem Versuch zu Drucken war nur eine Fehlermeldung zu lesen, dass die Treiber aktualisiert werden müssen und man sich an den Hersteller wenden soll. Dies hatte ich auch gemacht und laut Samsung sind diese Treiber in der Entwicklung. Meine ganz persönliche Meinung ist aber eher, dass dieser Drucker nicht mehr unterstützt wird. Neuere Drucker sind nämlich bereits mit Treibern versorgt.</p>
<p>Die Lösung für das Problem ist das <a href="http://guigo.us/mac/splix/" target="_blank">SpliX Paket für Cups</a>. Diese Treiber muss man nur installieren und dann bei der Drucker-Installation einfach auswählen. Und schon funktioniert der Drucker wieder mit Mountain Lion. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2013/02/23/samsung-clp-510n-und-macos-x-mountain-lion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=16922&amp;popout=1&amp;url=http%3A%2F%2Fwww.phpmonkeys.de%2F2013%2F02%2F23%2Fsamsung-clp-510n-und-macos-x-mountain-lion%2F&amp;language=de_DE&amp;category=text&amp;title=Samsung+CLP-510N+und+Macos+X+Mountain+Lion&amp;description=Seit+Ende+letzten+Jahres+nutze+ich+Mountain+Lion.+Das+Update+war+sehr+problemlos%2C+jedoch+war+bisher+eine+Hardware+Komponente+nicht+mehr+funktional.+Der+Samsung+CLP-510N+wollte+nicht+mehr+drucken.+In...&amp;tags=510N%2CCLP%2CMacOS%2CMountain+Lion%2CSamsung%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Frohes neues Jahr 2013</title>
		<link>http://www.phpmonkeys.de/2013/01/02/frohes-neues-jahr-2013/</link>
		<comments>http://www.phpmonkeys.de/2013/01/02/frohes-neues-jahr-2013/#comments</comments>
		<pubDate>Wed, 02 Jan 2013 12:29:15 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[froher neues Jahr]]></category>
		<category><![CDATA[Happy new year]]></category>
		<category><![CDATA[offtopic]]></category>

		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=1967</guid>
		<description><![CDATA[Wieder ist ein Jahr vergangen und somit bleibt mir nur euch allen ein frohes neues Jahr zu wünschen. Ich hoffe, dass auch dieses Jahr alle Wünsche, Hoffnungen und Erwartungen in Erfüllung gehen. Für 2013 habe ich als guten Vorsatz u.a. &#8230; <a href="http://www.phpmonkeys.de/2013/01/02/frohes-neues-jahr-2013/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Wieder ist ein Jahr vergangen und somit bleibt mir nur euch allen ein frohes neues Jahr zu wünschen. Ich hoffe, dass auch dieses Jahr alle Wünsche, Hoffnungen und Erwartungen in Erfüllung gehen.</p>
<p>Für 2013 habe ich als guten Vorsatz u.a. vorgenommen wieder regelmäßiger zu schreiben, und dafür auch mehr Ideen zu sammeln und mit Zeit zu schaffen. Hoffentlich funktioniert das auch wie geplant <img src='http://www.phpmonkeys.de/wp-includes/images/smilies/icon_smile.gif' alt="Icon Smile in Frohes neues Jahr 2013" class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2013/01/02/frohes-neues-jahr-2013/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=16922&amp;popout=1&amp;url=http%3A%2F%2Fwww.phpmonkeys.de%2F2013%2F01%2F02%2Ffrohes-neues-jahr-2013%2F&amp;language=de_DE&amp;category=text&amp;title=Frohes+neues+Jahr+2013&amp;description=Wieder+ist+ein+Jahr+vergangen+und+somit+bleibt+mir+nur+euch+allen+ein+frohes+neues+Jahr+zu+w%C3%BCnschen.+Ich+hoffe%2C+dass+auch+dieses+Jahr+alle+W%C3%BCnsche%2C+Hoffnungen+und+Erwartungen+in...&amp;tags=froher+neues+Jahr%2CHappy+new+year%2Cofftopic%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Rezension: ExtGWT Rich Internet Application Cookbook</title>
		<link>http://www.phpmonkeys.de/2012/11/13/rezension-extgwt-rich-internet-application-cookbook/</link>
		<comments>http://www.phpmonkeys.de/2012/11/13/rezension-extgwt-rich-internet-application-cookbook/#comments</comments>
		<pubDate>Tue, 13 Nov 2012 11:29:17 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[ExtGWT]]></category>
		<category><![CDATA[Google Web Toolkit]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[GXT]]></category>
		<category><![CDATA[Rezension]]></category>
		<category><![CDATA[Rich Internet Application]]></category>

		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=1931</guid>
		<description><![CDATA[Zur Zeit bin ich in dem Bereich GWT und GXT aktiv und habe mich daher auf die Suche nach geeigneter Literatur gemacht. Natürlich findet man im Netz einige Seiten zu den Themen, aber gelegentlich ist es schon gut Information in &#8230; <a href="http://www.phpmonkeys.de/2012/11/13/rezension-extgwt-rich-internet-application-cookbook/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Zur Zeit bin ich in dem Bereich GWT und GXT aktiv und habe mich daher auf die Suche nach geeigneter Literatur gemacht. Natürlich findet man im Netz einige Seiten zu den Themen, aber gelegentlich ist es schon gut Information in einem gebundenen Zustand zur Hand zu haben. Bei der Suche habe ich 3 Bücher gefunden: <em>Ext GWT 2.0: Beginner&#8217;s Guide</em>, <em>Developing with ExtGWT: Enterprise RIA Development</em> und das im Titel benannte <em><a href="http://www.packtpub.com/extgwt-rich-internet-application-cookbook/book" target="_self">ExtGWT Rich Internet Application Cookbook</a></em>. Der Beginnersguide war vom Thema her wirklich sehr für Anfänger gedacht und war bei weiterführenden Themen und Fragen nicht sehr hilfreich. Developing with ExtGWT ist von 2008, das hat mich ziemlich abgeschreckt, da vor allem bei GWT die Entwicklung in letzter Zeit ganz schöne Fortschritte gemacht hat. Diese können eigentlich nicht berücksichtigt sein. Also bleibt noch das Cookbook. Und das möchte ich nun etwas vorstellen.<br />
<span id="more-1931"></span><br />
Das ExtGWT Rich Internet Application Cookbook basiert auf GWT 2.4 und ExtGWT 2.2.5 und ist damit von der Aktualität etwas durchwachsen. GWT 2.5 ist erst vor kurzem veröffentlicht worden und somit geht es für ein Buch eigentlich nicht aktueller. ExtGWT ist ein etwas anderes Thema. Hier ist die Version 3 bereits verfügbar, die sich mehr an moderne GWT Patterns hält. Im Enterprise Umfeld ist diese Version gerade wegen der API-Anpassung noch nicht angekommen, da ein Umstieg einige Umbauarbeiten mit sich ziehen würde. Es ist von daher anzunehmen, dass ExtGWT 2.2.5 noch etwas Bestand haben wird. Vielleicht bieten die Autoren zu einem späteren Zeitpunkt eine überarbeitete Fassung. Das vorliegende Buch ist vom September 2012, wurde von <a href="http://www.packtpub.com/authors/profiles/odili-charles-opute" target="_blank">Odili Charles Opute</a> und <a href="http://www.packtpub.com/authors/profiles/oded-nissan" target="_blank">Oded Nissan</a> geschrieben und umfasst fast 370 Seiten.</p>
<h2>Ein Kochbuch mit Rezepten</h2>
<p>Das Buch beinhaltet 80 Rezepte. Jedes Rezept besteht aus einer Einleitung, einem Quellcode-Abschnitt und aus einer Erklärung des Codes. In der Einleitung wird kurz umrissen, worum es in dem Rezept geht. Hier findet man neben dem einführenden Text auch Screenshots und zum Teil Klassendiagramme, die den kommenden Aufbau verdeutlichen. Der Quellcode beschränkt sich auf das notwendigste. Es werden keine Methoden programmiert die vom wesentlichen ablenken. In der Erklärung wird dann ausführlich auf die Zusammenhänge im Code eingegangen. Sollte man mit dem Quellcode nicht auf Anhieb klar kommen, ist der letzte Abschnitt (&#8220;<em>How it works</em>&#8220;) unumgänglich.</p>
<h2>Themenbereiche</h2>
<p>Die Rezepte sind thematisch sortiert und zu logischen Blöcken zusammengefasst. Somit kann man &#8211; wenn man das Buch nicht nur als Nachschlagewerk nutzt &#8211; sich einen Themenkomplex genauer anschauen. Da ExtGWT schon sehr oberflächenlastig ist, sind viele der Themen in diesem Bereich angesiedelt. Was unter der Haube passiert wird bei den komplexeren UI-Elementen natürlich auch erklärt. Als Einstieg dient ein Kapitel über <em>Panels</em> und <em>Windows</em>. Im Themenbereich Tabs wird der Umgang mit der Tab-Steuerung erklärt, wie man diese programmatisch manipuliert und auch wie eine einfache Benachrichtigungsfunktion eingebaut werden kann, die den Benutzer auf Tab hinweist, welches sich nicht im seinem Fokus befindet, aber dennoch von seinem Interesse sein kann. Beispielsweise durch eine Änderung der Daten oder ähnliches.<br />
Im Themenkomplex <em>Buttons, Toolbars und Menüs</em> sieht man neben der einfachen Benutzung von Buttons auch, wie man mit Actions arbeiten kann. Insbesondere in größeren Anwendungen ist dies von Vorteil und spart sehr viel Code. Dieses Vorgehensweise ist vor allem aus der Swing Welt bekannt, wird aber &#8211; nach meiner Erfahrung &#8211; in jedem größeren GWT-Projekt neu erfunden und reimplementiert. Warum also nicht gleich die Boardmittel von GXT nutzen.<br />
Weitere UI-Kapitel beschäftigen sich mit den Formularen, der Tree-Komponente und ihrer Benutzung und der sehr genialen Grid Komponente von GXT. Die Benutzung von Templates wird vorgestellt und es wird eine Datenvisualisierung vorgstellt.<br />
Dabei wird eine Komponente vorgestellt die nicht Bestandteil von GXT ist. Es handelt sich dabei um ein Plugin, das diese Funktionalität zur Verfügung stellt.<br />
Abschließend findet sich noch ein Kapitel zum Thema Drag and Drop, was bei einer modernen Weboberfläche heute nicht mehr fehlen darf und ein Kapitel mit <em>Advanced Tips</em>, wowie eins über <em>Themeing</em>.</p>
<p>Die <em>Advanced Tips</em> sind richtig spannend. Hier wird Persistenz und das MVP Pattern vorgestellt. Daneben gibt es noch einen Abschnitt zu einem Server Push Mechanismus, was bspw bei Chat oder Anwendungen mit Realtime Daten interessant ist. Das Kapitel setzt vor allem auf Fremdbibliotheken wie Hibernate oder eben dem Server Push. </p>
<h2>&#8230; und es gibt noch mehr</h2>
<p>Die Appendices vom <a href="http://www.packtpub.com/extgwt-rich-internet-application-cookbook/book" target="_blank">ExtGWT Rich Internet Application Cookbook</a> haben es auch in sich. Das Event Handling wird noch kurz vorgestellt, der Umgang mit Exceptions, der unter GWT vor allem in Hinblick auf die Servlet Schicht nicht unbedingt ganz offensichtlich ist. Die Erstellung eigener Icons darf nicht fehlen und das GWT-RPC Konzept wird auf der Ebene vorgestellt, wie es für den Entwickler interessant ist. Und als Abschluß des gesamten Buches gibt es noch den Appendix zu File Uploads. Dort wird auch erklärt wie man den Fortschritt nachverfolgen kann und den Benutzer visuell informiert.</p>
<h2>Fazit</h2>
<p>Für mich wirkt das Buch durchdacht und ist ein Muss für alle ExtGWT Entwickler, die das Framework nicht schon bis ins kleinste Detail kennen. Leider ist noch die &#8220;alte&#8221; Version 2.2.5 von GXT behandelt, aber wie bereits erwähnt ist dies im Enterprise Umfeld nicht unbedingt ein Nachteil. Interessant ist das Angebot von Packt Publishing: Neben der Printausgabe bekommt man auch noch die eBook Version. Und das zu einem recht guten Preis.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2012/11/13/rezension-extgwt-rich-internet-application-cookbook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=16922&amp;popout=1&amp;url=http%3A%2F%2Fwww.phpmonkeys.de%2F2012%2F11%2F13%2Frezension-extgwt-rich-internet-application-cookbook%2F&amp;language=de_DE&amp;category=text&amp;title=Rezension%3A+ExtGWT+Rich+Internet+Application+Cookbook&amp;description=Zur+Zeit+bin+ich+in+dem+Bereich+GWT+und+GXT+aktiv+und+habe+mich+daher+auf+die+Suche+nach+geeigneter+Literatur+gemacht.+Nat%C3%BCrlich+findet+man+im+Netz+einige+Seiten+zu...&amp;tags=ExtGWT%2CGoogle+Web+Toolkit%2CGWT%2CGXT%2CRezension%2CRich+Internet+Application%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Git stash</title>
		<link>http://www.phpmonkeys.de/2012/10/30/git-stash/</link>
		<comments>http://www.phpmonkeys.de/2012/10/30/git-stash/#comments</comments>
		<pubDate>Tue, 30 Oct 2012 08:27:54 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[version control]]></category>
		<category><![CDATA[versionsverwaltung]]></category>

		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=1904</guid>
		<description><![CDATA[Bei der täglichen Arbeit kommt es ja immer wieder zu Unterbrechungen. Man entwickelt an einem Feature und plötzlich kommt ein Bug rein, der schnell behoben werden muss. Früher hat man dann immer gehofft, dass der Bug in einem anderen Teilbereich &#8230; <a href="http://www.phpmonkeys.de/2012/10/30/git-stash/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Bei der täglichen Arbeit kommt es ja immer wieder zu Unterbrechungen. Man entwickelt an einem Feature und plötzlich kommt ein Bug rein, der schnell behoben werden muss. Früher hat man dann immer gehofft, dass der Bug in einem anderen Teilbereich auftritt, sodass man hier keinen unfertigen Code einchecken muss. Im schlimmsten Fall hat man Dateien umkopiert und umbenannt und wiederhergestellt &#8211; alles war nicht sehr befriedigend. Nutzt man natürlich konsequent Branches ist das Problem kleiner aber Git bietet hier einen schicken Ansatz, der mir schon jetzt gut gefällt.<br />
<span id="more-1904"></span><br />
Das tolle Git-Feature heißt <code>git stash</code>. Dabei werden alle lokalen Änderungen weggespeichert. Man kann nun Änderungen pullen oder einfach nur an einem anderen Bug oder Feature arbeiten. Diese Änderungen können selbstverständlich wiederum weggespeichert werden. </p>
<p>Möchte man zu einem späteren Zeitpunkt den früheren Zustand wieder herstellen und weiterarbeiten kann man mit <code>git stash pop</code> oder <code>git stash apply</code> die gespeicherten Änderungen wieder einspielen. Wobei <code>pop</code> das Änderungs-Set auch aus dem Stash entfernt und <code>apply</code> die Änderung einfach nur anwendet.</p>
<p>Eine Übersicht der vorhandenen Stash-Objekte erhält man mit <code>git stash list</code>. Ist alles im Stash nicht mehr relevant, so kann man mit <code>git stash clear</code> alle Objekte verwerfen. Einzelne entfernt man einfach mit <code>git stash drop</code>.</p>
<p><em>Mein persönlicher Workflow bei einem Git Checkin ist</em>:</p>
<ul>
<li>git status // was hat sich bisher geändert</li>
<li>git stash // Änderungen weglegen</li>
<li>git pull &#8211;rebase // Remote Änderungen abholen</li>
<li>git stash pop // lokale Änderungen aus dem Stash anwenden</li>
<li>git add (-u) // Änderungen in ein Commitset hinzufügen (-u: nur geänderte Dateien)</li>
<li>git commit // lokale Änderungen commiten</li>
<li>git push // ausstehende Commits zum Remote Repo pushen</li>
</ul>
<p><em>Nun noch eine kurze Ankündigung in eigener Sache:</em><br />
 <a href="http://www.phpmonkeys.de/wp-content/uploads/2012/10/ExtGWT-cookbook.png" rel="lightbox[1904]" title="ExtGWT cookbook"><img src="http://www.phpmonkeys.de/wp-content/uploads/2012/10/ExtGWT-cookbook.png" alt="ExtGWT-cookbook in Git stash" width="122" height="152" class="alignleft size-full wp-image-1911" /></a>Demnächst gibt es hier eine Rezension vom &#8220;<a href="http://www.packtpub.com/extgwt-rich-internet-application-cookbook/book" target="_blank">ExtGWT Rich Internet Application Cookbook</a>&#8220;. Dabei handelt es sich um ein Buch zum Thema ExtGWT/GXT von <a href="http://www.sencha.com/products/gxt" target="_blank">Sencha</a>. Da die Literatur in diesem Bereich sehr überschaubar ist, wird das Buch sicher sehr interessant werden. Vor allem da &#8211; um nicht schon zuviel zu verraten &#8211; hier neben den typischen Anfängerthemen auch noch einiges für die Forgeschrittenen GXT-Entwickler erklärt und vorgestellt wird.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2012/10/30/git-stash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=16922&amp;popout=1&amp;url=http%3A%2F%2Fwww.phpmonkeys.de%2F2012%2F10%2F30%2Fgit-stash%2F&amp;language=de_DE&amp;category=text&amp;title=Git+stash&amp;description=Bei+der+t%C3%A4glichen+Arbeit+kommt+es+ja+immer+wieder+zu+Unterbrechungen.+Man+entwickelt+an+einem+Feature+und+pl%C3%B6tzlich+kommt+ein+Bug+rein%2C+der+schnell+behoben+werden+muss.+Fr%C3%BCher+hat+man...&amp;tags=Git%2Csubversion%2Cversion+control%2Cversionsverwaltung%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Braindump: git commits, die noch nicht &#8220;gepushed&#8221; sind, auflisten</title>
		<link>http://www.phpmonkeys.de/2012/10/19/braindump-git-commits-die-noch-nicht-gepushed-sind-auflisten/</link>
		<comments>http://www.phpmonkeys.de/2012/10/19/braindump-git-commits-die-noch-nicht-gepushed-sind-auflisten/#comments</comments>
		<pubDate>Fri, 19 Oct 2012 12:29:05 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[dezentral]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=1891</guid>
		<description><![CDATA[Heute gibt es einen kleinen Braindump: Seit neustem benutze ich beruflich kein Subversion mehr, sondern bin zu git gewechselt. Die Arbeitsweise bei einem dezentralen System unterscheidet sich schon etwas von der gewohnten und bringt viele neue und interessante Funktionen mit &#8230; <a href="http://www.phpmonkeys.de/2012/10/19/braindump-git-commits-die-noch-nicht-gepushed-sind-auflisten/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Heute gibt es einen kleinen <em>Braindump</em>: Seit neustem benutze ich beruflich kein Subversion mehr, sondern bin zu <a href="http://git-scm.com/" target="_blank">git</a> gewechselt. Die Arbeitsweise bei einem dezentralen System unterscheidet sich schon etwas von der gewohnten und bringt viele neue und interessante Funktionen mit sich.<br />
<span id="more-1891"></span><br />
Da man dezentral arbeitet, hat man bei <code>git</code> ein eigenes Repository, dass von einem gemeinsam genutzten geklont wird. Änderungen nimmt man an seinem Code vor und commitet diese dann nur in das lokale System. Üblicherweise werden diese Änderungen dann per <code>git push</code> in das gemeinsam genutzte Repository übertragen. Wenn man einige Commits gemeinsam ins Repository pushed, will man vielleicht vorher noch einmal nachsehen, welche Änderungen denn zur Zeit noch ausstehen. </p>
<p>Hierfür gibt es einen kurzen Befehl:</p>
<pre class="brush: plain; title: ; notranslate">
git log @{u}..
</pre>
<p>Weitere interessante Befehle für die SVN-Umsteiger folgen &#8230; </p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2012/10/19/braindump-git-commits-die-noch-nicht-gepushed-sind-auflisten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=16922&amp;popout=1&amp;url=http%3A%2F%2Fwww.phpmonkeys.de%2F2012%2F10%2F19%2Fbraindump-git-commits-die-noch-nicht-gepushed-sind-auflisten%2F&amp;language=de_DE&amp;category=text&amp;title=Braindump%3A+git+commits%2C+die+noch+nicht+%26%238220%3Bgepushed%26%238221%3B+sind%2C+auflisten&amp;description=Heute+gibt+es+einen+kleinen+Braindump%3A+Seit+neustem+benutze+ich+beruflich+kein+Subversion+mehr%2C+sondern+bin+zu+git+gewechselt.+Die+Arbeitsweise+bei+einem+dezentralen+System+unterscheidet+sich+schon+etwas+von...&amp;tags=dezentral%2CGit%2Csubversion%2Cversion+control%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Ein bisschen Continuous Delivery</title>
		<link>http://www.phpmonkeys.de/2012/08/22/ein-bisschen-continuous-delivery/</link>
		<comments>http://www.phpmonkeys.de/2012/08/22/ein-bisschen-continuous-delivery/#comments</comments>
		<pubDate>Wed, 22 Aug 2012 08:51:34 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Continuous Delivery]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[Jenkins]]></category>

		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=1879</guid>
		<description><![CDATA[Heute geht es um Continuous Delivery. Es handelt sich dabei wie bei der Continuous Integration um einen automatisierten Prozess, der den Arbeitsalltag übersichtlicher und leichter macht. Wie Delivery schon sagt wird hierbei die Auslieferung der Software betrachtet. Wie man der &#8230; <a href="http://www.phpmonkeys.de/2012/08/22/ein-bisschen-continuous-delivery/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Heute geht es um Continuous Delivery. Es handelt sich dabei wie bei der Continuous Integration um einen automatisierten Prozess, der den Arbeitsalltag übersichtlicher und leichter macht. Wie <em>Delivery</em> schon sagt wird hierbei die Auslieferung der Software betrachtet. Wie man der Überschrift entnehmen kann, gibt es kein fertiges System, sondern eine praktische Anleitung in welche Richtung man gehen kann und vor allem <em>wie</em> man losgeht.<span id="more-1879"></span></p>
<p>Im Laufe der Entwicklung muss man seine Software sehr häufigen ausrollen. Da gibt es das CI System, ein Demonstrationssystem, vielleicht noch Präsentations- und Testsysteme und am Schluss auch noch das Live-System.<br />
Ein CI System erfordert schon, dass es eine Automatisierung gibt, damit man sein Produkt im aktuellen Zustand ansehen kann. Diese Skripte lassen sich zumeist auch gleich für die internen System adaptieren und somit bleibt eigentlich nur das Staging und das Live-System etwas außen vor, wenn diese nicht intern betrieben werden.<br />
Ich habe schon einige Male die Situation gesehen, dass diese Deployment-Skripte Shell-Skripte sind, deren Aufruf nur eine beschränkte Personengruppe ausführt. Sei es Unwissenheit, wo die Skripte eigentlich genau liegen und wie diese funktionieren, oder einfach nur Ungewissheit, was das Skript tut, das einmal der Shell-Guru entwickelt hat. Dieser Zustand ist nicht optimal und es gilt eine Verbesserung zu finden.<br />
Hier kommt der Hudson/Jenkins ins Spiel. Das Deployment zu dem CI-Server wird ja (hoffentlich) von diesem System durchgeführt, also kann man auch gleich weitere Deployments über spezielle Jobs triggern. In einem konkreten Fall wurden hierfür einfach Tasks angelegt, die zeitlich getriggert sind (bspw. für die Demonstration im Scrum-Prozess) oder die nur manuell angestoßen werden.<br />
Da wir Shell-Skripte vorliegen haben nutzen wir einfach die Möglichkeit Shellskripte vom Hudson/Jenkins aufrufen zu lassen. Diese lassen sich übrigens mittels ssh auch <em>remote</em> anstoßen.</p>
<p><em>Was gewinnt man dadurch?</em><br />
Dem Entwickler werden Bedenken genommen, da man nun eigentlich nur auf einen Startknopf drücken muss. Somit kann das Deployment eigentlich von jedem angestoßen werden. Und das heißt die Deployment Aufgabe kann im Team verteilt werden.</p>
<p><em>Wie verhindert man Doppeldeployments (etwa 2 verschiedene Builds deployen auf den gleichen Server)?</em><br />
Um das Ausführen von Jobs zu verhindern, die nicht parallel ausgeführt werden dürfen, aber ansonsten unabhängig voneinander sind, kann man &#8220;Locks and Latches&#8221; benutzen. Dieses <a href="http://wiki.hudson-ci.org/display/HUDSON/Locks+and+Latches+plugin" target="_blank">Plugin</a> stellt ein Lock zur Verfügung, an das man die zu verknüpfenden Jobs bindet. So kann genau einer ausgeführt werden. </p>
<p><em>Gibt es weitere Vorteile?</em><br />
Die Zeit für das Deployment kann man mitschneiden und basierend darauf die voraussichtliche Dauer für das nächste Deployment angeben. Auch kann man dann die einzelnen Schritte des Deployment-Shell-Skripts auf den Hudson/Jenkins auslagern. Bspw Emailversand, wenn das Deployment erfolgreich war oder fehlschlug.<br />
Durch die crontab-Funktion des Hudson kann man auch die Skripte an Daten und Uhrzeiten koppeln. Und auch die gesamte Benachrichtigungs-und Trigger-Infrastruktur des Hudson/Jenkins verwenden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2012/08/22/ein-bisschen-continuous-delivery/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=16922&amp;popout=1&amp;url=http%3A%2F%2Fwww.phpmonkeys.de%2F2012%2F08%2F22%2Fein-bisschen-continuous-delivery%2F&amp;language=de_DE&amp;category=text&amp;title=Ein+bisschen+Continuous+Delivery&amp;description=Heute+geht+es+um+Continuous+Delivery.+Es+handelt+sich+dabei+wie+bei+der+Continuous+Integration+um+einen+automatisierten+Prozess%2C+der+den+Arbeitsalltag+%C3%BCbersichtlicher+und+leichter+macht.+Wie+Delivery+schon+sagt...&amp;tags=Continuous+Delivery%2CContinuous+Integration%2CHudson%2CJenkins%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Rezension: The Art of Readable Code</title>
		<link>http://www.phpmonkeys.de/2012/06/28/rezension-the-art-of-readable-code/</link>
		<comments>http://www.phpmonkeys.de/2012/06/28/rezension-the-art-of-readable-code/#comments</comments>
		<pubDate>Thu, 28 Jun 2012 06:55:49 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Buch]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[readable]]></category>
		<category><![CDATA[Rezension]]></category>

		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=1855</guid>
		<description><![CDATA[Nachdem ich das Buch &#8220;The Art of Readable Code&#8221; gelesen hatte, will euch meinen Eindruck dazu nicht vorenthalten. Wer das Buch &#8220;Clean Code&#8221; kennt, in seiner Bibliothek stehen oder es auch einfach gelesen hat, braucht eigentlich nicht mehr weiter zu &#8230; <a href="http://www.phpmonkeys.de/2012/06/28/rezension-the-art-of-readable-code/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><img alt="Cat in Rezension: The Art of Readable Code" src="http://akamaicovers.oreilly.com/images/9780596802301/cat.gif" class="alignleft" width="120" height="158" />Nachdem ich das Buch &#8220;<a href="http://shop.oreilly.com/product/9780596802301.do#" target="_blank">The Art of Readable Code</a>&#8221; gelesen hatte, will euch meinen Eindruck dazu nicht vorenthalten. Wer das Buch &#8220;Clean Code&#8221; kennt, in seiner Bibliothek stehen oder es auch einfach gelesen hat, braucht eigentlich nicht mehr weiter zu lesen, denn &#8220;<a href="http://shop.oreilly.com/product/9780596802301.do#" target="_blank">The Art of Readable Code</a>&#8221; ist soetwas wie der kleine Bruder von &#8220;Clean Code&#8221;.<br />
<span id="more-1855"></span><br />
Auf Englisch wird hier in 190 Seiten eine kurze Übersicht gegeben, worauf es dabei ankommt, wenn man seinen Code lesbar schreiben will. Lesbarer Code ist nämlich immer gut, wenn man selbst zu einem späteren Zeitpunkt drauf schaut und direkt verstehen will, was man damals getan hat; aber auch damit die Arbeitskollegen oder allgemein andere Softwareentwickler sich schnell im fremden Code zurecht finden.</p>
<p>Insgesamt sind alle Kapitel mit Comics versehen, die das jeweilige Thema mit Humor untermalen. Daneben gibt es immer wieder Kurzfassungen des Prinzips &#8211; kann man auch Merksätze nennen &#8211; und am Ende jedes Kapitels eine Zusammenfassung der besprochenen Themen, sodass man sich schnell einen Überblick verschaffen kann. Codebeispiele dürfen in einem Buch über Code natürlich nicht fehlen und diese sind in verschiedenen Sprachen verfasst, sodass die typische Ausrede &#8220;das ist ja nicht in meiner Sprache geschrieben, damit kann ich gar nix anfangen&#8221; nicht gilt. Interessant ist der dadurch gewonnene sehr kleine Einblick in andere Welten.</p>
<p>Die Themen im Überblick sind Coding Conventions, Code vereinfachen, Refactoring, Testing und ein Beispielprojekt. </p>
<p>Persönlich habe ich folgenden 3 Aspekte ausgewählt, die ich bei der Entwicklung verstärkt beachten will:</p>
<ul>
<li>Code muss leicht lesbar sein, nicht hochoptimiert (außer in Ausnahmen)</li>
<li>Benutze nicht mehr als 4 Variablen pro Scope; mehr kann man nur schwerlich überblicken</li>
<li>Kommentiere nur sparsam, der Code selbst sollte schon lesbar und verständlich sein</li>
</ul>
<p>Bei <a href="http://books.google.de/books?id=78lsu1nMYm0C&#038;printsec=frontcover&#038;hl=de#v=onepage&#038;q&#038;f=false" target="_blank">Google Books</a> kann man sich selbst einen kleinen Überblick verschaffen &#8211; sehr praktisch!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2012/06/28/rezension-the-art-of-readable-code/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=16922&amp;popout=1&amp;url=http%3A%2F%2Fwww.phpmonkeys.de%2F2012%2F06%2F28%2Frezension-the-art-of-readable-code%2F&amp;language=de_DE&amp;category=text&amp;title=Rezension%3A+The+Art+of+Readable+Code&amp;description=Nachdem+ich+das+Buch+%26%238220%3BThe+Art+of+Readable+Code%26%238221%3B+gelesen+hatte%2C+will+euch+meinen+Eindruck+dazu+nicht+vorenthalten.+Wer+das+Buch+%26%238220%3BClean+Code%26%238221%3B+kennt%2C+in+seiner+Bibliothek+stehen+oder+es...&amp;tags=Buch%2CClean+Code%2Ccode%2Creadable%2CRezension%2Cblog" type="text/html" />
	</item>
		<item>
		<title>pwdx</title>
		<link>http://www.phpmonkeys.de/2012/05/24/pwdx/</link>
		<comments>http://www.phpmonkeys.de/2012/05/24/pwdx/#comments</comments>
		<pubDate>Thu, 24 May 2012 09:10:15 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[Glassfish]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[PID]]></category>
		<category><![CDATA[pwdx]]></category>
		<category><![CDATA[working dir]]></category>

		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=1843</guid>
		<description><![CDATA[Dieser Beitrag fällt unter die Kategorie Braindump. Es geht hierbei darum wie man einem Prozess das Arbeitsverzeichnis findet, damit man den richtigen Prozess auf einem Linux System abschießen kann. Das Problem ist eigentlich recht einfach. Ein Application Server hat sich &#8230; <a href="http://www.phpmonkeys.de/2012/05/24/pwdx/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Dieser Beitrag fällt unter die Kategorie Braindump. Es geht hierbei darum wie man einem Prozess das Arbeitsverzeichnis findet, damit man den richtigen Prozess auf einem Linux System abschießen kann.<br />
<span id="more-1843"></span><br />
Das Problem ist eigentlich recht einfach. Ein Application Server hat sich in einen sehr undefinierten Zustand verabschiedet und kann mit den herkömmlichen Start/Stop-Skripts nicht mehr bearbeitet werden. Da man diesen aber Neustarten will/muss, muss der alte Prozess endgültig abgeschossen werden. Wenn nur genau ein Server läuft, ist dies alles kein Problem. Laufen auf dem System aber mehrere Instanzen, so kann man zwar ziemlich sicher sagen, welcher Server das ist, da man die übrig gebliebenen Ports sehen kann, aber eine hundertprozentige Sicherheit gibt es nicht.<br />
Glücklicherweise kennt man aber das Working Directory, also muss man nur noch herausbekommen, ob der Port und das Arbeitsverzeichnis zusammen passen.</p>
<p>Den Port kennen wir schon also müssen wir nur noch den folgenden Befehl absetzen:</p>
<pre class="brush: bash; title: ; notranslate">
pwdx `lsof -i | grep 12345 | awk '{ print $2}'`
</pre>
<p>Das heißt wir suchen uns alle Prozesse, die einen Port geöffnet haben, dann filtern wir nach dem Port <code>12345</code> und suchen uns die Spalte mit der Prozess ID. Den Vorgang packen wir zusammen und übergeben das Ergebnis dem pwdx Tool und dieses ermittelt zu der gefundenen PID das Working Directory. Als Ergebnis erhält man soetwas:</p>
<pre class="brush: plain; title: ; notranslate">
22613: /home/phpmonkeys/glassfish-v3-01/glassfish/domains/monkeys/config
</pre>
<p>Jetzt sieht man, dass der Prozess genau der richtige ist und kann mit <code>kill</code> weiterarbeiten wie gewohnt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2012/05/24/pwdx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=16922&amp;popout=1&amp;url=http%3A%2F%2Fwww.phpmonkeys.de%2F2012%2F05%2F24%2Fpwdx%2F&amp;language=de_DE&amp;category=text&amp;title=pwdx&amp;description=Dieser+Beitrag+f%C3%A4llt+unter+die+Kategorie+Braindump.+Es+geht+hierbei+darum+wie+man+einem+Prozess+das+Arbeitsverzeichnis+findet%2C+damit+man+den+richtigen+Prozess+auf+einem+Linux+System+abschie%C3%9Fen+kann.+Das...&amp;tags=Glassfish%2Clinux%2CPID%2Cpwdx%2Cworking+dir%2Cblog" type="text/html" />
	</item>
	</channel>
</rss>
