<?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>Simon Koelsch</title>
	<atom:link href="http://www.simon-koelsch.de/feed" rel="self" type="application/rss+xml" />
	<link>http://www.simon-koelsch.de</link>
	<description>Coding Software</description>
	<lastBuildDate>Sat, 17 Jul 2010 14:34:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Android 2.2 Froyo auf dem Vodafone Nexus One (EPF30)</title>
		<link>http://www.simon-koelsch.de/191-android-2-2-froyo-auf-dem-vodafone-nexus-one-epf30</link>
		<comments>http://www.simon-koelsch.de/191-android-2-2-froyo-auf-dem-vodafone-nexus-one-epf30#comments</comments>
		<pubDate>Fri, 02 Jul 2010 22:59:37 +0000</pubDate>
		<dc:creator>Simon Koelsch</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://www.simon-koelsch.de/?p=191</guid>
		<description><![CDATA[
Seit ein paar Tagen bin ich Besitzer eines Nexus One. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.simon-koelsch.de/191-android-2-2-froyo-auf-dem-vodafone-nexus-one-epf30/android_logo" rel="attachment wp-att-203"><img src="http://www.simon-koelsch.de/wp-content/uploads/2010/07/android_logo.png" alt="Android Logo" title="Android Logo" width="100" height="104" class="alignleft size-full wp-image-203" /></a><br />
Seit ein paar Tagen bin ich Besitzer eines Nexus One. Ein Grund warum ich mich gegen das HTC Desire entschieden habe ist unter anderem, dass ich bei einer neuen Android Version nicht Wochenlang warten möchte bis HTC seine Änderungen an der Firmware nachgezogen hat.<br />
Android 2.2, Releasename Froyo, ist nun schon eine Weile verfügbar und bringt ein paar nette Features wie zum Beispiel Tethering mit.</p>
<p>Hat man sein Nexus One nicht direkt bei Google in den USA gekauft, sondern zum Beispiel bei Vodafone, bricht das Update auf Android 2.2 aufgrund einer falschen Prüfsumme schon vor der Installation ab. Hier heisst es dann eigentlich warten, bis Vodafone Android Froyo selbst verteilt.</p>
<p>Wer nicht warten möchte sondern trotzdem auf die aktuelle Version updaten will kann das tun, muss aber vorher seinen Bootloader entsperren und die aktuelle Firmware aufspielen. Ich habe hier in einer kleinen Anleitung zusammengefasst was ich Schritt für Schritt beim Update getan habe. Bei mir ist inzwischen die heute veröffentlichte Build Version Android 2.2 FRF91 installiert und ich kann über keinerlei Probleme klagen.<br />
<span id="more-191"></span></p>
<p>Ein Hinweis vorab: Wurde der Bootloader einmal entsperrt lässt er sich nichtmehr sperren. Beim Einschalten des Nexus One wird ab diesem Zeitpunkt unter dem Logo ein kleines geöffnetes Schloss angezeigt. Dabei erlischt die Garantie.</p>
<h2>Vorbereitungen</h2>
<p>Folgende Dateien werden während der Installation benötigt:</p>
<ul>
<li>fastboot.zip (373 KB)</li>
<li>PASSIMG_Passion_Google_WWE_1.01.1700.1_ERD79_release_signed.zip (78 MB)</li>
<li>signed-passion-ERE27-from-ERD79.a487b405.zip (16 MB)</li>
<li>signed-passion-ota-42745.dc39ca1f.zip (82 MB)</li>
<li>signed-passion-FRF91-from-FRF85B.db99fdf1.zip (910 KB)</li>
</ul>
<p>Da Google die Downloads inzwischen entfernt hat und ich nicht weiss, ob ich die Dateien überhaupt selbst hosten darf, werde ich diese hier nicht hochladen.<br />
Allerdings findet man alle Files problemlos bei einer Google Suche.</p>
<p>Wer möchte kann hier auch die SHA1 Checksummen der gefunden Dateien prüfen:</p>
<p><code>e3798bf97777bf00d095913a96a55e3969518dd3<br />
PASSIMG_Passion_Google_WWE_1.01.1700.1_ERD79_release_signed.zip</p>
<p>a487b405e4dd2ed94623fe3747c3db354dc1fc01<br />
signed-passion-ERE27-from-ERD79.a487b405.zip</p>
<p>dc39ca1f5796c766bb5e7abf816f8b171562c792<br />
signed-passion-ota-42745.dc39ca1f.zip</p>
<p>db99fdf11a5059c903b4cdef9c355b9df5251db0<br />
signed-passion-FRF91-from-FRF85B.db99fdf1.zip</code></p>
<p>Vor den hier beschriebenen Schritten sollte man USB-Debugging für das Nexus One einschalten. Die entsprechende Option findet sich unter Einstellungen -> Anwendungen -> Entwicklung -> USB-Debugging. Eine Sicherung der vorhanden Daten sollte selbstverständlich sein.</p>
<p>Noch ein Wort zur Navigation:<br />
Im Bootloader navigiert man mit den Lautstärketasten an der linken Geräteseite. Mit der Power-Taste wird die ausgewählte Menüoption bestätigt.<br />
Im Recovery Programm kann der Trackball benutzt werden.</p>
<h2>Bootloader entsperren</h2>
<ol>
<li>Nexus One abschalten.</li>
<li>Trackball drücken und Gerät wieder einschalten um in den Bootloader zu gelangen.
</li>
<li>fastboot.zip entpacken und je nach Betriebssystem das entsprechende Script mit folgenden Parametern ausführen:<br />
<code lang="sh">./fastboot-linux oem unlock</code><br />
Hinweis von Carsten aus den Kommentaren: Unter Linux muss Fastboot eventuell mit Rootrechten ausgeführt werden.
</li>
</ol>
<p>Auf dem Nexus One erscheint jetzt eine Abfrage ob der Bootloader wirklich entsperrt werden soll. Diese Abfrage einfach bestätigen.</p>
<h2>Downgrade auf Firmware ERD79</h2>
<ol>
<li>PASSIMG_Passion_Google_WWE_1.01.1700.1_ERD79_release_signed.zip im gleichen Verzeichniss wie fastboot entpacken.
</li>
<li>Auch hier wieder Nexus One abschalten.
</li>
<li>Trackball drücken und Gerät wieder einschalten um in den Bootloader zu gelangen.
</li>
<li>
<code>/fastboot-linux devices</code><br />
sollte das mit dem USB-Kabel verbundene Gerät anzeigen.</code>
</li>
<li>Danach folgende Befehle ausführen:<br />
<code><br />
./fastboot-linux erase cache<br />
./fastboot-linux flash userdata userdata.img<br />
./fastboot-linux flash boot boot.img<br />
./fastboot-linux flash system system.img<br />
./fastboot-linux flash recovery recovery.img<br />
./fastboot-linux reboot<br />
</code>
</li>
</ol>
<p>Bei mir waren dann folgende Ausgaben auf dem Bildschirm zu sehen:<br />
<code><br />
sending 'userdata' (2 KB)... OKAY<br />
writing 'userdata'... OKAY<br />
[echox@kaffeesatz:~/android/froyo/fastboot] % ./fastboot-linux flash boot boot.img<br />
sending 'boot' (2044 KB)... OKAY<br />
writing 'boot'... OKAY<br />
[echox@kaffeesatz:~/android/froyo/fastboot] % ./fastboot-linux flash system system.img<br />
sending 'system' (116663 KB)... OKAY<br />
writing 'system'... OKAY<br />
[echox@kaffeesatz:~/android/froyo/fastboot] % ./fastboot-linux flash recovery recovery.img<br />
sending 'recovery' (2294 KB)... OKAY<br />
writing 'recovery'... OKAY<br />
[echox@kaffeesatz:~/android/froyo/fastboot] % ./fastboot-linux reboot<br />
rebooting...<br />
</code></p>
<p>Nach einer kurzen Wartezeit ist die neue Firmware dann aufgespielt.<br />
Von hier können wir jetzt einfach bis auf Android 2.2 FRF91 Updaten.</p>
<h2>Update auf ERE27, FRF85B (Froyo) und FRF91 (Froyo)</h2>
<ol>
<li>Nexus One über USB-Kabel mit dem Rechner verbinden.</li>
<li>signed-passion-ERE27-from-ERD79.a487b405.zip in update.zip umbenennen und auf die SD-Karte des Androids speichern.</li>
<li>Nexus One abschalten, Trackball drücken, Gerät wieder einschalten um in den Bootloader zu gelangen.</li>
<li>Im Bootloader sollte ausgewählt sein, mit der Power-Taste dann bestätigen.</li>
<li>Recovery auswählen und wieder mit der Powertaste bestätigen.<br />
Wenn ein Ausrufezeichen und ein kleines Android Logo zu sehen ist, die Power-Taste drücken und dann dazu die Volume-Up-Taste.</p>
<p>Die Meldung <i>"E:Can't open /cache/recovery/command"</i> kann dabei getrost ignoriert werden.
</li>
<li>Hier mit dem Trackball "Apply sdcard:update.zip" auswählen und einfach mit dem Trackball bestätigen.</li>
</ol>
<p>Danach erfolgt die Installation und nach einem Neustart ist die Firmware ERE27 installiert.</p>
<p>Diese Schritte müssen als nächstes einfach für die Datei "signed-passion-ota-42745.dc39ca1f.zip" und anschliessend für "signed-passion-FRF91-from-FRF85B.db99fdf1.zip" wiederholt werden.</p>
<p><strong>Danach ist die aktuelle Android 2.2 Version auf dem Nexus One installiert.</strong></p>
<p>Ich habe dafür mit dem Suchen der Files knapp 20 Minuten gebraucht.</p>
<p><strong>Update:</strong> Wer <a href="http://nodomain.cc/2010/07/03/android-2-2-froyo-auf-dem-desire.html">eine Anleitung für Android 2.2 "Froyo" auf dem Desire</a> sucht, wird bei <a href="http://nodomain.cc/2010/07/03/android-2-2-froyo-auf-dem-desire.html">Fabian</a> fündig.</p>
<p><strong>Update 2:</strong>Stephan hat in den Kommentaren noch ein paar Hinweise zur Benutzung von Windows 7 gegeben:</p>
<blockquote><p>
Vorab musste ich die Datei "AdbWinApi.dll", sowie die "AdbWinUsbApi.dll" in den entpackten fastboot-Ordner kopieren - ansonsten kam die Fehlermeldung, dass die AdbWinApi.dll fehle.<br />
Außerdem musste ich - da ich Win7 nutze - die Eingabeaufforderung als Admininstrator ausführen, um den Bootloader erfolgreich zu entsperren und das Downgrade auf ERD79 anzustossen zu können.
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-koelsch.de/191-android-2-2-froyo-auf-dem-vodafone-nexus-one-epf30/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Flattr &#8211; Social Micro Payment</title>
		<link>http://www.simon-koelsch.de/176-flattr-social-micro-payment</link>
		<comments>http://www.simon-koelsch.de/176-flattr-social-micro-payment#comments</comments>
		<pubDate>Fri, 28 May 2010 16:04:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[flattr]]></category>
		<category><![CDATA[socialnetwork]]></category>

		<guid isPermaLink="false">http://www.simon-koelsch.de/?p=176</guid>
		<description><![CDATA[Immer häufiger findet man im Netz inzwischen kleine Bu [...]]]></description>
			<content:encoded><![CDATA[<p>Immer häufiger findet man im Netz inzwischen kleine Buttons mit der Bezeichnung &#8220;Flattr&#8221; oder &#8220;Flattr this!&#8221;. Hier rechts in der Navigationsleiste übrigends auch&#8230;<br />
<a href="http://flattr.com" target="_blank">Flattr</a> ist ein so genannter Micro Payment Dienst mit dem ich Inhalte die ich im Netz finde honorieren kann.</p>
<p>Das System funktioniert dabei so: Zuerst entscheide ich mich, welchen Betrag ich monatlich bezahlen will, um Inhalte die mir gefallen zu unterstützen. Dieser Betrag können 2, 5, 10 oder 20 Euro sein.</p>
<p>Habe ich nun zum Beispiel einen Blogartikel gelesen, der mir gefällt, kann ich diesen Artikel &#8220;flattrn&#8221;. Dazu muss der Autor bei Flattr teilnehmen und einen der Buttons in seinem Blog eingebunden haben. Durch einen Klick auf diesen Button ist der Artikel oder Blog dann &#8220;ge-flattrt&#8221;.<br />
Am Ende des Monats wird der vorher festgelegte Betrag dann durch die Anzahl der &#8220;ge-flattrten&#8221; Inhalte geteilt und an die jeweiligen User ausbezahlt.<br />
<span id="more-176"></span><br />
Hier wird das Prinzip noch einmal anschaulich mit Kuchenstücken erklärt:</p>
<p><object width="520" height="300"><param name="movie" value="http://www.youtube-nocookie.com/v/9zrMlEEWBgY&#038;hl=en_US&#038;fs=1&#038;rel=0&#038;hd=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/9zrMlEEWBgY&#038;hl=en_US&#038;fs=1&#038;rel=0&#038;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="520" height="300"></embed></object></p>
<p>Ich für meinen Teil, werde Flattr jedenfalls eine gewisse Zeit testen.<br />
Seit einer kleinen Ewigkeit lese ich zum Beispiel <a href="http://www.nodomain.cc" target="_blank">nodomain.cc</a>, freue mich über die kurzen Reviews und den ein oder anderen Tip. <a href="http://www.netzpolitik.org" target="_blank">Netzpolitik.org</a> ist ebenfalls aboniert, <a href="http://blog.koehntopp.de/" target="_blank">Isotopp</a>, den <a href="http://chaosradio.ccc.de/chaosradio_express.html" target="_blank">Chaos Radio Express Podcast</a> höre ich auch regelmässig.</p>
<p>Mit Flattr ist das jetzt ein Klick und jeder bekommt was vom Kuchen. Eine hausgemachte Kulturflatrate also, bei der ich selbst einen Einfluss darauf habe, wer meine Unterstützung bekommt.<br />
Die TAZ ist dabei <a href="http://blogs.taz.de/hausblog/2010/05/20/flattr_auf_tazde/" target="_blank">auch schon auf den Zug aufgesprungen</a>.</p>
<p>Eingezahlt werden kann mit Moneybookers oder PayPal was bei mir ohne Probleme funktioniert hat. Der Support scheint aber, falls jemand Probleme haben sollte, auch recht fix zu sein, <a href="http://twitter.com/Scytale/status/14908968920" target="_blank">wie man auf Twitter lesen kann</a>.</p>
<p>Mehr gibt es in der &#8220;<a href="https://flattr.com/support/intro" target="_blank">Introduction</a>&#8221; oder &#8220;<a href="https://flattr.com/about" target="_blank">The Flattr Story</a>&#8221; auf der Homepage des Dienstes.</p>
<p>Flattr ist im Moment noch in der Beta Phase. In Web 2.0 Zeiten heisst das, man braucht einen Invite um daran teilnehmen zu können. Dafür kann man <a href="http://flattr.com/register/beta" target="_blank">auf der Homepage seine E-Mail Adresse hinterlassen</a>.</p>
<p>Ausserdem hätte ich noch 2 Invites über, also einfach kurz ein Kommentar hier lassen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-koelsch.de/176-flattr-social-micro-payment/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Java 7 Features</title>
		<link>http://www.simon-koelsch.de/110-java-7-features</link>
		<comments>http://www.simon-koelsch.de/110-java-7-features#comments</comments>
		<pubDate>Sun, 02 May 2010 14:00:31 +0000</pubDate>
		<dc:creator>Simon Koelsch</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.simon-koelsch.de/?p=110</guid>
		<description><![CDATA[Da Java 7, Codename Dolphin, zum Ende des 2. Quartals m [...]]]></description>
			<content:encoded><![CDATA[<p>Da Java 7, Codename Dolphin, zum Ende des 2. Quartals mit dem letzten Milestone angekündigt ist, habe ich mir ein wenig Zeit genommen um die angekündigten Features vorzustellen. Ein Überblick über die <a href="http://openjdk.java.net/projects/jdk7/milestones/" target="_blank">zehn Milestones</a> selbst ist auf der <a href="http://openjdk.java.net/projects/jdk7/" target="_blank">Projektseite</a> zu finden.<br />
<span id="more-110"></span></p>
<h3>Erweiterungen der Virtuellen Maschine</h3>
<p>Diese Erweiterungen betreffen nur die Virtuelle Maschine <a href="http://java.sun.com/javase/technologies/hotspot/" target="_blank">HotSpot</a> von Sun. Wer eine andere Lauftzeitumgebung nutzt, zum Beispiel die <a href="http://www.sap.com/germany/plattform/netweaver/index.epx" target="_blank">Netweaver Plattform</a> oder die <a href="http://harmony.apache.org/" target="_blank">Apache Harmony Plattform</a>, den betreffen diese Erweiterungen nicht.</p>
<h4>G1</h4>
<p>Offiziell verfügbar wird mit diesem Release eine neue Variante des Garbage Collectors, genannt G1 (&#8220;Garbage First&#8221;). G1 ersetzt damit die bisherige &#8220;Concurrent Mark-Sweep&#8221; (CMS) Methodik von HotSpot.<br />
Oberflächlich erklärt geht CMS so vor, dass der Speicher in verschiedene Bereiche eingeteilt wird. Diese Speicherbereiche enthalten die Objekte je nachdem wie lange ihre Lebensdauer ist. Es existiert ein Bereich für sehr langlebige Objekte, für kurzlebige Objekte, etc. Dabei wird vom Garbage Collector der Speicher durchlaufen und alle nichtmehr referenzierte Objekte werden gelöscht.<br />
Da der Speicher mit der Zeit fragmentiert, muss dieser irgendwann defragmentiert werden, indem die Objekte im Speicher umkopiert werden. Genau hierfuer muss die VM für einen kurzen Moment angehalten werden, was Performance kostet.<br />
Ziel von G1 ist es, genau diese Phasen zu reduzieren. Dabei wird davon ausgegangen, dass je länger ein Objekt &#8220;lebt&#8221;, desto wahrscheinlicher ist, dass es nicht mehr referenziert wird und der Speicher freigegeben werden kann. Je weniger Objekte am Ende existieren, desto kürzer dauert das Kopieren der noch verbleibenden Objekte und desto langsamer fragmentiert der Speicher.<img class="alignright size-medium wp-image-123" title="Java Garbage Collection" src="http://www.simon-koelsch.de/wp-content/uploads/2010/03/gc-300x91.png" alt="G1 vs CMS" width="300" height="91" /><br />
G1 teilt dafür den Speicher in 1MB Bereiche ein und versucht vorauszusagen, wann die Objekte in diesen Bereichen ihre Lebenszeit überschritten haben. Den Objekten wird also genug Zeit zum &#8220;sterben&#8221; gegeben.<br />
Eine ausführliche Erläuterung des Algorithmus findet sich im Paper <a href="http://research.sun.com/jtech/pubs/04-g1-paper-ismm.pdf" target="_blank">&#8220;Garbage First Garbage Collection&#8221; (pdf)</a> von Sun.<br />
&#8220;Garbage First&#8221; ist übrigends schon seit Java 6 Update 14 als Backport enthalten und kann mit folgenden VM Parametern aktiviert werden:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC</pre></div></div>

<h4>InvokeDynamic</h4>
<p>Die HotSpot VM ist seit längerer Zeit ja nicht nur eine Plattform für Java Anwendungen. Die VM interpretiert in erster Linie Bytecode und dieser kann, wie bei Microsofts .NET, von unterschiedlichen Sprachen kommen. In diesem Umfeld wären da <a href="http://www.jruby.org/" target="_blank">JRuby</a>, <a href="http://www.jython.org/" target="_blank">Jython</a>, <a href="http://www.scala-lang.org/" target="_blank">Scala</a> oder <a href="http://groovy.codehaus.org/" target="_blank">Groovy</a> zu nennen. Problem bisher ist allerdings, dass Java eine typisierte Sprache ist, es wird also schon vor dem Übersetzen der Anwendung festgelegt, von welchem Datentyp die benutzten Variablen sind. Sprachen wie beispielsweise Jython sind allerdings nicht typisiert. Hier werden die Datentypen dynamisch verwaltet. Bisher gibt dafür keine Unterstützung im Bytecode auf VM Ebene, was zu lasten der Perfomance geht. Das bei Java 7 enthaltene JSR 292 führt im Bytecode ein &#8220;InvokeDynamic&#8221; ein. Dadurch sollte die Performance von nichttypisierten Sprachen in der VM verbessert werden. Weitere Infos sind im <a href="http://openjdk.java.net/projects/mlvm">&#8220;Da-Vinci Machine&#8221; Projekt</a> zu finden.</p>
<h4>Komprimierte 64-Bit Pointer</h4>
<p>Innerhalb des VM Speichers gibt es OOPs, sogenannte &#8220;Ordinary Object Pointer&#8221;. Diese Pointer zeigen auf beliebige Objekte im Speicher. Dabei ist Objekt nicht im Sinne der objektorientierten Porgrammierung zu verstehen, sondern kann auch ein Element eines Objekts sein (zum Beispiel Instanzvariablen, Objektmetadaten, etc.). Pointer sind auf einem 64-Bit System normalerweise auch 64-Bit gross. Durch das hinzuaddieren einer fixen Speicheradresse kann die größe der Zeiger auch auf einem 64-Bit System auf nur 32-Bit reduziert werden. Dadurch wird der Speicherverbrauch und die Performance verbessert. Wer wissen möchte, wann genau die Pointer komprimiert werden und wie diese Komprimierung genau funktioniert findet <a href="http://wikis.sun.com/display/HotSpotInternals/CompressedOops" target="_blank">im Sun Wiki eine ausführliche Erklärung</a> mit Codebeispielen.</p>
<h3>Modularisierung</h3>
<p>Da das JDK und Java Anwendungen selbst immer größer und komplexer werden, gibt es schon lange Bestrebungen eine Schnittstelle und ein System zur Modularisierung der Komponenten zu schaffen. Um dieses System konsequent umzusetzen sind direkte Änderungen an den VM Spezifikation und der Sprache notwendig.<br />
Mit dem <a href="http://jcp.org/en/jsr/detail?id=294" target="_blank">JSR 294</a> werden diese notwendigen Änderungen in den Standard einfliessen.</p>
<p>Als Referenzimplementierung wird Sun ausserdem das <a href="http://openjdk.java.net/projects/jigsaw/" target="_blank">Jigsaw Projekt</a> bei seinen VMs hinzufügen. Ziel dieses Projekts ist zum einen, ein einfaches &#8220;low-level&#8221; Modulsystem zur Verfügung zu stellen, zum anderen um damit das JDK selbst zu modularisieren.</p>
<p>Wer jetzt an das schon jahrelang von der Industrie vorangetriebene <a href="http://www.osgi.org/Main/HomePage" target="_blank">OSGI</a> denkt, liegt hier richtig. OSGI hat den gleichen Anspruch, setzt allerdings auf Java SE auf und ist nicht auf Sprach/VM-Ebene verankert. Was letztendlich das bessere Framework ist, darüber <a href="http://groups.google.de/groups/search?q=osgi+vs+jigsaw&#038;qt_s=Groups-Suche" target="_blank">streiten</a> sich die Java-Apostel. Auch ob OSGI und Jigsaw überhaupt in einem Widerspruch zueinander stehen. Sun selbst hat bisher in beide Systeme investiert und diese gefördert.</p>
<h3>Sprachänderungen</h3>
<h4>Type Annotations</h4>
<p>Die durch das <a href="http://jcp.org/en/jsr/detail?id=308" target="_blank">JSR 308</a> vorgeschlagenen sogenannten &#8220;Type Annotations&#8221; sind inzwischen schon seit dem M4 Milestone im javac Compiler enthalten. Damit wird es möglich Annotationen nicht nur für Klassen und Methoden festzulegen, sondern für alle Datentypen. Dadurch wird zum Beispiel folgender Code zulässig:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">List<span style="color: #339933;">&lt;</span>@NonNull Object<span style="color: #339933;">&gt;</span> foobar</pre></div></div>

<p>Wer seinen Code trotzdem kompatibel zu älteren Java Version halten will, muss allerdings den javac Kompiler des <a href="http://openjdk.java.net/projects/type-annotations/" target="_blank">&#8220;Type-Annotation&#8221; Projekts</a> benutzen. Der lässt nämlich auch folgenden Code zu:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">  List<span style="color: #339933;">&lt;!--*</span>@NonNull<span style="color: #339933;">*/</span> String<span style="color: #339933;">--&gt;</span> strings<span style="color: #339933;">;</span></pre></div></div>

<p>Der OpenJDK Compiler wird hier die Annotation ignorieren, der des &#8220;Typ Annotation&#8221; Projekts nicht.</p>
<h4>Project Coin</h4>
<p>Mehrere kleine Sprachänderungen sind im <a href="http://openjdk.java.net/projects/coin/" target="_blank">&#8220;Project Coin&#8221;</a> zusammengefasst.<br />
Darunter fällt, dass man nun beim Switch-Statement Strings verwenden kann. Ein weiteres Feature wird automatisches Ressourcen Management sein. Wer beispielsweise mit Streams arbeitet, muss diese bisher explizit über eine entsprechende Methode schliessen. Beim automatischen Ressourcen Management wird der Stream dann in einen Try-Block eingeschlossen und beim verlassen dieses Blocks automatisch frei gegeben:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">InputStream</span> in <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">FileInputStream</span><span style="color: #009900;">&#40;</span>src<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">OutputStream</span> out <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">FileOutputStream</span><span style="color: #009900;">&#40;</span>dest<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> buf <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">8192</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">int</span> n<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>n <span style="color: #339933;">=</span> in.<span style="color: #006633;">read</span><span style="color: #009900;">&#40;</span>buf<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;=</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
        out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span>buf, <span style="color: #cc66cc;">0</span>, n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Einfacher wird auch die Arbeit bei Zeichenfolgen mit Trennzeichen. Möglich wird einen Unterstrich in numerischen Datentypen zu nutzen:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">int</span> phone <span style="color: #339933;">=</span> 040_1234567_123<span style="color: #339933;">;</span></pre></div></div>

<p>Auch die Verwendung von Literalen in Collections verspricht Code weiter lesbarer zu gestalten. Damit kann eine Map im Stil eines Arrays initialisiert werden:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">Map</span> PSE <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> <span style="color: #cc66cc;">1</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;H&quot;</span>,
    <span style="color: #cc66cc;">2</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;HE&quot;</span>, <span style="color: #cc66cc;">3</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;LI&quot;</span>,
    <span style="color: #666666; font-style: italic;">// ...</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Die Initialisierung bezieht sich auf Collections, welche dann auch nicht mehr verändert werden können.<br />
Gegenüber irgendwelchen statischen Codeblöcken die eine Map mit ihrer put-Methode initialisiert ist diese Version sicherlich einfacher.</p>
<p>Eingereicht wurden für das Project Coin über 60 Erweiterungsvorschläge, wovon es 9 ins JDK 7 geschafft haben. Eine <a href="http://wikis.sun.com/display/ProjectCoin/2009ProposalsTOC" target="_blank">vollständige Liste ist im Projektwiki</a> zu finden.<br />
Ich persönlich hätte mir ein vereinfachtes Exception-Handling gewünscht:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// ...</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>fooException<span style="color: #339933;">|</span>barException ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">//...</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><del datetime="2010-05-03T09:16:58+00:00">Dieses Proposal hat es leider nicht ins JDK geschafft. Vielleicht klappts ja mit dem JDK 8.</del><br />
Scheinbar ist man sich da noch nicht so wirklich sicher&#8230; <a href="http://mail.openjdk.java.net/pipermail/coin-dev/2010-February/002703.html" target="_blank">Joe Darcy hat im Februar nochmal auf der Projektmailingliste bestätigt</a>, dass wohl überlegt wird das Feature doch ins JDK 7 zu übernehmen. Bleibt wohl nur abwarten&#8230;</p>
<h4>Project Lambda &#8211; Closures in Java</h4>
<p><a href="http://openjdk.java.net/projects/lambda/" target="_blank">Lamda</a> ist wohl das bisher am meisten diskutierte Java 7 Feature. 2008 wurde angekündigt, Closures wären jetzt doch nicht in der neuen Java Version vorhanden, 2009 wurde diese Ankündigung dann wieder zurückgezogen.</p>
<p>Closures sind im Prinzip das Zusammenspiel von zwei Sprachfeatures. Dabei benutzt man anonyme Funktionen um auf Variablen ausserhalb ihrer lexikalischen Sichtbarkeit zuzugreifen. Diese anonyme Funktionen werden Lamdas genannt. Closures sind eine weit verbreitete Technik und werden in anderen Sprachen wie zum Beispiel Ruby, Perl, Lisp und JavaScript häufig genutzt.</p>
<p>Ein Codebeispiel in JavaScript macht diese Erklärung sicherlich ein wenig verständlicher:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> str <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;bar&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">return</span> str<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> myFoo <span style="color: #339933;">=</span> foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>myFoo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Die Variable str ist an der Stelle, an der sich der Aufruf von alert befindet, nicht im lexikalischen Bereich verfügbar. Trotzdem kann über eine anonyme Funktion darauf zugegriffen werden.</p>
<p>Hilfreich können Closures vor allem an solchen Stellen sein, wo häufig anonyme innere Klassen erzeugt werden, nur um eine einzige Methode zu benutzen. Wer an GUI Entwicklung mit Swing denkt, kann sich bestimmt vorstellen wie hilfreich Closures hier beim Eventhandling sein können.</p>
<p>Closures sind definitv geplant. Die endgültige Syntax steht allerdings noch nicht fest. Da aber der nächste Milestone näher rückt und es bis Herbst nicht mehr lange hin ist, wird man sich wohl in den nächsten Wochen auf eine Syntax festlegen müssen.<br />
Wer am Entwicklungsprozess näher interessiert ist, der sollte einen Blick ins <a href="http://mail.openjdk.java.net/pipermail/lambda-dev/" target="_blank">lambda-dev Mailinglistenarchiv</a> des Projekts werfen.</p>
<h3>Core</h3>
<h4>Fork And Join</h4>
<p>Mit dem <a href="http://gee.cs.oswego.edu/dl/concurrency-interest/index.html" target="_blank">JSR166y</a> wird das Fork and Join Framework von Doug Lea zum Teil des Java Standards. Um mehrere CPUs effizient nutzen zu können, ist es wichtig seine Anwendung entsprechend zu gestalten. Java bietet dazu den Threading-Mechanismus. Das Problem an Threads ist ein gewisser Overhead bei der Verwaltung. Threads müssen erstellet werden, pausiert, sind geblockt weil sie auf andere Threads warten, etc. Dieser Overhead ist unter umständen grösser als die eigentlich zu berechnende Aufgabe.</p>
<p>Bei der Fork/Join Technik geht es darum ein Problem in viele kleine Probleme zu zerlegen, die völlig unabhängig voneinander gelöst werden können. Anschliessend werden die Teilergebnisse zur Lösung zusammengefasst. Klassisches Teile- und Hersche Prinzip.<br />
Gerade hier sind Threads aber als einziger Mechanismus in Java zu unflexibel um viele kleine Teilprobleme zu lösen. Probleme im Ablauf die Mechanismen wie Locking, etc. erforden, tauchen durch die unabhängigkeit der Teilprobleme voneinander garnicht auf.</p>
<p>Mit dem JSR166y wird ein flexiblerer Mechanismus zur Verfügung gestellt. Hier erstellt man für jedes Teilproblem einen sogenannten &#8220;Task&#8221;. Mehrere &#8220;Worker&#8221; arbeiten die so erstellten Tasks über eine Queue ab. Diese Queue unterstüzt sowohl das klassische Push/Pop für LIFO als auch take für FIFO.<br />
Normalerweise wird ein Worker nach dem LFIO Prinzip seine Tasks abarbeiten. Sind alle Tasks berechnet, gibt es sogenanntes &#8220;Work-Stealing&#8221;. Dabei wird ein weiterer Task aus der Queue eines zufällig gewählten anderen Workers abgearbeitet, allerdings nach dem FIFO Prinzip. Da &#8220;ältere&#8221; Tasks wahrscheinlich grössere Probleme enthalten und oftmals wieder in kleinere Tasks zerlegt werden können, wird hierdurch der Verwaltungsaufwand immer wieder neue Tasks zu &#8220;stehlen&#8221; weiter minimiert.<br />
Lea hat mit seinem Framework Benchmarks für verschiedene mathematische Algorithmen durchgeführt und dabei ist durchaus ein deutlicher Unterschied zu anderen üblichen Multithreading-Methoden zu sehen. Eine Einführung in das Framework, Fork and Join Prinzip und die Benchmarks sind in seinem Paper <a href="http://gee.cs.oswego.edu/dl/papers/fj.pdf" target="_blank">&#8220;A Java Fork/Join Framework&#8221; (pdf)</a> zu finden.</p>
<h4>NIO.2</h4>
<p>Java bietet mit seinem I/O Paket eine Reihe von rudimentären Eingabe und Ausgabemechanismen wie Streams, Serialisierung und Zugriff auf das Dateisystem. Beim Release der 1.4er API wurde die Performance dieser Mechanismen verbessert und neue Features hinzugefügt. Diese Erweiterung umfasst beispielswiese Hilfsmittel für Zeichensatz Encoding/Decoding, Sprachsupport für Reguläre Ausdrücke, Channels, etc. Zusammengefasst ist diese <strong>N</strong>eue <strong>I</strong>/<strong>O</strong> API unter <a href="http://java.sun.com/j2se/1.4.2/docs/guide/nio/index.html" target="_blank">Java NIO</a>.</p>
<p>Im JDK 7 wird das JSR 203 umgesetzt: <a href="http://http://jcp.org/en/jsr/detail?id=203" target="_blank">&#8220;More New I-O APIs for the Java Platform&#8221;</a>, kurz NIO.2.<br />
Die Ziele von NIO.2 liegen dabei auf 3 Punkten:<br />
Ein neues verbessertes Interface für das Dateisystem, lösen von Abhängigkeiten der Socket Channel Klassen und Unterstützung für asynchronen I/O Zugriff.</p>
<p>Für diese Änderungen war es eigentlich schon seit langem Zeit. Eine hervoragende Einführung in NIO.2 ist über Google Tech Talks auf YouTube verfügbar. Der Vortrag geht eine knappe Stunde und wird von Alan Bateman (Projektleiter für NIO.2) und Carl Quinn (Google) auf der JavaOne 2008 gehalten: <a href="http://www.youtube.com/watch?v=yNRS1ssLPdQ" target="_blank">The New NIO, aka JSR-203</a> </p>
<p>Ausserdem ist im letzten Jahr ein Artikel welcher das neue Dateisystem Interface beleuchtet im Sun Developer Network erschienen: <a href="http://java.sun.com/developer/technicalArticles/javase/nio/">The Java NIO.2 File System in JDK 7</a></p>
<h4>Classloader Änderungen</h4>
<p>Sicherlich lädt nicht jeder Java Entwickler mit dem <a href="http://download.java.net/jdk7/docs/api/java/net/URLClassLoader.html" target="_blank">URLClassLoader</a> seine Klassen selbst oder schreibt einen eigenen Classloader. Hier sind allerdings mit der Zeit unter anderem zwei Probleme aufgetaucht die in der neuen JDK Version gelöst werden:</p>
<p>In Java ist es nicht möglich zu bestimmen, wann der Garbage Collector nicht mehr referenzierte Ressourcen freigibt. Gerade bei zum Beispiel .jar Files die über den URLClassLoader geöffnet wurden, kann das in Kombination mit dem Windows Dateisystem Locking zu Problemen führen. Es lässt sich nicht sicherstellen, dass der Zugriff auf die geladenen Ressourcen zeitnah beendet wird. Der URLClassLoader implementiert nun aber das <a href="http://download.java.net/jdk7/docs/api/java/io/Closeable.html" target="_blank">Closeable Interface</a>. Hier können durch die Methode close() explizit der URLClassLoader und alle von ihm referenzierten Ressourcen geschlossen werden.</p>
<p>Beim Laden von neuen Klassen muss ein Classloader zuerst prüfen, ob eine Klasse nicht bereits geladen wurde. Wenn nicht, kann er diese innerhalb der VM definieren. Im Hinblick auf Multithreading und mehrere Classloadern innerhalb einer VM können sehr schnell komplexe und schwierig zu debuggende Probleme entstehen. Aus diesem Grund sind die meisten Methoden auf das Classloader Lock &#8220;synchronized&#8221;. Dadurch wird aber unter bestimmten Voraussetzungen ein klassisches Deadlock erzeugt.<br />
Um dieser Problematik entgegenzuwirken wurden einige Änderungen an java.lang.ClassLoader vorgenommen. Unter anderem steht nun eine Methode registerAsParallelCapable() zur Verfügung, um mit einem Classloader explizit seine threadsafe Eigenschaft zu signaliseren.<br />
Alle Änderungen sind im <a href="http://openjdk.java.net/groups/core-libs/ClassLoaderProposal.html" target="_blank">JDK 7 Classloader Proposal</a> sehr transparent und übersichtlich erklärt. Hier wurden ebenfalls die verschiedenen Lösungsvorschläge und Vorgehensweise um das Problem zu beheben ausführlich dargestellt.</p>
<h4>Updates für Solaris</h4>
<p>Im OpenJDK gibt es auch zwei implementierungsabhängige APIs für Solaris: Es wird Support für die mehr oder weniger populären <a href="http://en.wikipedia.org/wiki/SCTP" target="_blank">SCTP</a> und <a href="http://en.wikipedia.org/wiki/Sockets_Direct_Protocol" target="_blank">SDP</a> Protokolle geben.</p>
<h3>Graphik</h3>
<p>Bisher gibt es bei Java verschiedene Möglichkeiten Graphik zu rendern. Das Rendern über Software ist in der Regel deutlich langsamer, als wenn die Graphikhardware des Rechners benutzt wird. Dafür gibt es dann sogenannte Rendering Pipelines. Direct3D ist nur auf Windows Systemen verfügbar, für alle anderen Systeme gibt es OpenGL. Unter Systemen mit X11 ist das X11 eigene XRendering inzwischen allerdings fast Standard und auf einer größeren Bandbreite an Hardware verfügbar. In Java 7 wird es dann für Java2D eine eigene XRender Pipeline geben.</p>
<h3>Sonstiges</h3>
<p>Natürlich wird auch der XML Stack einem Update unterzogen, dass bedeutet die JAXP, JAXB, und JAX-WS APIs werden in der letzten stabilen Version vorliegen.<br />
Das schon seit einer Weile enthaltene Swing Look&amp;Feel <a href="https://nimbus.dev.java.net/spec/index.html">Nimbus</a> wird jetzt auch offizieller Standard.<br />
Swing wird ausserdem um den neuen &#8220;JXLayer&#8221; ergänzt. Dieser Layer bringt &#8220;hübsches&#8221; sperren von Komponenten mit sich (<a href="https://jxlayer.dev.java.net/webstart/LockableDemo.jnlp">Webstart Beispiel</a>), Maus Auto-Scrolling (<a href="https://jxlayer.dev.java.net/webstart/MouseScrollableDemo.jnlp">Webstart Beispiel</a>) und noch <a href="https://jxlayer.dev.java.net/">ein paar Spielerein mehr</a>.<br />
Weiterhin wird Java ab der 7er Version den Unicode Standard 5.1 unterstützen (aktuell ist 5.2) und das <a href="http://en.wikipedia.org/wiki/Elliptic_curve_cryptography" target="_blank">kryptografische Verfahren ECC (Elliptic-Curve-Cryptography)</a> von Haus aus unterstützen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-koelsch.de/110-java-7-features/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google JavaScript Bibliothek Closure Library</title>
		<link>http://www.simon-koelsch.de/91-google-javascript-bibliothek-closure-library</link>
		<comments>http://www.simon-koelsch.de/91-google-javascript-bibliothek-closure-library#comments</comments>
		<pubDate>Mon, 09 Nov 2009 00:41:53 +0000</pubDate>
		<dc:creator>Simon Koelsch</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[closure]]></category>
		<category><![CDATA[closure-library]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.simon-koelsch.de/?p=91</guid>
		<description><![CDATA[Google realisiert in seinen Webanwendungen das Interfac [...]]]></description>
			<content:encoded><![CDATA[<p>Google realisiert in seinen Webanwendungen das Interface durch intensiven Gebrauch von Javascript. Man denke dabei an <a title="Gmail" href="http://mail.google.com">Google Mail</a>, <a title="Maps" href="http://maps.google.com">Google Maps</a> oder<a title="Google Wave" href="http://wave.google.com"> Google Wave</a>. Ein Teil der Werkzeuge die dabei benutzt werden sind jetzt als <a title="Closure Tools bei Google Labs" href="http://code.google.com/closure/">Closure Tools </a>veröffentlicht worden.</p>
<p>Closure Tools besteht aus den folgenden Teilprojekten:</p>
<p>Der <a title="Closure Compiler bei Google Labs" href="http://code.google.com/closure/compiler/">Closure Compiler</a> übersetzt JavaScript Code in eine kompaktere Form. Dadurch werden die Scripte kleiner und damit auch schneller. Es wird toter Code entfernt und nach üblichen Fehler gesucht. Eine Erweiterung für Firebug ist auch verfügbar.</p>
<p>Mit <a title="Closure Templates bei Google Labs" href="http://code.google.com/closure/templates/">Closure Templates</a> gibt es eine einfache Möglichkeit dynamisch HTML zu generieren. Die Templates sind fertig kompiliert als Java und JavaScript.</p>
<p>In diesem Posting geht es um den dritten Teil des Closure Projekts: <a title="Closure Library bei Google Code" href="http://code.google.com/p/closure-library/">Closure Library</a>. Die veröffentlichte Bibliothek enthält eine breite Sammlung von Funktionen und ist kompatibel zu den gängigen Browsern.<br />
Außerdem bringt sie noch ein paar andere nette Konzepte mit.<br />
<span id="more-91"></span></p>
<h3>Abhängigkeiten</h3>
<p>Closure Library besitzt ein simples Abhängigkeits-Konzept. Mit <code>goog.provide()</code> wird ein eigener Namensraum für eine Funktion geschaffen. Mit <code>goog.require()</code> ist es dann möglich auf die vorher definierten Funktionen zuzugreifen.<br />
Dabei sind <code>goog.provide()</code> und <code>goog.require()</code> nicht nur als vereinfachte Include Funktionen zu sehen. Mit der Bibliothek kommt ein Python Script welches eine JavaScript Datei analysiert und mit den benötigten Abhängigkeiten ein grosses Script erstellt.<br />
Dieses Script kann bei Bedarf dann mit dem Closure Compiler weiter optimiert werden.</p>
<h3>Events</h3>
<p>JavaScript sendet bei einer Benutzerinteraktion mit einem DOM-Element ein Event an dieses Element. Zum Beispiel bei einem Klick oder einem Kontakt mit dem Mauszeiger. Auf diese Events lässt sich dann im Programmcode reagieren. Leider sind Events bei jedem Browser ein wenig anderst implementiert. Auf diese Unterschiede müsste man eigentlich bei der Entwicklung achten. Closure umgeht dieses Problem mit einem eigenen Eventmodell. Dieses Modell funktioniert dann mit allen gängigen Browsern gleich.<br />
Es ist auch möglich eigene Eventtypen zu erstellen und zu benutzen.<br />
Die Demo <a title="Closure JavaScript Mausrad Demo" href="http://closure-library.googlecode.com/svn/trunk/closure/goog/demos/mousewheelhandler.html">goog.events.MouseWheelHandler</a> zeigt zum Beispiel eine Reaktion auf Events des Mausrads.</p>
<h3>Vererbung</h3>
<p>Ein rudimentäres Vererbungskonzept wird mit <code>goog.inerhits(child, parent)</code> ermöglicht. Soll eine Klasse von einer anderen abgeleitet werden, muss <code>goog.inerhits(child, parent)</code> eine Refernz auf beide Klassen übergeben werden. Danach sind die vererbeten Funktionen sichtbar. Den Konstruktor der Vaterklasse muss man allerdings noch selbst aufrufen.</p>
<p>Ein Beispielcode aus der <a title="Einfuehrung in Closure" href="http://code.google.com/closure/library/docs/introduction.html">Dokumentation</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">goog.<span style="color: #006633;">ui</span>.<span style="color: #006633;">MenuButton</span> <span style="color: #339933;">=</span> function<span style="color: #009900;">&#40;</span>content, opt_menu, opt_renderer, opt_domHelper<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  goog.<span style="color: #006633;">ui</span>.<span style="color: #003399;">Button</span>.<span style="color: #006633;">call</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, content, opt_renderer <span style="color: #339933;">||</span>
      goog.<span style="color: #006633;">ui</span>.<span style="color: #006633;">MenuButtonRenderer</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, opt_domHelper<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// Menu buttons support the OPENED state.</span>
  <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">setSupportedState</span><span style="color: #009900;">&#40;</span>goog.<span style="color: #006633;">ui</span>.<span style="color: #003399;">Component</span>.<span style="color: #006633;">State</span>.<span style="color: #006633;">OPENED</span>, <span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>opt_menu<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">setMenu</span><span style="color: #009900;">&#40;</span>opt_menu<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">timer_</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> goog.<span style="color: #003399;">Timer</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">500</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">// 0.5 sec</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
goog.<span style="color: #006633;">inherits</span><span style="color: #009900;">&#40;</span>goog.<span style="color: #006633;">ui</span>.<span style="color: #006633;">MenuButton</span>, goog.<span style="color: #006633;">ui</span>.<span style="color: #003399;">Button</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Hier erbt die Komponente MenuButton von Button. Zeile 3 zeigt den Aufruf des Konstruktor der Vaterklasse mit call().</p>
<h3>Funktionen</h3>
<p>Closure besitzt Funktionen für sehr viele Anwendungsfälle. Allein <code>goog.ui</code> enthält 138 verschiedene Komponenten. Dabei sind einfache Elemente wie ein <a title="Benutzerdialog Demo" href="http://closure-library.googlecode.com/svn/trunk/closure/goog/demos/prompt.html#">Benutzerdialog</a> genauso enthalten, wie eine Komponente zur <a title="Spellchecking Demo Closure" href="http://closure-library.googlecode.com/svn/trunk/closure/goog/demos/richtextspellchecker.html">Rechtschreibkorrektur</a>, einer <a title="Baumstruktur Closure" href="http://closure-library.googlecode.com/svn/trunk/closure/goog/demos/tree/demo.html">Baumstruktur </a>oder einem kompletten <a title="Closure Editor Demo" href="http://closure-library.googlecode.com/svn/trunk/closure/goog/demos/editor/editor.html">WYSIWYG-Editor</a>.<br />
Es sind Datumsfunktionen vorhanden, einfache Iteratoren, komplexere Datentypen wie Maps und Sets, i18n-Funktionen zur Lokalisierung und einfache Effekte.</p>
<p>Wer sich selbst mit den Möglichkeiten vertraut machen will, dem Empfehle ich die <a title="Closure API und Demos" href="http://closure-library.googlecode.com/svn/trunk/closure/goog/docs/index.html">API und die darin enthaltenen Demos</a>.</p>
<p>Die komplette Bibliothek ist über Subversion verfügbar:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">svn</span> checkout http:<span style="color: #000000; font-weight: bold;">//</span>closure-library.googlecode.com<span style="color: #000000; font-weight: bold;">/</span>svn<span style="color: #000000; font-weight: bold;">/</span>trunk<span style="color: #000000; font-weight: bold;">/</span> closure-library-read-only</pre></div></div>

<p>Achtung: Es sind hier auch alle Beispiele und Tests enthalten. Aus diesem Grund werden 156 MB heruntergeladen.</p>
<p>Closure Library ist verfügbar unter der <a title="Apache 2.0 Lizenz" href="http://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-koelsch.de/91-google-javascript-bibliothek-closure-library/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FindBugs &#8211; Eclipse Plugin zur Fehlererkennung</title>
		<link>http://www.simon-koelsch.de/79-findbugs-eclipse-plugin-zur-fehlererkennung</link>
		<comments>http://www.simon-koelsch.de/79-findbugs-eclipse-plugin-zur-fehlererkennung#comments</comments>
		<pubDate>Mon, 19 Oct 2009 16:35:44 +0000</pubDate>
		<dc:creator>Simon Koelsch</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://www.simon-koelsch.de/?p=79</guid>
		<description><![CDATA[FindBugs ist ein Eclipse Plugin um häufig gemachte Feh [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Offizielle Projektseite" href="http://mojo.codehaus.org/findbugs-maven-plugin/">FindBugs</a> ist ein Eclipse Plugin um häufig gemachte Fehler in seinem Quellcode zu finden. Entstanden ist dieses Projekt an der University of Maryland und wurde inzwischen nach eigenen Angaben ueber 700.000 mal heruntergeladen.<br />
Um Fehler zu finden wird der Bytecode der kompilierten Java Klassen auf auffälligen Muster untersucht, welche haeufig auf einen Fehler schliessen lassen.<br />
<span id="more-79"></span><br />
Das Plugin bringt dazu selbst im Moment 369 sogenannter &#8220;<em>Bugpattern</em>&#8221; mit. Eingeteilt sind diese Pattern in folgende Kategorien:</p>
<ul>
<li>Bad Practice</li>
<li>Correctness</li>
<li>Experimental</li>
<li>Internationalization</li>
<li>Malicious code vulnerability</li>
<li>Multithreaded correctness</li>
<li>Performance</li>
<li>Security</li>
<li>Dodgy</li>
</ul>
<p>In der Konfiguration ist es dann möglich, die einzelnen Pattern an/abzuwählen, nur schnelle Pattern prüfen zu lassen, das Reporting nach Kategorien zu beschränken oder mit Filtern spezielle Dateien von einer Pruefung auszuschliessen.</p>
<p>Hier ein kurzes Code Beispiel:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">String</span> str <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;foo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">String</span> str2 <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>str <span style="color: #339933;">==</span> str2<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// ...</span></pre></div></div>

<p>FindBugs kritisiert hier den String-Vergleich, welcher wahrscheinlich ueber die Equals-Methode des Strings gemacht werden sollte. Auch ist der explizite Aufruf des Konstruktors der Stringklasse in der ersten Zeile überflüssig.</p>
<p>Ein Beispiel für häufige Nullpointer Exception Fehler:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">User user <span style="color: #339933;">=</span> <span style="color: #003399;">Map</span>.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;id3345&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>user <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
user.<span style="color: #006633;">refresh</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #003399;">String</span> pwd <span style="color: #339933;">=</span> user.<span style="color: #006633;">getPassword</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Hier wird ausserhalb der Bedingung auf ein eventuell nicht vorhandenes Objekt zugegriffen. FindBugs markiert die entsprechende Stelle dann mit einer Warnung.</p>
<p>Implementiert eine Klasse das java.util.Iterator Interface ohne eine NoSuchElementException zu werfen, wird auch diese Klasse als Fehlerhaft makiert. So gibt es eine Unmenge an weiteren Beispielen im <a title="FindBugs Handbuch" href="http://findbugs.sourceforge.net/bugDescriptions.html">Handbuch, welches alle Pattern dokumentiert</a>.</p>
<p>Wem die vorhanden Pattern nicht reichen, der kann relativ einfach selbst eigene Pattern erstellen und mit FindBugs benutzen. So lassen sich zum Beispiel auch Fehler in der falschen Benutzung von eigenen Frameworks finden. Chris Grindstaff von IBM hat ein kleines Tutorial dazu geschrieben: <a title="Custom Bug Detector" href="http://www.ibm.com/developerworks/java/library/j-findbug2/">Writing custom bug detectors</a>.<br />
<a title="FindBugs Contributions" href="http://fb-contrib.sourceforge.net/">fb-contrib</a> ist eine offene Sammlung eigener Pattern.</p>
<p>FindBugs muss übrigends nicht zwingend als Eclipse Plugin benutzt werden. Es gibt eine eigene <a title="FindBugs GUI im Handbuch" href="http://findbugs.sourceforge.net/manual/gui.html">GUI</a> dafür und wer will kann es sogar als <a title="FindBugs Handbuch - Ant-Task" href="http://findbugs.sourceforge.net/manual/anttask.html">Ant-Task</a> in seinem Deploymentprozess nutzen. Auch für <a title="Maven Plugin" href="http://maven-plugins.sourceforge.net/maven-findbugs-plugin/index.html">Maven</a> und <a title="Maven 2.x Plugin" href="http://mojo.codehaus.org/findbugs-maven-plugin/">Maven 2.0</a> gibt es inzwischen ein entsprechendes Plugin.<br />
Hier ist der <a title="FindBug Download" href="http://http://findbugs.sourceforge.net/downloads.htmlhttp://findbugs.sourceforge.net/downloads.html">Download</a> zu finden.<br />
Plugin only: <em>http://findbugs.cs.umd.edu/eclipse</em> ist die offizielle Update Seite fuer den Eclipse Plugin Manager.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-koelsch.de/79-findbugs-eclipse-plugin-zur-fehlererkennung/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Wave geht in erste grosse Beta Phase</title>
		<link>http://www.simon-koelsch.de/69-google-wave-geht-in-erste-grosse-beta-phase</link>
		<comments>http://www.simon-koelsch.de/69-google-wave-geht-in-erste-grosse-beta-phase#comments</comments>
		<pubDate>Thu, 01 Oct 2009 18:08:32 +0000</pubDate>
		<dc:creator>Simon Koelsch</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[wave]]></category>
		<category><![CDATA[xmpp/jabber]]></category>

		<guid isPermaLink="false">http://www.simon-koelsch.de/?p=69</guid>
		<description><![CDATA[Kurzer Kommentar zur Google Wave Beta Phase, kleine Zus [...]]]></description>
			<content:encoded><![CDATA[<p>Seit es die Google Wave Developers Sandbox zum reinschnuppern ins Protokoll, die vielen bunten Gadgets, die API, etc. hat sich wieder einiges getan.</p>
<p>Rund 27.000 Entwickler haben sich dafür erfolgreich registriert, mit der API gespielt und kleine Prototypen in Form von Gadgets und Robots geschrieben.<span id="more-69"></span>Die<a title="Java robot Client Library" href="http://code.google.com/p/wave-robot-java-client/"> Java Robot Client Library</a> wurde nun ganz offiziell als Open Source verabschiedet und ist bei Google Code zum download verfügbar.</p>
<p><a title="Google Featured Wave Extensions" href="http://wave.google.com/help/wave/extensions.html">Es wurden von verschiedenen Firmen Extensions entwickelt die jetzt von Google selbst unterstützt werden</a>. Dazu zählen einfache Spiele wie Sudoku genauso, wie Video Chat Anwendungen und eine Wetter Erweiterung.</p>
<p>Eine Vorschau gibt es für Erweiterungen von SAP, salesForce.com (Stichwort Cloud Computing) und MediaWiki (dafür scheint Google Wave ja wie gemacht zu sein).</p>
<p>Ausserdem findet man bei den Extensions jetzt auch die<a title="Wave Extensions Design Principles" href="http://code.google.com/apis/wave/extensions/designprinciples.html"> &#8220;Wave Extension Design Principles&#8221;</a>.</p>
<p>Wer bisher keine Lust oder Zeit hatte, sich das 80 Minuten Video zur Google Wave Präsentation auf der Google I/O anzusehen, hat nun die Möglichkeit in 8 Minuten eine Übersicht zu bekommen. Stephanie und Greg vom Entwicklerteam haben die Features nochmal schnell zusammengefasst:</p>
<p><object width="480" height="295" data="http://www.youtube.com/v/p6pgxLaDdQw&amp;hl=en&amp;fs=1&amp;rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999&amp;hd=1" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/p6pgxLaDdQw&amp;hl=en&amp;fs=1&amp;rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999&amp;hd=1" /><param name="allowfullscreen" value="true" /></object></p>
<p>Ob das etwas mit den 100.000 verschickten Einladungen zu tun hat? <img src='http://www.simon-koelsch.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Aus <img title="Google Wave Developer Sandbox Logo" src="https://wave.google.com/a/wavesandbox.com/static/images/logo_dev_preview.png" alt="Google Wave Developer Sandbox Logo" width="176" height="39" /> wird jedenfalls <img title="Google Wave Beta Logo" src="https://wave.google.com/wave/static/images/logo_preview.png" alt="Google Wave Beta Logo" width="136" height="39" />.</p>
<p>Laut dem <a title="Ankündigung Google Wave Beta Einladungen" href="http://googlewavedev.blogspot.com/">offiziellen Blogposting von Stephanie</a> sind die Einladungen naemlich schon raus.</p>
<blockquote><p>To all sandbox developers, thank you for your patience, feedback, creativity and riding the sometimes bumpy waves with us. You will get accounts on <a href="http://wave.google.com/wave">wave.google.com</a> tomorrow &#8211; check your sandbox account for instructions on how to login. You&#8217;ll also get invitations to bring on people you want to wave with or have try your extensions. Google Wave is more fun with friends or colleagues to collaborate with so use your invitations wisely!</p></blockquote>
<p>Tatsächlich habe ich in meinem Developer Sandbox Account eine Einladung zur Betaphase auf <a title="Google Wave" href="http://wave.google.com">wave.google.com</a> gefunden.</p>
<p>In meinem Firefox 3.5 laeuft das Frontend inzwischen deutlich stabiler als in der Sandbox. Auche meine ich einen positiven Geschwindigkeitsunterschied feststellen zu koennen. Mehr kommt dann in den nächsten Tagen.</p>
<p>Aber testet doch am besten selbst, <del datetime="2009-10-11T17:49:51+00:00">ich habe noch 4 Einladungen übrig</del> <img src='http://www.simon-koelsch.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Hinterlasst dazu einfach einen kurzen Kommentar &#8211; First come, first served!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-koelsch.de/69-google-wave-geht-in-erste-grosse-beta-phase/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Do You Poken?</title>
		<link>http://www.simon-koelsch.de/50-do-you-poken</link>
		<comments>http://www.simon-koelsch.de/50-do-you-poken#comments</comments>
		<pubDate>Sun, 19 Jul 2009 14:48:56 +0000</pubDate>
		<dc:creator>Simon Koelsch</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[poken]]></category>
		<category><![CDATA[socialnetwork]]></category>

		<guid isPermaLink="false">http://www.simon-koelsch.de/?p=50</guid>
		<description><![CDATA[Immer oefters liest man im Netz den Begriff "Poken".
M [...]]]></description>
			<content:encoded><![CDATA[<p>Immer oefters liest man im Netz den Begriff &#8220;Poken&#8221;.<br />
Mit diesem Blogpost will ich erklaeren, wozu Poken eigentlich da sind, welche Funktionen damit verfuegbar werden, wie der technische Hintergrund aussieht und was sich damit vielleicht in Zukunft anstellen laesst.<br />
<span id="more-50"></span><br />
Ein Poken besteht aus einem USB-Stick der in einer Hand mit LED in der inneren Handflaeche endet. Die Huelle des Sticks ist mit einer Figur im Comicstil (Panda, Alien, Elvis, Tiger, etc.) bedruckt.</p>
<div class="wp-caption alignright" style="width: 114px"><img title="Panda Poken" src="http://www.doyoupoken.com/PokenWeb/images/register_poken_gorilla.png" alt="Panda Poken (Quelle: doyoupoken.com)" width="104" height="88" /><p class="wp-caption-text">Panda Poken (Quelle: doyoupoken.com)</p></div>
<p>Es dient dazu, seine Kontaktdaten mit anderen Pokenbesitzern auszutauschen. Um diesen Austausch vorzunehmen muessen nur die Handflaechen beider Poken fuer 2-3 Sekunden aneinander gehalten werden. Nun werden ueber RF die Poken IDs ausgetauscht. Wenn alles funktioniert hat, leuchtet eine in die Handflaeche des Pokens integrierte LED kurz gruen auf. Leuchtet die LED rot auf, gab es einen Fehler und der Vorgang muss wiederholt werden.</p>
<p>Das eigene Profil in Form einer kleinen Visitenkarte pflegt man beim Hersteller <a title="DoYouPoken.com" href="http://www.doyoupoken.com">doyoupoken.com</a> direkt. Dort lassen sich auch die freigegebenen Daten der zuletzt getauschten Kontakte einsehen, <em>nachdem</em> man eine kleine HTML Datei auf seinem Pokenstick geoeffnet hat.</p>
<h3>Features</h3>
<p>Was auf der Pokenvisitenkarte angezeigt wird kann man selbst frei waehlen. Es stehen die VCard ueblichen Felder zur Auswahl, ausserdem lassen sich die meisten bekannten sozialen Netze hinzufuegen, ein Benutzerbild und ein eigener Hintergrund der Visitenkarte.</p>
<div id="attachment_61" class="wp-caption alignright" style="width: 260px"><img class="size-full wp-image-61" title="Poken Visitenkarte" src="http://www.simon-koelsch.de/wp-content/uploads/2009/07/card.png" alt="Poken Visitenkarte" width="250" height="166" /><p class="wp-caption-text">Poken Visitenkarte</p></div>
<p>Hier koennen auch mehrere Identitaeten angelegt werden, zum Beispiel laesst sich so eine Identitiaet fuer Geschaeftspartner und eine fuer Freunde anlegen. Welche von diesen Identitaeten nun an andere Poken uebertragen wird, laesst sich durch mehrmaliges druecken der Handflaeche des Pokens bevor man diese aneinander haelt auswaehlen.</p>
<p>Auch kann man dabei in eine Art &#8220;Ghost&#8221;-Modus schalten. Hier wird nur eine blanke Visitenkarte getauscht, erst wenn der Kontakt online bestaetigt wurde, ist die eigentliche Visitenkarte sichtbar.<br />
Ueber doyoupoken.com koennen ausserdem die Kontaktkarten auch direkt im<a title="VCard Erklaerung im Wikipedia" href="http://de.wikipedia.org/wiki/VCard"> VCard-Format </a>heruntergeladen werden.</p>
<h3>Technik</h3>
<p>Technisch gesehen basieren Poken eigentlich nicht auf einem komplizierten Prinzip. Jedes Poken besitzt eine eindeutige ID. Diese wird beim aneinanderhalten zweier Poken getauscht. Auf dem Poken befindet sich eine Start_Poken Html-Datei welche die Domain http://p.poken.ch aufruft.</p>
<p>In der URI ist ausserdem noch die eigene Poken ID enthalten, ausserdem die IDs der anderen Poken mit denen eine Kontakt stattgefunden hat. Die Begrenzung das maximal 64 Kontakte gespeichert werden koennen, bevor ein Abgleich mit der Homepage stattfinden muss liegt uebrigends nicht am Speicherplatz des Pokens (scheinbar ~ 1 Gig read-only), sondern an der Begrenzung von URIs auf eine feste Laenge.</p>
<p>Nach einem Login auf der Pokenseite werden dann einfach die so hinzugefuegten Kontakte gespeichert.</p>
<h3>Kritik</h3>
<p>Etwas enttaeuscht bin ich von der Verarbeitung des Pokens. Etwas Metall haette sich bei der Verarbeitung des USB-Steckers sicher besser gemacht. Beim einstecken in den USB-Port habe ich irgendwie immer Angst ich koennte in den naechsten 5 Minuten unguenstig an den Kanten meines Laptops haengen bleiben und das Poken abbrechen. Auch graut mir ein wenig vor dem ersten Batteriewechsel. Hierzu muss das Gehaeuse an der Unterseite mit einem Schraubenzieher aufgehebelt werden.<br />
Hier waere eine selbstladende Batterie sicherlich um einiges praktsicher gewesen.</p>
<p>Die Idee des Pokens stammt uebrigends auch nicht direkt von der Firma Poken S.A. und ihrem Gruender <a title="Stephane Doutriaux CEO von Poken S.A." href="http://www.xing.com/profile/stephane_doutriaux"><span class="new">Stéphane Doutriaux</span></a> sondern wurde schon 2007 als Abschlussarbeit von einem kleinen niederlaendischen <a title="Niderlaendisches Startup E" href="http://www.mynameise.com/about">StartUp mit dem Namen E </a>vorgestellt. Ueberhaupt gefaellt mir das Poken, genannt<a title="Connector von E" href="http://www.mynameise.com/connector"> Connector</a> dann doch eigentlich wesentlich besser. Leider befinden wir uns dort dann aber doch in einem wesentlich anderem Preissegment. Ausserdem scheint hier der Focus bei &#8220;Businessusern&#8221; zu liegen.</p>
<p>Ein weiterer Kritikpunkt ist fuer mich, dass ich meine Zugangsdaten zu den sozialen Netzen die ich verlinken will angeben muss. Laut doyoupoken.com ist das noetig, um zu verifizieren, dass ich auch wirklich hinter diesem Profil stecke. In meinen Augen voellig ueberfluessig, da ich die Person zuvor im echten Leben getroffen habe. Auch werde ich nach einer Kontaktaufname ueber das soziale Netz wahrscheinlich ziemlich schnell feststellen, ob der Account nun zur betreffenden Person gehoert oder nicht. Da gibt es in Sachen Sicherheit durchaus andere Baustellen.</p>
<h3>Sicherheit</h3>
<p>Vorab: Das Problem was sonst bei RFID haeufig kritisiert wird, naemlich das unbemerkte Auslesen von Informationen ist bei Poken eigentlich nicht moeglich. Benoetigt wird zum Auslesen ein direkter Kontakt von Empfaenger und Sender.</p>
<p>Traurig ist allerdings, dass eine Firma die 2009 nach eigenen Angaben 60.000 Produkte herstellt es nicht schafft, <a title="Support Antwort von DoYouPoken zum Thema SSL" href="http://getsatisfaction.com/poken/topics/poken_website_lacks_security">die Verbindung zu ihrem Dienst ueber SSL herzustellen</a>. Die Homepage unterstuetzt zwar den Zugang ueber https, allerdings muss ich die Adresse selbst direkt eingeben. Eine Weiterleitung nach einem Klick auf Login besteht nicht. Rufe ich die Datei Start_Poken.html auf um meine Kontaktdaten zu uebertragen oder mein Poken zum erstenmal zu initialisieren, wird die Verbindung ebenfalls ueber http und nicht ueber https hergestellt. In Zeiten von offenen WLANs in Cafes, Konferenznetzen und Proxys eigentlich schon grob fahrlaessig. Erst recht wenn man noch unvorsichtigerweise das Auto-Login Feature aktiviert hat.<br />
Laut doyoupoken.com wurde da bereits nachgebessert, aber ein tatsaechliches Ergebnis laesst sich nicht erkennen.</p>
<p>Auch hat sich der belgische Sicherheitsexperte <a title="Profil von Didier Stevens" href="http://blog.didierstevens.com/professional/">Didier Stevens</a> das Poken naeher angesehen und festgestellt, dass neben der Poken ID im Klartext (Base64 ist keine Verschluesslung&#8230;) <a title="Poken Peek von Didier Stevens" href="http://blog.didierstevens.com/2009/03/26/poken-peek/">eine Verschluesslung mit maximal 64 Bit eingesetzt wird</a>. &#8220;State-of-the-art&#8221; ist etwas anderes. Sollte diese Verschluesslung tatsaechlich geknackt werden, waere es wahrscheinlich moeglich beliebige Kontaktdaten die hinter Poken IDs stecken einzusehen. Natuerlich wird niemand mal eben 64 Bit brechen. Aber trotzdem, die Frage was da aber bei einer ernsthaften Traffic-Analyse waehrend des Pokens herauskommt, ist sicherlich berechtigt.</p>
<h3>Ausblick</h3>
<p>Kuerzlich wurde <a title="Poken Hub Vorstellung von Dave Brown" href="http://doyoupoken.ning.com/video/dave-brown-demonstrates">von Dave Brown der Poken Hub vorgestellt</a>. Wer jetzt direkt an ein Stueck Hardware denkt hat eine falsche Vorstellung <img src='http://www.simon-koelsch.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Der Poken Hub ist eine Software die ein Poken als Empfaenger benoetigt. Meldet sich jetzt jemand an diesem Poken an, wird die Software getriggert und kann verschiedene Aktionen ausloesen. Ein Beispiel waere zu twittern, dass Person xy jetzt eingetroffen ist. Der Hub ist ueber Plugins erweiterbar. So koennen Pokens also auch als Token benutzt werden. Wann es den Hub tatsaechlich zu kaufen gibt, ist noch unklar.</p>
<p>Auch wurde<a title="Poken API" href="http://mypoken.org/index.php/poken-api"> inzwischen angekuendigt doyoupoken.com um eine offene API zu erweitern</a>. Damit liese sich wahrscheinlich der Poken Hub mit einer handvoll Zeilen Perl problemlos genauso erweiterbar nachbauen. Wie diese API aussehen soll, wann sie kommt und welche Features unterstuetzt werden ist noch nicht bekannt, allerdings gibt es<a title="Poken API Philosophie" href="http://blog.doyoupoken.com/2009/04/13/poken-api-philosophy/"> ein Posting zur Philosophie</a> dahinter.</p>
<p>Da die Abfrage der Zugangsdaten beim hinzufuegen von sozialen Netzen in der Kritik stand, wird hier inzwischen auch daran gearbeitet <a title="DoYouPoken Support Antwort" href="http://getsatisfaction.com/poken/topics/why_to_disclose_username_passwords">einen anderen Authentifizierungsmechanismus einzubinden</a>. Ich nehme an, hier wird einfach die API des anderen Netzes benutzt, falls dieses verfuegbar ist.</p>
<p>Bleibt abzuwarten was die API hergibt.<br />
Mein Poken sieht uebrigends so aus:</p>
<div class="wp-caption alignnone" style="width: 510px"><a href="http://www.ipernity.com/doc/echox/4993595"><img title="Mein Ninja Poken" src="http://u1.ipernity.com/11/35/95/4993595.9a6998db.500.jpg" alt="Mein Ninja Poken" width="500" height="375" /></a><p class="wp-caption-text">Mein Ninja Poken</p></div>
<p>Weitere Informationen:</p>
<p><a title="Poken Hersteller" href="http://www.doyoupoken.com">Hersteller DoYouPoken.com</a></p>
<p><a title="Blog vom Hersteller" href="http://blog.doyoupoken.com/">Hersteller Blog</a></p>
<p><a title="Infos zu Poken und API" href="http://www.mypoken.org">MyPoken.org</a></p>
<p><a title="Business Poken" href="http://www.cyber-junk.de/entwickelt/business-poken-ein-erfahrungsbericht-slideshow/">Erfahrungen mit Pokens im &#8220;Business&#8221; <img src='http://www.simon-koelsch.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </a></p>
<p><a title="Pokeninfos und Shop" href="http://www.pokenonline.de/">Pokenonline Infoseite + Shop</a></p>
<p><a title="Mission Poken Shop und Blog" href="http://missionpoken.de/">Pokenshop Missionpoken.de</a></p>
<p><a title="Poken-Shop.de" href="http://www.poken-shop.de/">Ein anderer Pokenshop</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-koelsch.de/50-do-you-poken/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>putpat.tv &#8211; Musikfernsehen 2.0</title>
		<link>http://www.simon-koelsch.de/44-putpattv-musikfernsehen-20</link>
		<comments>http://www.simon-koelsch.de/44-putpattv-musikfernsehen-20#comments</comments>
		<pubDate>Mon, 15 Jun 2009 17:49:15 +0000</pubDate>
		<dc:creator>Simon Koelsch</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[musik]]></category>
		<category><![CDATA[streaming]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.simon-koelsch.de/?p=44</guid>
		<description><![CDATA[Ueber "Putpat - Musikfernsehen im Internet" im Blog vom [...]]]></description>
			<content:encoded><![CDATA[<p>Ueber <a href="http://t3n.yeebase.com/startups-kurz-vorgestellt-putpat-musikfernsehen-246542/">&#8220;Putpat &#8211; Musikfernsehen im Internet&#8221;</a> im Blog vom <a href="http://t3n.yeebase.com/">t3n Magazin</a> bin ich auf <a href="http://www.putpat.tv">putpat.tv</a> aufmerksam geworden.</p>
<p>Laut <a href="http://www.putpat.tv/about">eigener Aussage</a> ist putpat das &#8220;neue Musikfernsehen&#8221;.<br />
Das ist gut, Musikfernsehen vermisse ich naemlich schon seit geraumer Zeit.<br />
Bei den grossen Sendern laufen ja seit einigen Jahren ja leider kaum mehr tatsaechliche Musikformate und meistens kommt auch nicht unbedingt Musik die mir gefaellt.</p>
<p><span id="more-44"></span></p>
<p>Vom Radio habe ich mich musikalisch auch schon lange verabschiedet. Im <a href="http://www.last.fm">Streaming Dienst last.fm</a> habe ich aber dafuer einen hervorragenden Ersatz gefunden. Bei last.fm hat man die Moeglichkeit, die von sich gehoerten Lieder, automatisch speichern zu lassen. Daraus wird dann fuer den Benutzer eine Statistik erstellt. Mit dieser Statistik kann man sich dann seinen persoenlichen Radiostream generieren lassen. Dieser Stream setzt sich dann aus Kuenstlern des eigenen Musikstils zusammen. So lernt man ganz von selbst relativ viele neue Musiker kennen.<br />
Am Anfang war ich neugierig ob dieses System funktioniert, aber nach dem ersten Test schon voellig begeistert.</p>
<p>Fuer Musikvideos uebernimmt diese Aufgabe putpat.tv.<br />
Man gibt bei der Registrierung einfach seine Lieblingsbands oder den last.fm Benutzernamen an, und daraus wird ein peronalisierter Videostream erzeugt. Wem hier die Abwechslung fehlt, der hat noch zusaetzlich die Moeglichkeit zwischen verschiedenen Programmformaten (Jazz, Rock, &#8230;, Intro, Festivalguide) zu waehlen.<br />
putpat.tv speichert dann auch hier wieder, welche Videos man mag und welche man nicht sehen will.</p>
<p>Bisher ist meine Erfahrung damit nur positiv. Die Daten aus <a href="http://www.last.fm/user/echox">meinem Last.fm Profil</a> wurden Problemlos uebernommen und inzwischen liefen bei mir schon einige Stunden Video ueber das Netz. Die Qualitaet der Videos ist kein HD, allerdings trotzdem wirklich sehr gut. Wer eine schmale Internetanbindung hat kann die Qualitaet auch problemlos in seinen Einstellungen veraendern.</p>
<p>Die Auswahl der Musik entspricht zwar meinem Geschmack, koennte allerdings noch abwechslungsreicher sein. Man kann aber wohl davon ausgehen, dass sich das mit der Zeit noch aendern wird. Schliesslich muessen die Videos erstmal putpat zur Verfuegung stehen.</p>
<p>Der Dienst befindet sich im Moment noch in der Beta Phase. Eine Registrierung ist noch nicht Selbststaendig moeglich. In Regelmaessigen Abstaenden gibt es allerdings wohl die Moeglichkeit Freunde einzuladen. Zudem kann man <a href="http://www.putpat.tv/apply">sich selbst um einen Zugang bewerben</a>, was wohl nicht lange dauert.</p>
<p>Ich fuer meinen Teil bin zufrieden und warte ab, wie sich der Dienst in Zukunft finanziert. Nach eigenen Angaben laeuft das ueber Reklame:<br />
&#8220;Das bringt zwar mit sich, dass man ab und zu mit ein paar verkaufsfördernden Elementen konfrontiert wird. Aber da muss man durch.&#8221;<br />
Bisher habe ich ausser auf dem Festivalguide-Kanal davon aber noch nichts bemerkt. Nimmt hoffentlich in Zukunft nicht ueberhand.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-koelsch.de/44-putpattv-musikfernsehen-20/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Wave &#8211; Ein erster Eindruck</title>
		<link>http://www.simon-koelsch.de/17-google-wave-erste-eindruecke</link>
		<comments>http://www.simon-koelsch.de/17-google-wave-erste-eindruecke#comments</comments>
		<pubDate>Thu, 04 Jun 2009 17:49:33 +0000</pubDate>
		<dc:creator>Simon Koelsch</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[wave]]></category>
		<category><![CDATA[xmpp/jabber]]></category>

		<guid isPermaLink="false">http://www.simon-koelsch.de/?p=17</guid>
		<description><![CDATA[Am 28.5. wurde Google Wave das erstemal auf der Develop [...]]]></description>
			<content:encoded><![CDATA[<p>Am 28.5. wurde Google Wave das erstemal auf der Developers Konferenz Google IO in San Francisco vorgestellt.<br />
Die Praesentation[1] dauerte 1.20h und ist ein schoener erster Einstieg in die Ideen, welche hinter diesem Projekt stecken.</p>
<p>Hier zeigt Lars Rasmussen mit seinem Team schoen ueber mehrere Rechner verteilt wie einfach es ist, mit den Google eigenen Wave Applikationen zu Chatten, Teilnehmer zum Chat hinzuzufuegen, private Gespraeche zu fuehren, die History zurueckzuspielen und Dokumente zu tauschen. Bildergalerien werden einfach per &#8220;<em>Drag and Drop</em>&#8221; in die Anwendung gezogen worauf hin fast sofort eine Vorschau mit Thumbnails entsteht, obwohl die Bilder noch nicht komplett hochgeladen wurden.</p>
<p>Besitze ich nun einen Blog, kann ich diese Bildergalerie direkt aus Google Wave heraus einbinden. Aenderungen, zum Beispiel an einem Bildtitel, werden sofort sichtbar.<br />
Das bedeutet Tastenanschlag fuer Tastenaschlag wird unmittelbar uebertragen. Ich kann meinem Kommunikationspartner also beim Tippen zusehen.</p>
<p>Die in der Einfuehrung gezeigte Webapplikation ist uebrigends mit dem Web Toolkit und HTML 5 gebaut[2].</p>
<p>Doch was ist denn Google Wave eigentlich ohne die bunten Webapplikationen betrachtet?</p>
<h3><span id="more-17"></span>Protokolluebersicht</h3>
<p>Google Wave ist vor allem erstmal ein erweitertes XMPP Protokoll. Damit erben wir sozusagen saemtliche Bestandteile von Jabber, das heisst die XML Basis, Adressierung, TLS, Buddylist-Konzept, etc.</p>
<p>Jetzt gibt es in Google Wave sogenannte Wavelets. Ein Wavelet besteht aus einer eindeutigen ID, einer Liste mit Berechtigungen und einem Satz von XML Dokumenten. Dieses Wavelet liegt dann beim Waveprovider des Erstellers. Moechte man nun dieses Dokument mit anderen Benutzern teilen, fuegt man die Benutzer der Berechtigungsliste hinzu. Die anderen Benutzer koennen dabei zum Beispiel nur Leserechte haben oder ebenfalls auch Schreibrechte.</p>
<p>Am Anfang wird dann der Wave Provider des Benutzers eine Kopie der fuer ihn zugaenglichen XML Dokumente erhalten. Aenderungen an den Dokumenten des Wavelets werden von da an in Echtzeit durch das Google Wave Protokoll an alle anderen Benutzer uebertragen. Durch jede Eingabe, jeden Tastenanschlag, entsteht also eine eigene &#8220;Wave&#8221;mit den Aenderungen zur vorherigen Dokumentenversion. Durch dieses System entstehen verschiedene Versionen der Ursprungsdokumente. Diese Versionen koennen jederzeit problemlos angefordert werden,  so entsteht ganz automatisch eine beliebig flexible History. Es ist also nicht nur moeglich einen Schritt zurueck zu gehen, sondern man kann ganz gezielt den Urzustand einer bestimmten Stelle des Dokuments herstellen.</p>
<p>Google Wave  ist also erstmal nur ein Protokoll, um Aenderungen an Dokumenten in Echtzeit zu publizieren.</p>
<h3>Anforderungen und Probleme</h3>
<p>Um diese Technik nutzen zu koennen benoetige ich also einen Wave Provider und meine Anwendung, welche die erstellten XML Dokumente in einer brauchbaren Form rendert.</p>
<p>Wave Provider wird es ueber kurz oder lang wohl recht viele geben. Da das Protokoll &#8220;Open Source&#8221; und recht ueberschaubar ist, wird es wahrscheinlich kein Problem sein, einen eigenen Server zu schreiben. Zur Google eigenen Serversoftware wurde im Vortrag leider nichts gesagt, auch nicht ueber die Systemanforderungen. Anforderungen sind fuer mich jetzt schlecht abzuschaetzen, aber ich denke hier wird es hohe Ansprueche an die Infrastruktur geben. Ich bin selbst kein grosser Freund von XMPP/Jabber, aber die grossen Jabber Server haben immer wieder Probleme durch erhebliche Netzlast die zum Beispiel durch Onlinestatus-Updates der Benutzer generiert werden. Jeder kann sich selbst ausrechnen was fuer Traffic generiert wird, wenn wirklich viele Benutzer, zum Beispiel waehrend einer Konferenz, ein Dokument in Echtzeit bearbeiten. Auf die technischen Probleme von XMPP/Jabber wird im Wiki zu PSYC entsrpechend eingegangen[3].</p>
<p>Ein weiteres Problem sehe ich in der Strukturierung des XMLs. Google zeigt zwar waehrend der Demo schoen, wie einfach es ist gemeinsam Dokumente zu bearbeiten und das jeder sich im Prinzip seinen eigenen Wave Server aufsetzen kann, trotzdem muesste dann auch das Dokumentnformat irgendwo spezifizieren da sich die darin enthaltenen Informationen sonst nicht rendern lassen. An eine offene Spezifikation aus der Community will ich irgendwie noch nicht so recht glauben.</p>
<p>Ob Google Wave also wirklich die Technik fuer eine neue Kommunikationsform wird, haengt vor allem davon ab, ob man sich gemeinsam auf ein entsprechendes Format zur Uebertragung dieser Kommunikation einigen kann. Bei Google Groups zum Thema Wave Protokoll wurde diese Problematik wohl kurz angesprochen[4], inzwischen scheint die Diskussion aber eingeschlafen zu sein.</p>
<p>In der Google Wave Robots API gibt es zwar ein Interface &#8220;Blip&#8221;[5], welches einen Knoten in einer Kommunikation repraesentiert, genauere Spezifikationen habe ich aber dazu leider noch nicht finden koennen.</p>
<h3>Ausblick</h3>
<p>Sicher das Wave Protokoll ist eine nette Sache. Ob es aber tatsaechlich die Kommunikation im Netz so massgeblich beeinflussen wird, wie ueberall prophezeit bleibt abzuwarten.</p>
<p>Sicher kann man sich aber sein, dass dieses Protokoll auf jedenfall kommen wird. Google hat die ersten Teile der Spezifikationen oeffentlich zugaenglich gemacht und ein kleines API Kit in Java und Python fuer Robots und aehnliche Anwendungsfaelle zur Verfuegung gestellt. Die Teilnehmer der Google IO Konferenz haben alle einen Sandbox Zugang erhalten und koennen vorab die Google Anwendungen und das Protokoll testen.</p>
<p>Mit der Zeit wird man sicher immer mehr Robots als Service zur Verfuegung haben. Anwendungsfaelle wie zum Beispiel eine schicke kontextabhaengige Rechtschreibkontrolle, automatisiertes Bloggen, etc. wurden ja im Vortrag schon demonstriert. Das die Google App Engine Python und Java unterstuetzt ist sicherlich auch kein Zufall und so findet man fuer kleinere Robots hier sogar in Google einen kostenlosen Hoster.</p>
<p>Ich bin gespannt was beim Sandboxtest rauskommt und wie gut das Protokoll tatsaechlich in einer echten Umgebung skaliert. Die Performance Problematik habe ich ja oben kurz angesprochen&#8230;</p>
<p>Ausserdem interessiert mich wie Google den Open Source Prozess umsetzt. Traditionell bestehen die Committer und Maintainer (also die Leute welche Aenderungen am Protokoll auch wirklich einspielen koennen) ja aus der Community welche entweder durch eine spezielle Gruppe ausgewaehlt werden oder eben direkt gewaehlt sind. Natuerlich bedeutet Open Source nicht die Verpflichtung diese Aufgaben an eine Community zu geben, aber die &#8220;Community Principles&#8221;[6] lassen auf etwas in dieser Richtung schliessen. Im Moment sind die Committer selbstverstaendlich noch die Entwickler bei Google[7] selbst.</p>
<h3>Weiterfuehrende Links</h3>
<p>Wer sich mit dem Thema naeher befassen will, dem empfehle ich folgende Links:</p>
<p><a title="YouTube Wave Einfuehrung" href="http://www.youtube.com/watch?v=v_UyVmITiYQ">Einfuehrung von Google Wave auf der Google IO</a></p>
<p><a title="Draft Protocol Spec" href="http://www.waveprotocol.org/draft-protocol-spec">Ein erster Entwurf der Protokollspezifikationen</a></p>
<p><a title="Google Wave Federation Architecture" href="http://www.waveprotocol.org/whitepapers/google-wave-architecture">Uebersicht ueber die Protokollarchitektur</a></p>
<p><a title="Diskussionen ueber Google Wave bei Google Groups" href="http://groups.google.com/group/wave-protocol">Google Groups Diskussionen</a></p>
<p><a title="Google Wave API" href="http://code.google.com/apis/wave/guide.html">Google Wave APIs</a></p>
<h3><strong> </strong>Fussnoten:</h3>
<p>[1] <a title="Google IO Wave Introduction" href="http://www.youtube.com/watch?v=v_UyVmITiYQ">Google Wave Introduction from Google IO &#8211; http://www.youtube.com/watch?v=v_UyVmITiYQ</a></p>
<p>[2] <a title="Google Blogpost ueber Wave" href="http://googleblog.blogspot.com/2009/05/went-walkabout-brought-back-google-wave.html">Went walkabout. Brought back Google Wave &#8211; http://googleblog.blogspot.com/2009/05/went-walkabout-brought-back-google-wave.html</a></p>
<p>[3] <a title="PSYC Wiki - Jabber" href="http://about.psyc.eu/Jabber">Technical Issues in Jabber &#8211; http://about.psyc.eu/Jabber</a></p>
<p>[4] <a title="Wavelets XML Rendering Problematik" href="http://groups.google.com/group/wave-protocol/browse_thread/thread/2d3fb5ce88dc3249">Google Groups: <span id="thread_subject_site">Wavelets with different XML schemas &#8211; how to render?</span> &#8211; http://groups.google.com/group/wave-protocol/browse_thread/thread/2d3fb5ce88dc3249</a></p>
<p>[5]<a title="Robots API Kit Javadoc" href="http://wave-robot-java-client.googlecode.com/svn/trunk/doc/index.html"> Google Wave Robots API Javadoc &#8211; http://wave-robot-java-client.googlecode.com/svn/trunk/doc/index.html</a></p>
<p>[6] <a title="Community Principles" href="http://www.waveprotocol.org/wave-community-principles">Google Wave Community Principles &#8211; http://www.waveprotocol.org/wave-community-principles</a></p>
<p>[7] <a title="Comitter des Wave Protokolls" href="http://www.waveprotocol.org/committers">Google Wave Committers &#8211; http://www.waveprotocol.org/committers</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-koelsch.de/17-google-wave-erste-eindruecke/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
