smart developer Ein Code für alle (Vorschau)
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
DVD<br />
Mit DVD: SDKs <strong>für</strong> Android,<br />
Bada, MeeGo, Qt und Symbian!<br />
Bada: Wave II im TEst,<br />
Die Eigene App mit<br />
Gesichtserkennung<br />
Alles zum Thema mobile betriebssysteme<br />
neues magazin!<br />
<strong>Ein</strong> <strong>Code</strong><br />
<strong>für</strong> <strong>alle</strong><br />
Programmieren Sie plattformunabhängig<br />
mit html5 & Co.<br />
HTML5-Apps mit PhoneGap und Jo<br />
Monkey <strong>Code</strong>r <strong>für</strong> Android und iOS<br />
Enterprise Generation Language<br />
Praxis<br />
MeeGo-Entwicklung<br />
Meistern Sie die ersten<br />
Schritte <strong>für</strong> Ihre MeeGo-App<br />
Workshop<br />
WP7-Spiele<br />
So entwickeln Sie Games <strong>für</strong><br />
Windows Phone 7 mit XNA<br />
im test<br />
Ideos X5<br />
Günstiger Android-<br />
Allrounder von Huawei<br />
Entwicklung<br />
Android-Workshops: Nützliche Tools<br />
und Programmieren mit BRisa UPnP<br />
www.<strong>smart</strong>-<strong>developer</strong>.DE<br />
IM TEST<br />
Dell Venue Pro<br />
WP7-Phone mit Tastatur<br />
Open-GL ES<br />
Schreiben Sie mit OpenGL ES und<br />
unserem Workshop coole 3D-Apps<br />
<strong>für</strong> Android-Smartphones<br />
5 SDKs<br />
auf DVD<br />
Filesharing<br />
mit dem iPad<br />
So nutzen Sie das<br />
Filesharing-Feature<br />
unter iOS von Apple<br />
Benchmarks<br />
Acht Benchmark-<br />
Programme <strong>für</strong><br />
Android und iOS,<br />
die Sie kennen sollten<br />
Desire HD<br />
Android-<br />
Handy mit<br />
riesigem<br />
Display<br />
ActionScript<br />
Programmieren Sie<br />
Ihre erste App <strong>für</strong>s<br />
BlackBerry PlayBook<br />
02 / 2011<br />
Deutschland EUR 7,90<br />
A EUR 8,70 - BeNeLux EUR 9,25<br />
CH sfr 15,80 - E / I EUR 10,25<br />
4 192182 907904 02
Virtualisierung<br />
Die besten Virtualisierer und die<br />
Features ihrer Produkte im Vergleich:<br />
• VMware<br />
• Hyper-V<br />
• Oracle VM<br />
• Citrix Xen Server<br />
• Qemu<br />
• ConVirt<br />
• OpenQRM<br />
• Red Hats RHEV<br />
• KVM<br />
• Novell<br />
• Proxmox<br />
Große<br />
Technical Review<br />
Marktstudie<br />
Powered by<br />
www.admin-magazin.de<br />
ADMIN<br />
Netzwerk & Security<br />
© Dmitry Sunagatov, Fotolia.und Diego Alíes, 123RF<br />
Mehr als<br />
500 Stunden<br />
Recherche, Tests<br />
und Vergleiche<br />
<strong>für</strong> nur<br />
98 Euro<br />
und andere<br />
Leseprobe mit 10 Seiten unter<br />
www.admin-magazin.de/tr-studie
Service<br />
Editorial<br />
Marcel Hilzinger,<br />
Chefredakteur<br />
Willkommen bei Smart Developer<br />
Friedliche<br />
Coexistenz<br />
Sehr geehrte Leserinnen und Leser,<br />
vor gut drei Monaten schrieb ich mein erstes<br />
Editorial <strong>für</strong> Smart Developer zum Thema<br />
Tablets, Apple und Android. Rückblickend<br />
lässt sich daraus ein Schluss ziehen: Der<br />
Smartphone-Markt ist unheimlich spannend!<br />
In den vergangenen Monaten hat unter anderem<br />
Microsoft Skype übernommen und sich<br />
mit Nokia zusammengeschlossen, sich das<br />
Xoom als Ladenhüter herausgestellt und RIM<br />
endlich sein PlayBook zum Verkauf freigegeben.<br />
Google hat zudem seinen Musikdienst<br />
gestartet und will in Zukunft<br />
mit den großen Telcos und<br />
Hardware-Anbietern <strong>für</strong> eine<br />
einheitlichere Android-Plattform<br />
sorgen.<br />
Als Smartphone-Fan findet<br />
man das <strong>alle</strong>s ganz toll und<br />
spannend, schließlich tut<br />
sich etwas. Als Entwickler<br />
stellt sich hingegen die<br />
Frage: wo investieren, welche<br />
Plattform und welche<br />
Technik wird sich durchsetzen?<br />
Glaubt man den Schätzungen einiger Analysten,<br />
dann wird – neben dem aktuell dominanten<br />
Android – Windows Phone 7 der<br />
große Aufsteiger der kommenden 12 bis 24<br />
Monate [1]. Doch sieht man sich Statistiken<br />
der gleichen Analysten vom vergangenen<br />
Jahr an, dann zeigt sich schnell, was solche<br />
Langzeitprognosen taugen.<br />
Welche Technik?<br />
Auch bei den Frameworks stellt sich die<br />
Frage nach dem Wohin: soll man sich auf<br />
eine oder zwei Plattformen konzentrieren<br />
und da<strong>für</strong> native Apps entwickeln oder doch<br />
lieber einen plattformunabhängigen Ansatz<br />
wählen? <strong>Ein</strong>ige mögliche Antworten darauf<br />
gibt ihnen der aktuelle Schwerpunkt im Heft.<br />
Besonders spannend finde ich das Phone-<br />
Gap-Projekt, da es native und HTML5-Anwendungen<br />
unterstützt.<br />
Haben Sie sich bis jetzt auf eine Plattform<br />
konzentriert, dann werfen Sie doch mal<br />
einen Blick auf unsere Workshops zu Android,<br />
Bada, Windows Phone 7 und webOS.<br />
Gerade bei den Mauerblümchen Bada und<br />
webOS könnte sich in Naher Zukunft einiges<br />
tun, da bei Samsung der Sprung auf Bada 2.0<br />
ansteht und HP mit<br />
„Dem Nutzer<br />
ist es egal,<br />
ob eine App<br />
nativ oder in<br />
HTML5 ist!“<br />
webOS 3.0 als zusätzlicher<br />
Player in<br />
den Tablet-Market<br />
einsteigt. Bei den<br />
noch relativ jungen<br />
mobilen Betriebssystemen<br />
genießen Sie<br />
als Entwickler<br />
zudem den Vorteil,<br />
dass der Nutzer sich<br />
nicht zwischen Hunderten<br />
von Anwendungen entscheiden muss,<br />
sondern vielleicht nur Sie eine App <strong>für</strong> den<br />
gewünschten Zweck bereitstellen. Stimmt die<br />
Qualität, dann dürfen Sie <strong>für</strong> die App auch<br />
ruhig ein paar Euro verlangen.<br />
Nun wünsche ich gute Unterhaltung mit<br />
der aktuellen Ausgabe von Smart Deve loper<br />
und hoffe, dass Sie das Heft nützlich finden.<br />
Möchten Sie Smart Developer regelmäßig<br />
lesen, dann empfehle ich Ihnen unser Jahresabo<br />
<strong>für</strong> 27 Euro oder <strong>für</strong> 24 Euro als PDF:<br />
http:// www. <strong>smart</strong>‐<strong>developer</strong>. de/ Abo<br />
Mit <strong>smart</strong>en Grüßen,<br />
Marcel Hilzinger<br />
Infos<br />
[1] Marcel Hilzinger:<br />
„Widersprüchliche Zahlen –<br />
Analysten legen Schätzungen<br />
zum Smartphone-Markt<br />
2015 vor“,<br />
http:// www. <strong>smart</strong>‐<strong>developer</strong>.<br />
de/ Online/ News/<br />
Widerspruechliche‐Zahlen<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 3
Smart Developer<br />
Inhalt<br />
Mobile Entwicklung und Trends<br />
38<br />
Wave II: Das<br />
Samsung-Handy<br />
tritt in die Fußstapfen des<br />
bisher erfolgreichsten Bada-<br />
Smartphones.<br />
Service<br />
3 Editorial<br />
6 News<br />
98 Impressum und<br />
<strong>Vorschau</strong><br />
12<br />
HTML5: Mit Jo und<br />
PhoneGap entwickeln<br />
Sie HTML5-Anwendungen <strong>für</strong><br />
Android, iOS und weitere<br />
Plattformen.<br />
Schwerpunkt<br />
12 Jo & PhoneGap<br />
HTML5-Programmierung mit<br />
nativer <strong>Code</strong>-Unterstützung.<br />
20 Monkey <strong>Code</strong>r<br />
Die neue Programmiersprache<br />
sorgt <strong>für</strong> plattformübergreifende<br />
Anwendungen.<br />
24 Mobile Grundlagen<br />
Diese Tipps sollten Entwickler<br />
mobiler Apps beachten.<br />
28 EGL von IBM<br />
Auch Großrechner mögen<br />
Smartphones dank EGL.<br />
Hardware<br />
32 Dell Venue Pro<br />
Wie gut ist das Windows Phone 7?<br />
34 Motorola Defy<br />
Kann das Android-Handy wirklich so<br />
viel einstecken?<br />
36 Huawei Ideos X5<br />
Günstiges Mittelklasse-Smartphone<br />
von Huawei mit Android 2.2.1.<br />
37 Desire HD<br />
Echt großes<br />
Display.<br />
38 Wave II<br />
Das neue<br />
Bada-Handy<br />
von Samsung<br />
4<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Smart Developer<br />
72<br />
ActionScript: Mit<br />
der Programmiersprache<br />
von Adobe<br />
schreiben Sie schnell Apps<br />
<strong>für</strong> das PlayBook.<br />
Inhalt<br />
24<br />
Für <strong>alle</strong>: So machen<br />
Sie Ihre App <strong>für</strong> <strong>alle</strong><br />
Plattformen fit.<br />
20 Monkey:<br />
Die plattformunabhängige<br />
Sprache<br />
macht HTML5, C++, C#,<br />
Java und mehr.<br />
Praxis<br />
40 iPad-Apps <strong>für</strong> Sysadmins<br />
Diese fünf Tools erleichtern Ihre<br />
Arbeit auf dem iPad.<br />
44 Gmote-Fernbedienung<br />
Steuern Sie Ihren PC mit Android.<br />
47 MeeGo-<strong>Ein</strong>führung<br />
So funktioniert das MeeGo-Projekt<br />
und die MeeGo-Software.<br />
50 BRisa UPnP<br />
<strong>Ein</strong>stieg in die UPnP-<br />
Programmierung mit Qt.<br />
Entwicklung<br />
54 iOS-Filesharing<br />
So tauschen Sie Dateien zwischen<br />
iTunes und einem iPad aus.<br />
60 Windows-Phone-7-Spiele<br />
<strong>Ein</strong>steigerworkshop zur WP7-Entwicklung<br />
mit XNA.<br />
Entwicklung<br />
66 Bada-Gesichtserkennung<br />
So setzen Sie die Face-Recognition-Funktion<br />
des SDK ein.<br />
72 PlayBook-Programmierung<br />
<strong>Ein</strong>stieg in ActionScript.<br />
78 WebOS Ares<br />
Programmieren im Browser.<br />
84 Android und OpenGL ES<br />
Die ersten Schritte in 3D.<br />
90 Android-Werkzeuge<br />
Tools jenseits des offiziellen SDKs<br />
Power User<br />
94 WebOS 2.1<br />
Die Neuerungen von webOS 2.1,<br />
so funktioniert das Upgrade.<br />
96 Benchmarks<br />
Mit diesen Programmen messen<br />
Sie die Smartphone-Leistung<br />
Wichtige<br />
Information!<br />
Auf der DVD<br />
Aufgrund eines verlagsinternen<br />
Produktionsfehlers stimmen die<br />
Angaben auf dem DVD-Label<br />
nicht mit dem Inhalt der DVD<br />
überein. Insbesondere fehlt das<br />
auf dem DVD-Label angekündigte<br />
Java-OpenBook vom Galileo-Verlag.<br />
Wir liefern das Buch auf der<br />
Heft-DVD von Smart Developer<br />
03/2011 nach.<br />
Folgende SDKs finden Sie auf der<br />
DVD: Android Level 10 und 11,<br />
Bada 1.2, MeeGo 1.2, Qt-Nokia<br />
1.0.2, Symbian^3 v09<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 5
NEWS<br />
Aktuelles<br />
Mobile<br />
News<br />
higyou, 123RF<br />
Xoom startet in den<br />
USA verhalten<br />
Android Ice Cream<br />
Sandwich<br />
motorola.com<br />
Das erste Android-Tablet mit Android 3.0<br />
ist seit Ende April nun auch in Deutschland<br />
erhältlich, im Mai soll ein Update auf Version<br />
3.1 folgen. Zunächst gibt es das Xoom<br />
in der 3G-Version exklusiv<br />
bei der deutschen<br />
Telekom, ab<br />
August sollen es auch<br />
andere Händler anbieten<br />
dürfen. Laut Motorola<br />
hat man vom<br />
10-Zoll-Tablet in den<br />
USA rund 250 000<br />
Stück verkauft, Zahlen<br />
aus Europa liegen<br />
noch keine vor. Inzwischen<br />
haben auch<br />
Das Xoom legte in den USA einen eher verhaltenen Start hin Sony Ericsson und<br />
und ist jetzt auch in Europa verfügbar.<br />
HTC ihre Pläne <strong>für</strong> 10-<br />
Zoll-Android-Tablets<br />
angekündigt, andere Hersteller wie Acer<br />
und Asus sind bereits mit entsprechenden<br />
Geräten auf dem asiatischen Markt.<br />
Wie bereits angekündigt will Google die<br />
<strong>Code</strong>basis von Android 2.x und 3.x wieder<br />
zusammenführen, um <strong>für</strong> eine einheitliche<br />
Plattform zu sorgen. Auf der Hausmesse<br />
Google I/O hat man nun den <strong>Code</strong>namen<br />
der nächsten großen Android-Version bekanntgegeben:<br />
Ice Cream Sandwich. Über<br />
die geplanten Features gibt es noch keine<br />
Infos, das Release ist <strong>für</strong> Q4 geplant.<br />
Die nächste größere Android-Version trägt den<br />
<strong>Code</strong>namen Ice Cream Sandwich.<br />
Facebook macht mobil<br />
Jeder dritte Beitrag auf Facebook<br />
stammt mittlerweile von mobilen<br />
Endgeräten, zeigt eine aktuelle Analyse<br />
von 70.000 Datensätzen durch<br />
Hubspot-Mitarbeiter Dan Zarrella,<br />
einem der führenden Social-Media-<br />
Experten in den USA. Der untersuchte<br />
Datensatz umfasste dabei einfache<br />
Statusmeldungen und geteilte<br />
Links, Fotos und Videos. Bei der mobilen<br />
Nutzung führend ist die mobile<br />
Website m. facebook. com, die <strong>für</strong><br />
18,78 Prozent <strong>alle</strong>r Beiträge genutzt<br />
wurde. Die Facebook-Apps <strong>für</strong> Android,<br />
iPhone und Blackberry kommen<br />
auf jeweils über 4 Prozent. Insgesamt<br />
wurden 32,69 Prozent der<br />
Beiträge mobil veröffentlicht.<br />
Dass Social Media ein wichtiger<br />
Wachstumstreiber des Mobile Webs<br />
ist, zeigt auch eine aktuelle Studie<br />
von Comscore: In England wuchs die<br />
Zahl der Menschen, die täglich Social<br />
Media mit ihren Smartphones oder<br />
Tablets nutzen, binnen eines Jahres<br />
um 80 Prozent auf 7,9 Mio.<br />
Buchtipp<br />
Unter dem Titel HTML5-<br />
Apps <strong>für</strong> iPhone und Android<br />
haben Markus Spiering<br />
und Sven Haiges beim<br />
Franzis-Verlag ein umfassendes<br />
Handbuch zur mobilen<br />
Entwicklung mit<br />
HTML5, JavaScript und<br />
PhoneGap <strong>für</strong> die plattformübergreifende<br />
Entwicklung veröffentlicht. Das Buch<br />
umfasst rund 350 Seiten, enthält zahlreiche<br />
Schwarz-Weiß-Abbildungen und kostet 30<br />
Euro. <strong>Ein</strong>e Download-Version <strong>für</strong> 20 Euro ist<br />
ebenfalls verfügbar.<br />
6 02/2011 <strong>smart</strong>-<strong>developer</strong>.de<br />
powered by
NEWS<br />
Aktuelles<br />
Sony Ericsson<br />
Neue Xperia Minis von Sony Ericsson<br />
Sony Ericsson legt seine Androiden<br />
Xperia Mini und Xperia Mini<br />
Pro neu auf: Sie enthalten nun Android<br />
2.3, eine HD-Kamera mit 5<br />
Megapixeln und einen 1 Gigahertz-Prozessor.<br />
Zugleich haben<br />
sie nur Scheckkartengröße und<br />
sind damit die kleinsten Smartphones<br />
der Welt.<br />
Sieht gleich aus wie der Vorgänger, bringt<br />
aber deutlich mehr Leistung mit: das neue<br />
Xperia Mini Pro.<br />
Gratis Windows-Phone-7-Workshops<br />
Microsoft verlängert seine Workshops <strong>für</strong> angehende Windows-Phone-7-Programmierer<br />
mit vier neuen Workshops im Juni. Für Interessierte stehen in<br />
Bad Homburg, Unterschleißheim, Köln und Hamburg je 150 Plätze bereit. Die<br />
Teilnahme ist gratis, <strong>alle</strong>rdings bei Firmen auf zwei Personen pro Unternehmen<br />
beschränkt. Detaillierte Informationen zu den Terminen und zum Programm<br />
gibt es unter http://bit.ly/kUXcDR.<br />
Location-based<br />
Services boomen<br />
Locationgate hin oder her: Das Geschäft<br />
mit den standortbasierten Diensten läuft<br />
gut. Location-based Services (LBS) werden<br />
<strong>für</strong> immer mehr Werbungtreibende und<br />
<strong>Ein</strong>zelhändler relevanter, das zeigen gleich<br />
zwei frische Meldungen: Zum einen nutzt<br />
bereits jeder fünfte Werbekunde von Madvertise<br />
die Möglichkeit, mittels Orts-Targeting<br />
gezielt bestimmte Nutzer des Mobile<br />
Web anzusprechen. Zum anderen zeigt die<br />
Managementberatung Mücke, Sturm &<br />
Company in einer Studie, dass Locationbased<br />
Services die Lücke zwischen E-Commerce<br />
und stationärem Handel schließen<br />
können. Bei dem mobilen Werbenetzwerk<br />
von Madvertise ist die Nachfrage nach Location-based<br />
Advertising (LBA) bei Werbekunden<br />
<strong>alle</strong>in in den vergangenen drei Monaten<br />
um 50 Prozent gestiegen, unter anderem<br />
haben MyTaxi und die E-Plus Tochter<br />
Gettings dort bereits entsprechend ausgestattete<br />
Kampagnen gebucht.<br />
1. Lernen Sie!<br />
Ja, „training-on-the-job“, oft praktiziert, aber nicht<br />
überzeugend. Denn die Kollegen haben nie Zeit<br />
<strong>für</strong> echte Erklärungen, außerdem werden „Neue“<br />
sofort von dem vereinnahmt, was im Unternehmen<br />
schon seit Ewigkeiten tradiert wird. Warum gibt's<br />
seit 2000 Jahren Schulen und Universitäten?<br />
„LERNEN“ ist eine vollwertige Tätigkeit, auf die<br />
man sich konzentrieren muß, die man nicht 'mal<br />
eben so nebenbei tun kann, und die immer auch<br />
eine Prise „Erneuerung“ beinhalten sollte!<br />
2. Ineffiziente Arbeit nicht akzeptieren!<br />
Je spezialisierter Sie arbeiten, desto weniger<br />
echte, fachliche Kollegen haben Sie in Ihrem eigenen<br />
Unternehmen. Wir stellen deshalb Gruppen<br />
zusammen, in denen Sie neben hilfsbereiten<br />
Kollegen mit ähnlichen Kenntnissen an IHREM<br />
Projekt arbeiten. Und ständig ist ein fachlicher Berater<br />
anwesend.<br />
„Guided Coworking“ nennen wir das, und es<br />
könnte DIE Lösung <strong>für</strong> so manches Projekt sein,<br />
das in Ihrer Firma „hakt“.<br />
3. Hintergrund<br />
Wer den riesigen OpenSource-Baukasten schnell<br />
beherrschen muß, geht zu einer unserer über 100<br />
Schulungen. Wer das bereits kann, aber schneller<br />
mit seinen Projekten vorankommen will, der<br />
kommt mit seiner Arbeit zum Guided Coworking.<br />
Wir sind eine der erfolgreichsten Schulungseinrichtungen<br />
im gesamten Bereich „OpenSource“<br />
- sowohl <strong>für</strong> Admins, als auch <strong>für</strong> Entwickler.<br />
Siehe www.linuxhotel.de<br />
powered by:<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 7
NEWS<br />
Aktuelles<br />
iPhone 4 nun auch in Weiß<br />
Nachdem die Gerüchte schon lange ein weißes iPhone voraussagten,<br />
stellte Apple im Mai das helle iPhone ohne große Ankündigung<br />
vor. Angeblich traten bei der Produktion des hellen Gehäuses<br />
Probleme mit der Kamera und dem Lichtsensor auf, wodurch<br />
sich die Auslieferung verzögerte. <strong>Ein</strong>igen Berichten im Internet<br />
zufolge, soll Apple aber auch das Design angepasst haben,<br />
um die Empfangsprobleme, die bei den ersten iPhone-4-Modellen<br />
auftraten, zu verhindern. Das weiße iPhone kostet bei Apple in<br />
der 16- GByte-Variante 629 Euro, die 32-GByte-Version schlägt mit<br />
739 Euro zu Buche. Somit unterscheiden sich die Preise nicht vom<br />
schwarzen iPhone.<br />
Beim weißen iPhone 4 hat sich nicht nur die Farbe geändert.<br />
Neue BlackBerrys mit BB OS 7.0<br />
Nokia baut ab<br />
rim.com<br />
RIM hat auf seiner Hausmesse BlackBerry World in Orlando zwei<br />
neue Smartphones mit der neuen BlackBerry-Version OS 7.0<br />
vorgestellt. Beim neuen Bold-Flaggschiff 9900 (bzw. 9930 mit<br />
CDMA-Support) kommt ein 1,2 GHz schneller Single-Core-Prozessor<br />
zum <strong>Ein</strong>satz, das Gerät verfügt zudem über 8 GByte internen<br />
Speicher und NFC-Fähigkeiten. Der 2,8-Zoll-Touchscreen<br />
löst weiterhin mit 640 x 480 Pixeln auf, soll sich aber<br />
durch eine Liquid-Graphics-Technik deutlich besser bedienen<br />
lassen. Obwohl das neue BlackBerry OS auf den ersten<br />
Blick wie der Vorgänger aussieht, soll sich unter der<br />
Haube einiges geändert haben. Benutzer aktueller Black-<br />
Berry-Geräte müssen auf OS 7.0 verzichten, da ein Upgrade<br />
von BB OS 6 auf OS 7.0 nicht geplant sei.<br />
RIM legt den klassischen BlackBerry mit einer neuen OS-Version<br />
und einem verbesserten Display neu auf.<br />
Nokias Konzernumbau und Schwenk<br />
auf Windows Phone 7 kostet weitere<br />
2.000 Menschen ihren Arbeitsplatz: Die<br />
Programmierer <strong>für</strong> Symbian und<br />
MeeGo sind bislang bei Subunternehmern<br />
wie Tieto, Digia und Ixonos beschäftigt.<br />
Damit verlieren insgesamt<br />
6.000 Menschen ihre Jobs. Gleichzeitig<br />
müssen die Finnen den Handy-Thron<br />
in Europa an Samsung abgeben. Die<br />
Koreaner verkauften im abgelaufenen<br />
Quartal auf dem alten Kontinent erstmals<br />
mehr Mobiltelefone als die Finnen,<br />
so Marktforscher IDC. Demnach<br />
kam Samsung auf 29 Prozent Marktanteil<br />
und Nokia auf 28 Prozent.<br />
Amazon mit Android-Tablet<br />
Buchtipp<br />
Der Onlinehändler Amazon macht offenbar<br />
Ernst mit seinen Plänen <strong>für</strong><br />
ein eigenes Android-Tablet, über die<br />
schon seit Wochen spekuliert wird,<br />
und wird dieses laut dem Fachdienst<br />
„Digitimes“ im zweiten Halbjahr<br />
2011 auf den Markt bringen. Der taiwanesische<br />
Auftragsfertiger Quanta<br />
hat demnach bereits einen Auftrag<br />
im Wert von 3,5 Mrd. Dollar <strong>für</strong> die<br />
Produktion des neuen Tablets erhalten.<br />
In Spitzenzeiten sollen 700 000<br />
bis 800 000 <strong>Ein</strong>heiten pro Monat produziert<br />
werden. Quanta ist in der<br />
Branche bereits als Hersteller des<br />
BlackBerry-Tablets PlayBook bekannt,<br />
hat auch einen Tablet-Auftrag<br />
von Sony erhalten und rechnet sich<br />
zudem große Chancen <strong>für</strong> ein Mandat<br />
von Lenovo aus. <strong>Ein</strong> weiterer Lieferant<br />
soll dem Bericht zufolge E-Ink<br />
Holdings sein, ein langjähriger Partner,<br />
der bereits die Display-Technologie<br />
<strong>für</strong> Amazons E-Reader Kindle geliefert<br />
hat. E-Ink soll demnach ein<br />
Display mit „Advanced Fringe Field<br />
Switching“ liefern – das soll den Displayinhalt<br />
auch bei stärker Sonneneinstrahlung<br />
gut leserlich machen:<br />
ein Feature, das bereits den aktuellen<br />
Kindle positiv von Apples iPad unterscheidet.<br />
Schon seit Wochen halten<br />
sich hartnäckig Berichte, wonach<br />
Amazon ein Tablet mit Android plant<br />
– schließlich hatte Amazon erst vor<br />
wenigen Wochen einen eigenen App<br />
Store <strong>für</strong> Android eröffnet und einen<br />
Cloud-Musikdienst gestartet.<br />
Als <strong>Ein</strong>stiegslektüre <strong>für</strong> angehende iPhone-<br />
Entwickler bietet sich das Buch <strong>Ein</strong>stieg in Objective-C<br />
2.0 und Cocoa von Kai Surendorf und<br />
Markus Hardt aus dem Galileo-Verlag an. Auch<br />
wenn sich das rund 500 Seiten dicke Hardcover-Buch<br />
mit zahlreichen Schwarz-Weiß-Abbildungen<br />
in erster Linie um den <strong>Ein</strong>stieg in die<br />
Sprache Objective-C und die grafische Programmierung<br />
<strong>für</strong> Mac<br />
OS X kümmert, bietet<br />
es auf rund 50 Seiten<br />
auch einen guten Startpunkt<br />
<strong>für</strong> eigene Apps<br />
in Cocoa Touch. Der<br />
„<strong>Ein</strong>stieg in Objective-C<br />
2.0 und Cocoa“ kostet<br />
30 Euro und ist<br />
<strong>für</strong> 25 Euro auch<br />
als Download<br />
erhältlich.<br />
8 02/2011 <strong>smart</strong>-<strong>developer</strong>.de<br />
powered by
NEWS<br />
Aktuelles<br />
Google mit Music Beta in der Cloud<br />
Google kehrt zu seinen Wurzeln zurück und startet mit Music Beta einen neuen<br />
Cloud-Dienst. Music Beta stellt dem Anwender Speicherplatz <strong>für</strong> bis zu 20 000<br />
Songs zur Verfügung, die man sich auf das Smartphone oder den Rechner streamen<br />
lassen kann. Der Dienst ist vorerst gratis, <strong>alle</strong>rdings auf die USA beschränkt<br />
und nur über eine <strong>Ein</strong>ladung<br />
nutzbar.<br />
Ursprünglich wollte Google<br />
einen kompletten Musik-<br />
Service mit Online-Shop<br />
und Streaming-Lösung anbieten.<br />
Da man sich aber mit<br />
den großen Playern im Musikgeschäft<br />
nicht einigen<br />
konnte, hat Google nun diesen<br />
Weg ohne Online-Shop<br />
gewählt. Wann Music Beta<br />
nach Europa kommt, steht<br />
Der neue Cloud-Service startet in den USA via <strong>Ein</strong>ladung. noch nicht fest.<br />
Groupon: Deals in Echtzeit<br />
Groupon startet in den USA den neuen Dienst Groupon Now!, der seinen Nutzern<br />
erstmals ermöglicht, erworbene Gutscheine sofort einzulösen und nicht frühestens<br />
am nächsten Tag. Händler und Gastronomen können ihre mobilen Kampagnen<br />
auf Wunsch gezielt so aussteuern, dass die Angebote nur zu besuchsschwachen<br />
Zeiten offeriert werden. Fürs Erste ist der neue Service nur in Chicago<br />
verfügbar, doch dürfte er bald auf weitere Orte und Länder ausgeweitet werden.<br />
Mit Groupon Now! schließt der Gutscheindienst eine Lücke zwischen seinem<br />
Standard-Angebot, das durch die Aushändigung des Gutscheins erst am nächsten<br />
Tag noch keine absolut spontanen Käufe unterwegs ermöglicht, und Diensten<br />
wie Foursquare, die Gutscheine gegen Checkins herausgeben.<br />
Galaxy S II<br />
auf Rekordjagd<br />
Nachdem Samsung <strong>alle</strong>ine in Korea innerhalb<br />
einer Woche rund 200 000 Exemplare seines<br />
neuen Android-Flaggschiffs Galaxy II verkaufen<br />
konnnte, stellt das neue Android-Handy<br />
nun auch bei den weltweiten Bestellungen<br />
neue Maßstäbe: Über 3 Millionen Vorbestellungen<br />
seines neuen Smartphones sollen laut<br />
Samsung bis Mitte Mai eingegangen sein,<br />
über 10 Millionen Geräte will Samsung vom<br />
Galaxy S II bis Ende des Jahres verkaufen.<br />
<strong>Ein</strong>en weiteren Rekord hält Samsung auch bei<br />
der Bereitstellung des Android-Quellcodes:<br />
Die rund 130 MByte umfassende ZIP-Datei<br />
enthält neben dem Kernel-Quellcode von Gingerbread<br />
inklusive Build-Anleitung auch das<br />
zugehörige Plattform-Archiv und steht unter<br />
http:// opensource. samsung. com zum freien<br />
Download bereit.<br />
Das neue Android-Flaggschiff von<br />
Samsung erfreut sich einer sehr großen<br />
Nachfrage.<br />
samsung.com<br />
Apple ist am<br />
meisten wert<br />
Der Markenwert von Apple stieg binnen<br />
eines Jahres um 84 Prozent auf<br />
153,3 Mrd Dollar, so das neue BrandZ-<br />
Ranking der Agentur Millward Brown.<br />
Kontrahent Google gibt damit die Führung<br />
des Rankings ab und landet mit<br />
reichlich Abstand und 111,4 Mrd Dollar<br />
Markenwert auf Platz 2.<br />
Mobile Werbung<br />
nicht beliebt<br />
Mobile Werbung wird von Deutschen<br />
nur dann akzeptiert, wenn sie <strong>für</strong> ihre<br />
Nutzung belohnt werden, ergibt die<br />
Studie „A Global Consumer View on<br />
Mobile Advertising“ von InMobi und<br />
Comscore. Da 34 Prozent der Befragten<br />
sagen, sie würden nicht auf Werbung<br />
reagieren, mit der sie persönlich<br />
angesprochen werden, rät InMobi<br />
Werbungtreibenden im deutschen<br />
Markt dazu, eher Markenwerte und<br />
Angebote zu transportieren als gezielt<br />
Menschen zum Beispiel durch ortsbezogene<br />
Daten anzusprechen. Das ist<br />
besonders kniffelig dadurch, da InMobi-Forscher<br />
Surag Patel bei der Studie<br />
gleichzeitig erkannt hat, dass eine Art<br />
von Belohnung eigentlich hilft, die Akzeptanz<br />
von Mobile Advertising zu erhöhen:<br />
Die Verbraucher „wollen mehr<br />
Werbeangebote, bei denen sie Geld<br />
sparen können“, so Patel. Als Gegenleistung<br />
würden sie aber auch interessante<br />
Informationen über neue Produkte<br />
oder Marken durchaus zu schätzen<br />
wissen.<br />
Insgesamt lehnen 56 Prozent der deutschen<br />
Bevölkerung Werbung auf dem<br />
Handy ab. 37 Prozent sorgen sich<br />
dabei um ihre Privatsphäre, 19 Prozent<br />
halten mobile Werbung schlicht <strong>für</strong><br />
unangenehm. Nur 30 Prozent der befragten<br />
Verbraucher mögen hingegen<br />
mobile Werbung. Damit hinkt die Akzeptanz<br />
von Mobile Advertising in<br />
Deutschland anderen europäischen<br />
Ländern hinterher: EU-weit schätzen<br />
50 Prozent mobile Reklame, in den<br />
USA sind es sogar 63 Prozent und in<br />
Asien 69 Prozent.<br />
powered by:<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 9
ADMIN-MAgAzIN<br />
<strong>für</strong> ALLe IT-AdmInISTrAToren<br />
von WIndoWS und LInux<br />
AdmIn erscheint <strong>alle</strong> zwei<br />
monate und bietet IT-Admins:<br />
■ Schwerpunktthemen zu<br />
Storage, Backup, netzwerk,<br />
monitoring, virtualisierung<br />
und Security<br />
■ Howtos und Tutorials <strong>für</strong> <strong>alle</strong><br />
IT-Administratoren von Linux,<br />
Windows und unix<br />
■ Hilfe bei der täglichen<br />
Systemverwaltung<br />
heterogener netze<br />
TesTen sie Admin<br />
im mini-Abo!<br />
Lesen Sie 2 Ausgaben <strong>für</strong><br />
zusammen nur 9,80 E!<br />
2 Hefte<br />
NUR<br />
e9,80<br />
So können Sie beStellen:<br />
• Web: www.admin-magazin.de/abo<br />
• Telefon 07131 / 2707 274 • fax 07131 / 2707 78 601<br />
• e-mail: abo@admin-magazin.de • Shop: Shop.Linuxnewmedia.de<br />
Gleich hier bestellen:<br />
www.admin-magazin.de/<br />
miniabo<br />
Abovorteile<br />
• Preisvorteil gegenüber Kioskkauf<br />
• kostenlose & sichere Zustellung<br />
• Zustellung vor dem offiziellen<br />
verkaufstermin<br />
Globusillustration: Rafa Irusta Machin, 123RF
SIe wolleN keIN Heft MeHr verpASSeN?<br />
Abonnieren sie Admin im Prämienabo!<br />
Lesen Sie das AdmIn-magazin <strong>für</strong><br />
nur E 49,90 im Jahr statt E 58,80<br />
im einzelkauf am Kiosk!<br />
Als Prämie erhalten Sie einen Yubikey<br />
www.admin-magazin.de/jahresabo<br />
sichern sie sich<br />
ihren gratis YubikeY!<br />
Sicher unterwegs: uSB-Crypto-Key <strong>für</strong> einmal-<br />
Passwörter mit AeS-128. funktioniert ohne spezielle Treiber<br />
mit <strong>alle</strong>n Betriebssystemen. Weitere Applikationen unter www.yubico.com<br />
JetZt auch<br />
als PDF und/oder<br />
als Online-archiv<br />
erhältlich!<br />
Mehr inFOrMatiOnen unter<br />
www.aDMin-MagaZin.De<br />
Jetzt beStellen:<br />
versandkostenfrei!<br />
• www.admin-magazin.de/einzelheft<br />
• Telefon 07131 / 2707 274 • fax 07131 / 2707 78 601<br />
• e-mail: abo@admin-magazin.de • Shop: Shop.Linuxnewmedia.de
Schwerpunkt<br />
HTML5 mit Jo und PhoneGap<br />
Plattformübergreifende Entwicklung mit Jo und PhoneGap<br />
Hallo Jo<br />
Mit gängigen Webtechnologien wie HTML,<br />
JavaScript und CSS lassen sich mobile Apps<br />
erstellen, die sich hinter nativen Anwendungen<br />
nicht verstecken müssen. Dabei können<br />
Programmierer auf eine ganze Reihe von<br />
Java Script-Libraries zurückgreifen, die das<br />
Entwickeln plattformübergreifender Apps<br />
wesentlich erleichtern. Roy Sutton<br />
higyou, 123RF<br />
PhoneGap [1] ist eine<br />
JavaScript-Library, die<br />
zwischen Hardware und<br />
Java Script-Apps eine Abstraktionsebene<br />
einfügt. Allerdings handelt<br />
es sich dabei um keine GUI-Library;<br />
PhoneGap könnte man vielmehr als eine Art<br />
Vermittlungsschicht bezeichnen, mit deren<br />
Hilfe Apps auf native Funktionen von Mobiltelefonen<br />
zugreifen können, darunter GPS,<br />
Beschleunigungssensor und Kamera. Programmierer,<br />
die PhoneGap einsetzen, können<br />
eine HTML5-App so modifizieren, dass<br />
sie auf verschiedenen Geräten einsetzbar ist.<br />
Jo stellt sich vor<br />
Jo [2] ist eine schlanke, plattformübergreifende<br />
GUI-Library, hinter der<br />
der Autor Dave Balmer steckt. Jo ist<br />
Open-Source-Software (BSD-Lizenz)<br />
und auf GitHub verfügbar [3]. Die<br />
Bibliothek zeichnet sich dadurch aus,<br />
dass sie kompakt ist und man sich<br />
schnell einarbeiten kann; außerdem arbeitet<br />
sie hervorragend mit Phone-<br />
Gap zusammen, wobei es kaum<br />
Überschneidungen beim Funktionsumfang<br />
gibt. Mit Jo können<br />
Entwickler Apps programmieren,<br />
die auf Endgeräten installiert werden,<br />
aber die Library kann auch auf einem<br />
Webserver eingesetzt werden, um<br />
dort Webseiten <strong>für</strong> Mobilgeräte<br />
bereitzustellen. Obwohl Jo noch<br />
in den Kinderschuhen steckt,<br />
zeigt die Software jede Menge Zukunftspotenzial.<br />
Das gilt auch <strong>für</strong> unser Beispielprojekt,<br />
das Sie nun gleich programmieren.<br />
Spuren sammeln<br />
Beim Nachprogrammieren einer App namens<br />
Footprints, die den Standort des Anwenders<br />
aufzeichnet und in einer Datenbank abspeichert,<br />
können Sie sich mit einigen Funktionen<br />
beider Libraries vertraut machen. Mithilfe<br />
dieser App zeichnen Sie zum Beispiel<br />
Koordinaten punktuell auf oder lassen die<br />
App in regelmäßigen Abständen Ihren Standort<br />
abfragen und speichern.<br />
Im Laufe dieses Programmierprojektes lernen<br />
Sie drei der Funktionen von PhoneGap<br />
näher kennen: SQL-Datenbanken, lokale<br />
Speicherung und GPS. Darüber hinaus macht<br />
Sie der Artikel mit einigen der UI-Widgets<br />
und Hilfsfunktionen von Jo vertraut.<br />
Und das Beste daran ist: Weil Sie bei diesem<br />
Projekt plattformübergreifend programmieren,<br />
können Sie <strong>für</strong> den Test Ihrer App<br />
sogar Browser auf WebKit-Basis (Safari oder<br />
Chrome) verwenden. Es ist praktisch, während<br />
des Programmierens auf die Entwicklerkonsole<br />
eines Desktop-Browsers Zugriff zu<br />
haben, falls etwas schiefgeht und man den<br />
<strong>Code</strong> auf Fehler überprüfen muss.<br />
Vorbereitung<br />
Bevor es richtig losgehen kann, müssen Sie<br />
erst einmal Ihre Entwicklungsumgebung vorbereiten.<br />
Laden Sie sich zunächst die neuesten<br />
Versionen von Jo und PhoneGap herun-<br />
12<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Schwerpunkt<br />
HTML5 mit Jo und PhoneGap<br />
ter und folgen Sie den Anweisungen, um<br />
PhoneGap <strong>für</strong> Ihre jeweilige Plattform zu installieren.<br />
(Es gibt <strong>für</strong> jede Plattform eine eigene<br />
Seite mit Informationen <strong>für</strong> Neueinsteiger<br />
[4]; nutzen Sie die Test-App, um sicherzustellen,<br />
dass die Installationsumgebung<br />
korrekt eingerichtet wurde.)<br />
Um Jo zu installieren, müssen Sie nur die<br />
nötigen Dateien an den passenden Ort kopieren.<br />
Erstellen Sie im entsprechenden www-Verzeichnis<br />
Ihres mobilen Betriebssystems einen<br />
Ordner namens jo und kopieren Sie dann die<br />
Datei jo.js aus dem Unterordner js, den Sie<br />
in Jos Installationsverzeichnis finden, direkt<br />
dort hinein. Kopieren Sie dann den gesamten<br />
Ordner css ins Verzeichnis jo in Ihrem Projektverzeichnis.<br />
Zu guter Letzt müssen Sie noch die Datei<br />
index.html abändern, um das Jo-Framework<br />
und die zugehörigen CSS-Dateien einzubinden.<br />
Wenn Sie schon einmal am Editieren<br />
sind, können Sie auch gleich eine Datei hinzufügen,<br />
in der Ihr Programmcode sowie die<br />
Daten aus dem Google Maps API [5] gespeichert<br />
werden, sodass Sie die gespeicherten<br />
Standorte auf einer Karte abbilden können.<br />
Fügen Sie im Abschnitt HEAD den <strong>Code</strong> aus<br />
Listing 1 hinzu, außerdem müssen die beiden<br />
folgenden <strong>Code</strong>zeilen in den Startup-Abschnitt<br />
Ihres Betriebssystems eingefügt werden<br />
(beispielsweise in die Funktion<br />
onDevice Ready).<br />
jo.load();<br />
App.init();<br />
Erstellen Sie im Anschluss eine leere Datei<br />
namens main.js.<br />
Planen der App<br />
Da wir eine eher „klassische“ App erstellen<br />
wollen, fangen wir mit dem Hauptmenü-<br />
Bildschirm (oder Karte) mit drei Menüelementen<br />
an: Track (Standort Aufzeichnen),<br />
Saved Prints (Abgespeicherte Routen) und<br />
Options (Optionen). Beim Nachprogrammieren<br />
jedes Menüelements werden Sie jeweils<br />
ein anderes Jo-Widget kennenlernen. Wäre<br />
dies hier kein Programmierprojekt, dann<br />
wäre es wohl am sinnvollsten, wenn Ihre<br />
App gleich nach dem Hochfahren den Track-<br />
Bildschirm, d.h. den Bildschirm mit der<br />
Standort-Aufzeichnungsfunktion, zeigen<br />
würde, da Anwender wahrscheinlich diese<br />
Funktion als Erstes ausprobieren wollen.<br />
Sie können sich Ihre App so vorstellen,<br />
dass jede einzelne ihrer Funktionen eine<br />
Karte in einem Stapel darstellt. Dieser Ansatz<br />
funktioniert bei Jo sehr gut. Jede Jo App<br />
wird als joScreen dargestellt, der die BODY-<br />
Elemente des Browsers abstrahiert. Apps<br />
können dem Bildschirm joCard-Elemente<br />
hinzufügen. JoCards werden über einen<br />
joStack (oder joStackScroller) verwaltet,<br />
außerdem können Programmierer mittels<br />
dieser Elemente push- und pop-Methoden<br />
auf die aktiven Karten anwenden.<br />
Für jede der drei oben beschriebenen<br />
Funktionen müssen Sie Karten erstellen.<br />
Aber zunächst brauchen Sie eine Struktur, in<br />
die Ihre Karten eingebettet werden können.<br />
Das App-Skelett<br />
Sicherlich wollen Sie den globalen Namespace<br />
von JavaScript nicht unnötig verschmutzen.<br />
Deswegen ist es am besten, den<br />
App-<strong>Code</strong> in ein Objekt zu verpacken und<br />
mittels des Module Pattern <strong>alle</strong> „Innereien“<br />
der App dort einzubetten, sodass kein anderer<br />
JavaScript-<strong>Code</strong> darauf zugreifen kann.<br />
Wenn Sie die Programmzeilen aus Listing<br />
2 zu der Datei main.js hinzufügen, erstellen<br />
Sie damit ein App-Objekt mit ein paar internen<br />
Daten (die Sie später noch brauchen<br />
werden) und Funktionen. Nachdem Sie dann<br />
Ihren joScreen erstellt haben, wird <strong>alle</strong>s, was<br />
Sie auf dem Bildschirm platzieren, auch auf<br />
<strong>alle</strong>n anderen Bildschirmen der App sichtbar<br />
sein. Wenn Sie joNavbar verwenden, wird<br />
damit auf <strong>alle</strong>n App-Bildschirmen eine Titelleiste<br />
eingeblendet, außerdem ein plattformspezifischer<br />
Back-Button (bei webOS-Apps<br />
wird beispielsweise die gängige Zurück-Geste<br />
benutzt). Der Befehl return am Schluss gibt<br />
<strong>alle</strong> Daten und Funktionen zurück, die Sie<br />
außerhalb Ihres Objektes zur Verfügung stellen<br />
wollen. In diesem Fall geben Sie nur die<br />
init-Funktion selbst zurück, da dadurch <strong>alle</strong><br />
anderen von Ihnen benötigten Prozesse angestoßen<br />
werden.<br />
Die Menü-Karte<br />
Bei Jo steht Ihnen ein äußerst einfach zu benutzendes<br />
Menü-Widget zur Verfügung namens<br />
joMenu. Um ein joMenu zu erstellen,<br />
müssen Sie dem Widget ein Objekt-Array<br />
übergeben, das die Menüoptionen und IDs<br />
enthält. Die Klickevents im Menü werden abgefangen<br />
und über die ID der gewählten Option<br />
wird dann die entsprechende Karte ge-<br />
Listing 1: index.html wird erweitert<br />
<br />
<br />
<br />
<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 13
Schwerpunkt<br />
HTML5 mit Jo und PhoneGap<br />
Abb. 1: So sieht das Hauptmenü im<br />
iOS-Betriebssystem aus.<br />
Listing 2: main.js-Skelett<br />
var App = (function() {<br />
var stack;<br />
var scn;<br />
var self;<br />
var db;<br />
var prefsRecord;<br />
function init() {<br />
var menu, navbar;<br />
triggert. Am Schluss wird dann die neue<br />
Karte zum Kartenstapel <strong>für</strong> Ihren Bildschirm<br />
hinzugefügt. Später werde ich noch genauer<br />
auf den Aufruf joCache eingehen.<br />
Wenn Sie diese App nun testen, werden<br />
Sie feststellen, dass das Menü funktioniert<br />
und Sie auf die einzelnen Menüoptionen klicken<br />
können. Abbildung 1 zeigt, wie das<br />
Hauptmenü nun aussehen sollte. Da den einzelnen<br />
Karten noch kein Inhalt zugewiesen<br />
wurde, sind die Optionen leer. Wenn Sie<br />
nach der Auswahl eines Menüpunktes zum<br />
Hauptmenü zurücknavigieren, wird Ihnen<br />
auff<strong>alle</strong>n, dass der vorher gewählte Menüpunkt<br />
nach wie vor ausgewählt ist. Um diesen<br />
Fehler zu beheben, fügen Sie folgende<br />
Programmzeile in Ihren <strong>Code</strong> ein:<br />
main.activate = function()<br />
{ menu.deselect(); };<br />
scn = new joScreen(new joContainer([<br />
navbar = new joNavbar(),<br />
stack = new joStackScroller()<br />
Und zwar genau an der Stelle, bevor Sie mittels<br />
der Push-Methode das Element main in<br />
den Stack einfügen.<br />
Den Standort aufzeichnen<br />
Im <strong>Code</strong>abschnitt main wird joCache aufgerufen;<br />
dieser Aufruf wurde bislang noch nicht<br />
genauer erklärt. Jo verfügt über eine Funktion,<br />
die es dem Programmierer erlaubt, die<br />
]).setStyle({position: "absolute", top: "0", left: "0", bottom: "20px", right:<br />
"0"})<br />
);<br />
self = this;<br />
Erstellung von Widgets solange zu verzögern,<br />
bis sie tatsächlich benötigt werden.<br />
Wenn Sie auf joCache zurückgreifen, steigern<br />
Sie die Ausführungsgeschwindigkeit Ihrer<br />
Applikationen und senken auch den Speicherverbrauch,<br />
da Sie Steuerungselemente<br />
erst dann instanziieren, wenn sie auch gebraucht<br />
werden. Sobald ein Widget (oder ein<br />
Widget-Set) erzeugt wurde, bleibt es bestehen,<br />
bis es wieder benötigt wird.<br />
Die Track-Funktion soll eine Karte zeigen,<br />
auf der der aktuelle Standort des Anwenders<br />
und zwei Schaltflächen zu sehen sind, mit<br />
deren Hilfe die „Fußspuren“ gespeichert werden<br />
(eine Taste <strong>für</strong> eine <strong>Ein</strong>zelaufnahme,<br />
eine weitere Taste <strong>für</strong> die Intervall-Aufzeichnung).<br />
Verwenden Sie eine joToolbar, um<br />
diese Schaltflächen dauerhaft am unteren<br />
Bildschirmrand zu platzieren. Optimalerweise<br />
nutzen Sie <strong>für</strong> die paarweise Anordnung<br />
die joFlexrow. Sie verteilt <strong>alle</strong> Inhalte<br />
gleichmäßig über die gesamte Display-Breite.<br />
Fügen Sie den Programmcode aus Listing 4<br />
genau unter dem main-Aufruf ein.<br />
Bei Google Maps wird ein DIV-Element benötigt,<br />
damit darin das Kartenmaterial abgelegt<br />
werden kann. Mit etwas Inline-Kosmetik<br />
füllt das Karten-DIV den gesamten Bildschirm<br />
aus. Mittels des Aufrufs setTitle<br />
wird der Titel <strong>für</strong> die Karte gesetzt, der in der<br />
Kopfleiste erscheint, wenn diese Karte aktiv<br />
ist. Wie man sieht, wird dieser Aufruf an das<br />
Ende eines anderen Aufrufs gehängt, nämlich<br />
an den Call, mit dem die neue joCard erstellt<br />
wird. Bei Jo wird sehr häufig auf diese<br />
Art von Methodenverkettung zurückgegriffen,<br />
wodurch Programmierer viele Aufrufe in<br />
kompakter Weise durchführen können.<br />
Wenn Sie die App nun Probe fahren, sehen<br />
Sie, dass die Track-Funktion nun schon zumindest<br />
teilweise funktioniert. Am unteren<br />
Listing 3: Menü-Karte<br />
var main = new joCard([<br />
menu = new joMenu([<br />
{ title: "Track", id: "track" },<br />
{ title: "Saved Prints", id:<br />
"saved" },<br />
{ title: "Options", id: "options" }<br />
])<br />
]).setTitle("Footprints");<br />
}<br />
menu.selectEvent.subscribe(function(id) {<br />
return {<br />
stack.push(joCache.get(id));<br />
"init": init<br />
});<br />
}<br />
}());<br />
stack.push(main);<br />
14<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Schwerpunkt<br />
HTML5 mit Jo und PhoneGap<br />
Bildschirmrand sind zwei Schaltflächen zu<br />
sehen und das DIV Element Map loading…<br />
ist ebenfalls vorhanden. Wenn Sie Google<br />
Maps mit den beiden Schaltflächen verknüpfen,<br />
erhalten Sie einen <strong>Ein</strong>blick in die Möglichkeiten<br />
der Geo-Dienste von PhoneGap.<br />
Fügen Sie den <strong>Code</strong> aus Listing 5 vor dem<br />
return-Statement ein. Die ersten beiden Abschnitte<br />
enthalten <strong>Code</strong> zum Aktivieren und<br />
Deaktivieren von Funktionen auf der Karte.<br />
Diese werden automatisch aufgerufen, wenn<br />
eine Karte gezeigt oder verborgen wird.<br />
Im activate-<strong>Code</strong> können Sie Google<br />
Maps mit dem Karten-DIV-Element, das Sie<br />
vorher erstellt haben, verknüpfen und einige<br />
Grundeinstellungen durchführen. Der Aufruf<br />
navigator.geolocation.getCurrentPosition,<br />
übrigens eine PhoneGap-Methode, liest erwartungsgemäß<br />
die aktuellen GPS-Koordinaten<br />
des Gerätes aus und gibt sie an die Funktion<br />
success zurück, was bewirkt, dass die<br />
Karte in der Displaymitte den derzeitigen<br />
Standort des Anwenders anzeigt. Interessanterweise<br />
funktioniert dies auch bei Desktop-<br />
Browsern ziemlich gut.<br />
Der <strong>Code</strong>abschnitt deactivate stellt sicher,<br />
dass die regelmäßige Abfrage des aktuellen<br />
Standorts eingestellt wird. Über den Aufruf<br />
clearWatch wird die wiederkehrende Sammlung<br />
von GPS-Daten beendet; Sie werden<br />
sich damit näher befassen, wenn Sie den<br />
<strong>Code</strong> <strong>für</strong> onTrack schreiben.<br />
Die nächsten zwei Programmzeilen verknüpfen<br />
mittels des subscribe-Befehls das<br />
Betätigen der Tasten mit den entsprechenden<br />
Events. Als Nächstes geht es um den Programmcode<br />
<strong>für</strong> onSnapshot und onTrack. Die<br />
Listing 4: Aufsetzen der Karte<br />
joCache.set("track", function() {<br />
var trackButton, snapButton, toolbar;<br />
letzte Zeile speichert eine Kopie des track-<br />
Button, damit Sie ihn auch von innerhalb des<br />
<strong>Code</strong>s von onTrack referenzieren können.<br />
Der Bildschirm der Track-Funktion sollte nun<br />
wie bei Abbildung 2 aussehen.<br />
Durchgängiges Tracking<br />
PhoneGap bietet eine Funktion, um regelmäßig<br />
GPS-Events zu registrieren und darauf zu<br />
reagieren. Dadurch können Sie intervallweise<br />
Ihre Koordinaten abrufen und diese Daten in<br />
einer Datenbank speichern. Fügen Sie dazu<br />
den <strong>Code</strong> von Listing 6 unter die init-Funktion<br />
in das App-Objekt ein.<br />
Die Funktion onTrack überprüft das aktuelle<br />
Label des trackButton, um festzustellen,<br />
ob die Aufzeichnung des Anwenderstandortes<br />
gestartet oder gestoppt werden soll. Wenn<br />
der Tracking-Prozess gestartet werden soll,<br />
ändert sie das Label auf "Stop" und weist<br />
PhoneGap an, in regelmäßigen Abständen<br />
Updates zu senden. Wenn die Aufzeichnung<br />
des Standortes bereits läuft, ändert die Funktion<br />
das Label und ruft clearWatch auf, um<br />
den GPS-Abfrageprozess zu stoppen.<br />
Listing 5: webService1Success<br />
Abb. 2: Die Track-Funktion unserer<br />
App mit den zwei Buttons.<br />
self.trackCard.activate = function() {<br />
if(!self.trackCard.mapActivated) {<br />
var latlng = new google.maps.LatLng(‐34.397, 150.644);<br />
var myOptions = {<br />
zoom: 14,<br />
center: latlng,<br />
mapTypeId: google.maps.MapTypeId.ROADMAP<br />
};<br />
self.map = new google.maps.Map(document.getElementById("map"),<br />
myOptions);<br />
self.trackCard.mapActivated = true;<br />
}<br />
navigator.geolocation.getCurrentPosition( function(position) {<br />
self.trackCard = new joCard([<br />
var point = new google.maps.LatLng(position.coords.latitude, position.coords.<br />
longitude);<br />
new joContainer('Map<br />
loading...').setStyle({position:<br />
"absolute", top: "0", left: "0", bottom:<br />
"0", right: "0"}),<br />
};<br />
self.map.setCenter(point);<br />
}, gpsFailure);<br />
toolbar = new joToolbar([<br />
new joFlexrow([trackButton = new<br />
joButton("Start"),<br />
self.trackCard.deactivate = function() {<br />
if(self.trackCard.trackButton.getData() === "Stop") {<br />
self.trackCard.trackButton.setData("Start");<br />
snapButton = new<br />
joButton("Single")])<br />
])<br />
]).setTitle("Track");<br />
};<br />
navigator.geolocation.clearWatch(self.trackCard.watchID);<br />
}<br />
snapButton.selectEvent.subscribe(onSnapshot, self);<br />
return self.trackCard;<br />
});<br />
trackButton.selectEvent.subscribe(onTrack, self);<br />
self.trackCard.trackButton = trackButton;<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 15
Schwerpunkt<br />
HTML5 mit Jo und PhoneGap<br />
Abb. 3: Der Bildschirm mit den<br />
gespeicherten Routen (Saved Prints).<br />
Listing 6: GPS-Funktionen<br />
Die Funktion addFootprint richtet Marker<br />
auf der Karte ein. Dabei verwendet sie die<br />
GPS-Koordinaten, die entweder durch die in<br />
regelmäßigen Abständen durchgeführte GPS-<br />
Abfrage geliefert werden oder von getCurrentPosition<br />
stammen. Aus diesen Daten erstellt<br />
sie den neuen Marker und richtet die<br />
Karte so aus, dass der Marker in der Displaymitte<br />
positioniert wird.<br />
Die Funktion gpsFailure greift auf Jos<br />
Benachrichtigungsfunktion zurück und zeigt<br />
eine Popup-Warnung im Display, falls kein<br />
GPS-Signal verfügbar ist oder wenn der Anwender<br />
den GPS-Zugang gesperrt hat.<br />
function onTrack() {<br />
if(self.trackCard.trackButton.getData() === "Start") {<br />
self.trackCard.trackButton.setData("Stop");<br />
self.trackCard.watchID = navigator.geolocation.watchPosition(<br />
addFootprint, gpsFailure, { frequency: self.frequency, enableHighAccuracy:<br />
true, maximumAge: 3000 });<br />
}<br />
else {<br />
self.trackCard.trackButton.setData("Start");<br />
Speichern von Daten<br />
Die reine Darstellung der Route per GPS,<br />
während der Anwender sich fortbewegt, ist<br />
nur eingeschränkt sinnvoll. Es wäre praktisch,<br />
wenn man die Route zur späteren Verwendung<br />
abspeichern könnte. Glücklicherweise<br />
unterstützen die meisten Mobilbrowser<br />
das Speichern von HTML5-Daten per SQLite.<br />
PhoneGap stellt dem Anwender dazu eine<br />
konsistente Oberfläche zur Verfügung, mit<br />
deren Hilfe im Abschnitt window auf SQL-<br />
Funktionen zugegriffen werden kann. Zunächst<br />
müssen Sie eine Datenbank erstellen,<br />
in der Sie Ihre Routen abspeichern. Fügen Sie<br />
dann den entsprechenden <strong>Code</strong> in die Track-<br />
Funktion ein, um die Routen in der Datenbank<br />
zu speichern. Kopieren Sie die folgende<br />
Zeile in Ihren <strong>Code</strong>, gleich nachdem der Bildschirm<br />
erstellt wird in init:<br />
initDB();<br />
Fügen Sie außerdem den Variablen am Anfang<br />
von App folgende Deklaration hinzu:<br />
var db;<br />
Fügen Sie dann den <strong>Code</strong> aus Listing 7<br />
hinzu. Die Funktion initDB öffnet die Verbindung<br />
zur Datenbank und erstellt die Tabelle,<br />
in der die Route gespeichert wird. Um die<br />
Daten in der Datenbank zu speichern, kopieren<br />
Sie den <strong>Code</strong> aus Listing 8 in App unterhalb<br />
der vorherigen Funktionen ein und<br />
fügen die folgende Zeile an das Ende der<br />
addFootprint-Funktion:<br />
addDBTrack(position);<br />
Weitere Informationen zu SQL-Datenbanken<br />
in HTML5 finden Sie auf der Webseite<br />
HTML5 Doctor [6].<br />
Listing 7: initDB<br />
function initDB() {<br />
if (!window.openDatabase) {<br />
scn.alert("Database not supported on this<br />
platform!");<br />
} else {<br />
}<br />
}<br />
navigator.geolocation.clearWatch(self.trackCard.watchID);<br />
db = window.openDatabase("footprints",<br />
"1.0", "Footprints Database", 1000000);<br />
function onSnapshot() {<br />
db.transaction(function(transaction) {<br />
}<br />
navigator.geolocation.getCurrentPosition( addFootprint, gpsFailure);<br />
transaction.executeSql('CREATE TABLE IF NOT<br />
EXISTS prints(id INTEGER PRIMARY KEY,' +<br />
'lat REAL,' +<br />
function addFootprint(position) {<br />
var point = new google.maps.LatLng(position.coords.latitude, position.coords.<br />
longitude);<br />
'long REAL,' +<br />
'timestamp INTEGER);', [],<br />
dbNullHandler, dbErrorHandler);<br />
});<br />
var marker = new google.maps.Marker({position: point, map: self.map});<br />
self.map.setCenter(point);<br />
}<br />
}<br />
}<br />
function gpsFailure() {<br />
scn.alert("GPS Error","Unable to get a GPS fix");<br />
}<br />
function dbNullHandler() { }<br />
function dbErrorHandler(e) { }<br />
16<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Schwerpunkt<br />
HTML5 mit Jo und PhoneGap<br />
Wenn Sie den Wert NULL in das ID-Feld eintragen,<br />
wird der Wert des Feldes automatisch<br />
inkrementell erhöht. Die anderen Informationen<br />
werden einfach vom Positionsobjekt abgeleitet.<br />
Man sollte sich jedoch bewusst sein,<br />
dass PhoneGap die Zeitstempel auf den verschiedenen<br />
Plattformen auf unterschiedliche<br />
Weise abgleicht. Sie sollten also vorher testen,<br />
was <strong>für</strong> ein Zeitstempel zurückgegeben<br />
wird, damit Sie sich überlegen können, wie<br />
Sie die Information am besten in ein Date-<br />
Objekt umwandeln können.<br />
Abbildung der Routen<br />
Nun, da Sie die Route des Nutzers abspeichern<br />
können, brauchen Sie einen Bildschirm,<br />
auf dem Sie die gespeicherten Routen<br />
anzeigen können. Obwohl Sie diese Information<br />
wahrscheinlich auch gerne auf<br />
einer Karte abbilden würden, würde Ihnen<br />
dadurch die Gelegenheit entgehen, ein weiteres<br />
Jo-Widget kennenzulernen. Auf dem<br />
Bildschirm Saved Prints (Abgespeicherte<br />
Routen) sollten Sie die gesammelten Routen<br />
in Form einer joList anzeigen. Fügen Sie den<br />
<strong>Code</strong> aus Listing 9 zur Funktion init hinzu.<br />
Wenn joCache die Setup-Funktion <strong>für</strong> den<br />
Bildschirm mit den gespeicherten Routen<br />
aufruft, muss zunächst die Karte erstellt werden,<br />
die dargestellt wird. Wie Sie sehen,<br />
muss dazu nur die Liste hinzugefügt werden,<br />
die Sie mit Daten füllen wollen, außerdem<br />
müssen Sie den Titel <strong>für</strong> die Karte festlegen.<br />
Als Nächstes muss die Liste mit Daten aus<br />
der Datenbank befüllt werden, und zwar<br />
immer dann, wenn die Karte aktiviert wird.<br />
Diese Daten werden in einem Objekt zurückgegeben,<br />
<strong>alle</strong>rdings handelt es sich dabei um<br />
kein Array, obwohl es ähnlich strukturiert<br />
ist. Sie müssen jedes einzelne Element iterieren<br />
und es in einem Array platzieren, damit<br />
die Daten in der Liste dargestellt werden<br />
können.<br />
Listing 8: addDBTrack<br />
function addDBTrack(position) {<br />
if(db !== undefined) {<br />
Zu guter Letzt muss die Liste auch abgebildet<br />
werden. joList dient hier als Hilfsfunktion,<br />
die Sie benutzen können, um die Daten darstellungsgerecht<br />
aufzubereiten. Nach Abschluss<br />
der vorbereitenden Maßnahmen wird<br />
die Funktion formatItem aufgerufen, wobei<br />
das unbearbeitete Element aus dem Array<br />
und der Indexwert des Elements als Argumente<br />
dienen. Das Array, das weiter oben erstellt<br />
wurde, enthält ein Objekt mit Eigenschaften<br />
<strong>für</strong> jedes der Felder der Tabelle. Mithilfe<br />
dieser Felder entnehmen Sie die Daten<br />
und befüllen einen String. Schließlich übergeben<br />
Sie den String an den Parent der Liste<br />
formatItem, um ihn Jos Stilelementen entsprechend<br />
zu formatieren. Abbildung 3 zeigt<br />
unsere App mit den gespeicherten Routen<br />
unter webOS.<br />
Optionen<br />
Der letzte Menüpunkt ermöglicht es dem Benutzer,<br />
die Häufigkeit der Standortabfrage<br />
festzulegen. Für den Optionen-Bildschirm<br />
benötigen Sie zwei Jo-Funktionen sowie<br />
Listing 9: Saved Prints (Abgespeicherte Routen)<br />
joCache.set("saved", function() {<br />
var trackList;<br />
var card = new joCard([<br />
trackList = new joList(),<br />
]).setTitle("Saved Prints");<br />
Abb. 4: Abfrage-Intervall im Optionsmenü<br />
einstellen.<br />
card.activate = function() {<br />
if(db) {<br />
db.transaction(function(transaction) {<br />
transaction.executeSql('SELECT * from prints', [],<br />
function(tx, results) {<br />
var i, ary = [];<br />
for(i = 0; i < results.rows.length; i++) {<br />
ary[i] = results.rows.item(i);<br />
}<br />
trackList.setData(ary);<br />
}, dbErrorHandler);<br />
});<br />
}<br />
}<br />
db.transaction(function(transaction) {<br />
transaction.executeSql('INSERT INTO prints<br />
(id, lat, long, timestamp) ' + 'VALUES<br />
(NULL, ' + position.coords.latitude + ', '<br />
+ position.coords.longitude + ', ' +<br />
position.timestamp + ');', [],<br />
dbNullHandler, dbErrorHandler);<br />
trackList.formatItem = function(data, index) {<br />
var display = data.id + "‐ Lat: " + data.lat + ", Long: " + data.long + ' ‐‐ '<br />
+ data.timestamp;<br />
return joList.prototype.formatItem.call(this, display, index);<br />
}<br />
});<br />
}<br />
return card;<br />
}<br />
});<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 17
Schwerpunkt<br />
HTML5 mit Jo und PhoneGap<br />
Abb. 5:<br />
Die Footprints-App<br />
unter<br />
An droid.<br />
Roy Sutton<br />
Roy Sutton ist App-Entwickler,<br />
Blogger und begeisterter<br />
webOS-Nutzer. Er hat schon mobile<br />
Anwendungen entwickelt,<br />
als der Begriff noch gar nicht<br />
existierte. Mehr von Roy Sutton<br />
können Sie auf dieser Webseite<br />
lesen: http:// www.<br />
webOSroundup. com. Sutton ist<br />
Administrator von http://<br />
webOS101. com, ein webOS-Wiki<br />
auf Community-Basis. Auf Twitter<br />
ist Roy Sutton unter dem<br />
Namen @Pre101 zu finden.<br />
Infos<br />
[1] PhoneGap:<br />
http:// www. phonegap. com<br />
[2] Jo: http:// joapp. com<br />
[3] Jo download:<br />
https:// github. com/<br />
davebalmer/ jo<br />
[4] PhoneGap Get Started page:<br />
http:// www. phonegap. com/<br />
start<br />
[5] Google Maps API:<br />
http:// code. google. com/ apis/<br />
maps/ documentation/<br />
javascript/<br />
[6] HTML5 Doctor:<br />
http:// html5doctor. com/<br />
introducing‐web‐sqldatabases<br />
einen weiteren HTML5-Speichermechanismus.<br />
Bei PhoneGap wird das W3C Web Storage<br />
API über window.localStorage eingebunden.<br />
Damit steht dem Programmierer ein<br />
einfacher Schlüssel/Wert-Speicher zur Verfügung,<br />
der zur Sicherung von App-<strong>Ein</strong>stellungen<br />
mehr als ausreicht. Um die Schnittstelle<br />
zwischen Jos Widgets und dem Speicherort<br />
einfacher zu gestalten, können Sie auf Jos<br />
joRecord-Objekt zurückgreifen. joRecord enthält<br />
eine eventgesteuerte Methode, um verschiedene<br />
Jo Widgets an Daten zu binden.<br />
Fügen Sie die folgende Programmzeile unterhalb<br />
des Aufrufs initDB ein:<br />
initPrefs();<br />
Fügen Sie dann den <strong>Code</strong> initPrefs und<br />
seine Helferfunktion (Listing 10) in App ein.<br />
In diesem <strong>Code</strong>-Abschnitt geht es um die<br />
Vorgabedaten <strong>für</strong> Ihre datenbezogenen Widgets<br />
(nur eines in diesem Fall); danach können<br />
Sie die Funktionen load und save erstellen.<br />
Nachdem Sie diese Funktionen erstellt<br />
haben, können Sie die gespeicherten <strong>Ein</strong>stellungen<br />
laden und danach die Funktion set-<br />
Frequency aufrufen. Nun erstellen Sie den<br />
Optionen-Bildschirm, indem Sie den <strong>Code</strong><br />
aus Listing 11 in die Funktion init einfügen.<br />
Dieser <strong>Code</strong> erzeugt ein einfaches Auswahl-Widget,<br />
mit dessen Hilfe der Anwender<br />
einen <strong>Ein</strong>trag aus einer statischen Liste von<br />
Werten auswählt. Wenn der Nutzer eine der<br />
Auswahlmöglichkeiten zum Festlegen des<br />
Abfrageintervalls antippt, sollte der Bildschirm<br />
ähnlich wie in Abbildung 4 aussehen.<br />
Ausprobieren der App<br />
Sie sollten nun über eine voll funktionsfähige,<br />
wenn auch etwas schmucklose App<br />
verfügen. Mithilfe von PhoneGap sollten Sie<br />
in der Lage sein, die App auf einer Reihe von<br />
Listing 10: initPrefs<br />
function initPrefs() {<br />
prefsRecord = new joRecord({<br />
frequency: 2<br />
});<br />
prefsRecord.load = function() {<br />
var data;<br />
data = window.localStorage.<br />
getItem("frequency");<br />
if(data !== null) {<br />
prefsRecord.setProperty("frequency",<br />
data);<br />
}<br />
}<br />
prefsRecord.save = function() {<br />
verschiedenen Geräten zum Laufen zu bringen.<br />
Jedes Gerät hat seine Eigenheiten, Sie<br />
sollten sich also vorher kundig machen, welche<br />
Grundkonfiguration <strong>für</strong> jedes Gerät benötigt<br />
wird. Sobald die Konfiguration steht,<br />
folgen Sie den Schritten im Abschnitt Vorbereitung,<br />
um die projektspezifischen <strong>Ein</strong>stellungen<br />
vorzunehmen. Danach können Sie<br />
main.js hineinkopieren und von index.html<br />
aus aktivieren. Abbildung 5 zeigt die App auf<br />
dem Android-Betriebssystem.<br />
Fazit<br />
Mithilfe des Jo-Frameworks lassen sich Apps<br />
erstellen, ohne dazu Unmengen an HTMLund<br />
CSS-<strong>Code</strong> von Hand editieren zu müssen.<br />
PhoneGap macht es möglich, die App <strong>für</strong><br />
mehrere mobile Endgeräte (sowie einige<br />
Browser) gleichzeitig zu entwickeln. In diesem<br />
Artikel habe ich einige Widgets vorgestellt,<br />
die Jo anbietet, und Möglichkeiten aufgezeigt,<br />
wie diese gemeinsam innerhalb einer<br />
App verwendet werden können, um auf diese<br />
Weise ein positives Anwendererlebnis zu erzeugen.<br />
Jo bietet aber noch viel mehr. Ich<br />
hoffe, dieser Artikel hat Sie dazu angeregt, einige<br />
dieser Optionen weiterzuverfolgen und<br />
sich neue anzusehen.<br />
● ● ●<br />
Listing 11: Optionen<br />
joCache.set("options", function() {<br />
var card = new joCard([<br />
new joLabel("Tracking frequency<br />
(minutes)"),<br />
new joSelect(["10", "20", "30", "40", "50",<br />
"60"], prefsRecord.link("frequency"))<br />
]).setTitle("Options");<br />
return card;<br />
});<br />
window.localStorage.setItem("frequency",<br />
prefsRecord.getProperty("frequency"));<br />
setFrequency();<br />
}<br />
prefsRecord.load();<br />
setFrequency();<br />
}<br />
function setFrequency() {<br />
self.frequency = (prefsRecord.<br />
getProperty("frequency") + 1) * 10 * 60000;<br />
}<br />
18<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Linux-Magazin<br />
ACADEMY<br />
... wir qualifizieren Ihre Mitarbeiter!<br />
IT Trainings Online<br />
Linux und Open Source<br />
Nutzen Sie die Vorteile<br />
der Linux-Magazin Academy!<br />
✓<br />
✓<br />
✓<br />
✓<br />
✓<br />
Kompetent: Unsere Dozenten sind ausge wiesene<br />
Profis mit lang jähriger Schulungserfahrung.<br />
Flexibel: Der Schulungsteilnehmer lernt, wann,<br />
wo und sooft er möchte.<br />
Kosteneffizient: Nutzen Sie <strong>Ein</strong>sparungen<br />
gegenüber Vor-Ort-Schulungen.<br />
Übersichtlich: Die komfortable Web- Oberfläche<br />
zeigt gleich zeitig den Trainer und dessen<br />
Arbeitsfläche<br />
Individuell: Jeder Teilnehmer folgt seinem eigenen<br />
Lerntempo.<br />
Trainingspakete:<br />
Monitoring mit Nagios<br />
• WordPress 3.0<br />
www.lpi.org<br />
LPIC-1- / LPIC-2-Training<br />
IT-Sicherheit Grundlagentraining<br />
OpenOffice – Arbeiten mit Vorlagen<br />
Was Teilnehmer über die<br />
Linux-Magazin Academy sagen:<br />
„Mit den Videos haben Sie ins Schwarze<br />
getroffen. Es gibt nichts Vergleichbares.“<br />
„<strong>Ein</strong>e hervorragende Anleitung zum<br />
praktischen Arbeiten“<br />
Testen Sie unsere Demovideos:<br />
academy.linux-magazin.de/demo<br />
Präsentiert von:<br />
www.linux-magazin.de<br />
www.linuxhotel.de<br />
Weitere Infos: academy.linux-magazin.de
Schwerpunkt<br />
Monkey<strong>Code</strong>r<br />
Monkey, die Multiplattform-Sprache<br />
Die Affen<br />
sind los…<br />
Mit Monkey wurde erst vor Kurzem eine neue Multiplattform-Programmiersprache<br />
veröffentlicht. Sie verspricht, mit einer <strong>Code</strong>base, HTML5-,<br />
Flash-, Android-, iOS-, XNA-, Windows, Mac und Linux-Anwendungen zu<br />
erstellen. Hört sich genial an, ist es auch. Jochen Heizmann<br />
Cheng En Lim, 123RF<br />
Um eine große Anzahl von Plattformen<br />
zu bedienen, verfolgt Monkey<br />
den Ansatz, <strong>Code</strong> der Quellsprache<br />
in <strong>Code</strong> der Zielplattform<br />
zu übersetzen. Anschließend wird der erzeugte<br />
<strong>Code</strong> an die nativen Tools der Ziel-<br />
Plattform weitergereicht (siehe Abbildung 1).<br />
Das heißt die entsprechenden SDKs müssen<br />
korrekt eingerichtet sein.<br />
Die Idee dahinter hört sich sehr vielversprechend<br />
an, da man damit seine Anwendung<br />
ohne Mehraufwand auf Mobile Phones,<br />
Tablets, Desktop-PCs und Videospiele-Konsolen<br />
bringen kann. Was hinten herausfällt,<br />
sind native Applikationen. Dadurch haben<br />
die Programme oftmals eine bessere Performance<br />
als <strong>Code</strong>, der auf einer VM ausgeführt<br />
wird oder Scriptsprachen, die interpretiert<br />
werden müssen.<br />
Lasst uns eine Sprache<br />
sprechen!<br />
Monkey ist eine High-Level-Programmiersprache<br />
mit OOP-Features, die ihre Wurzeln<br />
in Basic hat. An manchen Stellen haben die<br />
Macher auch von Java abgekupfert. Klassen,<br />
generische Klassen, abstrakte Klassen und<br />
Vererbung gehören zum Sprachumfang. Interfaces<br />
oder Mehrfachvererbung unterstützt<br />
die Programmiersprache dagegen nicht. Die<br />
Sprache selbst ist case-sensitive.<br />
Monkey als Sprache ist gewöhnungsbedürftig.<br />
<strong>Ein</strong> Beispiel: Ähnlich den Packages<br />
in Java lässt sich <strong>Code</strong> in Module unterteilen.<br />
An anderen Stellen kann das Modul mit der<br />
Import-Anweisung integriert werden. So<br />
weit, so gut: Mit den Schlüsselwörtern Public<br />
und Private ist es möglich, einer Member-Variable<br />
eine Sichtbarkeit zuzuweisen<br />
(Protected gibt es im Übrigen nicht.). Dies<br />
stellt sicher, auf welche Eigenschaften, Methoden<br />
oder Funktionen der Entwickler von<br />
außerhalb des Moduls Zugriff hat. Innerhalb<br />
der Datei darf jedoch von anderen <strong>Code</strong>abschnitten<br />
auf die geschützten Variablen zugegriffen<br />
werden. Die Sichtbarkeit gilt also nur<br />
<strong>für</strong> fremde Dateien.<br />
Auch mag die Basic-ähnliche Syntax auf<br />
den ersten Blick <strong>für</strong> Java- oder C/C++-Entwickler<br />
etwas unschön wirken. Statt geschweifter<br />
Klammern gibt es einfache Blöcke<br />
im Stil von<br />
If Expression Then ..... End<br />
Somit ähnelt Monkey eher einer Scriptsprache<br />
wie zum Beispiel Lua. Monkey ist jedoch<br />
statisch typisiert, und ermöglicht es zudem,<br />
viele Fehler bereits zur Übersetzungszeit zu<br />
erkennen.<br />
Die Schnittstelle nach<br />
draußen<br />
Mithilfe externer Deklarationen wird <strong>Code</strong><br />
der Zielplattform mit Monkey verheiratet. Im<br />
Gegensatz zur Ehe von Mann und Frau, gibt<br />
es mit Monkey keine Verständigungsprobleme.<br />
Kurz gesagt: Der emsige Entwickler<br />
greift direkt aus Monkey heraus auf plattformspezifischen<br />
<strong>Code</strong> zu. Nützlich – speziell<br />
<strong>für</strong> Performance-Optimierungen oder um<br />
externe APIs anzubinden.<br />
20<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Schwerpunkt<br />
Monkey<strong>Code</strong>r<br />
Abb. 1: Monkey übersetzt <strong>Code</strong> in unterschiedliche Zielsprachen, um diese an den zuständigen Compiler<br />
und an SDK-Tools weiterzureichen.<br />
Beim Build-Prozess wird nur ein bestimmter,<br />
in Kommentar-Annotations eingeschlossener<br />
Abschnitt im Zielcode ersetzt (sofern die<br />
Zielcode-Datei schon vorhanden ist). Das ist<br />
praktisch, da man so den generierten Quellcode<br />
erweitern oder verändern kann, ohne<br />
dass die Änderungen bei jedem Übersetzen<br />
verlorengehen.<br />
Die API<br />
Out of the Box kommt Monkey mit zwei Modulen<br />
daher: Monkey und Mojo. Während<br />
Abb. 2: Die mitgelieferte IDE von Monkey fällt leider etwas spartanisch aus und dürfte X<strong>Code</strong>- oder Silverlight-Entwickler nicht gerade begeistern.<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 21
Schwerpunkt<br />
Monkey<strong>Code</strong>r<br />
Abb. 3: Jungle Ide <strong>für</strong> Windows macht das Entwickeln mit Monkey deutlich angenehmer und intuitiver. Aktuell<br />
gibt es die IDE zu einem Preis von 65 Euro mit einer Lizenz auf Lebzeiten.<br />
Listing 1: Hello World in Monkey<br />
Strict<br />
Import mojo<br />
Import monkey<br />
Class MyFirstApp Extends App<br />
Field x:Int<br />
Field y:Int<br />
Method OnCreate:Int()<br />
SetUpdateRate(30)<br />
Return 1<br />
End<br />
Method OnUpdate:Int()<br />
x = MouseX()<br />
y = MouseY()<br />
Return 1<br />
End<br />
Monkey die Sprachgrundlagen bildet (Arrayund<br />
String-Funktionen, Listen, Mathematik,<br />
usw.) bekommen wir mit Mojo ein einfaches<br />
Framework zum Erstellen von Multimedia-<br />
Anwendungen an die Hand. <strong>Ein</strong> Grafik-Modul,<br />
Funktionen, um Sounds und Musik abzuspielen,<br />
sowie ein Input-Modul, um Benutzereingaben<br />
auszulesen, gehören ebenfalls<br />
zum Lieferumfang.<br />
Method OnRender:Int()<br />
Cls<br />
DrawText("Hallo Welt!", x, y)<br />
Return 1<br />
End<br />
Method OnLoading:Int()<br />
Cls<br />
DrawText("Loading...", 0, 0)<br />
Return 1<br />
End Method<br />
End<br />
Function Main:Void()<br />
New MyFirstApp<br />
End<br />
Monkey bemüht sich darum, <strong>alle</strong>s so einfach<br />
wie möglich zu halten. Dadurch ist die Sprache<br />
schnell verständlich. Die manchmal nötige<br />
Abstraktion muss dann <strong>alle</strong>rdings der<br />
Programmierer schaffen. Die stetig wachsende<br />
Community hat auch schon einiges an<br />
freien Zusatzmodulen zur Verfügung gestellt.<br />
Der Dokumentation hätte etwas mehr Aufmerksamkeit<br />
des Entwicklers gut getan. Dennoch<br />
ist sie <strong>für</strong> den <strong>Ein</strong>stieg und die zentralen<br />
Fragen ausreichend: <strong>Ein</strong>e verständliche<br />
<strong>Ein</strong>führung und Übersicht ist auf der Projektseite<br />
[1] verfügbar, genauso wie eine API-Dokumentation,<br />
die mit der IDE verlinkt ist.<br />
Im Editor oder im Jungle<br />
Womit wir zu der mitgelieferten Entwicklungsumgebung<br />
kommen, die leider nicht<br />
überzeugen kann. Es handelt sich lediglich<br />
um einen etwas erweiterten Editor. Dieser<br />
bietet weder Auto-Completion noch Syntax-<br />
Highlighting von eigenen Klassen, Methoden<br />
oder Funktionen. Entwickler Marc Sibly hat<br />
bereits Nachbesserung angekündigt: <strong>Ein</strong><br />
zweites Eclipse, X<strong>Code</strong> oder Visual Studio<br />
wird aber sicher nicht entstehen.<br />
Zumindest <strong>für</strong> Windows-Systeme gibt es<br />
eine Third-Party-IDE, die auf .NET basiert<br />
und sich wirklich sehen lassen kann: Jungle.<br />
Sie bietet <strong>alle</strong>s, was man sich von einer erwachsenen<br />
Entwicklungsumgebung wünscht<br />
und kostet in der günstigsten Version gerade<br />
mal 30 Euro. Mac-User gucken aber in die<br />
22<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Schwerpunkt<br />
Monkey<strong>Code</strong>r<br />
Abb. 4: Dank Monkey ist das Spiel Impact auf mehreren Plattformen lauffähig. Den Quellcode zum Spiel finden<br />
Sie auf der Smart-Developer-Heft-DVD und im Internet.<br />
Röhre. Sie müssen warten und hoffen, dass<br />
da noch etwas Besseres nachkommt. Doch<br />
wie sieht denn nun eine typische Monkey-<br />
Anwendung aus?<br />
Vorhang auf!<br />
Den Klassiker „Hallo Welt“ in Monkey zeigt<br />
Listing 1. Wir beginnen ganz unten: Den <strong>Ein</strong>stiegspunkt<br />
eines jeden Monkey-Programmes<br />
bildet die Main-Funktion. In unserem Beispiel<br />
erstellen wir hier eine Instanz unserer<br />
Klasse MyFirstApp, die wir von mojo.App abgeleitet<br />
haben.<br />
Diese enthält zwei Variablen vom Typ Integer.<br />
Außerdem haben wir einige Methoden<br />
überschrieben. Initialisierungen nehmen wir<br />
in OnCreate vor: Mit SetUpdateRate(30) erstellen<br />
wir einen Timer, welcher die OnUpdate-Methode<br />
dreißigmal pro Sekunde aufruft.<br />
Wenn wir dies nicht tun, wird OnUpdate<br />
nicht automatisch ausgeführt.<br />
Alternativen<br />
HAXE [3] bietet einen ähnlichen Ansatz wie<br />
Monkey, benutzt jedoch <strong>für</strong> unterschiedliche<br />
Targets spezialisierte Libraries. So ist es in der<br />
Theorie zwar auch möglich mehrere Plattformen<br />
zu bedienen, <strong>alle</strong>rdings ist der Anwendungszweck<br />
doch eher der, <strong>für</strong> eine vorher<br />
ausgewählte Ziel-Plattform zu entwickeln. Vorteil:<br />
In einer Webanwendungen wird <strong>für</strong> Frontund<br />
Backend die gleiche Sprache verwendet.<br />
Allerdings, sind vor <strong>alle</strong>m die Bibliotheken <strong>für</strong><br />
mobile Endgeräte noch sehr experimentell.<br />
Auch Java [4] ist sehr beliebt, wenn es darum<br />
geht, verschiedene Plattformen zu bedienen.<br />
Java gelingt dies durch eine Virtual Machine,<br />
die auf der Zielplattform läuft. Dies ist auf den<br />
meisten Handys, Desktop-Systemen und im<br />
Browser möglich. Darüber hinaus bietet Java<br />
einen riesigen Funktionsumfang und ist sauber<br />
aufgebaut.<br />
Das Corona-Framework [5] bietet die Möglichkeit<br />
unter Mac OS X und Windows <strong>für</strong> Android<br />
und iOS mit Lua und einer sehr guten, umfangreichen<br />
API zu entwickeln.<br />
Apropos OnUpdate: Hier platzieren wir auch<br />
die komplette Programmlogik. Wir speichern<br />
die Pixel-Koordinaten der Maus in unsere<br />
beiden Klassen-Variablen.<br />
Schließlich leeren wir das Display in On-<br />
Render und zeichnen den Text „Hallo Welt“.<br />
Stopp, da fehlt doch noch etwas! Das Laden<br />
von Ressourcen, zum Beispiel Bildern, erfolgt<br />
asynchron. So lange ein Ladevorgang<br />
aktiv ist, wird anstatt OnRender OnLoading<br />
aufgerufen.<br />
Zu guter Letzt hat sich sicherlich der eine<br />
oder andere Leser gewundert, was die Zeile<br />
Strict am Programmbeginn zu bedeuten<br />
hat. Monkey’s Sprachdefinition erlaubt eigentlich<br />
diverse Shortcuts. Beispielsweise<br />
müssen Sie keine Variablen-Typen oder Return-Statements<br />
angeben. In dem Fall sind<br />
Variablen automatisch vom Typ Integer. Auch<br />
Return-Statements generiert der Compiler automatisch.<br />
Im Strict-Modus dagegen ist die<br />
Definition strenger. Die oben angesprochenen<br />
Dinge müssen angegeben werden, ansonsten<br />
beschwert sich der Compiler. Jeder<br />
Entwickler kann sich so <strong>für</strong> seinen bevorzugten<br />
Modus entscheiden.<br />
Damit hat man das Grundgerüst einer Anwendung<br />
zusammen. Damit der <strong>Ein</strong>stieg<br />
noch etwas leichter fällt, befindet sich auf<br />
der Heft-DVD (und im Internet auf GitHub<br />
[2]) der Quellcode eines kompletten in Monkey<br />
programmierten Spiels, der zum Studieren<br />
und Experimentieren einlädt. Sollten Sie<br />
das Spiel weiterentwickeln, freut sich die Redaktion<br />
über eine Zusendung. Wir veröffentlichen<br />
den <strong>Code</strong> dann sehr gerne auf einer<br />
der nächsten DVDs. <br />
● ● ●<br />
Monkey im Überblick<br />
Monkey-Website: www.monkeycoder.co.nz<br />
Lizenz-Kosten: Kostenlos <strong>für</strong> HTML5, 120 USD<br />
<strong>für</strong> weitere Targets (HTML5, Flash, iOS, Android,<br />
XNA, Windows, Mac, Linux)<br />
Jungle-Website: www.jungleide.com<br />
Lizenz-Kosten: 65 Euro Plattform: Windows<br />
Der Autor<br />
Jochen Heizmann ist Spiele-Entwickler<br />
bei Gameforge, einem<br />
der führenden Publisher und Entwickler<br />
<strong>für</strong> browser- und clientbasierte<br />
Massive-Multiplayer-<br />
Spiele. Daneben enwickelt und<br />
veröffentlicht er auf seiner Website<br />
www. intermediaware. com<br />
Indie- und Casual-Games <strong>für</strong> unterschiedliche<br />
Plattformen. Sein<br />
Entwickler-Blog findet sich ebenfalls<br />
unter der genannten URL.<br />
Infos<br />
[1] Projekt-Webseite: http://<br />
www. monkeycoder. co. nz<br />
[2] Beispielapp im Quellcode:<br />
https:// github. com/<br />
JochenHeizmann<br />
[3] Haxe: www. haxe. org<br />
[4] Java:<br />
http:// www. java. com/ de/<br />
[5] Corona: www. anscamobile.<br />
com/ corona/<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 23
Schwerpunkt<br />
Mobile Business Apps<br />
Mobile Business Apps <strong>für</strong> mehrere Gerätetypen<br />
Weichen<br />
stellen<br />
Viele Firmen stehen vor der Aufgabe, ihre Unternehmensdaten und<br />
Business-Anwendungen zu jeder Zeit und von überall aus erreichbar zu<br />
machen. Um möglichst vielen Gerätetypen gerecht zu werden, eignen<br />
sich dazu am besten webbasierte Anwendungen. Worauf man dabei<br />
achten muss, zeigt dieser Artikel. Roman Bucher<br />
unitedplanet.com<br />
Geschäftsdaten unterwegs abzurufen<br />
und zu bearbeiten, gehört<br />
heute zu den täglichen Aufgaben<br />
vieler Mitarbeiter. Verschiedene<br />
Endgeräte wie iPhone, BlackBerry, Android-<br />
Geräte oder Tablet-PCs stellen aber an die<br />
Bedienung und Darstellungsweise zum Teil<br />
sehr unterschiedliche Anforderungen. Um<br />
die Daten und Applikationen trotzdem einheitlich<br />
bereitzustellen, bieten sich webbasierte<br />
Lösungen an. Im Folgenden soll ein<br />
Überblick über die wichtigsten Punkte gegeben<br />
werden, die Entwickler bei der Umsetzung<br />
beachten sollten, damit <strong>alle</strong> Anwender<br />
danach ein auf ihr Gerät optimiertes Verhalten<br />
der App genießen können.<br />
Default Delivery Context<br />
Ausgangspunkt eines jeden Projektes sollte<br />
der von der W3C Mobile Web Best Practices<br />
Working Group (BPWG) empfohlene Default<br />
Delivery Context (DDC) sein. Hierbei handelt<br />
es sich um Mindestanforderungen, welche<br />
an die mobile Anwendung und das Layout<br />
gestellt werden. Die <strong>Ein</strong>haltung dieser Vorgaben<br />
stellt sicher, dass die gewünschten Inhalte<br />
auch auf älteren und/oder technisch<br />
beschränkteren Geräten in einer <strong>für</strong> den Anwender<br />
lesbaren Form dargestellt werden<br />
können. Features, die diesen Mindestanforderungen<br />
genügen, sind beispielsweise die<br />
Verwendung der Bildformate JPEG oder GIF<br />
89a sowie character encoding in UTF-8. Das<br />
maximale Datenvolumen einer mobilen<br />
Applikationsseite sollte 20 KByte nicht überschreiten.<br />
Darüber hinaus sollten keinerlei<br />
Skriptsprachen wie zum Beispiel JavaScript<br />
eingesetzt und Style-Elemente nur auf Basis<br />
von CSS Level 1 verwendet werden. Beachtet<br />
man diese Punkte bei der Erstellung einer<br />
mobilen Applikation, steht dieser schon einmal<br />
ein Grundgerüst an Funktionalität zur<br />
Verfügung, das den technischen Voraussetzungen<br />
<strong>alle</strong>r Geräte genügt.<br />
Progressive Enhancement<br />
Darauf aufbauend lassen sich unter <strong>Ein</strong>satz<br />
der Methode des Progressive Enhancement<br />
anschließend detailliertere und umfassen-<br />
24<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Schwerpunkt<br />
Mobile Business Apps<br />
Abb. 1: iPhone Ansichtsseite mit Navigationselementen<br />
im Kopf der Seite und der Datumseingabe über<br />
das Spinning-Wheel.<br />
dere Anforderungen realisieren. Hierbei können<br />
dann technische Stärken und Fähigkeiten<br />
einzelner Geräte miteinbezogen werden.<br />
So erhalten die Nutzer der mobilen Applikation<br />
ein „besseres“ bzw. „funktionaleres“ Erlebnis<br />
als es mit den beschränkten Funktionalitäten<br />
des DDC möglich ist. Realisiert werden<br />
können diese Erweiterungen beispielsweise<br />
mit JavaScript und Flash, über die Beachtung<br />
größerer Displays und höherer Auflösungen<br />
sowie die Verwendung von Style-<br />
Elementen auf Basis von CSS Level 2 oder 3.<br />
User-Agent-Header<br />
Wird die Applikation um derartige Funktionalitäten<br />
erweitert, ist es wichtig sicherzustellen,<br />
dass die Endgeräte den <strong>für</strong> sie gedachten<br />
Inhalt aufrufen. Solche gerätespezifischen<br />
Weichen lassen sich am einfachsten<br />
über den User-Agent-Header realisieren.<br />
Bei diesen Headern handelt es sich um einfache<br />
Kennungen, die ein auf einen Inhalt<br />
zugreifender Client – wie beispielsweise ein<br />
Webbrowser – sendet. Diese Kennungen enthalten<br />
zudem Informationen über das Client-<br />
Betriebssystem, Softwareversionen und so<br />
weiter. Listing 1 zeigt zum Beispiel den<br />
User-Agent-Header von Firefox 4.0 und der<br />
iPhone-Version von Safari. Im ersten der beiden<br />
Beispiele ist der User-Agent-String des<br />
Desktop-Browsers Mozilla Firefox 4 zu<br />
sehen. Der zweite String identifiziert einen<br />
User-Agent des Safari Mobile Browsers eines<br />
Apple iPhone 4. Da diese Header mit einer<br />
Vielzahl an Schlüsselwörtern (zum Beispiel<br />
iPhone, Android oder BlackBerry) gefüllt<br />
sind, lassen sich die Strings auf diese<br />
Begriffe hin analysieren. Somit lässt sich<br />
feststellen, um welchen zugreifenden Client<br />
es sich aktuell handelt und es können<br />
Weichen hinsichtlich technischer Features,<br />
spezieller Layouts oder Bedienkonzepte<br />
realisiert werden. So kann jedem Client der<br />
<strong>für</strong> ihn bestimmte Inhalt zur Verfügung<br />
gestellt werden.<br />
Wichtig ist hierbei jedoch nicht nur die<br />
Suche nach dem Vorkommen bestimmter<br />
Schlüsselwörter, sondern ebenfalls die Suchreihenfolge<br />
sowie die richtige Auswahl der<br />
Begriffe, nach denen gesucht werden soll.<br />
Beispielsweise macht die Suche nach dem<br />
Schlüsselwort „Mobile“ nur an solchen Stellen<br />
Sinn, an denen zwischen einem Desktopund<br />
einem mobilen Layout unterschieden<br />
werden soll. <strong>Ein</strong>e detailliertere Unterscheidung<br />
nach der Art des mobilen Endgerätes,<br />
zum Beispiel ob es sich um ein BlackBerry-<br />
Gerät oder ein iPhone handelt, ist hierbei<br />
nicht möglich. Für eine solche Unterscheidung<br />
müssen andere Begriffe wie iPhone,<br />
BlackBerry oder Android gewählt werden.<br />
Look-and-Feel anpassen<br />
Die automatische Erkennung des eingesetzten<br />
Gerätetyps ist auch deshalb notwendig,<br />
um die jeweiligen Anforderungen bezüglich<br />
des Look-and-Feel dieses Typs zu erfüllen. So<br />
sollten Entwickler zum Beispiel beachten,<br />
dass iPhone-Apps die Darstellung vorhandener<br />
Daten normalerweise über Listen realisieren<br />
und sich die Navigationselemente wie<br />
zum Beispiel Back-Buttons im Kopfbereich<br />
der Seite befinden. <strong>Ein</strong>gaben von Datumsoder<br />
Zeitwerten sollten nicht über eine numerische<br />
Tastatur, sondern mithilfe eines<br />
Spinning Wheels möglich sein.<br />
Spezielle Bedienung<br />
Oftmals wird beim Entwickeln <strong>für</strong> mobile<br />
Endgeräte nicht oder nur ungenügend beachtet,<br />
dass Smartphones und Tablet-PCs andere<br />
Bedienkonzepte zugrunde liegen, wie man<br />
sie von Desktop-PCs gewohnt ist. <strong>Ein</strong>em Benutzer<br />
stehen hier nicht wie üblich Tastatur<br />
Listing 1: User-Agent-Header<br />
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0<br />
Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en‐us) AppleWebKit/532.9 (KHTML,<br />
like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 25
Schwerpunkt<br />
Mobile Business Apps<br />
und Maus zur Verfügung, sondern die Interaktion<br />
erfolgt über Gesten mit den Fingern.<br />
Auf diesen Umstand ist bereits während des<br />
Applikationsdesigns einzugehen.<br />
Der Benutzer sollte dabei in möglichst wenigen<br />
Schritten und mit möglichst wenig Interaktion<br />
an sein Ziel — die gewünschten Informationen<br />
— gelangen. Dies kann zum<br />
Beispiel dadurch erreicht werden, dass er in<br />
einer Liste verschiedene Werte zur Auswahl<br />
bekommt, anstatt zu verlangen, einen Wert<br />
manuell einzugeben.<br />
Zu vermeidende Elemente<br />
Ebenfalls ist es sinnvoll, auf spezielle Elemente<br />
und Funktionen zu verzichten, die<br />
zwar im Desktopumfeld weitverbreitet sind,<br />
jedoch im mobilen Umfeld unbedingt vermieden<br />
werden sollten. Hierzu zählen unter<br />
anderem die Weiterleitung beziehungsweise<br />
das Öffnen von Popups und Weiterleitungen<br />
mit target="_blank". Bereits bei Desktop-<br />
Browsern ist diese Art der Benutzerführung<br />
schwer zu handhaben. Auf mobilen Geräten<br />
ist dies jedoch nochmals sehr viel schwieriger,<br />
da viele Geräte Popups gar nicht erst unterstützen.<br />
Doch selbst wenn solch eine Unterstützung<br />
vorhanden ist, sorgen mehrere<br />
Bildschirmebenen auf einem Mobil-Display<br />
in der Regel <strong>für</strong> eine komplizierte Handhabung<br />
und sollten deshalb vermieden werden.<br />
Weiterhin beliebt sind auch HTML-Frames,<br />
um mehrere HTML-Dokumente in einer Ansicht<br />
zusammenzufassen und so eine anwendungsähnliche<br />
Oberfläche zu schaffen. Abgesehen<br />
davon, dass viele mobile Geräte<br />
Frames nicht unterstützen, führt diese Art<br />
der Aufbereitung einer Ansicht im mobilen<br />
Umfeld zu unzähligen Problemen: Oft funktioniert<br />
der Zurück-Button nicht oder nicht<br />
wie gewünscht, auch Lesezeichen anzulegen,<br />
ist meist nicht möglich. Zudem wird die<br />
Suche nach Inhalten erschwert und es entstehen<br />
Sicherheitsprobleme, da nicht immer direkt<br />
zu sehen ist, wenn verschiedene Frames<br />
aus verschiedenen Quellen stammen.<br />
Verzichten sollten Sie auch auf Spacer-Gifs,<br />
also auf Grafiken, die lediglich dazu dienen,<br />
Inhalte an bestimmten Positionen zu platzieren.<br />
Diese Grafiken erhöhen nicht nur die<br />
Anzahl an Requests, sondern verursachen<br />
unter Umständen auch höhere Kosten. Für<br />
jedes hinterlegte Bild muss beim Aufruf des<br />
Inhalts bzw. der Seite ein weiterer Request<br />
abgesetzt werden. Höhere Latenzzeiten und<br />
ein höheres Datenaufkommen sind die Folge.<br />
Deshalb sollte stattdessen auf Cascading<br />
Style Sheets (CSS) zurückgegriffen werden.<br />
Damit lassen sich Platzierungen durch Definition<br />
in einer zentralen Datei realisieren,<br />
was die Anzahl an Requests minimiert und<br />
eine saubere und fehlerresistentere Seitenstruktur<br />
zur Folge hat.<br />
Durch den <strong>Ein</strong>satz von CSS kann zudem<br />
auf Layout-Tabellen verzichtet werden. Dadurch<br />
erspart man sich unerwünschte und<br />
meist nicht vorhersehbare Seiteneffekte:<br />
Wird beispielsweise eine Tabelle vollständig<br />
dargestellt und überschreitet sie eine gewisse<br />
Breite, müssen Benutzer horizontal und vertikal<br />
scrollen, um Inhalte anzusehen. Diese<br />
Art der Navigation ist gerade bei einem mobilen<br />
Endgerät äußerst umständlich und<br />
sollte deshalb vermieden werden. Ebenfalls<br />
kann es passieren, dass der verwendete<br />
Browser die Tabelle beim Überschreiten der<br />
Displaybreite umbricht und die fehlenden<br />
Spalten in einer neuen Zeile einfügt. Diese<br />
clientseitige und geräte- sowie softwareabhängige<br />
Transformation ist nicht vorhersehbar<br />
und geht somit zulasten der Übersichtlichkeit.<br />
Außerdem vergrößert sich durch die<br />
Verwendung von Tabellen der zugrunde liegende<br />
HTML-<strong>Code</strong> erheblich, was zu einem<br />
unsauberen <strong>Code</strong> und erhöhtem Datenvolumen<br />
führt. Durch die Verwendung von CSS<br />
können diese Effekte vermieden werden.<br />
Semantisches HTML<br />
Um eine Aufblähung des <strong>Code</strong>s zu vermeiden,<br />
sollte man sich bei der Umsetzung von<br />
Seiten und Layouts nicht nur auf das rein optische<br />
Ergebnis konzentrieren. Vielmehr<br />
sollte man darauf achten, dass die drei <strong>für</strong><br />
ein gutes Ergebnis notwendigen „Säulen“ Inhalt,<br />
Design und Struktur strikt voneinander<br />
getrennt bleiben und auf <strong>alle</strong> drei Punkte in<br />
gleichem Maße Wert gelegt wird. Im Hinblick<br />
auf die Struktur sollte man zudem beachten,<br />
dass das zugrunde liegende Konstrukt an<br />
HTML-Elementen eine gesunde und möglichst<br />
semantische Struktur besitzt. Doch<br />
was genau ist darunter zu verstehen?<br />
Das World Wide Web stellt eine riesige<br />
Masse an Inhalten und Information bereit.<br />
Diese Daten stehen innerhalb des WWW<br />
normalerweise jedoch in keinerlei Beziehung<br />
zueinander. Das WWW bietet lediglich eine<br />
Art Präsentationsplattform, die die erfassten<br />
Daten darstellt.<br />
Um Inhalte tatsächlich als solche zu erkennen<br />
und erfasste Daten entsprechend deuten<br />
zu können, entwickelte Tim Berners-Lee (der<br />
„Erfinder“ des WWW) das Konzept des Semantic<br />
Web. Dieses beruht darauf, dass das<br />
Internet aus Daten besteht, die direkt oder<br />
indirekt von Maschinen interpretiert und verarbeitet<br />
werden können. <strong>Ein</strong> Punkt, der als<br />
26<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Schwerpunkt<br />
Mobile Business Apps<br />
Baustein der Vision vom semantischen Web<br />
angesehen werden kann, ist semantisches<br />
HTML. Die Idee des semantischen HTML<br />
lässt sich am besten an einem einfachen Beispiel<br />
erläutern: Der folgende <strong>Code</strong>abschnitt<br />
zeigt zweimal den Text Semantic HTML.<br />
Beide Darstellungen unterscheiden sich innerhalb<br />
eines Browsers optisch nicht voneinander<br />
– bezüglich ihrer Erzeugung in HTML<br />
sind sie jedoch grundlegend verschieden.<br />
Dies sieht man, wenn man den zugrunde liegenden<br />
<strong>Code</strong> einmal näher betrachtet:<br />
Semantic<br />
HTML<br />
Semantic HTML<br />
Die Formatierung der ersten Überschrift<br />
wurde manuell vorgenommen. Hierbei wurden<br />
die Schriftgröße sowie die Formatierung<br />
<strong>für</strong> den Text angegeben. Bei dieser Art der<br />
Textformatierung ist es nicht möglich, die<br />
Überschrift als solche zu interpretieren. Da<br />
über HTML nur eine optische, aber keine inhaltliche<br />
Struktur erzeugt wurde, können<br />
weder Suchmaschinen noch Screenreader die<br />
Relevanz und Struktur des Inhalts (die eigentlich<br />
beabsichtigte Überschrift) erkennen.<br />
Die zweite Überschrift wurde dagegen mit<br />
dem HTML-Tag erzeugt. Zwar ergibt<br />
sich hierdurch das gleiche optische Ergebnis,<br />
jedoch kennzeichnet dieses Tag den im folgenden<br />
Element enthaltenen Text eindeutig<br />
als Überschrift. Suchmaschinen und Screenreader<br />
können so den Inhalt deuten, zuordnen<br />
und entsprechend interpretieren. Zudem<br />
besitzen praktisch <strong>alle</strong> mobilen Endgeräte<br />
ein Standard-Rendering, um beispielsweise<br />
bei abgeschaltetem CSS oder fehlenden technischen<br />
Möglichkeiten ein Mindestmaß an<br />
HTML-Darstellung von Standardtags wie<br />
zu gewährleisten. Das hört sich jetzt relativ<br />
trivial an, ist aber bei der Umsetzung<br />
ein sehr wichtiger Punkt.<br />
Unterstützende Software<br />
Diese Punkte gilt es zu beachten, wenn man<br />
Applikationen entwickeln will, die auf verschiedenen<br />
mobilen Endgeräten laufen sollen.<br />
Mittlerweile gibt es jedoch auch eine<br />
Reihe an Softwareprodukten, welche die Entwicklung<br />
mobiler Applikationen unterstützen.<br />
Im Bereich Business Software ermöglichen<br />
dies unter anderem die beiden Portallösungen<br />
Microsoft SharePoint (http://<br />
sharepoint. microsoft. com) und Intrexx von<br />
United Planet (http:// www. intrexx. com).<br />
Abb. 2: Intrexx passt den <strong>Code</strong> der Web-Anwendung<br />
so gut wie möglich an die Zielplattform an.<br />
Bei Intrexx werden die Entwickler mithilfe<br />
von Assistenten bei der Erstellung mobiler<br />
Applikationen und Layouts unterstützt. Anstatt<br />
zu programmieren, werden bei dieser<br />
Software mobile Applikationsseiten mithilfe<br />
eines Seitenassistenten erstellt. Der Entwickler<br />
wählt hierbei über eine GUI die Zielplattform<br />
(Geräte mit oder ohne WebKit-Browser),<br />
die anzuzeigenden Daten sowie die gewünschten<br />
Navigationselemente aus. Anschließend<br />
wird die Seite automatisch generiert.<br />
Bereitgestellt werden die ausgewählten<br />
Optionen innerhalb einer XML-Struktur. Alle<br />
später relevanten Eigenschaften – wie zum<br />
Beispiel die Verwendung der richtigen und<br />
semantisch aussagekräftigen HTML-Elemente<br />
(zum Beispiel <strong>für</strong> Überschriften<br />
der ersten Ebene, und <strong>für</strong> Auflistungen)<br />
– sind an dieser Stelle bereits definiert.<br />
Korrekte Labels <strong>für</strong> <strong>Ein</strong>gabe- oder Ansichtsfelder<br />
werden automatisch erstellt. Die<br />
<strong>für</strong> mobile Geräte notwendigen Stilklassen<br />
werden ebenfalls automatisch gesetzt, um<br />
nach einer User-Agent-Filterung das korrekte<br />
Layout bereitzustellen. Dieses XML wird in<br />
einem weiteren Schritt mithilfe von XSL in<br />
VM/HTML-Dateien transformiert.<br />
Die Ergebnisse dieser Transformation können<br />
anschließend direkt im mobilen Webbrowser<br />
aufgerufen werden. Die fertigen mobilen<br />
Applikationsseiten verwenden CSS,<br />
sind mit einer semantischen HTML-Struktur<br />
ausgestattet und verzichten auf Layouttabellen,<br />
Spacer-GIFs und Frames. So entstehen<br />
optisch ansprechende Webapplikationen <strong>für</strong><br />
verschiedene mobile Endgeräte – optimiert<br />
<strong>für</strong> das jeweilige Gerät und mit den typischen<br />
Schaltflächen und Logiken.<br />
● ● ●<br />
Der Autor<br />
Roman Bucher befasste sich in<br />
seinem Studium der Informatik<br />
insbesondere mit Java-Programmierung.<br />
Er arbeitet heute als<br />
technischer Autor beim Portalsoftwarehersteller<br />
United Planet.<br />
Als Bindeglied zwischen der<br />
Entwicklung und dem Support<br />
erstellt er Dokumentationen und<br />
<strong>Code</strong>beispiele <strong>für</strong> Kunden und ist<br />
darüber hinaus in der Qualitätssicherung<br />
tätig. In diesem Rahmen<br />
erarbeitete er unter anderem ein<br />
umfassendes Arbeitspapier, das<br />
sich mit der Erstellung mobiler<br />
Business Applikationen befasst.<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 27
Schwerpunkt<br />
Enterprise Generation Language<br />
Smartphone-Apps mit IBM EGL<br />
Für Groß<br />
und Klein<br />
Auf den ersten Blick gibt es zwischen einem System-Z-Großrechner und<br />
einem iPhone kaum Gemeinsamkeiten. Trotzdem lassen sich beide<br />
Systeme mit einer Programmiersprache bedienen. Das Rezept heißt<br />
Enterprise Generation Language und stammt von IBM. Joachim Sieber<br />
Mit freundlicher Genehmigung von Apple<br />
ibm.com<br />
Trotz zunehmendem <strong>Ein</strong>satz von<br />
Standardsoftware und umfangreichen<br />
Entwicklungen neuer Individualsoftware<br />
sind viele Unternehmen<br />
nach wie vor auf ihre Altsysteme (Legacy)<br />
angewiesen. Diese binden teilweise<br />
große Teile des IT-Budgets und verhindern<br />
die radikale Veränderung von Geschäftsprozessen.<br />
In vielen Unternehmen besteht die<br />
Legacy-Welt aus einer Vielzahl von gewachsenen<br />
Systemen diverser Hersteller, vom<br />
Mainframe bis zum einfachen PC von der<br />
Stange. Oft arbeiten diese zudem auf unterschiedlichen<br />
Plattformen und verfügen über<br />
verschiedene Sprachen und Datenhaltungssysteme.<br />
So benötigt jede Umgebung ihre eigenen<br />
Spezialisten und Werkzeuge. Die<br />
Integ ration in eine moderne und serviceorientierte<br />
Architektur ist deshalb mit großem<br />
Aufwand verbunden.<br />
Vorteile von EGL<br />
EGL wurde dazu geschaffen, diese Probleme<br />
zu beheben. Details zur Enterprise Generation<br />
Language finden Sie im Kasten „Was ist<br />
EGL?“ Die größtenVorteile sind:<br />
• Die gesamte Entwicklung mobiler Applikationen<br />
– vom Backend Service bis zum<br />
Frontend UI – geschieht in EGL. Es besteht<br />
somit kein Bedarf an JavaScript- oder anderen<br />
Fertigkeiten.<br />
• Entwicklung und Bereitstellung einer einzigen<br />
Applikation, die <strong>alle</strong> User unterstützt,<br />
unabhängig von der benutzten mobilen<br />
Plattform.<br />
• <strong>Ein</strong>facher Zugriff auf vorhandene RPGoder<br />
Cobol-Businesslogik, die mit EGL einfach<br />
wiederverwendet werden kann.<br />
28<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Schwerpunkt<br />
Enterprise Generation Language<br />
Durch die Vielzahl der eingebauten Schnittstellen<br />
ist es <strong>für</strong> den Entwickler relativ einfach,<br />
ohne tiefere Kenntnis der Legacy-Technologien<br />
Anwendungen in moderne Softwarearchitekturen<br />
zu integrieren.<br />
<strong>Ein</strong>stieg über Eclipse<br />
Neben vielen Schnittstellen, lässt sich auch<br />
die EGL-Entwicklungsumgebung selbst bei<br />
Bedarf als Plugin zu bestehenden Eclipsebasierten<br />
Entwicklungsumgebungen <strong>für</strong> System<br />
z und System i installieren. Entwickler<br />
können somit zwischen verschiedenen Sichten,<br />
zum Beispiel <strong>für</strong> Legacy-Programmierung<br />
in Cobol, RPG und anderen, Java-Programmierung<br />
und EGL-Programmierung, wechseln.<br />
Da sich EGL auch leicht von Entwicklern<br />
erlernen lässt, die sich nicht mit der technischen<br />
Komplexität einer Java-Anwendung belasten<br />
wollen, ist EGL nebenbei auch noch ein<br />
verbindendes Element zwischen Legacy-Programmierern<br />
und Java-Programmierern.<br />
Für die Ausführung von EGL-Programmen<br />
stehen verschiedene Generierungsoptionen<br />
zur Verfügung. Als Standard erzeugt die<br />
Enterprise Generation Language Java-<strong>Code</strong>,<br />
der auf beliebigen Plattformen ablauffähig<br />
ist. Optional lässt sich auch schneller Native<br />
<strong>Code</strong> <strong>für</strong> System z und System i erzeugen.<br />
Damit EGL sich gut im Markt etablieren<br />
kann, hat IBM vor einigen Monaten eine<br />
kostenlose Version von EGL verfügbar gemacht:<br />
die EGL Community Edition [1].<br />
EGL steht unter einer freien Lizenz. Anfang<br />
Juni letzten Jahres hat IBM zudem ein<br />
Eclipse-Projekt gestartet, quasi als Alternative<br />
zur Java-Programmierung [2]. Die EGL<br />
Development Tools stellen somit eine freie<br />
Entwicklungsumgebung <strong>für</strong> EGL inklusive<br />
Parser, Compiler und <strong>Code</strong>-Generatoren<br />
bereit. Auch die Sprache selbst – inklusive<br />
Syntax – ist Open Source.<br />
Mobile Web Edition<br />
Seit Januar dieses Jahres gibt es eine erste<br />
Erweiterungsbibliothek <strong>für</strong> das Entwickeln<br />
mobiler Applikationen [3]. Die Library liefert<br />
den Entwicklern Steuerungselemente, um<br />
Web Applikationen <strong>für</strong> Smartphones oder<br />
Tablets zu entwickeln, die das Erscheinungsbild<br />
einer nativen iOS oder Android-Applikation<br />
annehmen können. Sie unterstützt dabei<br />
folgende Widgets:<br />
• DojoMobileView<br />
• DojoMobileList<br />
• DojoMobileListCategory<br />
Was ist EGL?<br />
Speziell <strong>für</strong> die Plattformen System z und System<br />
i hat IBM mit der Enterprise Generation<br />
Language (EGL) ein Entwicklungswerkzeug geschaffen,<br />
über das sich die Administration von<br />
Legacy-Systemen vereinfachen lässt. Im<br />
Wesentlichen besteht EGL aus zwei Komponenten:<br />
Die erste Komponente ist eine serviceorientierte<br />
Programmiersprache mit einer Vielzahl<br />
von integrierten Schnittstellen zu Legacy-Anwendungen<br />
sowie zu Diensten, Benutzerschnittstellen<br />
und J2EE-Umgebungen. Die<br />
zweite Komponente besteht aus einer Eclipsebasierten<br />
Entwicklungsumgebung. Sie bringt<br />
Werkzeuge und Wizards zur Lösung von Integrationsaufgaben<br />
mit.<br />
<strong>Ein</strong>e EGL-Anwendung besteht aus vier Schichten:<br />
der Datenbankzugriffsschicht, der Business<br />
Logik, dem Controller und dem User Interface.<br />
Jede dieser Schichten bietet eine Reihe von<br />
Schnittstellen sowohl zu Legacy-Anwendungen,<br />
als auch zu modernen J2EE- oder Web-<br />
Anwendungen. So lassen sich über die Datenbankschicht<br />
gemischt sowohl relationale Datenbanken<br />
(DB2, Informix, Oracle, SQL-Server,<br />
MySQL) als auch ältere Datenhaltungssysteme<br />
(VSAM, IMS/DB, DB2/400, ADABAS) in einfacher<br />
Weise ansprechen. Auf Ebene der Business<br />
Logik und des Controllers lassen sich verschiedene<br />
Programmiersprachen (Java, Cobol,<br />
RPG, PL1, EGL, C, JCL, OCL, etc.), Transaktionsmonitore<br />
(CICS, IMS) und Services (Webservices,<br />
Restservices, RPC) einbinden. Als Benutzeroberfläche<br />
stehen RichClient (Web2.0 mit<br />
JavaScript), JSF, AJAX und Green Screen (5250<br />
und 3270) zur Verfügung, wobei <strong>für</strong> mobile und<br />
RUI-Anwendungen JavaScript zum <strong>Ein</strong>satz<br />
kommt. EGL eignet sich nicht nur <strong>für</strong> trockene<br />
Materien: Auch Spiele lassen sich realisieren.<br />
Abb. 1: Schematische Übersicht der Möglichkeiten<br />
der Enterprise Generation Language.<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 29
Schwerpunkt<br />
Enterprise Generation Language<br />
Abb. 2: Der EGL Service Client Wizard unterstützt Sie beim Anlegen eines neuen Projektes.<br />
Abb. 3: Per Drag & Drop richten Sie die grafische Oberfläche ein.<br />
• DojoMobileListItem<br />
• DojoMobileTabContainer<br />
• DojoMobileTab<br />
• DojoMobileSwitch<br />
• DojoMobileButton<br />
Um eine Beispielanwendung zu erstellen, benötigen<br />
Sie Eclipse mit RBD (EGL) als Entwicklungsumgebung<br />
und einen Applikationserver<br />
(Tomcat). Im Folgenden zeigt der Artikel<br />
anhand einer Beispielanwendung von<br />
IBM, wie Sie eine App erstellen, die den Zins<br />
<strong>für</strong> eine Hypothek berechnet.<br />
Dazu legen Sie zunächst in der relationalen<br />
Datenbank (RDB) unter dem Namen<br />
„Zinsberechnung“ ein neues EGL-RUI-Projekt<br />
an. Die benötigte WebService-WSDL-Datei<br />
CallRPGAmortize.wsdl übernehmen Sie<br />
dazu aus dem fertigen IBM-Beispielprojekt,<br />
das Sie im Quellcode unter [4] herunterladen<br />
können. Nun starten Sie den EGL Service<br />
Client Wizard, welcher automatisch das<br />
Interface mit den dazugehörigen Variablen<br />
anlegt (Abbildung 2).<br />
Im nächsten Schritt legen Sie einen neuen<br />
EGL RUI Handler mit dem Namen Sample-<br />
Calculate an und ziehen die benötigten Elemente<br />
(dazu gehören TextLabel, DojoCurrencyTextBox,<br />
DojoMobileSwitch, DojoMobileButton<br />
und weitere) per Drag & Drop auf<br />
die neue Oberfläche (Abbildung 3). Speichern<br />
Sie anschließend die grafische Oberfläche<br />
unter dem Namen FormGrid.<br />
Im letzten Schritt<br />
geht es nun ans eigentliche<br />
Programmieren.<br />
So soll der Zinsrechner<br />
beim Drücken<br />
des Buttons die Funktion<br />
BerechnungsButton_onClick<br />
aufrufen<br />
und über callLocal-<br />
Service() die Zinsen<br />
per JavaScript berechnen.<br />
Für einen serverbasierten<br />
Berechnungsvorgang<br />
über<br />
den RPG-WebService<br />
rufen Sie die Funktion<br />
callRpgService() auf,<br />
als Callback-Funktion<br />
des WebServices dient<br />
displayResultsRPG().<br />
30<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Schwerpunkt<br />
Enterprise Generation Language<br />
Der Autor<br />
Joachim Sieber arbeitet bei der<br />
Firma PKS Software GmbH als<br />
Manager Techsales. Sie erreichen<br />
Herrn Sieber unter der<br />
E-Mail-Adresse sieber@pks. de.<br />
Infos<br />
Abb. 4: Der Quellcode der hier vorgestellten Beispielanwendung.<br />
Schließlich ermittelt die Anwendung aus den<br />
erhaltenen Werten über Amortize() den gewünschten<br />
Zins. Um das Aussehen der App<br />
auf verschiedenen Plattformen muss sich der<br />
Entwickler nicht kümmern, das erledigt EGL<br />
automatisch. Die fertige mobile<br />
EGL-Webapplikation können Sie<br />
sich unter [5] in Aktion ansehen<br />
und testen.<br />
Fazit<br />
Mit EGL sind die Entwickler imstande,<br />
eine mobile Web-Applikation<br />
schnell zu entwickeln, die wie<br />
eine native mobile Applikation<br />
aussieht. EGL eignet sich dabei besonders<br />
gut <strong>für</strong> Firmen und Anwender,<br />
die zum Teil Uralt-Anwendungen<br />
ins mobile Zeitalter übernehmen<br />
möchten. Wer neugierig<br />
geworden ist und mehr erfahren<br />
möchte, besucht einfach das EGL-Café, den<br />
Treffpunkt der EGL-Community [6]. Hier finden<br />
Sie auch am schnellsten Antwort, falls<br />
Sie bei der Programmierung mit EGL auf<br />
Prob leme stoßen.<br />
● ● ●<br />
Abb. 5: Die fertige Anwendung unter iOS und Android (rechts).<br />
[1] EGL Community Edition:<br />
https:// www. ibm. com/<br />
<strong>developer</strong>works/<br />
my<strong>developer</strong>works/ wikis/<br />
home/ wiki/ W75c8733d99bb_<br />
4d55_9ee8_4dbc8c56ebee/<br />
page/ EGL%20Community%20Edition?<br />
lang=en<br />
[2] EGL-Eclipse-Projekt:<br />
http:// www. eclipse. org/<br />
proposals/ egl/<br />
[3] EGL Mobile Dokumentation:<br />
https:// www. ibm. com/<br />
<strong>developer</strong>works/<br />
my<strong>developer</strong>works/ files/<br />
form/ anonymous/ api/ library/<br />
da00a47c‐46a4‐4a0e‐9656‐26<br />
2b7af8305c/ document/<br />
84fa749f‐a446‐4bb8‐90fcb64b2ff444d9/<br />
media/<br />
EGL%20Mobile%20Web%20<br />
V070. pdf<br />
[4] Beispielprojekt von IBM:<br />
https:// www. ibm. com/<br />
<strong>developer</strong>works/<br />
my<strong>developer</strong>works/ blogs/ 3e<br />
2b35ae‐d3b1‐4008‐adee‐2b3<br />
1d4be5c92/ entry/ exploring_<br />
the_mobile_mortgage_<br />
app1? lang=en<br />
[5] Beispielanwendung in Aktion:<br />
http:// vpn. pks. de/<br />
MobileMortgage/ index‐en_<br />
US. html<br />
[6] EGL-Café:<br />
https:// www. ibm. com/<br />
<strong>developer</strong>works/ rational/<br />
community/ cafe/ egl. html<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 31
Hardware<br />
Dell Venue Pro<br />
dell.com<br />
Dell Venue Pro mit Windows Phone 7<br />
Starkes<br />
Stück<br />
Big is beautiful haben sich die Designer bei Dell wohl gesagt,<br />
als sie ihr erstes Smartphone mit Windows Phone 7 entworfen<br />
haben. Das Resultat heißt Venue Pro und macht in praktisch<br />
<strong>alle</strong>n Bereichen eine gute Figur. Marcel Hilzinger<br />
Wer ein Smartphone mit Windows<br />
Phone 7 und einer Hardware-Tastatur<br />
suchte, musste<br />
sich hierzulande recht lange<br />
gedulden. Seit April gibt es nun immerhin<br />
zwei Modelle: das hier vorgestellte Dell<br />
Venue Pro im Stil eines Palm Pre und das<br />
HTC 7 Pro mit seitlich ausziehbarer Tastatur.<br />
Das Venue Pro besitzt eine komplette Quertz-<br />
Tastatur mit einer Sondertaste <strong>für</strong> [ä] und<br />
[é], die sich nach unten ausfahren lässt und<br />
wahlweise als Displaytastatur <strong>für</strong> die Texteingabe<br />
zur Verfügung steht.<br />
Der offizielle Preis bei Dell Deutschland<br />
beträgt inklusive Versandkosten 550 Euro,<br />
günstiger gibt es das Smartphone zurzeit nur<br />
bei Amazon (490 Euro, Stand Mai 2011). Falls<br />
Sie das Gerät bei Dell bestellen, erhalten Sie<br />
<strong>für</strong> lediglich 9 Euro Aufpreis einen Support<br />
mit zwei Jahren Abholservice vor Ort.<br />
Die Hardware<br />
Das Venue Pro liegt sehr gut in der Hand.<br />
Das hängt unter anderem damit zusammen,<br />
dass es mit einem Gewicht von knapp 200 g<br />
sehr schwer und zudem auch 1,5 cm dick ist.<br />
Das Design erinnert mit dem abgerundeten<br />
Rücken und der schräg angeschnittenen Unterkante<br />
auf den ersten Blick an das Xperia<br />
X10 von Sony Ericsson, das Venue Pro bringt<br />
<strong>alle</strong>rdings eine nach unten ausziehbare Hardware-Tastatur<br />
mit. An der Verarbeitung gibt<br />
es kaum etwas auszusetzen. <strong>Ein</strong>zig die hintere<br />
Abdeckung, unter der sich der<br />
1400-mAh-Akku und der SIM-Kartenslot befinden,<br />
könnte etwas stabiler gebaut sein.<br />
Wie die meisten seiner WP7-Artgenossen<br />
verzichtet auch das Venue Pro auf einen<br />
Micro-SD-Kartenslot, obwohl ursprünglich<br />
ein solcher geplant war und auch eine entsprechende<br />
Aussperrung vorhanden ist [2].<br />
Sie müssen also mit den integrierten 8 GByte<br />
Speicher auskommen.<br />
Zu den Stärken des Venue Pro gehören<br />
neben der wirklich sehr guten Tastatur mit<br />
einem angenehmen Schiebemechanismus<br />
und Beleuchtung das 4,1-Zoll große<br />
AMOLED-Display und die eingebaute 5-Megapixel-Kamera.<br />
Das Display ist gleichmäßig<br />
ausgeleuchtet und sorgt <strong>für</strong> sehr kräftige und<br />
leuchtende Farben. Die Kamera macht auch<br />
bei etwas schlechterer Beleuchtung noch<br />
recht gute Bilder und nimmt Videos mit einer<br />
maximalen Auflösung von 720p auf. Allerdings<br />
eignet sie sich im 720p-Modus mehr<br />
<strong>für</strong> gemütliche Dokumentarfilme. Sobald Sie<br />
schnelle Schwenks durchführen oder ein sich<br />
schnell bewegendes Motiv filmen möchten,<br />
reicht die Rechenpower nicht mehr aus. Gut<br />
gefiel uns auch die Schnellkamera-Funktion<br />
von Windows Phone 7: Halten Sie den Auslöser<br />
<strong>für</strong> rund eine Sekunde gedrückt, dann<br />
schaltet sich automatisch die Kamera ein. Im<br />
Unterschied zu anderen mobilen Betriebs-<br />
32<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Hardware<br />
Dell Venue Pro<br />
systemen funktioniert dies bei<br />
WP7 auch im Standby, Sie müssen<br />
das Venue Pro dazu nicht<br />
erst entsperren.<br />
Die Hardwaretastatur verfügt<br />
über einen angenehmen Druckpunkt<br />
und lässt sich auch einhändig<br />
auf- und zuschieben.<br />
Die einzelnen Tasten sind leicht<br />
gewölbt, <strong>alle</strong>rdings nicht so<br />
stark wie bei einem BlackBerry.<br />
Die Hintergrundbeleuchtung<br />
schaltet sich bei Dunkelheit<br />
automatisch ein und stört nicht<br />
mit zu grellen Tasten.<br />
dell.com<br />
Die Software<br />
Zur vorinstallierten Software<br />
gibt es nichts Besonderes zu berichten,<br />
da Dell — wie sämtliche<br />
anderen Hersteller auch —<br />
aktuell an die strengen Vor gaben von Microsoft<br />
gebunden ist. Somit unterscheidet sich<br />
das Windows Phone 7 auf dem Dell Venue<br />
Pro in praktisch keiner Weise von einem<br />
WP7 bei Samsung, LG oder HTC. Da Dell<br />
auch keinerlei zusätzliche Programme vorinstalliert<br />
hat, könnte man quasi von einem<br />
Vanilla Windows Phone 7 sprechen.<br />
Das Testgerät von Dell Deutschland erreichte<br />
uns mit der Firmware-Version<br />
7.0.7355.0, die wir dann über Zune auf Version<br />
7.0.7392.0 aktualisierten. Das Update<br />
von Anfang Mai enthält neben den neuen<br />
Features des „März-Update“ (Copy & Paste,<br />
Verbesserungen im Market Place) auch einen<br />
Sicherheitspatch <strong>für</strong> den Browser, der die<br />
beim Anbieter Comodo gestohlenen Zertifikate<br />
als nicht vertrauenswürdig erklärt.<br />
Kritikpunkte<br />
Negativ aufgef<strong>alle</strong>n sind in den Tests die<br />
Lautsprecher des Venue Pro und die Lautstärkeregelung.<br />
So fällt die Qualität der eingebauten<br />
Stereo-Speaker, die sich an der Unterkante<br />
des Smartphones befinden, im Vergleich<br />
zu anderen WP7-Handys deutlich ab.<br />
Zudem kann man die Speaker so laut schalten,<br />
dass man praktisch nur noch Lärm registriert,<br />
keine Musik mehr. Das wäre nicht weiter<br />
tragisch, <strong>alle</strong>rdings lässt sich die Lautstärke<br />
auch via Kopfhörer über die Maßen<br />
aufdrehen, sodass Sie bei maximaler Lautstärke<br />
bereits nach kurzer Zeit mit einem Gehörschaden<br />
rechnen müssen. Da das Venue<br />
Pro sich in erster Linie an Business-Kunden<br />
richtet, kann man diesen Umstand verschmerzen,<br />
bei einem Consumer-Gerät<br />
müsste Dell hier klar nachbessern.<br />
Abb. 1: Anstelle des Smiley und der .com-Taste wären [ö] und [ü] <strong>für</strong><br />
die deutschsprachige Kundschaft praktischer.<br />
Für ein Business-Smartphone würden wir<br />
uns zudem eine kleine Änderung bei der Tastatur<br />
wünschen: So bringt diese zwar eine eigene<br />
Taste mit, um Smileys einzugeben und<br />
<strong>für</strong> die Erweiterung .com, das @-Zeichen<br />
müssen Sie aber über eine Kombination mit<br />
[Fn] eingeben (Abbildung 1). Auch [ö] und<br />
[ü] wären <strong>für</strong> die deutsche Version praktisch.<br />
In Kombination mit den Vorschlägen auf dem<br />
Touchscreen lassen sich aber auch Wörter<br />
mit Umlauten recht flott schreiben, zudem<br />
können Sie sich die [Fn]-Funktion sparen,<br />
indem Sie eine Taste einfach länger gedrückt<br />
halten. Verzichten müssen Sie hingegen auf<br />
eine [ß]-Taste.<br />
Wie bei den meisten Smartphones mit großem<br />
Display gehört auch beim Venue Pro die<br />
Akkulaufstärke nicht zu den herausragenden<br />
Eigenschaften des Dell-Handys. <strong>Ein</strong>en Arbeitstag<br />
hält das Venue Pro durch, viel mehr<br />
liegt auch bei relativ extensiver Nutzung<br />
ohne WLAN nicht drin.<br />
Fazit<br />
Durch seine Bauweise als Slider hebt sich<br />
das Venue Pro von Dell klar von der restlichen<br />
Windows-Phone-7-Konkurrenz ab.<br />
Auch hinsichtlich der Verarbeitung und Ausstattung<br />
des Handys gibt es mit Ausnahme<br />
der fehlenden Lautstärkebeschränkung keine<br />
kritischen Negativpunkte. Allerdings hätte<br />
Dell mit einer leicht flacheren Bauweise und<br />
etwas weniger Gewicht ein echtes Top-Handy<br />
launchen können. So bleibt es bei einem<br />
nicht ganz günstigen aber soliden Arbeitsgerät.<br />
Dank des Alleinstellungsmerkmals wird<br />
Dell den <strong>für</strong> Windows-Phone-7-Geräte doch<br />
recht hohen Preis von rund 500 Euro <strong>für</strong> eine<br />
Weile halten können.<br />
● ● ●<br />
Infos<br />
[1] Produktseite:<br />
http:// www. dell. com/ de/<br />
unternehmen/ p/<br />
mobile‐venue‐pro/ pd<br />
[2] Micro-SD-Kartenslot:<br />
http:// www. engadget. com/<br />
2010/ 11/ 10/ dell‐venue‐pro‐ha<br />
s‐a‐microsd‐card‐slot‐youll‐j<br />
ust‐need‐to‐void/<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 33
Hardware<br />
Motorola Defy<br />
Im Test: Outdoor-Handy Motorola Defy<br />
Hart im<br />
Nehmen<br />
motorola.com<br />
Defy heißt so viel wie „trotzen“ oder „herausfordern“. Das trifft das<br />
derzeitige Alleinstellungsmerkmal des Gerätes ziemlich genau:<br />
Motorolas Defy ist nicht nur äußerst robust und leistungsstark,<br />
sondern auch provozierend günstig. Thomas Leichtenstern<br />
Abb. 1: Abdeckungen an der USBund<br />
Audiobuchse verhindern das<br />
<strong>Ein</strong>dringen von Flüssigkeit und Staub.<br />
Bereits im September letzten<br />
Jahres stellte Motorola das<br />
Outdoor-Handy Defy [1]<br />
vor. In heutigen Zeitmaßstäben<br />
gerechnet, gehört es damit inzwischen<br />
beinahe schon zum alten Eisen. Allerdings<br />
wartet das Smartphone mit Attributen<br />
auf, mit denen es zum Dauerbrenner avancieren<br />
könnte. Es bietet nämlich teilweise<br />
einzigartige Ausstattungsmerkmale zum derzeit<br />
unschlagbaren Preis von etwa 250 Euro.<br />
Strapazierfähig<br />
Laut Herstellerangaben entspricht das<br />
Android-Smartphone der Schutzklasse IP67.<br />
Die sieht nicht nur einen vollständigen<br />
Staubschutz vor, sondern garantiert auch,<br />
dass das <strong>Ein</strong>dringen von Wasser bei zeitweiligem<br />
<strong>Ein</strong>tauchen vermindert wird. Da<strong>für</strong><br />
spendierte Motorola den physikalischen<br />
Schnittstellen Gummistöpsel, der sie gegen<br />
<strong>Ein</strong>dringen von Fremdkörpern schützt (Abbildung<br />
1). Darüber hinaus besteht das Display<br />
aus kratzunempfindlichem Gorillaglas,<br />
das auch mal eine Rutschpartie über den Asphalt<br />
unbeschadet überlebt. Da es auch heftigere<br />
Stöße und Stürze klaglos übersteht, ist<br />
es derzeit wohl das robusteste Smartphone<br />
auf dem Markt. Das fällt schon beim Öffnen<br />
des Gehäusedeckels auf, der wegen der<br />
Gummidichtung deutlich strammer sitzt als<br />
bei den meisten anderen Smartphones.<br />
Da die Entwickler mehr die Funktionalität<br />
in den Fokus stellten, leidet die Ästhetik ein<br />
wenig: <strong>Ein</strong>en Schönheitspreis gewinnt das<br />
Handy sicherlich keinen, da<strong>für</strong> erweist es<br />
sich als sehr alltagstauglich und bietet praktisch<br />
die gleichen Ausstattungsmerkmale wie<br />
deutlich teurere Konkurrenten.<br />
Die Hardware<br />
Das Kernstück des Smartphones ist die CPU<br />
OMAP3610 von Texas Instruments mit einer<br />
Taktung von 800 MHz. Im Vergleich zur Konkurrenz,<br />
die inzwischen mit einem GHz und<br />
mehr aufwartet, klingt das nicht besonders<br />
viel, jedoch hängt das Phone mit 1026 Punkten<br />
im Benchmark mit Quadrant-Standard-<br />
Edition [2] diverse Vertreter mit schnelleren<br />
CPUs deutlich ab [3]. So erreichten das<br />
Nexus One und HTC Desire gerade einmal<br />
500 Punkte. Das liegt nicht zuletzt an der<br />
verbauten PowerVR SGX 530 GPU im Defy,<br />
die das Darstellen von Grafiken übernimmt.<br />
Das zeigt sich auch im Alltag: Praktisch <strong>alle</strong><br />
Anwendungen starten ohne große Verzögerung<br />
und laufen flüssig.<br />
Auch speichertechnisch ist das Defy bestens<br />
gerüstet. So wartet es mit 500 MByte<br />
RAM (Arbeitsspeicher) und 2 GByte ROM<br />
(Datenspeicher) auf, wovon das System etwa<br />
800 MByte belegt. Der Micro-SD-<strong>Ein</strong>schub,<br />
der sich im Batteriefach befindet, nimmt Karten<br />
bis zu einer Kapazität von 32 GByte auf,<br />
eine 2-GByte-Karte liefert Motorola mit.<br />
Auch wenn es optisch anders wirkt, ist das<br />
Display mit 3,7 Zoll (9,5 cm) Diagonale so<br />
groß wie das des HTC Desire. Mit einer Auflösung<br />
von 480 x 854 Pixeln zeigt es auch filigranere<br />
Bilder noch gestochen scharf und<br />
unverpixelt an. Im Test zeigte die Anzeige<br />
auch bei Sonnenlicht kaum Schwächen.<br />
34<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Hardware<br />
Motorola Defy<br />
Dank des eingebauten Helligkeitssensors<br />
passt das Gerät die Displaybeleuchtung automatisch<br />
ans Umgebungslicht an.<br />
Zum Kontakt mit der Außenwelt setzt Motorola<br />
löblicherweise auf die gängigen Standards:<br />
<strong>Ein</strong>e 3,5-mm-Klinke bietet sich als<br />
Anschluss <strong>für</strong> Head-Set und Kopfhörer an,<br />
die Micro-USB-Buchse verbindet das Phone<br />
mit dem PC oder Ladegerät.<br />
Sehr gute Ergebnisse erzielt das Smartphone<br />
beim Telefonieren. Zum einen wartet<br />
es mit einem sehr guten Empfangsteil auf,<br />
zum anderen unterdrücken diverse Filter<br />
wirkungsvoll Fremdgeräusche. Das erweist<br />
sich vor <strong>alle</strong>m dann als großer Vorteil, wenn<br />
Sie das Gerät beispielsweise während einer<br />
Autofahrt im Freisprechmodus betreiben.<br />
<strong>Ein</strong>er der Schwachpunkte fast <strong>alle</strong>r Smartphones<br />
ist die kurze Akkulaufzeit. Das Defy<br />
macht hier keine Ausnahme. Obwohl es mit<br />
einer Leistung von 1540 mAh einen vergleichsweise<br />
starken Akku mitbringt, geht<br />
ihm bei intensiver Nutzung nach 10-12 Stunden<br />
die Puste aus. Wie bei den meisten<br />
Android-Smartphones lässt sich über das<br />
Ausschalten der automatischen Synchronisation<br />
die Laufzeit verlängern, sodass Wenigtelefonierer<br />
auf bis zu drei Tage kommen.<br />
Im Test überraschte die Qualität der integrierten<br />
5-MPixel-Kamera: Sie produzierte<br />
auch bei schlechteren Lichtverhältnissen<br />
noch vergleichsweise gute Bilder. Der eingebaute<br />
Blitz überzeugt jedoch nicht. Bereits in<br />
einer Entfernung von mehr als einem Meter<br />
verpufft seine Wirkung. Da<strong>für</strong> eignet er sich<br />
mit der im Google Market erhältlichen App<br />
DroidLight prima als LED-Taschenlampe.<br />
Die Software<br />
Motorola liefert das Gerät mit der nicht mehr<br />
zeitgemäßen Android-Version 2.1 aus, verspricht<br />
aber <strong>für</strong> das zweite Quartal 2011 ein<br />
Update auf 2.2. <strong>Ein</strong>e weitere Versionserhöhung<br />
bietet der Konzern aber voraussichtlich<br />
nicht an. Wie sämtliche Motorola-Handys<br />
setzt auch das Defy auf die Oberfläche Motoblur.<br />
Über die Vor- und Nachteile berichteten<br />
wir bereits im Testbericht zum Milestone 2 in<br />
der Ausgabe 01/2011 von Smart Developer<br />
[4]. Der damit verbundene Online-Account<br />
erfordert zunächst eine Registrierung, danach<br />
synchronisiert ein Dienst regelmäßig<br />
die Adressdaten und erlaubt im Verlustfall<br />
das Löschen der persönlichen Daten vom<br />
Gerät. Der Service von Motorola stößt bei einigen<br />
Anwendern auf Kritik, so stört zum<br />
Beispiel das gelegentliche Ruckeln beim<br />
Blättern zwischen den virtuellen Desktops.<br />
Zudem erfordern die meisten Android-<br />
Abb. 2: Motorolas webbasiertes Phone Portal ermöglicht es unter anderem, per Web-Browser<br />
<strong>Ein</strong>stellungen am Handy zu ändern und Kontakte zu im- oder exportieren.<br />
Dienste neben dem Motorola-Account auch<br />
einen Google-Account, der praktisch dieselben<br />
Daten übers Netz synchronisiert. Abhilfe<br />
gegen Motoblur schaffen diverse Apps, etwa<br />
Go Launcher EX [5].<br />
Allerdings bietet Motorola auch durchaus<br />
sinnvolle Zusatzprodukte – <strong>alle</strong>n voran die<br />
App G3 Mobile Hotspot. Sie verwandelt das<br />
Telefon in einen WLAN-Hotspot, über den<br />
Sie beispielsweise mit Ihrem Laptop im Internet<br />
surfen. Im Test funktionierte der Verbindungsaufbau<br />
problemlos. Allerdings benötigt<br />
das Gerät in diesem Modus sehr viel Energie.<br />
Zum Verwalten des Phones via PC bietet Motorola<br />
zudem die App Phone Portal. Sie stellt<br />
als Verbindungsmöglichkeit zur webbasierten<br />
Verwaltungsoberfläche (Abbildung 2)<br />
WLAN oder USB bereit.<br />
Der Zugriff auf die Konfiguration im USB-<br />
Modus Portal und Tools setzt eine auf dem<br />
Rechner installierte Software voraus. Unter<br />
Windows geschieht dessen Setup automatisch<br />
beim ersten <strong>Ein</strong>stecken des Smartphones.<br />
Sie ermöglicht es auch, das Handy<br />
als Modem über diese Schnittstelle zu nutzen.<br />
Für Linux fehlen die benötigten Treiber.<br />
Fazit<br />
Das Defy erweist sich nicht nur als ausgesprochen<br />
robust, sondern auch als sehr performant.<br />
Dank der Auflösung von 480 x 854<br />
Pixeln eignet sich das Display auch zum<br />
Spielen und Betrachten von Bildern. Alles in<br />
<strong>alle</strong>m ist das Smartphone ein klasse Allrounder<br />
und bietet mit einem Preis von etwa 250<br />
Euro das mit Abstand beste Preis-/Leistungsverhältnis<br />
unter den Androiden. <br />
● ● ●<br />
Infos<br />
[1] Motorola Defy:<br />
http:// www. motorola. com/<br />
Consumers/DE‐DE/<br />
Consumer‐Productsand‐Services/Mobile‐<br />
Phones/ MOTOROLA‐<br />
DEFY‐DE‐DE? localeId=22<br />
[2] Quadrant-Standard-Edition-<br />
Benchmark:<br />
http:// www. appbrain. com/<br />
app/quadrant‐standard‐edition/<br />
com. aurorasoftworks.<br />
quadrant. ui. standard<br />
[3] Quadrant-Standard-Edition<br />
Benchmark-Ergebnisse:<br />
http:// www. androidpit. de/ de/<br />
android/ forum/ thread/<br />
406478/ Defy‐Power<br />
[4] Milestone-2-Testbericht:<br />
Marcel Hilzinger, „Aufs<br />
Wichtigste konzentriert –<br />
Milestone 2 von Motorola“,<br />
Smart Developer 01/2011,<br />
S. 40.<br />
[5] Go Launcher Ex:<br />
https:// market. android. com/<br />
details? id=com. gau. go.<br />
launcherex<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 35
Hardware<br />
HTC Desire HD<br />
htc.com<br />
Im Test: HTC Desire HD<br />
Voll fett<br />
Das Desire HD gehört trotz neu angekündigter HTC-Smartphones<br />
weiterhin zu den bestausgestatteten Androiden von<br />
HTC. Wir haben das 4,3-Zoll-Smartphone getestet. Marcel Hilzinger<br />
Info<br />
[1] Produktseite:<br />
http:// www. htc. com/ de/<br />
product/ desirehd/<br />
specification. html<br />
Das Desire HD kam in die Smart-<br />
Developer-Redaktion mit der Original-Firmware<br />
und Android 2.2.<br />
<strong>Ein</strong> Check <strong>für</strong> Updates zeigte,<br />
dass Android 2.2.1 als OTA-Update verfügbar<br />
ist (Buildnummer 1.84.207.2). Diese Firmware<br />
spielten wir denn auch <strong>für</strong> diesen Test<br />
ein. Das im Mai ausgelieferte Update auf<br />
Android 2.3 war leider im Testzeitraum<br />
Mitte April noch nicht verfügbar.<br />
Erster <strong>Ein</strong>druck: großartig<br />
Das Desire HD gehört mit seinen Abmessungen<br />
von 6,8 x 12,3 cm und einem Gewicht<br />
von gut 160 g zu den Boliden unter den<br />
An droid-Smartphones. Es liegt angenehm in<br />
der Hand, die Größe ist aber nicht jedermanns<br />
Sache. Das 4,3-Zoll-Display ist gut<br />
ausgeleuchtet und der stark spiegelnde<br />
Touchscreen reagiert flott auf <strong>Ein</strong>gaben.<br />
Neben dem obligatorischen <strong>Ein</strong>schaltknopf<br />
und den vier Android-Tasten verfügt das<br />
Desire HD über eine Wippe <strong>für</strong> die Lautstärkeregelung.<br />
Die Hardwaretasten stehen<br />
praktisch nicht vor, was zwar das versehentliche<br />
Drücken verhindert, aber oft<br />
auch die Bedienung etwas erschwert. Das<br />
Desire HD verfügt über 786 MByte RAM<br />
und 1,5 GByte internen Speicher, der sich<br />
per Micro-SD-Karte um maximal 32<br />
GByte erweitern lässt. Aktuell (Stand:<br />
Mai 2011) kostet das Android-Smartphone<br />
im Internet knapp 400 Euro.<br />
Besser als die anderen<br />
Neben dem schön großen Display<br />
macht das Desire HD auch als<br />
Audioplayer eine sehr gute Figur.<br />
Dazu hat HTC das Smartphone mit<br />
Dolby Mobile und SRS-WOW-Support<br />
ausgestattet, wobei vor <strong>alle</strong>m die<br />
SRS-Klangverbesserung <strong>für</strong> ein<br />
überzeugendes Klangvolumen sorgt.<br />
Auch die 8-Megapixelkamera weiß<br />
mit scharfen Aufnahmen und einem recht<br />
brauchbaren Xeon-Blitz zu gef<strong>alle</strong>n. Bei<br />
Videos unterstützt das Desire HD maximal<br />
720 p (Aufnahme und Playback).<br />
Die Benutzeroberfläche HTC Sense weicht<br />
in zahlreichen Bereichen von einem Standard-Android<br />
ab. HTC hat dabei aber sehr<br />
viele nützliche Features eingebaut. Dazu gehört<br />
unter anderem die internationale Tastatur,<br />
die neben der ausgewählten Primärsprache<br />
bei der Texteingabe auch eine zweite<br />
Sprache beherrscht. Dabei kennt das Desire<br />
HD fast <strong>alle</strong> europäischen Sprachen. Auch<br />
bei den vorinstallierten Anwendungen kann<br />
das HTC Desire gegenüber der Konkurrenz<br />
mit dem E-Book-Reader „Leser“, dem Twitter-Client<br />
„Peep“, dem HTC-Hub und dem<br />
Song-Erkennungstool SoundHound punkten.<br />
Die Akkulaufzeit betrug in Tests mit gemischter<br />
Nutzung rund 24 Stunden, die nötigen<br />
14 bis 16 Stunden <strong>für</strong> Vieltelefonierer<br />
hält das Desire HD in jedem Fall durch.<br />
Kritikpunkte<br />
An der Qualität der eingebauten Kamera gibt<br />
es nichts zu kritisieren, aber das Objektiv<br />
hebt sich rund drei Milimeter vom Gehäuserücken<br />
ab, wodurch das Desire HD nicht<br />
flach aufliegt und man stets Angst hat, das<br />
Objektiv zu zerkratzen. Wenn Sie Ihr Smartphone<br />
in einem Case benutzen, dann dürfte<br />
das nicht weiter stören, in den Tests fiel die<br />
Lage der Kamera aber mehrfach negativ auf.<br />
Ebenfalls höchstens die Note „genügend“<br />
bekommt das Desire HD bei der Tonqualität<br />
von Videoaufnahmen. An der Gesprächsqualität<br />
gibt es hingegen nichts auszusetzen, am<br />
Mikrofon an sich kann die schwache Tonqualität<br />
also nicht liegen.<br />
Die Displaysperre von HTC Sense muss<br />
man in der Grundeinstellung nach unten<br />
ziehen, um den Bildschirm freizuschalten.<br />
Wer sein Handy in der Hosentasche trägt,<br />
wird so beim Klingeln sehr oft den Anruf<br />
bereits dadurch entgegennehmen, dass er<br />
das Smartphone aus der Tasche zieht.<br />
Fazit<br />
Wer große Smartphones mag, der wird am<br />
Desire HD von HTC Gef<strong>alle</strong>n finden. HTC<br />
gehört zudem zu den Herstellern mit der<br />
besten Update-Strategie, sodass man beim<br />
Kauf relativ sicher sein kann, auch in den<br />
Genuss der kommenden Android-Versionen<br />
zu kommen. Wer die Oberfläche HTC Sense<br />
nicht mag, findet im Android Market genügend<br />
alternative Launcher, HTC Sense gehört<br />
aber mit Sicherheit zu den besten grafischen<br />
Oberflächen <strong>für</strong> Android. <br />
● ● ●<br />
36<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Hardware<br />
Huawei Ideos X5<br />
Im Test: Ideos X5 alias U8800 von Huawei<br />
Made<br />
in China<br />
Chinesische Firmen liefern seit Jahren erstklassige Komponenten <strong>für</strong><br />
Smartphones. Da liegt es nahe, auch eigene Produkte auf den<br />
Markt zu bringen, wie es Huawei mit dem X5 tut. Marcel Hilzinger<br />
huawei.com<br />
Das Huawei U8800 [1] mit dem<br />
Namen Ideos X5 kostet im Internet<br />
rund 230 Euro (Stand Mitte<br />
Mai). Zu den Stärken des Mittelklasse-Smartphones<br />
gehört sein Design und<br />
das mit 800 x 480 Pixeln auflösende, berührungsempfindliche<br />
3,7-Zoll-Display.<br />
With Google<br />
Das U8800 bringt die volle Android-Experience<br />
mit. Der Market, GMail und weitere<br />
Google-Anwendungen sind bereits vorinstalliert.<br />
<strong>Ein</strong>ige Änderungen hat Huawei aber<br />
dennoch vorgenommen. So befinden sich auf<br />
dem Handy ein halbes Dutzend vorinstallierte<br />
Apps, darunter ein Dateimanager, der<br />
E-Book-Reader Aldiko und die Augmented-<br />
Reality-App Layar, aber auch weniger nützliche<br />
wie die vorinstallierten Spiele-Teaser.<br />
Das U8800 setzt auf Android 2.2 Froyo und<br />
Kernel 2.6.32.9. Auf unserem Testgerät, das<br />
wir von 20:20mobile [2] als Leihstellung erhielten,<br />
war Android in Version 2.2.1 mit der<br />
Buildnummer B1315SP01 und der Custom-<br />
ROM-Version C253D001 installiert. <strong>Ein</strong> Update<br />
auf Android 2.3 ist eher unwahrscheinlich,<br />
Custom-ROMs fanden wir aktuell keine.<br />
Stärken und Schwächen<br />
Das Gehäuse fühlt sich hochwertig an und<br />
die Hardwaretasten <strong>für</strong> die Lautstärkeregelung<br />
und den <strong>Ein</strong>schaltknopf machen ebenfalls<br />
einen soliden <strong>Ein</strong>druck. <strong>Ein</strong>zig die Batteriefachabdeckung<br />
könnte aus etwas hochwertigerem<br />
Material bestehen, nicht nur aus<br />
gummiertem Kunststoff. Dennoch bringt das<br />
Handy knapp 140 g auf die Waage. Der 800<br />
MHz schnelle Prozessor und die verbaute<br />
CPU sorgen zwar <strong>für</strong> ausreichend Grafikleistung,<br />
bei den Multimedia-Eigenschaften<br />
kann das X5 aber nur bedingt punkten. So<br />
fiel die 5-Megapixel-Kamera in den Tests<br />
durch etwas flaue Farben und eindeutig zu<br />
hohem Rauschen selbst bei gut belichteten<br />
Aufnahmen negativ auf. Das Objektiv steht<br />
zudem wie beim Desire HD knapp 2 mm vor.<br />
Der integrierte Lautsprecher bietet ebenfalls<br />
nur eine befriedigende Leistung.<br />
Probleme hatte unser Testgerät auch mit<br />
der Akkuleistung. Nach einer Komplettladung<br />
am Vorabend war am nächsten Tag der<br />
Akku gegen Mittag schon zu über 50 Prozent<br />
leer, ohne dass wir am X5 irgendetwas gemacht<br />
hätten. Um 16 Uhr schaltete sich das<br />
Huawei-Smartphone dann nach einer kurzen<br />
Meldung automatisch aus. Mit diesem Problem<br />
steht das U8800 nicht <strong>alle</strong>ine da, denn<br />
im Internet gibt es diverse Berichte über sehr<br />
kurze Laufzeiten bei Androiden, die in der<br />
Regel durch fehlerhafte Apps verursacht<br />
werden. Allein aufgrund der Parameter<br />
(3,7-Zoll-Display, 1500 mAh-Akku und 800-<br />
MHz CPU) müsste das U8800 einen kompletten<br />
Arbeitstag gut überstehen. Offi ziell<br />
gibt Huawei eine Standby-Zeit von bis zu<br />
440 Stunden an.<br />
Harte Konkurrenz<br />
Zum aktuellen Preis gehört das Ideos X5 klar<br />
zu den günstigsten Android-Smartphones<br />
mit einem hochauflösenden Display und<br />
Quadband-Support. Auch optisch macht das<br />
U8800 einen guten <strong>Ein</strong>druck. Im direkten<br />
Vergleich mit dem Motorola Defy muss es<br />
sich aber geschlagen geben, da das Motorola-<br />
Handy zum gleichen Preis besser verarbeitet<br />
ist und Mitte Mai das lang erwartete Update<br />
auf Android 2.2.1 erhalten hat. <br />
● ● ●<br />
Infos<br />
[1] Produktseite:<br />
http:// www. huaweidevice.<br />
com/ worldwide/<br />
productFeatures. do?<br />
pinfoId=2914&<br />
directoryId=3902&<br />
treeId=3606<br />
[2] Vertrieb in Deutschland:<br />
http:// www. 2020mobile. de/<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 37
Hardware<br />
Samsung Wave II<br />
Samsung Wave II GT-S8530 im Test<br />
Guter<br />
Preis<br />
Mit dem ersten Wave schickte Samsung<br />
zu einem günstigen Preis sein erstes<br />
Flaggschiff mit Bada auf den Smartphone-Markt.<br />
Wir haben uns das<br />
Nachfolgemodell Wave II alias S8530<br />
angeschaut. Marcel Hilzinger<br />
samsung.com<br />
Auf den ersten Blick unterscheiden<br />
sich die beiden Wave-Smartphones<br />
von Samsung kaum. <strong>Ein</strong>zig<br />
die etwas anders gestaltete<br />
Menütaste unten in der Mitte verrät, um welches<br />
Wave es sich handelt. Da wir auch<br />
schon das GT-S8500 im Test hatten [1], fiel<br />
beim ersten Kontakt <strong>alle</strong>rdings das Gewicht<br />
des Wave II auf. Mit knapp 140 g ist es gut<br />
20 g schwerer als sein Vorgänger. Verantwortlich<br />
da<strong>für</strong> ist das mit 3,7 Zoll etwas größere<br />
Abb. 1: Bei der neuen Bada-Version lassen sich Wortvorschläge deutlich einfacher auswählen,<br />
zudem bietet sie auch den Swype-Klon „T9 Trace“ als <strong>Ein</strong>gabemethode an.<br />
Display (das S8500 verfügt nur über einen<br />
3,3-Zoll-Touchscreen). Abgesehen davon hat<br />
sich im Inneren nicht viel verändert. Als CPU<br />
kommt weiterhin der hauseigene Hummingbird-Prozessor<br />
von Samsung (ARM Cortex-<br />
A8) mit der SGX-540-Grafikeinheit zum <strong>Ein</strong>satz,<br />
sodass das Wave II die gleiche Leistung<br />
bringt wie sein Vorgänger.<br />
Samsung bewirbt das neue Wave auch mit<br />
Bluetooth-3.0-Support. Laut einigen Testberichten<br />
im Internet bietet der verbaute Adapter<br />
aber keinerlei Performance-Vorteile gegenüber<br />
einem Bluetooth-2.1-Gerät.<br />
Streitpunkt Display<br />
Am neuen Display des Wave II scheiden sich<br />
die Geister. Es ist zwar deutlich größer als<br />
der 3,3-Zoll-Touchscreen des S8500,<br />
Samsung verwendet dazu aber „nur“ die Super-LCD<br />
genannte Technik, während beim<br />
Wave S8500 ein Super-AMOLED-Screen zum<br />
<strong>Ein</strong>satz kommt. Beim Vergleich der beiden<br />
Displaytechniken fällt dann auch auf, dass<br />
das Wave II zwar den größeren Bildschirm<br />
besitzt, die Farben darauf aber etwas weniger<br />
brillant sind als beim ersten Wave.<br />
Neben diesem relativ geringen Unterschied<br />
benötigt das größere Display aber auch mehr<br />
Strom, sodass wir in den Tests mit dem<br />
Wave II auf eine etwas kürzere Akkulaufzeit<br />
38<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Hardware<br />
Samsung Wave II<br />
kamen als noch mit dem Vorgängermodell.<br />
Da die Auflösung bei beiden Touchscreens<br />
800 x 480 Pixel beträgt, bringt das Wave II<br />
also nicht wirklich einen Vorteil gegenüber<br />
dem Wave S8500, abgesehen davon, dass<br />
sämtliche Inhalte etwas größer erscheinen.<br />
Bada 1.2<br />
Während das Wave I auch aktuell noch mit<br />
einer älteren Bada-Version ausgeliefert wird<br />
und Sie das Update über die Software Kies<br />
vornehmen müssen, kommt das neue Wave<br />
II mit Bada 1.2. Revolutionäre Neuerungen<br />
bringt die aktuelle Version <strong>alle</strong>rdings keine,<br />
Samsung hat aber unter anderem die Tastatur<br />
verbessert und den Browser etwas flotter<br />
gemacht. So beherrscht das Keyboard nun<br />
„T9 Trace“. Dabei handelt es sich praktisch<br />
um eine Kopie der Swype-Tastatur. Die Treffergenauigkeit<br />
auf Deutsch ist ziemlich hoch<br />
und lässt sich mit Übung und dem Hinzufügen<br />
eigener Wörter noch deutlich steigern.<br />
Beim Browser hat Samsung ein Update auf<br />
Dolfin 2.2 (WebKit 533.1) durchgeführt, das<br />
<strong>für</strong> geringe Performance-Verbesserungen<br />
sorgt. Allerdings benötigt der Browser jetzt<br />
noch mehr Platz auf dem Display <strong>für</strong> Bedienelemente,<br />
da sich die untere Menüleiste<br />
nicht mehr verbergen lässt. Zudem unterstützt<br />
er weiterhin nur eine veraltete Version<br />
von Flash Lite, sodass nicht sämtliche Flashbasierten<br />
Webseiten korrekt erscheinen.<br />
Ebenfalls geändert hat Samsung bei der<br />
neuen Bada-Version den Zugriff auf das<br />
Smartphone via PC. In der Grundeinstellung<br />
meldet sich das Handy stets als MTP-Gerät<br />
an, was <strong>für</strong> eine optimale Zusammenarbeit<br />
Abb. 2: Die Bedienelemente des Dolfin-Browsers nehmen sehr viel Platz ein. Die URL-Zeile<br />
erscheint zudem bei jeder Berührung des Displays, also auch beim Scrollen.<br />
mit Kies sorgt. Möchten Sie hingegen die<br />
USB-Massenspeicherfunktion nutzen, müssen<br />
Sie dazu vor jeder Verbindung eine entsprechende<br />
<strong>Ein</strong>stellung vornehmen. Speichern<br />
lässt sich diese nicht. Das bedeutet auf<br />
der einen Seite eine Vereinfachung, weil<br />
nicht bei jeder Verbindung ein Auswahldialog<br />
erscheint. Andererseits kompliziert es die<br />
Nutzung, falls Sie das Smartphone überwiegend<br />
als Massenspeicher einsetzen.<br />
Fazit<br />
Zu einem Preis von unter 250 Euro ist das<br />
Wave II in jedem Fall eine Empfehlung wert.<br />
Sein größter Vorteil gegenüber dem gleich<br />
teuren Wave S8500 ist aber auch sein größter<br />
Nachteil: das neue Display. <strong>Ein</strong> Upgrade vom<br />
Wave auf das Wave II lohnt sich nicht. ● ● ●<br />
Infos<br />
[1] Wave S8500 im Test:<br />
http:// www. <strong>smart</strong>‐<strong>developer</strong>.<br />
de/ Online/ Artikel/<br />
Im‐Test‐Samsung‐Wave‐GT‐<br />
S8500‐mit‐Bada<br />
[2] Wave S8530 Produktseite:<br />
http:// samsung. de/ de/<br />
Privatkunden/ Mobil/<br />
Mobiltelefone/ Style/<br />
samsungwaveii/<br />
GT‐S8530BAADBT/ detail.<br />
aspx
Praxis<br />
App Shopper<br />
Diese fünf iPad-Apps sind Pflicht <strong>für</strong> Entwickler<br />
Smart<br />
Shopping<br />
Egal, ob Sie auf Reisen sind, gerade zu Ihrem Lieblingscafé schlendern,<br />
in einem Konferenzraum schwitzen oder einfach nur gemütlich auf der<br />
Couch liegen: Mit einem iPad und ausgewählten Apps können Sie auf<br />
schweres Arbeitsgerät verzichten. Joe Brockmeier<br />
Ints Vikmanis<br />
Angesichts der wahren Explosion<br />
an Applikationen <strong>für</strong> das iPad<br />
sollte man meinen, dass es Dutzende<br />
großartiger Apps <strong>für</strong> Entwickler<br />
geben müsste. Also nicht nur Spiele,<br />
Musik, eBooks und andere Unterhaltungsmedien,<br />
sondern Apps, die das iPad tatsächlich<br />
zum Arbeitsgerät umfunktionieren.<br />
Schnell<br />
stellt sich heraus,<br />
dass es gar<br />
nicht so einfach ist, gute, produktivitätssteigernde<br />
Apps <strong>für</strong> Entwickler zu finden. Man<br />
beachte, dass ich das Wort gut bewusst verwende.<br />
Die iOS-Plattform ist übersät mit unzähligen<br />
Anwendungen, die angeblich dieses<br />
und jenes leisten – <strong>alle</strong>rdings hält sich der<br />
tatsächliche Leistungsumfang beziehungsweise<br />
die Eignung <strong>für</strong> den angeführten<br />
Zweck meist sehr in Grenzen.<br />
So gewappnet habe ich mich aufgemacht,<br />
fünf Applikationen zu finden, auf die kein<br />
Entwickler verzichten sollte. Nicht nur Apps,<br />
um <strong>Code</strong> zu schreiben, denn dazu braucht<br />
man ja eigentlich nur eine, sondern Anwendungen,<br />
die sich auch in der Praxis als hilfreich<br />
erwiesen haben und jedem Entwickler,<br />
der zusammen mit einem Team an einem<br />
Projekt arbeitet, das Leben erleichtern. Nur<br />
als Hinweis – ich habe mich dabei nicht auf<br />
bestimmte Programmiersprachen oder ‐sparten<br />
eingeschossen, daher sollten die vorgestellten<br />
Tools <strong>für</strong> <strong>alle</strong> Programmierer von Interesse<br />
sein, unabhängig davon, ob man an<br />
Web-Anwendungen oder Objective-C-Projekten<br />
<strong>für</strong> die iOS-Plattform arbeitet oder sich<br />
mit Lisp-Programmierung auf dem iPad beschäftigt.<br />
Textastic<br />
Das wichtigste Tool, das jeder Entwickler<br />
braucht, ist ein guter Texteditor. Obwohl ich<br />
zum Bearbeiten von Textdateien gerne auf<br />
Vim zurückgreife, gibt es keine Version <strong>für</strong><br />
das iPad. Anstatt ein Terminal auf dem iPad<br />
aufzumachen, um sich über die Shell in<br />
einen Rechner einzuloggen, auf dem Vim<br />
40 <strong>smart</strong>-<strong>developer</strong>.de
Praxis<br />
App Shopper<br />
Abb. 1: Der Editor Textastic im <strong>Ein</strong>satz.<br />
läuft, probieren Sie doch einmal Textastic<br />
aus. Textastic ist ein einfacher Texteditor<br />
(kein IDE an sich) mit Zusatzfunktionen wie<br />
Syntaxhervorhebung, Dropbox-Anbindung<br />
sowie Unterstützung <strong>für</strong> das Teilen von Dateien<br />
per WebDAV oder iTunes.<br />
Ich werde mich wohl nie richtig daran gewöhnen,<br />
große Textmengen über die virtuelle<br />
iPad-Tastatur einzugeben. Will man nur<br />
kurz eine URL oder eine schnelle Twitter-<br />
Nachricht eingeben, ist das kein Problem,<br />
<strong>für</strong> längere Texte, HTML oder jede Art von<br />
Programmiercode ist die Bildschirmtastatur<br />
jedoch nicht geeignet. Textastic unterstützt<br />
glücklicherweise externe Bluetooth-Tastaturen,<br />
man muss also nicht zum Profi-Tipper<br />
auf der virtuellen Tastatur werden, um an<br />
Textastic seine Freude zu haben.<br />
Die Syntaxhervorhebung ist eine weitere<br />
wichtige Funktion, auf die viele Entwickler<br />
bei einem Editor nicht verzichten wollen,<br />
egal, ob am Desktop-Rechner oder auf dem<br />
iPad. Textastic bietet diese Funktion <strong>für</strong> mehr<br />
als 80 Programmiersprachen an, von C bis<br />
XML. Was die Entwicklung von Web-Apps<br />
betrifft, unterstützt Textastic HTML, CSS,<br />
JavaScript, Perl, PHP, Python sowie Java. Die<br />
Syntax-Definitionen bezieht der Editor aus<br />
dem Fraise-Projekt, ein Texteditor auf dem<br />
Mac, der sich bei vielen Programmierern<br />
(mich selbst eingeschlossen) großer Beliebtheit<br />
erfreut.<br />
Muss man oft <strong>Code</strong> zwischen iPad und PC<br />
hin- und herschieben, erleichtert die Anbindung<br />
an den Webdienst Dropbox beziehungsweise<br />
das Teilen von Dateien per<br />
iTunes die Arbeit. Über den in Textastic integrierten<br />
WebDAV-Server kann man Dateien<br />
vom iPad auch einfach "absaugen".<br />
Das <strong>Ein</strong>zige, was bei Textastic fehlt, ist die<br />
Unterstützung <strong>für</strong> SSH/SFTP, außerdem bleiben<br />
auch Programme zur Versionsverwaltung<br />
wie Git oder Subversion außen vor. Obwohl<br />
die Dropbox-Anbindung <strong>für</strong> meine<br />
Zwecke ausreichend ist, will nicht jeder<br />
seine Dateien diesem Webdienst anvertrauen.<br />
Tatsächlich kann es je nach Projekt<br />
nötig sein, auf ein <strong>Code</strong>-Repository auf Git-<br />
Hub oder auf ein firmeneigenes Subversion-<br />
Repository zurückzugreifen. Dann macht der<br />
<strong>Ein</strong>satz von Textastic natürlich nicht viel<br />
Sinn. Aufgrund des Preises von unter 10 Euro<br />
(Textastic kostet nur 7,99 Euro) sollte man<br />
die Erwartungen jedoch nicht zu hoch<br />
schrauben. Zumindest dachte ich das, bevor<br />
ich einen Blick auf die Textastic-Webseite geworfen<br />
hatte [1]. Das Update auf Version 2.1<br />
(zum Zeitpunkt, als dieser Artikel verfasst<br />
wurde, war das Update noch nicht erschienen)<br />
soll angeblich Unterstützung <strong>für</strong> SFTP<br />
und FTPS (FTP over SSL) enthalten. Wenn<br />
die Textastic-Macher nun noch Tastenkombinationen<br />
wie bei Vi unterstützen würden…<br />
Laden Sie sich Textastic im App Store herunter<br />
und/oder besuchen Sie die Unternehmens-Webseite<br />
im Internet.<br />
iMockups<br />
Brauchen Sie Hilfe bei der Erstellung einer<br />
Benutzeroberfläche? Können Sie nicht einmal<br />
ein Strichmännchen ohne eine Vorlage<br />
zeichnen? Dann könnte iMockups <strong>für</strong> Sie von<br />
Interesse sein [2].<br />
Mit dem iMockups-App <strong>für</strong> das iPad können<br />
Sie Design-Mockups <strong>für</strong> iOS und Web-<br />
Applikationen erstellen, um mithilfe dieser<br />
Entwürfe im Team zu einem Konsens zu gelangen<br />
und dann auf dieser Basis in die Produktion<br />
zu starten. Die mit der App gebauten<br />
Mockups sind nicht übermäßig detailliert,<br />
aber ausreichend, um zu demonstrieren, was<br />
die Benutzeroberfläche leisten soll, um danach<br />
in die eigentliche Produktionsphase<br />
überzugehen.<br />
Der Präsentationsmodus der iMockups-Applikation<br />
ermöglicht es Ihnen, Ihrem Chef die<br />
Ergebnisse Ihrer Arbeit näherzubringen oder<br />
Ihre Teamkollegen an Ihrer kreativen Vision<br />
teilhaben zu lassen, ohne gleich die Powerpoint-Keule<br />
zu schwingen. Darüber hinaus<br />
können Sie Ihre Mockups im PNG- oder Balsamiq-Format<br />
exportieren, das heißt, Sie<br />
haben die Möglichkeit, eine schnelle Skizze<br />
als Arbeitsgrundlage auf Ihrem iPad zu erstellen<br />
und diese dann in Balsamiq unter<br />
Mac, Windows oder Linux weiterzuverarbei-<br />
Abb. 2: <strong>Code</strong>auswahl in Textastic.<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 41
Praxis<br />
App Shopper<br />
Abb. 3: Die Funktion Finden-und-Ersetzen in Textastic.<br />
Abb. 4: <strong>Ein</strong>richten des WebDAV-Servers<br />
bei Audiotorium.<br />
Abb. 5: Aufzeichnen mit der App<br />
Audiotorium.<br />
ten. (Für Balsamiq wird jedoch die Adobe-<br />
Air-Laufzeitumgebung benötigt, daher besteht<br />
keine Aussicht, dass dieses Programm<br />
in naher Zukunft auf das iPad portiert wird).<br />
Ebenfalls erwähnenswert ist, dass iMockups<br />
das par<strong>alle</strong>le Arbeiten an mehreren Projekten<br />
unterstützt, was die Verwaltung der<br />
dazugehörigen Dokumente vereinfacht. Die<br />
Projektansicht erleichtert die Arbeit mit mehreren<br />
Seiten und gibt einen guten Überblick<br />
über jedes einzelne Projekt. Außerdem<br />
schont iMockups mit dem moderaten Preis<br />
von 5,49 Euro den Geldbeutel.<br />
Audiotorium Notes<br />
In den meisten beruflichen Situationen ist es<br />
ein großer Vorteil, wenn man in der Lage ist,<br />
sich sinnvolle Notizen zu machen, egal, ob<br />
man als Software-Entwickler oder als Journalist<br />
arbeitet. Besonders trifft dies auf Design-<br />
Meetings zu, wo die Ideen nur so sprühen,<br />
an die man sich <strong>alle</strong>rdings später wieder in<br />
<strong>alle</strong>n <strong>Ein</strong>zelheiten erinnern muss. Sie wollen<br />
Ihren Chef wahrscheinlich nur ungern um<br />
zwei Uhr morgens anrufen, während Sie eine<br />
Programmier-Nachtschicht einlegen, nur<br />
weil Sie nicht in der Lage waren, sich während<br />
des Meetings die notwendigen <strong>Ein</strong>zelheiten<br />
zu notieren.<br />
Um nicht in eine solche unangenehme<br />
Lage zu geraten, können Sie auf Audiotorium<br />
Notes <strong>für</strong> das iPad [3] zurückgreifen. Mit dieser<br />
App können Sie sich händisch mit der<br />
Bildschirmtastatur Notizen machen oder ein<br />
Audioprotokoll des Meetings aufzeichnen<br />
und es später transkribieren lassen. Sie<br />
haben richtig gehört – Sie können während<br />
des Meetings auf Ihrem Notizblock Männchen<br />
malen und haben trotzdem eine verlässliche<br />
Aufzeichnung dessen, was besprochen<br />
wurde, ohne auch nur eine einzige<br />
Notiz gemacht zu haben. Es versteht sich<br />
von selbst, dass Sie vorher einen Testlauf<br />
durchführen sollten, um sicherzustellen,<br />
dass das iPad die Stimmen auch gut einfängt,<br />
bevor Sie sich ausschließlich auf die<br />
Audioaufzeichnung verlassen.<br />
Was hat Audiotorium Notes sonst noch auf<br />
dem Kasten? Die App unterstützt TextExpander-Tastaturkürzel,<br />
sodass man sich viel<br />
Schreiberei sparen kann, indem man TextExpander-Bausteine<br />
anlegt.<br />
Sobald Sie Notizen und Tonaufzeichnungen<br />
gespeichert haben, können Sie dem iPad<br />
die Daten über die integrierte Dropbox-Anbindung<br />
beziehungsweise den eingebauten<br />
WebDAV-Server entlocken. Sobald der Web-<br />
DAV-Server gestartet wurde, können Sie auf<br />
sämtliche auf Ihrem iPad gespeicherten Notizen<br />
über den Web-Browser Ihrer Wahl zugreifen.<br />
Man beachte, dass dieser Server nur<br />
dann aktiv ist, wenn Sie ihn explizit aufrufen,<br />
das heißt, er läuft nicht ständig im Hintergrund.<br />
Das kann von Nachteil sein, wenn<br />
man gleichzeitig an mehreren Aufgaben arbeitet,<br />
zugleich wird dadurch aber auch vermieden,<br />
dass Ihre Aufzeichnungen dauerhaft<br />
per Netzwerk zugänglich sind.<br />
Das Beste an der App ist ihr Preis. Audiotorium<br />
Notes kostet nur 3,99 Euro. Von der<br />
Firma AppApps, die hinter Audiotorium<br />
Notes steckt, ist darüber hinaus <strong>für</strong> 1,59 Euro<br />
eine Anwendung namens Notorium Notes<br />
erhältlich ohne Audiofunktion. Allerdings<br />
kann man bei diesem Preisniveau getrost<br />
noch die 2,40 Euro <strong>für</strong> die Audioaufzeichnungsfunktion<br />
drauflegen.<br />
Mocha VNC<br />
Manchmal geht es einfach nicht ohne Zugriff<br />
auf einen PC. Wenn Sie Ihr iPad mit einem<br />
PC verbinden wollen, gibt es da<strong>für</strong> verschiedene<br />
Möglichkeiten, aber die günstigste und<br />
kompatibelste Lösung heißt VNC. Genauer<br />
gesagt, Mocha VNC.<br />
Es gibt jede Menge Remote-Desktop-Anwendungen<br />
im App Store. Ich habe mich aus<br />
drei Gründen <strong>für</strong> Mocha VNC entschieden.<br />
Erstens, Mocha VNC funktioniert mit jedem<br />
PC, der mit VNC kompatibel ist. Das heißt,<br />
unabhängig davon, ob auf Ihrem PC Windows,<br />
Linux oder Mac OS X installiert ist<br />
(oder Sie ein Multi-Boot-System verwenden),<br />
Sie sollten auf jeden Fall eine Verbindung<br />
mittels Mocha VNC herstellen können. Für<br />
all diese Betriebssysteme sind VNC-Server<br />
42<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Praxis<br />
App Shopper<br />
verfügbar, die gut mit Mocha VNC zusammenarbeiten<br />
sollten – es wurden Praxistests<br />
unter Windows mit RealVNC, TightVNC und<br />
UltraVNC durchgeführt sowie mit Apples<br />
Screen-Sharing-Tool <strong>für</strong> Mac OS X.<br />
Oft haben Anwendungen im App Store den<br />
Nachteil, dass Applikationen, <strong>für</strong> die man<br />
bereit wäre, Geld auszugeben, vor dem Kauf<br />
nicht getestet werden können. Mocha VNC<br />
ist mir auch deswegen sympathisch, weil<br />
eine abgespeckte Programmversion (Mocha<br />
VNC Lite) erhältlich ist, die man kostenlos<br />
installieren und testen kann. Die "Lite"-Version<br />
verfügt nicht über den vollen Funktionsumfang<br />
(es fehlt beispielsweise die Unterstützung<br />
<strong>für</strong> Tastaturkürzel), aber man kann<br />
damit die Leistungsfähigkeit der Software<br />
testen und sicherstellen, dass die App mit<br />
dem eigenen VNC-Server kompatibel ist.<br />
Und drittens mag ich Mocha VNC, weil die<br />
App hält, was sie verspricht, und das <strong>für</strong><br />
kleines Geld. Bei einem Kostenpunkt von<br />
4,99 Euro ist Mocha VNC auch <strong>für</strong> Privatpersonen<br />
erschwinglich.<br />
<strong>Ein</strong>e Alternative wäre das Programm Log-<br />
MeIn Ignition, das sowohl <strong>für</strong> das iPhone als<br />
auch <strong>für</strong> das iPad erhältlich ist. Diese App<br />
eignet sich eher <strong>für</strong> Rechnersysteme, die sich<br />
hinter einer Firewall befinden, außerdem<br />
sind die Kosten wesentlich höher. Bei einem<br />
Preis von 23,99 Euro würde ich zuerst einmal<br />
Mocha VNC austesten und erst dann den<br />
<strong>Ein</strong>satz von LogMeIn Ignition erwägen,<br />
wenn der Funktionsumfang von Mocha VNC<br />
nicht ausreicht.<br />
Weitere Informationen zu Mocha VNC finden<br />
Sie auf der Hersteller-Webseite [4]. Das<br />
Unternehmen hat einige weitere Lösungen<br />
rund um VNC in seinem Portfolio, nicht nur<br />
<strong>für</strong> das iPad, sondern auch <strong>für</strong> die verschiedensten<br />
Mobilgeräte.<br />
OmniGraffle<br />
Als Letztes sollten Sie unbedingt einen Blick<br />
auf OmniGraffle werfen, falls Sie Diagramme<br />
oder andere Grafiken erstellen wollen. Dieses<br />
Programm ist der Mercedes-Benz unter den<br />
iPad-Tools – eigentlich ist es auch der Mercedes-Benz<br />
unter den Tools <strong>für</strong> Mac OS X. Die<br />
Firma OmniGroup bringt schon seit Jahren<br />
erstklassige Tools <strong>für</strong> die Mac-Plattform auf<br />
den Markt.<br />
OmniGraffle macht dabei keine Ausnahme.<br />
Man kann damit innerhalb kürzester Zeit<br />
wundervolle Diagramme auf dem iPad gestalten<br />
und sie entweder als PDF beziehungsweise<br />
PNG exportieren oder auch im proprietären<br />
OmniGraffle-Format, um sie später auf<br />
dem heimischen Rechner weiterzubearbeiten<br />
(immer natürlich unter der Annahme, dass<br />
Sie OmniGraffle auch auf dem Desktop-Rechner<br />
benutzen). Die Auswahl an integrierten<br />
Schablonen ist riesig und es ist wirklich kinderleicht,<br />
mit OmniGraffle auf dem iPad zu<br />
arbeiten.<br />
Sie haben die volle Kontrolle über wirklich<br />
jedes einzelne Detail jeder Formvorlage – angefangen<br />
von der Farbe über die Schriftarten<br />
bis hin zu der Elementgestaltung und so weiter.<br />
Die Anwendung ist gut auf das Arbeiten<br />
mit den Fingern oder mit einem Stift ausgelegt<br />
und stellt jede Menge Tools <strong>für</strong> schnelles<br />
Arbeiten bereit. Wenn man von schnellem<br />
Arbeiten spricht – OmniGraffle verfügt auch<br />
über einen Freihand-Zeichenmodus, mit dem<br />
man Skizzen entwerfen kann, bevor man<br />
sich <strong>für</strong> einen bestimmten Entwurf entscheidet.<br />
Daher ist das Tool hervorragend <strong>für</strong><br />
Mindmaps und zum Visualisieren von Gedankengängen<br />
geeignet, bevor man sich an<br />
die Gestaltung einer professionell aussehenden<br />
Grafik macht. Unabhängig davon, ob Sie<br />
UML-Diagramme zur Darstellung des Kontrollflusses<br />
oder Diagramme <strong>für</strong> Präsentationen<br />
oder zur Veröffentlichung erstellen wollen<br />
– OmniGraffle ist das Tool der Wahl.<br />
Ich kann dies im Brustton der Überzeugung<br />
behaupten, da ich mich lange nach Alternativen<br />
umgesehen habe, bevor ich mich<br />
<strong>für</strong> OmniGraffle entschieden und meine Kreditkarte<br />
gezückt habe. Wie gesagt, diese App<br />
ist der Mercedes-Benz unter den iPad-Tools<br />
und dies schlägt sich auch im Preis nieder.<br />
OmniGraffle <strong>für</strong> das iPad kostet stramme<br />
39,99 Euro. Es ist jammerschade, dass die<br />
OmniGroup keine „Lite“-Version anbietet<br />
oder zumindest eine Version, die Anwender<br />
vor dem Kauf testen können, denn der Preis<br />
<strong>für</strong> das Programm wirkt — zumindest im<br />
Vergleich mit anderen iPad-Apps — enorm<br />
abschreckend.<br />
Wenn Sie OmniGraffle nicht kennen, verlassen<br />
Sie sich nicht <strong>alle</strong>in auf meine Empfehlung.<br />
Schauen Sie auf der OmniGroup-<br />
Webseite [5] vorbei, prüfen Sie den Funktionsumfang<br />
und sehen Sie sich einige der<br />
Videos an, die OmniGraffle im Praxiseinsatz<br />
demonstrieren.<br />
Zusammenfassung<br />
Für das iPad gibt es eine riesige Anzahl von<br />
Apps, die Entwicklern das Leben leichter machen<br />
– wenn man weiß, wonach man suchen<br />
muss. Ob dies nun das Schreiben von <strong>Code</strong>,<br />
Meetings, die Vorplanung oder einfach nur<br />
Organisatorisches betrifft – werfen Sie einen<br />
Blick auf diese Apps, um das Beste aus Ihrem<br />
iPad herauszuholen.<br />
● ● ●<br />
Abb. 6: Schnelle Diagramm-Erstellung<br />
mit OmniGraffle.<br />
Der Autor<br />
Joe „Zonker“ Brockmeier arbeitet<br />
freiberuflich als IT-Journalist,<br />
Redakteur, Community-Spezialist<br />
und engagiert sich <strong>für</strong> freie und<br />
Open-Source-Software. Brockmeier<br />
war von 2008 – 2010 Community<br />
Manager bei openSUSE.<br />
Er schreibt nun <strong>für</strong> Linux Pro Magazine<br />
und eine Reihe anderer IT-<br />
Magazine. Seine private Webseite<br />
ist unter http:// www.<br />
dissociatedpress. net/ zu finden,<br />
außerdem können Sie ihm auf<br />
Twitter und Identi.ca folgen unter<br />
dem Namen @jzb.<br />
Infos<br />
[1] Textastic:<br />
http:// www. textasticapp.<br />
com/<br />
[2] iMockups:<br />
http:// www. endloop. ca/<br />
imockups/<br />
[3] Audiotorium Notes:<br />
http:// app‐apps. com/ apps/<br />
audiotorium‐notes/<br />
[4] MochaSoft:<br />
http:// www. mochasoft. dk/<br />
[5] OmniGraffle:<br />
http:// www. omnigroup. com/<br />
products/ omnigraffle‐ipad/<br />
features/<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 43
Praxis<br />
Gmote<br />
Mit Gmote und Android den Rechner fernsteuern<br />
Smart<br />
steuern<br />
Android-Handys erweisen sich im Alltag als digitale Multitools.<br />
Mit der richtigen App verwandeln sie sich in Fernbedienungen<br />
zum Abspielen beziehungsweise Ausführen von<br />
Mediadateien auf Ihrem PC. Vincze-Aron Szabo und Marcel Hilzinger<br />
Kirsty Pargeter, Fotolia<br />
Die Apps im Android Market bieten<br />
zahlreiche Möglichkeiten, Ihr Android-Handy<br />
um Funktionen zu<br />
erweitern, zum Beispiel Apps, die<br />
Ihr Handy in eine Fernbedienung umwandeln.<br />
<strong>Ein</strong>e besonders praktische und vielseitige<br />
unter diesen ist Gmote. Mit dem frei verfügbaren<br />
Programm lässt sich nicht nur der<br />
Medienplayer auf dem PC steuern, sondern<br />
Sie können das Tool auch als Streaming-<br />
Client und als Touchpad-Ersatz benutzen.<br />
Client und Server<br />
Gmote [1] finden Sie im Android-Market.<br />
Möchten Sie die App auf einem Android- Gerät<br />
ohne Market-Zugriff installieren, dann finden<br />
Sie auf der Google-<strong>Code</strong>-Seite des Projektes<br />
[2] die passende APK-Datei zum Download.<br />
Das Tool unterstützt neben der Fernbedienungsfunktion<br />
auch das Streaming von Musik<br />
und Fotos auf Ihr Handy. So haben Sie im<br />
Heimnetzwerk immer Ihre Lieblingsmusik<br />
parat. Alles was Sie dazu benötigen, ist Ihr<br />
Android-Handy, einen PC und ein eingerichtetes<br />
Heimnetzwerk mit WLAN-Router.<br />
Um Gmote zu installieren, müssen Sie zunächst<br />
die entsprechende App gleichen Namens<br />
auf Ihr Android-Handy laden. Falls Sie<br />
nicht den Weg über den Market wählen,<br />
müssen Sie dazu zunächst über die Android-<br />
<strong>Ein</strong>stellungen unter Anwendungen die Installation<br />
von Apps unbekannter Herkunft akzeptieren.<br />
Von den Berechtigungen her verlangt<br />
die App lediglich, Internetverbindungen<br />
verwenden und den Standby-Modus deaktivieren<br />
zu dürfen. Nach der Installation<br />
ist Ihr Android-Handy der sogenannte<br />
Gmote-Client. Nun muss noch der Gmote-<br />
Server eingerichtet werden – Ihr PC.<br />
Auf dem PC sind je nach benutztem Betriebssystem<br />
ein paar Arbeitsschritte mehr<br />
erforderlich. Unter Windows laden Sie sich<br />
unter [3] den Setup-Assistenten <strong>für</strong> Windows<br />
herunter. Starten Sie im Anschluss die Setup-<br />
Datei und folgen Sie den dort angegebenen<br />
Beschreibungen. Im letzten Installationsschritt<br />
können Sie festlegen, ob der Gmote-<br />
Server automatisch bei jedem Windows-Start<br />
ausgeführt werden soll.<br />
Im Anschluss an die Installation, öffnet<br />
sich automatisch ein Dialog zur Vergabe<br />
eines Zugangspasswortes. Danach sehen Sie<br />
den Media Path Selector zur Freigabe von<br />
Ordnern. Fügen Sie hier über Add Path Verzeichnisse<br />
hinzu, die Sie über Gmote ansprechen<br />
möchten und schließen Sie den Dialog<br />
durch einen Klick auf Done. Nun steht auf<br />
der Taskleiste ein Symbol <strong>für</strong> die Steuerung<br />
des Gmote-Servers zur Verfügung.<br />
44<br />
02 /2011 <strong>smart</strong>-<strong>developer</strong>.de
Praxis<br />
Gmote<br />
Achten Sie insbesondere unter<br />
Windows darauf, dass eine eventuell<br />
installierte Firewall Gmote nicht<br />
blockiert und geben Sie dann gegebenenfalls<br />
Gmote über die<br />
Firewall-Konfiguration frei. Jetzt<br />
können Sie Gmote auf Ihrem Android-Handy<br />
starten.<br />
Auch unter Mac OS X läuft die<br />
Installation ähnlich einfach ab.<br />
Hier müssen Sie sich zunächst <strong>für</strong><br />
das passende Zip-Archiv entscheiden<br />
(Snow Leopard oder älteres<br />
Mac OS X). Anschließend führen<br />
Sie das im ZIP-Paket enthaltene<br />
Ins tallationsprogramm aus (Abbildung<br />
1), das die Gmote-Anwendung unter<br />
den Programmen ablegt.<br />
Beim ersten Start richten Sie das Passwort<br />
ein (Abbildung 2) und geben anschließend<br />
die Verzeichnisse frei, die Gmote nach unterstützten<br />
Mediadateien untersuchen soll (Abbildung<br />
3). Die Installation unter Linux beschreibt<br />
der Kasten „Gmote <strong>für</strong> Linux“.<br />
Abb. 2: Setzen Sie ein Passwort, damit nicht jemand<br />
unerwünscht mithört oder mitsieht.<br />
Musik freigeben<br />
Um den Server betriebsbereit zu machen,<br />
müssen Sie ein Zugangspasswort vergeben<br />
und die Ordner mit den Mediadateien freigeben,<br />
die Sie über Gmote steuern möchten.<br />
Klicken Sie dazu mit der rechten Maustaste<br />
auf das Gmote-Symbol im Systempanel und<br />
rufen Sie über Settings | Change password<br />
den Dialog zur Änderung des Passworts auf<br />
(falls Sie nicht bereits bei der Installation<br />
ein Passwort gesetzt haben). Vergeben Sie<br />
in diesem Dialog das Zugangspasswort und<br />
bestätigen Sie dieses über OK. Die Freigabe<br />
<strong>für</strong> die Mediadateien erfolgt über das Menü<br />
Settings | Change media paths des Systempanels,<br />
was den Dialog Media Path Selector<br />
öffnet (Abbildung 3). Fügen Sie nun über<br />
Add Path <strong>alle</strong> relevanten Ordner hinzu,<br />
die Bilder, Videos und Musik enthalten<br />
und die Sie über Ihr Android-Handy<br />
fernsteuern beziehungsweise abspielen<br />
möchten. Das Hinzufügen von einzelnen<br />
Dateien ist nicht möglich. Damit<br />
haben Sie das Setup des Servers abgeschlossen<br />
und können Gmote unter<br />
Android starten.<br />
Abb. 1: Die Installation (hier unter Mac OS X) bereitet auch unter<br />
Windows und Linux keinerlei Probleme.<br />
Gmote in Aktion<br />
Beim ersten Start weist Sie die App darauf<br />
hin, dass der Gmote-Server installiert sein<br />
muss, bevor Sie die App nutzen können. Da<br />
dieser Schritt bereits getan ist, können Sie<br />
direkt auf I have inst<strong>alle</strong>d the Server. Start<br />
Gmote! drücken. Danach sucht Gmote im lokalen<br />
Netz nach Gmote-Servern. Dabei spielt<br />
es keine Rolle, ob der Desktop-Rechner per<br />
LAN oder WLAN mit dem Android-Gerät<br />
verbunden ist – Hauptsache die beiden Geräte<br />
befinden sich im gleichen Netzwerk.<br />
Markieren Sie den gewünschten Gmote-Server<br />
(in der Regel erscheint hier nur ein <strong>Ein</strong>trag).<br />
Um die Mediendaten auszuwählen,<br />
drücken Sie auf Browse (Abbildung 4).<br />
Haben Sie sich <strong>für</strong> eine Datei entschieden,<br />
startet auf dem PC der zugehörige Medienplayer.<br />
Unter Mac ist das iTunes, unter Windows<br />
der Windows Media Player und unter<br />
Linux der VLC Media Player. Die Inhalte werden<br />
also in der Grundeinstellung auf den<br />
dort angeschlossenen Lautsprechen und bei<br />
Videos auf dem angeschlossenen Bildschirm<br />
beziehungsweise Fernseher ausgegeben.<br />
Gmote selbst wechselt auf dem Handy in den<br />
Fernbedienungsmodus (Remote), in dem Sie<br />
den gestarteten Player auf dem PC steuern.<br />
Über das Symbol oben rechts können Sie den<br />
Player auf dem PC wieder beenden.<br />
Streamen und Tippen<br />
Der Gmote-Server unterstützt auch das Abspielen<br />
(Streamen) von Mediadateien, die<br />
Abb. 3: Über den Media Path Selector teilen Sie Gmote<br />
mit, welche Verzeichnisse erreichbar sein sollen.<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 45
Praxis<br />
Gmote<br />
Abb. 4: Der Browser dient zum Auswählen<br />
von Mediadateien. Sie<br />
legen fest, ob Gmote die Datei<br />
auf dem PC oder Handy abspielt.<br />
Abb. 5: Über diese Oberfläche<br />
steuern Sie Gmote. Über Browse<br />
wechseln Sie in den Dateibrowser,<br />
um Dateien auszuwählen.<br />
Abb. 6: <strong>Ein</strong> übersichtlicher Bildbetrachter<br />
ermöglicht das Anzeigen<br />
von Fotos auf dem Handy. Die Bilder<br />
sind auf dem PC gespeichert.<br />
Abb. 7: Der integrierte Webbrowser<br />
ermöglicht das Surfen im Internet<br />
und das Aufrufen der Internetseiten<br />
auf dem PC.<br />
auf Ihrem PC oder einer angeschlossenen<br />
Festplatte gespeichert sind. Diese Funktion<br />
befindet sich zwar noch im Beta-Status, kann<br />
aber bei Musik- und Bilddateien trotzdem<br />
schon beeindrucken. Das Abspielen von Filmen<br />
ist derzeit nur bei sehr wenigen Dateitypen<br />
möglich. Klicken Sie auf Browse und<br />
im Anschluss unter Play on auf Phone (beta).<br />
Wählen Sie nun eine Audio- oder Bilddatei<br />
aus, Gmote übernimmt nun die Playerfunktion<br />
und öffnet die Datei auf Ihrem Handy<br />
(Abbildung 5). Bilder werden in einem einfachen<br />
Bildbetrachter geöffnet (Abbildung 6).<br />
Als eine der wenigen Streaming-Apps zeigt<br />
Gmote bei Musikstreaming auch Cover an.<br />
<strong>Ein</strong>e weitere nützliche Funktion im Beta-<br />
Status ist das Aufrufen von webbasierten Inhalten.<br />
Da<strong>für</strong> besitzt Gmote einen integrierten<br />
Browser, über den Sie Internetseiten öffnen<br />
können (Abbildung 7). Drücken Sie<br />
dazu auf die Menütaste Ihres Android-Smartphones<br />
und dann auf Web (beta). Der Webbrowser<br />
verfügt derzeit nur über Grundfunktionen.<br />
Sie können Internetadressen aufrufen<br />
und per Handytaste zur vorherigen Seite zurückkehren.<br />
<strong>Ein</strong>e Lesezeichenfunktion fehlt<br />
dagegen. Über die Taste open on computer<br />
öffnet Gmote die jeweils eingegebene Adressen<br />
in einem Webbrowser auf dem PC.<br />
Maus und Tastatur<br />
Der Funktionsumfang von Gmote wird durch<br />
das Touchpad komplettiert. Das Ziel dieser<br />
Funktion ist es, eine Maus und eine Tastatur<br />
mit dem Android-Handy zu simulieren, sodass<br />
Sie Ihren PC zum Beispiel vom Sofa aus<br />
bedienen können. Auch diese Funktion befindet<br />
sich derzeit noch im Beta-Status, funktioniert<br />
aber recht gut, wobei die Tastatur zu<br />
Abstürzen neigt. Im Idealfall kann man mit<br />
Gmote und einem Android-Gerät bequem<br />
einen PC steuern, der zum Beispiel an einen<br />
Fernseher oder Beamer angeschlossen ist<br />
und auf eine zusätzliche Funk- beziehungsweise<br />
Bluetooth-Tastatur verzichten. Es<br />
bleibt <strong>alle</strong>rdings abzuwarten, wann diese<br />
Funktion den Beta-Status hinter sich gelassen<br />
hat und stabil arbeitet.<br />
● ● ●<br />
Infos<br />
[1] Gmote-Homepage:<br />
http:// www. gmote. org/<br />
[2] Google-<strong>Code</strong>-Seite:<br />
http:// code. google. com/ p/<br />
gmote/<br />
[3] Gmote-Server:<br />
http:// www. gmote. org/ server<br />
Gmote <strong>für</strong> Linux<br />
Linux-Nutzer benötigen den VLC Media Player,<br />
den Sie meist bequem über die Software-Verwaltung<br />
Ihrer Distribution installieren können.<br />
Prüfen Sie nach der Installation von VLC mit<br />
dem Befehl whereis vlc über eine Konsole, ob<br />
sich der VLC Media Player am Speicherort<br />
/usr/bin/vlc befindet. Falls nicht, dann setzen<br />
Sie mit Root-Rechten und dem Kommando<br />
ln ‐s aktueller_vlc‐Pfad /usr/bin/vlc einen<br />
symbo lischen Link an diese Stelle. Ersetzen Sie<br />
dazu aktueller_vlc-Pfad durch den Pfad, der<br />
Ihnen mit dem Befehl whereis angezeigt wurde.<br />
Weiterhin setzt Gmote voraus, dass eine Java-<br />
Laufzeitumgebung installiert ist und dass eine<br />
Netzwerkverbindung besteht.<br />
Laden Sie nun das Linux-Paket von Gmote <strong>für</strong><br />
Ihren PC herunter [3] und entpacken Sie es in<br />
ein beliebiges Verzeichnis. Zu guter Letzt müssen<br />
Sie die Datei GmoteServer.sh noch ausführbar<br />
machen. Am einfachsten geht dies mit dem<br />
Befehl chmod +x GmoteServer.sh. Nun können<br />
Sie Gmote über den Befehl ./GmoteServer.sh<br />
starten. Nach dem Start steht im Systemabschnitt<br />
des Panels (KDE/Gnome) ein entsprechendes<br />
Symbol zur Verfügung, über das Sie<br />
das Programm steuern oder beenden.<br />
46<br />
02 /2011 <strong>smart</strong>-<strong>developer</strong>.de
Praxis<br />
MeeGo-<strong>Ein</strong>führung<br />
Apps <strong>für</strong> MeeGo entwickeln<br />
MeeGo<br />
<strong>für</strong> dich!<br />
Bei MeeGo denken vermutlich die meisten Entwickler<br />
zunächst an Netbooks. Doch das freie Betriebssystem<br />
ist deutlich flexibler. Dieser Artikel stellt das<br />
Linux-basierte Betriebssystem vor und zeigt die ersten<br />
Schritte zur eigenen App. Sulamita Garcia<br />
MeeGo [1] ist ein freies Betriebssystem<br />
auf Linux-Basis, optimiert<br />
<strong>für</strong> eine möglichst gute<br />
User Experience auf zahlreichen<br />
Geräten. MeeGo unterstützt nicht nur Netbooks<br />
und Smartphones, sondern auch Tablets,<br />
Smart-TV-Geräte, In-Vehicle-Infotainment-Systeme<br />
(IVI) und einige weitere. Als<br />
Projekt unter der Schirmherrschaft der Linux<br />
Foundation garantiert MeeGo eine offene<br />
und kontinuierliche Entwicklung. MeeGo hat<br />
zudem viele Werte von der Open-Source-<br />
Community übernommen. Dazu gehört die<br />
transparente Entwicklung, eine auf Verdiensten<br />
beruhende Führungsstruktur (Meritocracy)<br />
und die Policy, bei sämtlichen Änderungen<br />
upstream, also bei den ursprünglichen<br />
Projekten, <strong>für</strong> Aufnahme zu sorgen.<br />
Upstream First<br />
MeeGo arbeitet eng mit der Community zusammen<br />
und setzt auf industrielle Standards,<br />
um die Projekte wachsen zu lassen, anstatt<br />
eigene Implementationen<br />
hinter<br />
verschlossenen<br />
Türen zu<br />
entwickeln. So<br />
werden zum Beispiel<br />
sämtliche Änderungen am Kernel zunächst<br />
an die offiziellen Kernel-Maintainer geschickt,<br />
um diese in den Standard-Kernel<br />
aufzunehmen. Von den Verbesserungen in<br />
MeeGo profitieren so sämtliche Linux-Nutzer.<br />
Die MeeGo-Gemeinschaft besteht zurzeit<br />
aus rund 30.000 registrierten Nutzern und<br />
Entwicklern, die sich auf diversen Mailinglisten,<br />
in Foren, Wikis [2] und IRC-Kanälen<br />
treffen. Im IRC-Kanal tauschen täglich im<br />
Durchschnitt 500 Leute Informationen aus.<br />
Der Aufbau<br />
MeeGo besteht aus drei Hauptkomponenten:<br />
dem Hardware Adaptation Layer, der Middleware<br />
und dem User Interface. Der Adaptation<br />
Layer besteht aus dem Linux-Kernel und<br />
MeeGo 1.1<br />
Abb. 1: Die Handset-Version.<br />
Abb. 2: Die Netbook-Oberfläche von MeeGo mit bunten<br />
Symbolen in den MeeGo-Farben.<br />
Abb. 3: Die Tablet-Variante von MeeGo in der aktuellen Vorabversion<br />
von MeeGo 1.2.<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 47
Praxis<br />
MeeGo-<strong>Ein</strong>führung<br />
Guidelines <strong>für</strong> eine gute App<br />
Es gibt verschiedene Design-Grundsätze <strong>für</strong><br />
MeeGo, die man im Hinterkopf behalten<br />
sollte, um den Nutzern das bestmögliche<br />
App-Erlebnis zu bieten. Bei Geräten mit kleinen<br />
Bildschirmen sollten Sie zum Beispiel<br />
darauf achten, nicht unnötig viel Platz <strong>für</strong><br />
Toolbars, Knöpfe oder Informationen zu verschwenden,<br />
die <strong>für</strong> den Benutzer nicht relevant<br />
sind. Zudem ist MeeGo auf ein möglichst<br />
gutes Powermanagement optimiert, um<br />
bei der Nutzung ein Maximum an Akkulaufzeit<br />
zu garantieren.<br />
MeeGo merkt sich die benutzerspezifischen<br />
<strong>Ein</strong>stellungen und am häufigsten besuchten<br />
Seiten, dadurch bietet es dem Benutzer<br />
einen einfachen Weg, um seine Lieblingsseiten<br />
schnell wiederzufinden und keine Updates<br />
von Social-Media-Seiten oder Freunden<br />
zu verpassen. Als vollwertige Multitasking-<br />
Plattform können Sie als Entwickler Anwendungen<br />
programmieren, die diese Eigenschaften<br />
ausnutzen und somit prompt auf<br />
<strong>Ein</strong>gaben reagieren.<br />
Abb. 4: Der Qt Creator bietet eine sehr umfangreiche Inline-Hilfe.<br />
Treibern, um eine bestimmte Hardware zu<br />
unterstützen. Die Entwicklung konzentriert<br />
sich hier auf schnelle Bootzeiten und optimalen<br />
Ressourcenverbrauch. Die Middleware<br />
enthält Dienste und Bibliotheken <strong>für</strong> mehrere<br />
Bereiche: Daten-Management, Media-Unterstützung,<br />
Internet-Dienste und Entwicklungs-API.<br />
Zusammen bezeichnet man die<br />
Middleware und den Adaptation Layer als<br />
MeeGo Core. MeeGo Core stellt die Basis <strong>für</strong><br />
<strong>alle</strong> MeeGo-Produkte dar. Für Unterschiede<br />
sorgen die grafischen Oberflächen von<br />
MeeGo, die <strong>für</strong> jede Geräteklasse speziell angepasst<br />
sind. Obwohl also die MeeGo-Netbook-Oberfläche<br />
komplett anders aussieht<br />
als die Handset-Variante oder die IVI-Version,<br />
basieren sie <strong>alle</strong> auf dem aktuellen MeeGo<br />
Core. Das bedeutet <strong>für</strong> Entwickler, dass ihre<br />
App auf <strong>alle</strong>n Varianten lauffähig ist, solange<br />
man sich an die MeeGo APIs hält.<br />
Qt – die MeeGo-API<br />
Die MeeGo-API basiert auf dem freien<br />
Framework Qt [3]. Bei Qt handelt es sich um<br />
ein Multi-Plattform-Framework zur Programmierung<br />
grafischer Anwendungen auf Basis<br />
von C++. Es enthält zahlreiche Module,<br />
um eine App über Widgets, Datenbanken,<br />
Netzwerkverbindungen, Browser-Ansichten<br />
und vieles mehr auszustatten. MeeGo unterstützt<br />
die Entwicklung in Qt mit <strong>alle</strong>n Mitteln<br />
und ermutigt angehende Programmierer<br />
über das Intel AppUp Developer Program,<br />
die Vorteile dieser Technologie zu nutzen<br />
und ihre Apps in Qt zu schreiben. Wie<br />
MeeGo ist auch Qt freie Software.<br />
Die integrierte Entwicklungsumgebung<br />
(IDE) von Qt heißt Qt Creator und bietet<br />
zahlreiche Möglichkeiten, um den Entwickler<br />
bei seiner Produktivität zu unterstützen. Die<br />
IDE enthält eine umfassende Dokumentation,<br />
die mit Druck auf die F1-Taste <strong>für</strong> jedes<br />
Objekt und jede Funktion einzeln aufgerufen<br />
werden kann. Qt Creator zeigt während des<br />
Programmierens auch nützliche Hinweise an<br />
und gibt Vorschläge. Sie finden in der Dokumentation<br />
auch zahlreiche Tutorials und Beispiele<br />
in verschiedenen Schwierigkeitsgraden,<br />
egal, ob Animation, Widget, Dialog oder<br />
etwas anderes. Qt enthält zudem auch den<br />
Qt-Designer, der Sie beim Zeichnen grafischer<br />
Oberflächen mit einer umfangreichen<br />
Bibliothek unterstützt.<br />
<strong>Ein</strong> sehr nützliches Tool, wenn Sie eine<br />
App <strong>für</strong> mehrere Geräte entwickeln möchten,<br />
ist der Layout Manager des Qt Creators.<br />
Darin lassen sich grafische Elemente skalieren<br />
oder neu anordnen, um eine App optimal<br />
an die gewünschte Bildschirmgröße oder<br />
Ausrichtung anzupassen.<br />
Das MeeGo-SDK<br />
Das MeeGo Software Development Kit (SDK)<br />
baut auf dem Qt Creator auf und erweitert<br />
den Editor, um Programmierern das Schreiben<br />
von MeeGo-Anwendungen zu erleichtern.<br />
Die Windows-Version des SDK übernimmt<br />
zudem die Aufgabe des Cross-Compiling,<br />
sodass Sie problemlos unter Windows<br />
eine Linux-App entwickeln können. Die<br />
Linux-Version sorgt <strong>für</strong> eine optimale native<br />
Entwicklung. Über das MeeGo Application<br />
48<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Praxis<br />
MeeGo-<strong>Ein</strong>führung<br />
Develop and Debug Environment (MADDE)<br />
stehen Ihnen mehrere MeeGo-Abbilder inklusive<br />
Bibliotheken zum Testen und Selbstentwickeln<br />
bereit, egal, ob Tablet, Netbook oder<br />
Handset. Neben der Entwicklung im Qt Creator<br />
bietet das MeeGo-SDK auch die Möglichkeit,<br />
Anwendungen direkt im Emulator<br />
QEMU oder auf einem echten Gerät zu testen.<br />
Wenn Sie schon über ein MeeGo-Gerät<br />
verfügen, machen Sie dank des SDKs daraus<br />
im Handumdrehen auch eine Plattform zur<br />
Entwicklung und <strong>für</strong> Tests weiterer MeeGo-<br />
Anwendungen.<br />
Listing 1: Hello World in QML<br />
import Qt 4.7<br />
Rectangle {<br />
width: 360<br />
height: 360<br />
Text {<br />
text: "Hello World"<br />
anchors.centerIn: parent<br />
}<br />
MouseArea {<br />
anchors.fill: parent<br />
onClicked: {<br />
Qt.quit();<br />
}<br />
}<br />
}<br />
Qt Quick<br />
<strong>Ein</strong>e besondere Herausforderung jeder Anwendungsentwicklung<br />
besteht darin, die Interessen<br />
von Programmierern und Designern<br />
unter einen Hut zu bringen. MeeGo entstand<br />
in enger Zusammenarbeit von Designern und<br />
Entwicklern und wir bei Intel sind der Meinung,<br />
dass das der beste Weg ist, um <strong>für</strong> ein<br />
positives Erlebnis beim Nutzer zu sorgen.<br />
Die gleichen Ansprüche haben wir auch an<br />
Qt Quick, ein großartiges Tool <strong>für</strong> Designer<br />
und Entwickler, über das sich mit wenig<br />
<strong>Code</strong> sehr coole grafische Oberflächen gestalten<br />
lassen [4]. Dazu setzt Qt Quick auf die Qt<br />
Meta-Object Language – QML in Zusammenarbeit<br />
mit dem Qt Creator. Listing 1 zeigt ein<br />
Beispiel, wie Sie damit sehr schnell eine Anwendung<br />
schreiben.<br />
Die Lernkurve von QML ist sehr flach, sodass<br />
Sie schon nach wenigen Beispielen und<br />
etwas Doku eigene animierte Anwendungen<br />
mit sehr vielen Ressourcen entwickeln können.<br />
QML bringt dabei auch Support <strong>für</strong> Gesten<br />
mit, ein Set davon steht Ihnen zur Nutzung<br />
bereit. Über die mitgelieferten Beispiele<br />
in der Dokumentation und ausführliche Tutorials<br />
gelingt der <strong>Ein</strong>stieg bestimmt. <strong>Ein</strong>es der<br />
einfachsten Beispiele zeigt, wie Sie ein Spiel<br />
schreiben, indem Sie zunächst das Spielfeld,<br />
dann die Steine definieren, um schließlich<br />
den Steinen ein paar Regeln beizubringen.<br />
Zum Schluss fügen Sie noch etwas<br />
JavaScript-<strong>Code</strong> bei, um das Spiel zu steuern.<br />
Qt Quick unterstützt JavaScript nativ<br />
und bietet auch die Integration von QML-<br />
Dateien mit C++ an.<br />
Das AppUp SDK<br />
Über das AppUp Developer Program ([5],<br />
siehe dazu auch den Artikel aus Smart Developer<br />
01/2011 [6]) bietet Intel einen zentralen<br />
Channel, um Ihre Anwendungen auf mehreren<br />
Kanälen und Geräten verfügbar zu machen.<br />
Bevor Sie eine Anwendung einreichen<br />
können, müssen Sie ein paar Schritte durchlaufen.<br />
Dazu gehört zunächst die Registrierung<br />
auf http:// AppDeveloper. intel. com, um<br />
eine Identifikationsnummer zu erhalten. Hier<br />
erhalten Sie auch <strong>für</strong> jede Ihrer Anwendungen<br />
die nötige Unique ID. Die Guidelines<br />
sind relativ schnell erklärt: Die App darf keinen<br />
Schadcode enthalten und keine Nutzerdaten<br />
auslesen, ohne den Benutzer darüber<br />
zu informieren. Die Anwendung sollte<br />
zudem als RPM-Paket gepackt sein und dabei<br />
die entsprechenden Konventionen zur Versionierung<br />
und Namensgebung einhalten. Last<br />
but not least muss Ihre Anwendung die AppUp-SDK-Bibliothek<br />
enthalten und Sie müssen<br />
die passende Anwendungs-ID benutzen.<br />
Sind diese Anforderungen erfüllt, dann<br />
können Sie die App <strong>für</strong> den Validierungsprozess<br />
einreichen. Hat Ihr Programm diesen<br />
Test überstanden, dann landet Sie im App<br />
Store und die Benutzer können sie herunterladen.<br />
Treten bei der Validierung Probleme<br />
auf, dann benachrichtigt Intel Sie per Mail<br />
und klärt Sie über die Gründe auf, sodass Sie<br />
die Fehler beheben und die App erneut einreichen<br />
können.<br />
All diese Schritte sind auf der AppUp-Entwicklerseite<br />
detailliert dokumentiert. Hier<br />
finden Sie auch zusätzliche Artikel und Hilfe<br />
von Entwicklern, falls Probleme auftreten.<br />
Intel bietet zudem regelmäßig besondere Prämienaktionen<br />
oder andere Anreize. Der<br />
Autor der besten MeeGo-Anwendung bekommt<br />
zum Beispiel die einmalige Möglichkeit<br />
zu einer Reise nach Russland spendiert,<br />
inklusive Überschallflug mit einem ehemaligen<br />
Militärjet. All diese Preise und noch einige<br />
mehr werden vierteljährlich vergeben,<br />
sodass sich ein Besuch auf der Intel-AppDeveloper-Webseite<br />
und die Entwicklung <strong>für</strong><br />
MeeGo wirklich lohnt.<br />
● ● ●<br />
Die Autorin<br />
Sulamita Garcia arbeitet <strong>für</strong> Intel<br />
Deutschland als Technical Marketing<br />
Engineer Europe und ist eng<br />
in die MeeGo-Entwicklung involviert.<br />
Sie erreichen Frau Garcia<br />
unter der E-Mail-Adresse sulamita.<br />
garcia@intel. com (bitte nur<br />
Zuschriften in Englisch).<br />
Infos<br />
[1] Projektseite:<br />
http:// www. meego. com<br />
[2] MeeGo-Wiki:<br />
wiki. meego. com<br />
[3] Qt-Webseite:<br />
http:// qt. nokia. com<br />
[4] Qt Quick<br />
http:// qt. nokia. com/ qtquick<br />
[5] Intel Entwicklerprogramm:<br />
http:// app<strong>developer</strong>. intel.<br />
com<br />
[6] Intel-AppUp erklärt:<br />
Tim Schürmann, „So funktioniert<br />
der AppUp-Store<br />
von Intel“ Smart Developer<br />
01/2011, S. 46.<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 49
Praxis<br />
UPnP mit BRisa<br />
UPnP-Programmierung mit BRisa: Teil 1/2<br />
Universell<br />
verbunden<br />
Das Protokoll Universal Plug and Play (UPnP) kann mehr als nur Musik oder Videos abspielen. Dieser<br />
Artikel macht Sie mit dem Standard vertraut und zeigt, wie Sie die freie UPnP-Implementierung<br />
BRisa installieren und damit arbeiten. Leandro Melo de Sales<br />
Durch die weite Verbreitung von<br />
Unterhaltungselektronik und mobilen<br />
Geräten wie PDAs, Handys<br />
und Tablet-Geräten mit Internetanschluss<br />
gewinnen die Konzepte des mobilen<br />
und Pervasive Computing [1] an praktischer<br />
Bedeutung. Der Standard Universal<br />
Plug and Play (UPnP) [2] eignet sich hervorragend<br />
da<strong>für</strong>, Dienstleistungen, die in Zusammenhang<br />
mit Pervasive Computing stehen,<br />
wie zum Beispiel die konfigurationsfreie<br />
Vernetzung (ZeroConf) und die automatische<br />
Erkennung von Geräten und Diensten in zukünftigen<br />
Netzwerken, zur Verfügung zu<br />
stellen. Das BRisa-Projekt [5] macht UPnP<br />
praxistauglich durch eine freie Implementierung<br />
des UPnP-Standards sowie dazu passende<br />
Tools.<br />
Was ist UPnP?<br />
Dieser Artikel stellt UPnP und BRisa vor. In<br />
einem zweiten Teil, der in der kommenden<br />
Ausgabe von Smart Developer erscheint, zeigen<br />
wir Ihnen dann, wie Sie eine Klimaanlage<br />
mit BRisa steuern. Der UPnP-Standard<br />
definiert ein Bündel von Computernetzwerk-<br />
Protokollen, mit deren Hilfe Computer,<br />
Appliances und drahtlose Geräte über ein<br />
Peer-to-Peer-Netzwerk miteinander kommunizieren<br />
können. Am UPnP-Standard sind<br />
fünf verschiedene Prozesse beteiligt. Jedes<br />
UPnP-kompatible Gerät, kann sich, unabhängig<br />
vom Hersteller, dynamisch auf folgende<br />
Weise in ein UPnP-Netzwerk einklinken:<br />
• Erhalt einer IP-Adresse (Schritt 1 – Adressierung)<br />
• Mitteilen der wichtigsten Gerätedaten<br />
(Schritt 2 – Beschreibung).<br />
• Mitteilen des Funktionsumfangs (auf Anfrage),<br />
Erkennen der Existenz und der<br />
Funktionen anderer Geräte im Netzwerk,<br />
Inanspruchnahme oder Anbieten von<br />
Netzwerkdiensten (Schritt 3 – Steuerung)<br />
• Bei Bedarf Abonnieren der Ereignismeldungen<br />
des externen Gerätes (Schritt 4 –<br />
Ereignismeldung/Eventing)<br />
Karel Miragaya, 123RF<br />
50<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Praxis<br />
UPnP mit BRisa<br />
• Aufrufen der Präsentationsseite des externen<br />
Gerätes, mit deren Hilfe der Anwender<br />
den Betriebsstatus abrufen und verändern<br />
kann (Schritt 5 – Präsentation).<br />
Unabhängig von den Prozessen und Betriebszuständen<br />
eines UPnP-Gerätes kann das<br />
Gerät das Netzwerk automatisch verlassen,<br />
ohne dass unerwünschte Statusinformationen<br />
zurückbleiben.<br />
Beim Hochfahren schickt die Schaltzentrale<br />
(Control Point) eine Multicast-Nachricht<br />
an das Netzwerk, um UPnP-Geräte ausfindig<br />
zu machen. Sobald <strong>alle</strong> UPnP-Geräte die<br />
Multicast-Nachricht erhalten haben, die von<br />
der UPnP-Schaltzentrale geschickt wurde,<br />
gibt jedes einzelne Gerät dem anfragenden<br />
Control Point eine Rückmeldung. Dadurch<br />
kennt die UPnP-Schaltzentrale <strong>alle</strong> angeschlossenen<br />
UPnP-Geräte im Netzwerk. Auf<br />
diese Weise kann der Anwender mehr über<br />
die Eigenschaften des Gerätes erfahren<br />
(Name, Hersteller, Modell, usw.), ein Gerät<br />
auswählen und bedienen sowie die gewünschte<br />
Aktion an das Gerät schicken. Der<br />
UPnP DCP-Spezifikationen<br />
Die UPnP-Spezifikationen enthalten mehrere DCP-Systeme (Device<br />
Control Protocol), die <strong>für</strong> die Kommunikation zwischen den einzelnen<br />
UPnP-Geräten verantwortlich sind. Es folgt eine Liste der wichtigsten<br />
DCPs mit Fallbeispielen, wie sie vom UPnP Forum definiert<br />
wurden:<br />
* UPnP Audio und Video – das DCP ist innerhalb der UPnP-Familie<br />
zuständig <strong>für</strong> Multimedia Sharing, Speicherung und Abspielen. Sie<br />
sind zusammen mit Freunden beim Grillen auf der Terrasse. Jemand<br />
erinnert sich an ein Lieblingslied aus der Uni-Zeit. Sie erwähnen,<br />
dass Sie das gesamte Album in Ihrem Netzwerk liegen haben.<br />
<strong>Ein</strong>ige wenige Fingerbewegungen auf dem Touchscreen-Display<br />
Ihres Handys genügen, und schon wird das gewünschte Lied über<br />
die Außenlautsprecher abgespielt.<br />
* Dienstgüte (Quality of Service, QoS) – durch die drei Varianten<br />
der UPnP-Dienstgüte wird ein Framework geschaffen <strong>für</strong> richtlinienbasierte,<br />
priorisierte QoS, die bei der Diagnose von Netzwerkproblemen<br />
hilft und einen Mechanismus zur Verfügung stellt, mit<br />
dem ein bevorzugter Server zur QoS-Richtlinienverwaltung festgelegt<br />
und konfiguriert werden kann. Sie sehen sich gerade einen<br />
Film in Ihrem Heimkino, als Ihre Kinder im Teenager-Alter von der<br />
Schule nach Hause kommen und anfangen, Videospiele zu spielen.<br />
Sie verlassen den Raum, um den Film im Schlafzimmer zu Ende zu<br />
sehen. Mit UPnP können Sie sicherstellen, dass Ihrem Film eine höhere<br />
Priorität als den Videospielen der Kinder eingeräumt wird und<br />
Ihr Film somit ohne Ruckeln bis zum Ende in Ihrem Schlafzimmer<br />
abgespielt werden kann.<br />
* Lichtsteuerung – die DCPs zur Lichtsteuerung enthalten Informationen<br />
<strong>für</strong> zwei Arten von Licht: Binäres Licht und gedimmtes Licht.<br />
Binäres Licht entspricht einer einfachen Glühbirne oder jeder anderen<br />
elektrischen Lichtquelle, die komplett an- und abgeschaltet<br />
werden kann. Gedimmtes Licht hat dieselben Eigenschaften wie binäres<br />
Licht, zusätzlich kann bei dieser Lichtform die Lichtintensität<br />
gesteuert werden; darüber hinaus verfügt diese Lichtart über Zusatzfunktionen.<br />
Ihre Kinder und deren Freunde richten normalerweise<br />
ein Chaos zu Hause an Freitagabenden an, wobei sie die<br />
Lichter brennen und die Türen unverschlossen lassen. In Zukunft<br />
kein Problem mehr! Auf Knopfdruck erkennt Ihr Alarmsystem, dass<br />
das Garagentor offen ist und dass außerdem mehrere Rollläden<br />
nicht heruntergelassen wurden und dies nun per Automatik nachgeholt<br />
werden muss. Das Alarmsystem wird aktiviert und <strong>alle</strong><br />
Lichtquellen werden abgeschaltet.<br />
* Stromsparmodus und Fernzugriff – Geräte mit Ruhe-Modus verwenden<br />
<strong>alle</strong> oder einige der folgenden Stromsparmodi: Transparent<br />
Sleep, Deep Sleep Online und Deep Sleep Offline; das Gerät<br />
kann sich dabei in jedem dieser Modi befinden. Sie besuchen Ihre<br />
Eltern, und sie sind die einzigen, die sich auch nur im Entferntesten<br />
<strong>für</strong> Ihre Urlaubsfotos interessieren. Da Ihre Set-Top-Box UPnP-fähig<br />
ist, verbindet sie sich per Fernzugriff mit dem Server in Ihrer Wohnung,<br />
schaltet den Ruhe-Modus ab und greift auf Ihre Mallorca-Urlaubsfotos<br />
zu. <strong>Ein</strong> paar Stunden später, wenn die Diaschau vorbei<br />
ist, wird der Server wieder in den Ruhe-Modus versetzt und vermutlich<br />
auch Ihre Eltern.<br />
* Drucken – das <strong>für</strong> Druckvorgänge zuständige DCP definiert eine<br />
Norm <strong>für</strong> Druck-Dienste beim UPnP-Standard. Während der Werbepause<br />
im Fernsehen erscheint eine kleine Grafik, die Sie darauf<br />
hinweist, dass dies ein interaktiver Werbespot ist und weitere Informationen<br />
abrufbar sind. Sie rufen die zusätzlichen Informationen<br />
ab, indem Sie eine Taste auf der Fernbedienung drücken. Der nett<br />
aussehende Pullover aus der Werbung ist als Sonderangebot mit<br />
50% Rabatt erhältlich! Sie drücken die Taste noch einmal, da Sie<br />
diesen Pulli nun dringend benötigen. Sofort wird Ihnen eine E-Mail<br />
zugeschickt, während im Büro Ihr Drucker anspringt und Ihren Rabattgutschein<br />
ausdruckt.<br />
* Sicherheit – der <strong>für</strong> die Gerätesicherheit zuständige Dienst ist <strong>für</strong><br />
Merkmale wie starke Authentifizierung, Wiedergabesperre sowie<br />
<strong>für</strong> den Schutz der UPnP SOAP-Mitteilungen verantwortlich. Da<br />
<strong>alle</strong> Geräte in Ihrem Haushalt UPnP-fähig sind, werden die Filme,<br />
die Sie zu Hause digital aufnehmen, automatisch auf Ihren Videoserver<br />
im Auto kopiert (wobei natürlich die Filter der von Ihnen installierten<br />
Kindersicherung greifen). Die UPnP-Technik stellt sicher,<br />
dass Ihre Aufnahmen urheberrechtskonform sind, indem die Benutzerrechte<br />
überprüft werden, damit Sie bei einer Kontrolle der<br />
Urheberrechts-Polizei keinen Ärger bekommen. Bei Ihrer nächsten<br />
längeren Fahrt können Ihre Kinder sich die Fahrzeit mit den neuen<br />
Aufnahmen auf dem Rücksitz verkürzen.<br />
* Geräteverwaltung – die DCPs zur Geräteverwaltung ermöglichen<br />
es, den generellen Gerätestatus darzustellen, Instandhaltungsmaßnahmen<br />
wie zum Beispiel Neustarts durchzuführen, Tests auszuführen<br />
zur Fehlerdiagnose wie zum Beispiel den ping-Test oder<br />
einen Selbsttest, außerdem können Logging-Funktionen an- und<br />
abgeschaltet sowie Logfiles eingesehen werden. Während Sie<br />
abends ein Musikvideo ansehen, wird Ihnen klar, dass die irren Farben<br />
nicht zum Video gehören, sondern aufgrund einer Fehlfunktion<br />
Ihres Fernsehgerätes auftreten. Auch das Fernsehgerät selbst<br />
kommt zum gleichen Schluss und verständigt sofort die Kundenbetreuung.<br />
<strong>Ein</strong>e Nachricht erscheint auf dem Bildschirm – ein Techniker<br />
bittet um Erlaubnis, den Fehler zu beheben; über Ihre Fernbedienung<br />
stimmen Sie zu. Der Fehler wird per Download beseitigt<br />
und das Problem ist gelöst.<br />
Diese Beispiele zeigen nur einen kleinen Teil der vielen komplexen<br />
Kommunikationsszenarien auf, die durch DCPs innerhalb der<br />
UPnP-Standards ermöglicht werden.<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 51
Praxis<br />
UPnP mit BRisa<br />
Abb. 1: Der BRisa UPnP Control Point arbeitet als Zentrale des Frameworks.<br />
UPnP-Protokollstapel ist <strong>für</strong> die Koordinierung<br />
des Kommunikationsprozesses zuständig.<br />
Weitere Informationen zu den Protokollgruppen,<br />
die mittels UPnP verfügbar sind,<br />
finden Sie im Kasten „UPnP DCP-Spezifikationen“<br />
auf Seite 51.<br />
Das BRisa-UPnP-Projekt<br />
Das BRisa-Projekt nahm seinen Anfang als<br />
Framework in der Programmiersprache Python,<br />
das die Entwicklung von UPnP-Geräten,<br />
Diensten und Schaltzentralen ermöglichte.<br />
Aufgrund der jüngsten Bemühungen<br />
des BRisa-Projektteams wurde die erste Version<br />
des Frameworks nun veröffentlicht,<br />
wobei die Entwickler dabei auf das Qt-<br />
Framework setzten. BRisa wird unterteilt in<br />
UPnP-Kernklassen und die Programmierschnittstelle<br />
(API) <strong>für</strong> die Control Points.<br />
Man kann das BRisa UPnP-Framework<br />
dazu verwenden, neue UPnP-Geräte zu entwickeln<br />
sowie entsprechende Dienste zur<br />
Verfügung zu stellen. Zu den möglichen Geräten<br />
gehören zum Beispiel Drucker, aber<br />
Abb. 2: In der nächsten Ausgabe zeigen wir Ihnen, wie Sie diese GUI programmieren.<br />
auch typischerweise in<br />
Haushalten vorhandene<br />
Geräte und Gegenstände<br />
wie Klimaanlagen,<br />
Beleuchtungsanlagen,<br />
Vorhänge<br />
und Türen. Mittels<br />
der BRisa-Programmierschnittstelle<br />
<strong>für</strong> die UPnP-Schaltzentrale<br />
können Programmierer<br />
von Anwendungen<br />
UPnP-<br />
Dienste nutzen wie<br />
zum Beispiel Geräteerkennung,<br />
Suche nach<br />
Multimedia-Inhalten,<br />
Abschicken von Druckaufträgen, <strong>Ein</strong>- und<br />
Ausschalten von Lichtquellen, Abrufen der<br />
Daten von Temperatursensoren, Anpassen<br />
der Temperatur einer Klimaanlage sowie die<br />
Steuerung von Fenstervorhängen.<br />
BRisa ist auf vielen verschiedenen Plattformen<br />
verfügbar, darunter Linux, Windows,<br />
Mac OS X sowie auf eingebetteten Systemen<br />
wie MeeGo und anderen. Ich werde im Folgenden<br />
einen kurzen Überblick über die Installationsschritte<br />
<strong>für</strong> Linux geben, aber Sie<br />
können diese Anleitung ganz einfach auf andere<br />
Betriebssysteme übertragen. Die ausführliche<br />
Anleitung zur Installation von<br />
BRisa auf anderen Betriebssystemen finden<br />
Sie in der BRisa-Projektdokumentation [5].<br />
Es ist kinderleicht, BRisa auf Qt-fähigen<br />
Systemen zu kompilieren und zu installieren.<br />
Falls Sie weitere Informationen zur Installation<br />
von Qt benötigen, steht Ihnen die BRisa<br />
Qt-Entwicklerdokumentation [6] zur Verfügung.<br />
Um fortzufahren, installieren Sie bitte<br />
die Qt-Version 4.6 oder neuer. BRisa hat nur<br />
eine externe Abhängigkeit: das LibQxt-Projekt<br />
[7]. Die Qt-SOAP-Klassenbibliothek ist<br />
in einem gesonderten Installationspaket verfügbar.<br />
Um den Installationsvorgang zu vereinfachen,<br />
haben wir den Quellcode sowohl<br />
<strong>für</strong> Qt als auch <strong>für</strong> Qt SOAP in das BRisa-<br />
Quellcode-Repository hineingepackt.<br />
Zuerst müssen Sie die neueste Version des<br />
Qt-BRisa-Quellcodes herunterladen und installieren.<br />
Dazu muss auf Ihrem Rechner die<br />
Versionsverwaltung Subversion installiert<br />
sein. Fehlt Subversion, verwenden Sie einfach<br />
den Paketmanager Ihrer Wahl, um diese<br />
Anwendung zu installieren.<br />
Um den Quellcode von Qt BRisa herunterzuladen,<br />
öffnen Sie ein Terminal-Fenster und<br />
navigieren Sie zu dem Verzeichnis, in dem<br />
Sie den BRisa-Quellcode abspeichern wollen.<br />
Erstellen Sie zum Beispiel ein Verzeichnis<br />
52<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Praxis<br />
UPnP mit BRisa<br />
namens upnp innerhalb Ihres Benutzerverzeichnisses<br />
und navigieren Sie dorthin. Führen<br />
Sie dann folgende Befehle aus:<br />
svn checkout https://vcs.maemo.org/svn/brisa/<br />
qt/trunk/qt‐brisa<br />
Navigieren Sie dann in das qt‐brisa-Verzeichnis.<br />
Dieses Verzeichnis enthält die Projektdokumentation,<br />
die Programmierschnittstelle,<br />
den Quellcode von Entwicklungszweigen<br />
des Projektes, Tags-Verzeichnisse und<br />
auch Installationspakete.<br />
Die drei wichtigsten Unterverzeichnisse innerhalb<br />
von qt‐brisa sind deps, examples<br />
und src. Das deps-Verzeichnis enthält <strong>alle</strong><br />
Abhängigkeiten der BRisa-Bibliothek. Im Verzeichnis<br />
examples finden Sie Beispiele <strong>für</strong><br />
UPnP-Geräte und Schaltzentrale-Implementationen.<br />
Das Verzeichnis src enthält die<br />
Standard-Implementation des BRisa UPnP-<br />
Stacks. Falls Sie Interesse haben, sich am<br />
BRisa-Projekt zu beteiligen, können Sie das<br />
zuletzt erwähnte Verzeichnis als Ausgangspunkt<br />
verwenden, um tiefer in die BRisa<br />
UPnP-Implementierung einzusteigen.<br />
Als nächsten Schritt installieren Sie die<br />
libqxt-Bibliothek: Wechseln Sie in das libqxt-Unterverzeichnis<br />
innerhalb des deps-<br />
Ordners und führen Sie folgende Befehle aus:<br />
qmake<br />
./configure<br />
make<br />
sudo make install<br />
Nach der Installation der libqxt-Bibliothek<br />
müssen Sie nun die Qt-SOAP-Bibliothek installieren.<br />
Navigieren Sie dazu zum Verzeichnis<br />
Qt SOAP innerhalb des deps-Verzeichnisses<br />
und wiederholen Sie dann die obige Befehlsfolge<br />
zum Kompilieren und Installieren:<br />
cd qtsoap‐2.6‐opensource<br />
qmake<br />
./configure<br />
make<br />
sudo make install<br />
Navigieren Sie nun zwei Verzeichnisebenen<br />
nach oben zum qt‐brisa-Verzeichnis cd<br />
../../, um dort die Qt BRisa-Bibliothek zu<br />
installieren. Verwenden Sie dazu dieselbe<br />
Abfolge der Installationsbefehle.<br />
Navigieren Sie zum Verzeichnis examples<br />
und führen Sie dort einige Anwendungen<br />
aus, um zu überprüfen, dass <strong>alle</strong>s korrekt<br />
ins talliert wurde. Wechseln Sie dazu in unser<br />
universelles UPnP-Verzeichnis und kompilieren<br />
Sie dort die Schaltzentrale mithilfe der<br />
folgenden Befehle (ignorieren Sie <strong>alle</strong> Warnhinweise<br />
in Bezug auf die Datei brisa.prf,<br />
falls welche erscheinen):<br />
cd examples/linux/BrisaControlPoint<br />
qmake<br />
./configure<br />
make<br />
Starten Sie die Schaltzentrale, indem Sie folgenden<br />
Befehl ausführen:<br />
./brisacontrolpoint<br />
Das Betriebssystem sollte nun die in Abbildung<br />
1 zu sehende Schaltzentrale starten.<br />
Hat <strong>alle</strong>s geklappt, können Sie die UPnP-<br />
Binärlicht-Implementation ausführen. Gehen<br />
Sie dazu eine Verzeichnisebene nach oben<br />
und wechseln Sie in das Verzeichnis Brisa‐<br />
BinaryLight. Kompilieren Sie dann die Binärlicht-Beispielimplementation<br />
cd ../BrisaBinaryLight<br />
qmake<br />
make<br />
und führen Sie sie über den Befehl ./brisa<br />
binarylight aus. Sie sollten auch das BRisa-<br />
Konfigurationstool kompilieren und ausführen;<br />
das Tool ist im Verzeichnis example verfügbar.<br />
Das Konfigurationstool ermöglicht es<br />
Ihnen, Konfigurationsdateien bequem über<br />
eine GUI abzuändern, anstatt die Dateien von<br />
Hand zu editieren. Das BRisa-Konfigurationstool<br />
wird dazu verwendet, die Standardeinstellungen<br />
des Frameworks zu ändern. In<br />
naher Zukunft werden Anwender in der Lage<br />
sein, BRisa Plugins und andere Funktionen<br />
mit dem Konfigurationstool zu verwalten.<br />
Falls Sie Schwierigkeiten haben bei der<br />
Ins tallation oder <strong>Ein</strong>richtung des Qt-BRisa-<br />
UPnP-Frameworks, können Sie das Installationshandbuch<br />
zurate ziehen, das auf der offiziellen<br />
Webseite verfügbar ist, oder besuchen<br />
das BRisa-Projekt im IRC auf dem Freenode-<br />
Server irc. freenode. com, Kanal brisa.<br />
Fortsetzung folgt…<br />
Mit den bisherigen Informationen sind Sie<br />
nun zur Programmierung einer eigenen Anwendung<br />
mit BRisa bereit. In der kommenden<br />
Ausgabe von Smart Developer zeigen<br />
wir Ihnen, wie Sie über das Framework eine<br />
komplette Klimaanlage steuern, inklusive<br />
grafische Oberfläche, <strong>Ein</strong>- und Ausschalten<br />
des Gerätes, Setup der Temperatur und<br />
Timerfunktion.<br />
● ● ●<br />
Die Autoren<br />
Leandro Melo de Sales startete<br />
das UPnP-BRisa-Projekt Ende<br />
2006. Er koordiniert das BRisa-<br />
Entwicklungsteam am Pervasive<br />
Computing Laboratory (COMPE/<br />
UFAL) und an weiteren Instituten<br />
in Brasilien. Leandro besitzt eine<br />
Professur <strong>für</strong> Computerwissenschaften<br />
an der Universität Alagoas<br />
und ist PhD-Kandidat an<br />
der staatlichen Universität von<br />
Campina Grande in Brasilien.<br />
Bei der Arbeit dieses Artikels<br />
haben ihn unterstützt: Angelo<br />
Perkusich, Hyggo Almeida,<br />
Thiago de Sales, Marcello de<br />
Sales, Camilo Campos, Vinicius<br />
Santos, Willian Victor, Leandro<br />
Dias.<br />
Infos<br />
[1] D. Saha, A. Mukherjee, Pervasive<br />
Computing: A Paradigm<br />
for the 21st Century,<br />
IEEE Computer, IEEE Computer<br />
Society Press, pp. 25-<br />
31, March 2003.<br />
[2] UPnP Forum:<br />
http:// www. upnp. org/<br />
[3] L. Sales, at al. BRisa UPnP A/<br />
V Framework, IEEE International<br />
Conference on Consumer<br />
Electronics pp. 1-2,<br />
January 2008.<br />
[4] P. Louridas. SOAP and Web<br />
Services, IEEE Software, vol.<br />
23, no. 6, pp. 62-67, December,<br />
2006.<br />
[5] BRisa Official Website:<br />
http:// brisa. garage. maemo.<br />
org and http:// garage.<br />
maemo. org/ projects/ brisa<br />
[6] BRisa Qt Developer Documentation:<br />
http:// brisa.<br />
garage. maemo. org/<br />
downloads/ qt‐brisa‐1.<br />
0‐documentation. pdf<br />
[7] LibQxt Project:<br />
http:// dev. libqxt. org/ libqxt/<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 53
Entwicklung<br />
Filesharing mit iOS<br />
Datenaustausch zwischen iTunes und iOS<br />
Filesharing<br />
erlaubt<br />
Seit Version 3.2 bietet das iOS das Feature der Dateifreigabe (Filesharing) und somit die Möglichkeit<br />
des Datenaustausches zwischen iTunes und dem iPhone/iPod/iPad. Unser Workshop zeigt, wie<br />
Sie das Feature in einer eigenen App einsetzen. Heiko Kalista<br />
Dieser Artikel beschreibt, wie man<br />
das Filesharing Feature von iOS in<br />
einer eigenen App verwendet.<br />
Dieses durchaus nützliche Feature<br />
(siehe Kasten „Das ist möglich“) bietet ein<br />
enormes Potenzial: So kann man beispielsweise<br />
einem Benutzer erlauben, den Spielstand<br />
eines iPhone-Spiels auf das iPad-Pendant<br />
zu übertragen. <strong>Ein</strong>ige Apps nutzen es<br />
auch, um proprietäre Daten — etwa ein eigenes<br />
Dateiformat — zwischen dem iOS-Gerät<br />
und dem Mac auszutauschen. Die <strong>für</strong> diesen<br />
Workshop mit Xcode 4 entwickelte iPad-App<br />
hat eine denkbar einfache Aufgabe: Über<br />
iTunes überträgt man Bitmap-Bilder, die dann<br />
mittels der entwickelten App auf Knopfdruck<br />
einen Schwarz-Weiß-Filter durchlaufen und<br />
in einem neuen Verzeichnis abgespeichert<br />
werden. Diese Bilder kann man sich dann per<br />
iTunes wieder auf den Desktop ziehen.<br />
<strong>Ein</strong>e solche Aufgabe lässt sich natürlich<br />
wesentlich effizienter gleich unter Mac OS X<br />
lösen. Auch deckt die hier vorgestellte App<br />
nicht <strong>alle</strong> möglichen Fälle ab: So unterstützt<br />
sie beispielsweise keine palettierten Bitmaps,<br />
nur Bilder mit 24- oder 32-Bit<br />
Farbtiefe. Das Beispiel<br />
veranschau-<br />
Mit freundlicher Genehmigung von Apple<br />
54<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Entwicklung<br />
Filesharing mit iOS<br />
Abb. 1: So aktivieren Sie die Dateifreigabe in Apples Entwicklungsumgebung Xcode.<br />
licht aber sehr gut das Prinzip der Dateifreigabe<br />
und der damit verbundenen Programmieraufgaben,<br />
sodass Sie Ihren Ideen freien<br />
Lauf lassen können.<br />
Filesharing einschalten<br />
Die <strong>für</strong> diesen Workshop erstellte App ist<br />
eine View-based Application. Damit der<br />
Quellcode <strong>für</strong> dieses Projekt überschaubar<br />
bleibt, findet die gesamte Interaktion mit den<br />
Dateien sowie das Umwandeln in ein S/W-<br />
Bild der <strong>Ein</strong>fachheit halber direkt im View-<br />
Controller statt. Der Name des Projektes lautet<br />
„BlackWhiteFilter“ und die im Artikel<br />
verwendeten Dateiverweise beziehen sich<br />
auf diesen Namen. Damit Sie die Listings<br />
nicht abtippen müssen, finden Sie den Quellcode<br />
auf der Smart-Developer-Homepage [1].<br />
Um die Dateifreigabe einzuschalten, öffnen<br />
Sie die Datei BlackWhiteFilter‐Info.plist<br />
und fügen per Rechtsklick und dem Menüpunkt<br />
Add Row eine neue Zeile hinzu. Als<br />
<strong>Ein</strong>trag wählen Sie Application supports<br />
iTunes file sharing und setzen den <strong>Ein</strong>trag<br />
Value auf YES.<br />
Damit iTunes die Dateifreigabe anzeigt,<br />
muss man die App <strong>für</strong> ein „echtes“ Device<br />
kompilieren und auf diesem starten. Natürlich<br />
kann man das Ganze auch im Simulator<br />
testen, nur dann eben ohne iTunes. Wie das<br />
funktioniert, sehen wir gleich.<br />
Sobald die App einmal auf einem realen<br />
Gerät gestartet wurde, sieht man in iTunes<br />
unter Geräte | Mein_iPad | Apps die Dateifreigaben<br />
<strong>für</strong> <strong>alle</strong> Apps, die dieses Feature unterstützen.<br />
Sie haben hier nun die Möglichkeit,<br />
Dateien in den Dokumentenordner der entsprechenden<br />
App hinein oder daraus herauszukopieren.<br />
Das Dokumentenverzeichnis<br />
Damit Ihre App auf die freigegebenen Dateien<br />
zugreifen kann, muss zuerst das zur<br />
App gehörende Verzeichnis ermittelt werden.<br />
Wie das zu bewerkstelligen ist, zeigt der<br />
<strong>Code</strong>-Ausschnitt in Listing 1. Dieser wird<br />
Das ist möglich<br />
Prinzipiell kann man über die Filesharing-Funktion<br />
von iOS/iTunes einer App beliebige Dateien<br />
zur Verfügung stellen und diese einfach<br />
per iTunes übertragen. Die App kann diese Dateien<br />
öffnen, auslesen und wenn gewünscht<br />
auch verändern und zurückschreiben. Dazu<br />
steht jeder App separat ein Ordner namens<br />
„Documents“ zur Verfügung. Weiterhin ist es<br />
möglich, zur Laufzeit eigene Dateien anzulegen<br />
und sogar neue Ordner zu erstellen. Über<br />
iTunes kann man dann auf die veränderten, respektive<br />
neuen Dateien zugreifen. Hierbei spielen<br />
Unterordner <strong>alle</strong>rdings eine gesonderte<br />
Rolle. Den Inhalt dieser Ordner kann iTunes<br />
nur kopieren oder löschen. Es ist nicht möglich,<br />
Dateien in Unterordner zu schieben oder<br />
über iTunes Unterordner anzulegen. Obwohl<br />
das Feature „Filesharing“ heißt, ist es auch<br />
nicht möglich, dass sich verschiedene Apps<br />
einen gemeinsamen Ordner teilen. Benutzt<br />
man das Filesharing-Feature, dann besitzt jede<br />
App ihren eigenen Ordner, auf den auch nur<br />
sie <strong>alle</strong>in zugreifen darf.<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 55
Entwicklung<br />
Filesharing mit iOS<br />
Abb. 2: Die Dateifreigabe in iTunes.<br />
aufgerufen, wenn der Nutzer den Konvertieren-Button<br />
betätigt. Der Methode NSSearch‐<br />
PathForDirectoriesInDomains teilt man mit,<br />
welches Verzeichnis man ermitteln möchte<br />
und wo dieses zu suchen ist. Wir sind auf<br />
der Suche nach dem Dokumentenverzeichnis,<br />
was wir durch die Konstante NSDocumentDirectory<br />
angeben. Gesucht werden soll<br />
im Benutzerverzeichnis. Das wird durch die<br />
Konstante NSUserDomainMask angegeben.<br />
Wie bereits beschrieben, lässt sich nur das<br />
Dokumentenverzeichnis der eigenen App ermitteln.<br />
Somit können Sie als Programmierer<br />
davon ausgehen, dass in pathList nur ein<br />
einziger <strong>Ein</strong>trag zu finden ist. Die App muss<br />
somit die Liste nicht durchlaufen, sondern<br />
schnappt sich einfach nur den ersten <strong>Ein</strong>trag.<br />
Im String documentsDirectory steht nun<br />
der Pfad, in dem die freigegebenen Dateien<br />
zu finden sind. Da die App die konvertierten<br />
Bilder später in einem separaten Ausgabeverzeichnis<br />
speichert, erzeugen Sie noch einen<br />
entsprechenden Pfad und legen ihn im String<br />
destinationDirectory ab. Die App muss natürlich<br />
überprüfen, ob das Ausgabeverzeichnis<br />
vorhanden ist oder nicht. Beim ersten<br />
Start der App ist es definitiv nicht vorhanden.<br />
Die Klasse NSFileManager bietet leider<br />
Listing 1: Ermitteln des Dokumentenverzeichnisses<br />
NSArray *pathList = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );<br />
NSString *documentsDirectory = [pathList objectAtIndex:0];<br />
NSString *destinationDirectory = [NSString stringWithFormat:@"%@/output", documentsDirectory];<br />
NSFileManager *fileManager = [NSFileManager defaultManager];<br />
// Ausgabeverzeichnis erzeugen, falls nicht vorhanden<br />
BOOL isDirectory = NO;<br />
if (([fileManager fileExistsAtPath:destinationDirectory isDirectory:&isDirectory] && isDirectory == YES) == NO) {<br />
[fileManager createDirectoryAtPath: destinationDirectory withIntermediateDirectories: NO attributes: nil error: NULL];<br />
}<br />
56<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Entwicklung<br />
Filesharing mit iOS<br />
keine direkte Möglichkeit zur Abfrage, ob ein<br />
bestimmtes Verzeichnis existiert oder nicht.<br />
Stattdessen können Sie jedoch die Methode<br />
fileExistsAtPath:isDirectory verwenden.<br />
Diese ist zwar in der Verwendung etwas<br />
eigen, erfüllt aber ihren Zweck anstandslos.<br />
Existiert das gewünschte Ausgabeverzeichnis<br />
nicht, dann legt es die Methode createDirectoryAtPath<br />
an.<br />
Für Simulanten<br />
Das Dokumentenverzeichnis zu ermitteln<br />
und neue Unterverzeichnisse zu erstellen,<br />
funktioniert auf dem Device selbst, ebenso<br />
wie im Simulator. Es ist nicht nötig, im<br />
Quellcode eine Unterscheidung zu treffen.<br />
Allerdings ist es nicht möglich, mittels iTunes<br />
auf den Simulator zuzugreifen. Stattdessen<br />
verwendet man einfach den Finder und arbeitet<br />
direkt auf Dateiebene.<br />
Wie auf dem echten Gerät hat jede App<br />
ihren eigenen Platz <strong>für</strong> das Dokumentenverzeichnis.<br />
Fündig wird man unter Library/<br />
Application Support/iPhone Simulator/4.3/<br />
Application/ID/Documents. Die „4.3“ steht<br />
dabei <strong>für</strong> die verwendete iOS-Version und<br />
„ID“ <strong>für</strong> die GUID der aktuellen App.<br />
Auflisten der Bitmaps<br />
Als Nächstes müssen wir uns darum kümmern,<br />
eine Liste zu erstellen, die <strong>alle</strong> Bitmap-<br />
Dateien im Verzeichnis enthält. Das ist nicht<br />
weiter schwer, wie folgender <strong>Code</strong>-Ausschnitt<br />
zeigt:<br />
Zuerst lassen wir uns mittels der Methode<br />
contentsOfDirectoryAtPath:documentsDirectory<br />
ein Array zurückliefern, das die Namen<br />
sämtlicher Objekte enthält, die sich im Dokumentenverzeichnis<br />
befinden. Dazu zählen<br />
neben den Dateien natürlich auch Unterordner.<br />
Das Filtern dieser Liste übernimmt nicht<br />
der Dateimanager, sondern die Methode<br />
filteredArrayUsingPredicate der Klasse<br />
NSArray. Dazu legen Sie zuerst ein NSArray<br />
an und füllen dieses mit den gewünschten<br />
<strong>Ein</strong>trägen. Unsere App soll nur nach Bitmap-<br />
Dateien suchen, weshalb wir nur bmp übergeben.<br />
Natürlich können Sie weitere Dateiendungen<br />
oder Filterkriterien angeben, wenn<br />
Sie möchten.<br />
<strong>Ein</strong>lesen einer Grafik<br />
Nun stehen sämtliche <strong>für</strong> die Konvertierung<br />
benötigen Informationen bereit und die App<br />
kann die erhaltene Liste der Bitmap-Dateinamen<br />
durchlaufen (Listing 3). Der <strong>Code</strong><br />
durchläuft zuerst die Liste der gefundenen<br />
Dateien, wobei jeder <strong>Ein</strong>trag <strong>für</strong> Debug-Zwecke<br />
in die Log-Datei geschrieben wird. Weiterhin<br />
baut der <strong>Code</strong> die Pfade <strong>für</strong> die Quellund<br />
Zieldateien zusammen. Die Pfadangaben<br />
werden der Methode convertImage übergeben,<br />
die wir uns nun stückchenweise anschauen<br />
(Listing 4).<br />
Damit wir auf dem iPad während des Konvertierungsvorganges<br />
auch etwas zu sehen<br />
bekommen, wurde der App ein Imageview<br />
spendiert, das zu Beginn der Methode convertImage<br />
mit dem aktuell zu bearbeitenden<br />
Bild gefüllt wird. Konvertiert man mehrere<br />
Listing 2: Auflisten der Dateien<br />
// Alle Dateien im Dokumentenverzeichnis auflisten<br />
NSArray *filelist;<br />
filelist = [fileManager contentsOfDirectoryAtPath:documentsDirectory<br />
error:NULL];<br />
// Die erhaltene Liste nach Bitmap‐Dateien filtern<br />
NSArray *bmpFilter = [NSArray arrayWithObjects:@"bmp", nil];<br />
NSArray *bitmapFileList = [filelist filteredArrayUsingPredicate:[NSPredicate p<br />
redicateWithFormat:@"pathExtension IN %@", bmpFilter]];<br />
Listing 3: Durchlaufen der Quellbilder<br />
int count = [bitmapFileList count];<br />
for (int i = 0; i < count; i++) {<br />
NSLog(@"%@", [bitmapFileList objectAtIndex: i]);<br />
NSString *pathOfSourceFile = [NSString stringWithFormat:@"%@/%@",<br />
documentsDirectory, [bitmapFileList objectAtIndex: i]];<br />
NSString *pathOfDestinationFile = [NSString stringWithFormat:@"%@/%@",<br />
destinationDirectory, [bitmapFileList objectAtIndex: i]];<br />
}<br />
[self convertImage: pathOfSourceFile :pathOfDestinationFile];<br />
Listing 4: Öffnen der Datei<br />
‐ (void)convertImage:(NSString*)sourceFileName :(NSString*)destinationFileName<br />
{<br />
imageView.image = [[[UIImage alloc]<br />
ileName] autorelease];<br />
// Datei öffnen<br />
NSFileHandle *fileHandle = [NSFileHandle<br />
Path:sourceFileName];<br />
initWithContentsOfFile:sourceF<br />
fileHandleForReadingAt<br />
}<br />
if (fileHandle == NULL) {<br />
NSLog(@"Failed to load: %@", sourceFileName);<br />
return;<br />
}<br />
else {<br />
NSLog(@"File %@ loaded successfully", sourceFileName);<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 57
Entwicklung<br />
Filesharing mit iOS<br />
Listing 5: Auslesen des Bitmap-Headers<br />
// Bitmap‐Header auslesen<br />
struct BitmapHeader bitmapHeader;<br />
int bitmapHeaderSize = sizeof(bitmapHeader);<br />
Bilder, wird nur das zuletzt bearbeitete Bild<br />
angezeigt. Das liegt daran, dass der gesamte<br />
Konvertierungsprozess am Stück abläuft und<br />
damit auch die GUI blockiert. Möchte man<br />
jedes Bild anzeigen und eventuell noch einen<br />
Fortschrittsbalken darstellen, dann muss<br />
man die Funktionalität in einen separaten<br />
Thread auslagern.<br />
Um die Datei zu öffnen, legen Sie ein<br />
NSFileHandle an und rufen die Methode<br />
fileHandleForReadingAtPath auf, der Sie den<br />
gewünschten Dateinamen (inklusive Pfad)<br />
übergeben. Danach prüfen Sie, ob Sie ein<br />
gültiges Handle bekommen haben und geben<br />
entsprechende Meldungen aus.<br />
Als Nächstes kümmern wir uns um das<br />
Auslesen des Bitmap-Headers (Listing 5, und<br />
Kasten „Der Bitmap-Header“).<br />
NSData *bitmapHeaderData = [fileHandle readDataOfLength:bitmapHeaderSize];<br />
[bitmapHeaderData getBytes:&bitmapHeader length:bitmapHeaderSize];<br />
Listing 6: Auslesen der Pixeldaten<br />
// Pixeldaten auslesen<br />
NSData *bitmapPixelData = [fileHandle readDataOfLength:bitmapHeader.<br />
bitmapDataSize];<br />
Byte *pixelData = (Byte*)malloc(bitmapHeader.bitmapDataSize);<br />
[bitmapPixelData getBytes:pixelData length:bitmapHeader.bitmapDataSize];<br />
Die Klasse NSData bietet uns die Möglichkeit,<br />
bequem auf einen Byte-Buffer zuzugreifen.<br />
Mittels der Methode readDataOfLength lesen<br />
wir nun den Bitmap-Header ein und speichern<br />
ihn im NSData-Objekt bitmapHeader‐<br />
Data. Dort nützen uns die Daten <strong>alle</strong>rdings<br />
noch nicht sonderlich viel, denn eigentlich<br />
wollten wir unsere Struktur mit den gewünschten<br />
Daten füllen. Dazu bietet die<br />
Klasse NSData die Methode getBytes. Diese<br />
kopiert einen definierten Speicherbereich an<br />
die angegebene Adresse. Um einen Bereich<br />
der zu kopierenden Daten anzugeben, bedient<br />
man sich der Struktur NSRange und der<br />
Funktion NSMakeRange. In unserem Fall genügt<br />
es, einfach die gewünschte Länge anzugeben.<br />
Wurde das Pack Alignment richtig gesetzt<br />
(siehe Kasten „Der Bitmap-Header“),<br />
stehen nun sämtliche Informationen über die<br />
Bitmap-Datei in der Struktur bitmapHeader<br />
zur Verfügung und es kann mit dem Auslesen<br />
der eigentlichen Pixeldaten weitergehen.<br />
Der Bitmap-Header<br />
<strong>Ein</strong>e Bitmap-Datei ist aufgeteilt in einen Header<br />
und in die eigentlichen Bilddaten. Im Header<br />
sind Informationen über die Breite, Höhe,<br />
Farbtiefe und einige weitere Informationen abgelegt.<br />
Die meisten dieser Informationen sind<br />
<strong>für</strong> unser Vorhaben erst einmal irrelevant. Wir<br />
unterstützen beispielsweise keine palettierten<br />
Bilder. Wichtig ist <strong>alle</strong>rdings, dass wir <strong>für</strong> die<br />
folgende Struktur ein Pack Alignment von 2<br />
angeben, da sonst später beim Laden die<br />
Struktur nicht korrekt gefüllt werden würde.<br />
#pragma pack(push, 2)<br />
struct BitmapHeader<br />
{<br />
[fileHandle closeFile];<br />
int stride = (bitmapHeader.width * (bitmapHeader.bpp / 8) + 3) & ~3;<br />
Listing 7: Die Graustufen-Konvertierung<br />
// Graustufenkonvertierung<br />
int numBytes = bitmapHeader.bpp/8;<br />
for (int y=0; y
Entwicklung<br />
Filesharing mit iOS<br />
Das Auslesen der Pixeldaten (Listing 6) gestaltet<br />
sich auch nicht weiter schwierig. Wir<br />
müssen lediglich ein neues NSData-Objekt anlegen,<br />
die Daten einlesen und die Byte-Daten<br />
kopieren. Die da<strong>für</strong> benötigte Größe berechnet<br />
die App aus dem Header. Im Prinzip die<br />
gleiche Vorgehensweise wie im obigen <strong>Code</strong>-<br />
Ausschnitt. Der letzten Zeile schenken wir<br />
<strong>alle</strong>rdings ein bisschen mehr Beachtung:<br />
Man muss aufpassen, wenn man die Pixeldaten<br />
korrekt verarbeiten möchte, da jede Zeile<br />
einer Bitmap 32 Bit aligned ist. Bei bestimmten<br />
Auflösungen besteht somit ein kleiner<br />
overhead an Bytes pro Zeile. Beim Auslesen<br />
muss man das berücksichtigen. Um herauszufinden,<br />
wie viele Bytes tatsächlich pro<br />
Zeile verwendet werden, rechnen wir uns<br />
den sogenannten stride aus. Wie dieser weiterverwendet<br />
wird, zeigt Listing 7.<br />
Jedes Pixel einer Bitmap-Datei besteht (solange<br />
keine Farbpalette verwendet wird) zu<br />
bestimmten Anteilen aus Rot, Grün und Blau.<br />
Das menschliche Auge nimmt diese drei Farben<br />
unterschiedlich intensiv wahr. Somit<br />
kann man jeder dieser Farben eine gewisse<br />
Gewichtung zuordnen. Meistens liegt diese<br />
Gewichtung bei etwa 11% Blau, 59% Grün<br />
und 30% Rot. Verrechnet man jede Farbkomponente<br />
mit der Gewichtung und addiert die<br />
Resultate, erhält man einen passenden Grauwert.<br />
Und genau das machen wir in der oben<br />
gezeigten Schleife. Man sieht dort auch, dass<br />
als Byte-Offset pro Zeile der weiter oben berechnete<br />
stride zum <strong>Ein</strong>satz kommt.<br />
Das Finale<br />
<strong>Ein</strong> Graustufenbild liegt nun als Resultat vor,<br />
<strong>alle</strong>rdings liegt dieses noch im Speicher. Wie<br />
Sie das Ergebnis in eine neue Bitmap-Datei<br />
schreiben, zeigt Listing 8.<br />
Als Erstes müssen Sie sich darum kümmern,<br />
dass die Pixel wieder in einem NSData-Objekt<br />
landen, denn das oben verwendete Byte-Array<br />
lässt sich nicht direkt in eine Datei<br />
schreiben. Dazu benutzt unsere App die<br />
Methode dataWithBytes der Klasse NSData.<br />
Dieser übergeben Sie den Zeiger auf die Byte-<br />
Daten und deren Länge. Nun versuchen Sie,<br />
die Zieldatei zu öffnen. Ist diese bereits vorhanden,<br />
gibt die Methode fileHandleForWritingAtPath<br />
ein Filehandle zurück. Falls die<br />
Datei noch nicht vorhanden ist, erzeugen Sie<br />
sie mit der Methode createFileAtPath und<br />
versuchen dann erneut Ihr Glück.<br />
Sobald ein gültiges Handle vorhanden ist,<br />
schreibt die Methode writeData den Bitmap-<br />
Header – den wir ja noch im Speicher haben<br />
– in die geöffnete Datei. Als Nächstes<br />
schreibt die gleiche Methode die Pixeldaten<br />
und erzeugt damit eine neue Bitmap-Datei.<br />
Zu guter Letzt wird die Datei geschlossen<br />
und die Pixeldaten mittels free freigegeben.<br />
Fazit<br />
Die Dateifreigabe via iTunes ist im Zusammenspiel<br />
mit dem iPad oder einem iPhone<br />
ein interessantes und nützliches Feature.<br />
Man kann damit Daten auf das iPad packen,<br />
diese unterwegs im Zug bearbeiten und später<br />
wieder auf den Rechner ziehen. Zudem<br />
lassen sich Dateiformate verwenden, <strong>für</strong> die<br />
Apple keine native Unterstützung bietet. Last<br />
but not least eignet sich das Feature, um Anwendungsdaten<br />
älterer Geräte auf neuere zu<br />
übertragen. Wie dieser Artikel gezeigt hat, ist<br />
es nicht schwer, die Dateifreigabe <strong>für</strong> die eigene<br />
App zu verwenden und mittels einiger<br />
Dateioperationen erste Resultate zu erzielen.<br />
Für Ihr eigenes Projekt brauchen Sie also nur<br />
noch eine zündende Idee. ● ● ●<br />
Der Autor<br />
Heiko Kalista arbeitet als Software-Entwickler<br />
bei Giegerich &<br />
Partner GmbH in Dreieich. Er hat<br />
das Fachbuch „C++ <strong>für</strong> Spieleprogrammierer“<br />
verfasst. Sie erreichen<br />
Ihn unter der Adresse<br />
largo75@gmx. de<br />
Infos<br />
Listing 8: Schreiben von Dateien<br />
bitmapPixelData = [NSData dataWithBytes:(const void *)pixelData<br />
length:bitmapHeader.bitmapDataSize];<br />
// Datei schreiben<br />
fileHandle = [NSFileHandle fileHandleForWritingAtPath:destinationFileName];<br />
if(fileHandle == nil) {<br />
[[NSFileManager defaultManager] createFileAtPath:destinationFileName contents:nil<br />
attributes:nil];<br />
fileHandle = [NSFileHandle fileHandleForWritingAtPath:destinationFileName];<br />
}<br />
if(fileHandle != nil) {<br />
[fileHandle writeData:bitmapHeaderData];<br />
[fileHandle writeData:bitmapPixelData];<br />
[fileHandle closeFile];<br />
}<br />
free(pixelData);<br />
[1] Kompletter Quellcode<br />
der Beispiel-App:<br />
http:// www. <strong>smart</strong>‐<strong>developer</strong>.<br />
de/ Magazin/ <strong>Code</strong>‐Beispiele<br />
[2] IOS-Entwicklerprogramm,<br />
weiterführende Informationen<br />
zum Thema:<br />
http:// <strong>developer</strong>. apple. com/<br />
library/ ios/ # documentation/<br />
iphone/ conceptual/<br />
iphoneospro<br />
grammingguide/<br />
StandardBehaviors/<br />
StandardBehaviors. html<br />
[3] Informationen zum Buch<br />
„C++ <strong>für</strong> Spieleprogrammierer“:<br />
http:// www. hanser. de/<br />
buch. asp"isbn=978‐3‐446‐<br />
42140‐0& area=Computer<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 59
Entwicklung<br />
WP7-Entwicklung mit XNA<br />
Spiele-Programmierung <strong>für</strong> Windows Phone 7<br />
Blöcke<br />
stapeln<br />
Spiele oder Anwendungen <strong>für</strong> das Windows Phone 7 zu<br />
programmieren, ist <strong>für</strong> erfahrene Windows-Entwickler<br />
nicht schwierig: Die Tools dazu – Visual Studio 2010 und<br />
die Windows Phone 7 Developer Tools – gibt es kostenlos<br />
und die Programmiersprache ist C#. Dieser Artikel<br />
zeigt, wie ein einfaches Spiel namens Blocks<br />
entsteht. Benjamin Nitschke<br />
Seit Ende letzten Jahres mischt Microsoft mit<br />
Windows Phone 7 am Smartphone-Markt mit.<br />
Dank XNA und Unterstützung <strong>für</strong> Silverlight<br />
kann man nun relativ einfach Spiele und Anwendungen<br />
<strong>für</strong> Windows Phone 7 in C#/.NET entwickeln.<br />
Andere Plattformen wie iOS und Android benötigen andere<br />
Sprachen und Tools (Objective-C und Java). Der <strong>Ein</strong>stieg ist<br />
<strong>für</strong> Spieleentwickler also nicht immer ganz so leicht.<br />
Dieser Artikel zeigt, wie Sie ein einfaches Windows-Phone-7-<br />
Spiel in XNA mit wenigen Zeilen Source-<strong>Code</strong> programmieren. Wer<br />
sich <strong>für</strong> die Silverlight-Entwicklung von Windows Phone 7 interessiert,<br />
findet in der Ausgabe 01/2011 von Smart-Developer einen interessanten<br />
Artikel zum Erstellen eines einfachen RSS-Newsreaders<br />
[1]. Dieser Artikel geht auch noch auf die Unterschiede zum<br />
iPhone und zu Android ein und stellt eine mögliche Lösung <strong>für</strong><br />
Spieleentwickler vor, um auf <strong>alle</strong>n Plattformen mit einer <strong>Code</strong>basis<br />
Spiele entwickeln zu können.<br />
nebuto, 123rf.com<br />
Voraussetzungen<br />
Um loszulegen, braucht man einen Windows-Rechner und Visual<br />
Studio 2010 sowie die Windows Phone Developer Tools. Visual Studio<br />
2010 gibt es als kostenlose C#-Express-Variante, aber auch die<br />
volle Version (Standard, Professional oder Ultimate) funktioniert<br />
problemlos mit den Windows Phone Developer Tools zusammen.<br />
Um Letztere installieren zu können, benötigt man mindestens<br />
Windows Vista oder Windows 7. Wer noch auf Windows XP setzt,<br />
oder unter Linux oder Mac OS X <strong>für</strong> Windows Phone 7 entwickeln<br />
will, sollte sich den Abschnitt zur Delta Engine am Ende des Artikels<br />
durchlesen, dort gibt es diese Voraussetzungen nicht, zudem<br />
können Sie damit auch <strong>für</strong> andere Plattformen entwickeln.<br />
60<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Entwicklung<br />
WP7-Entwicklung mit XNA<br />
Nachdem Sie die Tools installiert haben und<br />
optional auch die aktuellen Service Packs<br />
eingerichtet haben, kann man in Visual Studio<br />
2010 ein neues Windows Phone Game<br />
(4.0) Projekt in der Gruppe XNA Game Studio<br />
4.0 erstellen (Abbildung 2). Für diesen<br />
Artikel wurde das Projekt WP7Blocks genannt.<br />
Nachdem man OK gedrückt hat, werden<br />
automatisch zwei Projekte erstellt:<br />
WP7Blocks und WP7BlocksContent. Das Content-Projekt<br />
ist noch leer und erwartet nun<br />
Content <strong>für</strong> das WP7Blocks-Projekt, das<br />
unter Content References verlinkt ist.<br />
Die Idee<br />
Als Nächstes braucht man erst einmal eine<br />
Spiel idee. Wenn die Idee komplexer wird<br />
und insbesondere, wenn man zusammen in<br />
einem Team mit Grafikern, Game Designern<br />
und Programmierern arbeitet, sollte man<br />
unbedingt ein Spielkonzept erstellen und<br />
eine grobe Planung vornehmen. Aber auch<br />
wenn Sie <strong>alle</strong>ine arbeiten, sollten die Ziele<br />
ganz klar sein. Für diesen Artikel war das<br />
Ziel, in etwa 100 Zeilen <strong>Code</strong> ein sehr einfaches<br />
Spiel <strong>für</strong> Windows Phone 7 zu erstellen<br />
und auch keine weiteren Libraries oder<br />
Frameworks außer XNA zu benutzen. Logischerweise<br />
lässt sich auf 100 Zeilen nicht<br />
sonderlich viel Spiellogik unterbringen, aber<br />
umso besser eignet sich das Projekt als<br />
Grundlage <strong>für</strong> weitere und komplexere 2D-<br />
Spiele in XNA.<br />
F<strong>alle</strong>nde Blöcke<br />
Die Spielidee ist ein stark vereinfachtes Tetris.<br />
Es gibt jedoch nur eine Art Block und<br />
man kann diesen nur nach rechts und links<br />
Abb. 1: Das Blocks-Spiel auf dem Windows Phone 7 Emulator.<br />
bewegen. Das Spiel findet auf einem 9x9 großen<br />
Feld statt, und genau wie in Tetris erscheint<br />
oben ein neuer Block und das Spielziel<br />
ist, unten Zeilen zu füllen. <strong>Ein</strong> zugegebenermaßen<br />
sehr einfaches Spiel, bei dem<br />
zudem auch die Bedingungen zum Gewinnen<br />
oder Verlieren fehlen. Man kann jedoch<br />
beliebig lange auf einem echten Gerät oder<br />
dem Windows Phone 7 Emulator spielen und<br />
genau wie bei Tetris verschwinden Zeilen,<br />
sobald diese komplett gefüllt sind.<br />
Das Spiel besteht nur aus zwei Grafiken.<br />
Die Datei SpaceBackground.png (Abbildung<br />
3) dient als Hintergrundbild und Block.png<br />
(Abbildung 4) zeigt den aktuellen Block an,<br />
den man steuern kann. Beide Grafiken stammen<br />
vom Spiel XNATetris, das ich 2006 <strong>für</strong><br />
mein Buch „Professional XNA Game Programming“<br />
geschrieben habe. Wer sich <strong>für</strong><br />
ein vollständiges Tetris in XNA interessiert,<br />
findet am Ende des Artikels ein paar weiter-<br />
Abb. 2: So erstellen Sie ein neues Windows Phone Game Projekt.<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 61
Entwicklung<br />
WP7-Entwicklung mit XNA<br />
Abb. 4: Die Blockgrafik <strong>für</strong><br />
das triviale Tetris-Spiel.<br />
Abb. 3: Die Hintergrundgrafik <strong>für</strong> das Blocks-Spiel.<br />
führende Literaturhinweise. In diesem Artikel<br />
kümmern wir uns nur um die grundlegenden<br />
Elemente eines WP7-Spiels.<br />
Initialization<br />
Um die beiden Grafiken im WP7Blocks-Projekt<br />
benutzen zu können, müssen diese zum<br />
WP7BlocksContent-Projekt hinzugefügt werden.<br />
Dies geht am einfachsten durch<br />
Drag&Drop dieser zwei Dateien auf den Solution<br />
Explorer in Visual Studio 2010. Es<br />
kommt nicht darauf an wie diese Grafiken<br />
aussehen, man kann auch beliebig andere<br />
Bilder benutzen. Wer die XNATetris-Grafiken<br />
Listing 1: Variablen<br />
benutzen will, sollte diese am besten durch<br />
den XNATetris-Link am Ende des Artikels herunterladen<br />
und dort aus dem Content-Verzeichnis<br />
entnehmen. Wer andere Grafiken<br />
benutzen will, sollte darauf achten, dass das<br />
Hintergrundbild mindestens 512 x 512 Bildpunkte<br />
groß ist.<br />
Die Größe der Block.png-Grafik spielt<br />
keine Rolle. Sie wird im Spiel immer in 53 x 53<br />
Pixeln gezeichnet, da das Spielboard 9x9 Felder<br />
hat und jedes Windows-Phone-7-Gerät<br />
eine Auflösung von 800 x 480 Pixeln hat<br />
(480/9 ergibt 53.33).<br />
Als Nächstes kann man in Visual Studio<br />
noch die Eigenschaften (Properties) der Bilder<br />
bearbeiten (Abbildung 5). Es bietet sich<br />
an, DXTCompression zu benutzen, um die<br />
Bilder klein zu halten, aber bei diesem kleinen<br />
Spiel macht die Kompression kaum<br />
einen Unterschied an der finalen App-Größe.<br />
Im WP7Blocks-Projekt gibt es noch weitere<br />
Grafiken, die <strong>für</strong> die Kacheln des Windows<br />
Phone 7 benutzt werden und ein GameThumbnail.png,<br />
welches ebenfalls als Kachel und<br />
im WP7-AppStore erscheint. Die Datei Game.<br />
ico hat keine Bedeutung unter Windows<br />
Phone 7 und auch die Program.cs-Datei wird<br />
nicht benötigt. Letztendlich bleibt nur noch<br />
die Game1.cs-Datei übrig, welche Sie am besten<br />
in etwas Sinnvolleres umbenennen, zum<br />
Beispiel BlocksGame oder<br />
MeinErstesGame.<br />
Abb. 5: Hier bearbeiten Sie die<br />
Eigenschaften <strong>für</strong> das Content-Projekt<br />
des Blocks-Spiels.<br />
Texture2D background;<br />
Texture2D block;<br />
// Define a field of 9x9 blocks<br />
const int FieldWidth = 9, FieldHeight = 9;<br />
bool[,] field = new bool[FieldWidth,<br />
FieldHeight];<br />
int currentBlockX = 4, currentBlockY = 0;<br />
// Update 4 times a second.<br />
const double UpdateTime = 0.25f;<br />
double nextUpdateTime = 0.0f;<br />
Listing 2: LoadContent<br />
/// <br />
/// LoadContent will be c<strong>alle</strong>d once per<br />
game<br />
/// all of your content.<br />
/// <br />
protected override void LoadContent()<br />
{<br />
// Create a new SpriteBatch, used to draw textures.<br />
spriteBatch = new SpriteBatch(GraphicsDevice);<br />
background = Content.Load("SpaceBackground");<br />
block = Content.Load("Block");<br />
} // LoadContent()<br />
<strong>Ein</strong> erster Test<br />
Um sicherzustellen, dass<br />
bisher <strong>alle</strong>s in Ordnung ist<br />
und Sie durch eventuelle<br />
Umbenennaktionen oder<br />
dem Hinzufügen von Content<br />
noch nichts kaputt<br />
gemacht haben, sollten<br />
Sie jetzt das Projekt einmal<br />
ausführen. Standardmäßig<br />
startet es im Windows<br />
Phone 7 Emulator<br />
und zeigt ein blaues Hintergrundbild<br />
an. Mehr als<br />
das Spiel zu beenden,<br />
können Sie zum aktuellen<br />
Zeitpunkt <strong>alle</strong>rdings noch<br />
nicht tun.<br />
Nun definieren wir zunächst<br />
<strong>alle</strong> Konstanten<br />
und Variablen, die wir <strong>für</strong><br />
das Projekt brauchen (Listing<br />
1). Zunächst wird<br />
eine Texture background<br />
<strong>für</strong> die Hintergrundgrafik<br />
und eine Texture block <strong>für</strong><br />
62<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Entwicklung<br />
WP7-Entwicklung mit XNA<br />
die Blockgrafik definiert. Diese werden gleich<br />
in der LoadContent-Methode geladen und von<br />
der Render-Methode verwendet.<br />
Als Nächstes legen Sie das das 9x9 Pixel<br />
große Spielfeld fest, wobei jedes Feld nur<br />
zwei States einnehmen kann, entweder True<br />
<strong>für</strong> „Block ist hier“ oder False <strong>für</strong> den Zustand<br />
„leer“. Da ein WP7-XNA-Spiel standardmäßig<br />
mit 30 Frames pro Sekunde läuft<br />
und damit auch die Update-Methode so oft<br />
aufgerufen wird, ist dies auch <strong>für</strong> einen Tetris-Profi<br />
viel zu schnell. Das Spielfeld würde<br />
sich in zwei bis drei Sekunden füllen, ohne<br />
dass Zeit bleibt, die Blöcke zu verteilen.<br />
Daher wird UpdateTime benutzt, um nur viermal<br />
pro Sekunde den Block nach unten zu<br />
bewegen. Der Benutzer kann so immer noch<br />
30-mal pro Sekunde auf den Bildschirm tippen,<br />
um den aktuellen Block nach rechts<br />
oder links zu bewegen. Den bisherigen <strong>Code</strong><br />
unserer App zeigt Listing 1.<br />
Der Constructor der BlocksGame-Klasse<br />
kann so bleiben wie er ist und in der Load-<br />
Content-Methode müssen nur noch die beiden<br />
Texturen geladen werden (Listing 2). Die<br />
UnloadContent- und Initialize-Methoden<br />
werden ebenfalls in diesem einfachen Beispiel<br />
nicht benötigt und können ruhig entfernt<br />
werden. Damit sind wir auch schon fertig<br />
mit der Initialisierung und können direkt<br />
weitermachen mit der benötigten Spiellogik.<br />
Um sicherzustellen, dass noch <strong>alle</strong>s kompiliert<br />
und läuft, sollte man ruhig das Projekt<br />
nochmals starten (F5).<br />
Spiellogik<br />
Die erstellte BlocksGame-Klasse enthält bereits<br />
eine XNA-Methode zum Zeichnen namens<br />
Draw, auf die auch gleich eingegangen<br />
wird. Außerdem gibt es bereits eine Update-<br />
Methode, um die Spiellogik zu aktualisieren.<br />
In unserem Fall geht es also darum, den aktuellen<br />
Spielblock nach unten zu bewegen,<br />
Touch-Input abzufangen und letztendlich<br />
eine komplett gefüllte Zeile des Spielfeldes<br />
wieder zu löschen und <strong>alle</strong> darüberliegenden<br />
Zeilen herunterrücken zu lassen.<br />
Den <strong>Code</strong> da<strong>für</strong> zeigt Listing 3. In den ersten<br />
Zeilen geht es darum, dem User zu ermöglichen,<br />
das Spiel wieder zu beenden,<br />
was in XNA mithilfe der GamePad-Klasse und<br />
deren Buttons-Properties gelöst wird. Wer<br />
schon einmal in XNA, zum Beispiel <strong>für</strong> die<br />
Xbox 360, programmiert hat, dem wird dies<br />
sehr bekannt vorkommen. Windows Phone 7<br />
unterstützt <strong>alle</strong>rdings nur den Back-Button.<br />
Stattdessen benutzt man die TouchPanel-<br />
Klasse, um auf die Touch-Inputs zugreifen zu<br />
können. Dies geht entweder über die Touch-<br />
Listing 3: Spiellogik<br />
// Allows the game to exit<br />
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)<br />
this.Exit();<br />
// Move left right depending on where the user touched the screen<br />
foreach (TouchLocation touchPos in TouchPanel.GetState())<br />
{<br />
if (touchPos.State == TouchLocationState.Released)<br />
{<br />
// Move block left or right<br />
if (touchPos.Position.X < 350 &&<br />
currentBlockX > 0)<br />
{<br />
currentBlockX‐‐;<br />
}<br />
else if (touchPos.Position.X > 450 &&<br />
currentBlockX < FieldWidth ‐ 1)<br />
{<br />
currentBlockX++;<br />
}<br />
} // if<br />
} // foreach<br />
// Update current block and create a new one if we reached the ground<br />
nextUpdateTime += gameTime.ElapsedGameTime.TotalSeconds;<br />
// Only handle this every 0.25 seconds.<br />
if (nextUpdateTime > UpdateTime)<br />
{<br />
nextUpdateTime ‐= UpdateTime;<br />
// Check if we can move down<br />
if (currentBlockY < FieldHeight ‐ 1 &&<br />
field[currentBlockX, currentBlockY + 1] == false)<br />
{<br />
// Move block one down.<br />
currentBlockY++;<br />
}<br />
// Otherwise fix this block and create a new one at the top<br />
else<br />
{<br />
// Fix this block<br />
field[currentBlockX, currentBlockY] = true;<br />
// Quick check if the bottom line is now full<br />
int blocksInLine = 0;<br />
for (int x = 0; x < FieldWidth; x++)<br />
if (field[x, FieldHeight ‐ 1])<br />
blocksInLine++;<br />
if (blocksInLine == FieldWidth)<br />
{<br />
// Move everything one down (we have to do it upside down)!<br />
for (int y = FieldHeight ‐ 1; y > 0; y‐‐)<br />
for (int x = 0; x < FieldWidth; x++)<br />
field[x, y] = field[x, y ‐ 1];<br />
}<br />
// Create a new block at the top<br />
currentBlockX = 4;<br />
currentBlockY = 0;<br />
} // else<br />
} // if<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 63
Entwicklung<br />
WP7-Entwicklung mit XNA<br />
Listing 4: Drawing in der Draw-Methode<br />
// Clear background in black<br />
GraphicsDevice.Clear(Color.Black);<br />
Collection wie im gezeigten <strong>Code</strong> via Touch-<br />
Panel.GetState() oder über Gestures, wenn<br />
man diese <strong>für</strong> sein Spiel aktivieren will.<br />
Wenn der User auf die linke Bildhälfte<br />
klickt, soll der aktuelle Block nach links bewegt<br />
werden, berührt der Spieler die rechte<br />
Bildschirmhälfte (X Position größer als 450<br />
Pixel), dann soll sich der Block nach rechts<br />
bewegen. Um dies auch gleich wieder mit F5<br />
(Start Projekt Hotkey in Visual Studio) testen<br />
zu können, sollte man zunächst den aktuellen<br />
Block auf den Bildschirm zeichnen (siehe<br />
Abschnitt Drawing), um zu testen, ob <strong>alle</strong>s<br />
bisher richtig läuft. Den restlichen <strong>Code</strong><br />
braucht man da<strong>für</strong> noch nicht.<br />
Als Nächstes überprüfen Sie über die Update-Methode,<br />
ob eine Viertelsekunde vergangen<br />
ist. Wenn ja, dann wird der restliche<br />
<strong>Code</strong> ausgeführt. Wie erwähnt, dient dieser<br />
Workaround dazu, den Block nicht 30-mal<br />
pro Sekunden nach unten bewegen zu müssen.<br />
Kann der Block ein Feld nach unten bewegt<br />
werden, dann tut dies die App – fertig.<br />
spriteBatch.Begin();<br />
// Place background in center (800 pixels width ‐ 512 pixels) / 2 = 144<br />
spriteBatch.Draw(background, new Vector2(144, 0), Color.White);<br />
// Draw all field blocks<br />
for (int x = 0; x < FieldWidth; x++)<br />
for (int y = 0; y < FieldHeight; y++)<br />
if (field[x,y])<br />
spriteBatch.Draw(block, GetBlockRect(x, y), Color.DarkGray);<br />
// And finally also add the current block<br />
spriteBatch.Draw(block, GetBlockRect(currentBlockX, currentBlockY),<br />
Color.White);<br />
spriteBatch.End();<br />
Listing 5: Die Hilfsfunktion GetBlockRect<br />
/// <br />
/// Get block position and rectangle for the current block or a field block<br />
/// <br />
private Rectangle GetBlockRect(int x, int y)<br />
{<br />
// Place blocks in center (800 pixels width ‐ 480 pixels height) / 2<br />
// Note: Reduced to 477 to make 9*53 fit into 477 (480 would have spaces)<br />
return new Rectangle(162 + x * 477 / FieldWidth, y * 477 / FieldHeight,<br />
477 / FieldWidth, 477 / FieldHeight);<br />
} // GetBlockRect(x, y)<br />
Kompliziert wird es erst wieder, wenn wir<br />
ganz unten angelangt sind oder auf dem Zielfeld<br />
bereits ein Block existiert. Dann stoppt<br />
die App den aktuellen Block und brennt ihn<br />
in das Feld. Schlussendlich wird noch überprüft,<br />
ob wir eine komplette Zeile von links<br />
nach rechts gefüllt haben und wenn dies der<br />
Fall ist, wird die gesamte Zeile gelöscht und<br />
das Spielfeld darüber einen Block nach unten<br />
verschoben.<br />
Drawing<br />
Wir sind nun fast fertig, aber ohne Draw-<strong>Code</strong><br />
sehen wir noch nichts auf dem Bildschirm,<br />
nur nach wie vor den hellblauen Standard-<br />
Hintergrund des erstellten XNA-Projektes.<br />
Zunächst löschen wir den Hintergrund in<br />
Schwarz und dann zeichnen wir die Spielelemente<br />
auf die Zeichenfläche (Listing 4). In<br />
2D-XNA benutzt man dazu die SpriteBatch-<br />
Klasse, welche mehrere Draw-Calls zusammenfasst<br />
und <strong>für</strong> uns optimiert. Nachdem<br />
der spriteBatch per Begin gestartet wurde,<br />
erscheint das SpaceBackground-Hintergrundbild<br />
zentriert.<br />
Als Nächstes zeichnen wir <strong>alle</strong> 9x9-Feld-<br />
Blöcke (am Anfang noch leer). Sobald der<br />
Spieler jedoch ein paar Blöcke gefüllt hat,<br />
werden hier mehr und mehr Blöcke gezeichnet<br />
(Abbildung 1). Sobald eine Zeile voll ist<br />
und wieder gelöscht wurde, vereinfacht sich<br />
das Spielfeld natürlich wieder. Das Letzte<br />
was noch getan werden muss, ist den aktuellen<br />
beweglichen Block zu zeichnen. Beim fixierten<br />
Feld wurde die Farbe Color.DarkGray<br />
benutzt, beim aktuellen Block hingegen die<br />
Farbe Color.White. So kann man leicht auseinanderhalten,<br />
welcher Block momentan der<br />
Ideal <strong>für</strong> <strong>Ein</strong>steiger<br />
Das hier beschriebene Spiel ist in etwa ein bis<br />
zwei Stunden Programmierarbeit entstanden.<br />
Es wurde par<strong>alle</strong>l zu diesem Artikel geschrieben<br />
und es gibt nicht nur eine XNA-Version <strong>für</strong><br />
WP7, sondern auch eine Variante mit der Delta<br />
Engine, die auf <strong>alle</strong>n Plattformen läuft. Wichtig<br />
ist, dass man sich klare Ziele setzt und konstant<br />
testet, ob das gewünschte Ergebnis in die<br />
richtige Richtung geht. Bei uns im Team benutzen<br />
wir viele Tausende Unit-Tests, um kleine<br />
Teile zu testen, und selbst bei diesem kleinen<br />
Spiel macht es Sinn, die <strong>Ein</strong>zelteile separat zu<br />
testen (GetBlockRect, Spiellogik, Drawing, Current<br />
Block, Block Field, etc.). Alternativ kann<br />
man sich, auch wie in diesem Artikel beschrieben,<br />
langsam hocharbeiten und einzelne Probleme<br />
nacheinander lösen (erst Visual Studio<br />
installieren, dann XNA Projekt erstellen, dann<br />
testen, dann aktuellen Block hinzufügen, etc.).<br />
64<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Entwicklung<br />
WP7-Entwicklung mit XNA<br />
aktuelle ist, da <strong>alle</strong> Blöcke ja die gleiche Grafik<br />
benutzen. Die Blöcke selbst werden mit<br />
der einfachen Hilfsfunktion GetBlockRect gezeichnet,<br />
was den Draw <strong>Code</strong> etwas aufgeräumter<br />
gestaltet (siehe Listing 5).<br />
Testing<br />
Damit sind wir nun komplett fertig mit unserem<br />
kleinen Spiel. Mit Kommentaren und<br />
Leerzeilen kommt die Datei BlocksGame.cs<br />
auf etwa 170 Zeilen, der eigentliche Spielcode<br />
ist aber eher 100 Zeilen lang, das Ziel<br />
wurde also erreicht. So richtig Spaß macht<br />
das Ganze noch nicht, aber es funktioniert<br />
im Emulator und auf einem Windows-Phone-<br />
7-Gerät. Aufgrund der Größe des Projektes<br />
ist es nun sehr einfach, weitere Spielregeln<br />
und auch weitere Grafiken einzubinden. Die<br />
Ideen sind vielfältig, man könnte zum Beispiel<br />
das Spiel mehr zum XNATetris umbauen,<br />
Physik hinzufügen (siehe Links),<br />
oder einfach mal den Accelerometer des<br />
Phones benutzen, um das Spielfeld zu drehen<br />
oder auf weitere Ideen zu kommen.<br />
Die Delta Engine<br />
Der hier gezeigte <strong>Code</strong> läuft nur auf einem<br />
Windows Phone 7. Mit ein paar kleinen Änderungen<br />
lässt sich der <strong>Code</strong> aber auch auf<br />
Windows Vista/7 oder die Xbox 360 portieren,<br />
da XNA auf diesen drei Plattformen<br />
läuft. Dazu müsste man insbesondere in der<br />
Update-Methode auch ein Xbox 360 GamePad<br />
und die Maus und Tastatur in Windows unterstützen.<br />
Außerdem braucht man <strong>für</strong> jede<br />
Plattform ein eigenes Projekt und ein eigenes<br />
Content-Projekt, da diese verschiedene <strong>Ein</strong>stellungen<br />
haben.<br />
Da Windows Phone 7 aktuell noch nicht<br />
sehr weit verbreitet ist, spielt wohl jeder Entwickler<br />
mit dem Gedanken, seine Apps auch<br />
auf iOS und/oder Android zu übertragen.<br />
Doch bereits mit einer Portierung des hier<br />
beschriebenen sehr einfachen Spiels sieht es<br />
eher schlecht aus: Erfahrene Mac- und iOS-<br />
Entwickler könnten das Spiel entweder mit<br />
Cocoa oder in OpenGL ES nachprogrammieren.<br />
Wer aber hauptsächlich unter Windows<br />
programmiert, benötigt dazu erst einmal<br />
einen Mac, um X<strong>Code</strong> benutzen und Applikationen<br />
<strong>für</strong> das iPhone einstellen zu können.<br />
Außerdem ist der Aufwand insbesondere<br />
<strong>für</strong> Anfänger viel größer, um ein Spiel in<br />
X<strong>Code</strong> zu erstellen, da es von Apple keine<br />
Spiele-Libraries gibt. Auch bei Android muss<br />
man sich zunächst mit dem SDK und Davik/<br />
Java oder C++ vertraut machen. Egal, wie<br />
man es dreht und wendet: Man benötigt <strong>für</strong><br />
jede Plattform eine eigene Lösung.<br />
<strong>Ein</strong>en möglichen Ausweg stellt die Delta Engine<br />
der Spieleentwickler von MobileBits und<br />
exDream dar. Dabei handelt es sich um eine<br />
seit 2009 entwickelte Multiplattform-Spieleengine<br />
in .NET, über die sich Spiele unter<br />
Windows entwickeln und per Knopfdruck<br />
auf mehrere unterstützte Plattformen übersetzen<br />
lassen. Sicherlich gibt es andere Engines<br />
wie Unity oder Unreal 3, die ebenfalls<br />
erlauben Spiele, auf mehrere Plattformen zu<br />
entwickeln. Die Unreal 3 Engine ist aber eine<br />
sehr komplexe Engine <strong>für</strong> komplexe Spiele<br />
und damit komplett ungeeignet <strong>für</strong> schnelle<br />
und flexible mobile Spiele. Unity auf der anderen<br />
Seite ist zwar eine gute Lösung <strong>für</strong><br />
iPhone-Spiele, gibt dem Entwickler jedoch<br />
kaum Kontrolle über den <strong>Code</strong>, da man nur<br />
in Skripten und im Unity-Editor arbeitet. Beiden<br />
fehlt zudem der WP7-Support.<br />
Den kompletten <strong>Code</strong> des Blocks-Spiels in<br />
der Version der Delta Engine finden Sie auf<br />
der Smart-Developer-Homepage zum Download.<br />
Er reduziert sich gegenüber der WP7-<br />
Variante von 170 Zeilen auf 60 Zeilen (ohne<br />
Kommentare und Leerzeilen sogar unter 40<br />
Zeilen <strong>Code</strong>) und läuft quasi als Bonus auf<br />
<strong>alle</strong>n Plattformen, die die Delta Engine aktuell<br />
unterstützt: iOS, Android, Windows,<br />
Linux, Mac OS X, Xbox 360. Da die Delta Engine<br />
ebenfalls C# benutzt wie auch das Spiel<br />
in diesem Artikel, ist der <strong>Code</strong> sehr ähnlich.<br />
Im Prinzip besteht er aus ein paar Vereinfachungen,<br />
da die WP7-spezifischen <strong>Code</strong>-Zeilen<br />
(zum Beispiel <strong>Code</strong>, der von der Windows<br />
Phone 7 Auflösung 800 x 480 Pixel ausgeht)<br />
entfernt und an die Delta Engine übergeben<br />
werden (dort spielt die Auflösung<br />
keine Rolle).<br />
Die Delta Engine befindet sich momentan<br />
in einer geschlossenen Beta-Phase und wird<br />
im Juli 2011 zum ersten Mal veröffentlicht.<br />
Momentan arbeitet eine Handvoll ausgewählter<br />
Teams an sehr unterschiedlichen<br />
Projekten, der Kreis der Beta-Tester vergrößert<br />
sich aber jeden Monat. Bei Interesse<br />
können Sie sich auf der Projektseite [2] anmelden<br />
und natürlich noch viel mehr zum<br />
Projekt erfahren.<br />
Fazit<br />
Mit wenigen Zeilen <strong>Code</strong> lässt sich ein einfaches<br />
Spiel <strong>für</strong> Windows Phone 7 programmieren,<br />
wenn man dazu die von Microsoft<br />
bereitgestellten Tools benutzt. Wer hingegen<br />
beabsichtigt, <strong>für</strong> mehrere Plattformen Spiele<br />
zu entwickeln, der schaut sich am besten die<br />
aktuelle Beta-Version der Delta Engine an.<br />
Den <strong>Code</strong> zum Artikel finden Sie auch auf<br />
der Projektseite unter [2]. ● ● ●<br />
Der Autor<br />
Benjamin Nitschke arbeitet als<br />
CTO der Firma MobileBits GmbH<br />
und der exDream GmbH in Hannover.<br />
Nach vielen Jahren in der<br />
Spieleentwicklung auf den unterschiedlichsten<br />
Plattformen (PC,<br />
Xbox 360, Playstation 3, iPhone,<br />
Android, etc.) konzentriert er nun<br />
seine ganze Energie auf die Entwicklung<br />
der hauseigenen Open<br />
Source Multiplatform Delta Engine,<br />
um die Entwicklung von<br />
Spielen und Anwendungen auf<br />
<strong>alle</strong>n Plattformen einfacher zu<br />
machen.<br />
Infos<br />
[1] RSS-Reader <strong>für</strong> Windows<br />
Phone 7: Martin Straumann,<br />
„Windows Phone 7 App<br />
leicht gemacht“, Smart<br />
Developer 01/2011, S. 78.<br />
[2] Delta Engine und Source<br />
<strong>Code</strong> zu diesem Artikel:<br />
http:// deltaengine. net/<br />
examples. html<br />
[3] Visual Studio 2010:<br />
http:// www. microsoft. com/<br />
visualstudio/ en‐us/<br />
[4] Windows Phone 7<br />
Development Center:<br />
http:// create. msdn. com/<br />
[5] Windows Phone 7 Developer<br />
Guide:<br />
http:// msdn. microsoft. com/<br />
en‐us/ library/ gg490765. aspx<br />
[6] Video-Tutorial: Getting started<br />
with writing your first 2D<br />
XNA game:<br />
http:// create. msdn. com/<br />
en‐US/ education/ tutorial/<br />
2dgame/ getting_started<br />
[7] WP7-Spiele mit Physics::<br />
http:// www. codeproject. com/<br />
KB/ windows‐phone‐7/<br />
BounceBall. aspx<br />
[8] XNA-Tetris-Tutorial:<br />
http:// xnaprojects. exdream.<br />
com/ Default. aspx?<br />
Name=XNA%20Tetris<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 65
Entwicklung<br />
Bada: Face Recognition App<br />
Gesichtserkennung mit Bada<br />
Gesichter<br />
analysieren<br />
Die zwei Bada-Flaggschiffe von Samsung verfügen über eine<br />
Frontkamera. Um diese nutzen zu können, bietet das SDK entsprechende<br />
Schnittstellen an. Dieser Artikel zeigt, wie Sie diese<br />
zur Gesichtserkennung nutzen. Tobias Thiel<br />
Julien Tromeur, 123RF<br />
Samsung liefert<br />
Entwicklern<br />
über<br />
das Bada-<br />
SDK eine umfangreiche<br />
API, die unter anderem<br />
eine Klasse zur Gesichtserkennung<br />
enthält.<br />
Dieser Workshop<br />
stellt die API der Gesichtserkennung<br />
anhand<br />
einer kleinen App<br />
vor, die Sie<br />
Schritt <strong>für</strong><br />
Schritt nachimplementieren<br />
können.<br />
Ziel des<br />
Workshops<br />
ist es, Ihnen<br />
ein Gefühl<br />
<strong>für</strong> die Fähigkeiten<br />
der<br />
Gesichtserkennung<br />
zu vermitteln<br />
und Sie<br />
in die Lage zu<br />
versetzen, die<br />
Klasse der Gesichtserkennung<br />
in Ihren Apps verwenden<br />
zu können. Den<br />
Quellcode zum Beispiel finden<br />
Sie auf der Smart-Developer-Homepage<br />
[1]. Der Workshop<br />
setzt Kenntnisse in C++ voraus,<br />
Sie sollten das Bada-SDK 1.2.1 installiert<br />
haben und schon mal ein Bada-Projekt<br />
aufgesetzt haben.<br />
Die Klassen zur Gesichtserkennung gehören<br />
zum Namespace Osp::Uix. Die Klasse<br />
Osp::Uix::FaceDetection ermöglicht die Erfassung<br />
von Gesichtern in stehenden und bewegten<br />
Bildern. Das Ergebnis der Gesichtserfassung<br />
ist eine Liste von Instanzen der<br />
Klasse Osp::Graphics::Rectangle, die Aufschluss<br />
über die Lage und Größe der in<br />
einem Bild gefunden Gesichter gibt. Anders<br />
als zur Erfassung von Gesichtern ist zur<br />
Erkennung ein zusätzlicher qualitativer<br />
Faktor notwendig. Die Klasse<br />
Osp::Uix::FaceRecognizer erfasst Gesichter<br />
in stehenden und bewegten Bildern und berechnet<br />
<strong>für</strong> die gefundenen Gesichter je<br />
einen Merkmalsvektor. Merkmalsvektor und<br />
Lage eines Gesichtes fasst die Klasse<br />
Osp::Uix::FaceRecognitionInfo zusammen.<br />
Über den Inhalt der Merkmalsvektoren erhält<br />
man von Samsung leider keine Auskunft. Die<br />
hier beschriebene App benutzt deshalb die<br />
Methoden IsMatching() und MeasureSimilarity()<br />
von Osp::Uix::FaceRecognizer auf<br />
Osp::Uix::FaceRecognitionInfo Instanzen,<br />
um die Ähnlichkeit zwischen zwei Gesichtern<br />
zu vergleichen.<br />
Voraussetzungen<br />
Die wichtigsten Klassen der App sind die von<br />
Osp::Base::Runtime::Thread abgeleitete<br />
Klasse RecognizerThread zur eigentlichen<br />
Gesichtserkennung und die von<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Entwicklung<br />
Bada: Face Recognition App<br />
Osp::Ui::Form abgeleitete Klasse Form1, die<br />
die Ergebnisse anzeigt. Beide Klassen kommunizieren<br />
über einen Listener mit dem<br />
Namen RecognizerThreadListener. <strong>Ein</strong>e<br />
Hilfsklasse mit dem Namen MyFaceInfo enthält<br />
Zeiger auf einen Dateinamen und auf die<br />
Informationen eines darin gefundenen Gesichts<br />
in der entsprechenden Datei. Mithilfe<br />
dieser Klasse können Sie später die Ergebnisse<br />
wieder einer Datei zuordnen.<br />
Die App durchforstet das Dateisystem<br />
eines Gerätes oder des Simulators nach Bilddateien,<br />
sucht darin Gesichter und vergleicht<br />
deren Ähnlichkeit miteinander. Der Beispielcode<br />
wurde mit dem bada SDK 1.2.1 implementiert<br />
und sowohl im Simulator als auch<br />
auf einem Wave S8500 getestet. Um die App<br />
im Simulator testen zu können, müssen Sie<br />
Bilder in das Dateisystem des Simulators<br />
laden. Kopieren Sie die Bilder in den Pfad<br />
/bada//<br />
Model//Simulator/FS/Win32FS/<br />
Media/Images und passen Sie gegebenenfalls<br />
den Pfad an, der in RecognizerThread.h als<br />
Define IMAGE_DIRECTORY_PATH definiert<br />
wurde. Auf dem Gerät werden Bilder von<br />
Bada in den Ordnern /Media/Images/ und /<br />
Storage/Media/Images/ gespeichert. Verändern<br />
Sie den Define nicht, dann erwartet die<br />
App die zu analysierenden Bilder im Ordner<br />
/Media/Images/Fotos0001/.<br />
Bevor Sie mit der Implementierung der<br />
App beginnen, müssen Sie auf dem Bada<br />
Developer Portal [2] ein Manifest erstellen.<br />
Wählen Sie bei der Erstellung des Manifestes<br />
das Privileg IMAGE aus. Damit erlauben Sie<br />
der App, Bilder decodieren zu dürfen. Öffnen<br />
Sie das Bada-SDK und erstellen Sie mit dem<br />
heruntergeladenen Manifest ein neues Projekt.<br />
Um den <strong>Code</strong> so einfach wie möglich zu<br />
halten, legt die App wenig Wert auf einfache<br />
Bedienung oder ein besonders hübsches Aussehen.<br />
Interessante Informationen über die<br />
Gesichtserkennung gibt die App über<br />
AppLogDebug() aus. Sie lassen sich so in der<br />
Debug Perspective von Eclipse im Window<br />
Output betrachten.<br />
<strong>Code</strong> schreiben<br />
Beginnen Sie mit der Implementierung der<br />
Klasse RecognizerThread. Sie führt die Gesichtserkennung<br />
aus und kommuniziert die<br />
Ergebnisse über einen Listener zu der Klasse,<br />
die die UI implementiert. Konstruktor und<br />
Destruktor der Klasse bleiben leer. In der<br />
Init()-Methode zur Initialisierung einer Instanz<br />
der Klasse rufen Sie Construct() auf die<br />
Instanz auf und definieren den Thread als<br />
Worker-Thread. Implementieren Sie die Methode<br />
SetListener(), mit der Sie später den<br />
Listener der Instanz setzen, über den die Ereignisse<br />
der Gesichtserkennung kommuniziert<br />
werden.<br />
<strong>Ein</strong> Thread muss drei Methoden implementieren:<br />
OnStart() ruft Bada auf, wenn<br />
der Thread gestartet wird, OnStop(), wenn<br />
der Thread terminiert, und in Run() verrichtet<br />
ein Worker-Thread seine Arbeit. Listing 1<br />
zeigt die vollständige Definition von RecognizerThread.<br />
Die Arbeit des Threads ist im F<strong>alle</strong> des Beispielcodes<br />
in vier Phasen aufgeteilt. In der<br />
ersten Phase wird der FaceRecognizer analysiert<br />
und konfiguriert. In der zweiten Phase<br />
wird der Ordner /Media/Images/Fotos0001/<br />
nach Bilddateien durchsucht. In der dritten<br />
Abb. 1: Im ersten Schritt durchsucht<br />
die App sämtliche Bilder eines gegebenen<br />
Verzeichnisses und sucht<br />
darin nach Gesichtern.<br />
Zuverlässiges Wissen <strong>für</strong> Entwickler<br />
openbook<br />
online!<br />
Juli 2011<br />
im Handel!<br />
Java ist auch eine Insel<br />
Android 3<br />
Silverlight 4<br />
Das Praxisbuch ActionScript 3<br />
1.480 S., 9. Auflage 2011, mit DVD, 49,90 €<br />
www.GalileoComputing.de/2254<br />
550 S., 2011, mit DVD, 39,90 €<br />
www.GalileoComputing.de/2516<br />
1.178 S., 2010, mit DVD, 49,90 €<br />
www.GalileoComputing.de/2126<br />
702 S., 2010, mit DVD, 39,90 €<br />
www.GalileoDesign.de/2336<br />
» www.facebook.com/GalileoPressVerlag<br />
» www.twitter.com/Galileo_Press<br />
www.GalileoComputing.de/Programmierung
Entwicklung<br />
Bada: Face Recognition App<br />
Abb. 2: Das Ergebnis eines Durchlaufs<br />
der App.<br />
Listing 1: Die Klasse RecognizerThread<br />
Phase werden die gefundenen Dateien nach<br />
Gesichtern durchsucht. In der vierten Phase<br />
vergleicht die App die gefundenen Gesichter<br />
miteinander und ermittelt das Gesichtspaar,<br />
das sich am meisten ähnelt.<br />
Beginnen Sie mit der Implementierung der<br />
ersten Phase in Run(). Legen Sie eine Face-<br />
Recognizer-Instanz auf dem Stack an und<br />
rufen Sie Construct() darauf auf. Damit ist<br />
der FaceRecognizer vollständig initialisiert.<br />
Die Fähigkeiten der Gesichtserkennung unterscheiden<br />
sich je nach Gerät. Um die App<br />
portabel zu gestalten, sollten Sie die Fähigkeit<br />
analysieren und die FaceRecognizer-Instanz<br />
anschließend im <strong>Code</strong> konfigurieren.<br />
Mit der Methode GetRange() erhalten Sie den<br />
Wertebereich eines Parameters des Face-<br />
Recog nizers. Die Methode übernimmt vier<br />
Referenzen vom Typ long. Der erste Parameter<br />
identifiziert den Parameter, der von<br />
GetRange() ausgelesen werden soll. In die<br />
anderen drei Parameter schreibt die Methode<br />
den Minimal- und Maximalwert des Parameters<br />
und die Schrittgröße dazwischen.<br />
Übergeben Sie der Methode die Konstante<br />
FACERECOGNIZER_MAXNUMBER_IMAGE, erhalten<br />
Sie die maximale Anzahl von Gesichtern zurück,<br />
die der FaceRecognizer pro Bild erkennen<br />
kann. Listing 2 zeigt die Implementierung<br />
des Tests. Verwenden Sie die Konstante<br />
FACERECOGNIZER_SCALE_IMAGE, erhalten Sie<br />
class RecognizerThread : public Osp::Base::Runtime::Thread {<br />
public:<br />
RecognizerThread();<br />
virtual ~RecognizerThread();<br />
void Init();<br />
void SetRecognizerThreadListener(RecognizerThreadListener &listener);<br />
virtual Osp::Base::Object * Run(void);<br />
virtual bool OnStart(void);<br />
virtual void OnStop(void);<br />
private:<br />
RecognizerThreadListener *_pListener;<br />
};<br />
Angaben über die Größe der Gesichter, die<br />
der FaceRecognizer erkennen kann. Dieser<br />
Wert verhält sich relativ zur Bildgröße.<br />
Grundsätzlich gilt: Je kleiner der Wert, desto<br />
kleiner die Gesichter, die erkannt werden<br />
können, aber desto höher ist der Rechenaufwand.<br />
GetSupportedFormListN() gibt einen<br />
Zeiger auf eine alloziierte Liste der unterstützten<br />
Bildformate zurück. Die Ergebnisse<br />
der Analyse können Sie mit AppLogDebug()<br />
auf den Output-View der IDE schreiben.<br />
Im nächsten Schritt sucht der Recognizer-<br />
Thread die Bilddateien zusammen. Legen Sie<br />
dazu eine ArrayList an, in der Sie die Ergebnisse<br />
der Suche ablegen. Die Klasse<br />
Osp::Io::Directory bildet einen Ordner ab,<br />
auf dessen Inhalt Sie mit einem<br />
Osp::Io::DirEnumerator iterieren können.<br />
Legen Sie ein Directory an und übergeben Sie<br />
im Construct()-Aufruf das Define mit dem<br />
Dateipfad zu den Bildern. ReadN() erzeugt<br />
einen DirEnumerator. Er gibt beim Aufruf von<br />
GetCurrentDirEntry() eine Instanz der<br />
Klasse Osp::Io::DirEntry zurück. Testen Sie<br />
mit IsDirectory(), ob es sich bei dem aktuell<br />
betrachteten Ordnereintrag um einen Ordner<br />
handelt. Ist dies nicht der Fall, erhalten<br />
Sie mit GetName() den Dateinamen des Ordnereintrages,<br />
den Sie dann auf das Suffix untersuchen.<br />
Handelt es sich um ein JPEG,<br />
fügen Sie den vollwertigen Pfad der Liste mit<br />
Dateipfaden hinzu. Hat MoveNext den gesamten<br />
Ordner durchlaufen und <strong>alle</strong> Ordnereinträge<br />
getestet, kommunizieren Sie über den<br />
Listener, wie viele Bilddateien gefunden wurden.<br />
Zur Implementierung des Listeners<br />
legen Sie nun die neue Klasse Recognizer‐<br />
ThreadListener an und definieren die virtuelle<br />
Methode OnFinishGrabbingFiles(), die<br />
die Anzahl der gefundenen Bilddateien als<br />
Parameter übernimmt. Listing 3 zeigt <strong>alle</strong><br />
Methoden des Listeners.<br />
Analysieren und zuordnen<br />
In der dritten Phase soll der Recognizer-<br />
Thread die gefundenen Bilddateien analysieren.<br />
Zur Speicherung der gefundenen Gesichter<br />
legen Sie eine weitere ArrayList an. Implementieren<br />
Sie eine Schleife zum Iterieren<br />
Listing 2: Anzahl der Gesichter festlegen<br />
long minValue, maxValue, steppingDelta, defaultValue;<br />
result r = faceRecognizer.GetRange(FACERECOGNIZER_MAXNUMBER_IMAGE, minValue, maxValue, steppingDelta, defaultValue);<br />
if (E_SUCCESS == r) {<br />
AppLogDebug("range of maximal number of faces per image:[%d .. %d] delta:%d default:%d", minValue, maxValue, steppingDelta,<br />
defaultValue);<br />
faceRecognizer.SetProperty(FACERECOGNIZER_MAXNUMBER_IMAGE, maxValue);<br />
}<br />
68<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Entwicklung<br />
Bada: Face Recognition App<br />
über die Liste von Dateipfaden. Zur Decodierung<br />
einer Bilddatei benötigen Sie zunächst<br />
eine Image-Instanz. Legen Sie die Image-Instanz<br />
an und rufen Sie Construct() und<br />
DecodeN() auf dieser Instanz auf. DecodeN()<br />
übergeben Sie den Dateipfad und das Format,<br />
in das die Datei codiert werden soll. Das<br />
gewählte Format muss eines der vom Face-<br />
Recognizer unterstützten Formate sein.<br />
Nun rufen Sie auf der zu Beginn von Run()<br />
angelegten FaceRecognizer-Instanz Extract‐<br />
FaceInfoFromStillImageN() auf und übergeben<br />
die von DecodeN() erzeugte Bitmap.<br />
ExtractFaceInfoFromStillImageN() führt die<br />
Gesichtserkennung durch und liefert im Erfolgsfall<br />
eine Liste mit FaceRecognitionInfo-<br />
Instanzen zurück (Listing 4). Erweitern Sie<br />
den Listener um die Methode OnFinishedAnalyzingFile(),<br />
die als Parameter den Index des<br />
Bildes in der Liste, die Länge der Liste und die<br />
Anzahl der gefundenen Gesichter übernimmt.<br />
Um der UI das Ergebnis mitzuteilen, rufen Sie<br />
die Methode auf dem Listener auf.<br />
Um die gefundenen Gesichter später wieder<br />
der Bilddatei zuordnen zu können, implementieren<br />
Sie die Hilfsklasse MyFaceInfo<br />
mit einem Zeiger auf eine FaceRecognition‐<br />
Info-Instanz und auf einen String als Attribut.<br />
Für jede FaceRecognitionInfo-Instanz<br />
erzeugen Sie eine MyFaceInfo-Instanz, speichern<br />
die FaceRecognitionInfo und den dazugehörigen<br />
Dateinamen darin ab und hängen<br />
die MyFaceInfo-Instanz an die ArrayList.<br />
Der Listener erhält die Methode OnFinished‐<br />
AnalyzingFiles(), um der UI die Summe der<br />
gefundenen Gesichter mitzuteilen.<br />
Resultate vergleichen<br />
In der vierten Phase des Threads vergleicht<br />
die App die gefundenen Gesichter miteinander.<br />
<strong>Ein</strong>e Schleife durchläuft dazu die Liste<br />
mit MyFaceInfo-Instanzen. Für jede Instanz<br />
aus der Liste durchläuft die App eine weitere,<br />
innere Schleife, in der die MyFaceInfo-Instanz<br />
mit <strong>alle</strong>n folgenden MyFaceInfo-Instanzen der<br />
Liste verglichen werden.<br />
Die Methode MeasureSimilarity() gibt<br />
einen Wert zwischen 0 und 100 und IsMatching()<br />
einen boolschen Wert zurück. Die<br />
Rückgabewerte schreiben Sie mit AppLogDebug()<br />
in die Output-View. Listing 5 zeigt, wie<br />
der Vergleich stattfindet. Für die Ausgabe auf<br />
der UI erweitern Sie den Listener um die Methode<br />
OnFoundMostSimilarFaces(), die einen<br />
Zeiger auf die beiden MyFaceInfo-Instanzen<br />
übernimmt.<br />
Ergibt ein Vergleich zweier Gesichter eine<br />
höhere Ähnlichkeit als <strong>alle</strong> vorhergehenden<br />
Vergleiche, dann speichert die App den Wert<br />
und die Indizes auf die MyFaceInfo-Instanzen<br />
innerhalb der Schleife in Variablen und<br />
informiert den Listener mit dem Aufruf von<br />
OnFoundMostSimilarFaces() über das Ereignis.<br />
Um die UI über das Ende des Vergleiches<br />
zu informieren, erweitern Sie den Listener<br />
um eine letzte Methode. OnFinishedComparingFaces()<br />
und rufen die Methode auf den<br />
Listener auf. Damit endet die Methode Run()<br />
und der Thread terminiert.<br />
Damit ist die Implementierung des Threads<br />
und seiner Kommunikationsschnittstelle,<br />
dem Listener, abgeschlossen und Sie können<br />
mit der Implementierung der UI beginnen.<br />
Die grafische Oberfläche<br />
Die GUI besteht aus der Klasse Form1, die<br />
von Osp::Ui::Controls::Form und RecognizerThreadListener<br />
erbt. Zunächst definieren<br />
Listing 3: Der Listener im Detail<br />
class RecognizerThreadListener {<br />
public:<br />
virtual void OnFinishedGrabbingFiles(int numberOfFiles) = 0;<br />
virtual void OnFinishedAnalyzingFile(int index, int total, int numberOfFaces)<br />
= 0;<br />
virtual void OnFinishedAnalyzingFiles(int numberOfFaces) = 0;<br />
virtual void OnFinishedComparingFace(int index, int total, int maxSimilarity)<br />
= 0;<br />
virtual void OnFoundMostSimilarFaces(MyFaceInfo *pCurrentMyFaceInfo,<br />
MyFaceInfo *pOtherMyFaceInfo) = 0;<br />
virtual void OnFinishedComparingFaces(int similarity) = 0;<br />
};<br />
Listing 4: Die Gesichtserkennung<br />
// Bild dekodieren<br />
Image *image = new Image();<br />
image‐>Construct();<br />
Bitmap* pBitmap = image‐>DecodeN(*pFilename, BITMAP_PIXEL_FORMAT_ARGB8888);<br />
delete image, image = null;<br />
result r = GetLastResult();<br />
if (IsFailed(r)) {<br />
AppLogDebug("failed decoding image %ls", pFilename‐>GetPointer());<br />
return null;<br />
}<br />
// Gesichter aus dem Bild extrahieren<br />
IList *pFaces = null;<br />
pFaces = faceRecognizer.ExtractFaceInfoFromStillImageN(*pBitmap);<br />
r = GetLastResult();<br />
if (IsFailed(r)) {<br />
delete image, image = null;<br />
AppLogDebug("failed decoding image %ls", pFilename‐>GetPointer());<br />
continue;<br />
}<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 69
Entwicklung<br />
Bada: Face Recognition App<br />
Abb. 3: Das Ergebnis eines Durchlaufs<br />
mit sehr ähnlichen Fotos.<br />
Der Autor<br />
Tobias Thiel arbeitet als Mobile<br />
Developer bei Enough Software<br />
und ist zudem Samsung Developer<br />
Advocate.<br />
Infos<br />
[1] Quellcode zum Download:<br />
http:// www. <strong>smart</strong>‐<strong>developer</strong>.<br />
de/ Magazin/ <strong>Code</strong>‐Beispiele<br />
[2] Bada-Entwicklerportal:<br />
http:// <strong>developer</strong>. bada. com/<br />
Listing 5: Vergleich zweier Gesichter<br />
Sie das Layout /Res/480x800/IDF_FORM1.xml,<br />
indem Sie ein Label und Progress in der Form<br />
platzieren. Lassen Sie in der Mitte der Form<br />
genügend Platz <strong>für</strong> die Darstellung der Bilder<br />
übrig. In der Klasse Form1 legen Sie Attribute<br />
<strong>für</strong> die beiden Control-Elemente – dem Label<br />
und dem Progress – an.<br />
Um den Thread zur Gesichtserkennung beenden<br />
zu können, legen Sie als weiteres Attribut<br />
einen Zeiger auf einen Recognizer<br />
Thread an. Während des Vergleiches der Gesichter<br />
zeigt die UI die beiden Bilder an, die<br />
die aktuell ähnlichsten Gesichter enthalten,<br />
und versieht die Gesichter mit einem Rahmen.<br />
Da<strong>für</strong> benötigt die App zwei<br />
Osp::Graphics::Bitmaps und zwei<br />
Osp::Graphics::Rectangles.<br />
In Initialize() laden Sie das Layout aus<br />
der XML-Datei, und in OnInitialize() weisen<br />
Sie die Controls aus dem Layout den<br />
Attributen zu und starten den Thread. Da<strong>für</strong><br />
allozieren Sie eine neue Instanz der Klasse<br />
RecognizerThread, initialisieren die Instanz,<br />
übergeben ihr einen Zeiger auf die Form1-<br />
Instanz selbst als Listener und starten den<br />
Thread mit dem Aufruf der Methode Start().<br />
Im Destruktor und in OnTerminate() sollte<br />
der Thread gestoppt werden, damit sich die<br />
App ordentlich terminieren lässt.<br />
In den Methoden des RecognizerThread<br />
Listeners werden die Ergebnisse des Threads<br />
visualisiert, dabei schreibt OnFinishedGrabbingFiles()<br />
die Anzahl der gefundenen Dateien<br />
in das Label und definiert diese als<br />
Obergrenze des Progress. Hat der FaceRecognizer<br />
eine Datei analysiert, dann schreibt die<br />
App die Anzahl von OnFinishedAnalyzing<br />
File() in das Label und aktualisiert den Progress.<br />
Nach Abschluss der Analysen wird die<br />
Anzahl der gefundenen Gesichter von<br />
OnFinishedAnalyzingFiles in das Label geschrieben,<br />
der Wert als Obergrenze des Progress<br />
verwendet und der Progress zurückgesetzt.<br />
Über OnFinishedComparingFace() wird<br />
// Aehnlichkeit berechnen<br />
MyFaceInfo *pOtherMyFaceInfo = (MyFaceInfo *)myFaceInfoArrayList.GetAt(j);<br />
int similarity = faceRecognizer.MeasureSimilarity(*(pCurrentMyFaceInfo‐>pFaceR<br />
ecognitionInfo), *(pOtherMyFaceInfo‐>pFaceRecognitionInfo));<br />
if (faceRecognizer.IsMatching(*(pCurrentMyFaceInfo‐>pFaceRecognitionInfo),<br />
*(pOtherMyFaceInfo‐>pFaceRecognitionInfo))) {<br />
AppLogDebug("match: %ls %ls", pCurrentMyFaceInfo‐>pFilename‐>GetPointer(),<br />
pOtherMyFaceInfo‐>pFilename‐>GetPointer());<br />
}<br />
AppLogDebug("similarity %d%%: %ls %ls", similarity,<br />
pCurrentMyFaceInfo‐>pFilename‐>GetPointer(),<br />
pOtherMyFaceInfo‐>pFilename‐>GetPointer());<br />
der Progress aktualisiert und der Status in<br />
das Label geschrieben.<br />
Findet die App bei dem Vergleich zwei Gesichter,<br />
die sich ähnlicher als <strong>alle</strong> zuvor sind,<br />
ruft sie den Thread OnFoundMostSimilar<br />
Faces() auf. Diese Methode lädt die Bilder, in<br />
dem die Gesichter gefunden wurden und<br />
speichert die Rechtecke, die die gefundenen<br />
Gesichter umrahmen. Nach dem Vergleich<br />
<strong>alle</strong>r Bilder entfernt OnFinishedComparing<br />
Faces() den Progress aus der Form und gibt<br />
den Wert der maximalen Ähnlichkeit aus<br />
(Abbildung 3). Um das Label und den Progress<br />
nach jedem Ereignis neu zu zeichnen,<br />
rufen Sie am Ende jeder Methode Draw() und<br />
Show() auf die Form auf.<br />
Um die Bilder der maximal ähnlichen Gesichter<br />
anzuzeigen, implementieren Sie die<br />
Methode OnDraw(). Darin holen Sie sich mit<br />
GetCanvasN() ein Osp::Graphics::Canvas.<br />
Nachdem Sie Vorder- und Hintergrundfarbe<br />
des Canvas definiert haben, berechnen Sie<br />
Rechtecke und zeichnen mit DrawBitmap()<br />
die Bitmaps in die Rechtecke. Am Ende der<br />
Methode muss die Anwendung das Canvas<br />
löschen und den Speicher wieder freigeben.<br />
Der Beispielcode implementiert mit GetRectangleOfRectangleInRectangleN()<br />
eine Methode,<br />
die einen Pointer auf eine Rectangle-<br />
Instanz zurückgibt, die die maximale Ausdehnung<br />
eines Rechtecks in einem umrahmenden<br />
Rechtecks unter Beibehaltung des<br />
Seitenverhältnisses berechnet. Damit lassen<br />
sich die Bitmaps bequem platzieren.<br />
Soweit die Implementierung. Bauen Sie<br />
das Projekt und führen Sie es im Debug-<br />
Mode aus. Achten Sie vor der Ausführung<br />
darauf, dass in dem definierten Verzeichnis<br />
die Bilder mit Gesichtern liegen, die Sie analysieren<br />
wollen. Im Output-View erfahren Sie<br />
Details über den FaceRecognizer.<br />
Bei der Ausführung der App wird schnell<br />
klar: Der FaceRecognizer erkennt nicht <strong>alle</strong><br />
Gesichter, die Sie mit bloßem Auge sofort erkennen.<br />
Die Personen müssen dazu gut ausgeleuchtet<br />
und aufrecht der Kamera zugewandt<br />
sein. Tatsächliche Paare <strong>für</strong> IsMatching()<br />
sind sehr schwer zu generieren.<br />
Fazit<br />
Mit den Klassen FaceRecognizer und FaceDetector<br />
ermöglicht Bada die Umsetzung einer<br />
Gesichtserkennung, ohne dazu externe Bibliotheken<br />
einbinden zu müssen. Ob die zwei<br />
Klassen leistungsfähig genug sind, um Ihre<br />
Ideen umsetzen zu können, müssen Sie <strong>alle</strong>rdings<br />
selbst entscheiden. Zur Auswertung<br />
der üblichen Porträt-Aufnahmen genügen sie<br />
aber in jedem Fall. ● ● ●<br />
70<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
JETZT<br />
MiT dVd!<br />
MAGAZIN<br />
SondErAkTion<br />
Testen Sie jetzt<br />
3 Ausgaben<br />
<strong>für</strong> 3 Euro!<br />
Jetzt schnell bestellen:<br />
• Telefon 07131 / 2707 274<br />
• Fax 07131 / 2707 78 601<br />
• E-Mail: abo@linux-magazin.de<br />
• Web: www.linux-magazin.de/probeabo<br />
Mit großem Gewinnspiel<br />
(Infos unter: www.linux-magazin.de/probeabo)<br />
GEwinnEn SiE... <strong>Ein</strong>En MulTiMEdiA-PlAyEr MiT doPPElTEM<br />
dVB-T-TunEr Von wyPlAyEr iM wErT Von 300,- Euro (uVP)<br />
<strong>Ein</strong>sendeschluss ist der 15.06.2011
Entwicklung<br />
Blackberry PlayBook<br />
Mit ActionScript <strong>für</strong> das BlackBerry-Playbook programmieren<br />
PlayBook-<br />
Action!<br />
Seit April ist das PlayBook von RIM verfügbar. Dass bereits beim Launch<br />
des Tablets zahlreiche Apps da<strong>für</strong> existieren, hängt unter anderem mit<br />
der Programmiersprache ActionScript zusammen. Dieser Artikel stellt<br />
die Sprache vor und zeigt, wie Sie damit entwickeln. Tam Hanna<br />
Auf dem Papier beherrscht das Play-<br />
Book genannte Tablet von Research<br />
in Motion so ziemlich <strong>alle</strong>s:<br />
Android, J2ME und native Anwendungen.<br />
Da die Hardware jedoch noch sehr<br />
jung ist, muss sich in der Praxis erst zeigen,<br />
wie sich die einzelnen Möglichkeiten entwickeln.<br />
Dennoch können PlayBook-Anwender<br />
bereits jetzt auf sehr viele Apps zurückgreifen.<br />
Diese Anwendungen sind in ActionScript<br />
geschrieben – einer Programmiersprache von<br />
Adobe, die bis dato nur im Bereich der Flash-<br />
Applets verbreitet ist.<br />
ActionScript<br />
ActionScript orientiert sich lose an Java. Die<br />
Syntax lässt sich ohne Probleme „en suite“<br />
erlernen. Auch wenn ActionScript von Haus<br />
aus nicht typgebunden ist, kann die Sprache<br />
auch mit fix typisierten Variablen umgehen.<br />
Wer eine Anwendung <strong>für</strong> das PlayBook mit<br />
ActionScript realisieren will, muss dazu auf<br />
das Adobe AIR-SDK [1] zurückgreifen. Als<br />
IDE empfiehlt Research in Motion die Verwendung<br />
von Flash Builder 4.5 [2]. Zusätzlich<br />
benötigen Sie das Tablet-OS-SDK und<br />
einen Simulator. Beides finden registrierte<br />
Entwickler unter [3]. Dieser Artikel basiert<br />
auf dem Tablet-OS-SDK in Version 0.9.4, aktuell<br />
ist Version 1.0.1 (Stand: Mai 2011).<br />
Die Installation des SDK erledigen Sie<br />
unter Windows per Doppelklick auf den Inst<strong>alle</strong>r.<br />
Für Linux und Mac OS X bietet RIM<br />
ebenfalls entsprechende Pakete an, die sich<br />
problemlos einrichten lassen. Achten Sie<br />
unter Windows darauf, den Installationspfad<br />
<strong>für</strong> den Flash Builder auf C:\Programme\<br />
Adobe\Adobe Flash Builder Burrito anzupassen.<br />
Der Inst<strong>alle</strong>r extrahiert ein CD-Image<br />
an einen beliebigen, frei festlegbaren Ort.<br />
blackberry.com<br />
Abb. 1: Das PlayBook-OS wird von VMWare nicht<br />
direkt unterstützt.<br />
72<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Entwicklung<br />
Blackberry PlayBook<br />
Abb. 2: Hardwarebeschleunigte Virtualisierung ist zwingend erforderlich.<br />
Ohne die Grafikbeschleunigung wird der Emulator quälend langsam.<br />
Abb. 3: Laut Dokumentation sind 1024 MB RAM erforderlich, wobei VMWare<br />
nur den Speicher belegt, den es braucht. Planen Sie ca. 600 MB RAM ein.<br />
Im nächsten Schritt installieren Sie den Emulator.<br />
Er basiert auf dem VMWare-Player [4]<br />
und ist ebenfalls <strong>für</strong> Windows, Mac OS X<br />
und Linux verfügbar. Mit einem Klick auf<br />
File | Create a new Virtual Machine starten<br />
Sie den VM-Erstellungswizard. Als Installationsmedium<br />
geben Sie die soeben erhaltene<br />
.iso-Datei des SDK an.<br />
Die Nachfrage nach der OS-Version beantworten<br />
Sie mit Other, die Unterversion ebenfalls<br />
mit Other. Den Name der VM können<br />
Sie frei wählen. 8 GByte Festplattenspeicher<br />
sind ausreichend, als Speicherausbau benötigt<br />
die virtuelle Maschine 1024 MByte. Die<br />
Grafikbeschleunigung müssen Sie im Reiter<br />
Display über die Checkbox Accelerate 3D<br />
Graphics aktivieren.<br />
Nach einem Klick auf Finish starten Sie die<br />
VM und nach einigen Sekunden erscheint<br />
das PlayBook-Logo auf dem Bildschirm.<br />
Tablet OS<br />
Nach 5 bis 10 Minuten wird der PlayBook-<br />
Ladebildschirm verschwinden und stattdessen<br />
der Emulator-Homescreen erscheinen.<br />
Passiert dies nicht, starten Sie die VM über<br />
das Menü neu.<br />
Abb. 4: Schalten Sie auf dem PlayBook den Development<br />
Mode ein.<br />
Das User Interface des PlayBooks wird durch<br />
sogenannte Gestures gesteuert. <strong>Ein</strong>e Wischgeste<br />
von oben in den Bildschirm aktiviert<br />
das Menü der Anwendung, während ein<br />
Wisch von unten nach oben den Taskmanager<br />
öffnet und den User in den Homescreen<br />
zurückbringt.<br />
Die Fehlersuche auf PlayBook-Anwendungen<br />
erfolgt über das Debugging der TCP/IP-<br />
Verbindung. Dazu müssen Sie den Development<br />
Mode des VMWare-Players aktivieren<br />
(Abbildung 4). Sie finden ihn im Menü des<br />
Programmstarters in der Rubrik Development<br />
Mode. Danach sehen Sie neben der Uhr ein<br />
Hammer-Symbol. <strong>Ein</strong> Klick darauf zeigt die<br />
IP- Adresse des PlayBooks an.<br />
Erste Schritte<br />
Nun ist es an der Zeit, <strong>Code</strong> <strong>für</strong> das PlayBook<br />
zu schreiben. Dazu starten Sie den Flash<br />
Builder und wählen Neu | Neues Action<br />
Script-Mobilprojekt. Als Projektname benutzt<br />
dieser Artikel MS1, als SDK die Standardeinstellung.<br />
Bei den Zielplattformen verzichten<br />
wir auf Android und legen das Projekt an.<br />
Eventuelle Warnungen bezüglich des<br />
Bezeichners können Sie ignorieren.<br />
Im ersten Schritt gilt es nun, die Datei<br />
MS1.as wie in Listing 1 gezeigt anzupassen.<br />
ActionScript-Projekte werden durch ein<br />
Start objekt initiiert. Unser Startobjekt heißt<br />
MS1. Sein Konstruktor MS1() wird also beim<br />
Programmstart aufgerufen, um das Programm<br />
anzuwerfen. Die Klasse selbst sitzt<br />
im Default-Paket. Das wird durch das Schlüsselwort<br />
package angegeben. Die darauffolgenden<br />
Import-Aufrufe inkludieren verwendete<br />
Module. Die Zeile mit [] spezifiziert das<br />
grundlegende Aussehen der Anwendung auf<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 73
Entwicklung<br />
Blackberry PlayBook<br />
Schlüsselwort var eingeleitet.<br />
Danach folgt<br />
der Name, durch einen<br />
Doppelpunkt getrennt,<br />
sodann der (optionale)<br />
Typ. Im Konstruktor<br />
definieren Sie mit folgender<br />
Zeile eine neue<br />
Variable:<br />
var<br />
helloButton:LabelButton<br />
= new LabelButton();<br />
Abb. 5: Für Eclipse-Programmierer ein alter Bekannter: die Verwaltung der<br />
Debuggerkonfigurationen.<br />
dem PlayBook. Die eigentliche Klassendefinition<br />
erfolgt über den <strong>Ein</strong>trag public class<br />
MS1 extends Sprite. Die Klasse MS1 ist öffentlich<br />
und wird von der Basisklasse Sprite abgeleitet.<br />
<strong>Ein</strong> Sprite ist im Prinzip bloß ein<br />
Formular – mehr brauchen wir nicht.<br />
Die Variablendefinition in ActionScript unterscheidet<br />
sich leicht von anderen Skriptsprachen.<br />
Die Definition wird durch das<br />
Sie können der Variablen<br />
an dieser Stelle<br />
auch gleich einen Wert<br />
zuweisen, falls das<br />
nötig sein sollte.<br />
Unsere Routine erstellt<br />
drei Objekte vom<br />
Typ LabelButton,<br />
TextFormat und<br />
Button, die wir durch den Befehl addChild<br />
zum Formular hinzufügen. Klicken Sie dazu<br />
im Eclipse-Fenster auf das grüne Käfer-Symbol.<br />
Daraufhin erscheint der Verwaltungsbildschirm.<br />
Durch Klick auf Configure legen<br />
Sie hier eine neue Gerätetest-Konfiguration<br />
an. Im daraufhin aufpoppenden Dialog<br />
geben Sie die IP-Adresse des PlayBooks und<br />
Listing 1: MS1.as<br />
package<br />
{<br />
var myFormat:TextFormat = new TextFormat();<br />
import flash.display.Sprite;<br />
import flash.events.MouseEvent;<br />
import flash.text.TextField;<br />
import flash.text.TextFormat;<br />
import qnx.ui.buttons.Button;<br />
import qnx.ui.buttons.LabelButton;<br />
myFormat.color = 0xAA0000;<br />
myFormat.size = 24;<br />
myFormat.italic = true;<br />
myFormat.align = "center";<br />
var text:TextField = new TextField();<br />
text.text = "Close";<br />
text.setTextFormat(myFormat);<br />
// The following metadata specifies the size and properties<br />
of the canvas that<br />
// this application should occupy on the BlackBerry PlayBook<br />
screen.<br />
[SWF(width="1024", height="600", backgroundColor="#cccccc",<br />
frameRate="30")]<br />
public class MS1 extends Sprite<br />
{<br />
public function MS1()<br />
{<br />
var helloButton:LabelButton = new LabelButton();<br />
helloButton.label = "Hello World!";<br />
var closeButton:Button = new Button();<br />
closeButton.addChild(text);<br />
closeButton.addEventListener(MouseEvent.CLICK, closeWindow);<br />
closeButton.x = (stage.stageWidth ‐ closeButton.width)/2;<br />
closeButton.y = helloButton.y ‐ helloButton.height;<br />
addChild(helloButton);<br />
addChild(closeButton);<br />
stage.nativeWindow.visible = true;<br />
}<br />
private function closeWindow(event:MouseEvent):void{<br />
stage.nativeWindow.close();<br />
helloButton.x = (stage.stageWidth ‐ helloButton.width)/2;<br />
}<br />
}<br />
helloButton.y = (stage.stageHeight ‐ helloButton.height)/2;<br />
}<br />
74<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Entwicklung<br />
Blackberry PlayBook<br />
das Gerätepasswort ein. Dazu muss die VM<br />
aktiv sein und Sie müssen wie oben beschrieben<br />
den Entwicklermodus aktiviert<br />
haben. Danach starten Sie die Anwendung<br />
durch einen Klick auf Debug. Abbildung 7<br />
zeigt das Resultat im Emulator.<br />
Buttons<br />
Die hier gezeigte App enthält zwei Buttons.<br />
Der LabelButton enthält seinen Text selbst,<br />
während der Button zusätzlich ein TextField<br />
mit Textinformationen erfordert. Und das<br />
TextField wiederum braucht noch ein<br />
TextFormat, um Eigenschaften wie Farben<br />
etc. festzulegen. Zudem gibt es einen einfachen<br />
Close-Button (ab Zeile 30), der mit<br />
einem Eventhandler verdrahtet wird:<br />
closeButton.addEventListener(MouseEvent.CLICK,<br />
closeWindow);<br />
Der Eventhandler selbst kommt in der Form<br />
einer Funktion:<br />
Abb. 6: Hier wird das PlayBook bzw. der Emulator mit<br />
der IDE bekannt gemacht.<br />
Es empfiehlt sich allgemein, Formulare in<br />
einzelne Methoden auszulagern. Die im<br />
Kons truktor auffindbare Erstellung des Formulars<br />
wandert in eine eigene Methode, die<br />
aus dem Konstruktor aufgerufen wird:<br />
public function MS1()<br />
{<br />
baseForm();<br />
private function closeWindow(event:MouseEvent)<br />
stage.nativeWindow.visible = true;<br />
:void<br />
{<br />
}<br />
stage.nativeWindow.close();<br />
Interessant ist dabei die Definition des Rückgabewertes<br />
– er wird ähnlich einer Variablen<br />
festgelegt.<br />
Formulare in Strukturen<br />
Unser Hello-World-Button tut bisher nicht<br />
viel. Er soll nun ein neues Formular öffnen.<br />
Allerdings gibt es, wie schon weiter oben<br />
festgestellt, keine Formulare in ActionScript.<br />
Stattdessen gibt es die Stages.<br />
Stages lassen sich übereinanderstapeln<br />
oder wiederverwenden. In unserem Beispiel<br />
recyceln wir die bereits bestehende Stage.<br />
Dazu brauchen wir folgende Funktion, die<br />
übrigens immer wieder in Beispielen von<br />
RIM vorkommt:<br />
}<br />
Im nächsten Schritt erstellen wir eine zweite<br />
Funktion namens greetingForm(), die unser<br />
Formular mit dem freundlichen Gruß an den<br />
Enduser anzeigt. Die Syntax zeigt Listing 2,<br />
wobei sich fehlende import-Deklarationen<br />
per IntelliSense ergänzen lassen.<br />
Im nächsten Schritt muss der helloWorld-<br />
Button mit der greetingForm-Funktion verdrahtet<br />
werden. Dies erfolgt über folgende<br />
Zeile in der baseForm()-Funktion:<br />
helloButton.addEventListener(MouseEvent.CLICK,<br />
greetingForm);<br />
private function clearWindow():void<br />
{<br />
while(numChildren > 0)<br />
{<br />
removeChildAt(0);<br />
}<br />
}<br />
Die while-Schleife läuft, solange das Formular<br />
Kinder enthält. Mit removeChildAt(0)<br />
wird das unterste Kind entfernt. Danach<br />
beginnt der Prozess wieder von oben.<br />
Abb. 7: Hello World in ActionScript im PlayBook-Emulator.<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 75
Entwicklung<br />
Blackberry PlayBook<br />
Eventhandler müssen einen Parameter annehmen.<br />
Aus diesem Grund passen Sie die<br />
Definition der Formular-Erstellungsmethode<br />
folgendermaßen an:<br />
{<br />
}<br />
clearWindow();<br />
baseForm();<br />
private function greetingForm(event:MouseEvent<br />
):void<br />
Damit ist das Programm <strong>für</strong> einen ersten Test<br />
bereit. Das Resultat eines Klicks auf den<br />
HelloWorld-Button zeigt Abbildung 7.<br />
Beim genaueren Betrachten des Bildes erschließt<br />
sich der Sinn dieses Formularaufbaus:<br />
Anstatt die Steuerelemente direkt ins<br />
Formular einzubauen, packen wir sie in<br />
einen Container. Container sind spezielle<br />
Steuerelemente, die die enthaltenen Steuerelemente<br />
(oder Subcontainer) ordnen. Würden<br />
wir unserem Container ein zweites Label<br />
hinzufügen, erschiene es unter dem ersten.<br />
Wie im ersten Formular gezeigt, kann man<br />
die Koordinaten der einzelnen Steuerelemente<br />
auch von Hand berechnen und festlegen.<br />
Layouts machen die Arbeit jedoch wesentlich<br />
leichter.<br />
Gebt mir ein Menü<br />
Damit bleibt nur mehr ein Problem: Wie<br />
kommt der User wieder aus dem greeting‐<br />
Form zum baseForm zurück? Die beste Lösung<br />
da<strong>für</strong> wäre das Verwerten des am Anfang des<br />
Artikels besprochenen Menü-Strokes über<br />
einen Eventhandler:<br />
QNXApplication.qnxApplication.addEventListener<br />
(QNXApplicationEvent.SWIPE_DOWN, swipeDown);<br />
Die Handler-Routine der Anwendung sieht in<br />
unserem Fall so aus:<br />
private function swipeDown(event:QNXApplicatio<br />
nEvent):void<br />
In der Praxis könnte man hier beispielsweise<br />
eine Reihe von Knöpfen (in der Form eines<br />
neuen Formulars oder zweiten Sprites) anzeigen,<br />
um komplexere Layouts zu realisieren.<br />
Je nach Zweck lohnt es sich dabei, die<br />
Steuerelemente als Klassenvariablen zu deklarieren.<br />
Wie das in ActionScript aussieht,<br />
zeigt Listing 3.<br />
<strong>Ein</strong> eigenes Icon<br />
Bis dato zeigte unsere Anwendung ein langweiliges<br />
Defaulticon im Programmstarter an,<br />
das soll sich nun ändern. Unser zukünftiges<br />
Symbol muss im PNG-Format vorliegen und<br />
sollte nach Möglichkeit mindestens 72 x 72<br />
Pixel groß sein.<br />
Sie binden das Symbol über die Importieren-Funktion<br />
ein, die Sie durch einen Rechtsklick<br />
auf das Projekt finden. Das Minibild<br />
landet danach im Ordner src. Zusätzlich<br />
braucht das Programm eine .xml-Datei, die<br />
das Icon mit dem Desktop des Playbooks bekannt<br />
macht. Dazu wählen Sie per Rechtsklick<br />
den src-Ordner aus und erstellen eine<br />
neue Datei namens blackberry‐tablet.xml.<br />
Den Inhalt zeigt Listing 4. Bei einem transparenten<br />
PNG setzen Sie den <strong>Ein</strong>trag transparent<br />
auf true. Zusätzlich passen Sie in der<br />
Datei app.xml die Informationen zur benutzten<br />
Grafik an und legen entsprechende Copyright-Hinweise<br />
an. In der Grundeinstellung<br />
fehlen diese Informationen.<br />
Listing 2: Das Greeting-Formular<br />
<strong>Ein</strong>gepackte Dateien<br />
Große ActionScript-Objekte werden schnell<br />
unübersichtlich. Daher ist es sinnvoll, sie in<br />
mehrere Dateien aufzuteilen. Um die einzelprivate<br />
function greetingForm():void<br />
myFormat.align = "center";<br />
{<br />
clearWindow();<br />
var text:TextField = new<br />
TextField();<br />
text.text = "Hallo Welt";<br />
var myContainer:Container=new<br />
Container;<br />
myContainer.flow=ContainerFlow.<br />
VERTICAL;<br />
var myFormat:TextFormat = new<br />
TextFormat();<br />
text.setTextFormat(myFormat);<br />
text.width=800;<br />
myContainer.addChild(text);<br />
myContainer.setSize(stage.<br />
stageWidth,stage.stageHeight*0.7);<br />
myFormat.color = 0xAA0000;<br />
myFormat.size = 60;<br />
myFormat.italic = true;<br />
}<br />
addChild(myContainer);<br />
76<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Entwicklung<br />
Blackberry PlayBook<br />
nen Aufgaben im Hauptprojekt zu integrieren,<br />
fügt man in der Hauptdatei den folgenden<br />
include-Befehl ein:<br />
include "BinaryClockDraw.as"<br />
Er weist den Compiler an, die angegebene<br />
Datei beim Erstellen der Hauptdatei an die<br />
Stelle der include-Anweisung zu setzen.<br />
Möchten Sie der Anwendung einzelne Dateien<br />
mitgeben, dann bietet sich eine leicht<br />
erweiterte Variante über [Embed] an. Die Dateien<br />
müssen sich auch hier im src-Ordner<br />
befinden. Danach erstellen Sie eine Ressourcenklasse<br />
nach folgendem Schema:<br />
Abb. 8: Icon und andere Ressourcendateien werden<br />
Teil des Projektes.<br />
public final class Resource<br />
{<br />
[Embed (source="level0.txt",<br />
mimeType="application/octet‐stream") ]<br />
public static const level0:Class;<br />
[Embed (source="level1.txt",<br />
mimeType="application/octet‐stream") ]<br />
public static const level1:Class;<br />
Die [Embed]-Statements weisen den Compiler<br />
an, die von ihnen angezeigte Datei in die<br />
ActionScript-Datei zu packen. Die darauffolgende<br />
Variablendeklaration dient dem Zugriff.<br />
Das Lesen der Datei erfolgt nach folgendem<br />
Schema new String(new Resource.<br />
level0());.<br />
Listing 3: Klassenvariablen<br />
public class AIRHelloWorld extends Sprite<br />
{<br />
public var state:String = "clock";<br />
private var myContainer:Container;<br />
private var myTimer:Timer=new<br />
Timer(500,0);<br />
...<br />
Die App World<br />
Damit ist die Anwendung nun reif <strong>für</strong> den<br />
Weg in die App World. Bevor Sie sie dort jedoch<br />
hochladen können, muss sie signiert<br />
sein. Dazu benötigen Sie einen <strong>Code</strong> Signing<br />
Key [5] und müssen damit Ihre Entwickler-<br />
Workstation bei RIM in Kanada registrieren.<br />
Danach gilt dieser Rechner als vertrauenswürdig<br />
und kann Anwendungen signieren.<br />
Haben Sie die E-Mail mit den Key-Dateien<br />
erhalten, öffnen Sie den <strong>Ein</strong>stellungen-Dialog<br />
von Flash Builder und wechseln in die Rubrik<br />
ActionScript-Erstellungsverpackung |<br />
BlackBerry Tablet OS. Hier wählen Sie Signing<br />
und quittieren die Fehlermeldung. Darauf<br />
folgt ein Klick auf Create Certificate, um<br />
ein Entwicklerzertifikat zu erstellen. Das<br />
Publisher-Feld muss 1:1 mit den unter [5]<br />
eingegebenen und in der .xml-Datei befindlichen<br />
Angaben übereinstimmen. Dann klicken<br />
Sie im Feld RIM Certificate auf Register,<br />
um das soeben erstellte Entwicklerzertifikat<br />
unter Verwendung der .csj-Datei bei RIM zu<br />
registrieren.<br />
Ab diesem Zeitpunkt lässt sich die App per<br />
Klick auf Projekt | Releasebuild exportieren<br />
verpacken. Vergessen Sie nicht, Enable digital<br />
signing zu aktivieren. Nach dem Upload<br />
der .bar-Datei zur BlackBerry App World<br />
muss diese noch ein paar Qualitätstests<br />
durchlaufen, bevor sie dann von RIM freigegeben<br />
wird.<br />
Fazit<br />
Auch wenn das Entwickeln <strong>für</strong> das PlayBook<br />
einige Stolpersteine bietet, eignet sich<br />
ActionScript ideal <strong>für</strong> den schnellen <strong>Ein</strong>stieg.<br />
Hunderte Anwendungen sind bereits im<br />
Store, Hunderte mehr werden kurz nach dem<br />
Launch folgen. Das in einigen Monaten folgende<br />
native PlayBook-SDK wird den Markt<br />
abermals aufmischen und auch <strong>für</strong> das nötige<br />
„Play“-Erlebnis sorgen. <br />
● ● ●<br />
Listing 4: blackberry-tablet.xml<br />
<br />
<br />
none<br />
false<br />
<br />
Tamoggemon Limited<br />
core.internet<br />
<br />
icon‐bicatab.png<br />
<br />
<br />
Infos<br />
[1] Adobe AIR-SDK<br />
http:// opensource. adobe.<br />
com/ wiki/ display/ flexsdk/<br />
Flex+SDK<br />
[2] Flash Builder:<br />
https:// www. adobe. com/<br />
cfusion/ entitlement/ index.<br />
cfm? loc=en%5Fus&<br />
e=labs%5Fflashbuilder%<br />
5Fburrito<br />
[3] SDK und Simulator:<br />
http:// us. blackberry. com/<br />
<strong>developer</strong>s/ tablet/ adobe. jsp<br />
[4] VMWare-Player:<br />
http:// downloads. vmware.<br />
com/ d/ info/ desktop_down<br />
loads/ vmware_player/ 3_0<br />
[5] Signierschlüssel beantragen:<br />
https:// www. blackberry. com/<br />
SignedKeys/<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 77
Entwicklung<br />
WebOS Ares Framework<br />
WebOS-Entwicklung mit Ares<br />
Palm-Zeit<br />
Die Übernahme von Palm durch HP und die Ankündigung von webOS<br />
3.0 hat das Interesse an der Entwicklung <strong>für</strong> webOS wieder aufleben<br />
lassen. Glücklicherweise ist es sehr einfach, webOS-Anwendungen mithilfe<br />
der Entwicklungsumgebung Ares von Palm in einem Webbrowser<br />
zu errichten. Roy Sutton<br />
palm.com<br />
Mojo und JS<br />
Mojo beinhaltet das JavaScript-<br />
Framework „Prototype“ <strong>für</strong><br />
DOM-Verarbeitung. Sie können<br />
auch jQuery hinzufügen oder<br />
andere plattformübergreifende<br />
Frameworks verwenden, wie<br />
zum Beispiel Jo.<br />
Ares von Palm ist eine integrierte<br />
Entwicklungsumgebung (IDE) <strong>für</strong><br />
den Webbrowser und dient <strong>für</strong><br />
den Bau von Anwendungen, die<br />
unter webOS laufen. Ares unterstützt die Gestaltung<br />
von Benutzeroberflächen (UI) per<br />
Drag&Drop, verfügt über eine integrierte Fehlersuche<br />
(Debugging) und sogar über eine integrierte<br />
Versionskontrolle. Es baut auf Bespin,<br />
einem quelloffenen Editor, auf, der ausgesprochen<br />
<strong>für</strong> die Arbeit im Webbrowser<br />
entwickelt wurde.<br />
Die ersten Schritte mit Ares sind sehr einfach:<br />
Legen Sie zuerst ein Konto beim Palm<br />
Developer Center [1] an. Sie brauchen noch<br />
einen geeigneten Browser (Firefox 3.6+, Safari<br />
4.0+ oder Chrome). Wenn Sie Ihre Anwendungen<br />
auch testen und die Vorteile der<br />
integrierten Fehlersuche in vollem Umfang<br />
nutzen wollen, laden Sie das Palm webOS<br />
Software-Entwicklerkit (SDK) <strong>für</strong> Ihr Betriebssystem<br />
von der Ares Website [2] herunter<br />
(erreichbar <strong>für</strong> Windows, MacOS und<br />
Linux) und installieren es. Ares stellt das Gerüst<br />
<strong>für</strong> die Anwendung bereit und sorgt <strong>für</strong><br />
den Zugriff auf Komponenten und Funktionen<br />
des Mojo-Frameworks. Mojo enthält vorgefertigte<br />
Widgets und Dienste <strong>für</strong> webOS.<br />
Dieser Artikel zeigt Ihnen an einer Beispielanwendung,<br />
wie Sie Schritt <strong>für</strong> Schritt in<br />
Ares vorgehen. Die Beispiel-App verwendet<br />
dabei die API von Yahoo! Local Search [3],<br />
um Kinos in der Umgebung eines bestimmten<br />
Standortes zu ermitteln. Der Anwender<br />
kann dazu eine beliebige Postleitzahl eingeben<br />
oder per GPS den aktuellen Standort bestimmen.<br />
Daraufhin zeigt die App die Ergebnisse<br />
in einem Google-Map-Widget, wozu<br />
die Google-Maps-API [4] verwendet wird.<br />
Der Text spricht auch einige wichtige Konzepte<br />
von webOS an, wie zum Beispiel Ereignisse<br />
und Termine, Dienste, AJAX und CSS-<br />
Design. Wenn Sie das Endergebnis gleich ansehen<br />
wollen, laden Sie einfach den Quellcode<br />
der Beispiel-App als .ZIP-gepackte Datei<br />
von der Smart-Developer-Homepage herunter<br />
[5] und fügen Sie diesen per Drag&Drop<br />
direkt Ares hinzu.<br />
Erste Schritte<br />
Als Erstes legen Sie das neue Projekt an. Klicken<br />
Sie dazu links oben auf New und wählen<br />
Sie Application aus. Geben Sie der neuen<br />
Anwendung den Namen Movie. Daraufhin<br />
wird die Struktur <strong>für</strong> Ihr neues Projekt automatisch<br />
erstellt und eine leere Arbeitsfläche<br />
erscheint. Das Mojo-Framework verwendet<br />
die MVC- (Model, View, Controller) Architekturmuster<br />
<strong>für</strong> Anwendungsentwicklung.<br />
Jedes Bildschirmbild verfügt sowohl über<br />
einen Controller (einen sogenannten Assistenten)<br />
als auch über ein View, das den<br />
HTML-<strong>Code</strong> <strong>für</strong> das Rendern der Ansicht<br />
(scene) enthält. Der Artikel konzentriert sich<br />
auf die Arbeit mit visuellen Komponenten,<br />
Sie können den HTML-<strong>Code</strong> aber auch manuell<br />
bearbeiten.<br />
78<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Entwicklung<br />
WebOS Ares Framework<br />
Ares hat drei Hauptbereiche (Abbildung 1):<br />
Auf der linken Seite befindet sich die Kombinationspalette<br />
und der Projekt-Browser, auf<br />
der rechten Seite das <strong>Ein</strong>stellungspanel und<br />
in der Mitte das Design- und <strong>Code</strong>-Panel. Für<br />
die Gestaltung der Benutzeroberfläche Ihrer<br />
eigenen Anwendung ziehen Sie die entsprechenden<br />
Widgets einfach von der linken Palette<br />
in das Design-Feld in der Mitte hinüber.<br />
Nun legen Sie die Inputelemente an. Achten<br />
Sie darauf, dass die Ansicht einfach und<br />
übersichtlich bleibt. Fügen Sie zuerst ein<br />
PageHeader-Widget (kein Header-Widget) in<br />
Ihre noch leere Arbeitsfläche ein. Ändern Sie<br />
dann den Titel im <strong>Ein</strong>stellungspanel auf<br />
Kinofinder. Als Nächstes fügen Sie ein Group-<br />
Widget ein, das <strong>für</strong> die logische Gruppierung<br />
des später hinzufügenden <strong>Ein</strong>gabefeldes <strong>für</strong><br />
die Postleitzahl und die Such-Schaltfläche<br />
nötig sein wird. Die Group-Taste finden Sie im<br />
Layout-Bereich der Palette. Wenn Sie diesen<br />
Bereich nicht sehen, klicken Sie einfach auf<br />
die Palette und scrollen weiter hinunter.<br />
Nachdem Sie das Group-Widget hinzugefügt<br />
haben, ändern Sie sein Label auf „Postleitzahl“.<br />
Ziehen Sie anschließend ein Text-<br />
Field in die Group-Box und ändern Sie den<br />
hintText in „Postleitzahl eingeben“. Stellen<br />
Sie die maxLength auf 5, den modifierState<br />
auf Num-Lock und schließlich nennen Sie es<br />
ZIP<strong>Code</strong>. Der hintText wird immer dann sichtbar,<br />
wenn das TextField leer ist. Wenn Sie<br />
den modifierState auf Num-Lock stellen,<br />
lassen sich Zahlen einfacher eingeben.<br />
Als Nächstes vergrößern Sie die Group-<br />
Box: Markieren Sie dazu diese Box und ziehen<br />
Sie die untere Kante etwas hinunter.<br />
Fügen Sie nun einen ActivityButton in die<br />
zweite Zeile der Group-Box ein. Ändern Sie<br />
Abb. 1: Die Ares-Entwicklungsumgebung – eine leere Arbeitsfläche wartet auf Ihr Design.<br />
das Label auf Suchen und benennen Sie es in<br />
ZIPSearchButton um. Passen Sie die Größe<br />
der Group-Box an, wenn der ActivityButton<br />
nicht vollständig sichtbar ist.<br />
Die letzte sichtbare Komponente wird ein<br />
anderer ActivityButton sein, den Sie einfach<br />
unter der Group-Box platzieren. Mit dieser<br />
Taste wird der Anwender die Suche anhand<br />
der GPS-Koordinaten seines Standortes starten.<br />
Nennen Sie die Taste GPSSearchButton<br />
und geben Sie Am Standort Suchen als Label<br />
ein (Abbildung 2).<br />
Ares enthält eine Reihe von nicht visuellen<br />
Komponenten, <strong>für</strong> verschiedene Dienste, darunter<br />
die beiden, die Sie nun benötigen: Die<br />
WebServices-Komponente finden Sie im<br />
WebServices-Bereich der Palette und die GPS-<br />
Komponente unter Sensors. Ziehen Sie diese<br />
beiden in Ihre Arbeitsfläche. Diese Dienste<br />
werden dann in dem Bereich Non-Visual<br />
Components unterhalb Ihrer Arbeitsfläche<br />
eingeblendet (Abbildung 3).<br />
Abb. 2: Der Hauptbildschirm des Kinofinders mit richtig<br />
angeordneten Widgets.<br />
Abb. 3: Der Arbeitsbereich <strong>für</strong> nicht visuelle Komponenten,<br />
mit den Diensten GPS und WebServices.<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 79
Entwicklung<br />
WebOS Ares Framework<br />
Tipp<br />
Unter dem Reiter View im linken<br />
Panel sehen Sie die Liste all der<br />
Widgets, die Sie in der aktuellen<br />
Ansicht Ihrer Anwendung benutzen.<br />
Wählen Sie eines hier<br />
aus, können Sie die <strong>Ein</strong>stellungen<br />
da<strong>für</strong> im rechten <strong>Ein</strong>stellungspanel<br />
ändern.<br />
Listing 1: webServices<br />
query: "movie theater",<br />
output: "json",<br />
results: "10",<br />
appid: "YahooDemo"<br />
Listing 2: ZIPSearchButtonTap<br />
var zip = this.$.ZIP<strong>Code</strong>.fetchModelProperty("value");<br />
this.$.webService1.parameters.zip = zip;<br />
this.$.webService1.execute();<br />
Listing 3: webService1Success<br />
Listing 4: list1 itemHtml<br />
Markieren Sie die GPS-Komponente und deaktivieren<br />
Sie das Kontrollkästchen neben<br />
subscribe unter Settings; Sie wollen nämlich<br />
immer nur eine einmalige Feststellung des<br />
Standortes per GPS. Um den Akku zu schonen,<br />
setzen Sie maximumAge auf 300 (Sekunden),<br />
sodass zwischengespeicherte Werte<br />
aus dem GPS auch genutzt werden, falls sie<br />
nicht zu alt sind. Für eine relativ schnelle<br />
Reaktion setzen Sie GPS‐accuracy und<br />
response Time auf 2. Brauchen Sie weitere<br />
Details zu diesen <strong>Ein</strong>stellungen, dann klicken<br />
Sie einfach auf den Reiter Help rechts oben<br />
und Sie erhalten mehr Informationen über<br />
die GPS-Komponente von Ares.<br />
Als Nächstes markieren Sie die Web-<br />
Services-Komponente und geben die URL<br />
http:// local. yahooapis. com/ LocalSearch Ser<br />
vice/ V3/ localSearch in der entsprechenden<br />
Zeile ein. Stellen Sie dann handleAs auf JSON<br />
um. Zum Schluss klicken Sie auf das Editor-<br />
Symbol neben parameters und fügen den<br />
<strong>Code</strong> aus Listing 1 zwischen den geschweiften<br />
Klammern ein. Ersetzen Sie optimalerweise<br />
„YahooDemo“ im appid-<strong>Ein</strong>trag gegen<br />
Ihren eigenen Yahoo!-Entwicklerschlüssel,<br />
wenn Sie einen haben.<br />
if(inResponse.ResultSet && (inResponse.ResultSet.totalResultsReturned > 0))<br />
{<br />
}<br />
else<br />
{<br />
}<br />
this.controller.stageController.pushScene("results", inResponse.ResultSet);<br />
Mojo.Controller.errorDialog("Keine treffenden Ergebnisse gefunden!");<br />
<br />
#{Title}<br />
#{Address}<br />
#{Phone}<br />
Distance: #{Distance} mi.<br />
<br />
Listing 5: ResultsAssistant Setup Function<br />
this.$.list1.model.items = this.results.Result;<br />
this.controller.modelChanged(this.$.list1.model);<br />
<strong>Ein</strong> bisschen programmieren<br />
Die Benutzeroberfläche ist damit fertig. So<br />
richtig programmiert haben wir aber bislang<br />
noch gar nichts. Im folgenden Verlauf fügen<br />
Sie zuerst <strong>Code</strong> hinzu, der auf Benutzereingaben<br />
reagiert, dann all die nötigen Widgets.<br />
In Ares fügen Sie Ereignis-Listener einfach<br />
aus der IDE hinzu.<br />
Klicken Sie zuerst auf die Taste Suchen im<br />
Postleitzahl-Bereich Ihrer Anwendung (ZIP-<br />
SearchButton), wählen Sie dann den Reiter<br />
Events im rechten <strong>Ein</strong>stellungspanel aus.<br />
Unter dem Reiter Events klicken Sie auf<br />
das Editor-Symbol neben ontap. Daraufhin<br />
erstellt Ares eine neue Funktion namens ZIP‐<br />
SearchButtonTap und wechselt die Ansicht<br />
zum <strong>Code</strong>-Editor um. Für die Suche wird<br />
Yahoo! Local Search die Postleitzahl brauchen,<br />
die der Benutzer eintippt. Fügen Sie<br />
deshalb den <strong>Code</strong> von Listing 2 in die Funktion<br />
ZIPSearchButtonTap ein.<br />
Wahrscheinlich ist Ihnen die Textfolge:<br />
this.$.ZIP<strong>Code</strong> im <strong>Code</strong> gleich aufgef<strong>alle</strong>n.<br />
Ares erstellt die Widgets automatisch <strong>für</strong> Sie<br />
und verwendet die Abkürzung this.$ <strong>für</strong><br />
den Zugriff auf diese mit Namen. In der ersten<br />
Zeile folgt darauf die von Ihnen festgesetzte<br />
Benennung <strong>für</strong> das TextField, in diesem<br />
Fall „ZIP<strong>Code</strong>“. In den folgenden Zeilen<br />
steht webService1, die von Ares zugewiesene<br />
Benennung <strong>für</strong> das WebService-Widget, das<br />
Sie vor Kurzem hinzugefügt haben.<br />
Interessant ist hier auch noch der fetch‐<br />
ModelProperty-Call. Es gibt viele Widgets,<br />
deren <strong>Ein</strong>stellungen und Status auch zur<br />
Laufzeit erreichbar und veränderbar sind.<br />
Das Widget TextFields besitzt auch ein<br />
value-Attribut, das den Text enthält, den der<br />
Benutzer eintippt.<br />
Erfolg- und Misserfolg<br />
Die letzten beiden Zeilen in der Funktion<br />
sind <strong>für</strong> die Ajax-Anfrage wichtig: Die erste<br />
enthält die erforderlichen Parameter dazu<br />
und die zweite startet die Ajax-Anfrage<br />
selbst, die gleich ausgeführt wird. Zum Abrufen<br />
der Ergebnisse der Web-Anfrage richten<br />
Sie einige Erfolg- und Misserfolg-Handler <strong>für</strong><br />
das WebRequest -Objekt ein.<br />
Betätigen Sie die Design/<strong>Code</strong>-Taste im<br />
oberen Balken des <strong>Code</strong>-Editors, um wieder<br />
in die visuelle Arbeitsfläche zu wechseln, wo<br />
Sie nun die Erfolg- und Misserfolg-Handler<br />
einrichten. Wählen Sie dann das webServices1-Widget<br />
aus. Dieses Widget finden Sie<br />
unterhalb der Ansicht im Non-Visual Components-Bereich.<br />
Anschließend klicken Sie auf<br />
das Editor-Symbol neben dem onSuccess-<br />
Rückruf (callback), unter dem Reiter Events<br />
80<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Entwicklung<br />
WebOS Ares Framework<br />
Listing 6: Zusatz <strong>für</strong> index.html<br />
<br />
im <strong>Ein</strong>stellungspanel. Fügen Sie dann den<br />
<strong>Code</strong> von Listing 3 im <strong>Code</strong>-Editor ein.<br />
Der onSuccess-Ruf von WebService übergibt<br />
drei Parameter; einer davon ist inResponse,<br />
das Ergebnis <strong>für</strong> die Ajax-Anfrage. Yahoo!<br />
schickt die Antwort in einem JavaScript-Objekt<br />
mit einer ResultSet-Property zurück. Innerhalb<br />
von ResultSet befindet sich eine<br />
Property namens totalResultsReturned, die<br />
die Anzahl der Antworten enthält. Bevor Sie<br />
fortfahren, überzeugen Sie sich mit einem<br />
Test, ob Sie tatsächlich einige Antworten erhalten<br />
haben.<br />
Beachten Sie hier auch den pushScene-Call.<br />
Dieser <strong>Code</strong> fordert den Stage-Controller auf,<br />
eine neue Ansicht (scene) der Reihe der Ansichten<br />
hinzuzufügen, die die aktuelle aktive<br />
Ansicht abwählt. Diese neue Ansicht werden<br />
Sie anschließend noch einrichten. Im F<strong>alle</strong><br />
eines Fehlers wird ein Fehlerdialog eingeblendet,<br />
der den Benutzer benachrichtigt.<br />
Ebenfalls unter dem Reiter Events finden<br />
Sie die Zeile onFailure, klicken Sie auf das<br />
Editor-Symbol und fügen Sie im Editor den<br />
einfachen Fehlerdialog hinzu:<br />
Mojo.Controller.errorDialog("Kann nicht mit<br />
dem Server kommunizieren!");<br />
<strong>Ein</strong>e neue Ansicht<br />
Sobald Sie eine Antwort vom WebService erhielten,<br />
sorgen Sie im nächsten Schritt da<strong>für</strong>,<br />
dass die Ergebnisse <strong>für</strong> den Benutzer auch<br />
angezeigt werden. Dazu richten Sie eine<br />
neue Ansicht (scene) mit einem Stadtplan<br />
und mit einer Reihe von Widgets ein, die die<br />
Ergebnisse enthalten.<br />
Klicken Sie auf das Dropdown-Menü New<br />
links oben in Ares und wählen Sie Scene aus.<br />
Benennen Sie die neue Ansicht „results“ und<br />
bestätigen Sie mit OK. Daraufhin erscheint<br />
eine neue leere Arbeitsfläche, worin Sie dann<br />
das neue Bildschirmbild zusammenstellen.<br />
Wählen Sie zunächst das Map-Widget in der<br />
Palette aus und ziehen Sie dieses in die leere<br />
Designfläche hinüber. Unter Settings | Geometry<br />
stellen Sie die Sichthöhe auf 200 ein,<br />
damit das gesamte Areal übersichtlich erscheint.<br />
Um auch die Details richtig zu erkennen,<br />
stellen Sie die Vergrößerung (zoom<br />
level) auf 12 und entfernen Sie das Häkchen<br />
bei showMarker.<br />
Anschließend fügen Sie ein Scroller-Widget<br />
vom Layout-Bereich der Palette unterhalb<br />
des Stadtplans ein und stellen seine Höhe<br />
unter Settings auf 100%. Fügen Sie dann<br />
zum Scroller noch ein List-Widget hinzu. Mit<br />
dem Scroller kann der Benutzer dann die<br />
Liste glatt weiterblättern, ohne dabei den<br />
Stadtplan aus der Bildfläche zu schieben.<br />
In den nächsten Schritten editieren Sie das<br />
Aussehen der Liste, errichten Sie die Vorlage<br />
und machen Sie die nötigen <strong>Ein</strong>stellungen<br />
hier<strong>für</strong>. Entfernen Sie zuerst die Häkchen<br />
neben swipeToDelete und reorderable unter<br />
Settings | Items. Diese Optionen deaktivieren<br />
Sie, da der Benutzer die Liste eigentlich nicht<br />
zu ändern braucht. Klicken Sie dann auf das<br />
Editor-Symbol neben itemHtml. Löschen Sie<br />
den kompletten Inhalt im Dialog und fügen<br />
Sie hier den <strong>Code</strong> von Listing 4 ein.<br />
Das Mojo-Framework verfügt über ein Vorlagensystem.<br />
Verwenden Sie dieses, um die<br />
Daten in der Liste anzuzeigen, die als Antwort<br />
auf die Web-Anfrage eingetroffen sind.<br />
Ordnen Sie einfach eine Liste von Kinos dem<br />
Listenmodell zu und die Liste wird automatisch<br />
aufgefüllt, wenn Sie ihr die Information<br />
über neue Daten mitteilen.<br />
Sie müssen auch <strong>für</strong> das Weiterleiten der<br />
Informationen sorgen, die auf die Web-Anfrage<br />
eingetroffen sind. Wechseln Sie zuerst<br />
Listing 7: gps1Succes<br />
if(inResponse.error<strong>Code</strong> == 0)<br />
{<br />
this.latitude = inResponse.latitude;<br />
this.longitude = inResponse.longitude;<br />
delete this.$.webService1.parameters.zip;<br />
this.$.webService1.parameters.latitude = this.latitude;<br />
this.$.webService1.parameters.longitude = this.longitude;<br />
this.$.webService1.execute();<br />
}<br />
else<br />
{<br />
Mojo.Controller.errorDialog("GPS Error!");<br />
this.$.GPSSearchButton.active = false;<br />
this.$.GPSSearchButton.activeChanged();<br />
}<br />
Abb. 4: Der erste Ergebnisbildschirm.<br />
Listing 8: webService1Success pushScene<br />
this.controller.stageController.pushScene("results", [inResponse.ResultSet, this.latitude, this.longitude]);<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 81
Entwicklung<br />
WebOS Ares Framework<br />
Abb. 5: Die fertige webOS-Anwendung<br />
mit einigen Style-Elementen<br />
aufgepeppt.<br />
Listing 10: movie.css<br />
body.palm‐default {<br />
background: url('../images/<br />
film.jpg') top left repeat‐y;<br />
}<br />
.theater‐name {<br />
padding‐left: 3px;<br />
font‐weight: bold;<br />
}<br />
.theater‐address {<br />
padding‐left: 3px;<br />
font‐size: .8em;<br />
}<br />
.theater‐phone {<br />
padding‐left: 3px;<br />
display: inline;<br />
font‐size: .9em;<br />
}<br />
.theater‐distance {<br />
display: inline;<br />
padding‐left: 10px;<br />
font‐size: .9em;<br />
}<br />
Listing 9: ResultsAssistant<br />
this.results = argFromPusher[0];<br />
this.latitude = argFromPusher[1];<br />
this.longitude = argFromPusher[2];<br />
zum <strong>Code</strong>-Editor mit der Taste Design/<strong>Code</strong><br />
hinüber, wo Sie ganz oben ResultsAssistant,<br />
den Konstruktor <strong>für</strong> den Scene-Assistenten<br />
sehen. Fügen Sie folgende Zeile dem<br />
Body der Deklaration hinzu:<br />
this.results = argFromPusher;<br />
Nun teilen Sie der Liste die Information über<br />
die erhaltenen Daten mit. Fügen Sie dazu<br />
den <strong>Code</strong> von Listing 5 der Setup-Funktion,<br />
gleich unter setupSceneAssistant hinzu.<br />
Die erste Zeile in diesem <strong>Code</strong> kopiert das<br />
Result-Feld (wo Yahoo! die Liste der Kinos<br />
ablegt) in das Listenmodell. Die zweite benachrichtigt<br />
den Scene-Controller, dass das<br />
betroffene Modell aktualisiert wurde, so<br />
kann dieser nun die angezeigten Daten ebenfalls<br />
aktualisieren.<br />
Erste Testphase<br />
Am besten testen Sie die Anwendung gleich<br />
in diesem Stadium, um sicherzugehen, dass<br />
<strong>alle</strong>s richtig funktioniert. Wenn Sie es noch<br />
nicht getan haben, starten Sie jetzt den Palm-<br />
Emulator. Klicken Sie dann auf den blauen<br />
Pfeil links oben in Ares und die Anwendung<br />
wird im Emulator gestartet. Geben Sie eine<br />
Postleitzahl ein (in unserem Beispiel 20500)<br />
und drücken Sie die Suchen-Taste. Daraufhin<br />
sehen Sie einen Stadtplan von Sunnyvale in<br />
Kalifornien und die Liste von Kinos in der<br />
Umgebung (Abbildung 4). Zum Hauptbildschirm<br />
wechseln Sie mit der ESC-Taste zurück,<br />
was einem Backswipe auf dem Gerät<br />
entspricht.<br />
Was geschah währenddessen im Hintergrund?<br />
Als Sie die Suchen-Taste betätigten,<br />
wurde ein Event gestartet, der den onTap-<br />
Handler aktivierte. Dieser wiederum führte<br />
eine Ajax-Anfrage an den WebService aus.<br />
Nachdem die Anfrage abgeschlossen war,<br />
startete er den onSuccess-Rückruf, der den<br />
Ergebnisbildschirm geladen hat.<br />
Ist diese Reihenfolge bei Ihrem Test nicht<br />
wie geplant abgelaufen, dann beheben Sie<br />
nun die Fehler in Ares. Wechseln Sie wieder<br />
zu Ares, dann sehen Sie den Log Viewer mit<br />
den Fehlermeldungen. Alternativ starten Sie<br />
das Ares-Tool JSLINT direkt neben dem Logviewer<br />
und lassen Ihre Quelldatei auf Fehler<br />
hin überprüfen. Auch den integrierten Debugger<br />
können Sie zu Hilfe rufen, um Breakpoints<br />
in Ihrem <strong>Code</strong> festzustellen und die<br />
Werte von Variablen sowie die DOM-Struktur<br />
zu überprüfen.<br />
Mapping<br />
Nun haben Sie eine Liste von Kinos zur Verfügung<br />
und die Karte würde noch benutzerfreundlicher<br />
aussehen, wenn Sie die Filmpaläste<br />
darauf auch markierten. Sie sollten<br />
auch die Karte selbst auf den Standort des<br />
Benutzers zentrieren. Dazu brauchen Sie die<br />
Google-Maps-API, um auf die Klassen zuzugreifen,<br />
die vom Map-Widget benutzt werden.<br />
Obwohl das Map-Widget die API eigentlich<br />
importiert, wird diese aber dynamisch<br />
geladen, deshalb erscheint sie nicht in der<br />
Set up-Funktion. Diese Tatsache können Sie<br />
aber umgehen.<br />
Machen Sie eine Kopie von der Maps-API,<br />
während die Anwendung zum ersten Mal geladen<br />
wird, und fügen Sie diese dem HTML-<br />
Dokument hinzu, das die Grundlage Ihrer<br />
Anwendung bildet. Wechseln Sie dazu im<br />
linken Panel auf Files, klicken Sie doppelt auf<br />
index.html und fügen Sie Listing 6 unmittelbar<br />
unter dem script-Tag mit ares.js ein:<br />
Für das Zentrieren der Karte und <strong>für</strong> die<br />
Markierung der Treffer brauchen Sie noch<br />
einige Funktionen, die Sie einfach aus dem<br />
Quellcode [5] herauskopieren und hier einfügen<br />
können. Fügen Sie auch Anrufe (calls)<br />
<strong>für</strong> diese beiden neuen Funktionen unten in<br />
der Setup-Funktion hinzu. Wechseln Sie deshalb<br />
zu results‐assistant.js zurück, klicken<br />
Sie dazu einfach auf die Dropdown-<br />
Liste der bereits editierten Dateien im oberen<br />
Balken des <strong>Code</strong>-Editors und wählen Sie die<br />
Datei aus. Fügen Sie diese beiden Zeilen der<br />
Setup-Funktion <strong>für</strong> die Anrufe der neuen<br />
Funktionen hinzu:<br />
this.setMarkers();<br />
this.centerMap();<br />
GPS<br />
Nun können Sie das GPS anschalten. Wechseln<br />
Sie zuerst zur main‐chrome.js-Datei,<br />
wählen Sie die Taste Am Standort Suchen<br />
(GPSSearchButton) aus und klicken Sie im<br />
<strong>Ein</strong>stellungspanel unter dem ReiterEvents auf<br />
das Editor-Symbol neben dem onTap-Handler,<br />
um diesen hinzufügen. Palm stellt einen Service<br />
<strong>für</strong> die Ermittlung von GPS-Koordinaten<br />
bereit. Diesen Service können Sie <strong>für</strong> den ununterbrochenen<br />
Betrieb oder <strong>für</strong> eine einmalige<br />
Feststellung des Standortes konfigurieren.<br />
In unserem Fall reicht eine einfache Feststellung<br />
der Koordinaten vollkommen aus,<br />
82<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Entwicklung<br />
WebOS Ares Framework<br />
verwenden Sie also die Methode: getCurrentPosition().<br />
Fügen Sie im onTap-Handler<br />
die folgende Zeile hinzu:<br />
this.$.gps1.getCurrentPosition();<br />
Das GPS vermittelt die Daten asynchron.<br />
Richten Sie einen onSuccess-Rückruf <strong>für</strong> die<br />
Komponente gps1 ein, um die ermittelten<br />
Werte abzurufen. Ergänzen Sie den onSuccess-Rückruf<br />
mit dem <strong>Code</strong> von Listing 7.<br />
Dieser <strong>Code</strong> überprüft, ob valide GPS-Informationen<br />
eingetroffen sind und startet<br />
den WebService. <strong>Ein</strong> Teil des <strong>Code</strong>s sorgt<br />
da<strong>für</strong>, dass der zip-Parameter entfernt wird,<br />
wenn der Benutzer zuvor bereits eine Suche<br />
anhand einer Postleitzahl durchführte. Auch<br />
zum onTap-Handler der Suchtaste per Postleitzahlen<br />
wurde ein <strong>Code</strong> hinzugefügt, um<br />
bereits vorhandene Werte <strong>für</strong> Längen- und<br />
Breitengrad zu löschen.<br />
Als Nächstes ändern Sie die Zeile in der<br />
onSuccess-Funktion von webService1, damit<br />
Längen- und Breitengrad dem Ergebnisbildschirm<br />
weitergegeben werden. Tauschen Sie<br />
dazu die pushScene-Zeile mit dem <strong>Code</strong> von<br />
Listing 8 aus. Fügen Sie die folgende Zeile<br />
der Funktion ZIPSearchButtonTap hinzu, um<br />
darauf hinzuweisen, dass bei der Suche per<br />
Postleitzahl kein Längen- und Breitengrad<br />
zur Verfügung stehen:<br />
this.latitude = this.longitude = undefined;<br />
Zum Schluss ändern Sie noch den Konstruktor<br />
<strong>für</strong> ResultsAssistant, damit die neuen<br />
Parameter akzeptiert werden. Ersetzen Sie<br />
den Konstruktor mit dem <strong>Code</strong> in Listing 9.<br />
Zweite Testphase<br />
An diesem Punkt angelangt, haben Sie eine<br />
funktionierende, wenn auch nur sehr einfache<br />
Anwendung <strong>für</strong> das Auffinden von Kinos<br />
in der Hand. Die Suche per PLZ und per GPS<br />
sollte bereits funktionieren. Probieren Sie die<br />
Anwendung aus und testen Sie, ob <strong>alle</strong>s erwartungsgemäß<br />
funktioniert.<br />
Letzte Schritte<br />
Ohne auf feinere Details von Design näher<br />
einzugehen, gibt es doch noch einige Verbesserungen,<br />
die Sie schnell anwenden können,<br />
besonders beim Ergebnisbildschirm und bei<br />
der Kartendarstellung. Mit etwas CSS-<strong>Code</strong><br />
verleihen Sie Ihrer neuen Anwendung ein<br />
Listing 11: Stylesheet zur index.html<br />
etwas gepflegteres Aussehen. Fügen Sie deshalb<br />
dem Projekt eine CSS-Datei hinzu. Klicken<br />
Sie auf den Reiter Files im linken Ares-<br />
Panel. Wählen Sie das Projektverzeichnis<br />
Movie aus und klicken Sie oben links auf den<br />
Button New folder. Benennen Sie den neuen<br />
Ordner stylesheets. Klicken Sie anschließend<br />
auf die New-Schaltfläche (weiter oben<br />
links) und wählen Sie den Menüpunkt Document<br />
aus. Markieren Sie im Popup-Fenster<br />
den stylesheets-Ordner und geben Sie<br />
movie.css <strong>für</strong> den Dateinamen an. Fügen Sie<br />
den <strong>Code</strong> von Listing 10 in der neu errichteten<br />
movie.css-Datei ein.<br />
Wechseln Sie nun zur index.html-Datei<br />
und fügen Sie die Zeile von Listing 11 dem<br />
head-Element hinzu. Zum Schluss laden Sie<br />
noch ein Bild hoch, das Sie als Teil des Hintergrundes<br />
der Anwendung verwenden.<br />
Laden Sie film.jpg aus dem ZIP-Archiv der<br />
Smart-Developer-Homepage [5] herunter.<br />
Wählen Sie unter dem Reiter File das Verzeichnis<br />
images aus, ziehen Sie dann die gewünschte<br />
Bilddatei in den linken unteren Bereich<br />
von Ares hinüber (wo Sie die Aufforderung:<br />
„Drop local files below to upload to<br />
„images“ sehen) und lassen Sie die Datei einfach<br />
f<strong>alle</strong>n; die Datei wird zu Ares hochgeladen.<br />
Hat <strong>alle</strong>s geklappt, sieht Ihre App wie in<br />
Abbildung 5 aus.<br />
Fazit<br />
Aus diesem Artikel haben Sie erfahren, wie<br />
Sie mithilfe von Ares schnell eine Anwendung<br />
zusammenstellen, die Angaben aus<br />
verschiedenen Quellen sammelt, diese miteinander<br />
kombiniert und dem Benutzer anzeigt.<br />
Sie haben auch einige Aspekte der<br />
JavaScript-Programmierung <strong>für</strong> webOS kennengelernt.<br />
Interessieren Sie sich mehr <strong>für</strong><br />
das Thema, versuchen Sie selbst eine Beschilderung<br />
<strong>für</strong> die einzelnen Ergebnisse und<br />
<strong>für</strong> die Kartenmarkierungen herzustellen.<br />
Oder richten Sie Verknüpfungen zu den Telefonnummern<br />
in der Liste ein, damit der Benutzer<br />
die gewünschte Nummer gleich anwählen<br />
kann.<br />
Ich hoffe, dass Sie in webOS die Plattform<br />
<strong>für</strong> Ihre nächste Anwendung gefunden<br />
haben. Sie werden sehen, dass webOS-Anwender<br />
ordentlich geschriebene Anwendungen<br />
wirklich sehr zu schätzen wissen und<br />
Entwickler sehr anerkennen, die nützliche<br />
Funktionen bereitstellen. Auf Wiedersehen<br />
im App-Katalog! <br />
● ● ●<br />
<br />
Roy Sutton<br />
Roy ist ein App-Entwickler, Blogger<br />
und webOS-Enthusiast. Er<br />
schrieb schon mobile Anwendungen,<br />
als es diesen Begriff<br />
überhaupt noch nicht gab. Sie<br />
finden Beiträge von ihm unter<br />
http:// www. webOSroundup. com.<br />
Roy ist außerdem Kurator <strong>für</strong> das<br />
Community-betriebene webOS-<br />
Dokumentations-Wiki unter<br />
http:// webOS101. com. Sie können<br />
ihm auch auf Twitter unter @<br />
Pre101 folgen.<br />
Infos<br />
[1] Entwicklerseite von Palm:<br />
http:// <strong>developer</strong>. palm. com<br />
[2] Ares: https:// ares. palm. com/<br />
Ares/ about. html<br />
[3] Yahoo! Local Search API:<br />
http:// <strong>developer</strong>. yahoo. com/<br />
search/ local/ V3/ localSearch.<br />
html<br />
[4] Google Maps API:<br />
http:// code. google. com/ apis/<br />
maps/ documentation/<br />
javascript/<br />
[5] Quellcode zum Artikel:<br />
http:// www. <strong>smart</strong>‐<strong>developer</strong>.<br />
de/ Magazin/ <strong>Code</strong>‐Beispiele<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 83
Entwicklung<br />
Android und OpenGL<br />
<strong>Ein</strong>führung in die 3D-Grafik auf Android<br />
Umschalten<br />
auf 3D<br />
Mit aktuellen Smartphones macht nicht nur das Spielen, sondern auch die Grafikprogrammierung<br />
so richtig Spaß. Dieser Artikel gibt Ihnen eine <strong>Ein</strong>führung in die Entwicklung von OpenGL-ES-Anwendungen<br />
unter Android. Shane Conder und Lauren Darcey<br />
Yuriy Ivkin, 123RFa<br />
Mobilgeräte sind sehr leistungsfähig<br />
und werden von Monat zu<br />
Monat leistungsfähiger. Die ausgereifte<br />
und sehr beeindruckende<br />
Grafikleistung, die früher ausschließlich<br />
auf Hochleistungsrechner beschränkt<br />
war, finden Sie mittlerweile dank integrierter<br />
Hardwarebeschleunigung auf nahezu jedem<br />
alltäglichen Smartphone. Dreidimensionale<br />
Grafik wird in einer Vielzahl von Anwendungen<br />
eingesetzt, von Spielen über Kartendarstellungen<br />
bis hin zu virtueller und erweiterter<br />
Realität. In dieser Anleitung<br />
zeigen wir Ihnen anhand von<br />
praktischen Beispielen, wie<br />
Sie die ersten und wichtigsten Schritte meistern,<br />
um selbst Anwendungen mit 3D-Grafik<br />
<strong>für</strong> die Android-Plattform zu entwickeln.<br />
Der Artikel richtet sich in erster Linie an<br />
Entwickler, die mit der Android-Plattform<br />
und mit den Entwicklerwerkzeugen <strong>für</strong> Android<br />
bereits vertraut sind und über grundlegende<br />
Kenntnisse in 3D-Grafik verfügen.<br />
Falls Sie gerade anfangen oder Ihre Grundkenntnisse<br />
vertiefen wollen, finden Sie im<br />
Info kasten am Ende des Artikels eine Liste<br />
von Publikationen zum Thema 3D- und<br />
OpenGL-Programmierung [2] [3] [4].<br />
Quellcode zur APP<br />
Wir haben eine einfache Anwendung <strong>für</strong> Android<br />
namens Easy3D eingerichtet, um die<br />
Konzepte in dieser Anleitung zu veranschaulichen.<br />
Aufgrund der Länge von OpenGL-<strong>Code</strong>beispielen<br />
und der begrenzten Kapazität von<br />
Printmedien empfehlen wir Ihnen, dass Sie<br />
den <strong>Code</strong> gleich herunterladen und die Programmierschritte<br />
darin mitverfolgen. Der vollständige<br />
Quellcode <strong>für</strong> Easy3D steht unter [1]<br />
zum Download bereit.<br />
84<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Entwicklung<br />
Android und OpenGL<br />
Abb. 1: Schematische Darstellung der Beziehungen zwischen den implementierten Klassen.<br />
Entwickeln mit OpenGL ES<br />
OpenGL ES ist eine Untergruppe von OpenGL<br />
und wird auf eingebetteten Systemen verwendet,<br />
die heutzutage auf so ziemlich <strong>alle</strong>n<br />
modernen Smartphone-Plattformen zum <strong>Ein</strong>satz<br />
kommen. Android benutzt herkömmliche<br />
OpenGL ES-Bibliotheken <strong>für</strong> 3D-Grafikentwicklung.<br />
Haben Sie bereits Erfahrung<br />
mit OpenGL ES auf anderen Plattformen,<br />
wird Ihnen die Technik auf Android sehr bekannt<br />
vorkommen. Manche Android-Geräte<br />
unterstützen nur OpenGL ES in der Version<br />
1.1, andere bereits OpenGL ES 2.0. In unserer<br />
Beispielanwendung verwenden wir<br />
OpenGL ES 1.1, so können wir die Vorteile<br />
der vordefinierten Shader mit fest zugewiesenen<br />
Funktionen ausnutzen. Bei OpenGL ES<br />
2.0 müssten wir unsere eigenen Shader von<br />
Listing 1: Die grafische Oberfläche<br />
public class Easy3DActivity extends<br />
Activity {<br />
private GLSurfaceView easySurfaceView =<br />
null;<br />
private Easy3DRenderer mEasyRenderer;<br />
}<br />
protected void onResume() {<br />
super.onResume();<br />
if (easySurfaceView != null) {<br />
public void onCreate(Bundle<br />
savedInstanceState) {<br />
super.onCreate(savedInstanceState);<br />
}<br />
}<br />
easySurfaceView.onResume();<br />
easySurfaceView = new<br />
GLSurfaceView(this);<br />
easySurfaceView.<br />
setEGLContextClientVersion(1);<br />
mEasyRenderer = new<br />
Easy3DRenderer(this);<br />
easySurfaceView.<br />
setRenderer(mEasyRenderer);<br />
private class Easy3DRenderer implements<br />
GLSurfaceView.Renderer {<br />
private Context context;<br />
Easy3DRenderer(Context context) {<br />
this.context = context;<br />
}<br />
public void onDrawFrame(GL10 gl) {}<br />
setContentView(easySurfaceView);<br />
}<br />
protected void onPause() {<br />
super.onPause();<br />
if (easySurfaceView != null) {<br />
easySurfaceView.onPause();<br />
}<br />
public void onSurfaceChanged(GL10 gl, int<br />
width, int height) {}<br />
public void onSurfaceCreated(GL10 gl,<br />
EGLConfig config) {}<br />
}<br />
}<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 85
Entwicklung<br />
Android und OpenGL<br />
Abb. 2: Die Beispielanwendung mit drei mit Texturen versehenen und beleuchteten Würfeln.<br />
Listing 2: onSurfaceCreated()<br />
Grund auf neu erstellen (was den Rahmen<br />
dieser einfachen Anleitung deutlich überschreiten<br />
würde).<br />
Das Android-SDK [5] enthält eine Reihe<br />
von Hilfsklassen, die grafikspezifische Aufgaben<br />
vereinfachen. Die Klasse GLSurfaceView<br />
ist eine standardmäßige Android-Surface-<br />
View, die die zugrunde liegende grafische<br />
Oberfläche unter Verwendung eines EGL-<br />
Kontextes implementiert, um darauf zu<br />
zeichnen. In Verbindung mit der GLSurface-<br />
View-Klasse zeichnet die GLSurfaceView.Renderer-Klasse<br />
die Grafiken, wenn diese vom<br />
System aufgerufen werden. Abbildung 1<br />
stellt die Beziehungen zwischen diesen Klassen<br />
recht plastisch dar.<br />
public void onSurfaceCreated(GL10 gl, EGLConfig config) {<br />
gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);<br />
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);<br />
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);<br />
gl.glShadeModel(GL10.GL_SMOOTH);<br />
gl.glDisable(GL10.GL_DITHER);<br />
gl.glEnable(GL10.GL_DEPTH_TEST);<br />
gl.glEnable(GL10.GL_CULL_FACE);<br />
gl.glEnable(GL10.GL_TEXTURE_2D);<br />
gl.glEnable(GL10.GL_COLOR_MATERIAL);<br />
gl.glEnable(GL10.GL_LIGHTING);<br />
gl.glEnable(GL10.GL_LIGHT0);<br />
gl.glEnable(GL10.GL_LIGHT1);<br />
gl.glActiveTexture(GL10.GL_TEXTURE0);<br />
gl.glClearColor(0.4f, 0.4f, 0.5f, 1);<br />
int[] textures = new int[2];<br />
gl.glGenTextures(2, textures, 0);<br />
texHoneyCube.setTexture(gl, context, textures[0], R.drawable.honeycomb_512);<br />
texDroidCube.setTexture(gl, context, textures[1], R.drawable.<br />
gingerbread_256);<br />
}<br />
Zunächst erstellen Sie eine neue Instanz von<br />
GLSurfaceView innerhalb der onCreate()-Methode<br />
einer Activity-Klasse. Für eine Vollbild-Ansicht<br />
setzen Sie diese View als Parameter<br />
<strong>für</strong> den Aufruf von setContentView<br />
() . Über onPause()- und onResume()-Ereignisse<br />
müssen Sie die GLSurfaceView-Instanz<br />
explizit benachrichtigen. Überschreiben Sie<br />
dazu die entsprechenden Callback-Methoden<br />
in der Activity und rufen Sie die gleichen<br />
Methoden am GLSurfaceView-Objekt auf.<br />
Nun erstellen Sie eine leere Implementierung<br />
einer GLSurfaceView.Renderer-Klasse.<br />
Ihre Activity-Klasse sieht nun ähnlich wie<br />
der <strong>Code</strong> in Listing 1 aus (in der Datei Easy-<br />
3DActivity.java), wobei wir Debugging-<br />
<strong>Code</strong> und Anmerkungen zur besseren Lesbarkeit<br />
entfernt haben.<br />
Setup der GUI<br />
Für die grafische Oberfläche treffen Sie die<br />
wichtigsten <strong>Ein</strong>stellungen innerhalb der Methode<br />
onSurfaceCreated(). Hier stellen Sie<br />
Tiefentest, Client-Zustände, Culling, Hinting,<br />
Lichter und Texturen ein, sowie die zahlreichen<br />
anderen Attribute, die Sie in Ihrer GL-<br />
Anwendung aktivieren, deaktivieren oder<br />
mit einem bestimmten Wert versehen wollen.<br />
Obwohl Sie hier auch Hilfsklassen <strong>für</strong><br />
die Bildsynthese initialisieren und Texturen<br />
erstellen können, ist dieser Ort nicht <strong>für</strong> das<br />
Konfigurieren von Elementen der Projektionsfläche<br />
und des Modellbereichs geeignet.<br />
Listing 2 zeigt eine übliche Konfiguration<br />
<strong>für</strong> eine GL-Oberfläche mit Shading, Lichtern<br />
und Texturen.<br />
Kennen Sie sich in OpenGL ES im Allgemeinen<br />
gut aus, sollte Ihnen Listing 2 ziemlich<br />
bekannt vorkommen: Es geht hier um<br />
Listing 3: Das Ansichtfenster<br />
public void onSurfaceChanged(GL10 gl, int<br />
width, int height) {<br />
gl.glViewport(0, 0, width, height);<br />
float ratio = (float) width / height;<br />
gl.glMatrixMode(GL10.GL_PROJECTION);<br />
gl.glLoadIdentity();<br />
GLU.gluPerspective(gl, 35, ratio, 1,<br />
500);<br />
GLU.gluLookAt(gl, 0, 0, 12f, 0, 0, 0, 0,<br />
1, 0f);<br />
// ambient/diffuse hidden<br />
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_<br />
POSITION, new float[] { ‐20f, 20f, 0f, 1 },<br />
0);<br />
gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_<br />
POSITION, new float[] { 5f, ‐5f, 7f, 1 },<br />
0);<br />
}<br />
86<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Entwicklung<br />
Android und OpenGL<br />
eine standardmäßige Konfiguration <strong>für</strong><br />
OpenGL, außer der Stelle <strong>für</strong> die Texturen.<br />
Hier benutzten wir eine Hilfsklasse <strong>für</strong> einen<br />
Würfel, worauf wir später noch zurückkehren.<br />
Zuerst führen Sie aber die OpenGL-Konfiguration<br />
zu Ende.<br />
Ansichtfenster und Projektion<br />
Nach den Grundeinstellungen <strong>für</strong> OpenGL<br />
stellen Sie nun im nächsten Schritt das Ansichtfenster<br />
(Viewport) ein. Ihre Anwendung<br />
erhält die <strong>alle</strong>rersten Informationen über das<br />
Ansichtfenster in der onSurfaceChanged()-<br />
Rückrufmethode. Mit dem Aufruf dieser Methode<br />
bekommt die Anwendung Informationen<br />
über die Abmessungen der Zeichnungsfläche<br />
eines bestimmten Gerätes. Die <strong>alle</strong>rwichtigste<br />
Information <strong>für</strong> die meisten Anwendungen<br />
ist hier das Seitenverhältnis des<br />
Bildschirms. Wie bei den meisten OpenGL-<br />
Implementationen üblich, konfigurieren Sie<br />
zuerst die Projektionsmatrix und fügen dann<br />
<strong>alle</strong> Objekte hinzu, bei denen es sinnvoll ist,<br />
sie innerhalb der (oder in Relation zur) Projektionsfläche<br />
zu definieren.<br />
Listing 3 zeigt eine perspektivische Konfiguration<br />
sowie den Standort des Betrachters.<br />
Im Folgenden fügen Sie diesem Raum einige<br />
Lichtquellen hinzu. (Die Lichtquellen sind<br />
grundsätzlich relativ zum Betrachter und fix<br />
platziert, unabhängig davon, wie viele Objekte<br />
sich in der Szene bewegen. Lichter von<br />
Szenen-Objekten im Modellraum einzuführen,<br />
ist mit mehr Aufwand auch möglich.)<br />
Listing 7: setTexture()<br />
mCoordinateBuffer = OpenGLUtilities<br />
.getFloatBufferFromFloatArray(textu<br />
reCoords);<br />
mTextureID = textureID;<br />
gl.glBindTexture(GL10.GL_TEXTURE_2D,<br />
mTextureID);<br />
Bitmap bitmap = BitmapFactory.<br />
decodeResource(c.getResources(),<br />
drawableID);<br />
Bitmap bitmapSq = Bitmap<br />
.createScaledBitmap(bitmap, 512, 512,<br />
false);<br />
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0,<br />
bitmapSq, 0);<br />
bitmap.recycle();<br />
bitmapSq.recycle();<br />
gl.glTexParameterf(GL10.GL_TEXTURE_2D,<br />
GL10.GL_TEXTURE_MIN_FILTER,<br />
GL10.GL_NEAREST);<br />
gl.glTexParameterf(GL10.GL_TEXTURE_2D,<br />
GL10.GL_TEXTURE_MAG_FILTER,<br />
GL10.GL_LINEAR);<br />
Beachten Sie noch die in Listing 3 verwendete<br />
GLU-Hilfsklasse, welche die Entsprechung<br />
<strong>für</strong> GLUT (OpenGL Utility Toolkit) in<br />
Android darstellt.<br />
Frames zeichnen<br />
Mit dem soeben konfigurierten OpenGL ES<br />
können Sie bereits zeichnen. Zum Zeichnen<br />
wird die onDrawFrame()-Rückrufmethode aufgerufen.<br />
In Ihrer Implementierung dieser Methode<br />
legen Sie dann <strong>alle</strong> regulären OpenGL-<br />
Aufrufe <strong>für</strong> die Erstellung einer Szene ab.<br />
Listing 4 zeigt den Inhalt einer ziemlich einfachen<br />
Implementierung <strong>für</strong> die<br />
onDrawFrame()-Methode, die einen Honeycomb-Würfel<br />
zeichnen soll.<br />
Wie Listing 4 zeigt, ist das Zeichnen mit<br />
OpenGL ES auf Android sehr ähnlich, wenn<br />
nicht gleich, wie auf anderen Plattformen.<br />
Allerdings sehen Sie hier eine andere Referenz<br />
zu einer Klasse <strong>für</strong> das Zeichnen eines<br />
Würfels. Als Nächstes schildern wir die<br />
damit zusammenhängenden Besonderheiten.<br />
Umgang mit Puffern<br />
Wie es oft der Fall im OpenGL-Gebrauch ist:<br />
Arrays speichern Eckpunkte, Normalen und<br />
Indizes. Diese Arrays können Sie anfangs mit<br />
Listing 4: onDrawFrame()<br />
public void onDrawFrame(GL10 gl) {<br />
}<br />
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);<br />
gl.glMatrixMode(GL10.GL_MODELVIEW);<br />
gl.glLoadIdentity();<br />
gl.glTranslatef(0f, 0f, 0f);<br />
gl.glRotatef(mRotateAngle, 1f, 1f, 0f);<br />
texHoneyCube.draw(gl);<br />
...<br />
Listing 5: OpenGL-fähiger Puffer<br />
ByteBuffer tempBuffer = ByteBuffer.allocateDirect(array.length * 4);<br />
tempBuffer.order(ByteOrder.nativeOrder());<br />
FloatBuffer buffer = tempBuffer.asFloatBuffer();<br />
buffer.put(array);<br />
buffer.position(0);<br />
Listing 6: Hilfsmethoden<br />
private FloatBuffer mVertexBuffer;<br />
float vertices[] = {1f, 0f, 0.5f, .... };<br />
// Inside‐Methode vor dem Gebrauch:<br />
mVertexBuffer = OpenGLUtilities.getFloatBufferFromFloatArray(vertices);<br />
// Wenn während des Zeichnens verwendet:<br />
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer);<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 87
Entwicklung<br />
Android und OpenGL<br />
Über die Autoren<br />
Shane Conder und Lauren Darcey<br />
haben zusammen mehrere<br />
erfolgreiche Lehrbücher zu Entwicklung<br />
mobiler Software verfasst,<br />
darunter Android Wireless<br />
Application Development und<br />
SAMS Teach Yourself Android<br />
Application Development in 24<br />
Hours. Sie erreichen die beiden<br />
per androidwirelessdev+sm@<br />
gmail. com oder über den Blog<br />
http:// androidbook. blogspot. com<br />
sowie auf Twitter unter http://<br />
twitter. com/ androidwireless.<br />
Infos<br />
[1] Quellcode zum Artikel:<br />
http:// code. google. com/ p/<br />
android‐opengl‐<strong>smart</strong><strong>developer</strong>/<br />
[2] Android Leitlinien zu<br />
3D-Entwicklung:<br />
http:// <strong>developer</strong>. android.<br />
com/ guide/ topics/ graphics/<br />
opengl. html<br />
[3] Wright, Richard S., Nicholas<br />
Haemel, Graham Sellers und<br />
Benjamin Lipchak: OpenGL<br />
SuperBibleAusgabe 5.; Addison-Wesley<br />
Professional,<br />
2010. ISBN-13: 978-<br />
0321712615<br />
[4] Munshi, Aaftab, Dan Ginsburg<br />
und Dave Shreiner.<br />
OpenGL(R) ES 2.0 Programming<br />
Guide. Addison-Wesley<br />
Professional, 2008.<br />
ISBN-13: 978-0321502797<br />
[5] Android-SDK Download:<br />
http:// <strong>developer</strong>. android.<br />
com/ sdk/ index. html<br />
[6] Android-NDK:<br />
http:// <strong>developer</strong>. android.<br />
com/ sdk/ ndk/ overview. html<br />
[7] Android Entwicklerblog:<br />
http:// android‐<strong>developer</strong>s.<br />
blogspot. com/ ? hl=en<br />
Java definieren, aber sie müssen in einem reservierten<br />
Bereich im Speicher aufbewahrt<br />
werden, damit die zugrunde liegende<br />
OpenGL-Implementierung diese genau und<br />
sicher nutzen kann. Um dies zu gewährleisten,<br />
verwenden Sie hier die Methode allocateDirect()<br />
der ByteBuffer-Klasse. Der <strong>Code</strong><br />
in Listing 5 nimmt zum Beispiel ein Array<br />
von Float-Werten und wandelt die Werte in<br />
einen OpenGL-fähigen Puffer um.<br />
Da diese Art von <strong>Code</strong> ziemlich gebräuchlich<br />
ist, erstellten wir Hilfsmethoden: die<br />
Datei OpenGLUtilities.java ist im Easy3D-<br />
Download enthalten. Die Verwendung ist<br />
ziemlich einfach und wird in Pseudocode in<br />
Listing 6 veranschaulicht.<br />
Mit diesen <strong>für</strong> die Grafik-Programmierung<br />
relativ einfachen Tools können Sie unter Verwendung<br />
von OpenGL auf Android nahezu<br />
<strong>alle</strong>s zeichnen, was Sie möchten. Allerdings<br />
sind Szenen oft mit Texturen verbessert: Ihre<br />
Konfiguration haben Sie bereits in Listing 2<br />
kennengelernt. Schauen Sie sich jetzt den<br />
Aufruf der setTexture()-Methode etwas<br />
gründlicher an.<br />
Android NDK<br />
In Verbindung mit OpenGL wird oft auch das<br />
Android-NDK (Native Development Kit) angesprochen.<br />
Das NDK [6] beinhaltet native C-APIs<br />
<strong>für</strong> OpenGL, wodurch Anwendungen von anderen<br />
Plattformen schneller portiert werden,<br />
wenn diese in C geschrieben sind. Im Allgemeinen<br />
wird aber das Android-NDK Ihre Arbeit<br />
in Sachen Performance nicht viel voranbringen,<br />
wenn Sie es lediglich <strong>für</strong> OpenGL-Aufrufe<br />
verwenden. Allerdings könnten einige Berechnungen<br />
und Algorithmen effizienter sein.<br />
Für 3D-Grafik ist die neue Alternative zu Android-NDK:<br />
Renderscript. Zum Zeitpunkt der<br />
Erscheinung dieses Artikels wissen wir noch<br />
ziemlich wenig von Renderscript, aber es ist<br />
<strong>für</strong> die Erstellung von 3D-Grafiken in Höchstqualität<br />
konzipiert, die mehrere Prozessorkerne<br />
und den Grafikprozessor sehr effizient nutzen.<br />
Um mehr Informationen über Renderscript zu<br />
erhalten, schauen Sie sich das Blog <strong>für</strong> Android-Entwickler<br />
[7] regelmäßig an.<br />
Laden von Texturen<br />
Es gibt viele Möglichkeiten, Texturen zu gestalten.<br />
<strong>Ein</strong>e sehr effiziente Methode <strong>für</strong> den<br />
Umgang mit Texturen sehen Sie in Listing 7<br />
(aus der EasyCube.java-Datei). Hier laden Sie<br />
eine herkömmliche Android-Bild-Ressource<br />
in OpenGL <strong>für</strong> den Gebrauch als Textur. Ähnlich<br />
wie bei den Puffern, müssen Sie auch<br />
die Textur-Koordinaten sehr genau konfigurieren.<br />
Die Texturen verbinden Sie wie gewohnt<br />
mit OpenGL und die Parameter konfigurieren<br />
Sie auch wie sonst üblich. Für Android<br />
nutzen Sie die texImage2D()-Methode<br />
der GLUtils-Klasse. Anschließend stellen Sie<br />
die Android-Bildobjekte mit dem Aufruf der<br />
recycle()-Methode von der Bitmap-Klasse<br />
sofort frei. Die Texturen sind nun sicher in<br />
der zugrunde liegenden OpenGL-Implementierung<br />
abgelegt.<br />
Nachdem Sie all diese <strong>Ein</strong>stellungen ordnungsgemäß<br />
durchführten, erstellen Sie nun<br />
leicht ähnliche Szenen wie in Abbildung 2<br />
dargestellt. In dieser Beispielszene sind <strong>alle</strong><br />
Würfel animiert: Der eine wird einmal, der<br />
andere zweimal gedreht.<br />
Um die gesamte Implementierung dieser<br />
einfachen Szene anzusehen, laden Sie den<br />
vollständigen Quellcode herunter [1].<br />
Fazit<br />
In diesem Artikel haben Sie erfahren, wie Sie<br />
OpenGL ES auf Android initialisieren und<br />
konfigurieren. Sie verwendeten die Klasse<br />
GLSurfaceView, um die Konfiguration von<br />
OpenGL-Kontexten und Oberflächen zu vereinfachen.<br />
Sie haben auch gelernt, wie Sie<br />
Puffer <strong>für</strong> den sicheren Gebrauch von<br />
OpenGL einstellen, und wie Sie Texturen einfach<br />
laden und anwenden. Zahlreiche Bücher<br />
sind zum Thema OpenGL und Grafik-Programmierung<br />
erschienen – die 3D-Programmierung<br />
ist eine sehr komplexe und vielschichtige<br />
Thematik. Hier haben wir lediglich<br />
an der „Oberfläche“ gekratzt, um es mit<br />
einem Wortspiel auszudrücken. Nun sind Sie<br />
bereit: Bauen Sie großartige 3D-Anwendungen<br />
<strong>für</strong> Android. Sind Sie damit fertig, dann<br />
schreiben Sie uns und erzählen uns von<br />
ihren Erfahrungen!<br />
● ● ●<br />
OpenGL ES 2.0<br />
Nahezu <strong>alle</strong> Android-Geräte unterstützen<br />
OpenGL ES 1.x, die Version, die wir in unserer<br />
Beispielanwendung verwendeten. OpenGL ES<br />
2.0 verfügt über keine Shader mit festen Funktionen,<br />
da<strong>für</strong> aber über eine voll programmierbare<br />
Shader-Pipeline. OpenGL ES 2.0 ist viel<br />
flexibler, braucht aber auch viel mehr an Konfiguration.<br />
Das Setup in Android ist sehr ähnlich,<br />
aber Sie fordern dann OpenGL ES 2.0 als<br />
zugrunde liegenden Kontext an. Dazu rufen Sie<br />
die setEGLContextClientVersion()-Methode<br />
mit dem Parameter 2 auf. So können Sie bei<br />
<strong>alle</strong>n betroffenen Rückrufen den GL10-Parameter<br />
einfach ignorieren und stattdessen immer<br />
die statische GLES20-Klasse aufrufen. Das<br />
Laden und Kompilieren von Shader-Programmen<br />
führen Sie genauso wie auf anderen Plattformen<br />
durch.<br />
88<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Entwicklung<br />
Jenseits von Eclipse und Android-SDK<br />
Android<br />
Developer<br />
Android-Tools <strong>für</strong> Entwickler<br />
Eclipse und Android-SDK sind eine gute Entscheidung, wenn Sie mit der<br />
Entwicklung <strong>für</strong> Android anfangen. Nach einer Weile werden Sie aber<br />
mit Sicherheit zusätzliche Funktionen brauchen, die im SDK nicht enthalten<br />
sind. In diesem Artikel zeigen wir Ihnen Bibliotheken und Werkzeuge,<br />
die Ihnen das Leben als Entwickler erleichtern. Dave MacLean<br />
Sie haben das Android-SDK installiert;<br />
auf Ihrem System läuft die<br />
kompatible Version von Eclipse<br />
[1] mit der Erweiterung Android<br />
Development Tools (auch bekannt als ADT,<br />
und selbstverständlich aktualisieren Sie regelmäßig<br />
Ihr System). Sie haben mindestens<br />
ein gutes Buch zum Thema Android-Entwicklung<br />
gelesen und natürlich<br />
diese Zeitschrift; und Sie entwickeln<br />
fleißig Anwendungen aus Spaß und<br />
<strong>für</strong> Profit. Haben Sie jetzt <strong>alle</strong>s, was Sie<br />
<strong>für</strong> An droid brauchen?<br />
Von Ihrer Antwort hängt es ab, ob Sie sich<br />
das Leben etwas einfacher machen. Denn<br />
obwohl das Android-SDK [2] und die ADT<br />
[3] eine Menge zu bieten haben, erledigen<br />
sie nicht <strong>alle</strong>s, und früher oder später werden<br />
Sie etwas brauchen, was nicht da ist. In diesem<br />
Artikel mache ich Sie mit einigen ausgezeichneten<br />
Bibliotheken und Werkzeugen<br />
bekannt, die Sie zusätzlich zu Ihren Android-<br />
Entwickleranwendungen nutzen können. Die<br />
meisten der hier beschriebenen Lösungen<br />
wurden speziell <strong>für</strong> Android entwickelt.<br />
Guava<br />
Die erste Bibliothek, die Sie kennenlernen<br />
sollten, heißt Guava [4] und stammt von<br />
Google. Es gibt tatsächlich einige Android-<br />
Programme von Google, die von Guava abhängig<br />
sind. Guava ist eine Klassenbibliothek,<br />
die viele Lücken füllt. Nehmen wir<br />
zum Beispiel an, Sie benötigen einige Operationen<br />
<strong>für</strong> Zeichenketten, die Sie in der standardmäßigen<br />
Strings-Klasse nicht finden.<br />
Oder Sie wollen die Validität von Parametern<br />
überprüfen. Guava bietet in diesen<br />
beiden Fällen eine große<br />
Hilfe. Es ist quelloffen, sehr<br />
leistungsstark und stabil. Die<br />
Klassenbibliothek laden Sie<br />
einfach von der Downloadseite<br />
von Guava herunter<br />
[5]. Hier<br />
finden<br />
Sie neben<br />
der gezippten<br />
Guava Jar-<br />
Datei auch die<br />
API-Referenzdokumentation,<br />
eine Anleitung <strong>für</strong> die Nutzung<br />
von Guava mit dem<br />
ProGuard-Obfuscator<br />
(dem Quelltextverschleierer<br />
<strong>für</strong> Android-Anwendungen),<br />
sowie andere wichtige Informationen.<br />
Hier sind einige<br />
Beispiele <strong>für</strong> Klassen,<br />
die Sie wahrscheinlich<br />
sehr hilfreich finden<br />
und auch benutzen<br />
werden:<br />
• com.google.common.io.LineReader<br />
– bietet eine<br />
Kirsty Pargeter, 123RF<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 89
Entwicklung<br />
Android-Tools <strong>für</strong> Entwickler<br />
readLine()-Methode <strong>für</strong> jedes beliebige<br />
java.lang.Readable-Objekt sowie einen<br />
BufferedReader, FileReader oder String-<br />
Reader. Es gibt noch viele andere Klassen,<br />
die sich auf Zeichenketten und Dateien<br />
beziehen.<br />
• com.google.common.base.Preconditions –<br />
bietet praktische Methoden <strong>für</strong> die Verifikation<br />
eines Parameters und gibt ein IllegalArgumentException<br />
mit einer aussagekräftigen<br />
Meldung aus, wenn die Voraussetzungen<br />
nicht erfüllt sind. Zum Beispiel<br />
statt:<br />
if (count 0, U<br />
"must be positive: %s",count);<br />
Die Preconditions-Klasse enthält auch Methoden<br />
<strong>für</strong> die Prüfung auf NULL, <strong>für</strong> die<br />
Überprüfung der Positionen in Arrays, in<br />
Listen oder in Zeichenketten sowie <strong>für</strong> die<br />
Prüfung des korrekten Zustandes und einiges<br />
mehr. Die grundlegende Operation beruht<br />
auf der Auswertung eines Ausdrucks<br />
und wenn dieser sich als falsch erweist,<br />
wird eine sinnvolle Zeichenkette ausgegeben.<br />
Mit anderen Worten: Es überprüft<br />
eine Behauptung (Assertion) und beschwert<br />
sich, wenn diese Behauptung<br />
nicht wahr ist. Diese Funktion macht<br />
Ihnen als Entwickler beim <strong>Code</strong>schreiben<br />
die Überprüfung von Parametern viel leichter,<br />
was viele Entwickler sonst sehr oft vernachlässigen.<br />
• com.google.common.base.Splitter – als<br />
Ergänzung zur Joiner-Klasse bietet die<br />
Splitter-Klasse eine Split-Methode, die<br />
Strings oder Instanzen von CharSequence-<br />
Objekten behandelt und zum Trennen <strong>alle</strong><br />
Arten von Separatoren und Funktionen anwenden<br />
kann. Als Ergebnis der Aufspaltung<br />
entsteht ein Iterable von den Tokens,<br />
die vorgefunden wurden. Folgendes Beispiel<br />
zeigt, wie Sie einen String in Tokens<br />
aufspalten und dabei die Ergebnisse trimmen,<br />
um keine leeren Strings zu erhalten:<br />
private static final SplitterU<br />
mySplitter = Splitter.on(',')U<br />
.trimResults()<br />
.omitEmptyStrings();<br />
Iterable tokens = U<br />
mySplitter.split(U<br />
"one, ,three, four,");<br />
Der obige <strong>Code</strong> setzt tokens zu ["one",<br />
"three", "four"]. Sie können auch andere<br />
Tricks anwenden, um einen Splitter zu schaffen,<br />
der jede beliebige Zeichenfolge oder<br />
einen String von mehreren Zeichen als Separator<br />
verwenden kann.<br />
Ich habe lediglich einige wenige von den<br />
zahlreichen Klassen der Guava-Bibliothek<br />
vorgestellt. Sehen Sie sich die Bibliothek<br />
etwas gründlicher an, es lohnt sich bestimmt.<br />
Laden Sie dazu die Guava Zip-Datei<br />
auf Ihren Computer herunter und entpacken<br />
Sie die jar-Datei. Wechseln Sie dann zu<br />
Ihrem Projekt in Eclipse über, klicken Sie mit<br />
der rechten Maustaste auf den Projektnamen,<br />
wählen Sie Build Path und Configure<br />
Build Path…. Klicken Sie auf die Registerkarte<br />
Libraries im Popup-Dialog, dann auf<br />
die Add External JARs…-Taste. Navigieren<br />
Sie zum Verzeichnis mit der Guava.jar-Datei,<br />
markieren Sie diese und klicken Sie auf<br />
Open. Zum Schluss klicken Sie auf OK und<br />
können gleich mit Guava anfangen.<br />
Facebook-API<br />
Facebook stellt Entwicklern eine API zur Verfügung,<br />
die eine Integration von Facebook-<br />
Funktionen ermöglicht. Sie können zwar<br />
gerne die gesamte Dokumentation hier<strong>für</strong><br />
gründlich durchstudieren, aber auch gleich<br />
die Vorteile einer Bibliothek nutzen, die eigens<br />
<strong>für</strong> die Integration von Facebook in Android-Anwendungen<br />
entwickelt wurde. Auf<br />
der Website der Facebook-Bibliothek <strong>für</strong> Android<br />
[6] finden Sie den Quellcode der Facebook-API<br />
mit Klassen <strong>für</strong> Benutzerfreundlichkeit<br />
zum Download. Hier finden Sie auch<br />
Beispielanwendungen und eine Kopie der<br />
Facebook-App <strong>für</strong> Ihren Emulator.<br />
Auf der Entwicklerseite von Facebook [7]<br />
lesen Sie nützliche Informationen und Nachrichten,<br />
die direkt von Facebook veröffentlicht<br />
werden. Die Dokumentation über die<br />
interne Funktionsweise von Facebook ist besonders<br />
interessant, denn hier erfahren Sie<br />
mehr zum Datenmodell und anderen Funktionen<br />
von Facebook und wie Sie über soziale<br />
Graphen navigieren.<br />
Zum <strong>Ein</strong>satz dieser Bibliothek benötigen<br />
Sie ein verifiziertes Facebook-Konto. Das bedeutet,<br />
dass Sie zu Ihrem Benutzernamen<br />
zusätzlich noch Ihre Handynummer oder<br />
Kreditkartennummer angeben müssen. Facebook<br />
will die Beziehung zu seinen Entwicklern<br />
nämlich mit etwas Greifbarem sichern.<br />
90<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Entwicklung<br />
Android-Tools <strong>für</strong> Entwickler<br />
Sie müssen auch Ihre Anwendung auf der<br />
Website von Facebook registrieren, bevor Sie<br />
dieses integrieren. Ihre Anwendung bekommt<br />
dann eine interne ID, die den Zugriff<br />
auf die APIs <strong>für</strong> Ihre Anwendung überhaupt<br />
erst ermöglicht. Außerdem müssen Sie den<br />
Nutzungsbedingungen zustimmen, um Ihre<br />
Anwendung bei Facebook zu registrieren.<br />
Haben Sie diese Registrierungsschritte erfolgreich<br />
absolviert, sehen Sie das Profil <strong>für</strong><br />
Ihre Anwendung mit der appID, die Sie Ihrer<br />
Anwendung auf der Android-Seite hinzufügen<br />
müssen, damit diese einwandfrei funktioniert.<br />
Am besten fangen Sie zuerst mit einer<br />
der Beispielanwendungen von Facebook an,<br />
die im Download mit enthalten sind. <strong>Ein</strong>e<br />
von denen ist sehr einfach und erhält lediglich<br />
rudimentäre Daten, eine andere kann<br />
Streams von Facebook (wie zum Beispiel den<br />
News-Feed) einbinden. Ihre appID fügen Sie<br />
der App.java-Datei hinzu. Beachten Sie, dass<br />
diese Beispielanwendungen auch die originalen<br />
Facebook-Grafiken <strong>für</strong> Symbole und<br />
Schaltflächen enthalten.<br />
Obwohl die Anweisungen von Facebook<br />
genau erklären, wie Sie ein selbstständiges<br />
Projekt in Eclipse <strong>für</strong> die Klassen der Benutzerfreundlichkeit<br />
(Convenience) errichten<br />
und diese mit Ihrem eigentlichen Projekt verbinden,<br />
habe ich mich <strong>für</strong> eine andere Lösung<br />
entschieden. Ich hielt es <strong>für</strong> einfacher,<br />
die Convenience-Klassen in ein Projekt zu<br />
importieren, die ich zuvor <strong>für</strong> eine der Beispielanwendungen<br />
von Facebook eingerichtet<br />
habe. Als Ergebnis hatte ich zwei Pakete<br />
in meinem neuen Projekt: eines <strong>für</strong> die Beispieldateien<br />
und ein anderes mit den Dateien<br />
der Convenience-Klasse. Gehen Sie auch so<br />
vor und benennen Sie das Beispielpaket auf<br />
den Namen Ihrer eigenen Anwendung um.<br />
Das einzige Problem <strong>für</strong> mich war dabei,<br />
dass der Verweis auf eine zeichenbare Ressource<br />
im FbDialog.java nicht aufgelöst werden<br />
konnte. Schließlich habe ich eine Importanweisung<br />
mit dem Namen meiner<br />
neuen Anwendung hinzugefügt und das<br />
Problem war gelöst.<br />
Haben Sie auch die letzte Hürde mit dem<br />
Android-Schlüssel überwunden (siehe Kasten<br />
„Android Key Hash“), dann zögern Sie<br />
nicht weiter und ändern Sie die Beispielanwendungen<br />
je nach Wunsch. Oder studieren<br />
Sie einfach die Funktionen der API, um einige<br />
Facebook-Features in Ihre eigene Anwendung<br />
einzubinden.<br />
Android UI Utilities<br />
Als Nächstes überlegen Sie sich, wie Sie die<br />
Grafiken <strong>für</strong> Ihre Anwendung gestalten.<br />
Dabei sollten Sie nicht nur an die Symbole<br />
Ihrer Anwendung (je eines <strong>für</strong> <strong>alle</strong> Auflösungen,<br />
die Sie unterstützen wollen) denken,<br />
sondern auch auf Grafiken <strong>für</strong> Menüs, Registerkarten<br />
und Benachrichtigungen achten.<br />
Vergessen Sie auch nicht eine hochauflösende<br />
Grafik <strong>für</strong> den Android Market zu erstellen.<br />
Für die Bearbeitung Ihrer Grafiken<br />
könnten Sie natürlich herkömmliche Programme<br />
wie Photoshop oder GIMP verwenden,<br />
aber probieren Sie doch mal das Android<br />
Asset Studio [8] aus.<br />
Asset Studio ist ein Online-Werkzeug, das<br />
viele Funktionen bietet, wie Farbverbesserung,<br />
Farbfüllung, Lesen und <strong>Ein</strong>fügen von<br />
Text, und es sorgt im Allgemeinen da<strong>für</strong>, dass<br />
die Bilder in Ihren Android-Anwendungen<br />
Android Key Hash<br />
Damit Ihre Anwendung sich mit Facebook verständigen<br />
kann, erledigen Sie noch einen weiteren<br />
Integrationsschritt: Auf der Website von<br />
Facebook finden Sie in Ihren App Settings unter<br />
Mobile and Devices ein Feld namens: Android<br />
Key Hash. Geben Sie hier Ihr Zertifikat als Hash-<br />
Schlüssel-Wert ein. Diesen Wert erhalten Sie<br />
laut Anweisungen, indem Sie folgende Befehle<br />
in der Kommandozeile Ihres Rechners ausgeben:<br />
keytool ‐exportcert U<br />
‐alias androiddebugkey U<br />
‐keystore ~/.android/debug.keystore U<br />
| openssl sha1 ‐binary U<br />
| openssl base64<br />
Diese Anweisungen sind zwar korrekt, gelten<br />
aber nur <strong>für</strong> den Fall, dass Sie Ihre Anwendung<br />
gerade entwickeln und in einem Emulator oder<br />
auf Ihrem eigenen persönlichen Gerät testen,<br />
nicht aber bei einer Veröffentlichung im Market.<br />
Dazu exportieren Sie das Zertifikat, das Sie zum<br />
Signieren der Produktiv-Version Ihrer Anwendung<br />
verwenden, das hoffentlich in einem separaten<br />
Keystore unter einem differenten Alias<br />
aufbewahrt wird. Auch wenn Sie Mac oder<br />
Linux verwenden, kann es vorkommen, dass<br />
OpenSSL nicht out of the Box läuft. Unter Linux<br />
installieren Sie OpenSSL sehr einfach mit<br />
einem Befehl wie:<br />
sudo apt‐get install openssl<br />
Unter Windows oder Mac suchen Sie nach<br />
einem Download und installieren die OpenSSL-<br />
Software, damit Sie den Befehl openssl verwenden<br />
können. OpenSSL ist freie Software und <strong>für</strong><br />
sehr viele Plattformen erhältlich, wählen Sie<br />
also die Version aus, die Ihrem System am besten<br />
entspricht.<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 91
Entwicklung<br />
Android-Tools <strong>für</strong> Entwickler<br />
Infos<br />
[1] Eclipse:<br />
http:// www. eclipse. org/<br />
[2] Android-SDK:<br />
http:// <strong>developer</strong>. android.<br />
com/ sdk/ index. html<br />
[3] Android Development Tools:<br />
http:// <strong>developer</strong>. android.<br />
com/ sdk/ eclipse‐adt. html<br />
[4] Guava: http:// code. google.<br />
com/ p/ guava‐libraries/ wiki/<br />
Release08<br />
[5] Guava-Bibliotheken:<br />
http:// code. google. com/ p/<br />
guava‐libraries/<br />
[6] Android Facebook-Bibliothek:<br />
http:// <strong>developer</strong>s.<br />
facebook. com/ docs/<br />
reference/ android<br />
[7] Facebook Entwicklerseite:<br />
http:// <strong>developer</strong>s. facebook.<br />
com<br />
[8] Android Asset Studio:<br />
http:// android‐ui‐utils.<br />
googlecode. com/ hg/<br />
asset‐studio/ dist/ index. html<br />
[9] Suche nach Android-Projekten:<br />
http:// code. google. com/<br />
hosting/ search?<br />
q=label:Android<br />
[10] ZXing: http:// code. google.<br />
com/ p/ zxing/<br />
[11] csipsimple:<br />
http:// code. google. com/ p/<br />
csipsimple/<br />
[12] Subversion-Download:<br />
http:// subversion. apache.<br />
org/ packages. html<br />
[13] ACRA-Bibliothek:<br />
http:// code. google. com/ p/<br />
acra/<br />
Abb. 1: Android Symbole in den gängigen Auflösungen<br />
mit einem Foto von meinem Hund.<br />
einfach gut aussehen. Nach dem Setup klicken<br />
Sie einfach auf Download .ZIP und<br />
laden sich eine ZIP-Datei mit den gewünschten<br />
Bilddateien in den unterschiedlichsten<br />
Auflösungen herunter. Die einzige <strong>Ein</strong>schränkung<br />
besteht darin, dass das Android Asset<br />
Studio eindeutig <strong>für</strong> den Chrome-Browser<br />
optimiert wurde. In anderen Browsern funktioniert<br />
es je nach Lust und Laune.<br />
Das Android Asset Studio hat eingeschränkte<br />
Funktionen in dem Sinne, dass Sie<br />
die Bilder selbst nicht darin erstellen. Sie<br />
kommen also um Photoshop oder GIMP zur<br />
Erstellung des Ausgangsbildes nicht komplett<br />
herum. Aber <strong>für</strong> die fertigen Bilder in den<br />
verschiedenen Auflösungen <strong>für</strong> Ihre Anwendung<br />
verwenden Sie am besten Asset Studio.<br />
Seine einfache Handhabung veranschaulicht<br />
Abbildung 1, als Ergebnis eines Fotos von<br />
meinem Hund Max. Ich habe es ins Asset<br />
Studio hochgeladen und mit einigen einfachen<br />
Tastendrücken in der Mitte eines Kreises<br />
platziert. Anschließend klickte ich einfach<br />
auf Download und fertig waren meine<br />
Bilddateien.<br />
Das Asset Studio ist Teil der Android UI<br />
Utilities. Dazu gehören auch das Pencil-Tool<br />
und die Symbolvorlagen <strong>für</strong> Photoshop. Das<br />
Pencil-Tool ist ein Plugin <strong>für</strong> Firefox, es kann<br />
aber auch selbstständig laufen. Mit diesem<br />
Tool erstellen Sie mit Leichtigkeit Zeichnungen<br />
und insbesondere GUI-Prototypen.<br />
Arbeiten Sie mit Photoshop, dann werden<br />
Sie die Symbolvorlagen <strong>für</strong> sehr nützlich halten.<br />
Die Photoshop-Templates finden Sie auf<br />
dem Reiter Downloads auf der Webseite <strong>für</strong><br />
Android UI Utilities (auch links unten), die<br />
entsprechende Datei finden Sie unter dem<br />
Namen icon_templates.zip.<br />
Noch mehr Android-Projekte<br />
Ich habe Ihnen nur einige Projekte von der<br />
Hostingseite <strong>für</strong> Android-Projekte von<br />
Google vorgestellt, aber Sie finden viel mehr<br />
Projekte hier, und <strong>alle</strong> sind quelloffen. Für<br />
eine detaillierte Suche nach Android-Projekten<br />
verwenden Sie einfach die URL [9] aus<br />
dem Infokasten. Diese Anfrage wird Tausende<br />
von Treffern liefern: Projekte, die in irgendeiner<br />
Weise mit Android in Zusammenhang<br />
stehen; geben Sie weitere Schlüsselwörter<br />
an und verfeinern Sie die Suche nach<br />
Belieben. Das Ergebnis ist eine wahre<br />
Schatztruhe von Anwendungen und Quellcode,<br />
die Sie zur Vertiefung Ihrer Android-<br />
Kenntnisse nutzen können, darunter Klassiker<br />
wie ZXing, die sehr originelle Barcode-<br />
Anwendung [10] oder csipsimple, eine SIP-<br />
Anwendung <strong>für</strong> VoIP-Anrufe [11].<br />
Jede Projektseite ist in mehrere Reiter aufgeteilt.<br />
Hier lernen Sie verschiedene Aspekte<br />
des Projektes kennen: In der Regel gibt es je<br />
einen Reiter <strong>für</strong> den Download, <strong>für</strong> das Wiki,<br />
<strong>für</strong> eine Liste von bereits bekannten Fehlern,<br />
<strong>für</strong> die Dokumentation und <strong>für</strong> den Quellcode<br />
selbst. Normalerweise können Sie den<br />
Quellcode gleich in Ihrem Browser betrachten:<br />
Klicken Sie dazu einfach auf den Reiter<br />
Browse unter Source. In den meisten Fällen<br />
können Sie den Quellcode mit dem Subversion-System<br />
auch direkt auf Ihren lokalen<br />
Rechner herunterladen. Wenn Sie Subversion<br />
noch nicht installiert haben, laden Sie die<br />
entsprechende Version <strong>für</strong> Ihr Betriebssystem<br />
herunter [12]. Für Subversion gibt es übrigens<br />
auch Eclipse-Plugins.<br />
ACRA<br />
Zum Schluss komme ich wieder zu den nützlichen<br />
Bibliotheken zurück und stelle nun<br />
die Absturzberichte vor. Wie Sie vielleicht<br />
wissen, liefert der Android Market zwar einige<br />
Fehlerprotokolle an den Entwickler zurück,<br />
aber diese Informationen sind meistens<br />
Listing 1: ACRA-Erweiterung<br />
@ReportsCrashes(formKey = "your form key<br />
here")<br />
public class MyApplication extends<br />
Application {<br />
@Override<br />
public void onCreate() {<br />
// Folgende Zeile initialisiert ACRA<br />
ACRA.init(this);<br />
super.onCreate();<br />
}<br />
}<br />
92<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Entwicklung<br />
Android-Tools <strong>für</strong> Entwickler<br />
nicht ausführlich genug. Zum Glück hilft hier<br />
die ACRA-Bibliothek weiter [13]. ACRA sendet<br />
die Informationen grundsätzlich an eine<br />
zentrale Stelle, immer wenn Ihre Anwendung<br />
abstürzt. Üblicherweise ist dies ein Spreadsheat<br />
in Google Text & Tabellen, die Sie im<br />
Voraus erstellt haben. Seit Kurzem unterstützt<br />
das Tool aber auch andere Möglichkeiten.<br />
So können Sie ein benutzerdefiniertes<br />
Skript aufrufen oder eine E-Mail erhalten.<br />
Die Implementierung der Google Text & Tabellen-Option<br />
ist ziemlich einfach: Erstellen<br />
Sie zunächst eine Tabelle anhand der da<strong>für</strong><br />
vorgesehenen Schablone in Google Text & Tabellen<br />
unter Ihrem Google-Konto unter Berücksichtigung<br />
des Formularschlüssels.<br />
Fügen Sie dann die Bibliothek Ihrem Projekt<br />
auf ähnliche Weise hinzu, wie ich es Ihnen<br />
bereits bei der Guava-Bibliothek geschildert<br />
habe. Als Nächstes zeigt Listing 1, wie Sie<br />
android.app.Application ergänzen, indem<br />
Sie eine Anmerkung zu ihrer Definition hinzufügen<br />
und die ACRA-Bibliothek in on-<br />
Create() initialisieren. Mit anderen Worten:<br />
Sie fügen eine neue Klasse zu Ihrem Projekt<br />
hinzu, die MyApplication benannt und eine<br />
Subklasse von android.app.Application<br />
wird. Dann können Sie es wie in Listing 1 gestalten.<br />
Da die meisten Benachrichtigungsoptionen<br />
Informationen über das Internet senden,<br />
müssen Sie eine Erlaubnis <strong>für</strong> android.<br />
permission.INTERNET zur AndroidManifest.<br />
xml-Datei hinzufügen. Wenn Sie die Manifest-Datei<br />
editieren, denken Sie daran, gleich<br />
den Namen <strong>für</strong> Ihre Anwendung auf My-<br />
Application zu ändern. Das war’s! Wenn von<br />
nun an Ihre Anwendung auf irgendeinem<br />
Gerät irgendwann abstürzt, entsteht ein<br />
neuer <strong>Ein</strong>trag in Ihrer Tabelle mit detaillierten<br />
Informationen über die Gerätekonfiguration<br />
und natürlich auch zu den <strong>Ein</strong>zelheiten<br />
des Crash. Achten Sie darauf, dass Sie den<br />
Endanwender vor dem Installieren der Anwendung<br />
über die Tatsache in Kenntnis setzen,<br />
dass diese Ereignisse geloggt und über<br />
das Internet versendet werden.<br />
Fazit<br />
Ich habe Ihnen in diesem Artikel eine Auswahl<br />
an interessanten Bibliotheken und<br />
Tools vorgestellt, um Ihre Entwicklungsarbeit<br />
<strong>für</strong> Android zu erleichtern. Wir erleben eine<br />
sehr aufregende Zeit <strong>für</strong> Android-Entwickler<br />
— nutzen Sie die Chance! ● ● ●<br />
Der Autor<br />
Dave MacLean ist IT Enterprise<br />
Architect von Beruf, lebt und arbeitet<br />
in Jacksonville (FL). Als<br />
Absolvent der University of<br />
Waterloo in Systems Design Engineering<br />
im Jahre 1985, arbeitete<br />
er auf dem Gebiet Software-<br />
Entwicklung, darunter auch mehrere<br />
Jahre in Silicon V<strong>alle</strong>y (FMC,<br />
Sun, Trimble Navigation) bevor<br />
er nach Florida zog. Dave ist Mitverfasser<br />
der Bücher Pro Android<br />
2 und Pro Android 3. Sie erreichen<br />
ihn unter davemac327@<br />
gmail.com, oder besuchen Sie<br />
seine Website unter http:// www.<br />
androidbook. com.<br />
4 Hefte<br />
nur<br />
E 26,90<br />
Smart Developer<br />
Alles zum Thema mobile Betriebssysteme<br />
Für Smartphone-Entwickler und Entscheidungsträger<br />
in der mobilen Entwicklung<br />
JETZT auch<br />
als PDF<br />
ErhälTlich!<br />
Meine Vorteile:<br />
+ Ich erhalte vier Ausgaben des Smart<br />
Developer frei Haus <strong>für</strong> e 26,90 statt<br />
e 31,60 (Preise gelten <strong>für</strong> Deutschland)<br />
+ Das Abonnement ist jeder zeit kündbar.<br />
Ich gehe kein Risiko ein<br />
+ Aktuell informiert mit <strong>alle</strong>n Neuigkeiten<br />
rund um Tablets und Smartphones<br />
Jetzt bestellen unter:<br />
www.SmART-DeveloPeR.De/Abo<br />
Telefon 07131 / 2707 274 • Fax 07131 / 2707 78 601 • E-Mail: abo@<strong>smart</strong>-<strong>developer</strong>.de
Power User<br />
WebOS 2.1<br />
©Hewlett-Packard<br />
Die wichtigsten Neuerungen von webOS 2.1<br />
Neues<br />
webOS<br />
Noch im Oktober 2010 kündigte HP die neue webOS-Version 2.0 an, tatsächlich<br />
erhältlich ist sie jedoch erst seit März 2011, da<strong>für</strong> gleich als Version<br />
2.1. Wir haben uns die neue Software angeschaut und zeigen, wie<br />
Sie das Update vornehmen. Marcel Hilzinger<br />
Infos<br />
[1] Offizielle Update-Doku von<br />
HP: http:// www. palm. com/<br />
us/ support/ handbooks/ pre/<br />
webOS_WNWC_de. pdf<br />
[2] WebOS-SDK <strong>für</strong> Linux:<br />
http:// <strong>developer</strong>. palm. com/<br />
index. php? option=com_con<br />
tent& view=article& id=1585<br />
Die wichtigsten Neuerungen von<br />
webOS 2.1 sind „Just Type“ <strong>für</strong><br />
die schnelle Suche oder Nachrichtenerstellung,<br />
das Stapeln bzw.<br />
Gruppieren von Karten und die neuen Kontoeinstellungen.<br />
Bei der Account-Verwaltung<br />
bringt webOS deutliche Vorteile gegenüber<br />
Android oder iOS mit, da Sie bei webOS <strong>für</strong><br />
praktisch <strong>alle</strong> Accounts separat festlegen<br />
können, welche Komponenten (Adressbuch,<br />
Termine, Notizen, etc) Sie synchronisieren<br />
möchten. Komplett neu in der aktuellen<br />
webOS-Version ist zudem der Support <strong>für</strong><br />
VPN-Verbindungen und der Präsentationsmodus<br />
im Zusammenspiel mit dem Touchstone-Ladegerät.<br />
Legen Sie das Smartphone<br />
auf den Ladestein, schaltet es sich automatisch<br />
in diesen Modus um, der in der Grundeinstellung<br />
eine Uhr anzeigt.<br />
Der Textassistent<br />
Schreiben Sie ab und zu in Fremdsprachen<br />
oder benutzen Sie oft Slang-Ausdrücke, dann<br />
dürften Sie auch schnell über den neuen<br />
Textassistenten stolpern. Er korrigiert Wörter<br />
direkt bei der <strong>Ein</strong>gabe, was bei der ersten<br />
Anwendung <strong>für</strong> etwas Verwirrung sorgen<br />
kann. Die geänderten Begriffe lassen sich<br />
zum Glück per Antippen zurückändern und<br />
dem eigenen Wörterbuch hinzufügen. Kommen<br />
Sie mit der Autokorrektur gar nicht klar,<br />
dann können Sie die einzelnen Funktionen<br />
im Textassistenten auch ausschalten. An gleicher<br />
Stelle bearbeiten Sie auch das Benutzerwörterbuch.<br />
<strong>Ein</strong> Import ist leider nicht möglich.<br />
Praktisch sind auch die Kürzel <strong>für</strong> feste<br />
Textbausteine in E-Mails, Nachrichten und<br />
anderen Anwendungen.<br />
Obwohl HP die Bedienung des Telefons und<br />
des Adressbuchs durch Favoriten etwas erleichtert<br />
hat, gehört die Kontaktverwaltung<br />
weiterhin nicht zu den benutzerfreundlichsten<br />
im Smartphone-Feld.<br />
Just Type<br />
Bei „Just Type“ handelt es sich um mehr als<br />
eine bloße Schnellsuche. Wie der Name bereits<br />
sagt, muss man sich in vielen Fällen erst<br />
nach dem Schreiben Gedanken darüber machen,<br />
was aus einem Text werden soll. Unter<br />
webOS 2.1 beginnt man einfach zu tippen<br />
und entscheidet sich quasi während des<br />
Tippvorgangs, ob man eine Twitter-Nachricht<br />
senden, seinen Facebook-Status aktualisieren<br />
oder nach einer App im App Catalog suchen<br />
möchte. Dabei sind die verknüpften Aktionen<br />
in die zwei Gruppen „Starten und Suchen“<br />
und „Schnellaktionen“ unterteilt. Über<br />
eine Schnellaktion legen Sie zum Beispiel<br />
einen neuen Termin an oder versenden eine<br />
Nachricht. Sämtliche Aktionen lassen sich<br />
anpassen und um eigene <strong>Ein</strong>träge ergänzen.<br />
Karten sortieren<br />
Die zweite wichtige Neuerung, die auch in<br />
webOS 3.0 als großes Feature angepriesen<br />
wurde, betrifft die Kartenansicht von webOS.<br />
Klicken Sie zum Beispiel im Browser auf<br />
einen Link mit target="_blank", dann öffnet<br />
webOS dazu eine neue Karte. Diese bündelt<br />
das OS aber automatisch mit der bereits offenen<br />
Karte, sodass sogenannte Stacks entstehen.<br />
Die Stacks sind App-unabhängig, man<br />
kann sich somit auch einen Stack mit einem<br />
Spiel, einer Webseite und einem Chat-Programm<br />
zusammenstellen. Auch wenn dieses<br />
94<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Power User<br />
WebOS 2.1<br />
Feature in erster Linie<br />
auf Tablets von großem<br />
Vorteil ist, vereinfacht<br />
es auch die Arbeit<br />
unter webOS auf<br />
einem Smartphone.<br />
Die vorgegebenen<br />
Karten <strong>für</strong> Anwendungen,<br />
Extras und System<br />
lassen sich zudem beliebig<br />
umbenennen, löschen,<br />
verschieben<br />
oder durch weitere ergänzen.<br />
Das bisherige<br />
Limit der drei Startseiten<br />
entfällt somit.<br />
Abb. 1: Die Funktion „Just type“<br />
Lohnt sich das<br />
Update?<br />
Die <strong>für</strong> den Sommer<br />
angekündigten Tablets und neuen webOS-<br />
Smartphones liefert Hewlett-Packard bereits<br />
mit webOS 3.0 aus. Wann und ob das Pre<br />
Plus bzw. das Pixie Plus überhaupt in den<br />
Genuss von webOS 3.0 kommen werden,<br />
steht zurzeit noch nicht fest. Insofern ist das<br />
Update mit seinen Features zum aktuellen<br />
Zeitpunkt eine gute Wahl. <strong>Ein</strong>e echte Performance-Verbesserung<br />
dürfen Sie hingegen<br />
nicht erwarten. Zudem haben mit der neuen<br />
Version auch einige Fehler den Weg in<br />
bietet mehr als eine bloße Schnellsuche<br />
bei Google & Co.<br />
Abb. 2: Die Stapel erleichtern die<br />
Navigation bei vielen geöffneten<br />
Karten und sorgen <strong>für</strong> Ordnung.<br />
webOS gefunden: So beklagte sich unser Pre-<br />
Plus-Testgerät zuweilen über Verbindungsprobleme<br />
mit dem Google-Account. Hier hilft<br />
es, den bestehenden Account zu löschen und<br />
neu anzulegen. Die Probleme treten nur bei<br />
Benutzern auf, die über einen Gmail- und<br />
einen Googlemail-Account verfügen. Zudem<br />
funktionieren auch einige Apps nicht mehr<br />
mit der neuen webOS-Version, zum Beispiel<br />
der bislang einzige halbwegs brauchbare QR-<br />
<strong>Code</strong>-Scanner QRdeCODEr. <br />
● ● ●<br />
Abb. 3: Der Präsentationsmodus<br />
schaltet sich ein, sobald Sie das Pre<br />
auf den Touchstone legen.<br />
WebOS-Update<br />
Abb. 4: Während des Firmware-Upgrades darf die USB-Verbindung nicht abbrechen, sonst<br />
droht Datenverlust. Im schlimmsten Fall wird das Handy sogar unbenutzbar.<br />
o2 Deutschland liefert seit Februar das Update auf webOS 2.1 aus.<br />
Allerdings kommt es bei den meisten Geräten nicht automatisch<br />
over the air an, sondern muss manuell heruntergeladen werden<br />
(Stand April 2011). Besitzen Sie ein Palm Pre Plus oder Pixie Plus,<br />
dann gehen Sie wie folgt vor, um Ihr Smartphone auf webOS 2.1<br />
aufzufrischen:<br />
Öffnen Sie im Browser die Seite palm. com/ rom und scrollen Sie<br />
nach unten, um eine detaillierte Anleitung in Englisch <strong>für</strong> das Update<br />
zu erhalten. Das Update erfolgt im Wiederherstellungsmodus<br />
des Palm-Smartphones über die Java-Software webOS Doctor.<br />
Das Upgrade funktioniert unter Windows, Mac OS (10.5 und 10.6)<br />
und Linux. Linux-Benutzer benötigen neben der Java-Software das<br />
Paket palm‐novacom, das Teil des WebOS-SDK <strong>für</strong> Linux ist [2]. Die<br />
Seriennummer finden Sie auch auf Ihrem Palm unter System | Geräteinfos<br />
| Seriennummer. Der komplizierte Schritt über das Netzteil<br />
ist deshalb nötig, weil das Smartphone vor dem Update komplett<br />
geladen wird.<br />
Hat <strong>alle</strong>s geklappt, dann erscheint beim Loslassen<br />
des Lautstärke-Buttons (lauter) ein USB-<br />
Symbol und Sie können nun den webOS-Doctor<br />
starten und den Anweisungen im Java-Programm<br />
folgen (Abbildung 4). Nach dem<br />
Flash en der Firmware muss das Smartphone<br />
neu gestartet werden. Das Pre Plus/Pixie Plus<br />
zeigt dann anstelle des bisherigen Palm-Logos<br />
das HP-Logo an.<br />
Beachten Sie beim Update, dass Sie sich neu an<br />
Ihrem Palm-Account anmelden müssen und<br />
dass dieser Vorgang nur über das Datennetz<br />
funktioniert, aber nicht per WLAN. Zudem spielt<br />
webOS dann auch sogleich die Daten aus dem<br />
Backup wieder ein. Wenn Sie sich gerade im<br />
Ausland befinden, müssen Sie somit mit Roaming-Kosten<br />
rechnen.<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 95
PowerUser<br />
Mobile Benchmarks<br />
Benchmark-Programme <strong>für</strong> Android und iOS<br />
Volle<br />
Leistung<br />
Wer ein Smartphone<br />
kauft, muss sich dabei<br />
nicht nur <strong>für</strong> eine Plattform<br />
entscheiden, sondern<br />
auch die Leistung<br />
des zukünftigen Rennpferds<br />
einschätzen können.<br />
Benchmarks helfen<br />
dabei. René Hesse<br />
Viktor Gmyria, 123rf.com<br />
Abb. 1: AnTuTus System Benchmark<br />
testet auch die Performance von<br />
Micro-SD-Karten.<br />
Abb. 2: Linpack gibt es nicht nur in<br />
der hier gezeigten iOS-Version, sondern<br />
auch <strong>für</strong> Android.<br />
Wie wichtig ist eine große Auswahl<br />
an Apps? Welche Display-Diagonale<br />
gefällt am besten?<br />
Benötigt man eine Hardware-Tastatur<br />
und braucht man bereits einen<br />
Dual-Core-Prozessor? Alle diese Dinge können<br />
am Ende entscheidend bei der täglichen<br />
Nutzung eines Smartphones sein. Doch<br />
woher soll man Anhaltspunkte, <strong>für</strong> die Leistungsfähigkeit<br />
eines Smartphones nehmen?<br />
<strong>Ein</strong> iPhone mit einem Android-Smartphone<br />
zu vergleichen, ist gar nicht so einfach, wie<br />
man sich das vorstellt. Durch die unterschiedlichen<br />
Betriebssysteme und deren teilweise<br />
tiefgreifende Anpassung an die Hardware,<br />
können sich Leistungsunterschiede ergeben,<br />
welche sich nicht von den reinen<br />
technischen Daten ableiten lassen.<br />
Mit Benchmarks vergleichen<br />
Hier kommen die Benchmarks ins Spiel.<br />
Diese sollen einen Vergleich der Rechenkraft<br />
sowie der Grafikleistung verschiedener Geräte<br />
ermöglichen. Innerhalb einer Plattform<br />
ist dies auch problemlos möglich. So lassen<br />
sich zum Beispiel verschiedene Android-Geräte<br />
untereinander mittlerweile sehr gut ver-<br />
gleichen. Will man aber die Leistung eines<br />
iPad mit einem Android-Tablet vergleichen,<br />
wird die Aufgabe schon schwieriger.<br />
Wer mit einem Grafik-Benchmark die 3D-<br />
Leistung eines Gerätes messen will, sollte<br />
zum Beispiel bedenken, dass hier je nach<br />
Benchmark auch die Displayauflösung einen<br />
entscheidenden Punkt ausmacht. So kann es<br />
durchaus vorkommen, dass ein Gerät mit<br />
schwacher CPU und niedriger Displayauflösung<br />
besser abschneidet, als ein Gerät mit<br />
einem hochauflösenden Display und starker<br />
CPU. So müssen zum Beispiel bei der Auflösung<br />
HVGA (320 x 480 Pixel) nur 153'600<br />
Pixel berechnet werden. Aktuelle Smartphones,<br />
die mit einem WVGA-Display ausgestattet<br />
sind (480 x 800 Pixeln), müssen hingegen<br />
384'000 Pixel berechnen.<br />
Die folgenden Programme haben sich in<br />
den letzten Monaten bewährt, um einen haltbaren<br />
Anhaltspunkt <strong>für</strong> die Leistungsfähigkeit<br />
von mobilen Geräten zu erhalten. Dabei<br />
ist in jedem Fall zu beachten, dass die gefühlte<br />
Geschwindigkeit des Nutzers, erheblich<br />
von der gemessenen abweichen kann.<br />
Gerade bei den Top-Smartphones und Tablets<br />
liefern die Benchmarks manchmal Resultate,<br />
96<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
PowerUser<br />
Mobile Benchmarks<br />
die sich nur um Millisekunden unterscheiden.<br />
Zudem können weitere Faktoren die<br />
Testergebnisse beeinflussen.<br />
Quadrant und An3DBenchXL<br />
Der Quadrant-Benchmark [1] ist einer der ältesten,<br />
den es <strong>für</strong> Android gibt, leider auch<br />
einer der ungenauesten. Er erlaubt eine recht<br />
grobe Unterteilung der Leistungsfähigkeit,<br />
die sich <strong>alle</strong>rdings durch spezielle Werte in<br />
alternativen ROMs beeinflussen lässt.<br />
An3DBenchXL [2] nutzt die Android-Version<br />
der jPCT 3D-Engine, um die Leistungsfähigkeit<br />
eines Smartphones zu ermitteln. Die<br />
Werte beziehen sich zwar hauptsächlich auf<br />
die grafischen Berechnungen, dennoch liefern<br />
die Ergebnisse (Abbildung 1) recht realitätsnahe<br />
Zahlen, die man <strong>für</strong> einen direkten<br />
Vergleich heranziehen kann.<br />
Smartbench 2011<br />
Das Benchmark-Programm Smartbench [3]<br />
ist 2011 in einer neuen Version erschienen,<br />
welche nicht nur neue Messungen ermöglicht,<br />
sondern durch Multicore-Unterstützung<br />
auch erstmals realistische Werte zum Vergleich<br />
von Single- und Multicore-Geräten bietet.<br />
Wer bereits die alte 2010er-Version benutzt<br />
hat, muss den Benchmark nochmal<br />
komplett neu durchlaufen lassen, da sich die<br />
Berechnungen grundlegend geändert haben.<br />
Unter http:// <strong>smart</strong>phonebenchmarks. com lassen<br />
sich diverse Werte von verschiedenen<br />
Geräten einsehen. Generell wird in die Bereiche<br />
Produktivität und Gaming unterteilt.<br />
System Benchmark<br />
Der System Benchmark von AnTuTu [4] ist<br />
eine ansprechend umgesetzte App, die nicht<br />
nur die CPU-Leistung sowie die 2D- und<br />
3D-Grafik, sondern auch die Geschwindigkeit<br />
der SD-Karte testet. Es gibt einen Online-<br />
Vergleich direkt im Programm und Filteroptionen,<br />
welche es erlauben, nur die Werte<br />
bestimmter Modelle anzuzeigen. Den<br />
System Benchmark gibt es nur <strong>für</strong> Android<br />
(Abbildung 1).<br />
Linpack<br />
Der Linpack-Benchmark [5], [6] ist einer der<br />
wenigen Tests, der einen direkten Vergleich<br />
von Android und iOS-Geräten ermöglicht.<br />
Hier wird anhand mathematischer Formeln<br />
die Rechenkraft in Megaflops ausgegeben,<br />
was zudem eine einheitliche Größe <strong>für</strong> die<br />
Leistung von Prozessoren ist. Somit lassen<br />
sich die Werte auch mit den Resultaten eines<br />
Desktop-PCs oder eines Notebooks vergleichen,<br />
nicht nur zwischen iOS und Android.<br />
SunSpider und BrowserMark<br />
Da bekanntlich die Browser von iOS-und Android-Geräten<br />
auf der WebKit-Engine basieren,<br />
erlaubt WebKit einen plattformübergreifenden<br />
Vergleich der beiden Betriebssysteme.<br />
Mit der Hilfe von SunSpider – einer Benchmark-Suite<br />
zum Testen der Geschwindigkeit<br />
von JavaScript-Implementierungen – kann<br />
man so ermitteln, wie die Systemleistung im<br />
Browser Anwendung findet. Auch wenn der<br />
SunSpider-Benchmark [7] nicht in erster<br />
Linie dazu dient, plattformübergreifend die<br />
Leistung eines Smartphones beurteilen zu<br />
können, sondern in erster Linie die Performance<br />
der jeweiligen WebKit-Implementierung<br />
misst, gibt er somit ansatzweise auch<br />
Informationen zu der darunter werkelnden<br />
Hardware aus.<br />
Ähnlich wie SunSpider funktioniert auch<br />
BrowserMark [8]. Der Test liefert aber dabei<br />
etwas andere Ergebnisse als sein Vorbild.<br />
Auch BrowserMark führt seine verschiedenen<br />
Belastungstests über JavaScript durch,<br />
sodass er sich unabhängig vom eingesetzten<br />
Betriebssystem nutzen lässt. Neben der frei<br />
verfügbaren Version gibt es auch eine Corporate-Variante<br />
mit Akkutest.<br />
Speedtest.net<br />
Auch nicht unwichtig im Alltag ist die Geschwindigkeit<br />
der Netzwerkverbindung.<br />
Speedtest.net (Abbildung 3) gehört zu den<br />
meist benutzten Programmen, wenn es um<br />
die Messung der Download- und Upload-Raten<br />
geht. Das Tool ist <strong>für</strong> Android und iOS<br />
verfügbar [9], [10] und seine Messungen<br />
sind recht zuverlässig. Es besteht die Möglichkeit,<br />
einen Server in seiner Nähe auszuwählen<br />
und sich die Verbindungsstabilität<br />
anzeigen zu lassen. Benutzen Sie das Tool<br />
über WLAN, erhalten Sie einen guten <strong>Ein</strong>druck<br />
von der Leistungsfähigkeit des verbauten<br />
WLAN-Chipsatzes bzw. Ihres Routers, je<br />
nach Hardware.<br />
Wer misst, …<br />
Trotz im Internet veröffentlichter Spitzenergebnisse<br />
bei gewissen Tests sollten Sie sich<br />
beim Kauf eines Smartphones nie bloß auf die<br />
Werte von Benchmarks verlassen, sondern<br />
sich nach Möglichkeit stets ein persönliches<br />
Bild vom Gerät machen. Für den Vergleich<br />
unter Freunden eignen sich die hier vorgestellten<br />
Tools aber <strong>alle</strong>mal. Last but not least eignen<br />
sie sich gut, um eventuelle Performance-<br />
Schwachstellen aufzuspüren und durch gut<br />
angepasste Software zusätzliche Leistungsreserven<br />
freizusetzen – auch nach dem Kauf<br />
eines neuen Smartphones. ● ● ●<br />
Abb. 3: Für iOS und Android bietet<br />
Speedtest.net eigene Apps an.<br />
Infos<br />
[1] Quadrant:<br />
https:// market. android. com/<br />
details? id=com.<br />
aurorasoftworks. quadrant.<br />
ui. standard<br />
[2] An3DBenchXL: https://<br />
market. android. com/ details?<br />
id=com. threed. jpct. benchxl<br />
[3] Smartbench: https:// market.<br />
android. com/ details? id=com.<br />
<strong>smart</strong>bench. eleven<br />
[4] System Benchmark:<br />
https:// market. android. com/<br />
details? id=com. antutu.<br />
ABenchMark<br />
[5] Linpack <strong>für</strong> Android:<br />
https:// market. android. com/<br />
details? id=com.<br />
greenecomputing. linpack<br />
[6] Linpack <strong>für</strong> iOS:<br />
http:// itunes. apple. com/ de/<br />
app/ linpack/ id380883195<br />
[7] SunSpider:<br />
http:// www. webkit. org/ perf/<br />
sunspider/ sunspider. html<br />
[8] BrowserMark: http://<br />
browsermark. rightware.<br />
com/ browsermark/ index.<br />
action<br />
[9] Speedtest <strong>für</strong> Android:<br />
https:// market. android. com/<br />
details? id=org. zwanoo.<br />
android. speedtest<br />
[10] Speedtest <strong>für</strong> iOS:<br />
http:// itunes. apple. com/ de/<br />
app/ speedtest‐netmobile‐speed/<br />
id300704847<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 97
SErvice<br />
Impressum<br />
2011 — 08 — 25<br />
higyou, 123RF<br />
Ausgabe 03/2011 von Smart Developer erscheint<br />
am 25. August und bringt unter anderem<br />
Artikel zu Adobe Flex, Geo-Daten unter<br />
iOS, Bing mit Windows Phone 7, Android-<br />
Entwicklung und zum Mobile Payment.<br />
Bestellen Sie jetzt ein Abo unter<br />
www.<strong>smart</strong>-<strong>developer</strong>.de/Abo,<br />
um keine Ausgabe zu verpassen!<br />
Wir sind zudem ständig auf der<br />
Suche nach Autoren und interessanten<br />
Artikeln rund ums Thema<br />
mobile Betriebssysteme. Sie müssen über<br />
keine Schreibtalente verfügen, aber Sie müssen<br />
uns etwas erzählen wollen, das Sie besonders<br />
interessant finden: <strong>Ein</strong>e tolle App,<br />
die Sie nutzen oder sogar selbst programmiert<br />
haben, undokumentierte Features oder<br />
besondere Techniken, um eine Anwendung<br />
zu entwickeln oder ein besonderes Projekt.<br />
Sie erreichen uns unter der E-Mail-Adresse:<br />
redaktion@<strong>smart</strong>-<strong>developer</strong>.de<br />
HEFT-DVD Service<br />
Unsere Datenträger werden mit größter<br />
Sorgfalt zusammengestellt und vor der<br />
Produktion auf Fehler geprüft. Dennoch<br />
kann es bedingt durch die Produktionsprozesse<br />
im Presswerk, beim Vertrieb<br />
oder bei der Zustellung durch die<br />
Post zu beschädigten oder fehlerhaften<br />
Datenträgern kommen. Hegen Sie den<br />
Verdacht, dass der Datenträger defekt<br />
ist, dann nehmen Sie bitte über die Adresse<br />
cdredaktion@<strong>smart</strong>-<strong>developer</strong>.de<br />
Kontakt mit der Redaktion auf. Ist der<br />
Datenträger tatsächlich beschädigt, erhalten<br />
Sie von uns umgehend und unentgeltlich<br />
einen neuen zugestellt.<br />
MARKEN/ WARENZEICHEN<br />
Sämtliche Marken, eingetragene Warenzeichen<br />
und Produkt namen sind Eigentum des<br />
jeweiligen Inhabers. Sollten wir ein Markenoder<br />
Warenzeichen irrtümlich benutzt oder<br />
einen Copyright-Hinweis übersehen haben,<br />
teilen Sie uns das bitte per E-Mail an<br />
redaktion@<strong>smart</strong>-<strong>developer</strong>.de mit, damit wir<br />
den <strong>Ein</strong>trag korrigieren können.<br />
Impressum<br />
Smart Developer ist eine Publikation der<br />
Linux New Media AG<br />
Putzbrunner Str. 71<br />
81739 München<br />
Tel.: +49 (089) 99 34 110<br />
Fax: +49 (089) 99 34 11 99<br />
Homepage<br />
http://www.<strong>smart</strong>-<strong>developer</strong>.de<br />
E-Mail<br />
Redaktion: <br />
Abo: <br />
Chefredakteur (v. i. S. d. P.)<br />
Marcel Hilzinger<br />
<br />
Redaktion<br />
Joe Casad, Rikki Kite, Rita Sooby,<br />
Thomas Leichtenstern<br />
Datenträgerproduktion<br />
Thomas Leichtenstern<br />
Autoren dieser Ausgabe<br />
Benjamin Nitschke, Dave MacLean, Heiko Kalista,<br />
Joachim Sieber, Jochen Heizmann, Joe Brockmeier,<br />
Lauren Darcy, Marcel Hil zinger, René Hesse,<br />
Roman Bucher, Roy Suttan, Shane Conder,<br />
Sulamita Garcia, Tam Hanna, Thomas Leichtenstern,<br />
Tobias Thiel, Vincze-Aron Szabo<br />
Layout<br />
Kristina Fleischer<br />
Titelgestaltung<br />
Judith Erb<br />
Bildnachweis<br />
sxc.hu, 123rf.com, fotolia.de und andere<br />
Sprachlektorat<br />
Astrid Hillmer-Bruer, Elke Knitter<br />
Übersetzungen<br />
Ákos Tóth, Thomas Prager<br />
Produktionsleitung<br />
Christian Ullrich <br />
Druck<br />
Vogel Druck und Medienservice GmbH & Co. KG,<br />
97204 Höchberg<br />
Geschäftsleitung<br />
Brian Osborn (Vorstand)<br />
<br />
Hermann Plank (Vorstand)<br />
<br />
Anzeigenleitung<br />
Hubert Wiest <br />
Marketing und Vertrieb<br />
Tel.: +49 (0)89 / 99 34 11 23<br />
Fax: +49 (0)89 / 99 34 11 99<br />
Mediaberatung<br />
D / A / CH<br />
Petra Jaser <br />
Tel.: +49 (0)89 / 99 34 11 24 • Fax: +49 (0)89 / 99 34 11 99<br />
UK / Ireland<br />
Penny Wilby <br />
Tel.: +44 (0)1787 211 100<br />
USA<br />
Ann Jesse <br />
Tel.: +1 785 841 8834<br />
Joanna Earl <br />
Tel.: +1 785 727 5275<br />
Es gilt die Anzeigenpreisliste vom 01.01.2011.<br />
Abonnentenservice<br />
Lea-Maria Schmitt <br />
D / A / CH<br />
Telefon: +49 (0)7131 27 07-274<br />
Fax: +49 (0)7131 27 07-78-601<br />
Smart Developer Deutschland Österreich Schweiz Europa<br />
<strong>Ein</strong>zelheft- <strong>Ein</strong>zelpreis und 7,90 Abopreise Euro 8,70 D,A,CH Euro 15,80 und Sfr EU 10,25 Euro<br />
Jahresabo* 26,90 Euro 29,90 Euro 53,90 Sfr 33,90 Euro<br />
*Smart Developer erscheint viermal jährlich<br />
Schüler- und Studentenermäßigung: 20 Prozent<br />
gegen Vorlage eines Schülerausweises oder<br />
einer aktuellen Immatrikulationsbescheinigung.<br />
<strong>Ein</strong>e Haftung <strong>für</strong> die Richtigkeit von Veröffentlichungen<br />
kann – trotz sorgfältiger Prüfung durch<br />
die Redaktion – vom Verlag nicht übernommen<br />
werden. Mit der <strong>Ein</strong>sendung von Manuskripten<br />
oder Leserbriefen gibt der Verfasser seine <strong>Ein</strong>willigung<br />
zur Veröffent lich ung in einer Publikation der<br />
Linux New Media AG. Für unverlangt eingesandte<br />
Manuskripte oder Beiträge übernehmen Redaktion<br />
und Verlag keinerlei Haftung.<br />
Autoreninfos<br />
Die Redaktion behält sich vor, <strong>Ein</strong>sendungen zu<br />
kürzen und zu überarbeiten. Das exklusive Urheber-<br />
und Verwertungsrecht <strong>für</strong> angenommene<br />
Manus kripte liegt beim Verlag. Es darf kein Teil des<br />
Inhalts ohne schriftliche Genehmigung des Verlags<br />
in irgendeiner Form vervielfältigt oder verbreitet<br />
werden.<br />
Copyright © 1999 - 2011 Linux New Media AG<br />
ISSN: 2191-5199<br />
98<br />
02/2011 <strong>smart</strong>-<strong>developer</strong>.de
Smart Developer<br />
Alles zum Thema mobile Betriebssysteme<br />
Für Smartphone-Entwickler und Entscheidungsträger<br />
4 Hefte<br />
nur<br />
E 26,90<br />
JETZT auch<br />
als PDF<br />
ErhälTlich!<br />
Jetzt bestellen unter:<br />
Meine Vorteile:<br />
+ Ich erhalte vier ausgaben des <strong>smart</strong><br />
<strong>developer</strong> frei Haus <strong>für</strong> e 26,90 statt<br />
e 31,60 (preise gelten <strong>für</strong> deutschland)<br />
+ das abonnement ist jeder zeit kündbar.<br />
Ich gehe kein risiko ein<br />
+ aktuell informiert mit <strong>alle</strong>n Neuigkeiten<br />
rund um tablets und <strong>smart</strong>phones<br />
www.<strong>smart</strong>-<strong>developer</strong>.de/abo<br />
Telefon 07131 / 2707 274 • Fax 07131 / 2707 78 601 • E-Mail: abo@<strong>smart</strong>-<strong>developer</strong>.de
SM<br />
Intel AppUp <strong>developer</strong> program –<br />
einfach profitieren<br />
Apps und Spiele <strong>für</strong> Tablets sowie Netbooks erstellen, portieren und verkaufen:<br />
Jetzt ganz einfach. Wir bieten Entwicklern eine zukunftsorientierte Plattform mit<br />
vielen Fördermöglichkeiten und fairer Umsatzbeteiligung – nutzen Sie die Chance,<br />
sich in einem wachsenden Markt zu positionieren und steigern Sie den Absatz<br />
Ihrer Portierungen sowie Neuentwicklungen.<br />
Hier können Sie sich anmelden und erhalten weitere Informationen:<br />
app<strong>developer</strong>.intel.com<br />
Alle Infos unter<br />
http://app<strong>developer</strong>.intel.com/en-us/join<br />
Melde dich an beim<br />
Intel and Intel AppUp are trademarks of Intel Corporation in the U.S. and/or other countries.