<?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>javablog.ch</title>
	<atom:link href="http://www.javablog.ch/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.javablog.ch</link>
	<description>Keep on learning...</description>
	<lastBuildDate>Sun, 04 Dec 2011 17:15:04 +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>JDK7 Testfahrt &#8211; Teil 2</title>
		<link>http://www.javablog.ch/2011/03/27/jdk7-testfahrt-teil-2/</link>
		<comments>http://www.javablog.ch/2011/03/27/jdk7-testfahrt-teil-2/#comments</comments>
		<pubDate>Sun, 27 Mar 2011 20:48:00 +0000</pubDate>
		<dc:creator>HeikoMaass</dc:creator>
				<category><![CDATA[Java7]]></category>

		<guid isPermaLink="false">http://www.javablog.ch/?p=246</guid>
		<description><![CDATA[&#8220;Catching Multiple Exception Types&#8221; Ein praktisches Feature, um doppelte catch-Blöcke zu vermeiden. Es ist nun möglich mit einem Catch-Block mehrere Exception-Typen gleichzeitig zu fangen. Die Exception-Typen werden dabei mit dem ODER-Operator (&#124;) getrennt. Im Catch-Block kann die gefangene Exception unter gemeinsamen Supertyp angesprochen werden. static class AException extends Exception { public void fooFromA() {} } [...]]]></description>
			<content:encoded><![CDATA[<h3>&#8220;Catching Multiple Exception Types&#8221;</h3>
<p>Ein praktisches Feature, um doppelte catch-Blöcke zu vermeiden. Es ist nun möglich mit einem Catch-Block mehrere Exception-Typen gleichzeitig zu fangen. Die Exception-Typen werden dabei mit dem ODER-Operator (|) getrennt. Im Catch-Block kann die gefangene Exception unter gemeinsamen Supertyp angesprochen werden.   </p>
<div class="codeblock">
<pre>
   static class AException extends Exception {
        public void fooFromA() {}
    }
    static class BException extends AException {
        public void fooFromB() {}
    }
    static class CException extends AException {
        public void fooFromC() {}
    }

    public void x() {
        try {
            z();
        } catch (BException | CException e) {
            e.fooFromA();
            // e.fooFromB(); Compiler-Fehler
            // e.fooFromC(); Compiler-Fehler
        }
    }

    public void z() throws BException, CException {
        // heavy lifting
    }
</pre>
</div>
<h3>&#8220;Improved Checking for Rethrown Exceptions&#8221;</h3>
<p>Des Weiteren &#8220;merkt&#8221; sich der Compiler nun, welche Exception-Typen im try-Block geworfen können. So kann im Catch-Block ein Supertyp gefangen und weiter geworfen werden, auch wenn dieser Supertyp gar nicht in der throws-Deklaration vorkommt. </p>
<div class="codeblock">
<pre>
 public void y() throws BException, CException {
        try {
            z();
        } catch (Throwable e) {
            // e darf ohne Cast weiter geworfen werden, da
            // der Compiler sich "gemerkt hat", dass im
            // try-Block nur BException und CException
            // vorkommen können.
            throw e;
        }
    }
</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.javablog.ch/2011/03/27/jdk7-testfahrt-teil-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JDK7 Testfahrt &#8211; Teil 1</title>
		<link>http://www.javablog.ch/2011/03/20/jdk7-testfahrt-teil-1/</link>
		<comments>http://www.javablog.ch/2011/03/20/jdk7-testfahrt-teil-1/#comments</comments>
		<pubDate>Sun, 20 Mar 2011 12:00:28 +0000</pubDate>
		<dc:creator>HeikoMaass</dc:creator>
				<category><![CDATA[Java7]]></category>

		<guid isPermaLink="false">http://www.javablog.ch/?p=219</guid>
		<description><![CDATA[Heute habe ich mir den Snapshot Build b134 des Java7 SDKs sowie die Beta 2 von Netbeans 7 heruntergeladen, um die neuen Sprachfeatures Probe zu fahren. Eine gute Übersicht über alle neuen Features ist hier zu finden. Bekanntermassen wurden letztes Jahr die spannendsten Features &#8220;Closures&#8221; und &#8220;Collection Literals&#8221; in das JDK8 verschoben. Nichtsdestotrotz bietet das [...]]]></description>
			<content:encoded><![CDATA[<p>Heute habe ich mir den Snapshot Build b134 des <a href="http://download.java.net/jdk7/">Java7 SDKs</a> sowie die <a href="http://netbeans.org/community/releases/70/">Beta 2 von Netbeans 7</a> heruntergeladen, um die neuen Sprachfeatures Probe zu fahren.</p>
<p>Eine gute Übersicht über alle neuen Features ist <a href="http://openjdk.java.net/projects/jdk7/features/">hier</a> zu finden. Bekanntermassen wurden letztes Jahr die spannendsten Features &#8220;Closures&#8221; und &#8220;Collection Literals&#8221; in das JDK8 verschoben. Nichtsdestotrotz bietet das JDK7 mit dem JSR 334 kleine, sinnvollere Spracherweiterungen.</p>
<h3>Binary Literals</h3>
<p>Eins davon sind die &#8220;binary literals&#8221;. In früheren JDKs konnten numerische Literale im Quelltext in dezimaler, hexadezimaler oder oktaler Schreibweise erscheinen. Der Compiler des JDK7 erlaubt nun auch eine binäre Representation:</p>
<div class="codeblock">
<pre>
int answer = 0b101010;
</pre>
</div>
<h3>Unterstriche in numerischen Literale</h3>
<p>Desweiteren können Zahlen zwecks besserer Lesbarkeit im Quelltext auch mit einem Unterstrich optisch gruppiert werden. Dabei ist zu beachten, dass die Unterstriche nicht am Anfang oder am Ende eines Literals stehen dürfen.</p>
<div class="codeblock">
<pre>
long words1 = 0xCAFE_BABE; // ok
long words2 = 0xCAFE_BABE_; // Compiler-Fehler
long words3 = 0x_CAFE_BABE; // Compiler-Fehler
</pre>
</div>
<h3>Strings im switch-Statement</h3>
<p>Nun kann auch ein String im switch-Statement verwendet werden. Der case-Vergleich findet analog zu der java.lang.String#equals-Methode statt. Das nachfolgende Beispiel gibt &#8220;banana&#8221; auf der Konsole aus.</p>
<div class="codeblock">
<pre>
        final String fruit = "banana";
        switch (fruit) {
            case "Apple":
                System.out.println("Apple");
                break;
            case "Banana":
                System.out.println("Banana");
                break;
            case "banana":
                System.out.println("banana");
                break;
        }
</pre>
</div>
<p>Ob ein String-Vergleich immer eine gute Idee ist, sei dahin gestellt. Schliesslich funktioniert ein Switch-Case seit dem JDK5 auch mit dem Enum-Konstrukt. </p>
<p>So. Genug für heute. Im nächsten Blogpost drehen wir eine weitere Runde.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javablog.ch/2011/03/20/jdk7-testfahrt-teil-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exzellente Präsentation zu dem Thema BlackBerry-Layouting</title>
		<link>http://www.javablog.ch/2011/03/01/exzellente-prasentation-zu-dem-thema-blackberry-layouting/</link>
		<comments>http://www.javablog.ch/2011/03/01/exzellente-prasentation-zu-dem-thema-blackberry-layouting/#comments</comments>
		<pubDate>Tue, 01 Mar 2011 21:29:41 +0000</pubDate>
		<dc:creator>HeikoMaass</dc:creator>
				<category><![CDATA[BlackBerry]]></category>

		<guid isPermaLink="false">http://www.javablog.ch/?p=191</guid>
		<description><![CDATA[Wer sich ernsthaft mit BlackBerry-Entwickung auseinandersetzt, sollte sich die Präsentation &#8220;DEV20 &#8211; Custom Layouts&#8221; von der letztjährigen DEVCON (RIM&#8217;s Entwicklermesse) ansehen. Die Präsentation zeigt, wie schicke UIs skalierbar implementiert werden können. Das tolle ist, dass RIM den kompletten Quelltext der vorgestellten Manager und Fields zur Verfügung stellt. Der Download erfordert allerdings einen BlackBerry Developer Account.]]></description>
			<content:encoded><![CDATA[<p>Wer sich ernsthaft mit BlackBerry-Entwickung auseinandersetzt, sollte sich die Präsentation &#8220;DEV20 &#8211; Custom Layouts&#8221; von der letztjährigen DEVCON (RIM&#8217;s Entwicklermesse) ansehen. </p>
<p>Die Präsentation zeigt, wie schicke UIs skalierbar implementiert werden können. Das tolle ist, dass RIM den kompletten Quelltext der vorgestellten Manager und Fields zur Verfügung stellt.</p>
<p>Der <a href="https://www.blackberry.com/bdsc/?lang=na#devcon">Download</a> erfordert allerdings einen BlackBerry Developer Account.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javablog.ch/2011/03/01/exzellente-prasentation-zu-dem-thema-blackberry-layouting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>3 Dinge, die das BlackBerry-SDK gut löst</title>
		<link>http://www.javablog.ch/2011/01/30/3-dinge-die-das-blackberry-sdk-gut-lost/</link>
		<comments>http://www.javablog.ch/2011/01/30/3-dinge-die-das-blackberry-sdk-gut-lost/#comments</comments>
		<pubDate>Sun, 30 Jan 2011 12:19:19 +0000</pubDate>
		<dc:creator>HeikoMaass</dc:creator>
				<category><![CDATA[BlackBerry]]></category>
		<category><![CDATA[Mobile Multiplexer]]></category>

		<guid isPermaLink="false">http://www.javablog.ch/?p=192</guid>
		<description><![CDATA[1. Manager und Fields Die kleinste Basiseinheit im UI-Framework ist net.rim.device.api.ui.Field, welches einen rechteckigen, zeichenbaren Bereich darstellt. Beispiel für ein Field ist net.rim.device.api.ui.component.EditField, welches Texteingaben ermöglicht. Fields werden durch net.rim.device.api.ui.Manager-Instanzen verwaltet. Ein Manager ist für die Positionierung der enthaltenen Fields sowie für das Scrolling verantwortlich. Jedes Field kann zu genau einem Manager zugeordnet werden. Beispiel [...]]]></description>
			<content:encoded><![CDATA[<h3>1. Manager und Fields</h3>
<p>Die kleinste Basiseinheit im UI-Framework ist <a href="http://www.blackberry.com/developers/docs/6.0.0api/net/rim/device/api/ui/Field.html">net.rim.device.api.ui.Field</a>, welches einen rechteckigen, zeichenbaren Bereich darstellt. Beispiel für ein Field ist <a href="http://www.blackberry.com/developers/docs/6.0.0api/net/rim/device/api/ui/component/EditField.html">net.rim.device.api.ui.component.EditField</a>, welches Texteingaben ermöglicht.</p>
<p>Fields werden durch <a href="http://www.blackberry.com/developers/docs/6.0.0api/net/rim/device/api/ui/Manager.html">net.rim.device.api.ui.Manager</a>-Instanzen verwaltet. Ein Manager ist für die Positionierung der enthaltenen Fields sowie für das Scrolling verantwortlich. Jedes Field kann zu genau einem Manager zugeordnet werden. Beispiel für einen Manager ist <a href="http://www.blackberry.com/developers/docs/6.0.0api/net/rim/device/api/ui/container/HorizontalFieldManager.html">net.rim.device.api.ui.container.HorizontalFieldManager</a>, der seine Fields horizontal anordnet. Manager können auch andere Manager enthalten, da sie selbst von Field ableiten. </p>
<p>Für komplexere Views müssen eigene Manager und Fields implementiert werden. Was anfangs etwas gewöhnungsbedürftig erscheint, entpuppt sich schnell als durchdachtes Konzept.</p>
<h3>2. Crypto-API</h3>
<p>Kernkompetenz der BlackBerry-Smartphones ist der Einsatz in Unternehmen. Dementsprechend umfangreich und mächtig ist auch die <a href="http://www.blackberry.com/developers/docs/6.0.0api/net/rim/device/api/crypto/package-summary.html">Crypto</a>-API des SDKs. Alle Verschlüsselungsanforderungen in unseren Projekten konnten wir mit der Crypto-API lösen, ohne fremde Bibliotheken verwenden zu müssen.</p>
<h3>3. Eclipse-Integration</h3>
<p>Mit eines der grössten Ärgernisse in der BlackBerry-Entwicklung war die veraltete, swing-basierte Entwicklungsumgebung names &#8220;JDE&#8221;. RIM hat reagiert und ein Plugin für Eclipse entwickelt, welches seit letztem Jahr, bzw. der Version 1.1.1 auch wirklich praxistauglich funktioniert. Durch das &#8220;Code Hot Swap&#8221;-Feature, also der Austausch von COD-Files zur Laufzeit verringern sich auch die zeitraubenden Neustarts des Simulators.</p>
<p>Zudem muss man immer noch eigene Ant-Skripte bauen, um auf Knopfdruck ein Deployment für alle unterstützten OS-Versionen zu generieren. Hier besteht noch Verbesserungspotential.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javablog.ch/2011/01/30/3-dinge-die-das-blackberry-sdk-gut-lost/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>3 Dinge, die das BlackBerry-SDK eher suboptimal löst</title>
		<link>http://www.javablog.ch/2010/12/14/3-dinge-die-das-blackberry-sdk-eher-suboptimal-lost/</link>
		<comments>http://www.javablog.ch/2010/12/14/3-dinge-die-das-blackberry-sdk-eher-suboptimal-lost/#comments</comments>
		<pubDate>Mon, 13 Dec 2010 22:25:01 +0000</pubDate>
		<dc:creator>HeikoMaass</dc:creator>
				<category><![CDATA[BlackBerry]]></category>
		<category><![CDATA[Mobile Multiplexer]]></category>

		<guid isPermaLink="false">http://www.javablog.ch/?p=170</guid>
		<description><![CDATA[1. Welchen Transportweg hätten Sie gern ? Ein Http-Request kann über 5 verschiedene Transportwege übermittelt werden: 1. BIS (BlackBerry Internet Service) 2. BES (BlackBerry Enterprise Service) 3. WAP 2.0 4. Direct TCP &#8211; (Direkt über den APN des Netzbetreibers) 5. WiFi Welcher Transportweg für eine Http-Verbindung genommen werden soll, muss der Entwickler selbst bestimmen und [...]]]></description>
			<content:encoded><![CDATA[<h3>1. Welchen Transportweg hätten Sie gern ?</h3>
<p>Ein Http-Request kann über 5 verschiedene Transportwege übermittelt werden:<br />
1. BIS (BlackBerry Internet Service)<br />
2. BES (BlackBerry Enterprise Service)<br />
3. WAP 2.0<br />
4. Direct TCP &#8211; (Direkt über den APN des Netzbetreibers)<br />
5. WiFi</p>
<p>Welcher Transportweg für eine Http-Verbindung genommen werden soll, muss der Entwickler selbst bestimmen und dabei gleichzeitig auch die Verfügbarkeit prüfen. Natürlich verhalten sich die Transportwege auch unterschiedlich: Beispielsweise wird man bei dem Transportweg BIS oder BES nie einen HTTP 301 oder 302 zu sehen bekommen, da die Redirects bereits in der BlackBerry-Infrastruktur aufgelöst werden. </p>
<p>Verschärfend kommt hinzu, dass dem Endkunden je nach Datentarif und gewählten Transport unterschiedliche Kosten entstehen können. Somit muss der Kunde in den Einstellungen der App die Möglichkeit haben, den präferierten Transportweg auszuwählen. iPhone-User und Applikationsentwickler schütteln hier einfach den Kopf. Zwar stellt RIM seit der OS-Version 5.0 eine Network-API zur Verfügung, die das ganze vereinfacht, aber für ältere OS-Versionen muss dies selbst implementiert werden.</p>
<h3>2. Jeder schreibt sich das Logging-Framework selbst</h3>
<p>Es soll ja tatsächlich in der Java-SE Welt noch vereinzelt Leute geben, die sich eine eigene Logger-Implementierung schreiben.  In der BlackBerry-Welt macht das jeder, da die mitgelieferte EventLogger-Klasse nur rudimentäre Funktionalität bietet und sehr unglücklich zu programmieren ist. Beispiel gefällig ?</p>
<div class="codeblock">
<pre>
  // Register application for event logging with GUID
 EventLogger.register(0x9c805919833654d6L, SampleApp);

 // Log a numeric event.
 EventLogger.logEvent(0x9c805919833654d6L, 12, EventLogger.INFORMATION);
</pre>
</div>
<p>Im Übrigen kann ein Log maximal 16kB umfassen.</p>
<h3>3. Anzahl der Threads bei älteren Geräten auf 16 limitiert</h3>
<p>Eine App kann auf älteren Geräten max. 16 Threads gleichzeitig laufen lassen. Wenn eine App überdurchschnittlich komplex ist, und viele Dinge im Hintergrund erledigt (Parsing, GPS- und CellId-Lokalisierung, Laden von Kartendaten), dann muss man aufpassen, dass diese Grenze nicht überschritten wird. Ansonsten wird die Applikation unschön mit einem <code>TooManyThreadError</code> beendet. Dies betrifft allerdings nur die älteren Geräte. Modernere Modelle wie der Torch oder Bold können weitaus mehr Threads parallel laufen lassen.</p>
<p>Aber wo Schatten ist, ist auch Licht. Der nächste Blogeintrag handelt von 3 Dingen, die das BlackBerry-SDK elegant löst.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javablog.ch/2010/12/14/3-dinge-die-das-blackberry-sdk-eher-suboptimal-lost/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mein Artikel &#8220;Brombeerplantage&#8221; im &#8220;Mobile Developer Android&#8221; Magazin</title>
		<link>http://www.javablog.ch/2010/09/15/mein-artikel-brombeerplantage-im-mobile-developer-android-magazin/</link>
		<comments>http://www.javablog.ch/2010/09/15/mein-artikel-brombeerplantage-im-mobile-developer-android-magazin/#comments</comments>
		<pubDate>Wed, 15 Sep 2010 18:10:30 +0000</pubDate>
		<dc:creator>HeikoMaass</dc:creator>
				<category><![CDATA[BlackBerry]]></category>
		<category><![CDATA[Mobile Multiplexer]]></category>
		<category><![CDATA[blackberry]]></category>

		<guid isPermaLink="false">http://www.javablog.ch/?p=160</guid>
		<description><![CDATA[In eigener Sache: Morgen erscheint das Magazin &#8220;Mobile Developer Android&#8221; am Kiosk. Das Magazin setzt den Fokus klar auf Android-Entwicklung, behandelt aber andere mobile Plattformen wie BlackBerry oder Bada. Ich konnte einen 7-seitigen Artikel beisteuern, der den Einstieg in diese Entwicklungsplattform erleichtert. Der Artikel stellt das UI-Framework vor, erläutert die Besonderheiten bei Netzwerkverbindungen und beleuchtet [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.mdeveloper.de"><img alt="" src="http://www.javablog.ch/wp-content/uploads/2010/mdeveloper.gif" title="&quot;Mobile Developer Android&quot;-Cover" class="alignright" width="150" height="212" /></a><br />
In eigener Sache: Morgen erscheint das Magazin &#8220;<a href="http://www.mdeveloper.de">Mobile Developer Android</a>&#8221; am Kiosk. Das Magazin setzt den Fokus klar auf Android-Entwicklung, behandelt aber andere mobile Plattformen wie BlackBerry oder Bada. </p>
<p>Ich konnte einen 7-seitigen Artikel beisteuern, der den Einstieg in diese Entwicklungsplattform erleichtert. Der Artikel stellt das UI-Framework vor, erläutert die Besonderheiten bei Netzwerkverbindungen und beleuchtet das Tooling sowie Fragmentierung der BlackBerry-Plattform. Viel Spaß beim Lesen &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javablog.ch/2010/09/15/mein-artikel-brombeerplantage-im-mobile-developer-android-magazin/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Oracle und Java</title>
		<link>http://www.javablog.ch/2010/08/28/oracle-und-java/</link>
		<comments>http://www.javablog.ch/2010/08/28/oracle-und-java/#comments</comments>
		<pubDate>Sat, 28 Aug 2010 14:50:20 +0000</pubDate>
		<dc:creator>HeikoMaass</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[sun]]></category>

		<guid isPermaLink="false">http://www.javablog.ch/?p=139</guid>
		<description><![CDATA[Ende Januar diesen Jahres wurde die Sun-Übernahme durch Oracle abgeschlossen. Eine der wichtigsten Plattformen der IT-Industrie gehört nun einem Unternehmen, das erst beweisen muss, dass es dieser Verantwortung gerecht werden kann. Bereits im April wurde die Java-Community durch die Kündigung von James Gosling, dem &#8220;Java-Erfinder&#8221;, erschüttert. Über die konkreten Gründe hüllt er sich in Schweigen: [...]]]></description>
			<content:encoded><![CDATA[<p>Ende Januar diesen Jahres wurde die Sun-Übernahme durch Oracle abgeschlossen. Eine der wichtigsten Plattformen der IT-Industrie gehört nun einem Unternehmen, das erst beweisen muss, dass es dieser Verantwortung gerecht werden kann. Bereits im April wurde die Java-Community durch die Kündigung von James Gosling, dem &#8220;Java-Erfinder&#8221;, erschüttert. Über die konkreten Gründe hüllt er sich in Schweigen:</p>
<blockquote><p>As to why I left, it&#8217;s difficult to answer: Just about anything I could say that would be accurate and honest would do more harm than good.
</p></blockquote>
<p><a href="http://nighthacks.com/roller/jag/entry/time_to_move_on">http://nighthacks.com/roller/jag/entry/time_to_move_on</a>.</p>
<p>Oracle versucht, den Namen &#8220;Sun&#8221; an jeder möglichen Stelle zu ersetzen. Ab 1. September wird beispielsweise die SCJP-Zertifizierung (&#8220;Sun Certified Java Programmer&#8221;) in &#8220;Oracle Certified Professional, Java SE 6 Programmer&#8221; umbenannt. Der Namenswechsel wird auch in den Produkten selbst vorangetrieben: So gibt das Vendor-Property seit der JVM 1.6.0_21  anstelle von <code>Sun Microsystems, Inc</code> einfach <code>Oracle</code> zurück. Diese scheinbar kleine Änderung hatte für &#8220;Eclipse Helios&#8221;-Anwender OutOfMemory-Abstürze <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6969236">zur Folge</a>.</p>
<p>Auch die technische Migration der Sun-Webseiten in die Oracle-Welt erfolgte nicht ganz reibungslos. Insbesondere gab es <a href="http://grep.codeconsult.ch/2010/07/21/dear-oracle-can-we-have-our-nice-javadoc-urls-back/">Unmut</a> über geänderte JavaDoc-URLs, die unschöne Implementierungsdetails enthielten. Oracle hat jedoch schnell reagiert und die Korrekturen schnell implementiert. </p>
<p>Spannend ist auch die aktuell <a href="http://www.heise.de/open/meldung/Oracle-klagt-gegen-Google-wegen-Patent-und-Urheberrechtsverletzung-1058227.html">eingereichte Klage </a>von Oracle gegen Google. Oracle wirft Google vor, Patente bei der Entwicklung von Android verletzt zu haben. Dies hat nun die Konsequenz dass Google Oracle&#8217;s Entwicklerkonferenz &#8220;Java One&#8221; <a href="http://googlecode.blogspot.com/2010/08/update-on-javaone.html">boykottiert</a>.</p>
<p>Insgesamt hat Oracle in diesem Jahr für (zu)viel Aufregung gesorgt und die Java-Community verunsichert. Mit Spannung wird die Keynote der Java One erwartet, in der sich Oracle&#8217;s CEO Larry Ellison zu der <a href="http://www.heise.de/open/meldung/JavaOne-Ausblick-Larry-Ellison-will-sich-zur-Java-Zukunft-aeussern-1064408.html">Zukunft von Java äußern möchte.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javablog.ch/2010/08/28/oracle-und-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>URLEncoding à la RIM</title>
		<link>http://www.javablog.ch/2010/07/25/urlencoding-a-la-rim/</link>
		<comments>http://www.javablog.ch/2010/07/25/urlencoding-a-la-rim/#comments</comments>
		<pubDate>Sun, 25 Jul 2010 11:22:28 +0000</pubDate>
		<dc:creator>HeikoMaass</dc:creator>
				<category><![CDATA[Mobile Multiplexer]]></category>
		<category><![CDATA[blackberry]]></category>
		<category><![CDATA[rim]]></category>
		<category><![CDATA[urlencoder]]></category>

		<guid isPermaLink="false">http://www.javablog.ch/?p=132</guid>
		<description><![CDATA[Folgender Bug hat mich in der letzten Woche etwas Zeit gekostet: In einer BlackBerry-Applikation sollen Daten verschlüsselt über einen URL-Parameter verschickt werden. Die eigentliche Verschlüsselung erfolgt dabei mit RIM-Klassen. Das aus dem Verschlüsselungsprozess resultierende Byte-Array wird durch die URLEncodedPostData-Klasse encodiert. Wie sich herausstellte, zeigt URLEncodedPostData ein ungewöhnliches (allerdings dokumentiertes) Verhalten bei Zeilenumbrüchen. Ein linefeed (\n) [...]]]></description>
			<content:encoded><![CDATA[<p>Folgender Bug hat mich in der letzten Woche etwas Zeit gekostet: In einer BlackBerry-Applikation sollen Daten verschlüsselt über einen URL-Parameter verschickt werden. Die eigentliche Verschlüsselung erfolgt dabei mit RIM-Klassen. Das aus dem Verschlüsselungsprozess resultierende Byte-Array wird durch die <a href="http://www.blackberry.com/developers/docs/5.0.0api/net/rim/blackberry/api/browser/URLEncodedPostData.html">URLEncodedPostData</a>-Klasse encodiert.</p>
<p>Wie sich herausstellte, zeigt URLEncodedPostData ein ungewöhnliches (allerdings dokumentiertes) Verhalten bei Zeilenumbrüchen. Ein linefeed (\n) wird nicht zu %0A encodiert, sondern zu %0D%0A (entspricht \r\n). Somit verhält sich die RIM-Klasse anders als der <a href="http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/net/URLEncoder.html">java.net.URLEncoder</a> der Java-SE.</p>
<p>Als Resultat konnten Byte-Arrays, die zufälligerweise ein linefeed enthielten, nicht mehr vom Server entschlüsselt werden. Da sich dieses Verhalten nicht beeinflussen lässt, musste eine alternative URLEncoder-Klasse in das Projekt integriert werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javablog.ch/2010/07/25/urlencoding-a-la-rim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jmap und jhat</title>
		<link>http://www.javablog.ch/2010/06/06/jmap-und-jhat/</link>
		<comments>http://www.javablog.ch/2010/06/06/jmap-und-jhat/#comments</comments>
		<pubDate>Sun, 06 Jun 2010 20:26:48 +0000</pubDate>
		<dc:creator>HeikoMaass</dc:creator>
				<category><![CDATA[Infrastruktur]]></category>

		<guid isPermaLink="false">http://www.javablog.ch/?p=119</guid>
		<description><![CDATA[[Letzte Woche von einem Kollegen gelernt]: Java bietet mit jmap und jhat zwei mächtige Tools, um den kompletten Heap eines Javaprozesses zu analysieren. Mit &#8220;jmap -dump:file=mydump&#8221; wird ein Snapshot des gesamten Java Heaps erzeugt und in einem binären Format ins aktuelle Verzeichnis abgelegt. Dieser Dump ist das Ausgangsmaterial für jhat. Ein kleiner Hinweis für die [...]]]></description>
			<content:encoded><![CDATA[<p><em>[Letzte Woche von einem Kollegen gelernt]</em>: Java bietet mit <a href="http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html">jmap</a> und <a href="http://java.sun.com/javase/6/docs/technotes/tools/share/jhat.html">jhat</a> zwei mächtige Tools, um den kompletten Heap eines Javaprozesses zu analysieren. </p>
<p>Mit &#8220;<strong>jmap -dump:file=mydump</strong>&#8221; wird ein Snapshot des gesamten Java Heaps erzeugt und in einem binären Format ins aktuelle Verzeichnis abgelegt. Dieser Dump ist das Ausgangsmaterial für jhat. Ein kleiner Hinweis für die Mac-Nutzer: Unter Mac OSX funktioniert dies leider nicht. Hier muss man den Dump mit der HotSpotDiagnosticMXBean innerhalb der <a href="http://java.sun.com/javase/6/docs/technotes/guides/management/jconsole.html">JConsole</a> erzeugen. </p>
<p>Mit &#8220;<strong>jhat mydump</strong>&#8221; wird ein HTTP-Server gestartet, der die im Dump enthaltenen Klassen und Instanzen präsentiert. Über die Abfragesprache OQL (Object Query Language) kann der Dump auch durchsucht werden. Beispielsweise werden mit &#8220;<strong>select s from java.lang.String s where s.count >= 500</strong>&#8221; alle Strings aufgelistet, die länger als 500 Zeichen sind. </p>
<p>Praktisch.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javablog.ch/2010/06/06/jmap-und-jhat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>invokeAndWait und performSelectorOnMainThread</title>
		<link>http://www.javablog.ch/2010/05/19/invokeandwait-und-performselectoronmainthread/</link>
		<comments>http://www.javablog.ch/2010/05/19/invokeandwait-und-performselectoronmainthread/#comments</comments>
		<pubDate>Wed, 19 May 2010 20:19:08 +0000</pubDate>
		<dc:creator>HeikoMaass</dc:creator>
				<category><![CDATA[Mobile Multiplexer]]></category>

		<guid isPermaLink="false">http://www.javablog.ch/?p=106</guid>
		<description><![CDATA[Wie bei Swing darf bei einer Blackberry-Applikation nur der Event-Dispatching Thread die UI-Komponenten modifizieren. Muss aus einem Background-Thread (bsp. bei der GPS-Lokalisierung oder nach dem Parsen von XML) eine UI-Komponente modifiziert werden, so muss dies über UIApplication.invokeAndWait oder UIApplication.invokeLater geschehen. UIApplication.getApplication&#40;&#41;.invokeAndWait&#40; new Runnable&#40;&#41; &#123; &#160; &#160;public void run&#40;&#41; &#123; &#160; &#160; &#160; &#160; // modify [...]]]></description>
			<content:encoded><![CDATA[<p>Wie bei Swing darf bei einer Blackberry-Applikation nur der Event-Dispatching Thread die UI-Komponenten modifizieren. Muss aus einem Background-Thread (bsp. bei der GPS-Lokalisierung oder nach dem Parsen von XML) eine UI-Komponente modifiziert werden, so muss dies über <a href="http://www.blackberry.com/developers/docs/4.1api/net/rim/device/api/system/Application.html#invokeAndWait(java.lang.Runnable)">UIApplication.invokeAndWait</a> oder <a href="http://www.blackberry.com/developers/docs/4.1api/net/rim/device/api/system/Application.html#invokeLater(java.lang.Runnable)">UIApplication.invokeLater</a> geschehen. </p>
<div class="codeblock">
<div class="java" style="font-family: monospace;"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">UIApplication.<span style="color: #537799;font-weight: bold;">getApplication</span><span style="color: #111111;">&#40;</span><span style="color: #111111;">&#41;</span>.<span style="color: #537799;font-weight: bold;">invokeAndWait</span><span style="color: #111111;">&#40;</span> <span style="color: #222222; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ARunnable+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #415D77; ">Runnable</span></a><span style="color: #111111;">&#40;</span><span style="color: #111111;">&#41;</span> <span style="color: #111111;">&#123;</span></div></li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #222222; font-weight: bold;">public</span> <span style="color: #222222; font-weight: bold;">void</span> run<span style="color: #111111;">&#40;</span><span style="color: #111111;">&#41;</span> <span style="color: #111111;">&#123;</span></div></li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// modify the UI</span></div></li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #111111;">&#125;</span></div></li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #111111;">&#125;</span><span style="color: #111111;">&#41;</span>;</div></li></ol></div>
</div>
<p>Beim iPhone OS ist das Prinzip identisch: Nur der Main-Thread darf UIKit-Komponenten verändern. Hier gibt es ebenfalls eine einfache Methode (<a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/doc/uid/20000050-CJBEHAEF">performSelectorOnMainThread</a>) um Code auf dem Main-Thread auszuführen:</p>
<div class="codeblock">
<div style="font-family: monospace;"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">[delegate performSelectorOnMainThread:@selector(parserDidParse) withObject:nil waitUntilDone:NO];</div></li></ol></div>
</div>
<p>Mit dieser Zeile wird der Main-Thread veranlasst, die Methode &#8220;parserDidParse&#8221; des &#8220;delegate&#8221;-Objekts ohne Parameter aufzurufen.</p>
<p>An diesem Beispiel sieht man wieder, wie stark sich die Konzepte von Blackberry und dem iPhone OS ähneln.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javablog.ch/2010/05/19/invokeandwait-und-performselectoronmainthread/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

