<?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>Soraxdesign &#187; Tutorial</title>
	<atom:link href="http://www.soraxdesign.de/tag/tutorial/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.soraxdesign.de</link>
	<description>Softwareentwicklung, Rich Internet Applications und Blog</description>
	<lastBuildDate>Sat, 04 Dec 2010 13:56:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Einrichten eines iPhones als Entwicklertelefon in Xcode</title>
		<link>http://www.soraxdesign.de/2010/05/22/einrichten-iphone-als-entwicklertelefon-xcode/</link>
		<comments>http://www.soraxdesign.de/2010/05/22/einrichten-iphone-als-entwicklertelefon-xcode/#comments</comments>
		<pubDate>Sat, 22 May 2010 16:25:15 +0000</pubDate>
		<dc:creator>rené</dc:creator>
				<category><![CDATA[Mobile Development]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iTunes]]></category>
		<category><![CDATA[Mobile Devices]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://www.soraxdesign.de/?p=502</guid>
		<description><![CDATA[Möchte man seine Applikation nicht nur im Simulator testen sondern auf einem Endgerät, muss das iPhone erst als Developer-Device konfiguriert werden. Apple bietet dafür eine ausführliche Anleitung im iPhone Developer Portal:


Zu diesen wichtigen Schritte, habe ich hier noch einige Tipps parat.
Das iPhone, welches als Developer-Device verwendet werden soll, an den Mac anschließen und Xcode öffnen.
Für [...]]]></description>
			<content:encoded><![CDATA[<p>Möchte man seine Applikation nicht nur im Simulator testen sondern auf einem Endgerät, muss das iPhone erst als Developer-Device konfiguriert werden. Apple bietet dafür eine ausführliche Anleitung im <a href="http://developer.apple.com/iphone/library/documentation/Xcode/Conceptual/iphone_development/128-Managing_Devices/devices.html">iPhone Developer Portal</a>:</p>
<p><a href="http://www.soraxdesign.de/wp-content/uploads/2010/03/iphone_developer_portal.png"><img src="http://www.soraxdesign.de/wp-content/uploads/2010/03/iphone_developer_portal-150x150.png" alt="" title="iphone_developer_portal" width="150" height="150" class="aligncenter size-thumbnail wp-image-503" /></a></p>
<p><span id="more-502"></span><br />
Zu diesen wichtigen Schritte, habe ich hier noch einige Tipps parat.<br />
Das iPhone, welches als Developer-Device verwendet werden soll, an den Mac anschließen und Xcode öffnen.<br />
Für die Einrichtung des iPhones wird die UDID benötigt, wie man diese ausliest, steht hier.</p>
<p><strong>Create an App ID</strong><br />
Dieser Name sollte eindeutig sein und so einfach wie möglich, da dieser später im Xcode Projekt eingetragen werden muss. Ideal ist Kleinschreibung und ein kurzer Projektname z.b. testapp.</p>
<p><a href="http://www.soraxdesign.de/wp-content/uploads/2010/03/app_id.jpg"><img src="http://www.soraxdesign.de/wp-content/uploads/2010/03/app_id-300x167.jpg" alt="" title="app_id" width="500" class="aligncenter size-medium wp-image-504" /></a></p>
<p><a href="http://www.soraxdesign.de/wp-content/uploads/2010/03/app_id_eintragen.jpg"><img src="http://www.soraxdesign.de/wp-content/uploads/2010/03/app_id_eintragen-300x215.jpg" alt="" title="app_id_eintragen" width="500"  class="aligncenter size-medium wp-image-505" /></a></p>
<p><strong>Developer Ceritifcate</strong><br />
Im Assistenen muss ein sogenanntes &#8220;Developer Certificate&#8221; erstellt werden. Dazu wird aus der ID des Macs mit Hilfe der Schlüsselbundverwaltung (Keychain Access) eine Datei generiert, diese wird im Assistenten hochgeladen. Die Schlüsselbundverwaltung findet man schnell über Spotlight.</p>
<p>Im nächsten Schritt wird eine Datei namens &#8220;developer_identity.cer&#8221; generiert, dies zieht man einfach auf das Icon der geöffneten Schlüsselbundverwaltung oder klickt doppelt drauf. Es wird gefragt, ob man dieses Zertifikat hinzufügen möchte, im Dropdown sollte &#8220;Anmeldung&#8221; ausgewählt sein. Dann auf &#8220;OK&#8221; klicken. </p>
<p><img src="http://www.soraxdesign.de/wp-content/uploads/2010/03/cer1.png" alt="" title="certificate" width="449" height="286" class="aligncenter size-full wp-image-506" /></p>
<p>Klickt man in der Schlüsselbundverwaltung auf &#8220;Meine Zertifkate&#8221; findet man ein Zertifikat mit dem Namen &#8220;iPhone Developer <name des entwicklers> <zertifikat nummer>&#8221; dort. Das &#8220;Developer Certificate&#8221; muss nur pro Entwickler angelegt werden.<br />
Zu jeder Applikation benötigt man entweder ein &#8220;Development Provisioning Profile&#8221; oder ein &#8220;Distribution Provisioning Profile&#8221;, wobei für die Entwicklung ersteres interessant ist.</p>
<p><strong>Profile</strong><br />
Im Assistenten wird als nächstes für die Applikation ein &#8220;Development Provisioning Profile&#8221; generiert, dafür muss diesem Profil ein Name gegeben werden. Es bietet sich an, auch weil später schwer zu unterscheiden ist, ob es sich um ein &#8220;Development Provisioning Profile&#8221; oder ein &#8220;Distribution Provisioning Profile&#8221; (dort auch noch für eine Adhoc oder AppStore Installation) handelt, den Namen des Profils nach dem Muster &#8220;ApplikationName_DeveloperProfile&#8221; bzw. &#8220;ApplikationName_DistributionProfile_Adhoc/AppStore&#8221; anzugeben. Für die Applikation &#8220;testapp&#8221; wäre dies dann &#8220;testapp_DeveloperProfile&#8221;. Im letzten Schritt lädt man das &#8220;Development Provisioning Profile&#8221; herunter und zieht es auf das Icon von Xcode.</p>
<p><a href="http://www.soraxdesign.de/wp-content/uploads/2010/03/profile_dev.jpg"><img src="http://www.soraxdesign.de/wp-content/uploads/2010/03/profile_dev-300x163.jpg" alt="" title="profile_dev" width="500" class="aligncenter size-medium wp-image-507" /></a></p>
<p><strong>Einrichten in Xcode</strong><br />
In Xcode kann man über &#8220;Window&#8221; -> &#8220;Organizer&#8221; eine Übersicht aller Geräte (iPhones) bekommen, welche am Mac angeschlossen waren und/oder als Entwicklergeräte zugelassen sind.<br />
Dort sollte das aktuelle iPhone auftauchen, wenn dieses angeklickt wird, erscheint in der &#8220;Provisioning&#8221; &#8211; Liste das eben erstellte Profil:</p>
<p><a href="http://www.soraxdesign.de/wp-content/uploads/2010/03/xcode_organizer.jpg"><img src="http://www.soraxdesign.de/wp-content/uploads/2010/03/xcode_organizer-300x193.jpg" alt="" title="xcode_organizer" width="500" class="aligncenter size-medium wp-image-508" /></a></p>
<p>Wurden alle Schritte erfolgreich abgeschlossen, kann die Applikation per &#8220;Clean all&#8221; gesäubert werden und danach per &#8220;Build &#038; Go&#8221; auf das angeschlossene iPhone übertragen werden.<br />
Es empfielt sich, Xcode vorher neu zu starten.</p>
<p>Hier ist noch einmal eine sehr ausführliche Anleitung mit vielen Bildern zu diesem Thema:<br />
<a href="http://mobiforge.com/developing/story/deploying-iphone-apps-real-devices">http://mobiforge.com/developing/story/deploying-iphone-apps-real-devices</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.soraxdesign.de/2010/05/22/einrichten-iphone-als-entwicklertelefon-xcode/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tutorial und Tips: Dokumentation von Quelltext mit Doxygen</title>
		<link>http://www.soraxdesign.de/2009/11/26/dokumentation-quelltextdoxygen-objective-c-java/</link>
		<comments>http://www.soraxdesign.de/2009/11/26/dokumentation-quelltextdoxygen-objective-c-java/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 23:43:43 +0000</pubDate>
		<dc:creator>rené</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Dokumentation]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.soraxdesign.de/?p=376</guid>
		<description><![CDATA[Nicht nur wenn ein Projekt größer wird, sondern prinzipiell immer sollten sowohl Quellcode als auch das Projekt ansich dokumentiert werden, damit spätere Entwickler weniger Einarbeitungszeit benötigen und nicht erst den Quellcode durcharbeiten müssen, um das Projekt zu verstehen.]]></description>
			<content:encoded><![CDATA[<p>Nicht nur wenn ein Projekt größer wird, sondern prinzipiell immer sollten sowohl Quellcode als auch das Projekt an sich dokumentiert werden, damit spätere Entwickler weniger Einarbeitungszeit benötigen und nicht erst den Quellcode durcharbeiten müssen, um das Projekt zu verstehen.<br />
Heute möchte ich auf einen Teil der Dokumentation eingehen, manchmal auch als technische Dokumentation bezeichnet (obwohl sich darüber die Geister streiten, was eine <em>technische Dokumentation</em> genau definiert, wie man <a href="http://www.transline.de/transline-tecNews/technische-dokumentation-im-wandel-anforderungen-redaktionssysteme-docuglobe" title="Die Technische Dokumentation im Wandel">hier</a> <a href="#1068996153">[1]</a>,  <a href="http://www.comet.de/technische_redaktion/technische_dokumentation.php" title="Was ist Technische Dokumentation?">hier</a> <a href="#1068996154">[2]</a> oder <a href="http://www.indoition.com/de/qualitaet-software-dokumentation.htm" title="Checkliste zur Qualitätssicherung Technischer Dokumentation">hier</a> <a href="#1068996155">[3]</a> nachlesen kann.), dem Quellcode.<br />
<span id="more-376"></span></p>
<p>Unterstützung erhält man dabei durch eine Software namen Doxygen. Diese kann anhand der Projektstruktur mit Bibliotheken, Klassen und Verzeichnissen eine ansehliche Dokumentation erstellen.<br />
Wichtig ist, dass der Quellecode im <a href="http://de.wikipedia.org/wiki/Javadoc" title="Javadoc - was ist das und wie nutze ich es?">Javadoc</a> <a href="#1068996156">[4]</a> Stil kommentiert wird. Ein Beispiel:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">/**<br />
Addiert zwei Zahlen und gibt deren Summe zurück.<br />
@param $number1 erster Summand<br />
@param $number2 erster Summand<br />
@return Summe der beiden Zahlen<br />
@see subtract() subtrahiert zwei Zahlen voneinander<br />
*/<br />
private function calc($number1, $number2) {<br />
return $number1 + $number2;<br />
}</div></div>
<p>Schnell erkennt man, dass ich die Parameter eine Funktion <em>calc</em> mit <em>@param</em> beschreibe, davor kommt eine allgemeine Funktionsbeschreibung, um die Aufgabe der Funktion zu verdeutlichen. Sollte die Funktion keinen Rückgabewert haben, lässt man @return einfach weg. Der Parameter @see beschreibt einen Verweis auf eine andere Funktion, die evtl. mit dieser im Zusammenhang steht oder ähnliche Funktionalität aufweist.</p>
<p>Der Kopf einer Klasse sollte immer folgendes Format besitzen (die meisten IDEs wie z.B. Eclipse generieren diesen automatisch):</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">/**<br />
&nbsp;* Ein Hello-World-Programm in Java.<br />
&nbsp;* Dies ist ein Javadoc-Kommentar.<br />
&nbsp;*<br />
&nbsp;* @author René<br />
&nbsp;* @version 1.0<br />
&nbsp;*/</div></div>
<p>Nachdem ihr jetzt grundlegend wisst, wie eure Klassen &#8220;lesbar&#8221; gemacht werden, geht es daran, <a href="http://www.stack.nl/~dimitri/doxygen/" title="<br />
Source code documentation generator tool">Doxygen</a> <a href="#1068996157">[5]</a> zu konfiguieren. Ich arbeit selbst am Mac und werde daher hier auf die Macversion eingehen, habe aber auch mit der Windowsversion gearbeitet und es gibt keinen Unterschied.<br />
Öffnet Doxygen und startet den Wizard. Viele Sachen sollten selbsterklärend sein, hier aber einige Tips oder Fallstricke:</p>
<p><strong>Step 1</strong><br />
Gebt hier den Pfad zum Installationsordner (!) von Doxygen an.</p>
<p><strong>Project version or id</strong><br />
Hier müsst ihr immer manuell eine neue Version der Doku eingeben, kann ich nur empfehlen, wenn ihr an einem Projekt arbeitet, dass sich kontinuierlich (im Team) entwickelt.</p>
<p><strong>Specify the directory to scan for sourcecode</strong><br />
Hier wird der eigentliche Projektordner mit euren Klassen, Bibliotheken usw. angegeben.</p>
<div id="attachment_381" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.soraxdesign.de/wp-content/uploads/2009/11/Bild-9.png" target="_blank"><img src="http://www.soraxdesign.de/wp-content/uploads/2009/11/Bild-9-300x232.png" alt="Doxygen Wizard erster Schritt" title="Doxygen Wizard erster Schritt" width="300" height="232" class="size-medium wp-image-381" /></a><p class="wp-caption-text">Doxygen Wizard erster Schritt</p></div>
<p><em>-> Nächster Schritt</em></p>
<p><strong>Select the desired extraction mode</strong><br />
Ich wähle fast immer &#8220;Documented entities only&#8221;, dann erkennt ihr schnell, ob noch Klassen dokumentiert werden müssen, wenn diese nicht in der Doku auftauchen. Der Haken bei &#8220;Include cross-referenced source code in the output&#8221; gefällt mir, denn dann werden in der Doku alle Funktion aufgelistet die auf die aktuelle Funktion zugreifen.</p>
<p><strong>Select programming language to optimize the results for</strong><br />
Hier die entsprechende Sprache wählen oder eine ähnliche. Für Objective-C habe ich z.B. mit &#8220;Java or C#&#8221; gute Erfahrungen gemacht. Einfach auch etwas ausprobieren.</p>
<div id="attachment_385" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.soraxdesign.de/wp-content/uploads/2009/11/Bild-10.png"><img src="http://www.soraxdesign.de/wp-content/uploads/2009/11/Bild-10-300x232.png" alt="Zweiter Schritt im Wizard von Doxygen" title="Zweiter Schritt im Wizard von Doxygen" width="300" height="232" class="size-medium wp-image-385" /></a><p class="wp-caption-text">Zweiter Schritt im Wizard von Doxygen</p></div>
<p><em>-> Nächster Schritt</em></p>
<p><strong>Select the output format(s) to generate</strong><br />
Ich möchte in meinen Dokus immer links einen Frame mit Baumnavigation (<em>&#8220;with frames and a navigation tree&#8221;</em>) haben. Auf die Suchfunktion verzichte ich meistens, hat teilweise Probleme beim Generieren der Doku erzeugt. Ausgabe als Latex ist sehr toll, es entsteht anschließend einer verlinkte refman.tex, welche auf dem Mac z.B. mit <a href="http://www.tug.org/mactex/2009/" title="The MacTeX-2009 Distribution">MacTeX</a> <a href="#1068996158">[6]</a> und der eingabe &#8220;make&#8221; im Terminal in eine PDF umgewandelt werden kann.</p>
<div id="attachment_386" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.soraxdesign.de/wp-content/uploads/2009/11/Bild-11.png"><img src="http://www.soraxdesign.de/wp-content/uploads/2009/11/Bild-11-300x232.png" alt="Dritter Schritt im Wizard von Doxygen" title="Dritter Schritt im Wizard von Doxygen" width="300" height="232" class="size-medium wp-image-386" /></a><p class="wp-caption-text">Dritter Schritt im Wizard von Doxygen</p></div>
<p><em>-> Nächster Schritt</em></p>
<p>Im letzten Schritt kann man sich entscheiden, ob Diagramme der Klassenstrukturen erzeugt werden sollen. Lohnt sich prinzipiell nur, wenn es viele Klassenabhängigkeiten im Projekt gibt. Daher Punkt 2 oder, falls dem nicht so ist, Punkt 1 wählen.<br />
Nachdem der Wizard durchgestanden ist, kann gerne im Reiter &#8220;Run&#8221; auf den Button &#8220;Run Doxygen&#8221; gedrückt werden. Vergesst nicht, eure Profildatei zu speichern!<br />
Geht nichts schief, bekommt ihr, wenn ihr den Button &#8220;Show HTML Output&#8221; mit eurer Maus malträtiert, eine HTML-Seite eurer Doku im Browser präsentiert. Das sieht dann so aus:</p>
<div id="attachment_388" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.soraxdesign.de/wp-content/uploads/2009/11/Bild-8.png"><img src="http://www.soraxdesign.de/wp-content/uploads/2009/11/Bild-8-300x246.png" alt="Ausgabe der HTML Doku" title="Ausgabe der HTML Doku" width="300" height="246" class="size-medium wp-image-388" /></a><p class="wp-caption-text">Ausgabe der HTML Doku</p></div>
<p>Kommen wir nun zu einigen Experteneinstellungen, die ihr im zweiten Reiter findet. Dort sind einige Einstellungen versteckt, die teilweise sehr wichtig sind.</p>
<p><strong>-> Project</strong></p>
<p><strong>OUTPUT_LANGUAGE</strong><br />
Sprachumstellung auf Deutsch, so dass einige Standardbegriffe in der Doku auf Deutsch erscheinen (&#8220;File List&#8221; -> &#8220;Auflistung der Dateien&#8221;). Es sind aber noch nicht alle Begriffe übersetzt.</p>
<p><strong>STRIP_FROM_PATH</strong><br />
Wollt ihr in eurer Doku nicht immer my/project/with/long/path/to/the/classes/Hello.java zu stehen habe, dann gebt dort den Pfad ein, der abgeschnitten werden soll. (in diesem Falle &#8220;my/project/with/long/path/to/the/classes&#8221;).</p>
<p><strong>SEPARATE_MEMBER_PAGES</strong><br />
Seid ihr ein eifriger Kommentator und schreibt auch was zu euren Klassenvariablen, könnt ihr eure Romane auf einzelnen Seiten ausgeben lassen.</p>
<p><strong>-> Build</strong></p>
<p><strong>EXTRACT_ALL</strong><br />
Soll wirklich alles und nicht nur dokumentierte Klassen bearbeitet werden, setzt ihr hier einfach einen Haken. Dann werden aber wirklich alle (!) Dateien, Variablen und Methoden in die Doku aufgenommen. Das kann auch noch verfeinert werden, indem ihr EXTRACT_PRIVATE explizit auswählt, so dass auch private Klassenvariablen ausgelesen werden.</p>
<p><strong>-> Input</strong></p>
<p><strong>INPUT_ENCODING</strong><br />
Hier tragt ihr am besten &#8220;ISO-8859-1&#8243; ein, wenn eure Dateien nicht im UTF-8 Format abgespeichert sind, sonst bekommt ihr in eurer Doku nur Zeichensalat. </p>
<p><strong>EXCLUDE</strong><br />
Sehr wichtige Einstellunge. Oftmals liegen in einem Projekt Testdateien oder -klassen, die man ungern in der Doku haben möchte. Klar kann man anwählen, dass man nur dokumentierte Dateien aufnehmen möchte, aber die Holzhammermethode ist das explizite ausschliessen bestimmter Dateien. </p>
<p><strong>-> HTML</strong></p>
<p><strong>HTML_HEADER, HTML_FOOTER, HTML_STYLESHEET </strong><br />
Über HTML_HEADER kann eine eigene HTML-Datei für den Kopf festgelegt werden, das gleiche gilt für den Footer. HTML_STYLESHEET bietet die Möglichkeit, die Standard-CSS von Doxygen zu verändern bzw. zu überschreiben. Vergesst nicht, eure verlinkten Dateien aus externen HTML-Dateien bzw. die CSS in den Zielordner eurer Doku zu kopieren.</p>
<p><strong>TREEVIEW_WIDTH</strong><br />
Hier könnt ihr die Breite des linken Frames mit der Baumstruktur festlegen. Oftmals sind 250px einfach zu schmal und bei heutigen Auflösungen auch unnötig klein.</p>
<p>So sähe dann übrigens die PDF Datei aus, wenn ihr sie durch MacTeX jagt:<br />
<a href='http://www.soraxdesign.de/wp-content/uploads/2009/11/refman.pdf'>Dokumentation</a></p>
<p>Was heisst &#8220;technische Dokumentation&#8221; für euch? Womit dokumentiert ihr eure Projekte und habt ihr Tips für Doxygen oder was man anders machen könnte? Womit bildet ihr eure Datenbankmodelle ab und was habt ihr für Erfahrungen damit? Über einen Kommentar würde ich mich freuen!</p>
<p><strong>Quellen</strong><br />
<ul>	<li><a name="10689961531"></a>[1] Die Technische Dokumentation im Wandel: <a href="http://www.transline.de/transline-tecNews/technische-dokumentation-im-wandel-anforderungen-redaktionssysteme-docuglobe">http://www.transline.de/transline-tecNews/technische-dokumentation-im-wandel-anforderungen-redaktionssysteme-docuglobe</a></li>	<li><a name="10689961542"></a>[2] Was ist Technische Dokumentation?: <a href="http://www.comet.de/technische_redaktion/technische_dokumentation.php">http://www.comet.de/technische_redaktion/technische_dokumentation.php</a></li>	<li><a name="10689961553"></a>[3] Checkliste zur Qualitätssicherung Technischer Dokumentation: <a href="http://www.indoition.com/de/qualitaet-software-dokumentation.htm">http://www.indoition.com/de/qualitaet-software-dokumentation.htm</a></li>	<li><a name="10689961564"></a>[4] Javadoc - was ist das und wie nutze ich es?: <a href="http://de.wikipedia.org/wiki/Javadoc">http://de.wikipedia.org/wiki/Javadoc</a></li>	<li><a name="10689961575"></a>[5] <br />
Source code documentation generator tool: <a href="http://www.stack.nl/~dimitri/doxygen/">http://www.stack.nl/~dimitri/doxygen/</a></li>	<li><a name="10689961586"></a>[6] The MacTeX-2009 Distribution: <a href="http://www.tug.org/mactex/2009/">http://www.tug.org/mactex/2009/</a></li></ul></p>
]]></content:encoded>
			<wfw:commentRss>http://www.soraxdesign.de/2009/11/26/dokumentation-quelltextdoxygen-objective-c-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial: Mehrsprachige Anwendungen in Flex 3</title>
		<link>http://www.soraxdesign.de/2009/10/22/tutorial-mehrsprachige-anwendungen-in-flex-3-runtime-localization/</link>
		<comments>http://www.soraxdesign.de/2009/10/22/tutorial-mehrsprachige-anwendungen-in-flex-3-runtime-localization/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 20:21:41 +0000</pubDate>
		<dc:creator>rené</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[Flash Player]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Mehrsprachigkeit]]></category>
		<category><![CDATA[MXML]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.soraxdesign.de/?p=269</guid>
		<description><![CDATA[Wer schon einmal vor der Aufgabe stand, eine Flex Projekt mehrsprachig zu gestalten, dem bieten sich beim ersten Überlegen mehrere Lösungen an:

ein Array für jede Sprache
XML Datei
eine Datenbank, mit einer Serversprache und Stream über AMF
&#8230;bestimmt noch viele weitere Lösungen

Jedoch hat sich Adobe Gedanken gemacht und eine recht elegante Lösung für Flex 3 vorgesehen: Runtime Localization [...]]]></description>
			<content:encoded><![CDATA[<p>Wer schon einmal vor der Aufgabe stand, eine Flex Projekt mehrsprachig zu gestalten, dem bieten sich beim ersten Überlegen mehrere Lösungen an:</p>
<ul>
<li>ein Array für jede Sprache</li>
<li>XML Datei</li>
<li>eine Datenbank, mit einer Serversprache und Stream über AMF</li>
<li>&#8230;bestimmt noch viele weitere Lösungen</li>
</ul>
<p>Jedoch hat sich Adobe Gedanken gemacht und eine recht elegante Lösung für Flex 3 vorgesehen: Runtime Localization mit Ressourcen. Dabei gibt es viele Vorteile:<br />
<span id="more-269"></span></p>
<ul>
<li>mehrere Ressourcen (=Sprachen) können in ein Projekt kompiliert werden</li>
<li>Ressourcen werden extern in .properties Dateien gespeichert (Trennung vom Code)</li>
<li>direktes Umschalten zwischen verschiedenen Sprachen (alle Referenzen werden sofort aktualisiert)</li>
<li>auch Sounds, Bilder können &#8220;mehrsprachig&#8221; verknüpft werden</li>
<li>zur Laufzeit können neue Ressourcen aus XML Dateien, Datenbankanfragen erzeugt werden</li>
</ul>
<p>Nun aber zum Tutorial. Erzeugt euch ein Flex 3 Projekt und editiert eure *.mxml Datei wie folgt:</p>
<div class="codecolorer-container mxml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="mxml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000;">&lt;?xml version=<span style="color: #ff0000;">&quot;1.0&quot;</span> encoding=<span style="color: #ff0000;">&quot;utf-8&quot;</span>?<span style="color: #7400FF;">&gt;</span></span><br />
<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Application</span> xmlns:mx=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> layout=<span style="color: #ff0000;">&quot;absolute&quot;</span><span style="color: #7400FF;">&gt;</span></span><br />
    <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Label</span> text=<span style="color: #ff0000;">&quot;@Resource(bundle='myResources', key='SLOGAN')&quot;</span> fontSize=<span style="color: #ff0000;">&quot;20&quot;</span> x=<span style="color: #ff0000;">&quot;10&quot;</span> y=<span style="color: #ff0000;">&quot;40&quot;</span><span style="color: #7400FF;">/&gt;</span></span><br />
    <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:ComboBox</span> x=<span style="color: #ff0000;">&quot;10&quot;</span> y=<span style="color: #ff0000;">&quot;10&quot;</span><span style="color: #7400FF;">&gt;</span><span style="color: #7400FF;">&lt;/mx:ComboBox</span><span style="color: #7400FF;">&gt;</span></span><br />
    <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Image</span> x=<span style="color: #ff0000;">&quot;10&quot;</span> y=<span style="color: #ff0000;">&quot;78&quot;</span> width=<span style="color: #ff0000;">&quot;211&quot;</span> height=<span style="color: #ff0000;">&quot;193&quot;</span><span style="color: #7400FF;">/&gt;</span></span><br />
<span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:Application</span><span style="color: #7400FF;">&gt;</span></span></div></div>
<p>Dabei kann man deutlich erkennen, dass hier eine Ressource mit dem Namen &#8220;myResources&#8221; und dort der Key &#8220;SLOGAN&#8221; aufgerufen wird. Schaltet ihr in die Designansicht, seht ihr, dass das der Inhalt des Attributs <em>text</em> jetzt etwas unschön quer über die Applikation ragt.<br />
Anschließend erzeugt ihr euch in eurem <em>src</em> Ordner einen Ordner <em>locale</em>, darin zwei Ordner <em>de_DE</em> und <em>en_US</em>. In diesen weiterhin jeweils eine Datei namens <strong>myResources.properties</strong> (hier ist die oben erwähnte .properties Datei, außerdem der Link vom <em>text</em> Attribut mit &#8220;myResources&#8221;). Danach sollte eure Ordnerstuktur so ähnlich aussehen:</p>
<p><img src="http://www.soraxdesign.de/wp-content/uploads/2009/10/Bildschirmfoto-2009-10-22-um-21.36.53.png" alt="Ordnerstruktur locale" title="Ordnerstruktur locale" width="267" height="200" align="center"/></p>
<p>Anschließend müsst ihr unbedingt die Kodierung der Dateien auf UTF-8 setzen. Dazu Rechtsklick auf die myResources.properties -> Eigenschaften. Hier stellt ihr das Text File Encoding auf UTF-8:</p>
<p><a href="http://www.soraxdesign.de/wp-content/uploads/2009/10/Bildschirmfoto-2009-10-22-um-21.44.27.png"><img src="http://www.soraxdesign.de/wp-content/uploads/2009/10/Bildschirmfoto-2009-10-22-um-21.44.27-300x223.png" alt="Umstellung der Kodierung auf UTF-8" title="Umstellung der Kodierung auf UTF-8" width="300" height="223"/></a></p>
<p>Damit der Compiler auch die Ressourcen findet, muss der Pfad zu diesem in dem Compileroptionen angegeben werden. Dazu öffnet ihr die Eigenschaften des Projektes, geht auf Flex Compiler und ergänzt/ersetzt dort um folgendes:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">-locale=en_US -source-path=../locale/{locale}</div></div>
<p>Damit wird dem Flex Compiler mitgeteilt, dass die Standardsprache englisch ist sowie weitere Sprachen im Ordner &#8220;locale&#8221; zu finden sind. Die &#8220;..&#8221; sind entscheidend, da der Flex Compiler einen relativen src-Pfad nimmt und nicht den absoluten wie man ihn im Projektbaum sieht. Scheint noch ein Relikt aus der Betaphase zu sein.</p>
<p>Jetzt sind alle Vorbereitungen getroffen, wenn ihr das Projekt ausführt sollte der Platzhalter <em>SLOGAN</em> durch euren Text aus der Datei en_US/myResources.properties ersetzt werden. Jedoch sprach ich noch vom direkten Umschalten zwischen mehreren Sprachen. Dazu verknüpfen wir die vorhandenen Ressources mit einer Combobox.<br />
Kurz etwas zum Hintergrund des Flex Compilers: Für jede Sprachresource muss für es einen Resource im Frameworkordner des Flex Frameworks (SDK) geben. D.h. für en_US gibt es bereits nach der Installation ein fertiges Sprachpaket unter <em>frameworks/locale/en_US/framework_rb.swc</em>. Wenn wir aber in den Compileroptionen <em>-locale=de_DE</em> angeben, erwartet der Compiler, eben dieses Sprachpaket unter <em>frameworks/locale/<strong>de_DE</strong>/framework_rb.swc</em> zu finden. Das ist aber von Hause aus nicht so. Deswegen müssen wir manuell die Resourcen für unsere Sprachen erzeugen. Diese geschieht recht simpel, indem man die vorhandene (englische) Resource dupliziert.</p>
<p>Für Windows geht dieses mit</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">bincopylocale.exe en_US de_DE</div></div>
<p>sowie unter Mac mit dem Befehl</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">bin/copylocale.sh en_US de_DE</div></div>
<p>Nun aber zur Umschaltung zwischen verschiedenen Sprachen. Folgendermaßen sieht der Code jetzt aus:</p>
<div class="codecolorer-container mxml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="mxml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000;">&lt;?xml version=<span style="color: #ff0000;">&quot;1.0&quot;</span> encoding=<span style="color: #ff0000;">&quot;utf-8&quot;</span>?<span style="color: #7400FF;">&gt;</span></span><br />
<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Application</span> xmlns:mx=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> layout=<span style="color: #ff0000;">&quot;absolute&quot;</span><span style="color: #7400FF;">&gt;</span></span><br />
&nbsp; &nbsp; <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Metadata</span><span style="color: #7400FF;">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; [ResourceBundle(&quot;myResources&quot;)]<br />
&nbsp; &nbsp; <span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:Metadata</span><span style="color: #7400FF;">&gt;</span></span><br />
<br />
&nbsp; &nbsp; <span style="color: #339933;">&lt;mx:Script&gt;</span><br />
<span style="color: #339933;"> &nbsp; &nbsp;&lt;![CDATA[</span><br />
<br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp;[Bindable]</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp;private var locales:Array = [ &quot;en_US&quot; , &quot;de_DE&quot; ];</span><br />
<br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp;private function localeComboBox_initializeHandler(event:Event):void</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp;{</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;localeComboBox.selectedIndex = locales.indexOf(resourceManager.localeChain[0]);</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp;}</span><br />
<span style="color: #339933;"> &nbsp; </span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp;private function localeComboBox_changeHandler(event:Event):void</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp;{</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Set the localeChain to either the one-element Array</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// [ &quot;en_US&quot; ] or the one-element Array [ &quot;de_DE&quot; ].</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resourceManager.localeChain = [localeComboBox.selectedItem];</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp;}</span><br />
<br />
<span style="color: #339933;"> &nbsp; &nbsp;]]&gt;</span><br />
<span style="color: #339933;"> &nbsp; &nbsp;&lt;/mx:Script&gt;</span><br />
&nbsp; &nbsp; <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Label</span> text=<span style="color: #ff0000;">&quot;{resourceManager.getString('myResources', 'SLOGAN')}&quot;</span> fontSize=<span style="color: #ff0000;">&quot;20&quot;</span> x=<span style="color: #ff0000;">&quot;10&quot;</span> y=<span style="color: #ff0000;">&quot;40&quot;</span><span style="color: #7400FF;">/&gt;</span></span><br />
&nbsp; &nbsp; <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:ComboBox</span> x=<span style="color: #ff0000;">&quot;10&quot;</span> y=<span style="color: #ff0000;">&quot;10&quot;</span> id=<span style="color: #ff0000;">&quot;localeComboBox&quot;</span> dataProvider=<span style="color: #ff0000;">&quot;{locales}&quot;</span></span><br />
<span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; initialize=<span style="color: #ff0000;">&quot;localeComboBox_initializeHandler(event)&quot;</span></span><br />
<span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; change=<span style="color: #ff0000;">&quot;localeComboBox_changeHandler(event)&quot;</span><span style="color: #7400FF;">/&gt;</span></span><br />
&nbsp; &nbsp; <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Image</span> x=<span style="color: #ff0000;">&quot;10&quot;</span> y=<span style="color: #ff0000;">&quot;78&quot;</span> width=<span style="color: #ff0000;">&quot;211&quot;</span> height=<span style="color: #ff0000;">&quot;193&quot;</span> source=<span style="color: #ff0000;">&quot;{resourceManager.getString('myResources', 'IMGSRC')}&quot;</span><span style="color: #7400FF;">/&gt;</span></span><br />
<span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:Application</span><span style="color: #7400FF;">&gt;</span></span></div></div>
<p>Die wichtigste Veränderung stellt die Ersetzung aller &#8220;@Resource(bundle&#8230;.&#8221; durch &#8220;{resourceManager.getString(&#8230;&#8221; dar. Damit greift ihr direkt auf den resourceManager zu, welchem ihr über die Combobox verschiedene Sprachresourcen zuweisen könnt. Dabei ist <em>localeChain</em> der entscheidene Begriff.<br />
Im Download und der Demo findet ihr auch ein Beispiel für &#8220;mehrsprachige&#8221; Bilder. </p>
<p><a href="http://www.soraxdesign.de/examples/20091023_flex3_localization/BLOG_Localization.html">Demo</a><br />
<a href='http://www.soraxdesign.de/wp-content/uploads/2009/10/Flex3_Localization.zip'>Download Beispiel</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.soraxdesign.de/2009/10/22/tutorial-mehrsprachige-anwendungen-in-flex-3-runtime-localization/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tutorial: ExternalInterface &#8211; Zusammenspiel von SWF und JavaScript</title>
		<link>http://www.soraxdesign.de/2009/08/24/externalinterface-zusammenspiel-von-swf-und-javascript/</link>
		<comments>http://www.soraxdesign.de/2009/08/24/externalinterface-zusammenspiel-von-swf-und-javascript/#comments</comments>
		<pubDate>Mon, 24 Aug 2009 20:37:05 +0000</pubDate>
		<dc:creator>rené</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.soraxdesign.de/?p=170</guid>
		<description><![CDATA[Manchmal ist es nötig, SWF Dateien mit dem aktuellen Container (meistens eine umschliessende HTML Seite) korrespondieren zu lassen. Ob nun Inhalte in Formularen geändert, Seitenwechsel oder auch das Zusammenspiel mit anderen SWF Dateien geschehen soll, kann dies über JavaScript gelöst werden. Eine Schnittstelle bietet dabei die ExternalInterace Klasse von ActionScript 3.

Früher war diese Funktion unter [...]]]></description>
			<content:encoded><![CDATA[<p>Manchmal ist es nötig, SWF Dateien mit dem aktuellen Container (meistens eine umschliessende HTML Seite) korrespondieren zu lassen. Ob nun Inhalte in Formularen geändert, Seitenwechsel oder auch das Zusammenspiel mit anderen SWF Dateien geschehen soll, kann dies über JavaScript gelöst werden. Eine Schnittstelle bietet dabei die <em>ExternalInterace </em>Klasse von ActionScript 3.<br />
<span id="more-170"></span><br />
Früher war diese Funktion unter dem Namen <em>fscommand()</em> bekannt und hat diese ersetzt.</p>
<p>Um von JavaScript auf eine Methode in ActionScript zuzugreifen, muss diese dem Flash Player bekannt gemacht werden. Dieser erfolgt mit der Methode <em>addCallback()</em>:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ExternalInterface.addCallback(&quot;setTextFromJS&quot;, setText);</div></div>
<p>Dabei wird die (JavaScript)Methode &#8220;setTextFromJS&#8221; dem Flash Player und somit dem ExternalInterface bekannt gemacht. Die zweite Variable legt die Funktion fest, die in ActionScript aufgerufen werden soll.<br />
Nun kann mit der aktuelle SWF Container in der HTML Seite über dessen Namen angesprochen werde und die Methode aufgerufen werden. Parameterübergabe funktioniert wie gehabt in JavaScript:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">function thisMovie(movieName)<br />
{<br />
if (navigator.appName.indexOf(&quot;Microsoft&quot;) != -1) {<br />
return window[movieName];<br />
} else {<br />
return document[movieName];<br />
}<br />
}<br />
function sendToActionScript(value) {<br />
thisMovie(&quot;ExternalInterfaceExample&quot;).sendToActionScript(value);<br />
}</div></div>
<p>Natürlich ist dies auch umgekehrt möglich. Über die Funktion</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ExternalInterface.call('setTextFromAS', s);</div></div>
<p>kann aus ActionScript heraus eine JavaScript Funktion aufgerufen werden mit Parameterübergabe. Soweit ich weiß, kommt immer ein String an. Der Parameter <em>s</em> kann dabei ein Wert sein, der von ActionScript an JavaScript gesendet werden soll.</p>
<p>Hier habe ich ein Beispiel online gestellt. Der übergebene Text aus dem Textfeld wird an die SWF gesendet und anschließend wieder an JavaScript und in ein zweites Textfeld geschrieben.</p>
<p><a href="http://www.soraxdesign.de/wp-content/uploads/2009/08/BLOG_ExternalApplication.html" target="_blank">Beispiel</a><br />
<a href='http://www.soraxdesign.de/wp-content/uploads/2009/08/ExternalInterfaceExample.zip'>Download des Beispielcodes</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.soraxdesign.de/2009/08/24/externalinterface-zusammenspiel-von-swf-und-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

