26.02.2014 Aufrufe

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.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!