<?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>Sat, 28 Aug 2010 14:59:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<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 Backgammon]]></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:
As [...]]]></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]]></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) wird [...]]]></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 Innatura]]></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]]></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 the UI
&#160; [...]]]></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>
		<item>
		<title>Blackberry Best-Practice: Zusammenspiel von Screens</title>
		<link>http://www.javablog.ch/2010/04/11/blackberry-best-practice-zusammenspiel-von-screens/</link>
		<comments>http://www.javablog.ch/2010/04/11/blackberry-best-practice-zusammenspiel-von-screens/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 22:14:09 +0000</pubDate>
		<dc:creator>HeikoMaass</dc:creator>
				<category><![CDATA[Mobile]]></category>

		<guid isPermaLink="false">http://www.javablog.ch/?p=91</guid>
		<description><![CDATA[Jeder Bildschirm in einer nativen Blackberry-Applikation leitet von net.rim.device.api.ui.Screen ab. Das Blackberry-Framework verwaltet die Screens als Stapel (&#8220;Stack&#8221;): Soll ein Screen geöffnet werden, muss er mit UIEngine.pushScreen(Screen screen) auf den Stapel gelegt werden.  
Wird ein Screen geschlossen, wird wieder der darunterlegende Screen dargestellt. Dieses Verhalten entspricht im Übrigen genau dem UINavigationController des iPhone SDKs.
Beim [...]]]></description>
			<content:encoded><![CDATA[<p>Jeder Bildschirm in einer nativen Blackberry-Applikation leitet von <a href="http://www.blackberry.com/developers/docs/4.7.0api/net/rim/device/api/ui/Screen.html">net.rim.device.api.ui.Screen</a> ab. Das Blackberry-Framework verwaltet die Screens als Stapel (&#8220;Stack&#8221;): Soll ein Screen geöffnet werden, muss er mit <a href="http://www.blackberry.com/developers/docs/4.7.0api/net/rim/device/api/ui/UiEngine.html#pushScreen(net.rim.device.api.ui.Screen)">UIEngine.pushScreen(Screen screen)</a> auf den Stapel gelegt werden.  </p>
<p>Wird ein Screen geschlossen, wird wieder der darunterlegende Screen dargestellt. Dieses Verhalten entspricht im Übrigen genau dem <a href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UINavigationController_Class/Reference/Reference.html">UINavigationController</a> des iPhone SDKs.</p>
<p>Beim &#8220;Pushen&#8221; des Screens werden dem Screen diejenigen Objekte übergeben, die er darstellen und verarbeiten muss. Hier ist beim Software-Design zu beachten, dass der Screen nicht das komplette ganze Modell kennt, sondern immer nur den spezifischen Modell-Abschnitt, den er darstellen muss. So wird eine enge Verzahnung der Screens vermieden und ein höherer Wartungs- und Wiederverwendungsgrad erreicht.</p>
<p>Wenn der oberste Screen Änderungen an darunterliegende Screens kommunizieren muss, so sollte dies über ein Interface geschehen, um weiterhin eine lose Koppelung der Screens sicherzustellen. Das nachfolgende vereinfachte Beispiel zeigt dieses Pattern anhand einer vereinfachten Mailapplikation.<br />
<br />
<img src="/wp-content/uploads/2010/screenflow.png" alt="Das Bild zeigt schematisch 3 Screens, von links nach rechts: IndexScreen, ListScreen und DetailScreen." /></p>
<ol>
<li>Mit Klick auf &#8220;Posteingang&#8221; wird ein ListScreen erzeugt und auf den Stack &#8220;gepushed&#8221;<br />
Auf dem Stack liegen nun zwei Screens (IndexScreen und ListScreen). Der ListScreen hält eine Referenz auf einen Vector mit allen Emails.</li>
<li>Beim Klick auf eine Email in der Liste wird eine Instanz des DetailScreens erzeugt und auf den Stack gepushed. Diese Instanz erhält eine Referenz auf das darzustellende E-Mail Objekt und den ListScreen über das Interface &#8220;DetailScreenListener&#8221;. </li>
<li>Über genau dieses Interface teilt der Detailscreen dem ListScreen mit, wenn der User auf &#8220;Löschen&#8221; geklickt hat, damit dieser aus der Liste entfernt wird</li>
</ol>
<p>Dieses Pattern erlaubt flexibel strukturierbare Anwendungen und wird sowohl im Blackberry- als auch in iPhone-Apps eingesetzt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javablog.ch/2010/04/11/blackberry-best-practice-zusammenspiel-von-screens/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Objective-C. Ein paar Unterschiede zu Java</title>
		<link>http://www.javablog.ch/2010/04/04/objective-c-ein-paar-unterschiede-zu-java/</link>
		<comments>http://www.javablog.ch/2010/04/04/objective-c-ein-paar-unterschiede-zu-java/#comments</comments>
		<pubDate>Sun, 04 Apr 2010 21:51:53 +0000</pubDate>
		<dc:creator>HeikoMaass</dc:creator>
				<category><![CDATA[Jenseits von Java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[objectivec]]></category>

		<guid isPermaLink="false">http://www.javablog.ch/?p=82</guid>
		<description><![CDATA[Mit der steigenden Popularität von Apple-Produkten rückte auch die Programmiersprache &#8220;Objective-C&#8221; in den Fokus von Software-Entwicklern, da nur mit ihr die Entwicklung von nativen iPod-, iPhone- und iPad-Applikationen möglich ist. Das Faszinierende an dieser Sprache ist die Kombination aus statischer und dynamischer Typisierung: 

&#8220;Objects are dynamically typed. In source code (at compile time), any object [...]]]></description>
			<content:encoded><![CDATA[<p>Mit der steigenden Popularität von Apple-Produkten rückte auch die Programmiersprache &#8220;Objective-C&#8221; in den Fokus von Software-Entwicklern, da nur mit ihr die Entwicklung von nativen iPod-, iPhone- und iPad-Applikationen möglich ist. Das Faszinierende an dieser Sprache ist die Kombination aus statischer und dynamischer Typisierung: </p>
<blockquote><p>
&#8220;Objects are dynamically typed. In source code (at compile time), any object variable can be of type id no matter what the object’s class is. The exact class of an id variable (and therefore its particular methods and data structure) isn’t determined until the program runs. [...] To permit better compile-time type checking, and to make code more self-documenting, Objective-C allows objects to be statically typed with a class name rather than generically typed as id. It also lets you turn some of its object-oriented features off in order to shift operations from runtime back to compile time.&#8221;</p></blockquote>
<p><a href="http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocStaticBehavior.html">http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocStaticBehavior.html<br />
</a></p>
<p>Konkret bedeutet dies, das beliebige Nachrichten an Objekte verschickt werden können. Mit Hilfe von &#8220;Categories&#8221; können bestehende Klassen (beispielsweise <code>NSString</code>) sogar um neue Methoden erweitert werden, ohne deren Quellcode zu ändern. Zudem können größere Klassen mit Categories in mehrere Dateien aufgeteilt werden.</p>
<p>Aufgrund des dynamischen Verhaltens kennt Objective-C keine privaten Methoden. Zwar kann auf eine Deklaration der Methode im Interface verzichtet werden, allerdings kann die Methode dennoch aufgerufen werden.</p>
<p>Auch <code>null</code>-Referenzen verhalten sich etwas anders als gewohnt: In Java führt jeder Methodenaufruf einer <code>null</code>-Referenz zwangsläufig zu einer <code>NullPointerException</code>. In Objective-C dagegen wird in diesem Fall <code>nil</code> zurückgegeben, und das ohne Fehlermeldung. Die <code>nil</code>-Referenz hat auch eine weitere Aufgabe: In Listen (<code>NSMutableArray</code>) wird <code>nil</code> zur Markierung des Listenendes verwendet, und kann somit nicht als <code>null</code>-Wert genutzt werden. Für diesen Zweck gibt einen eigenen Typ namens <code>NSNull</code>.</p>
<p>Eine Garbage Collection ist nur für Mac OSX 10.5 verfügbar. iPad-, und iPhone-Entwickler müssen sich dagegen mit dem halbautomatischen Memory-Management anfreunden bzw. auseinandersetzen. Da Objective-C direkt von C ableitet, erbt die Sprache auch einige C-Artefakte wie beispielsweise den für Java-Entwickler ungewohnten Präprozessor.</p>
<p>Trotz dieser Hürden überzeugt Objective-C jedoch mit ihrer spannenden Kombination aus statischer Typisierung und dynamischen Binden. Das Tooling (XCode) kann leider aber noch nicht mit Eclipse mithalten. Hier besteht noch deutlicher Nachholbedarf seitens Apple.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javablog.ch/2010/04/04/objective-c-ein-paar-unterschiede-zu-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Top-7 der XCode-Shortcuts</title>
		<link>http://www.javablog.ch/2010/02/24/top-7-der-xcode-shortcuts/</link>
		<comments>http://www.javablog.ch/2010/02/24/top-7-der-xcode-shortcuts/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 21:21:54 +0000</pubDate>
		<dc:creator>HeikoMaass</dc:creator>
				<category><![CDATA[IDE]]></category>
		<category><![CDATA[Jenseits von Java]]></category>
		<category><![CDATA[objectivec]]></category>
		<category><![CDATA[shortcuts]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://www.javablog.ch/2010/02/24/top-7-der-xcode-shortcuts/</guid>
		<description><![CDATA[[Novum heute: Der erste Blogeintrag zu Objective-C bzw. XCode.]
XCode ist Apple&#8217;s IDE für die Entwicklung von iPhone und Mac-Applikationen. Allerdings ist XCode bei weitem nicht so komfortabel und mächtig wie Eclipse. Dennoch gibt es ein paar Shortcuts, die jeder iPhone-Entwickler kennen sollte:
1. cmd-shift-d (Springt schnell zu einem File, ähnlich ctrl-shift-r in Eclipse )
2. cmd-alt-up (Wechselt [...]]]></description>
			<content:encoded><![CDATA[<p><em>[Novum heute: Der erste Blogeintrag zu Objective-C bzw. XCode.]</em><br />
XCode ist Apple&#8217;s IDE für die Entwicklung von iPhone und Mac-Applikationen. Allerdings ist XCode bei weitem nicht so komfortabel und mächtig wie Eclipse. Dennoch gibt es ein paar Shortcuts, die jeder iPhone-Entwickler kennen sollte:</p>
<p>1. cmd-shift-d (Springt schnell zu einem File, ähnlich ctrl-shift-r in Eclipse )<br />
2. cmd-alt-up (Wechselt von .h Datei zur passenden .m Datei und umgekehrt)<br />
3. cmd-shift-j (Refactor von Klassen, Methoden und Variablen)<br />
4. ctrl-shift-7  (Springt zum nächsten Platzhalter)<br />
5. cmd-shift-7 (Kommentiert markierten Code)<br />
6. ctrl-k (Löscht aktuelle Zeile)<br />
7. cmd-shift-e (Schaltet den Editor in der Projektansicht ein und aus)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javablog.ch/2010/02/24/top-7-der-xcode-shortcuts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bauen mit Ant4Eclipse</title>
		<link>http://www.javablog.ch/2010/01/30/bauen-mit-ant4eclipse/</link>
		<comments>http://www.javablog.ch/2010/01/30/bauen-mit-ant4eclipse/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 23:49:03 +0000</pubDate>
		<dc:creator>HeikoMaass</dc:creator>
				<category><![CDATA[IDE]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[ant4eclipse]]></category>
		<category><![CDATA[hudson]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://www.javablog.ch/2010/01/30/bauen-mit-ant4eclipse/</guid>
		<description><![CDATA[Vor kurzem habe ich für ein bereits aufgesetztes Blackberry-Projekt einen automatischen Build für Hudson konfiguriert. Wenn Maven im Einsatz ist, ist das normalerweise schnell gemacht, aber bei diesem Projekt war der Einsatz von Maven nicht möglich. Somit bleibt einem nichts anderes übrig, als selbst ein paar Ant-Skripte zu programmieren. Klar, kein Problem. Allerdings wollte ich [...]]]></description>
			<content:encoded><![CDATA[<p>Vor kurzem habe ich für ein bereits aufgesetztes Blackberry-Projekt einen automatischen Build für <a href="https://hudson.dev.java.net/">Hudson</a> konfiguriert. Wenn Maven im Einsatz ist, ist das normalerweise schnell gemacht, aber bei diesem Projekt war der Einsatz von Maven nicht möglich. Somit bleibt einem nichts anderes übrig, als selbst ein paar Ant-Skripte zu programmieren. Klar, kein Problem. Allerdings wollte ich nicht die ganzen Projektabhängigkeiten im Ant-Skript wiederholen (<a href="http://de.wikipedia.org/wiki/Don%E2%80%99t_repeat_yourself">DRY</a> und so&#8230;), sie wurden ja schon im Eclipse-Projekt konfiguriert. </p>
<p>Aber wie bekomme ich die Informationen aus der <code>.classpath</code>-Datei ? </p>
<p>Hier hilft <a href="http://www.ant4eclipse.org/">ant4eclipse</a>: Der &#8220;getJdtClassPath&#8221;-Task extrahiert den Classpath aus dem Eclipse-Projekt und stellt ihn für die weitere Verwendung in ant bereit. Das nachfolgende Beispiel-Skript nutzt den extrahierten Classpath und kompiliert damit die Java-Klassen:</p>
<div class="codeblock">
<div class="xml" 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;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span><span style="font-weight: bold; color: black;">?&gt;</span></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: #009900;"><span style="font-weight: bold; color: black;">&lt;project</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: #000066;">name</span>=<span style="color: #ff0000;">&quot;hudson_build&quot;</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: #000066;">basedir</span>=<span style="color: #ff0000;">&quot;.&quot;</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: #000066;">default</span>=<span style="color: #ff0000;">&quot;build&quot;</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;xmlns:ant4<span style="color: #000066;">eclipse</span>=<span style="color: #ff0000;">&quot;antlib:org.ant4eclipse&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></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: #009900;"><span style="font-weight: bold; color: black;">&lt;property</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; <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;workspaceDirectory&quot;</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; <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${basedir}/..&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></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;</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: #009900;"><span style="color: #808080; font-style: italic;">&lt;!-- define ant4eclipse tasks --&gt;</span></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: #009900;"><span style="font-weight: bold; color: black;">&lt;taskdef</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; <span style="color: #000066;">uri</span>=<span style="color: #ff0000;">&quot;antlib:org.ant4eclipse&quot;</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; <span style="color: #000066;">resource</span>=<span style="color: #ff0000;">&quot;org/ant4eclipse/antlib.xml&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></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;</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: #009900;"><span style="color: #808080; font-style: italic;">&lt;!-- import the ant4eclipse platform macros --&gt;</span></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: #009900;"><span style="font-weight: bold; color: black;">&lt;import</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; <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${basedir}/hudson/ant4eclipse/macros/a4e-platform-macros.xml&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></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;</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: #009900;"><span style="color: #808080; font-style: italic;">&lt;!-- import the ant4eclipse jdt macros --&gt;</span></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: #009900;"><span style="font-weight: bold; color: black;">&lt;import</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; <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${basedir}/hudson/ant4eclipse/macros/a4e-jdt-macros.xml&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></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;</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: #009900;"><span style="font-weight: bold; color: black;">&lt;target</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; <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;build&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></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; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;ant4eclipse:getJdtClassPath</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; &nbsp;<span style="color: #000066;">property</span>=<span style="color: #ff0000;">&quot;classpath&quot;</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; &nbsp;<span style="color: #000066;">pathId</span>=<span style="color: #ff0000;">&quot;classpathref&quot;</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; &nbsp;<span style="color: #000066;">workspaceDirectory</span>=<span style="color: #ff0000;">&quot;${workspaceDirectory}&quot;</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; &nbsp;<span style="color: #000066;">projectName</span>=<span style="color: #ff0000;">&quot;ch.javablog.myproject&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></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;</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; <span style="color: #009900;"><span style="color: #808080; font-style: italic;">&lt;!-- classes folder --&gt;</span></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; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;delete</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; &nbsp;<span style="color: #000066;">failonerror</span>=<span style="color: #ff0000;">&quot;false&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></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; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;fileset</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; &nbsp; &nbsp; <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;classes&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></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; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/delete<span style="font-weight: bold; color: black;">&gt;</span></span></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;</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; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;mkdir</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; &nbsp;<span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;classes&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></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;</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; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;javac</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; &nbsp;<span style="color: #000066;">srcdir</span>=<span style="color: #ff0000;">&quot;src&quot;</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; &nbsp;<span style="color: #000066;">destdir</span>=<span style="color: #ff0000;">&quot;classes&quot;</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; &nbsp;<span style="color: #000066;">classpathref</span>=<span style="color: #ff0000;">&quot;classpathref&quot;</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; &nbsp;<span style="color: #000066;">target</span>=<span style="color: #ff0000;">&quot;1.1&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></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: #009900;"><span style="font-weight: bold; color: black;">&lt;/target<span style="font-weight: bold; color: black;">&gt;</span></span></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: #009900;"><span style="font-weight: bold; color: black;">&lt;/project<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li></ol></div>
</div>
<p>Praktisch.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javablog.ch/2010/01/30/bauen-mit-ant4eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jPrep in Version 1.2 nun auf dem AppStore</title>
		<link>http://www.javablog.ch/2010/01/22/jprep-12/</link>
		<comments>http://www.javablog.ch/2010/01/22/jprep-12/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 20:32:51 +0000</pubDate>
		<dc:creator>HeikoMaass</dc:creator>
				<category><![CDATA[jPrep - SCJP training]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://www.javablog.ch/2010/01/22/jprep-12/</guid>
		<description><![CDATA[Wesentliche neue Features:

Erklärungstext für jede Frage
Verbesserte Listendarstellung in &#8220;MyList&#8221;
Und ganz wichtig: Schickeres Applikationsicon

Hier gehts zum Download. Viel Spaß beim Lernen.
]]></description>
			<content:encoded><![CDATA[<p>Wesentliche neue Features:</p>
<ul>
<li>Erklärungstext für jede Frage</li>
<li>Verbesserte Listendarstellung in &#8220;MyList&#8221;</li>
<li>Und ganz wichtig: Schickeres Applikationsicon</li>
</ul>
<p>Hier gehts zum <a href="http://www.itunes.com/app/jprep">Download</a>. Viel Spaß beim Lernen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javablog.ch/2010/01/22/jprep-12/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Frontend Caching mit Expire Headers</title>
		<link>http://www.javablog.ch/2009/11/30/frontend-caching-mit-expire-headers/</link>
		<comments>http://www.javablog.ch/2009/11/30/frontend-caching-mit-expire-headers/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 21:18:58 +0000</pubDate>
		<dc:creator>HeikoMaass</dc:creator>
				<category><![CDATA[Infrastruktur Innatura]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[expire]]></category>
		<category><![CDATA[frontend]]></category>

		<guid isPermaLink="false">http://www.javablog.ch/2009/11/30/frontend-caching-mit-expire-headers/</guid>
		<description><![CDATA[Eigentlich ist es ganz einfach. Aber es wird dennoch häufig vergessen. Die Rede ist vom &#8220;Expire&#8221; HTTP-Header. Er gibt dem Webbrowser zu erkennen, ab wann eine Resource &#8220;veraltet&#8221; ist. Typischerweise werden diese Header im Webserver konfiguriert (und nicht in der eigentlichen Applikation). Hier ein Beispiel aus einer Apache HTTP Konfiguration, die dafür sorgt, dass alle [...]]]></description>
			<content:encoded><![CDATA[<p>Eigentlich ist es ganz einfach. Aber es wird dennoch häufig vergessen. Die Rede ist vom &#8220;Expire&#8221; HTTP-Header. Er gibt dem Webbrowser zu erkennen, ab wann eine Resource &#8220;veraltet&#8221; ist. Typischerweise werden diese Header im Webserver konfiguriert (und nicht in der eigentlichen Applikation). Hier ein Beispiel aus einer Apache HTTP Konfiguration, die dafür sorgt, dass alle statische Komponenten nach einem Tag &#8220;veralten&#8221;.</p>
<div class="codeblock">
<pre>
<div>
        &lt;LocationMatch "^/static(.*)"&gt;
                ExpiresActive On
                ExpiresDefault "access plus 1 day"
        &lt;/LocationMatch&gt;
</div>
</pre>
</div>
<p>Allerdings besteht die Gefahr, dass Codeänderungen aufgrund des clientseitigen Caches beim Kunden erst sich nach einem Tag manifestieren. Eine Lösung ist, den Resourcen einen Timestamp des Deployments zu geben, so dass sie quasi endlos gecached werden können. Bei einem neuen Deployment erhalten die Resourcen einen neuen Timestamp. Mehr zu Frontend Best Practises gibts <a href="http://developer.yahoo.com/performance/rules.html">hier</a> oder auch <a href="http://www.amazon.de/gp/product/0596529309?ie=UTF8&#038;tag=javablog-21&#038;linkCode=as2&#038;camp=1638&#038;creative=6742&#038;creativeASIN=0596529309">hier</a><img src="http://www.assoc-amazon.de/e/ir?t=javablog-21&#038;l=as2&#038;o=3&#038;a=0596529309" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javablog.ch/2009/11/30/frontend-caching-mit-expire-headers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
