<?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, using gadgets</description>
	<lastBuildDate>Mon, 20 Jun 2011 09:38:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Amazons Kindle 3</title>
		<link>http://www.simon-koelsch.de/270-amazons-kindle-3</link>
		<comments>http://www.simon-koelsch.de/270-amazons-kindle-3#comments</comments>
		<pubDate>Sun, 05 Jun 2011 11:26:18 +0000</pubDate>
		<dc:creator>Simon Koelsch</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[kindle]]></category>

		<guid isPermaLink="false">http://www.simon-koelsch.de/?p=270</guid>
		<description><![CDATA[ Seit einiger Zeit habe ich mit dem Gedanken gespielt, mir einen E-Book Reader zu kaufen. Eigentlich möchte ich nach wie vor ein Buch in der Hand halten. Allerdings lese ich immer wieder Romane, die ich in den nächsten Jahren nichtmehr anfassen werde und die nur unnötigen Platz im Regal wegnehmen. Dazu kommen jede Menge Fachartikel die es so in Buchform eigentlich garnicht gibt. Da ich das Lesen am Monitor anstrengend finde, werden die meistens ausgedruckt und danach weggeworfen. Alles nicht so optimal, daher habe ich inzwischen einen Kindle gekauft.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.simon-koelsch.de/wp-content/uploads/2011/06/kindle-3.jpg" title="kindle-3"><img width="300" height="225" src="http://www.simon-koelsch.de/wp-content/uploads/2011/06/kindle-3-300x225.jpg" class="alignright size-full wp-image-248" alt="kindle-3" title="kindle-3"></a>Seit einiger Zeit habe ich mit dem Gedanken gespielt, mir einen E-Book Reader zu kaufen. Eigentlich möchte ich nach wie vor ein Buch in der Hand halten. Allerdings lese ich immer wieder Romane, die ich in den nächsten Jahren nichtmehr anfassen werde und die nur unnötigen Platz im Regal wegnehmen. Dazu kommen jede Menge Fachartikel die es so in Buchform eigentlich garnicht gibt. Da ich das Lesen am Monitor anstrengend finde, werden die meistens ausgedruckt und danach weggeworfen. Alles nicht so optimal, daher habe ich inzwischen einen Kindle gekauft.</p>
<p>Ich will hier kurz meine Erfahrungen mit dem Gerät schildern. Um es gleich vorweg zu nehmen: Der Kindle ist ein E-Book Reader, kein Multimedia Tablet.<br />
Wer das Kindle als alternative zum iPad sieht, sollte sich den Blogbeitrag <a href="http://343max.de/2011/05/22/das-unmagische-amazon-kindle/">"Das unmagische Amazon Kindle"</a> von <a href="http://343max.de/">343max</a> durchlesen.<br />
<span id="more-270"></span></p>
<h3>E-Ink</h3>
<p>Das Display ist bei einem E-Book Reader für mich das wichtigste Kriterium. <a href="http://www.eink.com/">E-Ink</a> versucht dabei echtes Papier nachzuahmen. Das Display reflektiert dabei das Licht, leuchtet also nicht selbst. Der Vorteil dabei ist deutlich angenehmeres lesen. Bei starkem Sonnenlicht werden die meisten Displays von diesem "überleuchtet" und der Text ist nichtmehr zu erkennen. Bei einem passiven Display passiert das nicht.<br />
Die benutzte Technik beim Kindle benötigt zur Anzeige keinen Strom. Das Bild wird einmal erzeugt und danach dauerhaft angezeigt, was sich positv auf die Akkuleistung auswirkt (1 Monat ohne WLAN).<br />
Der Text sieht bei normalen Tageslicht perfekt aus. Bei einem neuen Gerät wird vor dem Einschalten eine Schnellstartanleitung auf dem Display angezeigt. Ich habe diese Anzeige im ersten Moment für eine Folie gehalten die als Schutz über das eigentliche Display geklebt ist. Soviel also dazu.<br />
In Räumen die nicht hell ausgeleuchtet sind, wird der Hintergrund leicht grau, der Kontrast zum Text ist aber für mich immernoch ausreichend.<br />
Das Schriftbild, Zeilenabstände und Schriftgrösse lassen sich den eigenen Lesegewohnheiten anpassen.<br />
Was  aufällt ist die in Anführungszeichen "langsame" Aktualisierung des Bildschirms. Beim Blättern auf die nächste Seite blinkt der Bildschirm für einen kurzen Moment auf, der Menüaufbau dauert dann schonmal ~ 1 Sekunde. Negativ fällt das allerdings nicht ins Gewicht. Ich will mit dem Gerät ja lesen und keine Filme schauen.</p>
<h3>Usability</h3>
<p>Der Kindle liegt zuerst etwas ungewohnt in der Hand. Man weiss erst nicht so ganz, wie man ihn anfassen soll. Unten gibt es die Tastatur und an den Rändern die Tasten zum blättern. 0,85 cm sind schon ziemlich flach. Irgendwie wusste ich am Anfang nicht so ganz wohin mit meinem Daumen...<br />
Die zusätzlich gekaufte Hülle hat diesen Nachteil allerdings mehr als ausgeglichen. Wenn man die Vorderseite umschlägt hat man in etwa die Dicke eines Buches, was alles angenehm griffig macht. Das Gewicht ist mit 240 g ziemlich angenehm.</p>
<p>Die Menüführung ist im ersten Moment äusserst ungewohnt. Hier wird einem schnell bewusst, dass man kein Touchpad oder Smartphone in den Händen hält. Positiv ausgedrückt fühle ich mich an die Bediehnung eines 10 Jahre alten Handys erinnert.</p>
<p>Was mich allerdings wirklich stört, ist die Tastatur des Geräts. Die Steuertasten für den Cursor, zum Beispiel zur Auswahl der Menüpunkte oder zum Nachschlagen eines Wortes, sind zu klein. Direkt darunter ist die "Back" Taste angebracht, direkt darüber die "Menü" Taste. Wenn man nicht genau den Druckpunkt findet, landet man schnell an der falschen Stelle.<br />
Absolut bescheuert ist die Eingabe von Zahlen: Man muss dazu auf die "Sym" Taste drücken und die Zahlen mithilfe des Cursors auswählen. Um also auf Seite 42 zu springen, muss man entweder 42x auf die Taste zum blättern drücken oder auf "Menu", "Go to" (einfach Enter), "Sym", Cursor zur 4 bewegen, "Enter", Cursor zur 2 bewegen "Enter"... Da hätte es definitv bessere Lösungen gegeben.<br />
Die grossen Tasten links und rechts zum umblättern sind in meinen Augen allerdings angenehm positioniert.</p>
<p>Möchte man ein Wort nachschlagen ist es ausreichend den Cursor zum entsprechenden Wort zu bewegen. Es wird dann automatisch eine Beschreibung aus dem eingestellten Dictionary (zum Beispiel Oxford Dictionary oder Duden) unter oder über dem Text angezeigt. Der Lesefluss wird dabei nicht gestört.</p>
<p>An die Bedienung habe ich mich inzwischen recht schnell gewöhnt und bin eigentlich zufrieden.</p>
<h3>Kindle Versionen und der Amazon Account</h3>
<p>Den Kindle 3 gibt es in zwei Versionen. Eine Version mit WiFi für 139 Euro und eine Version mit Wifi + 3G für 189 Euro. Bei der Version für 189 Euro ist in Deutschland eine Verbindung ins O2 Netz sichergestellt. Darüber werden dann gekaufte Bücher an das Gerät übertragen. Gebühren fallen keine an.<br />
Ich habe mich für die WiFi only Version entschieden. Mein Android Smartphone kann über Tethering als WLAN Accesspoint fungieren, was mit dem Kindle zusammen wunderbar funktioniert.<br />
Das Gerät selbst ist automatisch mit dem Amazon Konto verknüpft, über das es gekauft wurde. Im Nachhinein lässt sich das natürlich auch ändern. Gekaufte Bücher werden dann an das Gerät übertragen. Eine ganze Reihe an Klassikern bei denen zum Beispiel das Urheberecht abgelaufen ist, werden von Amazon kostenlos angeboten.<br />
Die im <a href="http://www.amazon.de/kindleshop">Kindleshop</a> gekauften Bücher können immer wieder an die registrieren Geräte (zum Beispiel auch die Kindle App des iPads, Android, etc.) geschickt werden. Alternativ kann man natürlich auch seine Dateien über die USB Schnittstelle übertragen. Bookmarks, Notizen und aufgeschlagene Seiten werden ebenfalls synchronisiert.</p>
<h3>Unterstützte Formate</h3>
<p>Angezeigt wird das eigene Kindle-Format (.azw), Mobipocket (.mobi), PDF, Word, Text und HTML. Word und HTML habe ich nicht getestet. Bei .azw gibt es selbstverständlich keine Probleme. Mobipocket und Text funktionieren wie erwartet auch einwandfrei. Word und HTML habe ich nicht getestet.<br />
Was absolut garnicht funktioniert ist PDF. Das Dokument wird zwar dargestellt, allerdings muss man umständlich über das Menü zuerst eine Zoomstufe einstellen und dann mit dem Cursor einen Bildausschnitt wählen. Hat man den Ausschnitt gelesen, muss man mit dem Cursor weiterscrollen. Zu gebrauchen ist die Funktion absolut nicht. Schade.<br />
Wer allerdings E-Books im PDF Format hat, kann diese zum Beispiel mithilfe von <a href="http://calibre-ebook.com/">Calibre</a> problemlos in das Mobipocket-Format konvertieren. Dort kann man dann als Ausgabelayout dann auch Kindle einstellen. Der Umweg ist zwar unschön, erziehlt allerdings gute Ergebnisse.<br />
Calibre kann übrigends auch EPUB konvertieren, solange kein DRM vorhanden ist.</p>
<h3>Und sonst?</h3>
<p>Als experimentelle Funktionen wird noch ein Browser angeboten. Ja man kann mit dem Kindle im Internet surfen. Nein, man will mit dem Kindle nicht im Internet surfen. Die Benutzerfreundlichkeit entspricht in etwa der vom lesen eines PDFs. Ausserdem sieht die Schrift hier oft ziemlich verwaschen und unscharf aus.<br />
Zu erwähnen wäre noch die Möglichkeit, einer Vorlesefunktion und MP3s abzuspielen. Dafü gibt es einen 3,5mm Klinken Ausgang oder interne Lautsprecher. Beide Funktionen sind für mich nicht wirklich relevant. Bücher kaufe ich, damit ich sie selbst lesen kann und MP3s höre ich über meinen MP3-Player oder Smartphone.</p>
<h3>In Kurz</h3>
<p>Wie eingangs schon erwähnt ist der Kindle ein reiner E-Book Reader und dafür funktioniert er sehr gut. An die Handhabung habe ich mich relativ schnell gewöhnt.<br />
Das Display schlägt alles was ich bisher in dieser Richtung gesehen habe.<br />
Formatmässig unterstützt er .AZW und Mobipocket. Wer PDF und EPUB will muss diese Formate konvertieren. Blogs, RSS-Feeds und andere Inhalte liest man besser auf einem anderen Gerät oder konvertiert diese ebenfalls mit Calibre.<br />
Gekaufte Amazon E-Books werden tatsächlich sofort innerhalb von 60 Sekunden an den Kindle gepusht.</p>
<p><strong>Zufrieden? Definitv ja.</strong></p>
<p><em>Das oben verwendete Bild stammt von <a href="http://www.zonebattler.net/">zonebattler.net</a> aus dem Blogartikel <a href="http://www.zonebattler.net/2011/05/08/das-kindle-am-manne/">"Das Kindle am Manne"</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-koelsch.de/270-amazons-kindle-3/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>SSL und was es damit eigentlich auf sich hat</title>
		<link>http://www.simon-koelsch.de/254-ssl-und-was-es-damit-auf-sich-hat</link>
		<comments>http://www.simon-koelsch.de/254-ssl-und-was-es-damit-auf-sich-hat#comments</comments>
		<pubDate>Tue, 05 Apr 2011 21:43:11 +0000</pubDate>
		<dc:creator>Simon Koelsch</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.simon-koelsch.de/?p=254</guid>
		<description><![CDATA[Wir nutzen das Internet immer mehr unterwegs. Nicht nur von mobilen Endgeräten wie Handys sondern auch der Laptop / das Netbook sind immer dabei. Sei es über das UMTS Netz, einen WLAN Zugang im Cafe, an der Uni oder bei Freunden. Dabei ist es wichtig verschlüsselte Verbindungen zu nutzen, um Zugangsdaten und private Informationen nicht im Klartext zu senden.]]></description>
			<content:encoded><![CDATA[<p>Wir nutzen das Internet immer mehr unterwegs. Nicht nur von mobilen Endgeräten wie Handys sondern auch der Laptop / das Netbook sind immer dabei. Sei es über das UMTS Netz, einen WLAN Zugang im Cafe, an der Uni oder bei Freunden. Dabei ist es wichtig verschlüsselte Verbindungen zu nutzen, um Zugangsdaten und private Informationen nicht im Klartext zu senden. Es geht hierbei nicht nur um die Privatsphäre sondern <a href="http://www.zeit.de/digital/datenschutz/2010-01/identitaetsdiebstahl-selbsterfahrung">auch um den Schutz vor Missbrauch und Identitätsdiebstahl</a>. Der eigene Internetzugang ist dabei keine Ausnahme. Zugegeben die Wahrscheinlichkeit, dass zum Beispiel jemand meine Kommunikation mit dem Mailserver mitliest ist deutlich geringer, aber immernoch vorhanden.<br />
<a href="http://ettercap.sourceforge.net/">Ettercap</a> demonstriert schon seit einer kleinen Ewigkeit, wie einfach ein entsprechender <a href="http://en.wikipedia.org/wiki/Man-in-the-middle_attack">Man-In-The-Middle Angriff</a> zu bewerkstelligen ist. Der Angreifer liest dabei den Datenverkehr als Dritter zwischen Server und Client. Mit dem vor mehreren Monaten veröffentlichten Browser Plugin <a href="http://codebutler.com/firesheep">Firesheep</a> wird das Sniffen von Logon-Cookies zum Kinderspiel. Mit diesem abgefangenen Cookie kann sich der Angreifer dann gegenüber einer Homepage unter dem Account des Opfers einloggen.<br />
Beim Besuch von Webseiten gibt es meist die Möglichkeit den Server ueber HTTPS  anzusprechen, wodurch die Verbindung durch SSL gesichert wird. <a href="http://blog.twitter.com/2011/03/making-twitter-more-secure-https.html">Twitter und Facebook</a> bieten seit einiger Zeit die Einstellung an, grundsätzlich in eine HTTPS gesicherte Verbindung zu wechseln. Um aber wirklich von der Verschlüsslung zu profitieren ist es wichtig zu verstehen, wie SSL eigentlich funktioniert.<br />
<span id="more-254"></span></p>
<h3>SSL/TLS</h3>
<p>SSL steht fuer Secure Socket Layer und beschreibt eine Technik um sichere Verbindungen herzustellen. Der aktuelle Name ist daher auch <a href="http://datatracker.ietf.org/wg/tls/charter/">Transport Layer Security (TLS)</a>. Der Einfachheit halber will ich hier trotzdem die Bezeichnung SSL benutzen.<br />
SSL benötigt zum Aufbau einer verschlüsselten Verbindung zu einem Server dessen öffentlichen Schlüssel. Die Daten können dann nur vom Server mit seinem privaten Schlüssel wieder in Klartext verwandelt werden. Dieses Prinzip bezeichnet man als <a href="http://en.wikipedia.org/wiki/Public-key_cryptography">Public-Key-Verfahren</a>.<br />
Bei HTTPS wird dem Browser, welcher die Verbindung zu einem Webserver aufbauen will, dieser Schlüssel in Form eines <a href="http://en.wikipedia.org/wiki/X.509#Certificates">X.509 Zertifikats</a> zur Verfügung gestellt. Dieses Zertifikat enthält im Regelfall neben dem Schlüssel noch die Domain, eine Gültigkeit sowie mehr oder weniger Informationen über den Aussteller und Inhaber.</p>
<h3>Zertifizierungsstellen</h3>
<p>Dieser Schlüssel löst zwar das Problem der Verschlüsslung, verhindert aber nicht zwangsläufig einen Man-In-The-Middle Angriff. Ist ein Angreifer in der Lage den Datenverkehr mitzulesen  und zu verändern, kann er bei der Übertragung des öffentlichen Schlüssels diesen durch einen eigenen ersetzen. Danach ist die Verbindung zwar gesichert, der Kommunikationspartner ist allerdings nicht der eigentliche Zielserver, sondern der Angreifer. Es muss also sichergestellt sein, dass man wirklich das Zertifikat des Servers erhalten hat. Ein Zertifikat kann allerdings für beliebige Domains mit beliebigem Inhalt <a href="http://en.wikipedia.org/wiki/Self-signed_certificate">selbst erstellt</a> werden, man sieht ihm nicht direkt an, ob es echt oder falsch ist.</p>
<p>Zu diesem Zweck gibt es das Prinzip von Zertifizierungsstellen, sogenannten CAs (<a href="http://en.wikipedia.org/wiki/Certificate_authority">Certificate Authorities</a>). Die Idee dahinter ist, dass man einer bestimmten CA vertraut und damit auch den von ihr ausgestellten Zertifikaten. Um zu prüfen ob ein bestimmtes Zertifikat auch wirklich von dieser CA ausgestellt wurde benötigt man zum Vergleich deren Root-Zertifikat. Ein Browser enthält daher eine lange List an Root-Zertifikaten von verschiedenen Unternehmen. Diese Zertifizierungsstellen haben <a href="http://www.mozilla.org/projects/security/certs/policy/">sich verpflichtet</a> die in ihren Zertifikaten enthaltenen Daten zu prüfen. Dabei sollte zum Beispiel nur der Inhaber einer Domain sich ein Zertifikat für diese ausstellen lassen können.</p>
<h3>Wer bist du wirklich?</h3>
<p>In der Praxis fangen aber genau hier die eigentlichen Probleme an. Die Liste der Zertifizierungsstellen ist in allen gängigen Browsern sehr lang. Eine CA kann ausserdem die Möglichkeit <a href="http://www.whichssl.com/intermediate_certificates2.html">des Signierens von Zertifikaten weiter delegieren</a>. So kann eine lange Kette an CAs entstehen, die berechtigt sind gültige Zertifikate auszustellen.<br />
Ein anschauliches Beispiel (entliehen von Certificate Patrol) ist die <a href="https://opacplus.bsb-muenchen.de/">Bayrische Staatsbibliothek</a>. Deren Zertifikat wurde von der eigenen Zertifizierungsstelle ausgestellt. Der Browser vertraut dieser Stelle nur weil ihr vom<a href="https://www.pki.dfn.de/"> Deutschen Forschungsnetz vertraut wird</a>, dem wiederum die Deutsche Telekom vertraut. Erst deren Root-Zertifikat ist in den Browsern hinterlegt. Eine "kleine" Liste von CAs nur für Deutschland findet sich bei <a href="https://ssl.netcraft.com/ssl-sample-report/CMatch/certs_de">Netcraft</a>.  Dort findet man dann auch Nestle oder Adidas in der Liste.<br />
Absolut sichere Systeme gibt es nicht, und so kommt es immer wieder vor, dass durch die Vortäuschung falscher Informationen oder einem Einbruch in einen Server gefälschte Zertifikate ausgestellt werden.<br />
Für einen Browser gibt es nicht zwangsläufig einen Unterschied zwischen dem echten Zertifikat meiner Bank und einem Zertifikat, welches von einer CA in einem Land ausgestellt wurde, indem ich mich nichtmal trauen würde Urlaub zu machen. Er wird in beiden Fällen eine "gesicherte Verbindung" anzeigen.<br />
Ein aktuelles <a href="http://www.theregister.co.uk/2011/03/30/comodo_gate_latest/">Beispiel ist Comodo</a>, bei dem es ein Hacker geschafft hat, sich Zertifikate für Seiten wie Google Mail und Skype zu beschaffen.<br />
Es gibt bei SSL zwar einen <a href="http://en.wikipedia.org/wiki/Certificate_revocation_list">Mechanismus um Zertifikate über eine Liste zu widerrufen</a>, allerdings müssen diese Fälle auch bekannt sein.<br />
Abhilfe schaffen zumindest teilweise verschiedene Tools.</p>
<h3>Unterstützende Tools</h3>
<h4>Perspectives</h4>
<p><a href="http://www.networknotary.org/firefox.html">Perspectives</a> ist ein <a href="https://addons.mozilla.org/de/firefox/addon/perspectives/">Firefox</a> und <a href="https://chrome.google.com/webstore/detail/lnppfgdnjafeikakadfopejdpglpiahn">Chrome Plugin</a>, um sich auch vor solchen Angriffen zu schützen. Die Idee dahinter ist es, beim Aufbau einer gesicherten Verbindung einen dritten Server nach der Checksumme des Zertifikats zu fragen und diese zu vergleichen. Der dritte Server ermittelt dann über seine eigene Verbindung die Checksumme. Ist diese unterschiedlich, ist von einem Man-In-The-Middle Angriff auszugehen, das heisst ein Angreifer hat sein eigenes gefälschtes Zertifikat in die Verbindung eingeschleust. Ausserdem werden die Checksummen auf dem dritten Server gespeichert. Dadurch wird es möglich zu prüfen ob sich das Zertifikat des Servers erst vor kurzem geändert hat.<br />
Die Perspectives Entwickler betreiben ein kleines Netzwerk von sogenannten Notary Servern die vom Browserplugin abgefragt werden. Bekommt man von Google Mail dann plötzlich ein neues Zertifikat, obwohl die Notary Server eine andere Version kennen, gibt das Anlass zur Sorge. Zusätzlich gibt es fuer den Datenbestand der gecachten Checksummen auch ein <a href="http://www.networknotary.org/notary_web/notary_query">Webinterface</a>.<br />
Durch diese Art der Anfragen ist natürlich nachvollziehbar, welche gesicherten Seiten ich besucht habe. Die Policy der Notary Server legt dabei viel Wert auf Datenschutz und verspricht die IP Adressen der Nutzer nicht zu speichern. Wer trotzdem lieber einen eigenen Notary Server betreiben moechte kann das mit der <a href="https://github.com/danwent/Perspectives">quelloffenen Python Server Software</a> tun.</p>
<h4>Certificate Patrol</h4>
<p>Ein anderes <a href="https://addons.mozilla.org/en-US/firefox/addon/certificate-patrol/">Firefox Plugin</a> welches den Umgang mit SSL sicherer macht ist <a href="http://patrol.psyced.org/">Certificate Patrol</a>. Es speichert einfach die Zertifikate der besuchten Seiten. Ändert sich danach etwas am Zertifikat zeigt Certificate Patrol diese Änderung zum ursprünglichen Zertifikat an.<br />
Benutzt die eigene Bank dann plötzlich ein Zertifikat aus dem Iran, sollte man sich überlegen ob man sein Onlinebanking nicht verschiebt.<br />
Auch auf weitere Unstimmigkeiten weist Certificate Patrol hin.</p>
<h3>Fazit</h3>
<p>Es gibt leider keine pauschale Sicherheit. Der gern propagierte Hinweis, "Achten sie auf das grüne Schloss in der Adresszeile des Browsers", bedeutet leider nicht automatisch eine sichere Verbindung. SSL ist eine Lösung für diese Sicherheitsprobleme, in der Praxis funktioniert diese Lösung allerdings nicht so ohne weiteres, zumindest nicht ohne sich mit der Thematik auseinandergesetzt zu haben. Man darf gespannt sein, was fuer Alternativen in den nächsten Jahren auf uns zukommen.<br />
Im Moment hilft nur "Kopf einschalten".</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-koelsch.de/254-ssl-und-was-es-damit-auf-sich-hat/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook &#8220;Reverse Account Lookup&#8221;</title>
		<link>http://www.simon-koelsch.de/240-facebook-reverse-account-lookup</link>
		<comments>http://www.simon-koelsch.de/240-facebook-reverse-account-lookup#comments</comments>
		<pubDate>Wed, 23 Mar 2011 16:09:28 +0000</pubDate>
		<dc:creator>Simon Koelsch</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.simon-koelsch.de/?p=240</guid>
		<description><![CDATA[Beim Pflegen des eigenen Profils auf Facebook hat man außerdem die Möglichkeit eine oder mehrere E-Mail Adressen zu hinterlegen. Für jede Adresse lassen sich die üblichen Privatsphäre Einstellungen setzen: "Öffentlich anzeigen", "Nur Freunden anzeigen", "Nur mir anzeigen". Zusätzlich kann man die Adresse vor einer Liste von "Freunden" verstecken.
Diese Einstellungen greifen aber scheinbar nur auf der Info Seite des Profils.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.simon-koelsch.de/wp-content/uploads/2011/03/facebook.png"><img src="http://www.simon-koelsch.de/wp-content/uploads/2011/03/facebook.png" alt="" title="facebook" width="180" height="68" class="alignleft size-full wp-image-248" /></a>Facebook bietet die Möglichkeit Nachrichten nicht nur an die Benutzer der Plattform zu schicken, sondern an beliebige E-Mail Adressen.</p>
<p>Um diese Funktion nutzen zu können, wird als Empfänger anstatt des Namens einfach eine E-Mail Adresse angegeben. Der Empfänger enthält dann eine Nachricht von Facebook mit einer zufällig generierten Absenderadresse, falls der Absender nicht schon das Facebook E-Mail Feature nutzt.</p>
<p>Beim Pflegen des eigenen Profils auf Facebook hat man außerdem die Möglichkeit eine oder mehrere E-Mail Adressen zu hinterlegen. Für jede Adresse lassen sich die üblichen Privatsphäre Einstellungen setzen: "Öffentlich anzeigen", "Nur Freunden anzeigen", "Nur mir anzeigen". Zusätzlich kann man die Adresse vor einer Liste von "Freunden" verstecken.<br />
Diese Einstellungen greifen aber scheinbar nur auf der Info Seite des Profils.<br />
<span id="more-240"></span><br />
Kenne ich eine E-Mail Adresse und möchte den dazugehörigen Facebook Account herausfinden muss ich nichts weiter tun, als von Facebook aus an diese Adresse eine Nachricht zu schicken. Danach wird in der Liste der gesendeten Nachrichten direkt das Facebook Profil angezeigt, bei dem diese Adresse hinterlegt wurde.<br />
Dabei werden die Privatsphäre Einstellungen völlig ignoriert. Egal ob die Einstellung "E-Mail Adresse nur mir anzeigen" gesetzt ist oder explizit vor bestimmten "Freunden" versteckt, der Verlauf zeigt mir immer das zugehörige Profil.</p>
<p>Dabei ist es egal ob ich mit dem Besitzer des Profils befreundet bin oder nicht: Kenne ich die E-Mail Adresse finde ich das passende Profil dazu.</p>
<p>In meinen Augen ist dieses Verhalten definitiv ein Fehler der gefixt werden sollte.<br />
Mir selbst war dieser "Fehler" bisher noch nicht bekannt, im Netz konnte ich dazu ebenfalls nichts finden.<br />
Hat da jemand mehr Infos?</p>
<p>Einen passenden Kontakt sucht man bei Facebook scheinbar vergeblich. Eventuell ist das Verhalten ja so gewünscht oder schon länger bekannt.<br />
Ich bezweifle allerdings eine Antwort über das "<a href="http://www.facebook.com/help/?topic=suggestions">Suggestions"-Formular</a> zu erhalten:</p>
<blockquote><p>"Note: While Facebook welcomes any suggestions and feedback you submit using this form, we are unable to respond to them directly. All suggestions are governed by our terms (see SRR 2.5)."</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-koelsch.de/240-facebook-reverse-account-lookup/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java 7 &#8211; Plan B</title>
		<link>http://www.simon-koelsch.de/226-java-7-plan-b</link>
		<comments>http://www.simon-koelsch.de/226-java-7-plan-b#comments</comments>
		<pubDate>Mon, 04 Oct 2010 16:29:03 +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=226</guid>
		<description><![CDATA[Die enge Roadmap von Java 7 war ja schon seit einiger Zeit bekannt. Aus den Diskussionen auf den Mailinglisten der einzelnen Projekte wurde auch relativ deutlich, dass es eng wird, ein Release mit allen Features zu veröffentlichen. Ein Beispiel ist Neal Gafters Posting auf der Project Lambda Mailingliste "A reminder of Project Lambda's scope". Hier [...]]]></description>
			<content:encoded><![CDATA[<p>Die enge Roadmap von <a href="http://openjdk.java.net/projects/jdk7/">Java 7</a> war ja schon seit einiger Zeit bekannt. Aus den Diskussionen auf den Mailinglisten der einzelnen Projekte wurde auch relativ deutlich, dass es eng wird, ein Release mit allen Features zu veröffentlichen.</p>
<p>Ein Beispiel ist <a href="http://gafter.blogspot.com/">Neal Gafters</a> Posting auf der <a href="http://openjdk.java.net/projects/lambda/">Project Lambda</a> Mailingliste <a href="http://mail.openjdk.java.net/pipermail/lambda-dev/2010-April/001290.html">"A reminder of Project Lambda's scope"</a>. Hier merkt Neal im April an, dass eigentlich schon im Juni laut Roadmap ein "feature complete" JDK 7 da sein muss.</p>
<p><a href="http://blogs.sun.com/mr">Mark Reinhold</a> hat dann Anfang September in seinem Blog unter <a href="http://blogs.sun.com/mr/entry/rethinking_jdk7">"Re-thinking JDK 7"</a> das Problem angesprochen und zwei weitere Vorgehensweisen diskutiert:</p>
<ul>
<li>Plan A wäre ein Release von Java 7 wie geplant, allerdings erst 2012.</li>
<li>Plan B ist Java 7 mit den bereits vorhanden Features (also ohne Closures, Jigsaw und teilweise Coin) Mitte 2011 zu veröffentlichen und die restlichen Features im JDK 8 Ende 2012 unterzubringen.</li>
</ul>
<p>Die <a href="http://blogs.sun.com/mr/entry/rethinking_jdk7#comments">meisten Kommentare</a> befürworten Plan B, was seit dem 20. September mit <a href="http://blogs.sun.com/mr/entry/plan_b">"It’s time for … Plan B"</a> bestätigt ist.</p>
<p>Welche Features landen jetzt aber in Java 7, welche in Java 8? Hier also ein kleines Update um meinen Artikel <a href="http://www.simon-koelsch.de/110-java-7-features">"Java 7 Features"</a> zu ergänzen.<br />
<span id="more-226"></span><br />
Die <a href="http://openjdk.java.net/projects/jdk7/features/">Featureliste</a> wurde inzwischen von Reinhold geupdatet, was noch fehlt ist ein tatsächlicher <a href="http://openjdk.java.net/projects/jdk7/milestones/">Zeitplan für die Milestones</a>. Ein paar ursprünglich nicht enthaltene Punkte sind inzwischen ebenfalls dazu gekommen.</p>
<p>Hier die Änderungen für das JDK 7, welches nun also hoffentlich Mitte 2011 erscheinen wird:</p>
<p><strong>Sprachfeatures</strong></p>
<ul>
<li>Project Coin wird in Java 7 enthalten sein, allerdings ohne Unterstützung der Sprache für Collections. Wenn ich die Beschreibung allerdings richtig interpretiere, ist "improved exception handling (multi-catch)" nun doch enthalten.</li>
</ul>
<p><strong>I/O and Networking</strong></p>
<ul>
<li>NIO .2 wird mit einem Provider für .zip- und .jar-Files kommen. </li>
<li>Unter Windows wird in Zukunft der Windows Vista IPv6 Stack bevorzugt benutzt. </li>
<li>Ausserdem wird TLS 1.2 verfügbar.</li>
</ul>
<p><strong>Internationalization</strong></p>
<ul>
<li>Unicode wird nicht wie geplant in der Version 5.1, sondern in Version 6.0 unterstützt. </li>
<li>Ausserdem wurde die Unterstützung von Locales verbessert.</li>
</ul>
<p>Zusätzlich findet dann noch JDBC 4.1 seinen Weg in den Release.</p>
<p>Für Ende 2012, also für Java 8, sind jetzt folgende Punkte geplant: </p>
<ul>
<li>JSR 294 + Jigsaw,</li>
<li>Lambda (Closures),</li>
<li>"Annotations on Java Types" (JSR 308),</li>
<li>das Swing Application Framework (JSR 296) und die Swing Datepicker Komponente.</li>
<li>Neu ist hier noch "Language support for collections".</li>
</ul>
<p>Damit bleiben als JDK 7 Merkmale auf der Sprachseite vor allem <a href="http://java.sun.com/developer/technicalArticles/javase/nio/">NIO 2</a> und <a href="http://openjdk.java.net/projects/coin/">Project Coin</a>. Auf der Seite der VM ist das wohl wichtigste Merkmal <a href="http://java.sun.com/developer/technicalArticles/DynTypeLang/">"Invoke Dynamic"</a>, um die Performance für Scriptsprachen wie Scala zu verbessern.</p>
<p>Ich würde mir für die Zukunft von Java einen "Date-Driven" Releasezyklus wünschen. Hier wäre dann klar, in einem festen Zeitraum kommt ein neues Release welches alle fertigen Features enthält. OpenBSD fährt damit zum Beispiel sehr Erfolgreich. Aber warten wir einfach ab, wie sich Java unter Oracle entwickeln wird.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simon-koelsch.de/226-java-7-plan-b/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<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. 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. Android 2.2, Releasename Froyo, ist nun schon eine Weile verfügbar und [...]]]></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>21</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 Buttons mit der Bezeichnung "Flattr" oder "Flattr this!". Hier rechts in der Navigationsleiste übrigends auch...
<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.]]></description>
			<content:encoded><![CDATA[<p>Immer häufiger findet man im Netz inzwischen kleine Buttons mit der Bezeichnung "Flattr" oder "Flattr this!". Hier rechts in der Navigationsleiste übrigends auch...<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 "flattrn". 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 "ge-flattrt".<br />
Am Ende des Monats wird der vorher festgelegte Betrag dann durch die Anzahl der "ge-flattrten" 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 "<a href="https://flattr.com/support/intro" target="_blank">Introduction</a>" oder "<a href="https://flattr.com/about" target="_blank">The Flattr Story</a>" 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 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.]]></description>
			<content:encoded><![CDATA[<p><em><strong>Update:</strong> Einige Features wurden aus Zeitgründen verschoben. Siehe hierzu "<a href="http://www.simon-koelsch.de/226-java-7-plan-b">Java 7 - Plan B</a>".</em></p>
<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 ("Garbage First"). G1 ersetzt damit die bisherige "Concurrent Mark-Sweep" (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 "lebt", 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 "sterben" 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">"Garbage First Garbage Collection" (pdf)</a> von Sun.<br />
"Garbage First" 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 "InvokeDynamic" 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">"Da-Vinci Machine" Projekt</a> zu finden.</p>
<h4>Komprimierte 64-Bit Pointer</h4>
<p>Innerhalb des VM Speichers gibt es OOPs, sogenannte "Ordinary Object Pointer". 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 "low-level" 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 "Type Annotations" 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">"Type-Annotation" 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 "Typ Annotation" Projekts nicht.</p>
<h4>Project Coin</h4>
<p>Mehrere kleine Sprachänderungen sind im <a href="http://openjdk.java.net/projects/coin/" target="_blank">"Project Coin"</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... <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...</p>
<h4>Project Lambda - 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 "Task". Mehrere "Worker" 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 "Work-Stealing". Dabei wird ein weiterer Task aus der Queue eines zufällig gewählten anderen Workers abgearbeitet, allerdings nach dem FIFO Prinzip. Da "ältere" 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 "stehlen" 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">"A Java Fork/Join Framework" (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">"More New I-O APIs for the Java Platform"</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 "synchronized". 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 "JXLayer" ergänzt. Dieser Layer bringt "hübsches" 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>2</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 Interface durch intensiven Gebrauch von Javascript. Man denke dabei an Google Mail, Google Maps oder Google Wave. Ein Teil der Werkzeuge die dabei benutzt werden sind jetzt als Closure Tools veröffentlicht worden. Closure Tools besteht aus den folgenden Teilprojekten: Der Closure Compiler übersetzt JavaScript Code in eine kompaktere Form. [...]]]></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 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. Um Fehler zu finden wird der Bytecode der kompilierten Java Klassen auf auffälligen Muster untersucht, welche haeufig auf einen Fehler schliessen lassen. [...]]]></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 "<em>Bugpattern</em>" 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 Zusammenfassung der Aenderungen und Google Wave Einladungen.]]></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"> "Wave Extension Design Principles"</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 - check your sandbox account for instructions on how to login. You'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 - 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>
	</channel>
</rss>

