You are on page 1of 84

02/2009 (170)

SPIS TREŚCI
06 Aktualności WARSZTATY
Rafał Kocisz
26 Aplikacje desktopowe – Ext GWT (GXT)
33 Opis CD jako środowisko do tworzenia bogatych
Duży zbiór materiałów do programowania urządzeń mobilnych. interfejsów użytkownika w przeglądarce WWW
Rafał Pietrasik
Do niedawna w interfejsach opierających się na przeglądarce uzy-
BIBLIOTEKA MIESIĄCA skanie pełnej funkcjonalności, którą oferowały aplikacje oparte na
12 OpenCV: komputerowa wizja w praktyce grubym kliencie, było bardzo trudne, jeśli wręcz nie niemożliwe.
Rafał Kocisz Środowisko GWT w połączeniu z biblioteką Ext GWT zmieniają dia-
Czy komputer może widzieć podobnie jak człowiek? Czy komputerowa metralnie ten stan rzeczy. W artykule autor pokazuje jak łatwo jest
wizja to mit czy rzeczywistość? Na te, oraz inne pytania można znaleźć stworzyć taką aplikację.
odpowiedz, czytając poniższy artykułu traktujący o wyjątkowej bibliote-
ce wywodzącej się z laboratoriów firmy Intel.
34 Wykładnicze mapy cieni – charakterystyka
i implementacja algorytmu miękkich cieni
JĘZYKI PROGRAMOWANIA w grafice komputerowej czasu rzeczywistego
18 Oracle CEP – złożone przetwarzanie zdarzeń Paweł Rohleder
Waldemar Kot Mapy cieni są najczęściej wykorzystywaną techniką cieniowania w
Complex Event Processing (CEP) to jedna z technik przetwarzania zda- grach komputerowych. W niniejszym artykule postaram się przybli-
rzeń w aplikacjach zdarzeniowych, posługujących się paradygmatem żyć technikę map cieni oraz zaimplementować algorytm miękkich
nasłuchuj-i-odpowiedz (ang. listen-and-respond), czyli takich, w których cieni przy wykorzystaniu HLSL i biblioteki DirectX 9.0.
logika biznesowa jest uruchamiana w wyniku pojawienia się określo-
nego zdarzenia.
PROGRAMOWANIE
20 jQuery i ASP.NET – wprowadzenie
URZĄDZEŃ MOBILNYCH
do biblioteki z przykładami w ASP.NET AJAX 40 PKI na urządzeniach mobilnych
Łukasz Szewczak – autoryzacja i uwierzytelnianie użytkowników
Otwarta biblioteka JavaScript jQuery sprawia, że pisanie kodu po Leszek Siwik, Krzysztof Lewandowski, Adam Woś
stronie klienta staje się przyjemniejsze, a dzięki połączeniu jQu- W artykule autorzy przyglądają się implementacji PKI na urządze-
ery z technologią ASP .NET AJAX otrzymujemy potężny, efektyw- niach mobilnych, na przykładzie wdrożenia w jednej z polskich służb
ny szkielet aplikacyjny do pisania aplikacji ajaksowych. Łukasz mundurowych. Tłumaczą, co to LAP i LASS, dlaczego łatwo jest uży-
Szewczak wprowadza nas do biblioteki z przykładami ASP.NET wać CSP oraz jakie niespodzianki czekają na piszących oprogramo-
AJAX. wanie na karty SIM

Miesięcznik Software Developer’s Journal (12 numerów w roku) Le périodique


Adres hakin9 est publié par
korespondencyjny:
jest wydawany przez Software-Wydawnictwo Sp. z o.o. o.o.
Software-Wydawnictwo Sp. z o.o.,
Bokserska,
ul. 02-682
Bokserska Varsovie,
1, 02-682 Pologne
Warszawa, Polska
Dyrektor wydawniczy: Anna Adamczyk Tél.+48
tel. +4822
22427
887361091,
10,fax
Fax. +48
+48 2222 887
224 2410
5911
www.phpsolmag.org cooperation@software.com.pl
Junior Market Manager: Anna Adamczyk
Directeur de la publication : Jarosław Szumski
Senior Product Manager: Katarzyna Juszczyńska Dział reklamy: adv@software.com.pl
Prenumerata: Marzena Dmowska
Imprimerie, photogravure pren@software.com.pl,
: 101 Studio, Firma Tęgi
Redaktor naczelny: Łukasz Łopuszański lukasz.lopuszanski@software.com.pl tel. +48 22 42730/36,
Ekonomiczna 36 79;93-426
+48 22Łódź
427 36 53
Imprimé en Pologne/Printed in Poland
Kierownik produkcji: Marta Kurpiewska marta.kurpiewska@software.com.pl Dołączoną do magazynu płytę CD przetestowano programem AntiVirenKit firmy
G DATA Software
Abonnement Sp. métropolitaine,
(France z o.o. DOM/TOM) : 1 an
(soit 6 numéros) 38 €
Projekt okładki: Agnieszka Marchocka Redakcja dokłada wszelkich starań, by publikowane w piśmie i na towarzyszących mu
nośnikach
Dépôt légal informacje i programy były poprawne, jednakże nie bierze odpowiedzialności
: à parution
Skład i łamanie: Grzegorz Laskowski grzegorz.laskowski@software.com.pl za
ISSNefekty wykorzystania ich; nie gwarantuje także poprawnego działania programów
: 1731-7037
shareware,
Distribution freeware
: MLP i public domain.
Wyróżnieni betatesterzy: Ł. Lechert Parc d’activités de Chesnes, 55 bd de la Noirée
BP 59 F - 38291 SAINT-QUENTIN-FALLAVIER CEDEX
(c) 2005 Software-Wydawnictwo, tous les droits réservés
Nakład: 6 000 egz. Uszkodzone podczas wysyłki płyty wymienia redakcja.

4 02/2009
Programowanie urządzeń mobilnych

44 Mobilny magazyn – łamigłówki architektoniczne 66 Android vs. Java ME


Rafał Deja Albert Wachowicz
Autor przedstawia dylematy związane z doborem właściwej archi- Platforma Sun dla urządzeń mobilnych istnieje już od dłuższego cza-
tektury systemu komputerowego do obsługi magazynu. Zadaniem su. Podbiła rynek dzięki implementacji na wielu urządzeniach róż-
jest przeniesienie wybranych procesów logistycznych na urządzenia nych producentów (obecnie istnieje około 2000 różnych typów mo-
mobilne przy równoczesnej integracji z tradycyjnym systemem za- deli z Java ME). Główną ideą Sun było zapewnienie uniwersalności i
rządzania magazynem a szerzej z systemem klasy ERP. jednolitości aplikacji wytworzonych na platformę Java ME.

46 Jak to się robi w Krakowie FELIETON


Kamil Kowalski, Artur Chruściel 76 Czy nowoczesna firma może funkcjonować bez
Dla każdego, kto nigdy nie miał do czynienia z programowaniem najnowszej technologii?
urządzeń mobilnych, specyfika tego zajęcia sprowadza się do kilku Adam Tyla
szeroko znanych haseł, takich jak ograniczona ilość pamięci, real-ti-
me, środowisko embedded itp. Wszystko to oczywiście prawda, jed-
nak czasy się zmieniają i wiele z tych haseł straciło swoją ważność, in-
ne zyskały na znaczeniu, a w dodatku pojawiły się całkiem nowe. No-
we – nie znaczy nieznane w świecie informatyki, lecz nigdy niebrane
pod uwagę w kontekście systemów embedded.

50 Wąż w komórce
Marian Witkowski
Telefony komórkowe obecnie to nie tylko proste urządzenia do wy-
konywania połączeń głosowych czy korzystania z wiadomości tek-
stowych i multimedialnych. To zaawansowane mikrokomputery,
pełniące często rolę elektronicznych terminarzy (PDA), wyposażo-
ne nierzadko we własny system operacyjny. Ewolucja, jaką przeszły
umożliwiła rozszerzanie funkcjonalności aparatów poprzez instala-
cję aplikacji wykonanych nie przez ich producentów.

56 GPS z .NET Compact Framework


Daniel Stoiński
Chip GPS coraz częściej znajduje się w niedrogich telefonach oraz
urządzeniach PDA z zainstalowanym systemem Windows CE lub
Mobile. Z dobrą baterią można takie urządzenie zabrać nawet na ca-
łodzienną wędrówkę i późniejsze pytania gdzie byłeś? skwitować go-
towym zapisem trasy.

Rédacteur znaki
Wszystkie en chef : Marek
firmowe Bettman
zawarte marekb@software.com.pl
w piśmie są własności odpowiednich firm.
Rédacteurs
Zostały użyte: Aneta Cejmańska
wyłącznie anetta@software.com.pl
w celach informacyjnych.
Ewa Dudzic ewal@software.com.pl
Préparation
Redakcja du CD
używa : Auroxautomatycznego
systemu Core Team składu
Maquette : Anna Osiecka annao@software.com.pl
Couverture : Agnieszka Marchocka
Osoby zainteresowane współpracą prosimy o kontakt:
Traduction : Iwona Czarnota, Aneta Lasota, Marie-Laure Perrotey,
cooperation@software.com.pl
Grazyna Wełna
Bêta-testeurs
Druk: ArtDruk: Thomas Bores, Tony Boucheau, Pascal Foulon, Pascal Miquet,
Romain Lévy, Augustin Pascual, Julien Poulalion, Alain Ribault

Les personnes intéressées par la coopération sont priées de nous contacter :


cooperation@software.com.pl

Abonnement : abonnement@software.com.pl
Fabrication : Marta Kurpiewska
Wysokość nakładu marta@software.com.pl
obejmuje również dodruki. Redakcja nie udziela pomocy
Diffusion : Monika
technicznej Godlewska
w instalowaniu monikag@software.com.pl
i użytkowaniu programów zamieszczonych na płycie
Publicité : dostarczonej
CD-ROM publicite@software.com.pl
razem z pismem.

Si vous êtes
Sprzedaż intéressé par
aktualnych lub l’achat de licence
archiwalnych de publication
numerów pisma de
porevues merci niż
innej cenie de
contacter : Monika
wydrukowana Godlewska
na okładce monikag@software.com.pl
– bez zgody wydawcy – jest ,działaniem
tél : +48 (22)
na887
jego12
66 fax : i+48
szkodę (22) 887
skutkuje 10 11
odpowiedzialnością sądową.

www.sdjournal.org 5
Aktualności

Windows 7: DirectX 10
obsługiwany przez CPU
Od dłuższego czasu krążą pogłoski, że Win- Google: czy Native
dows 7, w stosunku do swojego poprzedni-
ka, będzie miał mniejsze wymagania sprzę-
towe. Większość tego typu informacji pozo-
Client zmieni oblicze Sieci?
O
stawała do tej pory jednak w sferze speku- d kilku miesięcy blogosfera plotko- gramistów do pisania dla niego oprogramowa-
lacji, teraz pojawiły się pierwsze konkret-
wała o nowym systemie operacyj- nia, Google będzie mogło zwyciężyć także i na
ne wiadomości. Ma tak się stać za sprawą
implementacji w nowym systemie Micro- nym od Google, który miał być cał- tym froncie. Pod wieloma względami Native
softu platformy WARP (Windows Advan- kowicie autorskim projektem według jednych Client jest rozwiązaniem zbliżonym do Javy,
ced Resterization Platform). Umożliwi ona lub kolejną dystrybucją Linuksa według dru- Flasha czy Silverlighta – biblioteką urucho-
uruchamianie wersji 10.0 i 10.1 biblio- gich. 8 grudnia 2008 roku gigant z Mountain mieniową, która działając na szczycie systemu
tek DirectX poprzez odciążenie słabszych, View poinformował o projekcie, którego nikt operacyjnego pozwala na uruchamianie neu-
często zintegrowanych układów graficz-
nych przez procesor, który ma odpowiadać
z dyskutantów nie był w stanie sobie wyobra- tralnych względem platformy aplikacji. Dzię-
za wykonywanie operacji graficznych. Co zić – otwartej technologii o nazwie Native ki bezpośredniemu jednak dostępowi do war-
ciekawe, możliwość taka ma być dostęp- Client. Czym jest Native Client? Brad Chen, stwy sprzętowej systemu operacyjnego, po-
na nie tylko w przypadku nowszych ukła- szef zespołu pracującego nad projektem napi- zwoli na uruchamianie wewnątrz przegląda-
dów wspierających DX10, ale też wykorzy- sał o tym tak: „W Google zawsze staramy się rek nawet takich aplikacji jak gry 3D (jako je-
stujących DirectX 9. Według testów Micro-
zrobić z Sieci jak najlepszą platformę. Dlate- den z przykładów wykorzystania technologii
soft, Crysis uruchomiony na niskich deta-
lach w konfiguracji z czterordzeniowym go stworzyliśmy projekt Native Client – tech- jest gra Quake, którą można uruchomić z po-
procesorem Intel osiągnął wynik 5.69 FPS nologię, która udostępni deweloperom pełną ziomu przeglądarki – płynnie i z dźwiękiem).
w rozdzielczości 800 na 600 pikseli pod- moc obliczeniową procesora, pozwalając jed- Obecnie Native Clienta można uruchomić
czas, gdy kompatybilny układ IGP Intela nocześnie zachować neutralność względem na praktycznie dowolnym komputerze z pro-
osiąga zaledwie 5.17 FPS, co czyni go zbęd- przeglądarki i systemu operacyjnego”. Nati- cesorem x86, pracującym pod kontrolą syste-
nym w połączeniu z nowoczesnym proce-
ve Client jest binarną wtyczką dla przegląda- mu Windows, Mac OS X lub Linux. Wtyczka
sorem. Minimalne wymagania WARP to
procesor taktujący z częstotliwością 800 rek, która ma umożliwić gigantowi z Moun- działa w przeglądarkach Google Chrome, Fi-
MHz oraz 512 MB pamięci RAM, nie potrze- tain View pełne panowanie w dziedzinie apli- refox, Safari i Opera. Twórcy technologii za-
buje z kolei obsługi instrukcji MMX, SSE czy kacji webowych. Korporacja, która opanowa- powiadają rychłe przeniesienie Native Clien-
SSE2. Microsoft najprawdopodobniej pró- ła większość rynku wyszukiwarek i reklamy ta na platformy ARM i PowerPC. Więcej in-
buje przekonać swoimi działaniami użyt- on-line nie była do tej pory w stanie zapew- formacji oraz pliki instalacyjne do pobrania
kowników starszego sprzętu do wyboru
Windows 7, nie zaś Windows XP. Z drugiej
nić użytkownikom aplikacji, które pod wzglę- można znaleźć na stronie projektu w ramach
strony, krok ten wydaje się swego rodza- dem szybkości działania i funkcjonalności serwisu Google Code (http://code.google.com/
ju ruchem wstecz obserwując obecną ten- mogłyby dorównać programom pisanym bez- p/nativeclient/?tbbrand=GZEZ&utm_campa-
dencję na rynku. pośrednio dla systemów operacyjnych. Teraz, ign=en&utm_source=en-et-osrcblog&utm_me-
http://www.theinquirer.net/ jeśli projekt Native Client dojrzeje, Google za- dium=et).
Linux gotowy na IPv6 chęci użytkowników do jego instalacji a pro- http://webhosting.pl/
Linux Foundation, organizacja nonprofit
zajmująca się działaniami na rzecz szyb-

NetBeans 6.5
kiego rozwoju systemu GNU/Linux poin-
formowała o pełnej zgodności tego sys-
temu z certyfikacją DOD IPv6. W 2007 r.

P
Biuro Departamentu Obrony (DISA) pod-
jęło się stworzenia projektu zakładające- ół roku pracy zajęło firmie Sun Micro- podobnie w finalnej wersji zostanie opubli-
go zapewnienie możliwości komunikacji systems przygotowanie kolejnej wersji kowana w grudniu 2008 roku. Osoby wy-
pomiędzy urządzeniami za pomocą IPv6. zintegrowanego środowiska programi- korzystujące PHP otrzymały do dyspozycji
Prace nad implementacją stosu w jądrze stycznego NetBeans. Edycja 6.5 nie jest zu- poprawiony edytor z kolorowaniem i uzu-
trwały już od kilku lat, ale wciąż nie spełnia- pełnie nowym wydaniem, ale poważną aktu- pełnianiem kodu, możliwość debugowania
ła wymagań DISA, między innymi w zakre-
alizacją poprzedniego, czyli 6.1. Nowe IDE za pomocą Xdebug, generator snippetów
sie obsługi protokołów ICMP, IPSec, DHCP i
MIB. W odpowiedzi na taki stan rzeczy, Fun- jest coraz silniej adresowane poza swoją kla- dla MySQL-a i obsługę metody przeciągnij i
dacja utworzyła grupę dedykowaną pro- syczną grupę docelową, czyli programistów upuść w odniesieniu do usług SaaS umiesz-
blemowi składającą się głównie z przedsta- Javy i oferuje coraz więcej funkcji także dla czanych w plikach PHP. Z kolei pod hasłem
wicieli firm partnerskich. Jej zadaniem było programistów aplikacji internetowych. PHP, „JavaScript i CSS” oprócz poprawionych edy-
wywieranie nacisku na twórcach jądra w
Ruby, Groovy, SVG, Ajax, ulepszone edytory torów można też zapisać ulepszony mene-
celu dostosowania go do wymagań Biura.
W efekcie ich prac, otrzymało ono wreszcie JavaScriptu i CSS-ów – to odpowiednie ha- dżer bibliotek (domyślnie instalowane są
ubiegany certyfikat, dzięki czemu wszyst- sła do opisu NetBeans 6.5. Nie oznacza to, że Yahoo UI, Woodstock, jQuery, Dojo, Scripta-
kie dystrybucje wyposażone w najnowszą nic się nie zmieniło w kwestii Javy. Ulepszo- culous i Prototype). Z długą listą zmian w no-
wersję jądra powinny spełniać wymogi. no np. obsługę kilku frameworków (Spring, wym NetBeans można zapoznać się pod ad-
Latem, identyczny certyfikat został przy- Hibernate, JSF, JSF CRUD Generator i JPA) resem http://wiki.netbeans.org/NewAndNo-
znany dla SUSE Linux Enterpise (SLES) oraz
i programiści mogą teraz budować usługi w teWorthyNB65. Środowisko w sześciu róż-
Red Hat Enterprise Linux 5.2. W gronie jego
posiadaczy znaleźć można także systemy oparciu o REST z wykorzystaniem tabel ba- nych odmianach można za darmo pobrać z
Windows Vista i Solaris 10. zodanowych lub elementów JPA. W pakiecie witryny http://www.netbeans.org/downloads/
http://www.gcn.com/ znajdują się także narzędzia dla sunowskiej index.html.
platformy RIA, czyli JavyFX, która prawdo- http://webhosting.pl

6
Aktualności

Linux na iPhone
Kompilator C/C++ dla Flasha Systemy spod znaku pingwina nie cieszą
się wysokim zainteresowaniem ze strony
użytkowników domowych, nieco ina-

J
uż wkrótce dla platformy Flash może czej sytuacja przedstawia się w przypad-
pojawić się wiele aplikacji, które do- ku zastosowań serwerowych, a także urzą-
tychczas działały pod kontrolą klasycz- dzeń wbudowanych, takich jak konso-
le do gier, odtwarzacze DVD i MP3, czy...
nych systemów operacyjnych. Jest to możli- tostery. Stworzenia specjalnego syste-
we dzięki kompilatorowi Alchemy, pozwa- mu operacyjnego bazującego na kompo-
lającego transformować kod napisany w C i nentach ze świata Linuksa przeznaczone-
C++ na ActionScript 3.0, który z kolei moż- go do obsługi zaawansowanych telefonów
na uruchomić w ActionScript Virtual Ma- komórkowych, podjął się dwa lata temu
Google, który parę miesięcy później zade-
chine (AVM2). Uzyskany w ten sposób kod
biutował w telefonach z rodziny G1. Tym-
bajtowy może być następnie łatwo urucho- czasem grupie osób zrzeszonej w projekt
miony przez FlashPlayera 10 lub w środo- o nazwie Linux on the iPhone, udało się
wisku AIR 1.5. Według przeprowadzonych przeportować stabilną gałąź 2.6 jądra pod
przez Adobe testów, użycie Alchemy pro- sprzęt Apple, w tym urządzeń iPod Touch,
wadzi do jedynie niewielkiego spadku wy- iPhone i iPhone 3G. Ze względu na sto-
sunkowo wczesną fazę rozwojową sta-
dajności kodu. Wydajność osiągana dzię- Ogg Vorbis na Flasha. Kompilator dostępny
bilne działanie pewnych elementów jest
ki takiemu przekompilowaniu jest znaczą- jest na razie w wersji beta dla Linuksa i Ma- kwestionowane. W chwili obecnej gotowe
co wyższa od ActionScript 3.0 i od 2-10 ra- cOS X-a. Aby uruchomić go pod Windows, są między innymi sterowniki Framebuffer,
zy niższa od natywnego kodu C/C++. Firma należy zainstalować symulujące Uniksa śro- Serial (w tym poprzez sterownik USB) oraz
podkreśla, że aplikacje Flash nie powinny dowisko CygWin. Nie wiadomo jeszcze, kie- przerwania, zegary i MMU (Memory Mana-
być jednak pisane ani w C, ani w C++. Wła- dy Alchemy opuści Adobe Labs i stanie się gement Unit) - technika realizująca dostęp
do pamięci fizycznej. Obsługa nośników
ściwym zastosowaniem kompilatora ma być oficjalnym produktem firmy. By ułatwić za- pamięci Flash (NAND) w trybie tylko do
umożliwienie aplikacjom webowym korzy- poznanie się z kompilatorem, Adobe przygo- odczytu dostępna jest poprzez openboot,
stania z niezliczonych, wolnych bibliotek na- towało przykładowe biblioteki, nakłania też nie została jednak jeszcze przeportowana.
pisanych w tych wydajnych językach. Ado- programistów do dzielenia się własnym ko- Nadal brakuje wsparcia dla sieci Wi-Fi, ekra-
be wyjaśniło, że chodzi przede wszystkim o dem. Warto też wspomnieć, iż w ramach de- nów dotykowych, dźwięku, czy akcelero-
metru. Dla osób zainteresowanych autorzy
„transkodowanie audio i wideo, kryptografię monstracji rozwiązania zaprezentowano grę
przygotowali demonstrację wideo przed-
i parsery XML”. Pod adresem labs.adobe.com/ Quake w wersji flashowej, skompilowanej stawiającą działanie portu w praktyce wraz
technologies/alchemy/videos/brandenhall/ przy użyciu wczesnej wersji Alchemy. Póź- z instrukcją uruchomienia.
można obejrzeć wypowiedź Brandena Hal- niej przedstawiono również działający inter- http://linuxoniphone.blogspot.com
la, CTO firmy Automata Studios, który opo- preter Pythona oraz emulator Nintentdo.
Co nowego w Silverlight 3?
wiada o swoich doświadczeniach z wykorzy- http://webhosting.pl
Stosunkowo niedawno ukazała się oficjal-
staniem Alchemy do przeniesienia bibliotek na, stabilna wersja platformy Silverlight
2.0, nowej technologii Microsoftu służą-
cej do prezentacji zaawansowanej zawar-

Windows 7: szybciej
tości multimedialnej w Internecie. Tym-
czasem z różnych źródeł docierają pierw-
sze informacje o planowanych zmianach,

niż się spodziewasz? które czekają nas w wydaniu tej techno-


logii oznaczonej numerem 3.0. Jak czyta-
my na blogu Scotta Guthria zajmującego

M
icrosoft przekonuje, że Windows ją, że Windows 7 nie można nazwać Servi- w Microsofcie stanowisko vice president
7 nie stanowi tak wielkiego sko- ce Packiem - mówił. Nowy pasek zadań, peł- działu .NET Developer Platform, nowy
Silverlight 3.0 ma wprowadzać przede
ku technologicznego jaki wystą- na obsługa ekranów dotykowych, Direct Ac-
wszystkim szereg istotnych nowości w
pił w przypadku Visty, ale mimo tego warto cess pozwalający firmom omijać koniecz- obsłudze multimediów, także pod kątem
będzie uaktualnić system. Wielu użytkow- ność tworzenia sieci VPN to tylko niektóre z sprzętowym. Pojawi się długo oczekiwa-
ników obawia się, że migracja do Windows wymienionych przez niego zalet nowego sys- ne wsparcie dla H.264, kodeka wykorzy-
7 będzie równie problematyczna, jak to by- temu Windows. Co ciekawe, równolegle po- stywanego obecnie głównie do transmisji
ło w przypadku Windows Vista - zwłaszcza jawiły się nowe informacje na temat dostęp- telewizji wysokiej rozdzielczości. Zaimple-
mentowana zostanie obsługa grafiki 3D
na początku, tuż po premierze systemu. W ności pierwszej wersji beta. Według Keitha
oraz jej sprzętowej akceleracji. Silverlight 3
reakcji na zapewnienia Microsoftu, że Win- Comba i jego bloga hostowanego przez Mi- przyniesie również zmiany wprowadzone
dows 7 to tylko wydanie pośrednie, już teraz crosoft TechNet Blogs beta Windows 7 może z myślą o programistach, między innymi
pojawiają się głosy, że w takim razie siódem- pojawić się już w pierwszym kwartale 2009 bogatszą obsługę bindowania danych
ka nie wniesie niczego nowego. Bill Veghte, roku. Z nieoficjalnych doniesień wynika, że oraz dodatkowe kontrolki. Również kolej-
senior vice-president w dziale Windows Bu- wydanie to będzie bardzo obszerne - całkiem ne wersje Visual Studio i Visual Developer
Express oferować będą możliwość interak-
siness podjął się trudnego zadania i przeko- możliwe, że Microsoft zdecyduje się na w
tywnego projektowania rozwiązań opar-
nywał dzisiaj inwestorów giełdowych, że z pełni otwarty program beta, podobnie jak to tych na Silverlight. Premiera Silverlight 3.0
Windows 7 problemów nie będzie, a nowe było z Windows Vista (choć tam nastąpiło to planowana jest w roku 2009.
funkcje faktycznie będą skłaniały do uaktu- nieco później - dopiero w fazie Beta 2). http://neowin.net/
alnienia. Jest wiele nowości, które sprawia- http://www.cnet.com/

7
Aktualności

Polska na czele w rankingach


piractwa komputerowego
Polscy użytkownicy Internetu bardzo chęt- Finalna wersja
nie udostępniają pirackie pliki do ścią-
gnięcia w sieciach P2P – wynika z „Rapor-
tu na temat gospodarki czarnorynkowej”
Google Chrome już dostępna!
T
przygotowanego przez firmę Symantec. rzymiesięczny okres testowy to zda-
Polska zajęła 6. miejsce w światowym ran-
niem twórców przeglądarki Google
kingu ilości udostępnianych plików (5%
wszystkich udostępnień), wyprzedzając Chrome wystarczająco dużo czasu na
takie kraje, jak: Francja, Szwecja, Holandia wyłapanie wszystkich błędów i dopracowanie
i Australia. Przed Polską znalazły się: USA aplikacji w takim stopniu, by mogła ona opu-
(19%), Wielka Brytania (7%), Kanada (6%), ścić fazę testów. Tak też się stało - Google Chro-
Hiszpania (5%) oraz Brazylia (5%). Najczę- me - wydane zostało oficjalnie w wersji 1.0. W
ściej udostępniane aplikacje to gry na kom-
putery PC, które stanowią aż 49% wszyst-
tym momencie niemile zdziwieni będą użyt-
kich nielegalnych programów w sieci Bit- kownicy systemów operacyjnych innych niż
Torrent. Niestety duży wkład w upowszech- Windows: Google Chrome, pomimo statusu
nianiu pirackich gier mają polscy użytkow- wersji finalnej, działa tylko pod systemem ro-
nicy. Aż 8% wszystkich udostępnianych dem z Redmond... Według słów Sundara Pi-
plików z grami PC pochodzi z Polski, co
chaia, wiceprezesa ds. zarządzania produktem,
daje nam drugie miejsce na świecie! Pierw-
sze miejsce przypadło USA (14%), trzecie prace nad programem na systemy alternatyw- w konkurencyjnym Firefoksie. Twórcy Chro-
Brazylii (7%). Firma Symantec obserwowała ne cały czas postępują. Warto w tym miejscu me na pierwszy plan stawiają prostotę instala-
sieć BitTorrent oraz transfer pirackimi plika- przypomnieć, że przeglądarka Google Chro- cji i łatwość dostępu do udostępnionych wty-
mi w okresie trzech miesięcy – od lipca do me ujrzała po raz pierwszy światło dzienne we czek. Pomimo, że obecnie nie podano konkret-
września 2008 roku. wrześniu 2008 roku. W pierwszych dniach po nego terminu, w którym zaimplementowana
http://www.symantec.pl/
wydaniu aplikacja cieszyła się olbrzymim za- zostanie nowa funkcjonalność to już teraz wia-
Bill Gates interesowaniem wśród użytkowników. Z cza- domo jakie rozszerzenia pojawią się jako pierw-
unowocześni polskie biblioteki sem jednak popularność ta bardzo szybko spa- sze. Wśród nich znaleźć się ma m.in. popular-
Polski rząd wraz z Fundacją Billa Gatesa pod- dła, liczne błędy, luki itp. powodowały, że więk- ny AdBlock, umożliwiający blokowanie wy-
jęli pierwsze działania na rzecz zmiany pol- szość osób wracała do swoich dawnych prze- świetlania uciążliwych reklam na stronach in-
skich bibliotek w prawdziwe centra kultury
glądarek. Firma Google z kolei stara się robić ternetowych, rozbudowany moduł historii i po-
na miarę XXI wieku. Przeznaczyli na ten cel
200 milionów złotych - czytamy w serwisie wszystko co możliwe, by zainteresować swoim bierania, mechanizm kontroli rodzicielskiej czy
Gazeta.pl. Celem Fundacji jest przekształce- produktem potencjalnych użytkowników. Jed- wtyczka Skype'a i RealPlayera. Takie posunięcie
nie bibliotek, zwłaszcza w małych miastecz- nym z takich zabiegów jest plan wprowadze- ze strony Google znacząco przyczynić się mo-
kach tak, aby pełniły funkcję centrum życia nia w do Chrome obsługi tzw. rozszerzeń. Ak- że do wzrostu popularności przeglądarki Chro-
kulturalnego mieszkańców. Mają dostar- tualnie w dużej mierze mają to być rozwiąza- me. Obsługa rozszerzeń cieszy się aktualnie ol-
czać i uczyć obsługi Internetu, a także stano-
nia dobrze znane z konkurencyjnego oprogra- brzymim zainteresowaniem wśród użytkowni-
wić miejsce spotkań organizacji. Całość ma
przypominać w działaniu program budowy mowania, pozwalające użytkownikowi dosto- ków np. Firefoksa i podobny sukces przynieść
boisk piłkarskich oraz budowy dróg, gdzie sować przeglądarkę do własnych potrzeb. We- może również raczkującej na chwile obecną
część pieniędzy pochodzi od rządu, część dług udostępnionych przez Google informa- aplikacji giganta w branży wyszukiwarek.
od samorządów. Pewna ich część ma zostać cji mechanizm obsługi rozszerzeń przypomi- http://www.techcrunch.com/
wykorzystana też do podnoszenia standar-
nał będzie podobny mechanizm zastosowany
dów sanitarnych.
http://gazeta.pl/

Wyłączenie komputera SMS-em


Firma Lenovo udostępni oprogramowa-
nie, za pomocą którego użytkownicy będą
Python 3000 już jest!
4
mogli wyłączyć laptopa wysyłając wia-
domość SMS. Funkcja ma nosić nazwę grudnia 2008 roku, o godzinie 2:51 z serii 2.x, dwa miesiące wcześniej wydano Py-
Lenovo Constant Secure Remote Disable i rano czasu polskiego, oficjalnie zosta- thona 2.6, który wprowadza wiele zmian zna-
ma być przydatna w przypadku kradzieży ła wydana nowa wersja Pythona 3.0, nych z Pythona 3.0, ale równocześnie zacho-
lub zagubienia laptopa. Z każdym ThinkPa- znanego również jako Python 3000. Pod wie- wuje kompatybilność wstecz. Taki zabieg ma
dem będzie można skojarzyć do 10 nume- loma względami jest to wydanie wyjątkowe, a na celu ułatwić migrację do nowej gałęzi. De-
rów telefonów, z których wysłanie SMS-a
zarazem dla wielu kontrowersyjne. Wyjątko- veloperzy Pythona spędzili również dużo cza-
sprawi, że komputer stanie się bezużytecz-
ny dla złodzieja. Laptop zostaje unierucho- we dlatego, że usuwa z języka wiele niedogod- su na tworzeniu programu 2to3, który automa-
miony przez funkcję zaszytą w BIOSie i jego ności przeszkadzających w programowaniu, tycznie przekonwertuje nasz program do now-
ponowne uruchomienie będzie możliwe kontrowersyjne dlatego, że aby to osiągnąć pro- szej wersji, a co ważniejsze, działa on wyśmieni-
jedynie po podaniu hasła. Ponieważ wyłą- gramiści Pythona musieli zerwać z wcześniej- cie. Okazja do wprowadzenia zmian, bez oglą-
czenie następuje przez sieć komórkową, szą zgodnością. Pomimo ryzyka stałego rozsz- dania się na wsteczną zgodność, spowodowa-
w laptopie musi być obecna odpowied-
nia karta, użytkownik musi płacić abona-
czepienia społeczeństwa, developerzy nie ba- ła napływ tak wielu różnorakich pomysłów, że
ment operatorowi komórkowemu, zaś sam li się wprowadzenia zmian, dzięki którym Py- musiał powstać specjalny dokument opisujący
laptop musi znajdować się w zasięgu sieci. thon stanie się lepszym językiem. Oczywiście co na pewno nie zmieni się w nowym Pythonie:
http://www.eweek.com/ nie zapomniano o ogromnej rzeszy programi- http://www.python.org/dev/peps/pep-3099/.
stów i programów, które wykorzystują Pythona http://linuxnews.pl

8
Aktualności

Google Chrome
JavaFX 1.0 wydany z każdym nowym komputerem?
Twórcy Google Chrome snują plany i
zastanawiają się, co zrobić by produkt ten

S
un Microsystems już dawno pogodziło JavyFX. Eric Schwartz, CEO Sun Microsys- mógł konkurować z najpopularniejszym
się z klęską w wojnie o panowanie nad tems powiedział: „udostępniliśmy binarne pa- obecnie Internet Explorerem. Co ciekawe,
desktopami w dziedzinie aplikacji typu kiety producentom telefonów, tak aby możli- koncern z Mountain View planuje w tym
celu wykorzystać praktyki, które stosuje
RIA – taka jest przynajmniej obiegowa opinia. we stało się zunifikowanie implementacji mo-
sam Microsoft i które przyczyniają się do
W ostatnich latach amerykańska firma kon- bilnej Javy. Oceniamy że rynek ten jest wart mi- tak olbrzymiej popularności jego przeglą-
centrowała się na rynku urządzeń mobilnych, liardy dolarów”. Firma zamierza pobierać tan- darki. Jak to się stało, że Internet Explorer
starając się wypracować jak najlepszą pozycję tiemy od każdego sprzedanego telefonu z Ja- jest numerem jeden na rynku przegląda-
dla JavyFX. Już podczas konferencji JavaOne vąFX – a że marka Javy jest dobrze rozpozna- rek internetowych? Otóż zdaniem Sundara
2007 Sun koncentrował się na smartfonach i walna, Sun liczy, że przyczyni się to do znacznej Pichai, wiceprezesa do spraw zarządzania
produktami w firmie Google, przyczynia
usługach sieciowych. Korporacyjne produk- poprawy sytuacji finansowej firmy. Schwartz się do tego fakt, iż przeglądarka w posta-
ty oraz serwery trafiły na boczny tor. Podczas podkreślił, że producenci powinni zaintereso- ci aplikacji gotowej do użycia trafia do
imprezy zaprezentowano nowy język skrypto- wać się tą platformą przede wszystkim dlate- użytkowników nowych komputerów, na
wy o nazwie JavaFX Script. Miał on zapocząt- go, że pochodzi ona od niezależnego dostawcy których preinstalowany jest system Win-
kować rozwój nowej platformy dla urządzeń technologii, a nie potencjalnego rywala (jak jest dows. Dlatego też, zgodnie z ujawniony-
mi przez Pichaia wywiadzie dla dziennika
mobilnych o nazwie JavaFX Mobile. Mimo to w wypadku Microsoftu czy Nokii). JavaFX
The Times planami koncernu, wykorzysta
że Sun Microsystems koncentrował się na ko- 1.0 zawiera wtyczki do NetBeans 6.5, Eclipse, a on do walki z Microsoftem na rynku prze-
mórkach, to jednocześnie zapowiedziała wer- także do Adobe Creative Suite 3 i 4. Jednocze- glądarek internetowych jego własną broń
sje swojego oprogramowania dla desktopów, a śnie Sun poinformował, że współpracuje obec- i w momencie oficjalnego wydania Google
nawet cyfrowych telewizorów. JavaFX Mobi- nie z jakąś zewnętrzną firmą (jej nazwy nie po- Chrome rozpocznie jego dystrybucję, roz-
le miała pojawić się pod koniec 2007 roku – a dano). Celem jest wydanie narzędzia do szyb- powszechniając aplikację z nowymi kom-
puterami. Według zapowiedzi ma to mieć
pierwsze urządzenia planowano udostępnić kiego tworzenia aplikacji (RAD). Ma ono upro-
miejsce prawdopodobnie już na początku
klientom w pierwszej połowie 2008 roku. W ścić proces przygotowywania programów w Ja- przyszłego roku. Wtedy również mają być
końcu jednak amerykańska korporacja wycofa- vaFX Scripcie. JavaFX ma znacznie ułatwić pi- dostępne wersje przeglądarki dla syste-
ła się z tej inicjatywy. Zamiast tego skoncentro- sanie aplikacji multimedialnych. Napisanie od- mów Linux i Mac OS, dzięki czemu będzie
wała się na desktopowej wersji swojej platfor- twarzacza multimedialnego w tradycyjnej Javie ona mogła pracować na 99% komputerów
my. Na początku grudnia 2008 roku Sun Mi- wymagało ok 100 linii kodu, w JavaFX Script na całym świecie.
http://www.readwriteweb.com/
crosystems ogłosił wydanie pakietu JavaFX De- można to zrobić w ramach 20-30 linii. Gene-
sktop 1.0, nazywanego po prostu JavaFX 1.0. ralnie, dzięki JavaFX Sun chce osiągnąć to, co Microsoft naciska
Bazująca na tym rozwiązaniu edycja mobilna nie udało mu się ze zwykłą Javą. Miała być ona na Google w sprawie retencji danych
ma pojawić się dopiero wiosną 2009 roku. Zu- przenośna, ale różnice pomiędzy poszczególny- Microsoft poinformował Komisję Europej-
nifikowane środowisko pozwoli na łatwe prze- mi wersjami utrudniały to. Ponadto inaczej się ską, że jest w stanie ograniczyć czas prze-
chowywania danych dotyczących wyszu-
noszenie aplikacji pomiędzy platformami, a je- pisało aplikacje desktopowe, inaczej mobilne a
kiwań użytkowników korzystających z
go rozprowadzanie w binarnej formie zapobie- jeszcze inaczej aplety. Dzięki JavaFX ma się to Windows Live Search do 6 miesięcy. Wła-
gnie „bałkanizacji” języka, tak aby producen- zmienić. Czy tak się rzeczywiście stanie? Czas śnie pół roku to okres proponowany przez
ci nie mogli popsuć kompatybilności między pokaże. administrację Unii Europejskiej. Po tym
wersjami, tworząc własne, przerobione wersje http://webhosting.pl czasie dane, według Komisji, powinny
być anonimizowane - czyli przetwarza-
ne w taki sposób, by nie zawierały adre-
sów IP użytkowników. Microsoft jednak

Moonlight 1.0 beta 1 wstrzymuje się z wdrożeniem nowych


zasad do momentu, gdy... na podobne
zmiany zgodzi się jego największy kon-

W
ydano pierwszą betę Moonlight podlega licencji GNU LGPLv2. Nie zawiera ko- kurent na rynku wyszukiwania, Google. W
przeciwnym wypadku Microsoft sam osła-
1.0, implementacji technologii Si- deków własnościowych. W przypadku koniecz-
biłby swoje możliwości względem rywala.
lverlight na platformę Linux. Pra- ności ich użycia pojawia się możliwość ich ścią- Warto przypomnieć, iż Google we wrze-
ce nad Moonlight rozpoczęły się w ubiegłym ro- gnięcia. Użytkownicy mogą też skompilować z śniu 2008 roku pod naciskiem Unii Euro-
ku podczas konferencji MIX07. Wtedy Miguel de Moonlight z biblioteką ffmpeg zamiast microso- pejskiej zmieniło swoją politykę w spra-
Icaza, kierujący projektem Mono, oraz jego grupa, ftowych kodeków. Moonlight jest dostępny obec- wie czasu retencji danych użytkowników i
stworzyli działający prototyp w ciągu 20 dni. Kie- nie na platformy x86 i x86-64. W przyszłości ob- skróciło okres przechowywania adresów IP
do 9 miesięcy. Zalecenie Unii Europejskiej
dy Silverlight 1.0 został wydany we wrześniu, Mi- sługiwanych platform może być więcej. Obecnie
w sprawie czasu przechowywania danych
crosoft ogłosił plany współpracy z pracującymi w Moonlight nie jest jeszcze kompatybilny z Silver- użytkowników pojawiło się w kwietniu
Novellu programistami Moonlight w celu upew- light 2.0. Jednak już w marcu ma zostać wyda- 2008 roku. Od tamtej pory żadna firma nie
nienia sie, że Silverlight będzie dostępny także na na alfa wersji wspierającej Silverlight 2.0. Wersja zgłosiła chęci, by się do niego zastosować.
Linuksie. Korporacja dostarczyła wtedy zestawy wspierająca najnowszy Silverlight ma używać Mo- Microsoft jest pierwszą, ale póki co dekla-
ruje jedynie gotowość - czy faktycznie czas
testów oraz zgodziła się na udostępnienie binar- no do wykonywania kodu napisanego w C# oraz
ten zostanie skrócony okaże się dopiero
nych kodeków audio i wideo dla plugina linuk- innych językach działających na bazie Dynamic wtedy, gdy Google odpowie Microsofto-
sowego. Moonlight 1.0 jest napisany w C++ i jest Language Runtime, które Microsoft udostępnia wi i zgodzi się na podobny krok.
udostępniony jako wtyczka dla Firefoksa. Posiada jako open source. http://vnunet.com/
własny silnik JavaScript. Jest w całości otwarty i http://arstechnica.com/

9
Aktualności

Microsoft i Yahoo! tracą, Google zyskuje


Jak wynika z badań przeprowadzonych przez
specjalizującą się w badaniu Internetu firmę Europeana: europejskie
Nielsen Online, ilość zapytań do wyszukiwa-
rek internetowych zmalała wśród internatów
z USA o mniej niż dwa punkty procentowe w
dziedzictwo w Internecie
P
skali roku. Jednocześnie widać wzrost zainte- od koniec listopada 2008 roku ruszył no- roku 2010 Europeana pomieściła co najmniej
resowania usługami Google. Zdaniem kor-
poracji, liczba wyszukiwań w całych Stanach
wy, spektakularny projekt: Europeana, 10 milionów obiektów pochodzących z wszyst-
Zjednoczonych zmniejszyła się do 7,78 mld. czyli europejska multimedialna biblio- kich krajów Unii. Europeana została zainicjowa-
Ilość zapytań kierowanych do wyszukiwarki teka cyfrowa. Na stronie internetowej europe- na przez Komisję w 2005 r. i opracowana szcze-
giganta z Mountain View wzrosła o 8,1 punktu ana.eu Internauci z całego świata mają dostęp do gółowo w ramach ścisłej współpracy z biblioteka-
procentowego do 4,76 mld zapytań miesięcz- ponad dwóch milionów książek, map, nagrań, mi narodowymi i innymi instytucjami kultural-
nie. Pozwoliło to firmie uplasować się z ponad
fotografii, dokumentów archiwalnych, obrazów nymi państw członkowskich, jak również przy
60-procentowym udziałem na rynku wyszuki-
warek. Straty odnotowały Yahoo! oraz Micro- i filmów z bibliotek narodowych i instytucji kul- szerokim poparciu ze strony Parlamentu Euro-
soft. Usługi pierwszego z nich straciły bowiem turalnych z dwudziestu siedmiu państw człon- pejskiego. Jest ona zarządzana przez Fundację
dwanaście punktów procentowych w ciągu kowskich UE. Europeana ma otworzyć nową Europejskiej Biblioteki Cyfrowej, która łączy naj-
ostatniego roku do 1,31 mld, z kolei Microso- drogę do korzystania z europejskiego dziedzic- ważniejsze europejskie stowarzyszenia biblio-
ftu o kolejne siedem - do 89 mln. twa: każdy, kto interesuje się literaturą, sztuką, tek, archiwów, muzeów, archiwów audiowizu-
http://www.cnet.com/
nauką, polityką, historią, architekturą, muzyką alnych i instytucji kulturalnych. Europeana ma
Archiwa czasopism lub filmem, będzie miał swobodny i szybki do- swoją siedzibę w niderlandzkiej bibliotece na-
w Google Book Search stęp do największych zbiorów i arcydzieł euro- rodowej, Koninklijke Bibliotheek. Materiały dla
Google Book Search to wyszukiwarka, która pejskich w ramach jednej wirtualnej bibliote- Europeany pochodzą z ponad tysiąca organiza-
umożliwia przeszukiwanie całego tekstu ki, dzięki portalowi internetowemu dostępne- cji kulturalnych z całej Europy. Europejskie mu-
książek w celu znalezienia pozycji interesu-
mu we wszystkich językach Unii Europejskiej. zea, w tym paryski Luwr i amsterdamskie Rijk-
jących użytkownika oraz uzyskanie infor-
macji, gdzie można je kupić lub wypoży- Ale jest to dopiero początek. Viviane Reding, smuseum, dostarczyły cyfrowe zapisy obrazów i
czyć. Projekt ruszył w polskiej wersji języ- komisarz UE ds. społeczeństwa informacyjne- obiektów ze swoich kolekcji. Archiwa państwo-
kowej pod koniec ubiegłego roku, a teraz go i mediów powiedziała, że celem jest, aby w we udostępniły ważne doku
poszerzono zakres dostępnych opcji o moż-
liwość wyszukiwania także archiwów czaso-
pism. Zaktualizowana wersja usługi pozwa-
la dotrzeć do starych, często nieaktual-
nych czasopism, które udostępnione zosta- Windows Mobile 6.5
ły w Internecie. Z dostępnych zarchiwizowa-
nych wersji znaleźć możemy nie tylko star-
sze pozycje w postaci takich tytułów jak
w drugiej połowie 2009 roku
P
New York Magazine, Popular Mechanics, czy
odczas kwartalnej konferencji Motoro- jące z platformy Android opracowanej przez
Ebony, ale także nowe publikacje. Materiały
tego typu są oznaczane w wynikach wyszu- li, dyrektor wykonawczy Sanjay Jha po- Google. Natomiast Windows Mobile 7 pojawi
kiwania słowem Magazyn, a korporacja czer- informował, że firma ta planuje wypo- się najwcześniej w 2010 roku. Spekuluje się, że
pie zyski na usłudze poprzez wyświetlane sażyć swoje telefony w wersję 6.5 systemu Win- Windows Mobile 7 będzie bardziej nastawiony
obok artykułów boksów reklamowych, dzie- dows Mobile w drugiej połowie roku 2009. na muzykę. Konkurowałby więc m.in. z obecnie
ląc się zyskami z ich wydawcami. Również Steve Ballmer podczas konferencji w sprzedawanymi przez Microsoft odtwarzaczami
http://searchengineland.com/
Melbourne powiedział, że Windows Mobile 6.5 Zune. Ballmer mówiąc o rynku telefonów ko-
ODF Toolkit ma się pojawić mniej więcej w tym czasie. Póź- mórkowych powiedział też, że obecnie rocznie
Podczas konferencji OpenOffice.org 2008 niej jednak rzecznik Microsoftu powiedział, że sprzedaje się 1,2 miliarda tych urządzeń, z cze-
w Pekinie firmy Sun i IBM ogłosiły powsta- słowa Ballmera nie należy traktować jako oficjal- go 100 milionów to telefony typu smartphone.
nie ODF Toolkit Union. W jej ramach tworzo- ną mapę drogową, a wszelkie wcześniejsze zapo- Na 20 milionach z nich działał Windows Mobi-
ny będzie ODF Toolkit, zestaw różnych narzę-
wiedzi należy traktować ogólnie. Być może Win- le, co było lepszym wynikiem sprzedażowym w
dzi dla formatu ODF. Będą to zarówno małe
narzędzia ułatwiające używanie ODF w pro- dows Mobile 6.5 zostanie wydany razem z Win- porównaniu do konkurencyjnych rozwiązań ta-
cesie tworzenia oprogramowania jak i duże dows 7. Motorola zapowiada też, że razem z te- kich firm jak Apple czy BlackBerry.
biblioteki dla Javy i .NET, które mogą być uży- lefonami z WM 6.5 wyda urządzenia korzysta- http://betanews.com/
wane w innych projektach. Toolkit nie będzie
tworzony od zera, początkowy kod dostarczy
firma Sun. Zawiera on API do odczytu, zapisu
i manipulowania dokumentami ODF. Jest też
ODF Validator służący do walidacji dokumen- Google łata
tów oraz sprawdzania innych kryteriów. Gdy
ODF Toolkit będzie gotowy, umożliwi m.in.
automatyczne tworzenie raportów na pod-
„najgłupszy błąd świata”
G
stawie zapytań do baz danych, indeksowa-
oogle załatało błąd w platformie An- lecenia i wykonywane przez powłokę z uprawnie-
nie dokumentów do wyszukiwania, konwer-
sję do innych formatów oraz renderowanie droid, dostępnej w telefonach G1, któ- niami roota. Jeśli np. użytkownik w treści SMSa
dokumentów. ODF Toolkit będzie dostępny ry nie bez przyczyny, uznano za jeden z użył słowa "reboot", wówczas następowało ponow-
na liberalnej licencji Apache. najgłupszych w historii programowania. Problem ne uruchomienie telefonu. Google naprawiło błąd
http://dobreprogramy.pl polegał na tym, że słowa wpisywane na telefonie, w aktualizacji RC30.
np. podczas pisania SMSa były traktowane jako po- http://www.cnet.com/

10
Aktualności

Microsoft Robotics
10 tysięcy aplikacji w Apple Developer Studio 2008
Podczas RoboDevelopment Conferen-

App Store ce & Expo w Santa Clara Microsoft ogło-


sił udostępnienie finalnej wersji Robotics
Developer Studio 2008, platformy umoż-

F
irma Apple poinformowała, że w jej domo jednak ile z tych ściągnięć dotyczyło apli- liwiającej tworzenie oprogramowania
dla robotów, zarówno prawdziwych jak i
sklepie z oprogramowaniem App Store kacji płatnych, a ile darmowych. Wiadomo, że
symulowanych. W tym wydaniu skupio-
użytkownicy mogą pobrać już 10 000 11 października 2008 roku, gdy w sklepie by- no się na zwiększeniu wydajności. Ulep-
aplikacji. Apple App Store został otwarty w ły 4093 programy, wśród nich znajdowało się szono również narzędzia VPL (Visual Pro-
lipcu 2008 roku. Znajdowało się w nim wtedy 974 darmowych i 3119 komercyjnych. Sklep, gramming Language) oraz VSE (Visual
tylko 500 programów; we wrześniu 2008 ro- jaki stworzyła firma Apple, stał się jednym z jej Simulation Environment), zwiększono
ku było ich już 3000. Wystarczyło niecałe pół większych sukcesów. Przede wszystkim umoż- elastyczność wdrażania przez obsługę
Microsoft Visual Studio 2005 jak i Visual
roku aby początkowa liczba wzrosła dwudzie- liwił użytkownikom iPhone i iPod Touch wy- Studio 2008, poprawiono uruchamia-
stokrotnie. W tym czasie użytkownicy pobrali godne ściąganie aplikacji z jednego miejsca. nie VPL i VSE na 64-bitowych Windows
oprogramowanie 300 milionów razy. Nie wia- http://www.apple.com/ oraz dodano obsługę własnych mecha-
nizmów przesyłania wiadomości. Micro-

Thumbtack
soft RDS zawiera prosty model progra-
mowy wspierający tworzenie asynchro-
nicznych aplikacji, narzędzia do tworze-

do zarządzania informacjami nia i symulacji aplikacji przez niezaawan-


sowanych użytkowników, a także samo-
uczki i przykładowe kody źródłowe. RDS

M
icrosoft Live Labs, ten sam ze- zwłaszcza ci, którzy korzystają z Office One- 2008 jest już trzecią wersją pakietu pro-
spół, który rozwija między inny- Note - tam wstawianie notatek i organizacja w gramistycznego dla robotów. Poprzed-
nie wersje doczekały się 250000 pobrań,
mi aplikację Photosynth ma te- zakładki jest bardzo podobna, ale Thumbtack
a ponad 60 firm tworzących zarów-
raz nową propozycję dla tych, którzy szuka- ma tę przewagę, że jest dostępny on-line z każ- no sprzęt jak i oprogramowanie wspie-
ją łatwej i efektywnej metody przechowywa- dego komputera. Na stronie domowej usługi ra lub używa Microsoft Robotics Develo-
nia i analizowania różnego typu informacji. dostępny jest film ilustrujący działanie usługi per Studio w swoich produktach. Zainte-
Thumbtack, bo tak nazywa się nowa usłu- oraz przykładowe kolekcje. Thumbtack może resowane osoby mogą za darmo pobrać
ga Live Labs, to miejsce w Internecie dostęp- wypróbować każdy - podobnie jak każde inne wersję Express lub zakupić wersję Stan-
dard.
ne po zalogowaniu przy pomocy Windows Li- narzędzie udostępniane przez Microsoft Live http://www.eweek.com/
ve ID, które umożliwia przechowywanie róż- Labs, również i to nie ma statusu finalnej wer-
nego rodzaju informacji - na przykład wycin- sji i cały czas jest unowocześniane, może rów- Windows
ków stron internetowych, obrazów, własnych nież nie działać w pełni prawidłowo. Doświad- obchodzi 23 urodziny
notatek, fragmentów dokumentów. Wszyst- czenia z innymi aplikacjami Live Labs wskazu- 20 listopada 1985, nieco ponad 23 lata
temu Microsoft wydał pierwszy system
kie te materiały można przypisywać do kolek- ją jednak na to, że może to być całkiem cieka-
operacyjny z rodziny Windows, ozna-
cji, które następnie mogą być udostępniane in- wa i przydatna usługa. czony jako 1.0. Pomimo, że była to tak
nym. Ideę działania usługi szybko zrozumieją http://www.microsoft.com/poland naprawdę nakładka na popularnego
wówczas DOS'a to wniosła ona wiele
nowatorskich rozwiązań w świecie opro-
gramowania komputerowego. W stosun-
Komputer z HPC Server 2008 w ku do poprzednich, tekstowych syste-
mów Microsoftu 16-bitowy Windows 1.0

dziesiątce najszybszych zawierał wiele nowych rozwiązań, który


czyniły go użyteczniejszym i wygodniej-
szym w codziennej pracy. Pojawiła się w

M
aszyna pracująca pod kontrolą sys- cy obliczeniowej mogły być używane także w nim obsługa myszki oraz wątków, które
umożliwiały pracę z kilkoma aplikacjami
temu operacyjnego Microsoft Win- codziennych zastosowaniach. Przykładem mo-
jednocześnie. Interfejs graficzny opierał
dows HPC Server 2008 znalazła się że być zwykły komputer desktopowy z zainsta- się o paletę 256 kolorów, zaimplemento-
na 10 miejscu listy Top500 zawierającej 500 naj- lowanym Excelem, który wywołuje wykonywa- wano w nim dobrze znane dzisiaj okna,
szybszych superkomputerów na świecie. Jeszcze nie złożonych obliczeń na klastrze i zwraca dane które mogły być minimalizowane, mak-
rok temu najszybszy komputer działający pod wyjściowe użytkownikowi. Użytkownik ten nie symalizowane i wyświetlane na ekranie
kontrolą systemu Microsoftu znajdował się na musi nawet wiedzieć, że przy wykonywanych w tzw. układzie taflowym. Po raz pierw-
szy w ręce użytkowników trafiło także
116 miejscu. Superkomputer firmy Dawning przez niego operacjach wykorzystywany jest su-
coś na wzór Panelu Sterowania i paska
Information Industry osiągnął prędkość 180,6 perkomputer. Microsoft obecnie kontroluje nie- zadań. Co ciekawe, koncepcja okien
teraflopów przy wydajności wynoszącej 77,5%. całe 5% rynku superkomputerów. 74% należy do pojawiła się w Microsofcie już wiosną
Strategia Microsoftu to ułatwienie korzysta- Linuksa a 21% do różnej maści Uniksów. W ce- 1983 roku, ale dopiero dwa lata później
nia z superkomputerów poprzez zmniejszanie lu popularyzacji swojego systemu Microsoft do- na rynku pojawił się Windows 1.0, który
bazował na wspomnianym rozwiązaniu.
kosztów i złożoności, a także dostarczanie zbio- starcza akademicką wersję Windows HPC Se-
Pracowało nad nim 55 programistów,
ru aplikacji, narzędzi zarządzających, narzędzi rver 2008 w cenie 15 dolarów za jeden węzeł w którym proces tworzenia tego systemu
programistycznych oraz budowanie społeczno- klastrze. Komercyjna wersja kosztuje 450 za in- zajął około roku.
ści niezależnych dostawców oprogramowania. stalację na jednym węźle klastra. http://neowin.net/
Korporacja chce, aby komputery o dużej mo- http://www.techit.pl/

11
Biblioteka miesiąca

OpenCV
komputerowa wizja w praktyce
Czy komputer może widzieć podobnie jak człowiek? Czy komputerowa
wizja to mit czy rzeczywistość? Na te, oraz inne pytania można znaleźć
odpowiedz, czytając poniższy artykułu traktujący o wyjątkowej bibliotece
wywodzącej się z laboratoriów firmy Intel.
Rys historyczny
Dowiesz się: Powinieneś wiedzieć: Korzenie biblioteki OpenCV wiążą się z działem
• Jakie możliwości oferuje biblioteka OpenCV; • Podstawy programowania w języku C/C++. rozwojowym firmy Intel (Intel Research). W dzia-
• Jak przy pomocy tej biblioteki wykonywać le tym prowadzono wiele badań dotyczących apli-
podstawowe operacje na obrazach. kacji wymagających intensywnych obliczeń – mię-
dzy innymi związanych z grafiką komputerową.
Pracownicy Intel Research odwiedzali w tym cza-
Plan i cel artykułu sie wiele ośrodków naukowych na całym świecie
OpenCV stanowi jedną z tych bibliotek, o któ- i w trakcie tych wizyt poczynili wiele interesują-
Poziom trudności rych powinno się raczej pisać książki, a nie ar- cych obserwacji. Jedną z nich było spostrzeżenie,
tykuły – aczkolwiek, autor mimo wszystko po- iż wiele grup uniwersyteckich buduje bibliote-
dejmie próbę przedstawienia tego użyteczne- ki wspierające badania z dziedziny wizji kompu-
go rozwiązania. Z góry należy zaznaczyć, iż ce- terowej. W większości przypadków były to nie do

O
penCV to otwarta biblioteka lem niniejszego artykułu nie jest opisanie pełnej końca usystematyzowane rozwiązania typu ad-
stworzona w językach C oraz funkcjonalności biblioteki, a raczej przekrojowe hoc, przekazywane z rąk do rąk po to, aby za każ-
C++, oferująca cały szereg udogod- przedstawienie jej możliwości i zachęcenie Czy- dym razem nie trzeba było implementować pod-
nień związanych z szeroko pojętą dziedzi- telnika do dalszych eksperymentów. stawowych udogodnień od początku. W kontek-
ną wizji komputerowej – marketingowy slo- Struktura artykułu jest następująca: na po- ście tego spostrzeżenia, pracownicy Intel Research
gan promujący Open CV głosi, iż biblioteka czątku przedstawiony będzie krótki rys histo- wpadli na pomysł stworzenia OpenCV – otwar-
ta pozwala tworzyć oprogramowanie, które wi- ryczny opisujący genezę OpenCV. W dalszej tej i usystematyzowanej biblioteki oferującej ba-
dzi. Czytelników niezaznajomionych z tema- części Czytelnicy będą mieli okazję zapoznać zową infrastrukturę do przeprowadzania badań
tyką zapraszam do ramki zatytułowanej Wi- się ze strukturą biblioteki. Kolejne podpunk- związanych z tematyką wizji komputerowej. Stwo-
zja komputerowa w pigułce). OpenCV została ty opisywać będą bardziej szczegółowo podsta- rzenie pierwszej implementacji zlecono rosyjskie-
zaprojektowana przede wszystkim z uwzględ- wowe moduły OpenCV; tutaj zaprezentowane mu zespołowi zajmującemu się tworzeniem roz-
nieniem efektywności – dlatego też kluczowe będą również proste przykłady zastosowania bi- wiązań bibliotecznych Intela. W tej grupie właśnie,
komponenty biblioteki zakodowano w czy- blioteki w postaci krótkich programów napisa- pod przewodnictwem Vadim Pisarevskiego, po-
stym C; autorzy uwzględnili również możli- nych w języku C++. Na końcu zapoznamy się wstała pierwsza wersja OpenCV. Twórcom biblio-
wość wykorzystania potencjału maszyn wie- przekrojowo z zaawansowanymi możliwościa- teki przyświecały trzy cele: wysoka wydajność, czy-
lordzeniowych. Podstawowym celem stwo- mi biblioteki. Oprócz tego Czytelnicy znajdą telność kodu oraz otwartość – włącznie z możliwo-
rzenia OpenCV było dostarczenie prostej, a w tekście szereg ramek zawierających dodat- ścią wykorzystania rozwiązania w komercyjnych
jednocześnie potężnej infrastruktury, na ba- kowe, ciekawe informacje związane pośrednio produktach – bez konieczności ich publikowania.
zie której programiści mogliby relatywnie lub bezpośrednio z OpenCV oraz rozdział pod- Wszystko to działo się w 1999 roku. Do 2007 ro-
szybko budować zaawansowane rozwiązania sumowujący. ku trzeba było czekać na oficjalną, finalną wersję bi-
z dziedziny wizji komputerowej. W rezulta-
cie OpenCV oferuje ponad 500 funkcji, które
�� ��� �������
można zastosować przy budowaniu rozwiązań
�������������� ������������ ��������
z zakresu inspekcji produkcji masowej, wizu- ������������ ����������������� �����������������
alizacji medycznej, bezpieczeństwa, kalibra- ����������������� �������������������������� ����������������������
cji kamer, stereowizji czy robotyki. OpenCV
oferuje również łakomy kąsek dla praktyków �����
z zakresu dziedziny uczenia maszynowego w
postaci dedykowanej, zagnieżdżonej bibliote- ������
ki: MLL (ang. Machine Learning Library), któ-
������������������������������������
ra oferuj przede wszystkim funkcjonalność z
��������������������������������������
zakresu statystycznego dopasowywania wzor-
ców (ang. statistical pattern recognition) oraz
klasteryzacji (ang. clustering). Rysunek 1. Struktura biblioteki OpenCV

12 02/2009
OpenCV

blioteki oznaczoną numerem 1.0. Na dzień dzisiej- tywał i wyświetlał obraz o ścieżce przekazanej jako wana jest globalna stała opisująca nazwę okna (g_
szy szacuje się, że biblioteka została pobrana ponad argument linii poleceń. Po wciśnięciu dowolnego windowName). W ciele main(), korzystając z mecha-
2 miliony razy, zaś liczba jej użytkowników stale ro- klawisza program zakończy swoje działanie. Kod nizmu asercji sprawdzamy dla porządku dostęp-
śnie. OpenCV jest nadal intensywnie rozwijana programu przedstawiony jest na Listingu 1. ność argumentu po czym przechodzimy do reali-
– jednakże już poza Intelem; projekt ma aktualnie Przeanalizujmy po kolei poszczególne fragmen- zacji naszego zadania (oczywiście w produkcyjnym
charakter społecznościowy. I co najważniejsze – bi- ty tego programu. Już na samym początku w oczy kodzie warto by pokusić się o nieco bardziej wyrafi-
blioteka tak nadal pozostaje rozwiązaniem otwar- rzuca się niestandardowy nagłówek <highgui.h>. nowany mechanizm obsługi niepoprawnej składni
tym i całkowicie darmowym. Nagłówek ten stanowi część pakietu OpenCV. linii poleceń). W linii:
Uważnie Czytelnicy pamiętają zapewne, że to
Struktura biblioteki właśnie moduł OpenGUI oferuje elementy gra- IplImage* image = cvLoadImage( argv[ 1 ] );
Patrząc przekrojowo, OpenCV składa się z pię- ficznego interfejsu użytkownika oraz operacje
ciu podstawowych komponentów. Strukturę wejścia/wyjścia dla obrazów i plików video. Tak się wczytujemy obraz. Funkcja cvLoadImage(),
biblioteki przedstawiono na Rysunku 1. składa, że właśnie takiej funkcjonalności potrzebu- przyjmująca jako argument ścieżkę docelowego
Jądro biblioteki stanowi komponent CXCO- je nasz pierwszy program – dlatego w pierwszym pliku, potrafi rozpoznać z jakim formatem ma do
RE – tutaj zaimplementowany jest podstawowy przykładowym programie umieściłem taki, a nie czynienia. Formaty wspierane przez wspomnia-
szkielet przetwarzania oparty na podstawowych inny nagłówek. Przed funkcją main() zdefinio- ną funkcję to: BMP, DIB, JPEG, JPE, PNG, PBM,
strukturach danych i algorytmach z dziedziny wi-
zji komputerowej, a także na pewnych udogodnie-
niach podstawowych (wsparcie dla XML i funk-
Szybki start
W niniejszej ramce przedstawiony zostanie proces przygotowania do pracy z biblioteką OpenCV
cje rysujące). Kolejne trzy komponenty to wyspe- na platformie Windows przy wykorzystaniu środowiska Microsoft Visual C++ 2005. W tym celu
cjalizowane rozszerzenia biblioteki. CV oferuje za- należy wykonać następujące kroki:
awansowane algorytmy z dziedziny przetwarzania
obrazu oraz wizji, MML – mechanizmy wsparcia • pobrać pakiet instalacyjny biblioteki pod adresem http://sourceforge.net/project/showfi-
les.php?group_id=22870&package_id=16937,
dla uczenia maszynowego, HighGUI – elementy
• zainstalować pobrany pakiet w wybranym katalogu (w dalszej części tej instrukcji będziemy
graficznego interfejsu użytkownika oraz operacje odnosić się do tego katalogu jako CV_HOME),
wejścia/wyjścia dla obrazów i plików video. Ostat- • uruchomić środowisko Microsoft Visual C++ 2005 i stworzyć nowy, pusty projekt typu Win32
ni komponent OpenCV – CvAux, istnieje niejako console application,
w oderwaniu od całości biblioteki i stanowi pole • we właściwościach projektu (C/C++ –> General –> Additional Include Directories) ustawić ka-
doświadczalne tudzież inkubator pomysłów. Moż- talogi nagłówkowe biblioteki OpenCV: CV_HOME\cv\include; CV_HOME\cxcore\include; CV_
HOME\ml\include; CV_HOME\otherlibs\highgui,
na tu znaleźć między innymi implementację al- • we właściwościach projektu (Linker –> General –> Additional Library Directories) ustawić kata-
gorytmów rozpoznawania twarzy, gestów, śledze- log zawierający statyczne biblioteki OpenCV: CV_HOME\OpenCV\lib,
nia ruchów ust i oczu, czy klasy użytkowe do kali- • we właściwościach projektu (Linker –> Input –> Additional Dependencies) ustawić statyczne
bracji kamer. Komponenty te jednak są słabo udo- biblioteki OpenCV: highgui.lib cxcore.lib ml.lib cv.lib,
kumentowane i należy traktować je z pewną dozą • dodać do projektu plik źródłowy i wpisać do niego zawartość Listingu 1,
• zbudować projekt,
ostrożności, dopóki nie zostaną przeniesione do
• skopiować dynamiczne biblioteki OpenCV z katalogu CV_HOME\bin do miejsca z którego
jednego z oficjalnych komponentów biblioteki. będą widoczne dla aplikacji (np. C:/windows/system32),
• uruchomić zbudowany program podając mu jako parametr linii poleceń ścieżkę do wybra-
Wyświetlanie obrazu nego obrazu.
W niniejszym punkcie rozważymy pierwszy, prosty
Wynikiem powyższego postępowania powinien być wyświetlony obraz – podobnie jak widać to na Ry-
program napisany przy pomocy OpenCV – wczy-
sunku 1 (oczywiście zawartość obrazu będzie inna – w zależności od tego jaką podano ścieżkę).
tanie obrazu. Program ten, razem z jego następni-
kiem stanowić będą bazę do prezentacji kolejnych
– bardziej zaawansowanych przykładów. Idea dzia-
łania programu jest bardzo prosta – będzie on wczy- Licencja i użytkownicy
Licencja otwartej biblioteki OpenCV skonstruowana jest w taki sposób, że dany podmiot może
darmowo wykorzystywać dowolne jej części w komercyjnych rozwiązaniach nie będąc przy tym
Listing 1. Wyświetlanie obrazu przy pomocy obligowanym do udostępniania swojego produktu na zasadach wolnego oprogramowania. Jed-
OpenCV nakże autorzy biblioteki mają nadzieję, że osoby bądź firmy korzystające i rozszerzające OpenCV
będą się dzielić rezultatami swoich prac ze społecznością. W dużej części dzięki stosowaniu ta-
#include <highgui.h> kiego liberalnego podejścia OpenCV zyskała wielką rzeszę użytkowników – wliczając w to takie
#include <cassert> duże korporacja jak IBM, Microsoft , Intel, SONY, Siemens, Google i inne. Wiele ośrodków akade-
mickich używa oraz bierze aktywny udział w rozwoju OpenCV (są to między innymi takie pla-
const char* g_windowName = "ImageView";
cówki jak Stanford, MIT, CMU, Cambridge, czy INRIA).
int main( int argc, char** argv )
{
assert( argc == 2 );
IplImage* image = cvLoadImage( OpenCV: przenośność
OpenCV od samego początku była projektowana jako biblioteka przenośna. W tym celu pierwotna
argv[ 1 ] );
wersja biblioteki była kompilowana równolegle narzędziami firmy Borland, Microsoft oraz Intel. Za-
cvNamedWindow( g_windowName, CV_WINDOW_ owocował to powstawaniem wysoce przenośnego kodu C/C++. W rezultacie OpenCV udało się uru-
AUTOSIZE ); chomić platformach Windows, Linux, MacOS, BSD, Solaris i innych. Na dzień dzisiejszy najmocniejszym
cvShowImage( g_windowName, image ); wsparciem ze strony OpenCV szczycić się może platforma Windows oparta na 32-bitowej architektu-
cvWaitKey( 0 ); rze Intela. Zaraz po niej można wymienić system Linux. Wersja dla MacOS jest nieco opóźniona w sto-
cvReleaseImage( &image );
sunku do swoich konkurentów, gdyż jej rozwój nabrał tempa dopiero od momentu gdy Apple zdecy-
dował się na korzystanie z procesorów Intela. Pisząc o przenośności biblioteki warto wspomnieć rów-
cvDestroyWindow( g_windowName );
nież o alternatywnych interfejsach programistycznych: w języku Python oraz Ruby. Istnieje również
} możliwość zintegrowania OpenCV z pakietem Mathlab.

www.sdjournal.org 13
Biblioteka miesiąca

PGM, PPM, SR, RAS, oraz TIFF. cvLoadImage() w oczy to bardzo wysoki poziom abstrakcji ofero- innym przypadku z funkcji zwracana jest wartość
zwraca wskaźnik do struktury IplImage repre- wanych udogodnień. Pokrywa się to z filozofią bi- -1 i sterowanie wraca ponownie do głównej pętli.
zentującej obraz, który zachowujemy sobie na blioteki, którą można by podsumować stwierdze- Spostrzegawczy Czytelnik zauważy zapewne, że
przyszły użytek. W kolejnej linii: niem: proste rzeczy powinny być proste. W ko- w poprzednim przykładzie wspomniana tu funk-
lejnym przykładzie pójdziemy o krok dalej i wy- cja wywołana została z parametrem 0. W takim
cvNamedWindow( g_windowName, CV_WINDOW_ świetlimy sekwencję wideo. przypadku (oraz wtedy gdy przekazany parametr
AUTOSIZE ); jest ujemy), funkcja czeka bezterminowo na reak-
Wyświetlanie sekwencji wideo cję użytkownika blokując program.
program tworzy tak zwane nazwane okno, któ- Odgrywanie sekwencji wideo przy pomocy Analizując program wyświetlający sekwencję
re posłuży nam do tego aby wyświetlić wczyta- OpenCV jest niemalże tak samo proste jak wy- wideo można poczynić kolejne ważne spostrzeże-
ny obraz. Warto zauważyć, że użyta tu funkcja świetlanie pojedynczego obrazu. Czytelników, nie odnośnie OpenCV: widać w tym przypadku
cvNamedWindow(), nie zwraca żadnego wskaźni- którzy chcieliby dowiedzieć się jak można to zro- wyraźnie, że biblioteka jest zaprojektowana na po-
ka. Wynika to z faktu, że komponent HughGUI bić, zapraszam do analizy zawartości Listingu nr trzeby zastosowań związanych z przetwarzaniem
zapamiętuje nazwę przekazaną do tej funkcji (w 2. Z niektórymi elementami programu poznali- obrazów. Objawia się to chociażby faktem, iż przy
naszym przypadku: g _ windowName) dzięki cze- śmy się w poprzednim przykładzie. Nowością jest odtwarzaniu sekwencji wideo programista w wy-
mu będziemy mogli ją wykorzystać przy wy- struktura CvCapture; służy ona do reprezentacji godny sposób może dostać się do poszczególnych
woływaniu kolejnych operacji związanych z ob- strumienia wideo. W naszym przypadku tworzy- klatek sekwencji.
sługą okien. Kilka słów komentarza należy dru- my strumień na podstawie pliku: Mam nadzieję, że przedstawione powyżej,
giemu argumentowi przekazanemu do funkcji proste przykłady pozwolą Czytelnikom poczuć
cvNamedWindow(). W ramach tego argumentu CvCapture* capture = cvCreateFileCapture( klimat biblioteki OpenCV i stanowić będą przy-
można przekazać zestaw flag konfiguracyjnych. argv[ 1 ] ); jazne wprowadzenie w nasze dalsze rozważania.
Użyta w naszym przypadku flaga CV _ WINDOW _ W kolejnych podpunktach zaprezentuję możli-
AUTOSIZE, zgodnie ze swoją nazwą pozwala aby Szkielet programu bazuje na nieskończonej pętli, wości OpenCV w kontekście jej najbardziej po-
okno automatycznie dopasowało się do wielkości w której pobieramy kolejne klatki ze strumienia: pularnych zastosowań.
wyświetlanego obrazka. Kolejnej linia w naszym
programie realizuje właśnie za to zadnie: IplImage* frame = cvQueryFrame( capture ); HighGUI oraz
udogodnienia podstawowe
cvShowImage( g_windowName, image ); po czym wyświetlamy je w zadanym oknie: To z czym Czytelnik zapoznał się w dwóch pierw-
szych przykładach, to jedynie wycinek możliwości
Funkcja cvShowImage() jako pierwszy parametr cvShowImage( g_windowName, frame ); komponentu HighGUI. Moduł ten oferuje zestaw
przyjmuje nazwę okna; drugi parametr to wskaź-
nik do obrazka, który chcemy wyświetlić. I na W pętli sprawdzamy również czy sekwencja się Listing 2. Odgrywanie sekwencji wideo przy
tym w zasadzie kończy się praca naszego progra- nie zakończyła, tudzież czy użytkownik nie prze- pomocy OpenCV
mu – pozostała część kodu odpowiada za sprzą- rwał działania programu wciskając klawisz [ESC]. #include "highgui.h"
tanie. Najpierw program czeka na wciśnięcie kla- To ostatnie sprawdzamy co 33 milisekundy, prze- const char* g_windowName = "PlayVideo";
wisza, później zwalnia obraz i niszczy okno. Vo- kazując do funkcji cvWaitKey() odpowiednią const char* g_keyCode_ESC = 27;
ila! Rezultat działania programu można obej- wartość. Funkcja ta działa w ten sposób, że po jej const int g_delay = 33;
rzeć sobie na Rysunku 2. Po analizie tego krótkie- wywołaniu oczekuje przez określoną liczbę mili- int main( int argc, char** argv )
go programu można wyrobić sobie pierwsze wra- sekund na zdarzenie klawiatury i jeśli takowe się {
żenie odnośnie biblioteki; to co mocno rzuca się pojawi to zwraca ona kod wciśniętego klawisza; w cvNamedWindow( g_windowName, CV_
WINDOW_AUTOSIZE
);
CvCapture* capture =
cvCreateFileCapture( argv[ 1 ] );
while ( true )
{
IplImage* frame = cvQueryFrame(
capture );
if ( !frame )
{
break;
}
cvShowImage( g_windowName,
frame );
char c = cvWaitKey( g_delay );
if( c == g_keyCode_ESC )
{
break;
}
}
cvReleaseCapture( &capture );
cvDestroyWindow( g_windowName );
}
Rysunek 2. Rezultat działania programu opisanego na Listingu 1

14 02/2009
OpenCV

funkcji, które odpowiadają za interakcję z system mechanizm odczytu danych ze strumienia wideo mi. Przykłady wykorzystania niektórych ze wspo-
operacyjnym, z systemem plików oraz ze sprzętem oraz z kamery, dzięki czemu na bazie OpenCV mnianych tutaj udogodnień pokazane będą w ko-
(w tym ostatnim przypadku chodzi przed wszyst- można w łatwy sposób pisać programy niezależ- lejnych punktach.
kim o wszelkiego rodzaju kamery). Jak było wcze- ne od źródła danych. Bardzo miłe dla użytkowni- Przejdziemy teraz do opisu udogodnień ofe-
śniej pokazane, HighGUI pozwala otwierać okna, ka jest to, że nie trzeba się martwić o formaty da- rowanych przez OpenCV a odnoszących się bez-
czytać i zapisywać różnej maści formaty graficzne nych; funkcje czytające potrafią same rozpoznać z pośrednio do tematu wizji komputerowej.
(zarówno obrazy jak i sekwencje wideo) i wyświe- jakim formatem mają do czynienia.
tlać ich zawartość na ekranie. Dodatkowo oferuje Ostatni, trzecia cześć OpenGUI to zestaw gra- Przetwarzanie obrazów
wsparcie dla obsługi podstawowych kontrolerów ficznych kontrolek oraz mechanizmy obsługi inte- Znając zgrubnie wszystkie podstawowe udo-
(mysz, klawiatura) oraz użyteczne kontrolki (np. rakcji z użytkownikiem. Możliwości biblioteki w godnienia OpenCV, możemy przejść do opisu
suwak). Patrząc z punktu widzenia programisty tym zakresie są dość ograniczone (np. OpenCV bardziej wysokopoziomowych operacji, zwią-
korzystającego z HighGUI, w ramach tego kompo- nie oferuje bezpośredniego wsparcia dla przyci- zanych z wizją komputerową. W niniejszym
nent można wydzielić trzy niezależne części: ob- sków), aczkolwiek dostępne mechanizmy są zop- podpunkcie zajmiemy się tematyką przetwa-
sługa sprzętu, interakcja z systemem plików oraz tymalizowane pod kątem zastosowań specyficz- rzania obrazów. Zagadnienie to pełni bar-
graficzny interfejs użytkownika. nych dla wizji komputerowej i praktyka pokazu- dzo istotną rolę w dziedzinie wizji kompu-
Mechanizmy obsługi sprzętu skupiają się je, że za ich pomocą można zaprogramować ca- terowej – można powiedzieć, że jest to jed-
przede wszystkim na obsłudze kamer. Jest to bar- łe spektrum użytecznych interfejsów użytkownia no z podstawowych narzędzi. Obrazy prze-
dzo użyteczne narzędzie, jako że obsługa natyw- – co ważne, w sposób niezależny od platformy. twarza się zazwyczaj w celu wyekstrahowa-
na kamery jest w przypadku większości syste- Oprócz HighGUI, w ramach OpenCV otrzy- nia pewnych szczególnych cech, potrzebnych
mów operacyjnych trudnym i uciążliwym zada- mujemy cały szereg dodatkowych mechani- do przeprowadzania zadanej analizy. Jak refe-
niem. HighGUI pozwala w łatwy sposób pobie- zmów wspierających, które można by zebrać ra- rencyjny przykład tego rodzaju zastosowania
rać dane z kamery ukrywając jednocześnie zbęd- zem i umieścić pod wspólnym szyldem: udo- zbadamy w jaki sposób można przy pomocy
ne szczegóły implementacji. godnienia podstawowe. W ramach tychże udo- OpenCV wykonać operację wygładzania ob-
Część odpowiedzialna za interakcję z syste- godnień otrzymujemy podstawowe typy danych razu (ang. smoothing). Na początek spójrzmy
mem plików oferuje głównie funkcjonalność (CvPoint, CvPoint2D32f, CvPoint3D32f, CvSize, na Listing 3.
związaną z czytaniem i zapisywaniem wszelkiej CvRect, CvScalar), a także struktury danych do Lwia część zawartości Listingu 3 wygląda zna-
maści obrazów. Bardzo ciekawy aspekt bibliote- reprezentacji macierzy i obrazów oraz szereg ope- jomo. Nowym elementami są wywołania funk-
ki związany jest z faktem, iż autorzy zunifikowali racji pozwalających manipulować tymi struktura- cji cvCreateImage() oraz cvSmooth(). Pierwsza

Listing 3. Wygładzanie obrazu przy pomocy


OpenCV

#include <cv.h>
#include <highgui.h>
#include <cassert>
const char* g_inWindowName = "In";
const char* g_outWindowName = "Out";
int main( int argc, char** argv )
{
assert( argc == 2 );
IplImage* in = cvLoadImage( argv[
1 ] );
cvNamedWindow( g_inWindowName, CV_
WINDOW_AUTOSIZE
);
Rysunek 3. Rezultat działania programu opisanego na Listingu 3 cvNamedWindow( g_outWindowName, CV_
WINDOW_AUTOSIZE
);
cvShowImage( g_inWindowName, in );
IplImage* out = cvCreateImage(
cvGetSize( in ),
IPL_DEPTH_8U,
3
);
cvSmooth( in, out, CV_GAUSSIAN, 11,
11 );
cvShowImage( g_outWindowName, out
);
cvReleaseImage( &out );
cvWaitKey( 0 );
cvDestroyWindow( g_inWindowName );
cvDestroyWindow( g_outWindowName );
Rysunek 5. Rezultat działania programu
Rysunek 4. Rezultat działania programu Rorozoom: obraz zmodyfikowany; parametry }
Rorozoom: obraz oryginalny [angle=55.0; zoom=0.7]

www.sdjournal.org 15
Biblioteka miesiąca

z wymienionych funkcji służy do tworzenia no- całkiem niepodobny do zadanego wejścia. Dobrym zoom=0.7] oraz wynikowy obraz dla parametrów
wej instancji obrazu w pamięci – w naszym przy- przykładem może być w tym przypadku transfor- [angle=80.5; zoom=1.6].
padku wykorzystamy go przy wywołaniu funk- mata Fouriera. Inne rodzaje transformacje mogą z OpenCV oferuje oczywiście cały szereg możli-
cji cvSmooth(), która zapisze w nim wyniki swo- kolei całkowicie modyfikować geometrię wejścio- wości dostrojenia mechanizmu transformacji afi-
jego działania. Wywołanie cvSmooth() jest esen- wego obrazu – tak właśnie dzieje się w przypadku nicznej (zainteresowanych Czytelników ponownie
cją tego przykładu – pod interfejsem tej funk- transformacji afinicznej. Tę właśnie transformację odsyłam do dokumentacji biblioteki). Inne trans-
cji kryje się implementacja różnej maści algoryt- zbadamy dokładniej w ramach kolejnego przykła- formacje obrazów wspierane przez OpenCV to:
mów wygładzania. W naszym przypadku użyli- du. Transformacje afiniczne pozwalają zmodyfiko-
śmy metody Gaussa, z wykorzystaniem maski o wać wejściowy obraz na kilka sposobów: poprzez • Splot (ang. convolution),
rozmiarze 11x11 pikseli. Rezultat działania oma- rozciąganie, ściskanie, deformowanie i obracanie. • Operator Sobel'a,
wianego programu pokazany jest na Rysunku 3: w W tym miejscu rozważymy prosty program służą- • Operator Laplace'a,
pierwszym oknie (oznaczonym jako In) wyświe- cy do obracania oraz rozciąganie/ściskania wejścio- • Wykrywanie krawędzi metodą Canny,
tlony jest obraz oryginalny, na drugim (Out) – ob- wego obrazu (stąd nazwa programu: Rotozoom). • Transformacje Hough'a (liniowa i kołowa),
raz wynikowy. Program oprócz ścieżki do pliku z docelowym ob- • Mapowanie pikseli,
Pokazany tutaj przykład jest jedną z wielu moż- razem przyjmuje również dwa dodatkowe parame- • Transformacje układów współrzędnych
liwych wariacji wykorzystania funkcji cvSmo- try: kat obrotu oraz współczynnik skalowania. Na (kartezjańskie oraz polarne),
oth(). Czytelników zainteresowanych szczegóła- początek, zapraszam Czytelników do zapoznania • Dyskretna Transformata Fouriera (DFT),
mi odsyłam do dokumentacji biblioteki. Oprócz się z Listingiem 4, na którym przedstawiony jest • Dyskretna Transformata Kosinusowa
operacji wygładzania OpenCV oferuje szereg uży- kod źródłowy omawianego programu. (DCT).
tecznych funkcji odpowiedzialnych za różnego ro- Program działa następująco. Na początek od-
dzaju przetwarzanie obrazów. Każdy z tych algo- czytuje i konwertuje parametry przekazane z li- Zagadnienia zaawansowane
rytmów wart jest oddzielnego opisu – zarówno w nii poleceń (wykorzystałem do tego rzutowanie Opisane wyżej udogodnienia stanowią podstawo-
kontekście implementacji jak i znaczenia prak- leksykalne dostępne w bibliotece Boost) oraz czy- we bloki budulcowe przy tworzeniu aplikacji wizji
tycznego; niestety, tematyka ta wykracza poza ta i wyświetla wejściowy obraz. W kolejnym kroku komputerowej. Na ich bazie stworzono i udostęp-
ramy niniejszego artykułu. W tym miejscu ogra- przygotowuje sobie macierz transformacji. Warto niono w ramach OpenCV szereg bardziej zaawan-
niczymy się jedynie do wymieniania nazw wspo- zauważyć wykorzystanie standardowej struktu- sowanych mechanizmów. Niestety, analiza tychże
mnianych algorytmów i przedstawiania kilku ry CvMat oraz funkcji cvCreateMat() odpowie- mechanizmów wymaga sporej wiedzy z dziedziny
przykładów ich działania: dzialnej za alokację macierzy. Macież transfor- analizy obrazów i wykracza poza ramy niniejszego
macji tworzona jest na podstawie punktu okre- tekstu. W tym miejscu pozwolę sobie wymienić i
• transformacja morfologiczna: dylatacja ślającego środek obrotu (zmienna center), ką- pokrótce opisać bardziej zaawansowane udogod-
• transformacja morfologiczna: erozja ta obrotu oraz współczynnika zoomu. Mając go- nienia oferowane w ramach OpenCV.
• transformacje Top Hat oraz Black Hat tową macierz, program tworzy klon obrazu wej-
• wypełnianie (ang. flood fill) ściowego, czyści go i przeprowadza transforma- • Histogramy i dopasowanie: histogram jest jed-
• zmiana wielkości cję afiniczną. Do tej wykonania tej ostatniej ope- nym z kluczowych pojęć w teorii analizy ob-
• piramidy obrazów racji służy funkcja cvWarpAffine(), przyjmująca razów. Pozwala przedstawić pewne statystycz-
• próg (ang. threshold) jako parametry wejściowy i wyjściowy obraz oraz ne cechy obrazu, na przykład dystrybucję ko-
• próg adaptacyjny (ang. adaptive threshold) macierz transformacji. Wynik działania programu lorów. Histogramy wykorzystuje się również
przedstawiony jest w nowym oknie. Jeśli użytkow- bardzo intensywnie w aplikacjach wizji kom-
Transformacja obrazów nik podał dodatkowy parametr, to przed zakoń- puterowej; jednym z najbardziej podstawo-
W poprzednim punkcie mówiliśmy o dość ogól- czeniem działania program zapisuje plik z prze- wych ich zastosowań jest wykrywanie zmian
nych procesach przetwarzania obrazów. W tym transformowanym obrazem. Na Rysunkach 4, 5 na scenie na bazie porównywania cech staty-
miejscu skupimy się na procesach transformacji, i 6 przedstawione są odpowiednio: oryginalny ob- stycznych kolejnych klatek obrazu. OpenCV
gdzie na wyjściu może powstać obraz wizualnie raz, wynikowy obraz dla parametrów [angle=55.0; oferuje struktury danych do reprezentacji hi-
stogramów, operacje wspomagające ich two-
Wizja komputerowa w pigułce rzenie oraz implementacje różnorakich metod
Pisząc w największym możliwym uproszczeniu, wizja komputerowa (ang. computer vision) to dziedzina ich porównywania i dopasowywania.
wiedzy opisująca w jaki sposób można transformować strumień danych opisujących obraz (np. przycho-
dzący z kamery) w inną reprezentację, bądź – w decyzję. Wspomniane transformacje wykonywane są po
to aby osiągnąć określony cel, zaś strumień danych może zawierać dodatkowe informacje kontekstowe
(np. informacja o położeniu kamery, lub o strukturze obserwowanej sceny). Typową aplikacją wizji kom-
puterowej może być program monitorujący pewne środowisko (np. magazyn bądź fabrykę) i aktywu-
jący system alarmowy w razie wykrycia intruza. Człowiek będący stworzeniem, którego percepcja opie-
ra się przede wszystkim na postrzeganiu wizualnym, nie zdaje sobie często sprawy ze złożoności tego
procesu. Ludzki mózg dzieli sygnał wizyjny na wiele strumieni i przetwarza go w skomplikowany, w du-
żej części nadal niejasny dla nauki sposób. Z punktu widzenia komputera, obraz to po prostu tablica war-
tości odczytana z zewnętrznego urządzenia, na dodatek dość prymitywnego w porównaniu z ludzkim
okiem. To co dla istoty ludzkiej stanowi w kontekście wizualnego postrzegania rzeczywistości naturalne-
,rutynowe czynnością - dla maszyny jest zazwyczaj nie lada wyzwaniem. Dlatego też istniejące systemy
wizji komputerowej są najczęściej automatami, których mocną stroną jest raczej szybkość i dokładność
przetwarzania danych niż finezyjność stosowanych algorytmów – chociażby w porównaniu do złożono-
ści procesów kontrolowanych przez ludzki mózg. Jak wiadomo, trudne wyzwania są najbardziej ekscy-
tujące – stąd niewątpliwie bierze się tak duże zainteresowanie tą dziedziną, szczególnie w środowiskach
naukowych. Przemysł również docenia rolę patrzących maszyn – np. wiele istniejących hal produkcyj-
nych monitorowane jest za pośrednictwem systemów wizji komputerowej. Rozwiązania pokroju biblio-
teki OpenCV stanowią nieocenioną wartość dodaną dla ludzi i firm parających się tematyką wizji kompu- Rysunek 6. Rezultat działania programu
terowej, stanowiąc wspólną, solidną podstawę do budowania kolejnych, bardziej złożonych rozwiązań. Rorozoom: obraz zmodyfikowany; parametry
[angle=80.5; zoom=1.6]

16 02/2009
OpenCV

• Określanie konturów: algorytmy wykrywa- urządzeniami nie należy do najprostszych; telnika ze strukturą i filozofią biblioteki, oraz
nia krawędzi pozwalają wykrywać piksele dzięki OpenCV zadanie to jest o wiele ła- przekonanie o wysokiej praktyczności prezen-
rozgraniczające segmenty obrazu; niestety twiejsze. towanego rozwiązania. Otwartość, czytelność,
nie dostarczają one informacji o strukturze • Projekcja i wizja 3D: zestaw metod do eks- efektywność i starannie dobrany poziom abs-
tych segmentów. Kolejnym logicznym kro- trakcji informacji o 3-wymiarowej geometrii trakcji – to niewątpliwie czynniki przemawia-
kiem jest złożenie wykrytych krawędzi w obiektów na bazie zestawu 2-wymiarowych jące za wykorzystywaniem OpenCV, zarówno
kontur. OpenCV oferuje funkcje do wyszu- obrazów (między innymi: stereowizja). w zastosowaniach komercyjnych, edukacyjnych
kiwana i budowania konturów, a także do ich • Uczenie maszynowe: mechanizmy wspoma- jak i hobbystycznych. Ze względu na obszerność
późniejszej analizy i przetwarzania. gające automatyczne przekształcania danych prezentowanego zagadnienia, wiele z prezento-
• Części obrazów i segmentacja: OpenCV po- w informacje – bazujące przede wszystkim wanych tematów potraktowane zostało dość po-
zwala izolować wybrane obiekty sceny i wy- na statystycznym dopasowywaniu wzor- wierzchownie. W tej sytuacji autorowi pozosta-
cinać je z wejściowego obrazu; stosowane ców (ang. statistical pattern recognition) oraz je odesłać żądnych kolejnych porcji wiedzy Czy-
w tym przypadku metody bazują przede klasteryzacji (ang. clustering).; oferowane w telników do zewnętrznych źródeł (patrz Ramka
wszystkim na opisanych wcześniej algoryt- OpenCV w postaci dedykowanej, zagnież- Materiały) i życzyć wielu udanych eksperymen-
mach przetwarzania obrazu. dżonej biblioteki: MLL (ang. Machine Lear- tów z OpenCV. Nich moc komputerowej wizji
• Śledzenie i ruch: w rzeczywistym świecie ning Library). będzie z Wami!
rzadko kiedy mamy do czynienia ze statycz- PS. Na sam koniec chciałbym podziękować
nymi obrazami; najczęściej zachodzi potrze- Podsumowanie mojemu przyjacielowi, Dawidowi de Rosier,
ba obserwacji i analizy sekwencji ruchów Przedstawiony wyżej, pobieżny przegląd moż- za użyczenie pięknych zdjęć z jego podróży, na
określonych obiektów; OpenCV oferuje liwości OpenCV miał na celu zapoznanie Czy- użytek powyższego artykułu.
w tym zakresie cały arsenał implementacji
użytecznych metod. Listing 4. Kod źródłowy przykładowego programu Rotozoom
• Modele kamer i kalibracja: wizja kompute-
rowa zaczyna się od wykrywania natężenia #include <cv.h>
światła – jest to głównym zadaniem wszel- #include <highgui.h>
kiej maści kamer. Niestety, interakcja z tymi #include <cassert>
#include <boost/lexical_cast.hpp>
RAFAŁ KOCISZ const char* g_inWindowName = "Rotozoom (in)";
Rafał Kocisz pracuje na stanowisku Dyrektora Technicz- const char* g_outWindowName = "Rotozoom (out)";
nego w firmie Gamelion, wchodzącej w skład Grupy int main( int argc, char** argv )
BLStream. Rafał specjalizuje się w technologiach zwią- {
zanych z produkcją oprogramowania na platformy mo- assert( argc == 4 || argc == 5 );
bilne, ze szczególnym naciskiem na tworzenie gier. Gru- double angle = boost::lexical_cast< double >( argv[ 2 ] );
pa BLStream powstała, by efektywniej wykorzystywać double scale = boost::lexical_cast< double >( argv[ 3 ] );
potencjał dwóch szybko rozwijających się producentów IplImage* src = cvLoadImage( argv[ 1 ], 1 );
oprogramowania – BLStream i Gamelion. Firmy wcho- IplImage* dst = 0;
dzące w skład grupy specjalizują się w wytwarzaniu assert( src != 0 );
oprogramowania dla klientów korporacyjnych, w roz- cvNamedWindow( g_inWindowName, 1 );
wiązaniach mobilnych oraz produkcji i testowaniu gier. cvShowImage( g_inWindowName, src );
Kontakt z autorem: rafal.kocisz@game-lion.com CvMat* rotationMatrix = cvCreateMat( 2, 3, CV_32FC1 );
CvPoint2D32f center = cvPoint2D32f(

W Sieci src->width / 2,
src->height / 2
• http://sourceforge.net/projects/opencvlibrary );
: strona projektu na SourceForge.net cv2DRotationMatrix( center, angle, scale, rotationMatrix );
• http://opencv.willowgarage.com/wiki/ :
dst = cvCloneImage( src );
ofcjalne wiki projektu
• http://tech.groups.yahoo.com/group/ dst->origin = src->origin;
OpenCV/ : grupa dyskusyjna projektu cvZero( dst );
cvWarpAffine( src, dst, rotationMatrix );
cvNamedWindow( g_outWindowName, 1 );
Materiały cvShowImage( g_outWindowName, dst );
Czytelnicy zainteresowani tematem wizji kom- cvWaitKey();
putowej oraz OpenCV powinni zainteresować if ( argc == 5 )
się książką Learning OpenCV: Computer Vision {
with the OpenCV Library, autorstwa panów
cvSaveImage( argv[ 4 ], dst );
Garego Bradskiego oraz Adriana Kaehlera. Po-
zycja ta polecana jest na wiki OpenCV jako ofi- }
cjalna referencja biblioteki. Oprócz szczegóło- cvReleaseImage( &src );
wej prezentacji możliwości OpenCV, Czytelnik cvReleaseImage( &dst );
wspomnianej książki będzie miał okazję zapo- cvDestroyWindow( g_inWindowName );
znać się z wieloma teoretycznymi zagadnie- cvDestroyWindow( g_outWindowName );
niami z zakresu wizji komputerowej, zilustro-
cvReleaseMat( &rotationMatrix );
wanymi działającymi programami zbudowa-
nymi na bazie OpenCV. Niniejszy artykuł po- return 0;
wstał właśnie pod natchnieniem tej pozycji. }

www.sdjournal.org 17
Programowanie JAVA

Oracle CEP – złożone


przetwarzanie zdarzeń
Complex Event Processing / Event Stream Processing

Complex Event Processing (CEP) to jedna z technik przetwarzania zdarzeń w


aplikacjach zdarzeniowych, posługujących się paradygmatem "nasłuchuj-i-
odpowiedz" (ang. listen-and-respond), czyli takich, w których logika biznesowa
jest uruchamiana w wyniku pojawienia się określonego zdarzenia.
Language), który wzbogaca znane z SQL mecha-
Dowiesz się: Powinieneś wiedzieć: nizmy o konstrukcje typowe dla złożonego prze-
• Na czym polega specyfika Complex Event Pro- • Trochę o SQL; twarzania zdarzeń – takie, jak płynące (ang. sli-
cessing; • Czym jest serwer aplikacyjny; ding window) lub skaczące (ang. batching window)
• Jak buduje się aplikacje CEP w Java; • Czym jest Spring Framework. okna (czasowe lub obejmujące określoną liczbę
• Czym jest zdarzeniowy serwer aplikacyjny taki zdarzeń), wyszukiwanie wzorców (przyczyna-sku-
jak Oracle CEP. tek), trendów, a nawet identyfikację brakujących
elementów (zdarzeń) we wzorcu.
W EPL zamiast nazw kolumn (po klauzuli
nut – pojawi się komunikat typu B, to wy- SELECT) znajdują się nazwy atrybutów zdarzeń, a
konaj operację X; zamiast nazw tabel (po FROM) znajdują się nazwy
Poziom trudności • kiedy pojawi się komunikat typu Trans- strumieni zdarzeń (choć mogą także znajdować
akcja Giełdowa, którego wartość atrybu- się nazwy tabel lub buforów cache, co może być
tu Cena odbiega od średniej wartości tego przydatne przy łączeniu dynamicznych, szybko-
atrybutu w ciągu ostatnich 30 minut, to zmiennych danych w zdarzeniach z bardziej sta-

Z
darzenie jest zapisem zajścia określonej wykonaj operację Kupuj; tycznymi danymi w bazach danych). Podobnie w
zmiany. Zdarzenia (ang. events) są najczę- • kiedy w ciągu 15 minut po pojawieniu się EPL wykorzystywane są takie konstrukcje SQL
ściej transportowane do aplikacji zdarze- komunikatu typu A, pojawi się komunikat jak INSERT INTO (czyli tworzenie nowego strumie-
niowych w postaci komunikatów (ang. messages). typu B, posiadający tę samą wartość atry- nia zdarzeń), WHERE, INNER/OUTER/FULL/LEFT/
Typowymi źródłami zdarzeń są sensory (np. czuj- butu id co wartość atrybutu id w A oraz RIGHT JOIN, ORDER BY, GROUP BY, HAVING, itp.
niki), czy generatory, ale mogą to być także aplika- NIE pojawi się komunikat typu C (także
cje biznesowe (np. wykonanie transakcji, bądź pro- mający ten sam id), to wykonaj operację X. CEP w przykładach
cesu biznesowego, co powoduje powstanie jedne- W poniższym przykładzie reguła EPL do-
go lub – co częstsze – większej liczby zdarzeń). Korelacje mogą także obejmować wiele źródeł konuje filtrowania zdarzeń w strumieniu
zdarzeń (np. wiele strumieni transakcji gieł- MarketTransactions (np. modelującym transak-
Na czym polega CEP? dowych). cje kupna/sprzedaży walut na giełdzie) i zwraca
Specyfika CEP jako techniki przetwarzania zda- (przepuszcza dalej, tj. do kolejnego elementu w sie-
rzeń polega na tym, że CEP skupia się nie tyle na CEP w ofercie Oracle ci EPN – Event Processing Network, o której w dal-
przetwarzaniu pojedynczych zdarzeń, co raczej na Technologią wspierającą budowę aplikacji zdarze- szej części artykułu) tylko te zdarzenia, których
przetwarzaniu grup zdarzeń, poszukiwaniu kore- niowych, korzystających ze złożonego i strumie- wartość atrybutu price dla danej waluty wyno-
lacji pomiędzy zdarzeniami w grupie, szczególnie niowego przetwarzania zdarzeń (CEP/ESP) w Ja- si mniej niż 75% średniej ruchomej wartości tego
korelacji mających charakter czasowy (strumieni va jest Oracle CEP Server (dawniej BEA WebLo- atrybutu z ostatnich 10 sekund. Reguła tego typu
zdarzeń), przyczynowo-skutkowy (czy w innym gic Event Server). Jest to dedykowany przetwarza- pozwala wykrywać w czasie rzeczywistym nagłe
wymiarze, np. geograficznym). Zwykle, przetwa- niu zdarzeń serwer aplikacyjny Java, oferujący mo- spadki ceny określonych walut. (Listing 1.)
rzanie tych grup zdarzeń w CEP odbywa się w cza- del programistyczny oparty o Spring, Spring-DM i Widoczne jest tutaj wprowadzenie koncepcji
sie rzeczywistym, tzn. czas reakcji na pojawienie OSGi, wraz z zaawansowanym, wysokowydajnym płynącego okna czasowego (RETAIN 10 SECONDS),
się określonej korelacji wśród płynących do aplika- procesorem zdarzeń, którego zadaniem jest mo- przechowującego tyle zdarzeń ze strumienia
cji zdarzeń jest skończony. Korelacja jest zdaniem nitorowanie w sposób ciągły strumieni zdarzeń MarketTransactions, ile pojawiło się w ciągu
logicznym typu kiedy ...., to .... Przykłady korelacji: przychodzących do aplikacji i poszukiwaniu w ostatnich 10 sekund. Wykonanie reguły (SELECT,
tych strumieniach zdefiniowanych wcześniej ko- GROUP BY i HAVING) jest zawężone do tego okna
• kiedy pojawi się komunikat typu A, a po relacji. Do opisu korelacji (reguł) wykorzystywa- czasowego. Reguła jest wykonywana w sposób cią-
nim – w przeciągu maksymalnie 10 mi- ny jest oparty o SQL język EPL (Event Processing gły (ang. continuous query, streaming query).

18 02/2009
Oracle CEP – złożone przetwarzanie zdarzeń

Inny przykład EPL dotyczy wykrywania naj- technology/documentation/bea.html) zawiera bar- bardzo wysoka wydajność i krótki czas opóźnień
wyżej wycenionych akcji (walorów): (Listing 2.) dziej dokładny opis języka EPL i dalsze jego przy- (ang. latency) w dostępie do buforów. Dostępne
Tutaj, ze strumienia MarketTrade filtruje- kłady, a także znacznie dokładniejsze informacje są także zaawansowane mechanizmy przetwa-
my najpierw transakcje o określonej wielkości nt. modelu programistycznego, sposobu budo- rzania (np. wykonywanie zapytań i logiki bizne-
(blockSize > 10) – widać przykład użycia po- wania aplikacji zdarzeniowych i ich komponen- sowej w sposób masowo-równoległy).
dzapytań (zagnieżdżonych SELECT). Dla każde- tów, administracji, klastrowania, itp. Najnowsza wersja produktu przynosi tak-
go waloru (symbol), przechowywanych jest 100 Oracle CEP Server wspiera budowę wysoko- że wiele innych przydatnych mechanizmów
takich transakcji o najwyższej cenie (RETAIN 100 wydajnych aplikacji zdarzeniowych, tzn. jest – np. możliwość nagrywania (ang. record), a na-
EVENTS WITH LARGEST price PARTITION BY specjalnie zaprojektowany pod kątem przetwa- stępnie odtwarzania (ang. playback) zdarzeń
symbol). Czyli dla 1000 symboli będzie prze- rzania dużej liczby zdarzeń (rzędu milionów przychodzących/wychodzących z określonych
chowywanych 100.000 takich transakcji. Wy- zdarzeń na sekundę i więcej), z zachowaniem komponentów aplikacji. W zakresie możliwo-
nik zapytania jest dodatkowo posortowany (OR- reżimu bliskiemu czasowi rzeczywistemu (np. ści integracyjnych – obok samodzielnie two-
DER BY) i pogrupowany (GROUP BY) wg symbo- wymaganie, aby średni czas przetwarzania rzonych w kodzie Java adapterów – możliwe
lu waloru, z odrzuceniem tych walorów, których przez serwer aplikacyjny 99.99% zdarzeń był jest także wykorzystanie (poprzez konfigura-
średnia cena jest mniejsza od 100 (HAVING). poniżej 5 milisekund). Także liczba równocze- cję, tj. bez potrzeby kodowania) technologii
W kolejnym przykładzie tworzony jest śnie wykonywanych zapytań może być wysoka JMS, czy HTTP Publish-Subscribe (poprzez
nowy strumień zdarzeń (INSERT INTO (rzędu tysięcy lub dziesiątków tysięcy wykony- protokół Bayeux, znany m.in. z rozwiązań klasy
MessagesStream), w którym będą pojawiać się wanych w sposób ciągły reguł). Zagadnienie wy- Comet, czy reverse-AJAX/push-AJAX).
zdarzenia o określonych atrybutach (SELECT dajności jest dosyć dokładnie omówione w pu-
‘terminal 1 is offline’), gdy w dowolnym blicznie dostępnym dokumencie, opisującym Oracle CEP w Internecie
oknie czasowym o długości 65 sekund (WITHIN jeden z benchmarków produktu Oracle CEP W pełni funkcjonalna wersja ewaluacyjna
65 SECONDS), w strumieniu Status NIE POJA- Server (dokument dostępny pod adresem: http: Oracle CEP Server jest dostępna na stronach
WI się zdarzenie, którego atrybut term.id jest //www.oracle.com/technology/products/event-dri- internetowych Oracle (http://www.oracle.com/
równy T1 (MATCHING NOT). Dodatkowo jest kon- ven-architecture/complex-event-processing.html). technology/software/products/cep/index.html), na
trolowana częstotliwość pojawiania się zdarzeń Warto przy tym zaznaczyć, iż możliwość prze- których także można znaleźć więcej informacji
w tym nowym strumieniu (MessagesStream) twarzania miliona zdarzeń na sekundę w cza- o samej technologii, typowych scenariuszach jej
– tak, aby tylko raz na pięć minut takie zda- sie rzeczywistym (soft real-time), osiągnięto na użycia i pozycjonowaniu w ramach szerszej in-
rzenie było wysyłane (OUTPUT FIRST EVERY 5 przeciętnym dzisiaj sprzęcie klasy Intel x86 (4 frastruktury SOA i EDA.
MINUTES): (Listing 3.) CPU quad core, Intel Xeon). Praktyczne ćwiczenia, obejmujące m.in. de-
Wynik wykonania takiej reguły ma najczę- Z racji tego, iż Oracle CEP Server jest serwe- monstrację instalacji produktu, konfigura-
ściej postać nowego strumienia zdarzeń, któ- rem aplikacyjnym Java, to zawiera także mecha- cję środowiska deweloperskiego (z wykorzy-
re wzbudzają wykonywanie określonej logiki nizmy klastrowe, pozwalające budować skalo- staniem Eclipse), budowę prostych aplikacji
biznesowej (np. kodu Java bądź wywołania ze- walne i wysokodostępne rozwiązania. Wykorzy- zdarzeniowych oraz wskazówki dotyczące po-
wnętrznych usług – notabene w tym drugim stywana jest tutaj wiodąca w tej klasie technolo- znawania pozostałych możliwości technologii
przypadku, często mówi się o ED-SOA, czyli gia gridowa (in-memory data grid) – Oracle Co- Oracle CEP Server, autor niniejszego artykułu
Event-driven Service Oriented Architecture, tj. ar- herence. Pozwala ona tworzyć automatycznie zamieścił na swoim blogu: http://jdn.pl/blog/88.
chitekturze zorientowanej na usługi, w której zarządzane, przechowywane w pamięci bufory
żądanie wykonania usług jest określone przez i ich rozproszenie na wiele (nawet tysiące) ma-
pojawienie się zdarzeń lub – jak w przypadku szyn. Dzięki redundancji (replikacji danych) eli- WALDEMAR KOT
CEP – określonej korelacji zdarzeń w czasie). minowana jest możliwość utraty danych w wy- Waldemar Kot pracuje w Oracle Polska jako Princi-
niku awarii pojedynczej maszyny (a nawet więk- pal Sales Consultant, Eastern Europe.
Oracle CEP w zbliżeniu szej ich liczby), a jednocześnie zachowana jest Kontakt z autorem: waldemar.kot@oracle.com
Na aplikację w Oracle CEP Server składa się z
szereg komponentów przetwarzających zdarze- Listing 1. Reguła EPL – przykład prostego filtrowania zdarzeń z użyciem okna czasowego
nia (adapterów, procesorów zdarzeń, kodu Java,
obiektów Spring, usług OSGi, itd), połączonych w SELECT currency, AVG(price) AS avgPrice, price AS MarketPrice
sieć przetwarzania zdarzeń (ang. EPN – Event Proces- FROM MarketTransactions
sing Network). Sieć jest tworzona (składana) w spo- RETAIN 10 SECONDS
sób deklaratywny, z wykorzystaniem takich tech- GROUP BY currency
nik programistycznych jak Dependency Injection HAVING price < AVG(price) * 0.75
i Aspect Oriented Programming. W łatwiejszym
skorzystaniu z tych technik pomaga również wy- Listing 2. Reguła EPL – przykład obliczania wartości maksymalnej w czasie
korzystanie bardzo popularnej platformy aplika- SELECT symbol, AVG(price)
cyjnej – Spring Framework, wraz z jej rozszerze- FROM (SELECT * FROM MarketTrade WHERE blockSize > 10)
niami w stronę innej, zdobywającej coraz większą RETAIN 100 EVENTS WITH LARGEST price PARTITION BY symbol GROUP BY symbol
popularność technologii komponentowej – OSGi HAVING AVG(price) >= 100
(Oracle CEP Server jest jednym z pierwszych ser- ORDER BY symbol
werów aplikacyjnych, które na produkcyjną skalę
wykorzystują technologię OSGi). Wykorzystana Listing 3. Reguła EPL – przykład wykrywania brakujących zdarzeń we wzorcu
jest tu rozwijana przez Oracle i SpringSource tech- INSERT INTO Messages
nologia Spring-DM (Spring Dynamic Modules for SELECT 'terminal 1 is offline'
OSGi Service Platforms). MATCHING NOT Status(term.id = 'T1') WITHIN 65 SECONDS
Publicznie dostępna w postaci HTML i PDF OUTPUT FIRST EVERY 5 MINUTES
dokumentacja produktu (http://www.oracle.com/

www.sdjournal.org 19
Programowanie .NET

jQuery i ASP.NET
Wprowadzenie do biblioteki
jQuery z przykładami w ASP.NET AJAX

Otwarta biblioteka JavaScript jQuery sprawia, że pisanie kodu po stronie


klienta staje się przyjemniejsze a dzięki połączeniu jQuery z technologią
ASP.NET AJAX otrzymujemy potężny, efektywny szkielet aplikacyjny do
pisania aplikacji ajaksowych.

W celu pokazania omawianych poniżej wła-


Dowiesz się: Powinieneś wiedzieć: ściwości biblioteki jQuery, stworzymy pro-
• czym jest biblioteka jQuery, • wiedzieć jak tworzyć strony w ASP.NET, stą aplikację w ASP.NET, widoczną na Li-
• jakie korzyści daje integracja jQuery z ASP.NET. • posiadać podstawową wiedzę na temat biblio- stingu 1. Przedstawiona strona wyświetla li-
teki Microsoft ASP.NET AJAX, stę filmów w postaci prostej tabeli, bez for-
• posiadać znajomość składni CSS, matowania – jak widać na Rysunku 1. W
• posiadać podstawową znajomość JavaScript. kolejnych sekcjach dodawać będziemy kod
jQuery do naszej przykładowej strony, aby
tabela filmów wyglądała efektowniej oraz
Biblioteka jQuery dostarcza nam kilka klu- umożliwiała prostą interakcję z użytkow-
czowych funkcjonalności, takich jak: nikiem.
Poziom trudności
• Selektory elementów HTML. Selektory elementów HTML
• Operacje na zbiorach. Selektory jQuery pozwalają wskazać elementy
• Obsługę zdarzeń. strony HTML, na których następnie możemy

B
iblioteka jQuery została napisana • Animacje. wywołać wbudowane metody biblioteki. jQu-
przez Johna Resiga. Umożliwia ona • Łatwą rozszerzalność poprzez zastosowa- ery używa składni CSS 3.0 (plus kilka rozsze-
przede wszystkim eleganckie i efek- nie wtyczek. rzeń), aby wskazać jeden, bądź kilka, elemen-
tywne manipulowanie elementami HTML tów w dokumencie. Dzięki użyciu składni
przy minimalnym nakładzie pracy. Progra- Co jest również bardzo ważne, ta bogata funk- CSS, jQuery jest bardzo prosty do nauczenia
mistów ASP.NET zainteresuje dodatkowo cjonalność jQuery dostarczona jest w małej bi- się i używania – programista aplikacji interne-
fakt, że Microsoft ogłosił pełne wsparcie dla bliotece o wadze około 19 KB (wersja skompre- towych jest obeznany z tą składnia selektorów
frameworka jQuery. Połączenie jQuery z sowana). dzięki stylizowaniu stron HTML.
ASP.NET ułatwia praca każdemu programi- Aby można było rozpocząć pracę z biblio- Element strony HTML możemy wskazać
ście aplikacji webowych, ponieważ umożli- teką jQuery, należy dodać referencję do niej m.in. poprzez atrybut id
wia bardzo szybkie wzbogacenie pisanej apli- na swojej stronie.
kacji o elementy interaktywne np. dynamicz- Ostatnią wersję jQuery możemy pobrać $(„#gdMovies”).css(„width”,”120px”),
ną zmianę kolorów, przesunięcie elementu ze strony www.jQuery.com. Bibliotekę doda-
czy jego wygaszenie. W niniejszym artyku- jemy do strony poprzez znacznik <script poprzez klasę CSS
le zostaną omówione podstawy oraz sposo- src=”scripts/jquery.js” type=”text/
by wykorzystania jQuery wraz z technologią javascript”>. $(„.gridAlternate”).css(„background”,”yell
ASP.NET AJAX. Innym sposobem dodania referencji do bi- ow”),
blioteki może być użycie kontrolki ScriptMana-
Wprowadzenie do jQuery ger z biblioteki ASP.NET AJAX. albo możemy również wskazać elementy z kil-
Dzięki użyciu jQuery można diametralnie ku klas CSS
zmienić nastawienie do programowania po <asp:ScriptManager id="sm1" runat="server">
stronie klienta. Nauczenie się tej biblioteki mo- <Scripts> $(„.gridrow, .gridAlternate”).attr(„tag”,”
że przynieść istotne korzyści poprzez zwiększe- <asp:ScriptReference Path="~/Scripts/ row”).
nie naszej produktywności oraz podniesienie jquery-1.2.6.js" />
pewności siebie przy pisaniu skomplikowanych </Scripts> Do wskazywania elementów możemy używać
frontonów w Javascript. </asp:ScriptManager> również filtrów. Następujący przykład wybie-

20 02/2009
jQuery i ASP.NET

ra wszystkie elementy w dokumencie będące ny. Dzięki temu prostemu skryptowi otrzyma- dą obsługującą zdarzenie, informującą kiedy
przyciskami i zmienia im kolor tła: liśmy efekt pokolorowania parzystych wierszy dokument jest gotowy do użycia oraz o fak-
tabeli co widać na Rysunku 2. Przeanalizujmy cie, że wszystkie skrypty zostały załadowa-
$(„input:button”).css(„background”,”yellow”). co sprawiło że ta prosta komenda jQuery za- ne. Metoda obsługująca zdarzenie .ready()
działała. może zostać umieszczona w dowolnym miej-
Jeśli składnia CSS nie jest Ci obca, to zrozu- Jeżeli wrócimy do kodu z Listingu 2, to scu na stronie, nawet parę razy. Procedura ob-
mienie powyższych przykładów nie powin- przede wszystkim zauważymy symbol $, któ- sługi została zaimplementowana przy użyciu
no stanowić żadnego problemu. Takiej samej ry jest aliasem obiektu jQuery. W wyniku cze- anonimowej funkcji $(document).ready(fu
składni możesz użyć w arkuszu stylów w ce- go zapis $(document) można napisać jQuery- nction(){...}). Jest to bardzo częsta prak-
lu znalezienia elementów do stylizacji (wyjąt- (document). Obiekt jQuery pobiera selektor tyka w jQuery. Jako parametr dla zdarzenia
kiem jest filtr :button , ponieważ jest on spe- jako parametr. Przeważnie selektory są repre- ready możemy również przekazać wskaźnik
cyficzny dla jQuery). zentowane przez łańcuchy znaków, ale może- do funkcji, np.: $(document).ready(onLoad
Jak widać, idea twórcy jQuery jest prosta: my również przekazać elementy DOM albo in- ed), gdzie onLoaded jest funkcją zdefiniowa-
używaj to, co już dobrze znasz albo przynajm- ny obiekt jQuery. ną w kodzie.
niej używaj standardowych mechanizmów za- Przykładowo zapis $(document) przeka- Wracając do przykładu kolorowych wierszy,
miast nowych rozwiązań. zuje element document, wynikiem czego jest przeanalizujmy część kodu, który wykonuje ak-
W Tabeli 1 zamieszczony został opis kilku zbiór jednoelementowy zawierający obiekt cję zamiany koloru. Cała magia tej akcji leży w
najczęściej używanych selektorów w jQuery. document. użytym selektorze $("#gdMovies tbody tr:
Wróćmy do naszego przykładu i zacznijmy Zwróćmy uwagę na użycie metody even"), który możemy przeczytać następują-
od dodania skryptu z Listingu 2 na dole stro- $(document).ready(). .ready() jest meto- co: pobierz element gdMovies oraz wszystkie
jego dzieci będące elementami tbody i znajdź
wszystkie elementy tr będące poniżej oraz
Listing 1. Prosta strona ASP.NET używana w przykładach zwróć odfiltrowany (tr:even) zbiór, który za-
<html xmlns="http://www.w3.org/1999/xhtml" > wiera tylko elementy parzyste. Na końcu użyta
<head runat="server"> została metoda CSS, która dla każdego elemen-
tu ze zwróconego zbioru przypisuje styl defi-
<title>Table</title> niujący kolor tła.
<script src="Scripts/jquery-1.2.6.js" type="text/javascript"></script>
Operacje na zbiorach
</head> Wynikiem komendy $("#gdMovies tbody
<body> tr:even") jest obiekt jQuery, który jest ta-
<form id="form1" runat="server"> blicą zawierającą każdy dopasowany ele-
<div> ment. Możemy odwołać się do elementów
DOM w odszukanym zbiorze również bez-
<asp:GridView ID="gdMovies" runat="server" AutoGenerateColumns="False" pośrednio.
DataKeyNames="Id" DataSourceID="srcMovies">
<HeaderStyle CssClass="gridheader"/> var res = $("#gdMovies tbody tr:even");
<Columns> var len= = res.length; // liczba
<asp:BoundField DataField="Id" HeaderText="Id" ReadOnly="True" dopasowań. 0 = brak dopasowań
SortExpression="Id" /> var el = res[0] // pierwszy element
<asp:BoundField DataField="Title" HeaderText="Tytuł"
SortExpression="Title" /> jQuery zawsze zwraca rezultat w postaci
<asp:BoundField DataField="Director" HeaderText="Reżyser" obiektu, nawet jeśli selektor nie znalazł ele-
SortExpression="Director" /> mentów, obiekt jest zwracany, dzięki cze-
<asp:BoundField DataField="DateReleased" HeaderText="Data produkcji" mu możemy sprawdzić właściwość .length ,
SortExpression="DateReleased" /> aby określić czy zostały zwrócone jakieś ele-
</Columns> menty.
</asp:GridView> Jeżeli jednak selektor znalazł elementy i
... zwrócił listę, można łatwo ją przetworzyć uży-
</div> wając jednej z ponad 100 funkcji z jQuery API.
</form> Każda taka funkcja zostanie zastosowana dla
</body> każdego elementu ze znalezionej listy, bez po-
</html> trzeby ręcznego przechodzenia przez ten zbiór
elementów.
Listing 2. Przykład uzyskania efektu pokolorowania parzystych wierszy tabeli
<script type="text/javascript">
$(document).ready(function() {

$("#gdMovies tbody tr:even")


.css("background","yellow");
}
);
</script> Rysunek 1. Oryginalna wersja strony testowej po
uruchomieniu

www.sdjournal.org 21
Programowanie .NET

jQuery posiada bardzo przydatną funk- nie, aby po najechaniu myszą na wiersz zmie- konywania animacji, można tu podać jed-
cjonalność jaką jest łączenie wywołań wie- nił się jego kolor tła oraz, aby po kliknięciu na ną z przedefiniowanych stałych ('slow',
lu funkcji w ramach jednej komendy. Przy- danym wierszu wyświetliła się zawartość trze- 'normal','fast') albo podać czas w milise-
kład takiego wywołania znajduje się na Li- ciej kolumny. kundach. Drugi parametr określa funkcję
stingu 3. Rozwiązanie tego zadania prezentuje Li- zwrotną, która zostanie wykonana po zakoń-
Nie wszystkie metody mogą być łączone w sting 4. Aby osiągnąć ten efekt, dodajmy dwie czeniu animacji.
łańcuchy wywołań, dotyczy to metod zwra- procedury obsługujące zdarzenia po najecha- Taka prosta możliwość animacji obiektów
cających prostą wartość, a nie listę elemen- niu myszą na wiersz – zdarzenie hover() dodatkowo ułatwia pisanie aplikacji z użyciem
tów. Tymi funkcjami są m.in.: val(), text(), oraz zdarzenie kliknięcia myszą – zdarzenie technologii AJAX, w których odświeżany jest
html() – których rezultatem jest łańcuch zna- click(). tylko fragment strony. Dzięki takiemu proste-
ków oraz metody width() i height() – zwra- Funkcja hover() pobiera jako argumenty mu zastosowaniu animacji możemy w łatwy
cające liczby. dwie metody zwrotne. Pierwsza funkcja obsłu- sposób pokazać, że zaszła zmiana na elemen-
guje zdarzenie najechania myszą, druga funkcja cie odświeżanym.
Obsługa zdarzeń natomiast obsługuje zdarzenie usunięcia kurso-
Obsługa zdarzeń w jQuery jest bardzo prosta ra myszy znad obiektu. Łatwa rozbudowa poprzez wtyczki
i co najważniejsze spójna pomiędzy różnymi Procedura obsługi zdarzenia zawsze jest wy- Wtyczki są jednym z głównych powodów,
przeglądarkami. jQuery dostarcza dwie głów- woływana w kontekście elementu powodujące- dlaczego jQuery stał się tak popularny. Na
ne funkcje bind() oraz unbind(), które słu- go zdarzenie – w naszym przypadku jest to ele- stronie plugins.jquery.com, możemy znaleźć
żą odpowiednio do przyłączenia i odłączenia ment tr, do którego w kodzie mamy dostęp po- bogatą kolekcję wtyczek dla jQuery podzielo-
procedury obsługi zdarzenia do elementów na przez następujący zapis $(this). nych na różne kategorie, m.in. tabela, AJAX,
liście elementów znalezionych przez selektor. menu, animacje, itp.
Dodatkowo zdarzenia klawiatury i my- Animacje Użycie wtyczek jest bardzo proste, wystar-
szy mają specjalne dedykowane funkcje ta- jQuery udostępnia kilka bardzo prostych, ale czy pobrać wtyczkę z odpowiedniej strony,
kie jak click(), mousedown(), change() albo efektownych metod pozwalających animować dodać do niej referencję, i już możemy wy-
keydown(). obiekty, są to: wołać ją na naszym obiekcie jQuery tak jak
jQuery wprowadza bardzo prosty model dla każdą inną wbudowaną metodę. Dla przy-
obsługi zdarzeń: • $(...).hide() – chowanie elementu, kładu użyjemy wtyczki tablesorter, która do-
• $(...).show() – pokazywanie elementu, daje do tablicy możliwość sortowania. Po po-
• wskaźnik this zawsze odpowiada elemen- • – rozwinięcie ele-
$(...).slideDown() braniu wtyczki z jej strony domowej (http:
towi wywołującemu zdarzenie, mentu z góry do dołu, //tablesorter.com/docs/), umieszczamy refe-
• obiekt zdarzenia jest zawsze przekazywa- • $(...).slideUp() – rozwinięcie elementu rencję do niej na naszej stronie, i już jeste-
ny jako parametr, z dołu do góry, śmy gotowi do jej użycia. Teraz wystarczy
• obiekt zdarzenia jest jednolity pomiędzy • $(...).fadeIn() – rozjaśnienie elementu, wykonać następującą komendę $(“#gdMov
rożnymi przeglądarkami. • $(...).fadeOut() – ściemnienie elementu. ies”).tablesorter(). I to wszystko! Teraz
po uruchomieniu strony i kliknięciu w na-
Wracając do naszego przykładu z tabelą, do- Każda z tych metod może przyjąć dwa pa- główek w tabeli dane zostaną posortowane
damy do naszej tabeli następujące zachowa- rametry, pierwszy określa prędkość wy- po stronie klienta.
Tabela 1. Lista najczęściej używanych selektorów w jQuery
Selektor Przykład Opis
element $(„td”) Wskaż znacznik HTML
#id $(„#divMessage”) Wskaż element poprzez id
.klasacss $(„.gridrow”) Wskaż elementy z klasą CSS
selektor, selektor („input:button, input: Selektory rozdzielone przecinkiem mogą zostać połączone w pojedynczy selektor
text”)
przodek potomek („#divMessage a”) Znajduje elementy zagnieżdżone
rodzic>dziecko>dziecko $(„p>b”) Znajduje wszystkie bezpośrednie dzieci elementu będącego rodzicem
poprzedni ~ następny $(„#row:nth- Zaznacz wszystkie elementy występujące po elemencie poprzedni na tym samym pozio-
child(2)~td”) mie
brat + brat $(„#tdCol+td”) Zaznacz następny element
:filtr $(„input:button”) Stosuje filtr do zapytania.
Przykłady:
:not – odfiltrowuje elementy pasujące do tego selektora,
:button – wskazuje wszystkie elementy input typu button,
:checked – wskazuje wszystkie elementy input typu checkbox,
:first – pobiera pierwszy znaleziony element,
:last - pobiera ostatni element,
:nth-child(1) – wskazuje element, który jest n-tym dzieckiem rodzica,
:parent – zaznacz wszystkich rodziców.
[@atrybut] $(„div[class=gridrow]”) Wskazuje atrybut elementu. Dostępne operatory:
= – równa się,
^= – rozpoczyna się od,
$= – kończy się na,
*= – zawiera.

22 02/2009
jQuery i ASP.NET

Microsoft i jQuery
Listing 3. Przykład wywołania wielu funkcji w ramach jednej komendy
Biblioteka jQuery stała się bardzo popular-
na, co sprawiło, że firma Microsoft zaintere- $("#gdMovies tbody tr")
sowała się nią. Wynikiem tego zainteresowa- .not(":first")
nia jest decyzja o pełnym wsparciu dla tego .filter(":odd")
narzędzia, dzięki czemu będzie można trak-
tować jQuery jako integralną część istnieją- .css("background", "red")
cych rozwiązań ASP.NET. Już w chwili obec-
nej biblioteka jQuery jest dostarczana wraz z Listing 4. Przykład obsługi zdarzeń
ASP.NET MVC, a także dostępny jest intelli- $("#gdMovies tbody tr")
sense dla jQuery (Rysunek 3 i Rysunek 4). .not(":first") //odfiltruj pierwszy wiersz
Aby włączyć w Visual Studio 2008 obsłu- .hover(function() {
gę intellisense dla jQuery, należy pobrać po-
prawkę hotfix dla Visual Studio 2008 SP1 $(this).addClass("gridhighlight");
(VS 2008 SP1 Hotfix for –vsdoc.js Intellisense }, function() {
(KB958502)) oraz pobrać plik z dokumen-
tacją jQuery – vsdoc.js. Następnie umieścić $(this).removeClass("gridhighlight");
plik z dokumentacją w tym samym folderze, })
gdzie mamy bibliotekę jQuery, ważne, aby na- .click(function(e) {
zwy plików się zgadzały, jeżeli posiadamy plik alert("Tutuł: " + $(this).find("td:nth-child(3)").text());
jquery.js, to plik z dokumentacją musi się na- });
zywać jquery-vsdoc.js. Taka operacja wystar-
czy, aby Visual Studio 2008 automatycznie
znalazł plik dokumentacji i włączył intellisen-
se dla jQuery.

Galeria zdjęć
Żeby zobaczyć korzyści z połączenia jQuery
i ASP.NET AJAX, stworzymy prostą aplika-
cję – galerię zdjęć, której zadaniem będzie
wyświetlenie zdjęć należących do wskaza-
nej kategorii. Informacja na temat zdjęć nale-
żących do danej kategorii pochodzi z prostej
usługi WCF. Zwrócony zbiór danych zostanie
przedstawiony po stronie klienta wykorzystu-
jąc nową funkcjonalność biblioteki ASP.NET
AJAX, która nazywa się Client Templates,
czyli szablony po stronie klienta. Pełny kod
aplikacji dostępny jest na płycie CD dołączo-
nej do czasopisma. Listing 5 przedstawia stro-
nę ASP.NET, która wyświetla zdjęcia. Aplika-
cja używa prostej usługi web, która zwraca z
bazy danych kolekcję obiektów Photo. Każ- Rysunek 3. Intellisense dla jQuery
dy taki obiekt zawiera właściwość Url – któ-
ra reprezentuje adres, gdzie jest zlokalizowa-
ny obrazek oraz właściwość Title, czyli na-
zwę obrazka.
Przeanalizujmy kod po stronie klienta.
Pierwszą funkcją jest funkcja pageLoad, któ-
ra jest wywoływana po załadowaniu strony.
W metodzie tej wykonujemy dwie rzeczy. To,
co jest najważniejsza w tej metodzie, znajdu-

Rysunek 2. Stworzenie efektu kolorowych


naprzemiennych wierszy przy użyciu selektora z
Listingu 2 Rysunek 4. Intellisense dla jQuery

www.sdjournal.org 23
Programowanie .NET

je się w drugim wierszu, gdzie używając in- Kontrolka DataView jest nową, dostępną w który prezentuje się w następujący sposób:
strukcji ASP.NET AJAX, tworzymy obiekt ASP.NET AJAX kontrolką po stronie klien- (Listing 6)
DataView z przypisanym do niego szablo- ta, która używa szablonu do dynamiczne- W środku tego kontenera znajduje się sza-
nem HTML. go wygenerowania interfejsu użytkowni- blon, który definiuje sposób, w jaki zostaną wy-
ka w powiązanym z kontrolką kontenerze. świetlone nasze zdjęcia.
photoView = $create(Sys.UI.DataView, {}, W naszym przykładzie wiążemy kontrolkę Kolejną metodą w kodzie jest select
{}, {}, $get("photoContainer")); DataView z kontenerem photoContainer, Category, jest to metoda obsługująca zda-

Listing 5. Strona ASP.NET do przykładu galeria zdjęć

<html xmlns="http://www.w3.org/1999/xhtml" > <asp:ScriptReference Path="~/Scripts/jquery-


1.2.6.js"/>
<head runat="server">
<link href="PhotoGallery.css" rel="Stylesheet" type="text/ <asp:ScriptReference Path="~/Scripts/
css" /> jquerylitebox.js"/>

<script type="text/javascript"> <asp:ScriptReference Path="~/Scripts/Microsoft


AjaxTemplates.debug.js" />
var photoView;
</Scripts>
function pageLoad() <Services>
{ <asp:ServiceReference Path="~/
// pobieramy wszystkie linki z listy o PhotoService.svc"/>
identyfikatorze categories i przypisujemy
im procedurę obsługi zdarzenia </Services>
kliknięcia linku </asp:ScriptManager>

$("#categories a").click(selectCategory); <%-- Lista kategorii zdjęć --%>


photoView = $create(Sys.UI.DataView, {}, {}, {}, <asp:ListView ID="ListView1" runat="server" DataSource
$get("photoContainer")); ID="srcCategories">
} <LayoutTemplate>
<ul id="categories">
function selectCategory(e) <asp:PlaceHolder id="itemPlaceHolder"
{ runat="server"/>
</ul>
//Zatrzymaj domyśle działanie elementu </LayoutTemplate>
e.preventDefault(); <ItemTemplate>
<li> //atrybut categoryid służy do przechowania
$("#categories a.selectedCategory").removeClass("s identyfikatora kategorii zdjęć
electedCategory"); <a href="Default.aspx" categoryid='<%#
Eval("Id") %>'><%# Eval("Name") %></a>
$(this).addClass("selectedCategory"); </li>
</ItemTemplate>
//Wywołaj usługę web </asp:ListView>
PhotoServices.PhotoService.GetPhotos($(this).attr(
"categoryid"),getPhotosComplete); …
}
<%-- Kontener na zdjęcia --%>
function getPhotosComplete(photoData) <div id="photoContainer" class="sys-template">
{ <div>
photoView.set_data(photoData);
$("#photoContainer").litebox(); <a sys:href="{{Url}}"><img sys:src="{{Url}}"
} alt="{{Title}}"/></a>
<br />
</script>
</head> Nazwa: {{Title}}
<body> </div>
</div>
<form id="form1" runat="server">
<div> </div>
</form>
<asp:ScriptManager ID="sm1" runat="server"> </body>
<Scripts> </html>

24 02/2009
jQuery i ASP.NET

rzenie kliknięcia linku z nazwą katego- zwrócony rezultat do kontrolki DataView, Podsumowanie
rii, w której wywołujemy usługę web, uży- która jednocześnie wyświetla listę zdjęć Wielu programistów nie lubi pisać kodu w
wając obiektu proxy GetPhotos, Metodzie zgodnie ze zdefiniowanym szablonem. JavaScript. Proces tworzenia kodu po stronie
GetPhotos przekazujemy identyfikator kate- Ostatnią komendą jest $("#photoContain klienta z użyciem JavaScript wymaga często
gorii zdjęć, do wyświetlenia używając skład- er").litebox(), która uruchamia wtyczkę dużych nakładów pracy, zwłaszcza w bar-
ni $(this).attr(„categoryid”), jako dru- litebox, pozwalając przeglądać w efektowny dziej zaawansowanych aplikacjach. Może-
gi parametr definiujemy metodę zwrotną sposób naszą galerię. Dzięki integraji jQuery my ten proces usprawnić i przyspieszyć uży-
getPhotosComplete, która zostanie wywoła- i nowych funkcjonalności ASP.NET AJAX wając biblioteki jQuery. Dzięki połączeniu
na po zwróceniu wyniku działania usługi. W pisanie aplikacji ajaxowych jest prostsze niż jQuery i nowych funkcjonalności biblioteki
metodzie getPhotosComplete przypisujemy kiedykolwiek wcześniej. ASP.NET AJAX możemy szybko stworzyć
prawdziwie interaktywną, zaawansowaną,
ajaksową stronę WWW. jQuery nie zastępu-
W Sieci je w żadnym wypadku biblioteki ASP.NET
AJAX, ale uzupełnia ją o swoje potężne moż-
• Oficjalna strona biblioteki jQuery – Http://www.jquery.com, liwości takie jak efektywne manipulowanie
• Strona z wtyczkami dla jQuery – http://plugins.jquery.com,
• Strona z dokumentacją ASP.NET AJAX 4.0 –http://quickstarts.asp.net/previews/ajax/templates/ obiektami DOM czy animacje. Niniejszy ar-
default.aspx. tykuł nie wyczerpuje bogatej funkcjonalno-
ści biblioteki jQuery, ale mamy nadzieję, że
zainteresował was na tyle, abyście chcieli za-
Listing 6. Szablon HTML przypisany do obiektu DataView, używany do dynamicznego generowania poznać się bliżej z tą biblioteką i używać jej
interfejsu użytkownika w swoich projektach.

<div id="photoContainer" class="sys-template">


<div>
<a sys:href="{{Url}}"><img sys:src="{{Url}}" alt="{{Title}}" /></a> ŁUKASZ SZEWCZAK
<br /> Nazwa: {{Title}} Pracuję jako analityk programista w firmie Risco
Software. Z technologią .NET jestem związany od
</div> dwóch lat. Jestem członkiem warszawskiej gru-
</div> py .NET.
Kontak z autorem: lukasz.szewczak@riscosoftware.pl:
R E K L A M A

www.sdjournal.org 25
Warsztaty

Aplikacje desktopowe
Ext GWT (GXT) jako środowisko do tworzenia bogatych
interfejsów użytkownika w przeglądarce WWW.
Do niedawna w interfejsach opierających się na przeglądarce uzyskanie
pełnej funkcjonalności, którą oferowały aplikacje oparte na grubym
kliencie, było bardzo trudne, jeśli wręcz nie niemożliwe. Środowisko GWT
w połączeniu z biblioteką Ext GWT zmieniają diametralnie ten stan rzeczy.
W niniejszym artykule pokażemy jak łatwo jest stworzyć taką aplikację.
Proponowane combo GWT + GXT jest roz-
Dowiesz się: Powinieneś wiedzieć: wiązaniem dla tzw. bogatych interfejsów użyt-
• Zdobędziesz podstawową wiedzę o bibliotece • Jak programować w języku Java; kownika (ang. Rich application client - RIA).
GXT i środowisku GWT; • Znać podstawy budowy aplikacji sieciowych; Aplikacja stworzona w ten sposób swą funk-
• Jak wykorzystać mechanizm zdarzeniowy • Orientować się w mechanizmie MVC. cjonalnością praktycznie nie różni się od wer-
i model MVC z biblioteki GXT; sji desktopowej (tzw. gruby klient). Ładowana
• Jakie są zalety proponowanego rozwiązania. jest raz, przy wejściu na stronę, po czym działa
dokładnie tak jak zwyczajna aplikacja okienko-
wa uruchomiona na naszym komputerze. Cha-
gii AJAX. Wykorzystuje do tego język Java i rakteryzuje się przy tym sporą multimedialno-
zwalnia programistę z konieczności dbania o ścią objawiającą się między innymi w obsłudze
Poziom trudności przenośność kodu, gdyż robi to za niego. efektów graficznych, czy mechanizmie Dra-
GWT kompiluje kod napisany w Javie i two- g&Drop. Rozwiązanie oparte o GXT ma jed-
rzy odpowiednie pliki JavaScript, CSS i HTML. nak przewagę nad grubym klientem, gdyż eli-
Pliki te mają wersje dedykowane do większości minuje problem przenośności między syste-
Od kilku lat da się zaobserwować bardzo dy- popularnych przeglądarek WWW. Znika więc mami operacyjnymi. Do prawidłowego działa-
namiczny rozwój aplikacji internetowych. problem związany z kompatybilnością. nia aplikacji wystarczy przeglądarka WWW. W
Dzieje się tak za sprawą technologii AJAX, GWT daje możliwość przetestowania apli- ramce wymienione zostały przeglądarki kom-
która umożliwia asynchroniczną komuni- kacji w tak zwanym hosted mode. Kod Javy patybilne z GXT.
kację aplikacji z serwerem. Dzięki niej mo- jeszcze przed kompilacją, jest uruchamiany
żemy przeładować wybrany kawałek stro- przez JVM, co czyni proces wykrywania błę- Stworzenie szkieletu projektu
ny WWW, bez konieczności odświeżania dów łatwiejszym (tak jak w zwykłej Javie). Do stworzenia aplikacji z wykorzystaniem
całości. Interfejs użytkownika działa przez Ponadto narzędzie Google umożliwia two- GWT i GWT Ext użyjemy środowiska Net-
to szybciej, płynniej i wygodniej, czyli staje rzenie testów JUnit, łatwą lokalizację, posiada Beans 6.0, które wyręczy nas w wykonywa-
się bardziej desktopowy. Technologia ta opie- wsparcie dla historii (przycisk wstecz w prze- niu nudnych czynności związanych z przy-
ra się na JavaScripcie, wymaga więc od pro- glądarce) i zbiór podstawowych komponen- gotowaniem struktury projektu i tworze-
gramisty znajomości tego języka. Niestety tów. Zbiór ten, mimo iż jest stosunkowo spo- niem potrzebnych plików konfiguracyjnych.
JS często stwarza problemy z kompatybilno- ry, nie wyczerpuje naturalnie wszystkich wy- Zaczynamy od sprawdzenia, czy mamy za-
ścią z różnymi przeglądarkami. Istnieje spo- magań stawianych aplikacjom WWW. Stanowi instalowany plugin GWT4NB. W tym celu
ro bibliotek ułatwiających tworzenie prze- on tylko szkielet, pod dalszą rozbudowę. Dlate- klikamy menu Tools>Plugins>Installed plu-
nośnych, interaktywnych komponentów go właśnie powstają biblioteki wykorzystujące gin. Jeśli takowego nie ma na liście, przecho-
(ang. widgetów) ale wszystkie wymagają zna- GWT, które rozszerzają jego możliwości. Jed- dzimy do zakładki Available plugins, szuka-
jomości JavaScriptu i co jest charakterystycz- ną z nich jest GWT Ext (GXT). my, zaznaczamy i klikamy przycisk install.
ne dla tego języka, nie rozwiązują trudności GWT Ext to biblioteka widgetów napisa- Środowisko GWT w najnowszej wersji
związanych z debugowaniem. nych w Javie, które korzystają z wydajności, ściągamy ze strony:
jaką daje GWT i oferują do tego bogate możli-
Wybawienie wość konfiguracji. Ponadto posiada ona wbudo- http://code.google.com/webtoolkit/download.html,
I tu właśnie pojawia się produkt Google roz- waną obsługę tematów (ang. themes) za pomocą
wiązujący przedstawione problemy. Google CSS, wsparcie dla obsługi XML-a, JSON-a i ko- a bibliotekę GWT Ext ze strony:
Web Toolkit (GWT), bo o nim mowa, to munikacji z serwerem przez RPC. Ważną rze-
szkielet do tworzenia aplikacji sieciowych. czą jest też własny mechanizm MVC czynią- http://extjs.com/products/gxt/download.php.
Umożliwia on korzystanie z zalet asynchro- cy programowanie interakcji z użytkownikiem
nicznej komunikacji nie tylko bez znajo- bardziej przejrzystym, łatwiejszym w zrozu- Kolejnym etapem jest stworzenie projektu.
mości JavaScriptu, ale też i samej technolo- mieniu i późniejszym utrzymaniu. Wybieramy typ projektu Web application z

26 02/2009
Aplikacje desktopowe w przeglądarce WWW.

kategorii web. Wersję Javy ustawiamy na Ja- me), który będzie używany przez naszą aplika- del dla zakładki wyświetlającej dane o osobach.
va EE 5, a serwer na Glassfish, choć równie do- cję. U nas będzie to standardowy temat graficz- Pierwszym krokiem jest określenie danych,
brze może być to każdy inny. W zakładce fra- ny GXT, który wcześniej skopiowaliśmy do ka- które będziemy wyświetlać w tabelce. Przyj-
meworks wybieramy Google Web Toolkit i wska- talogu WEB-INF. mijmy, że będą to: imię, nazwisko, data uro-
zujemy ścieżkę do ściągniętego wcześniej śro- dzenia i ilość dzieci. Ilość dzieci służyć bę-
dowiska GWT. Model MVC dzie do zobrazowania konfigurowalnej pre-
Po stworzeniu projektu musimy jeszcze do- Ponieważ chcemy pokazać jak najwięcej moż- zentacji danych w komórce tabeli, o czym w
dać bibliotekę GWT Ext (plik <ścieżka do liwości graficznych GXT, by uświadomić, że dalszej części artykułu.
GXT>/gxt.jar) do naszej aplikacji oraz prze- nie są już one domeną grubych klientów, to w
grać standardowy temat graficzny (katalo- naszej aplikacji skupimy się na stronie klienc- Tabelka z danymi
gi <ścieżka do GXT>/resources/css i <ścieżka do kiej, odkładając komunikacje z serwerem na Tworzymy plik pl.com.xqg.client.beans.
GXT>/resources/css) do podkatalogu WEB-INF dalszy plan. UserDataBeanGxt. Jest to bean reprezentu-
w projekcie. Aplikacja będzie obsługiwać zapisywanie in- jący osobę zawierający settery i gettery dla
W terminologii używanej przez Google, formacji o osobach i wyświetlać je w tabelce. przedstawionych atrybutów. Różnica mię-
część aplikacji odpowiedzialna za uruchomie- Podzielimy w tym celu okno główne na zakład- dzy standardowym beanem Java (ang. Java-
nie interfejsu użytkownika w przeglądarce, to ki, by dodatkowo prześledzić interakcje między Bean) polega na tym, że dziedziczy on po
moduł GWT. nimi i lepiej przedstawić dostępny w GXT me- klasie
Każdy moduł musi posiadać tzw. punkt chanizm zdarzeniowy połączony z modelem
wejściowy/startowy (z ang. entry point). Jest to MVC. Dodatkowo zademonstrujemy jak pro- com.extjs.gxt.ui.client.data.BaseModel ,
klasa, od której zaczyna się ładowanie aplika- sto i szybko można uzyskać ciekawe efekty.
cji – pewnego rodzaju odpowiednik klasy Ma- MVC (Model View Controller) to mechanizm która implementuje interfejs
in z metodą main(), od której zaczyna się wyko- pozwalający na podział aplikacji na trzy współ-
nywanie programu w zwykłej Javie. Klasa taka pracujące ze sobą warstwy – model danych, wi- com.extjs.gxt.ui.client.data.ModelData .
musi implementować interfejs com.google.gw dok reprezentujący interfejs użytkownika i kon-
t.core.client.EntryPoint zawierający meto- troler zarządzający komunikacją między po- Interfejs ten jest wymagany przez więk-
dę public void onModuleLoad(). Do tej wła- szczególnymi warstwami. Stworzymy taki mo- szość widgetów w GXT. W naszym beanie
śnie metody przekazywane jest sterowanie, kie-
dy użytkownik próbuje załadować naszą aplika- Listing 1. Deskryptor aplikacji Main.gwt.xml
cję w swojej przeglądarce.
Kolejnym wymaganiem jest obecność de- <?xml version="1.0" encoding="UTF-8"?>
skryptora modułu w strukturze katalogów z ko- <module>
dem źródłowym. Deskryptor ten to plik XML <!-- rdzeń biblioteki GWT -->
o rozszerzeniu gwt.xml, który określa, z jakich <inherits name="com.google.gwt.user.User"/>
modułów środowiska GWT będzie korzystać <!-- biblioteka GXT -->
nasza aplikacja, z jakich dodatkowych bibliotek <inherits name="com.extjs.gxt.ui.GXT"/>
(w naszym przypadku GWT Ext) jak również, <!-- klasa implementująca entry point w naszym module -->
którą klasę traktować jako entry point. <entry-point class="pl.com.xqg.client.MainEntryPoint"/>
Deskryptor powinien znajdować się w pakie- </module>
cie nadrzędnym w stosunku do pliku z imple-
mentacją entry point. Wszystkie klasy wcho- Listing 2. Plik startowy HTML
dzące w skład modułu, powinny być umiesz- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
czone w tym samym pakiecie co punkt starto- <html>
wy, bądź w pakietach podrzędnych. Właśnie <head>
ich kod w trakcie kompilacji zostanie przetłu- <!-- odwołanie wskazujące nasz moduł (plik Main.gwt.xml) -->
maczony na JavaScript i HTML. W naszym <meta name='gwt:module' content='pl.com.xqg.Main=pl.com.xqg.Main'>
przypadku tworzymy moduł obsługujący in- <title>Main</title>
terfejs użytkownika. Istnieje jednak możliwość <!-- standardowy temat graficzny-->
stworzenia modułów bez klasy z entry point, <link rel="stylesheet" type="text/css" href="css/ext-all.css" />
które można potem wykorzystać w innych mo- </head>
dułach. Takimi modułami są właśnie biblioteki <body>
zewnętrzne jak GXT. <!-- odwołanie do naszego modułu i JavaScriptu wygenerowanego podczas kompilacji
W naszym przypadku poza standardo- przez GWT -->
wym odwołaniem do modułu <script language="javascript" src="pl.com.xqg.Main/pl.com.xqg.Main.nocache.js">
</script>
com.google.gwt.user.User </body>
</html>
w deskryptorze znajdzie się w odwołanie do
biblioteki GWT Ext. Przedstawia to Listing 1.
Ostatnim obowiązkowym elementem apli-
kacji wykorzystującej GWT jest plik HTML,
Przeglądarki obsługiwane przez GWT + GWT Ext
w którym w znacznikach <meta/> i <script/> • Internet Explorer 6+,
• Firefox 1.5+ (PC, Mac),
umieszczone są odwołania do naszego mo-
• Safari 3+,
dułu (odwołania wskazują na deskryptor Ma- • Opera 9+ (PC, Mac).
in.gwt.xml). Jest też deklaracja tematu (ang. the-

www.sdjournal.org 27
Warsztaty

atrybuty nie są zapisywane w zmiennych posiada ich sporo, my jednak będziemy wy- Jest to dość lekki kontener, który umożli-
prywatnych, a w mapie klasy nadrzędnej. korzystywać głównie wia, mimo wszystko, ustawienie layoutu –
Skoro mamy już model danych, to potrze- w naszym przypadku FitLayout.
bujemy widoku, który nam je zaprezentuje. com.extjs.gxt.ui.client.widget.layout. By stworzyć tabelkę, trzeba zdefiniować
W tym celu tworzymy klasę pl.com.xqg.c FitLayout , jej kolumny. Służy do tego klasa
lient.ui.tabs.UserTableTab, która będzie
zakładką zawierającą tabelkę z osobami. Plik który to rozciąga element wewnątrz kon- com.extjs.gxt.ui.client.widget.grid.Co
ten został przedstawiony na listingu nr 3. tenera na cały jego obszar. Zakładka bę- lumnConfig .
W GXT umiejscowienie widgetów opiera dzie więc kontenerem, w którym umie-
się głównie na różnego rodzaju kontenerach ścimy panel z tabelką. Właśnie dlatego Definiujemy w niej jakiemu polu z beana z da-
lub panelach. Te drugie, to bardziej rozbudo- PeopleTableTab dziedziczy po kontenerze nymi odpowiada kolumna, jej nazwę oraz roz-
wane wersje tych pierwszych. Obu elemen- miar. Można też ustawić kilka innych parame-
tom można przypisywać sposób rozmiesz- com.extjs.gxt.ui.client.widget.LayoutC trów, jak choćby, czy kolumna ma być sorto-
czenia elementów (ang. layout). Biblioteka ontainer. walna, widoczna/niewidoczna, automatycznie

Listing 3. Zakładka z tabelką użytkowników

public class UserTableTab extends LayoutContainer { return "<span style='color:" + renderStyle + "'>" +
renderValue + "</span>";
//zbiór danych (ang.store) przechowujący dane użytkowników }
private ListStore peopleStore; });
configs.add(childrensColumn);
public UserTableTab() {
//inicjujemy zasób danych dla naszej tabelki jakimiś
ContentPanel mainPanel = new ContentPanel(); przykładowymi danymi
mainPanel.setHeading("Przykładowa tabelka, którą można peopleStore = new ListStore();
przesuwać");
mainPanel.setSize(500,500); //tworzymy model kolumn z naszych definicji
ColumnModel cm = new ColumnModel(configs);
List<ColumnConfig> configs = new ArrayList<ColumnConfig>();
//lista z definicjami kolumn //Tworzymy tabelkę korzystając z wcześniej stworzonych
zasobu danych i definicji kolumn
//definiujemy kolumny Grid exapmleTable = new Grid(store, cm);
configs.add(new ColumnConfig(UserDataBeanGxt.NAME, "Imie", exapmleTable.setStyleAttribute("borderTop", "none");
100)); exapmleTable.setAutoExpandColumn("name");
configs.add(new ColumnConfig(UserDataBeanGxt.SURENAME, exapmleTable.setBorders(true);
"Nazwisko", 100));
configs.add(new ColumnConfig(UserDataBeanGxt.BIRTH_DATE, mainPanel.add(exapmleTable);
"Data urodzenia", 80));
//ustawiamy jeszcze, by panel z tabelką miał możliwość
//definiujemy kolumnę wyświetlającą liczbę dzieci. przeciągania
ColumnConfig childrensColumn = new ColumnConfig(UserDataBean Draggable d = new Draggable(mainPanel);
Gxt.CHILDRENS_NO, "Liczba dzieci", 120); d.setUseProxy(true);
//dla tej kolumny definiujemy nasz własny renderer, ktory this.add(mainPanel);
będzie wyświetlał nie liczby, a tekst }
childrensColumn.setRenderer(new GridCellRenderer<UserDataB
eanGxt>() { /**
* Metoda, która dodaje użytkownika do tabelki.
public String render(UserDataBeanGxt model, String arg1, * wyświetla też komunikat informujący, że użytkownik został
ColumnData arg2, int arg3, int arg4, dodany.
ListStore<UserDataBeanGxt> arg5) { *
Number val = model.getAge(); //model zawiera * W naszym tutorialu metoda jest wywoływana przez widok
model reprezentujący wiersz w tabeli UserTableView
String renderStyle = "green"; *
String renderValue = "Mało albo wcale"; * @param userDataBeanGxt bean określający dane nowego
//jeśli liczba dzieci jest większa od 3 użytkownika
wyświetlamy czerwony napis Dużo */
public void addNewUser(UserDataBeanGxt userDataBeanGxt) {
if (val != null && val.longValue() > 3) { peopleStore.add(userDataBeanGxt);
renderStyle = "red"; MessageBox.alert("Informacja", "Dane zostały dodane do
renderValue = "Dużo"; tabelki", null);
} }
//to zostanie wstawione w komórkę tabeli }

28 02/2009
Aplikacje desktopowe w przeglądarce WWW.

się rozszerzać itd. Nam wystarczy, że standar- już sporo. By zdefiniować niestandardowe trzeba zaimplementować. Jak się można ła-
dowo kolumnę można usuwać w trakcie dzia- renderowanie komórki tabeli, trzeba do de- two domyśleć, metoda ta jest wywoływana
łania aplikacji, przesuwać i sortować w obu finicji kolumny dodać swój renderer. Repre- podczas próby renderowania danej kolum-
kierunkach. Wszystkie te opcje są standardo- zentuje go interfejs ny tabeli dla każdego z wiersza osobno. In-
we (dają się jednak wyłączyć) więc nie musimy teresuje nas pierwszy parametr, który re-
nic implementować. com.extjs.gxt.ui.client.widget.grid.Gri prezentuje model danych dla danego wier-
Omówienia wymaga kolumna wyświetla- dCellRenderer, sza i wartość zwracana przez metodę. Na
jąca liczbę dzieci. Postanowiliśmy wyświe- podstawie modelu danych z parametrów
tlać ją inaczej niż standardowo (liczbowo). którego metodę wejściowych metody, definiujemy i zwra-
Będzie to więc u nas zielony napis mało lub camy zmienną typu string. Jest ona kodem
wcale w przypadku, gdy osoba ma mało dzie- public String render(DataModel, HTML, który zostanie wstawiony do wła-
ci lub czerwony napis dużo, gdy dzieci jest String, ColumnData, int, int, Store) śnie renderowanej komórki tabeli.

Listing 4. Zakładka z formularzem do dodawania osoby

public class PersonFormTab extends LayoutContainer { //pobieramy dispatcher z GXT


final Dispatcher dispatcher = Dispatcher.get();
public PersonFormTab() { //przycisk dodający użytkownika, który będzie
this.setLayout(new FitLayout()); //rozciągamy na całe inicjował zdarzenie ADD _ USER _ TO _ TABLE

okienko
final ContentPanel mainPanel = new ContentPanel(); formPanel.addButton(new Button("Dodaj do tabelki") {
mainPanel.setHeaderVisible(false);
@Override
//tworzymy panel z formularzem protected void onClick(ComponentEvent arg0) { //
final FormPanel formPanel = new FormPanel(); metoda uruchamiana po kliknięciu przycisku
formPanel.setHeading("Formularz zgłoszeniowy"); dodaj
formPanel.setFrame(true); super.onClick(arg0);
//trochę validacji.
final TextField<String> nameTF = new TextField<String>(); //ponieważ wcześniej ustawiliśmy na polach,
nameTF.setFieldLabel("Imie"); w jakim przypadku są poprawne,

//tworzymy textfielda na nazwisko - nie pozwalamy, by pole //teraz wystarczy tylko wywołać funkcję isValid()
było puste if (!surenameTF.isValid()) {
final TextField<String> surenameTF = new MessageBox.alert("Błędnie wypełnione dane",
TextField<String>(); "Muszisz podać nazwisko", null);
surenameTF.setFieldLabel("Nazwisko"); return;
surenameTF.setAllowBlank(false); }
if (!birthDateDF.isValid()) {
final NumberField childrensNF = new NumberField(); MessageBox.alert("Błędnie wypełnione dane", "Pole
childrensNF.setFieldLabel("Liczba dzieci"); data jest źle wypełnione", null);
return;
final DateField birthDateDF = new DateField(); }
birthDateDF.setFieldLabel("Data urodzenia");
//Wszystko ok.
formPanel.add(nameTF); //pobieramy dane do beana
formPanel.add(surenameTF);
formPanel.add(childrensNF); UserDataBeanGxt userDataBeanGxt = new UserDataBeanGxt
formPanel.add(birthDateDF); (nameTF.getValue(), surenameTF.getValue(),
childrensNF.getValue(),
//przycisk do czyszczenia formularza birthDateDF.getValue());
formPanel.addButton(new Button("Wyczyść") { //inicjujemy zdarzenie ADD_USER_TO_TABLE,
do ktorego dołączamy bean z nowym
@Override użytkownikiem.
protected void onClick(ComponentEvent arg0) { // dispatcher.dispatch(TutorialEvents.ADD_PERSON_TO_
metoda uruchamiana po kliknięciu przycisku TABLE.toInt(), userDataBeanGxt);
super.onClick(arg0);
//czyścimy wszystkie pola formularza }
nameTF.setValue(null); });
surenameTF.setValue(null); mainPanel.add(formPanel);
childrensNF.setValue(null);
birthDateDF.setValue(null); this.add(mainPanel);
} }
}); }

www.sdjournal.org 29
Warsztaty

Tabelka w GXT może korzystać z danych, formacji dla użytkownika, że operacja przebie- przez dyspozytora do nasłuchujących kon-
które dostarcza jej zasób danych (ang. store). gła pomyślnie. trolerów, które odpowiednio na nie reagują.
Zasób ten stanowi u nas zmienna peopleSto- Dyspozytor jest zaimplementowany w klasie
re typu Mechanizm zdarzeniowy
GXT posiada mechanizm zdarzeniowy wspierają- com.extjs.gxt.ui.client.mvc.Dispatcher.
com.extjs.gxt.ui.client.store.ListStore< cy model MVC. Zdarzenia w tym systemie repre-
UserDataBeanGxt>. zentowane są przez liczby całkowite. Zalecane jest Klasa ta umożliwia zarówno wygenerowanie
jednak stworzenie do tego celu klasy typu enum zdarzenia wraz z dołączonym do niego mode-
Przechowuje ona informacje o osobach, któ- z odpowiednimi metodami zwracającymi indeksy lem danych, jak i zarejestrowanie w systemie
re są wyświetlane w tabelce. do poszczególnych pól, co też zrobimy w przypad- kontrolera nasłuchującego.
Pozostało nam już tylko zadeklarować model ku naszej aplikacji. Tworzymy zatem prostą klasę p W naszej aplikacji zakładka z formularzem
kolumn z definicji, które stworzyliśmy wcze- l.com.xqg.client.mvc.TutorialEvents, w któ- będzie generować zdarzenie, które zostanie
śniej i stworzenie gridu będącego naszą tabelką rej implementujemy następującą metodę: przekazane dalej do kontrolera związanego
osób. Do jego inicjalizacji używamy modelu ko- z tabelką osób. Kontroler obsłuży zdarzenie,
lumn i zasobu danych. public int toInt() { przekazując je do odpowiedniego widoku, w
Na koniec dodajemy naszą tabelkę do no- return this.ordinal(); którym nastąpi odświeżenie zawartości tabel-
wo stworzonego panelu a całość do zakładki. } ki. Zakładka dodająca użytkownika jest repre-
W klasie PeopleTableTab zaimplemento- zentowana przez klasę pl.com.xqg.client.u
waliśmy dodatkowo metodę public void a Najważniejszą częścią mechanizmu zdarze- i.tabs.PersonFormTab przedstawioną na li-
ddNewUser(UserDataBeanGxt), która będzie niowego jest dyspozytor (ang. dispatcher), stingu 4.
wywoływana przez kontroler obsługujący ta- który zarządza zdarzeniami. Użytkownik Zakładka ta, tak jak poprzednia, rozszerza
belkę. Jej zadaniem jest dodanie beana z no- podczas interakcji z aplikacją może wyge- klasę LayoutContainer. Zdefiniowany jest w
wą osobą do zasobu tabelki i wyświetlenie in- nerować zdarzenie. Jest ono dostarczane niej panel com.extjs.gxt.ui.client.widget
.form.FormPanel reprezentujący w GXT for-
mularz HTML. Do tego panelu dodajemy wid-
W razie problemu z kompilacją gety odpowiadające atrybutom osoby i ich ty-
Podczas kompilacji i próby debugowania przy wykorzystaniu pluginu GWT4NB mogą wy- pom; mamy więc:
stąpić problemy z pamięcią. Objawiają się one komunikatami Java heap error lub Out of me-
mory exception podczas kompilacji. Rozwiązanie tego problemu jest proste - wymaga do-
com.extjs.gxt.ui.client.widget.form.Num
dania parametru maxmemory = "512M" do węzłów <java/> w pliku build-gwt.xml (plik kon-
figuracyjny pluginu GWT4NB znajdujący się w katalogu nbproject projektu). Uwaga, jeśli berField – reprezentujący pole numeryczne,
użyjemy opcji clean lub clean&build na projekcie, to niestety czynność z dodaniem parame-
tru należy powtórzyć. com.extjs.gxt.ui.client.widget.form.Te
xtField – reprezentujący pole tekstowe,

Listing 5. Kontroler związany z tabelką z osobami com.extjs.gxt.ui.client.widget.form.Da


teField – reprezentujący pole z datą i ka-
public class PeopleTableController extends Controller { lendarzem do jej wyboru.

PeopleTableView userTableView; Wszystkie wyżej wymienione widgety umoż-


liwiają łatwe ustawienie walidacji, czy to w po-
public PeopleTableController() { staci wyrażeń regularnych (ang. regex), czy w
registerEventTypes(TutorialEvents.ADD_PERSON_TO_TABLE.toInt()); //ustalamy na postaci własnoręcznie zdefiniowanych walida-
jakie zdarzenia ma reagować nasz kontroller torów. Pokazujemy to na przykładzie pól zwią-
} zanych z datą i nazwiskiem. Zakładamy, że po-
le nazwisko będzie obowiązkowe, a data musi
@Override być poprawnie uzupełniona. W tym celu de-
public void handleEvent(AppEvent event) { finiujemy przycisk Dodaj klasy com.extjs.g
switch (TutorialEvents.fromInt(event.type)) { xt.ui.client.widget.button.Button , w któ-
default: rym nadpisujemy metodę onClick(). Meto-
forwardToView(userTableView, event); da ta jest uruchamiana w momencie kliknię-
} cia przycisku. Sprawdzamy w niej czy obydwa
} pola są poprawnie wypełnione poprzez bardzo
proste wywołanie metody isValid(). Jeśli nie
/** spełniają one stawianych im warunków, wy-
* Metoda wywoływana automatycznie. świetlamy odpowiednie komunikaty. Warto
* tu powinnien być stworzony widok. zwrócić uwagę, że GXT automatycznie pod-
*/ kreśla i wyświetla dymki w przypadku pól, do
public void initialize() { których wpisujemy złe wartości. Oczywiście
super.initialize(); zachowanie takie jest w pełni konfigurowalne.
userTableView = new PeopleTableView(this); W przypadku poprawnego wypełnienia da-
} nych osobowych, następuje odwołanie do dys-
} pozytora i wygenerowanie zdarzenia ADD_
PERSON_TO_TABLE z beanem reprezentującym
nową osobę.

30 02/2009
Aplikacje desktopowe w przeglądarce WWW.

Kontroler i widok
Ostatnią częścią układanki jest stworzenie kon- Listing 6. Klasa startowa aplikacji
trolera i widoku. Kontroler został przedstawio- public class MainEntryPoint implements EntryPoint {
ny na listingu 5.
Zadaniem kontrolera jest nasłuchiwanie na public MainEntryPoint() {
zdarzenie ADD_PERSON_TO_TABLE, jego obsługa }
i przekazanie sterowania do widoku. W przy-
padku naszej nieskomplikowanej aplikacji ob- /**
sługa sprowadza się do przekierowania zdarze- * Metoda ta jest wywoływana automatycznie, podczas ładowania aplikacji
nia wraz z danymi dalej do widoku. Dzieje się * po stronie użytkownika w jego przeglądarce
to w metodzie handleEvent(), która musi zo- */
stać zaimplementowana. Wymusza to klasa co public void onModuleLoad() {
m.extjs.gxt.ui.client.mvc.Controller, w
której jest ona zdefiniowana jako metoda abs- final Dispatcher dispatcher = Dispatcher.get(); //Dispatcher, zarządzający
trakcyjna. Ta klasa musi być klasą dziedziczo- zdarzeniami w mechaniźmie MVC z GXT.
ną przez każdy kontroler. dispatcher.addController(new PeopleTableController()); //rejestrujemy kontroler
Zazwyczaj, to właśnie w kontrolerze na- naszej tabelki z użytkownikami
stępuje przetwarzanie danych, pobranie ich,
bądź wysłanie z/do serwera w celu zapisu w
bazie itd. To jest miejsce gdzie należy takie Viewport viewport = new Viewport(); //view port po to, by obsłużyć
rzeczy implementować. Dla tych, którzy nie zmianę rozmiaru okienka
mieli styczności z czystym GWT, może wy- viewport.setLayout(new FitLayout());
dać się to oczywiste i nierewolucyjne. Ci jed-
nak, którzy mieli okazje w nim programo-
wać, wiedzą, na czym polega udręka i bała- TabPanel tabs = new TabPanel();
gan związany z niekontrolowanymi wywoła-
niami serwera umieszczonymi w warstwie //zakładka z formularzem użytkownika
prezentacji danych. Objawia się tu kolejna TabItem singleTab = new TabItem();
przewaga biblioteki GXT nad standardowy- singleTab.setText("Dodaj osobę - formularz");
mi rozwiązaniami GWT.
W kontrolerze należy także zaimplemen- singleTab.setClosable(false);
tować metodę void initialize(), w której singleTab.setScrollMode(Scroll.AUTO);
zostanie utworzony odpowiadający mu wi-
dok. Metoda ta zostanie wywołana podczas singleTab.setLayout(new FitLayout());
rejestrowania kontrolera u dyspozytora. singleTab.add(new PersonFormTab());
Widok, podobnie jak kontroler, musi dzie- tabs.add(singleTab);
dziczyć z odpowiedniej klasy (com.extjs.g
xt.ui.client.mvc.View). Implikuje to im- //zakładka z tabelką z użytkownikami
plementację konstruktora biorącego jako pa- singleTab = new TabItem();
rametr obiekt typu Controller oraz metody singleTab.setText("Wyświetl osoby - tabelka");
handleEvent(...). W metodzie tej obsługi-
wane są zdarzenia przekazane przez kontro- singleTab.setClosable(false);
ler. W naszym przypadku, jest to pobranie z singleTab.setScrollMode(Scroll.AUTO);
rejestru zakładki z tabelką oraz wywołanie
na niej metody dodającej osobę z odpowied- singleTab.setLayout(new FitLayout());
nimi danymi. PeopleTableTab userTableTab = new PeopleTableTab();
Registry.register("userTableTab", userTableTab);
PeopleTableTab userTableTab = Regi- singleTab.add(userTableTab);
stry.get("userTableTab"); tabs.add(singleTab);

//pobieramy zakładkę z tabelką //zakładka z panelami pokazująca kilka efektów graficznych


singleTab = new TabItem();
userTa bleTa b.add NewUser((UserDataBe- singleTab.setText("Kilka efektów - demo");
anGxt)event.data); singleTab.setClosable(false);
singleTab.setScrollMode(Scroll.AUTO);
//informujemy ją, że trzeba dodać użytkow- singleTab.setLayout(new FitLayout());
nika singleTab.add(new FXTab());

Składamy wszystko w jedną całość tabs.add(singleTab);


Czym jest rejestr ? Jest to kolejny wewnętrz-
ny mechanizm ułatwiający tworzenie aplika- viewport.add(tabs);
cji w GXT. Umożliwia on zapisanie obiektu RootPanel.get().add(viewport);
pod określoną nazwą i odwołanie się do niej }
w dowolnym momencie.

www.sdjournal.org 31
Warsztaty

W przypadku naszej aplikacji zapisanie ta- ciągać, przesuwać i stosować na nich efekty rzenia) elementów w konstruktorze, powin-
belki do rejestru nastąpiło w klasie implemen- specjalne. Efekty specjalne są tworzone na no się tworzyć oddzielne metody. Na przy-
tującej entry point. Klasę tę przedstawia li- referencji do obiektów typu com.extjs.gxt kład: przypuśćmy, że po kliknięciu wiersza
sting nr 6. .ui.client.core.El, a konfigurowane przez tabelki z osobami chcemy wyświetlić okien-
W omówionej już metodzie onLoad() tworzy- klasę com.extjs.gxt.ui.client.fx.FxCon- ko z formularzem. Lepiej jest mieć jedno ta-
my kontroler i rejestrujemy go u dyspozytora. fig. W GXT każdy widget posiada meto- kie okienko, które będziemy wyświetlać i
Następnie deklarujemy tak zwany view- dę zwracającą obiekt typu El. Nie jesteśmy ukrywać, niż tworzyć je za każdym razem
port, który jest kontenerem dopasowującym więc ograniczani w efektach specjalnych tyl- od nowa.
swe rozmiary do okna przeglądarki. Jest to o ko do paneli. W prezentowanej aplikacji zakładki zosta-
tyle wygodne, że podczas zmiany rozmiaru Na tym kończy się tworzenie naszej apli- ły stworzone w klasie entry point, by zobra-
okna, viewport automatycznie poprzesuwa kacji. Efekt jej działania został przedstawio- zować mechanizm rejestru. Eleganckim roz-
znajdujące się w nim komponenty. ny na rysunku nr 1. wiązaniem byłoby jednak stworzenie każdej
Kolejnym krokiem jest stworzenie panelu z zakładek, a przynajmniej tej z tabelką w od-
z zakładkami Best practices i podsumowanie powiadającym jej widoku.
Na koniec zwracamy uwagę na kilka elemen- Ostatnią rzeczą, na którą warto zwrócić
com.extjs.gxt.ui.client.widget.TabPanel tów, które zostały pominięte w prezentowa- uwagę jest możliwość korzystania z hosted
nym programie. Jednym z nich jest dobry mode, czyli ze specjalnego trybu ułatwiają-
i kolejnych zakładek reprezentowanych w nawyk nadawania id każdemu elementowi. cego debugowanie. W środowisku NetBeans
GXT przez obiekty typu Ułatwia to późniejsze debugowanie i anali- 6.0 w połączeniu z pluginem GWT4NB jest
zę wygenerowanego HTML-a oraz dodawa- to o tyle łatwe, że wystarczy kliknąć przycisk
com.extjs.gxt.ui.client.widget.TabItem . nie nowych stylów w CSS. DEBUG. Otworzą się nam wtedy dwa dodat-
Kolejnym jest rozważne tworzenie widge- kowe okna. W jednym będziemy mogli ob-
Do każdego takiego obiektu przed doda- tów. Należy pamiętać, że kod Java jest tłu- serwować wynik działania aplikacji, a w dru-
niem do panelu z zakładkami dodajemy maczony do JavaScriptu i może powodować gim będą informacje o wyjątkach i logowane
omawiane już wcześniej klasy z formula- znaczne spowolnienie przeglądarki lub w komunikaty. Hosted mode znacznie ułatwia
rzem i z tabelką z osobami. niektórych skrajnych przypadkach powodo- pracę z GWT, bo po każdej zmianie w kodzie
Nie wspomnieliśmy jeszcze o trzeciej za- wać problemy z pamięcią. Powinniśmy sta- nie musimy kompilować wszystkiego od no-
kładce, która została dodana do naszej apli- rać się tworzyć komponenty jak najbardziej wa – wystarczy, że odświeżymy okienko z
kacji. Implementuje ją klasa pl.com.xqg.cli reużywalne, eliminujące konieczność two- aplikacją (klawisz F5 lub przycisk Odśwież).
ent.ui.tabs.FXTab. Pokazuje ona jak w pro- rzenia ich od nowa przy każdym wywołaniu. Zachęcamy do dalszego zagłębienia się w
sty sposób stworzyć panele, które da się roz- Zamiast inicjowania/wypełniania (nie two- temat GWT + GXT, gdyż połączenie to ofe-
ruje znacznie większe możliwości niż pre-
zentowane w niniejszym artykule. Polecamy
stronę projektu, szczególnie demo z przy-
kładami. Warto też zaznaczyć, że bibliote-
ka GXT posiada rozbudowaną dokumenta-
cję w postaci Javadoców oraz bogatą społecz-
ność reprezentowaną przez forum na stro-
nach projektu.
GWT nie rozwiązuje wszystkich proble-
mów w aplikacjach opartych na przeglądarce.
Ułatwia jednak proces ich tworzenia i stanowi
silną konkurencję dla aplikacji desktopowych.
Konkurencyjność tego rozwiązania zwiększa
się z dnia na dzień. GWT i GXT są nieustannie
rozbudowywane i ulepszane w oparciu o zgło-
szenia pochodzące bezpośrednio od programi-
stów. Stają się przez to coraz lepiej dostosowane
do aktualnych wymagań i potrzeb. Niestety nie
ma róży bez kolców. Wykorzystanie przeglądar-
ki i obsługiwanego przez nie języka - JavaScrip-
tu, czyni rozwiązania oparte o GWT wolniej-
szymi od normalnych interfejsów graficznych
grubych klientów. Wszędzie jednak tam, gdzie
wydajność nie ma głównego znaczenia, GWT z
masą swoich zalet jest prawie idealnym środowi-
skiem dla naszej aplikacji.
Rysunek 1. Działająca zakładka z formularzem osobowym
AUTOR: RAFAŁ PIETRASIK
Absolwent Politechniki Warszawskiej, od kilku lat
W Sieci zajmuje się pisaniem aplikacji sieciowych i projek-
• Strona projektu GWT Ext – http://extjs.com/products/gxt/, towaniem interfejsów użytkownika. Pracuje w fir-
• Strona środowiska GWT – http://code.google.com/webtoolkit/. mie XQG Software.
Kontakt z autorem: rafal@xqg.com.pl

32 02/2009
Opis CD

Biblioteki/Programy Materiały
Python dla S60 GPS z .NET Compact Framework
Biblioteka niezbędna do uruchamiania aplikacji i skryptów napisa- Do artykułu dołączony kod źródłowy omawianej aplikacji i skom-
nych w języku Python dla systemu Symbian. pilowana aplikacja.

Android SDK 1.0 Aplikacje desktopowe w przeglądarce www


Wersja SDK 1.0 dla systemu Google – Android. Każdy progra- Do niedawna w interfejsach opierających się na przeglądarce uzyska-
mista, który się powstrzymywał‚ od pobrania środowiska deve- nie pełnej funkcjonalności, które oferowały aplikacje oparte na gru-
loperskiego dla Android z winy niedociągnięć, teraz nie ma wy- bym kliencie, było bardzo trudne, jeżeli wręcz nie niemożliwe. Śro-
mówek. dowisko GWT w połączeniu z biblioteką Ext GWT zmieniają diame-
Wszystko jest dostępne, działa i zostało przetestowane przez tralnie ten stan rzeczy.
wielu programistów. Miłego kodowania.
PS Mobile
Eclipse Ganymede SR1 + EclipseME PS Mobile to system wspomagania zbierania zamówień przez mo-
Eclipse to jedno z dwóch najczęściej wykorzystywanych IDE przez bilnych przedstawicieli handlowych – PreSelling-u. Materiały pre-
programistów piszących mobilne aplikacje w Javie ME. zentują możliwości systemu.

Netbeans 6.5 Inne


Netbeans 6.5 to IDE wykorzystywane przez programistów piszą- Pozostałe programy przydatne przy programowaniu urządzeń mo-
cych mobilne aplikacje w Javie ME bilnych.

Redakcja nie udziela pomocy


technicznej w instalowaniu
i użytkowaniu programów
zamieszczonych na płytach
CD-ROM dostarczonych
razem z pismem.

Jeśli nie możesz


odczytać zawartości
płyty CD, a nie jest ona
uszkodzona mechanicznie,
sprawdź ją na co najmniej
dwóch napędach CD.
W razie problemów z płytą,
prosimy pisać pod adres:
cd@softtware.com.pl

www.sdjournal.org 33
Warsztaty

Wykładnicze mapy cieni


Charakterystyka i implementacja algorytmu
miękkich cieni w grafice komputerowej czasu rzeczywistego
Mapy cieni są najczęściej wykorzystywaną techniką cieniowania
w grach komputerowych. W niniejszym artykule postaram się przybliżyć
technikę map cieni oraz zaimplementować algorytm miękkich cieni
przy wykorzystaniu HLSL i biblioteki DirectX 9.0.

efekt aliasingu mogą zostać zniwelowane po-


Dowiesz się: Powinieneś wiedzieć: przez zwiększenie rozdzielczości lub przez sze-
• Co to są mapy cieni i jak one działają; • Posiadać znajomość algebry z zakresu prze- reg rozmaitych procesów związanych z filtrowa-
• Jak zaimplementować algorytm miękkich cieni. kształceń geometrycznych w 3D; niem mapy cieni, tj. technika PCF (ang. percenta-
• Znać podstawy programowania w języku HLSL ge close filtering). W grach komputerowych naj-
oraz DirectX w wersji 9.0; częściej stosuje się cienie wygenerowane od świa-
• Znać podstawy programów cieniujących geo- tła słonecznego, które reprezentowane jest przez
metrię. pojedyncze światło kierunkowe, zatem mapy cie-
ni generowane są dla jednego światła na scenie.
Obok map cieni istnieją jeszcze inne techniki
wanym Casting curved shadows on curved surfaces. wyznaczania cieni na scenie wirtualnej. Do ta-
Od tego czasu technika ta stosowana jest zarówno kich metod należą m.in.:
Poziom trudności w grafice czasu rzeczywistego, jak i w grafice pre-
renderowanej wykorzystywanej w branży filmów • cieniowanie z wykorzystaniem bufora sza-
animowanych (np. Toy Story, Wall-E). blonowego (ang. stencil shadows),
Mapy cieni są jednym z wielu algorytmów • cienie rzutowane (ang. projected planar sha-

R
ealistyczne obrazy tworzone za pomo- cieniowania w grafice komputerowej. Do naj- dows),
cą grafiki komputerowej są ważnymi ważniejszych zalet map cieni należy zaliczyć: • przeliczone mapy światła (ang. precompu-
narzędziami w takich dziedzinach jak: ted lightmaps).
nauka, rozrywka, symulacja, projektowanie, czy • wydajne dla dynamicznych i złożonych
marketing. Wyznaczanie zacieniowanych po- scen wirtualnych, Cienie z wykorzystaniem bufora szablonowego
wierzchni sceny wirtualnej jest nieodzownym • algorytm nie wymaga skomplikowanych sprawiają trudności przy wymaganym geome-
elementem aplikacji graficznych czasu rzeczy- obliczeń i jest łatwy w implementacji, trycznym generowaniu obszarów cienia (ang.
wistego (tj. gry komputerowe, symulatory lotu • do przechowywania informacji o cieniach shadow volumes). Dodatkowo krawędzie cienia
etc.). Cienie dodają wrażenia głębi obrazu i spra- dla danego światła potrzebna jest tylko wygenerowane tą techniką są ostre i nienatu-
wiają, iż uzyskany obraz staje się bardziej fotore- jedna tekstura, ralne. Cienie rzutowane z kolei działają popraw-
alistyczny. Najczęściej wykorzystywaną techniką • istnieje wiele modyfikacji algorytmu, któ- nie jedynie dla płaskich powierzchni, co jest
wyznaczania cieni w grach komputerowych jest re umożliwiają uzyskanie efektu reali- dość znaczącym ograniczeniem. Mapy świa-
technika map cieni (lub mapowania cieni, ang. stycznie wyglądających miękkich cieni. tła, oprócz miękkich cieni, mogą przechowy-
shadow mapping). Obecnie istnieje wiele mody- wać także informacje o przeliczonym oświetle-
fikacji algorytmu mapowania cieni. W niniej- Niestety obok szerokiej listy zalet mapy cieni niu pośrednim (tzn. uwzględniającym również
szym artykule postaram się przybliżyć nową posiadają również wady: światło odbite od innych powierzchni na scenie
technikę cieniowania, bazującą na algorytmie (ang. global illumination), jednakże wymagają
map cieni, umożliwiającą uzyskanie miękkich • dokładność cieni jest ograniczona przez one sporych nakładów obliczeniowych i nie są
cieni dla zarówno prostych, jak i złożonych scen rozdzielczość mapy cieni, przystosowane do scen dynamicznych.
wirtualnych. Zaczniemy od wyjaśnienia, czym • efekt aliasingu – zwłaszcza dla map cieni
są mapy cieni, omówimy algorytm mapowana o niskiej rozdzielczości, Jak działają mapy cieni?
cieni w wersji podstawowej, a następnie przyj- • obraz sceny musi zostać wygenerowany Czym jest cień? Otóż cieniem będziemy nazy-
rzymy się prostej modyfikacji algorytmu, wpro- osobno dla każdego światła kierunkowego. wać obszar, do którego nie dociera światło na
wadzając wykładnicze mapy cieni. skutek przeszkód ustawionych na drodze pro-
Pomimo wymienionych wyżej wad, mapy cieni mieni świetlnych, nieprzepuszczających świa-
Wprowadzenie są najczęściej wykorzystywaną i bardzo inten- tła. Wyobraźmy sobie scenę, na której znajdują
Pojęcie map cieni zostało wprowadzone przez Lan- sywnie rozwijaną techniką cieniowania w gra- się różne obiekty i jedno źródło światła (Rysu-
ce Williama w 1978 roku w dokumencie zatytuło- fice komputerowej. Mała dokładność cieni oraz nek 1.).W jaki sposób sprawdzić, czy dany ele-

34 02/2009
Wykładnicze mapy cieni

ment sceny jest w cieniu? Intuicja podpowiada,


iż należałoby sprawdzić geometrycznie czy na
drodze od rozpatrywanego elementu sceny do
źródła światła znajduje się jakiś inny element
sceny wirtualnej blokujący promień światła.
Innymi słowy – wszystkie fragmenty obiektów
widoczne z punktu widzenia światła są oświetlo-
ne, natomiast pozostałe elementy (schowane za
obiektami oświetlonymi) będą znajdowały się w
cieniu. Na tej właśnie obserwacji bazuje algorytm
mapowania cieni. W pierwszej kolejności scena
wirtualna jest renderowana z punktu widzenia
światła do mapy głębokości (ang. depth map), którą
będziemy określać mianem mapy cieni (ang. sha-
dow map). Mapa cieni zawiera informację o odle-
głości do obiektów widzianych z punktu widzenia
światła i jest najczęściej przechowywana w postaci
tekstury o formacie zmiennoprzecinkowym.
Następnie renderujemy scenę z punktu wi-
dzenia obserwatora, jednocześnie wykorzystu-
jąc mapę cieni do porównania, czy dany obszar
jest widoczny z punktu widzenia światła, czy
też nie. W ten sposób określamy, które obsza-
ry sceny wirtualnej znajdują się w cieniu. Algo- Rysunek 1. Cienie wygenerowane metodą wykładniczych map cieni
rytm składa się jedynie z dwóch kroków:

• generowanie mapy cieni z punktu widze-


nia światła,
• renderowanie sceny z punktu widzenia
obserwatora z wyznaczaniem zacieniowa-
nych obszarów.

Poniżej omówimy dokładnie te dwa elementy


algorytmu a także przyjrzymy się szczegółom
implementacji algorytmu z wykorzystaniem
akceleracji sprzętowej kart graficznych.
Rysunek 2. Wygenerowana mapa cieni z punktu widzenia światła; od lewej: podstawowa mapa cieni i
Generowanie mapy cieni rozmyta mapa cieni
W celu wygenerowania mapy cieni musimy wy-
renderować scenę z punktu widzenia światła oraz
zapisać informację o głębokości do tekstury. Aby to
zrobić, potrzebujemy najpierw utworzyć teksturę
o formacie zmiennoprzecinkowym i zadanym wy-
miarze, np. 512x512 pikseli. Będziemy także po-
trzebować macierzy transformacji światła na wzór
macierzy transformacji obserwatora. Dla świateł
punktowych (ang. omni light) macierz transforma-
cji światła powinna opisywać rzut perspektywicz-
ny, natomiast dla świateł kierunkowych (ang. direc-
tional light) – rzut prostopadły. Macierz transfor-
macji światła powinna również zawierać informa-
cję (podobnie jak macierz transformacji obserwa-
tora) o położeniu i kierunku światła.
Podczas generowania obrazu do mapy cieni
wszystkie wierzchołki obiektów na scenie są prze-
kształcane przez macierz transformacji światła w
celu pozyskania informacji o głębokości. W pro-
gramie cieniującym piksele zamiast koloru zapi-
sujemy interpolowaną pomiędzy wierzchołkami
obiektu wartość współrzędnej z, która jest rów-
noznaczna z odległością danego fragmentu obiek-
tu od światła. Na Rysunku 2. przedstawiona jest
wizualizacja mapy głębokości wygenerowanej z Rysunek 3. Cienie wygenerowane podstawową metodą mapowania cieni; widoczne artefakty na
punktu widzenia światła dla przykładowej sceny. brzegach obszarów zacieniowanych

www.sdjournal.org 35
Warsztaty

Obszary ciemniejsze oznaczają fragmenty znaj- jest mniejsza). Kod w HLSL-u generujący mapę Wyznaczanie
dujące się bliżej światła (wartość współrzędnej z cieni jest przedstawiony na Listingu 1. zacieniowanych obszarów
Wyznaczanie zacieniowanych obszarów odby-
Listing 1. Generowanie mapy cieni (HLSL) wa się podczas procesu generowania obrazu
sceny z punktu widzenia obserwatora.
struct VS_SHADOW_OUTPUT Program cieniujący wierzchołki (ang. vertex sha-
{ der), oprócz typowej dla siebie operacji przekształ-
float4 Position : POSITION; cenia wierzchołków obiektów przez macierz trans-
float2 Depth : TEXCOORD0; formacji obserwatora, wyznacza również wierz-
}; chołki obiektów w układzie światła (poprzez prze-
kształcenie przez macierz transformacji światła).
VS_SHADOW_OUTPUT ShadowVS( VS_INPUT input ) Otrzymane w ten sposób informacje przekazywa-
{ ne są do programu cieniującego piksele (ang. pixel
VS_SHADOW_OUTPUT output; shader), który jest odpowiedzialny za wyznaczenie
odpowiednich wartości koloru dla wszystkich pik-
/// Przekształcenie wierzchołków przez macierz transformacji światła seli w docelowym widoku. Jednym z elementów
output.Position = mul(input.Position, WorldMatrix); wyznaczenia wartości koloru jest określenie, czy
output.Position = mul(output.Position, LightViewProjMatrix); dany piksel reprezentujący fragment renderowa-
output.Depth.xy = output.Position.zw; nego obiektu powinien zostać zacieniowany. Pro-
gram cieniujący piksele na ekranie porównuje głę-
return output; bokość każdego piksela w układzie współrzędnych
} światła (r) z głębokością danego piksela odczytaną
z mapy głębokości (o). Możliwe przypadki to:

float4 ShadowPS( VS_SHADOW_OUTPUT input ) : COLOR0 • r = o – na drodze do światła nie stoi żadna
{ przeszkoda, zatem piksel nie jest zacienio-
/// Zapisanie wartości z/w w mapie głębokości wany (wartość koloru pozostaje bez zmian),
return input.Depth.x / input.Depth.y; • r > o – na drodze do światła stoi prze-
} szkoda, która cieniuje rozpatrywany pik-
sel na ekranie (wartość koloru zostaje prze-
mnożona przez współczynnik zacieniowa-
technique zfill nia (ang. shadow factor), np. sf = 0.3).
{
pass P0 Powtarzając powyżej wymienione czynności
{ dla każdego piksela na ekranie, wyznaczamy
VertexShader = compile vs_2_0 ShadowVS(); zacieniowane obszary w zakresie pola widze-
PixelShader = compile ps_2_0 ShadowPS(); nia obserwatora (jak pokazano na Rysunku 3.).

CullMode = CCW; Czy można poprawić jakość cieni?


ZEnable = true; Jak możemy zaobserwować na Rysunku 3., jakość
ZWriteEnable = true; wygenerowanych cieni techniką mapowania cieni
} pozostawia wiele do życzenia. Główną przyczyną
} słabej jakości cieni jest mała rozdzielczość mapy
cieni (w przykładzie 512 x 512 pikseli).
Cienie możemy poprawić, zwiększając roz-
dzielczość mapy cieni. Nie zawsze jednak możemy
sobie na to pozwolić, gdyż wiąże się to z większym
narzutem pamięciowym, a także ze spadkiem wy-
dajności. Możemy również skorzystać z techniki
PCF, która wykorzystuje interpolację dwulinio-
wą (ang. bilinear interpolation) w celu uzyskania
bardziej płynnego przejścia pomiędzy obszarami
zacieniowanymi i oświetlonymi. Wartości z tek-
stury mapy cieni wykorzystujemy do porówna-
nia w procesie wyznaczania zacieniowanych ob-
szarów sceny, co sprawia, iż w żaden sposób nie
możemy tej tekstury zmodyfikować (np. przefil-
trować). Możemy natomiast zbadać otoczenie pik-
sela, próbkując kilka wartości z mapy cieni i w ten
sposób określić stopień zacieniowania w danym
punkcie poprzez uśrednienie otrzymanych wy-
ników porównania. Na Rysunku 4. możemy zo-
Rysunek 4. Różnice w jakości wyznaczonych obszarów zacieniowanych, od lewej: (a) podstawową baczyć nieznaczną poprawę jakości wygenerowa-
techniką mapowania cieni; (b) techniką PCF; (c) techniką wykładniczych map cieni nych cieni przy wykorzystaniu techniki PCF.

36 02/2009
Wykładnicze mapy cieni

Innym sposobem na poprawienie jakości cieni zacieniowanych obszarów przy pomocy zmian w stosunku do wersji dla zwykłego al-
jest przefiltrowanie bufora (np. techniką Gaus- funkcji wykładniczej. gorytmu mapowania cieni, który omówiliśmy
sa) z wygenerowanymi cieniami, który wielkością wcześniej. Nowością jest kolejny krok polega-
odpowiada rozmiarom bufora ekranu. W tym po- Proces generowania mapy cieni dla algorytmu jący na przefiltrowaniu (rozmyciu) mapy cie-
dejściu należy wyrenderować scenę (mapę kolo- ESM z punktu widzenia światła pozostaje bez ni, dzięki czemu uzyskujemy miękkie obwód-
ru obiektów) i zacieniowane obszary do osobnych
tekstur. Pomocna tutaj okazuje się technika MRT Listing 2. Rozmywanie mapy cieni metodą logarytmiczną (HLSL)
(ang. multiple render targets), która umożliwia nam
zapis do tych dwóch tekstur w jednym przebiegu. struct VS_OUTPUT_SMBLUR
Następnie filtrujemy bufor z zacieniowanymi ob- {
szarami, co niweluje efekt aliasingu i ostrych kra- float4 Position : POSITION;
wędzi cieni. W ostatniej fazie rysujemy prostokąt float2 TexCoord[5] : TEXCOORD0;
na pełnym ekranie, uwzględniając wartości koloru };
pikseli z tekstury sceny i z rozmytej tekstury cieni. /// Rozmiar mapy cieni (512x512)
Algorytm kaskadowych map cieni (CSM, ang. #define SHADOW_MAP_SIZE 512
cascaded shadow maps) eliminuje w znacznym
stopniu problem aliasingu poprzez zastosowanie VS_OUTPUT_SMBLUR BlurShadowMapVS( float4 vPos : POSITION, float4 vTexCoord : TEXCOORD0,
dokładniejszych map cieni dla obiektów znajdu- uniform int taps, uniform float2 direction )
jących się bliżej obserwatora i map mniej dokład- {
nych dla obiektów odległych. CSM wykorzystują VS_OUTPUT_SMBLUR output;
podział stożka widzenia obserwatora prostopadły-
mi płaszczyznami i generowanie oddzielnej mapy float2 texelSize = 1.0f / float2(SHADOW_MAP_SIZE, SHADOW_MAP_SIZE);
cieni dla każdego uzyskanego fragmentu stożka.
Lepszą jakość cieni możemy również uzy- output.Position.xy = 2.0f * vPos.xy - 1.0f;
skać, wykorzystując najnowszą technikę wy- output.Position.y *= -1;
kładniczych map cieni. output.Position.zw = float2(0.5f, 1.0f);

Wykładnicze mapy cieni float2 step = direction * texelSize;


Jak wspomnieliśmy wcześniej, algorytm map cie- float2 base = vTexCoord - ((((float)taps - 1)*0.5f) * step);
ni porównuje głębokość każdego piksela w ukła-
dzie współrzędnych światła z głębokością danego for (int i = 0; i < taps; i++)
piksela odczytaną z mapy głębokości. W ten spo- {
sób otrzymujemy jedynie dyskretną wartość (0 output.TexCoord[i] = base;
lub 1), która określa, czy dany piksel jest w cieniu, base += step;
czy też nie. Może moglibyśmy wykorzystać też in- }
formację o różnicy wartości, które porównujemy?
Wykładnicze mapy cieni (ESM, ang. exponen- return output;
tial shadow maps) wyznaczają cienie za pomocą }
ciągłej funkcji wykładniczej //------------------------------------------------------------------------------
// Filtrowanie logarytmiczne

���������� //------------------------------------------------------------------------------
��������� float log_conv ( float x0, float X, float y0, float Y )
{
gdzie c jest stałym współczynnikiem skalującym return (X + log(x0 + (y0 * exp(Y - X))));
różnicę wartości głębokości piksela w układzie }
światła i wartości odczytanej z mapy cieni (r–o).
Dzięki takiemu podejściu mamy możliwość sko- float4 BlurShadowMapPS( VS_OUTPUT_SMBLUR input ) : COLOR0
rzystania z przefiltrowanej mapy cieni i płynne- {
go wyznaczenia stopnia zacieniowania rozpatry- int i;
wanego piksela. W ten sposób uzyskujemy płyn-
ne przejścia z obszarów zacieniowanych do ob- float sample[5];
szarów oświetlonych. Zmieniając wartość stałej c, for (i = 0; i < 5; i++)
sterujemy poziomem miękkości uzyskanych cie- sample[i] = tex2D( ShadowMapSampler, input.TexCoord[i] ).x;
ni (w przykładzie wartość stałej c wynosi 90).
Algorytm wykładniczych map cieni wpro- const float c = (1.f/5.f);
wadza dodatkowy krok polegający na filtrowa-
niu mapy cieni: float accum;
accum = log_conv( c, sample[0], c, sample[1] );
• generowanie mapy cieni z punktu widze- for (i = 2; i < 5; i++)
nia światła, accum = log_conv( 1.f, accum, c, sample[i] );
• przefiltrowanie mapy cieni (np. techniką
Gaussa), return accum;
• wygenerowanie obrazu sceny z punktu }
widzenia obserwatora z wyznaczaniem

www.sdjournal.org 37
Warsztaty

Listing 3a. Wyznaczanie obszarów zacieniowanych różnymi technikami (HLSL)

struct VS_INPUT float4 RenderScenePS( VS_OUTPUT input ) : COLOR0


{ {
float4 Position : POSITION; float4 oColor = input.Diffuse;
float3 Normal : NORMAL0;
float3 Tangent : TANGENT; float3 n = normalize(input.Normal.xyz);
float4 Color : COLOR0; float3 l_dir = normalize(SunPos.xyz - input.PosInWorld.xyz);
float2 TexCoord : TEXCOORD0;
}; /// Jeżeli trójkąt jest zwrócony w stronę światła
if (dot(l_dir.xyz, n.xyz) > 0.0f)
struct VS_OUTPUT {
{ /// Wyznaczenie współrzędnych mapowania danego piksela w
float4 Position : POSITION; mapie głębokości
float4 Diffuse : COLOR0; float2 sh = 0.5 * input.PosInSun.xy / input.PosInSun.w +
float4 TexCoord : TEXCOORD0; float2(0.5f, 0.5f);
float4 Normal : TEXCOORD1; sh.y = 1.0f - sh.y;
float4 PosInWorld : TEXCOORD4;
float4 PosInSun : TEXCOORD5; /// Wyznaczenie wartości Z w układzie światła
}; float zw = input.PosInSun.z / input.PosInSun.w;

/// Zmienne pomocnicze dla interpolacji dwuliniowej


VS_OUTPUT RenderSceneVS( VS_INPUT input) float2 SM_SIZE = float2(512 ,512);
{ float2 unnormalized = sh * SM_SIZE;
VS_OUTPUT output; float2 fractional = frac(unnormalized);
unnormalized = floor(unnormalized);
float4 pos_in_world = mul(input.Position, WorldMatrix);
output.Diffuse = input.Color * DiffuseColor; #if (SHADOWS_TECH == SHADOWS_SIMPLE)
float shadow = (tex2D( ShadowMapSampler, unnormalized.xy/
output.Position = mul(pos_in_world, ViewProjMatrix); SM_SIZE ) + EPSILON < zw) ? 0.0f: 1.0f;
output.TexCoord = float4(input.TexCoord.xy, 0.0f, 0.0f); #endif

float3 n = normalize(mul(input.Normal.xyz, (float3x3)WorldMa #if (SHADOWS_TECH == SHADOWS_PCF)


trix).xyz); /// Porównanie 4 próbek w obrębie badanego piksela
output.Normal = float4(n.xyz, 1.0f); float4 shadow4;
shadow4.x = (tex2D( ShadowMapSampler, (unnormalized.xy +
/// Pozycja w układzie świata float2(0,0))/SM_SIZE ) + EPSILON < zw) ?
output.PosInWorld = pos_in_world; 0.0f: 1.0f;
shadow4.y = (tex2D( ShadowMapSampler, (unnormalized.xy +
/// Pozycja w układzie słońca float2(1,0))/SM_SIZE ) + EPSILON < zw) ?
output.PosInSun = mul(pos_in_world, LightViewProjMatrix); 0.0f: 1.0f;
shadow4.z = (tex2D( ShadowMapSampler, (unnormalized.xy +
return output; float2(0,1))/SM_SIZE ) + EPSILON < zw) ?
} 0.0f: 1.0f;
shadow4.w = (tex2D( ShadowMapSampler, (unnormalized.xy +
texture TexShadowMap; float2(1,1))/SM_SIZE ) + EPSILON < zw) ?
sampler ShadowMapSampler = sampler_state 0.0f: 1.0f;
{
Texture = <TexShadowMap>; /// Interpolacja dwuliniowa pomiędzy wynikami 4 porównań
AddressU = CLAMP; float shadow = lerp(lerp( shadow4.x, shadow4.y,
AddressV = CLAMP; fractional.x ),
MinFilter = LINEAR; lerp( shadow4.z, shadow4.w,
MagFilter = LINEAR; fractional.x ),
MipFilter = LINEAR; fractional.y );
SRGBTEXTURE = FALSE; #endif
};
#if (SHADOWS_TECH == SHADOWS_ESM)
#define SHADOWS_SIMPLE 0 /// Próbkowanie 4 wartości obrębie badanego piksela
#define SHADOWS_PCF 1 float4 shadow4;
#define SHADOWS_ESM 2 shadow4.x = zw - tex2D( ShadowMapSampler, (unnormalized.xy
+ float2(0,0))/SM_SIZE );
#define SHADOWS_TECH SHADOWS_ESM shadow4.y = zw - tex2D( ShadowMapSampler, (unnormalized.xy
+ float2(1,0))/SM_SIZE );

38 02/2009
Wykładnicze mapy cieni

ki wokół obszarów zacieniowanych (Rysunek zem jednak nie porównujemy tych dwóch war- serwować na Rysunku 4. W razie konieczności
2b.). Bardzo dobre rezultaty przy filtrowaniu tości, tylko wyznaczamy stopień zacieniowania możemy również wygenerować cienie techni-
mapy cieni otrzymuje się, korzystając z meto- piksela, korzystając ze wzoru. Dodatkowo mo- ką ESM do oddzielnego bufora i następnie sko-
dy logarytmicznej przedstawionej na Listin- żemy skorzystać z techniki PCF, podobnie jak rzystać z filtrowania pełnoekranowego jeszcze
gu 2. Filtrowanie odbywa się przy wykorzysta- przy zwykłych mapach cieni. W wyniku otrzy- bardziej zmiękczając cienie. Dodatkowo może-
niu tymczasowej tekstury w formacie zmien- mujemy miękkie cienie bez widocznego alia- my zastosować technikę kaskadowych map cie-
noprzecinkowym, rozmiarami odpowiadają- singu i innych artefaktów wpływających nega- ni zmniejszając efekt aliasingu.
cej mapie cieni. Kolejny etap algorytmu pole- tywnie na krawędzie cieni. Kod programu cie-
ga na wyznaczeniu obszarów zacieniowanych niującego piksele różnymi technikami (podsta- Podsumowanie
przy wykorzystaniu przefiltrowanej mapy cie- wową, PCF i wykładniczych map cieni) przed- Przedstawiliśmy szczegółowy opis oraz imple-
ni. Podobnie jak wcześniej wyznaczamy głę- stawiono na Listingu 3. Metoda wykładni- mentację nowoczesnego algorytmu wykład-
bokość piksela w układzie światła (r) oraz od- czych map cieni w połączeniu z techniką PCF niczych map cieni służącego do wyznaczania
czytujemy głębokość z mapy cieni (o). Tym ra- daje bardzo dobre rezultaty, co możemy zaob- miękkich cieni w czasie rzeczywistym. Wy-
kładnicze mapy cieni wprowadzają niewielkie
zmiany w stosunku do swojej wersji pierwot-
W Sieci nej. Sprawia to, iż zaprezentowany algorytm
• http://pixelstoomany.wordpress.com/category/shadows/exponential-shadow-maps/ – model jest szybki i wydajny nawet na nieco starszych
matematyczny wykładniczych map cieni; kartach graficznych.
• http://www.mpi-inf.mpg.de/~tannen/papers/gi_08_esm.pdf – artykuł opisujący algorytm wy- Wykładnicze mapy cieni sprawdzają się zarów-
kładniczych map cieni; no dla opisujących wnętrza np. pomieszczenia
• http://en.wikipedia.org/wiki/Shadow_mapping – definicja podstawowych pojęć związanych z
budynków (ang. indoor scenes) jak i dla złożonych
mapowaniem cieni;
• http://developer.nvidia.com/object/doc_shadows.html – zbiór artykułów dotyczących różnych scen modelujących świat zewnętrzny (teren, lasy,
metod cieniowania w grafice komputerowej; roślinność, budynki, ang. outdoor scenes). Przedsta-
• http://msdn.microsoft.com/en-us/library/bb147372(VS.85).aspx – przykład (wraz z kodem źró- wiony algorytm jest elastyczny i możliwy w zasto-
dłowym) prezentujący działanie algorytmu map cieni. sowaniu z innymi metodami poprawiającymi ja-
kość cieni (np. PCF, czy kaskadowe mapy cieni).
Wszystkie przykładowe programy zostały prze-
Definicje testowane na komputerze z procesorem AMD
Athlon XP 2500+ 1.8 GHz, 512 MB pamięci
• Algorytm – ściśle określony ciąg czynności, których wykonanie prowadzi do rozwiązania ja- RAM oraz kartą graficzną nVidia 6600 GT.
kiegoś zadania;
• Fotorealizm – sposób oddawania rzeczywistości powodujący wrażenie, jakby została ona
sfotografowana;
• Silnik graficzny – część kodu aplikacji odpowiedzialna za tworzenie grafiki na ekranie kom- PAWEŁ ROHLEDER
putera; Autor pracuje na stanowisku programisty/projektanta
• Interpolacja dwuliniowa (ang. bilinear filtering) – wyznaczanie wartości koloru piksela na pod- grafiki komputerowej 3D w firmie Techland Sp. z o.o.
stawie wartości czterech sąsiednich pikseli; Jest również słuchaczem studiów doktoranckich na
• Aliasing – zjawisko zniekształcenia obrazu w procesie rasteryzacji wynikające ze zbyt małej
Politechnice Wrocławskiej.
częstości próbkowania.
Kontakt z autorem: prohleder@wp.pl

Listing 3b. Wyznaczanie obszarów zacieniowanych różnymi technikami (HLSL)

shadow4.z = zw - tex2D( ShadowMapSampler, (unnormalized.xy /// Przemnożenie wartości koloru przez współczynnik
+ float2(0,1))/SM_SIZE ); zacieniowania
oColor.xyz *= saturate(shadow + 0.3f);
shadow4.w = zw - tex2D( ShadowMapSampler, (unnormalized.xy }
+ float2(1,1))/SM_SIZE );
return oColor;
shadow4 = max(shadow4, 0.0f) * saturate(dot(n, l_dir)); }

/// Zastosowanie funkcji wykładniczej dla pobranych próbek


(wzór 1) technique std
{
shadow4 = exp(-90.0f * shadow4); pass P0
{
/// Interpolacja dwuliniowa pomiędzy 4 próbkami VertexShader = compile vs_2_0 RenderSceneVS();
float shadow = lerp(lerp( shadow4.x, shadow4.y, fractional.x PixelShader = compile ps_2_0 RenderScenePS();
),
lerp( shadow4.z, shadow4.w, CullMode = CCW;
fractional.x ), ZEnable = true;
ZWriteEnable = true;
fractional.y ); }
#endif }

www.sdjournal.org 39
Programowanie urządzeń mobilnych

Mobilne PKI
Autoryzacja i uwierzytelnianie użytkowników

Koncepcja Infrastruktury Klucza Publicznego (PKI) znana jest od lat, jednak


wciąż nie potrafi znaleźć naprawdę powszechnego zastosowania. W naszym
artykule przyjrzymy się implementacji PKI na urządzeniach mobilnych,
na przykładzie wdrożenia w jednej z polskich służb mundurowych.
Wytłumaczymy, co to LAP i LASS, dlaczego łatwo jest używać CSP oraz
jakie niespodzianki czekają na piszących oprogramowanie na karty SIM.
Czy zatem podpis elektroniczny – rozwią-
Dowiesz się: Powinieneś wiedzieć: zanie, które może usprawnić tak wiele ob-
• co to jest LAP i LASS, • coś o programowaniu w językach C i Java (zna- szarów naszej aktywności – nie ma szans na
• jak stworzyć własne CSP, jomość tematyki kart SIM oraz podpisu elek- to by stać się naturalnym, ogólnie dostęp-
• co to jest Java Card, tronicznego może okazać się przydatna). nym i powszechnie akceptowanym rozwią-
• dlaczego mobilny podpis elektroniczny ma zaniem w naszym kraju? Na szczęście wyda-
szansę zrewolucjonizować podejście do PKI. je się, że tak nie jest. W ostatnim czasie za-
równo na prawnym, jak i na technologicz-
nym froncie podjęto działania, które spra-
mienne skutki formalnoprawne, wymienić na- wić mają, iż podpis elektroniczny zyska na-
leży trzy elementy: leżny mu status i rzeczywiście wejdzie pod
Poziom trudności strzechy.
• Kontekst oraz uwarunkowania prawne Z punktu widzenia uregulowań praw-
determinowane w głównej mierze przez nych trwają intensywne prace nad noweliza-
ustawę o podpisie elektronicznym z 18 cją ustawy o podpisie elektronicznym. Obec-

I
nfrastruktura Klucza Publicznego (z września 2001 roku – niestety znajdują- nie prowadzone są ustalenia międzyresorto-
ang. Public Key Infrastructure – PKI) to ce się tam definicje i rozwiązania nie po- we i pozostaje mieć nadzieję, iż znowelizowa-
znana od wielu lat koncepcja wykorzy- prawiły powszechnego zrozumienia, a w na ustawa nie tylko dostosuje polskie prawo-
stania i zastosowania w praktyce zalet i do- konsekwencji nie doprowadziły do zaak- dawstwo do prawodawstwa unijnego, ale też,
brodziejstw zaproponowanej w 1976r. przez ceptowania i wdrożenia, omawianej tech- unikając wad i błędów swojej poprzedniczki,
Diffiego i Hellmana kryptografii wykorzy- nologii. przyczyni się do lepszego zrozumienia i uła-
stującej asymetryczne algorytmy szyfrujące. • Uwarunkowania ekonomiczne – w po- twi akceptację rozwiązań podpisu elektro-
Mimo wszystkich swoich zalet, najwyższego wszechnym odczuciu koszt certyfikatów nicznego.
oferowanego poziomu bezpieczeństwa, go- kwalifikowanych potrzebnych do praw- W niniejszym artykule skupiamy się nato-
towości technologicznej, wielu analiz i nie- nego uznania podpisu elektronicznego miast na rozwiązaniu, które eliminuje pozo-
zliczonych publikacji poświęconych imple- jest zbyt wysoki (rzędu 200 PLN rocz- stałe ze wspomnianych ograniczeń spowalnia-
mentacji PKI, koncepcja ta (także w Polsce) nie), co w połączeniu z ograniczonym do jących bądź uniemożliwiających upowszech-
wciąż nie uzyskała statusu rozwiązania po- niego zaufaniem i niepełnym zrozumie- nienie się w naszym społeczeństwie rozwiązań
wszechnego i ogólnie dostępnego. Kolejne niem jego znaczenia i działania powodu- związanych z PKI i podpisem elektronicznym.
światowe wdrożenia mają ciągle charakter je, że ciągle niewiele osób decyduje się na O stopniu zaawansowania i innowacyjności te-
eksperymentalny i obejmują raczej niewiel- jego zakup, go rozwiązania niech świadczy fakt uhonoro-
kie grupy użytkowników • Ograniczenia związane z wygodą, kom- wania go (i jego autorów) tytułem Innovatora
fortem oraz ergonomią korzystania z roz- Małopolski 2008.
Wyboista droga do PKI wiązań aktualnie dostępnych na rynku –
W warunkach polskich, wśród czynników osoba chcąca korzystać na co dzień z do- Mobilna
ograniczających faktyczne upowszechnienie brodziejstw PKI musi nabyć, zainstalo- infrastruktura klucza publicznego
idei podpisu elektronicznego, poza barierami wać i skonfigurować dodatkowe elementy Koncepcja mobilnego PKI zakłada wykorzy-
psychologicznymi oraz podejrzliwością wobec sprzętowe, takie jak specjalne karty kryp- stanie jako nośnika materiału kryptograficz-
nowych rozwiązań, a zwłaszcza tych rozwią- tograficzne, dedykowane do nich czytni- nego specjalnych kart SIM, które omawia-
zań, które pociągać mogą za sobą bardzo brze- ki itd. ne są szerzej w dalszej części artykułu, oraz

40 02/2009
Mobilna autoryzacja i uwierzytelnianie użytkowników

dowolnego telefonu komórkowego. Za uży- netowej), które wykorzystuje specjalne bi- Z technicznego punktu widzenia, moduł
ciem telefonu przemawia nasycenie rynku, blioteki kryptograficzne, użytkownik uzy- LAP to dynamicznie ładowana biblioteka
przekraczające 100% populacji, oraz fakt, że skuje dostęp do strzeżonych systemów in- (DLL), eksportująca określone funkcje, któ-
(według badań koncernu Visa) ponad 70% z formatycznych. Artykuł ten omawia tylko re wywoływane są przy uruchamianiu sys-
nas zabiera telefon ze sobą udając się na noc- część komponentów zaprezentowanej archi- temu w celu uwierzytelnienia użytkowni-
ny spoczynek oraz używa go zamiast budzika tektury, umieszczonych na urządzeniu mo- ka. Instalowany moduł LAP musi dodatko-
i zegarka. Użycie kart SIM i telefonu pozwa- bilnym. wo posiadać specjalny podpis cyfrowy – bez
la więc użytkownikowi uniknąć kosztów do- W dalszej części opisujemy koncepcję, spo- niego moduł nie zostanie w ogóle załadowa-
datkowego sprzętu, a zamiast czytników, ka- sób działania oraz techniki implementa- ny przez system operacyjny. Podpis ten moż-
bli i kolejnych kart używać tylko swojego te- cji: modułu uwierzytelniania użytkowników na uzyskać w przeprowadzanym przez Mi-
lefonu! LAP, bibliotek kryptograficznych CSP oraz crosoft procesie weryfikacji konkretnego mo-
Zaproponowano zatem rozwiązanie, któ- apletów JavaCard odpowiedzialnych za prze- dułu.
re eliminuje w znacznej mierze niewygody chowywanie kluczy i certyfikatów oraz wy- Tworząc własny moduł LAP można od-
i ograniczenia rozwiązań, które dotychczas konywanie przy ich użyciu operacji krypto- woływać się do szeregu serwisów udostęp-
obecne były na rynku, zapewniając oczy- graficznych. nianych przez środowisko Windows Mobi-
wiście najwyższy poziom bezpieczeństwa. le. W przypadku omawianego rozwiązania,
Świadczy o tym m.in. fakt, iż jedna z pol- Local Authentication Plugin najbardziej przydatną możliwością jest od-
skich służb mundurowych już od ponad ro- Wykorzystywane w opisywanym rozwiąza- woływanie się do tzw. CryptoAPI – war-
ku stosuje jedną z implementacji omawia- niu urządzenia PDA (takie jak np. Symbol stwy systemu Windows odpowiedzialnej za
nego rozwiązania do zapewnienia autory- MC70 czy Intermec CN3 (Rysunek 2) są wy- udostępnianie usług kryptograficznych. Do-
zacji dostępu do urządzenia przenośnego, a posażone w system operacyjny Windows Mo- stawcy bibliotek kryptograficznych rejestru-
następnie do zabezpieczania transmisji da- bile. Zabezpieczenie dostępu do urządzenia ją w CryptoAPI swoje biblioteki (tzw. CSP
nych i uwierzytelniania dostępu do krytycz- odbywa się przy wykorzystaniu komponentu – Cryptographic Service Provider), z których
nych danych operacyjnych. W dalszej części architektury systemu operacyjnego zwanego można korzystać w całym systemie opera-
artykułu skupimy się na omówieniu wybra- LASS (Local Authentication SubSystem). Jest cyjnym.
nych aspektów technologicznych tego wła- to moduł, który pozwala na zastosowanie za-
śnie rozwiązania. awansowanych mechanizmów i polityk uwie- Cryptographic Service Provider
rzytelniania użytkowników urządzenia wy- CSP jest analogicznym do istniejącego stan-
Ogólna architektura rozwiązania posażonego w mobilną wersję Windows. dardu PKCS#11 autorstwa korporacji RSA
Na Rysunku 1. przedstawiono ogólną archi- Zdefiniowanie takiego mechanizmu pole- standardem definiującym powszechnie uży-
tekturę wdrożonego rozwiązania. Przy uży- ga na instalacji modułu zwanego LAP (Local wane struktury i operacje kryptograficz-
ciu oprogramowania dostępnego na urzą- Authentication Plugin), który odpowiedzialny ne. Implementacja własnego CSP polega na
dzeniu mobilnym (np. systemowego mo- jest właśnie za proces uwierzytelniania użyt- utworzeniu modułu DLL z wyeksportowa-
dułu uwierzytelniania, przeglądarki inter- kowników. nymi funkcjami służącymi do rozpoczęcia

���������������
����������������������

������ �������������
����������������
�������������
���������

�������������������

��������������������������

��������������������
�����������

������
������������

����������������������������� ����������������
�����������������

Rysunek 2. Przykładowe urządzenie przenośne


Intermec CN3, wykorzystywane w opisywanym
wdrożeniu, wraz z oprogramowaniem do kontroli
Rysunek 1. Schemat architektury opisywanego w artykule rozwiązania dostępu do urządzenia – Mobile Experts meGINA

www.sdjournal.org 41
Programowanie urządzeń mobilnych

i zakończenia pracy z modułem, generowa- Aplety przygotowywane są w technolo- SIM i apletów Java Card. Po pierwsze, zapi-
nia, odczytywania i zapisywania kluczy kryp- gii Java Card, czyli w specjalnej wersji języ- sanie oraz odczytanie apletu na karcie SIM
tograficznych i certyfikatów, sporządzania ka Java, która dostarcza interfejsu do kryp- nie jest możliwe bez znajomości specjalnych
skrótów, podpisów i szyfrowania danych. Tak toprocesora oraz pamięci karty SIM. Inter- kluczy szyfrujących chroniących kartę (KiC
jak i w przypadku LAP, biblioteki CSP mu- fejs programistyczny tej technologii jest dość oraz KiD) – klucze te zna tylko operator sie-
szą być zweryfikowane i cyfrowo podpisane ograniczony – dla przykładu można wspo- ci, w której dana karta działa, i są one obję-
przez Microsoft. mnieć, że klasa String jest dostępna dopie- te jego bardzo restrykcyjną polityką bezpie-
Rysunek 3. przedstawia przykładowy kod ro w wersji 3.0 specyfikacji Java Card, a kar- czeństwa.
używający CSP (dla przejrzystości bez do- ty ją implementujące nie są jeszcze popular- Po drugie, sama konstrukcja apletu unie-
kładnego sprawdzania błędów). Jak widać, ne (na Rysunku 4. przedstawiliśmy przykła- możliwia odczytanie kluczy prywatnych wy-
odwołanie do konkretnego dostawcy usług dowy łańcuch znaków Hello World w wer- generowanych i zapisanych na karcie – nie ist-
kryptograficznych odbywa się w funkcji sji dla Java Card 2). Do dyspozycji programi- nieje więc ryzyko ich utraty. Oczywiście, za-
CryptAcquireContext poprzez podanie jego sty są przede wszystkim elementy pozwala- równo dostęp do karty SIM, jak i do wszyst-
nazwy symbolicznej. jące na zarządzanie kodami PIN, generowa- kich krytycznych operacji wykonywanych
Następnie wykorzystywana jest meto- nie kluczy symetrycznych (np. DES) oraz przez aplet (np. sporządzenie podpisu przy
da enumeracji tzw. kontenerów (funk- asymetrycznych (np. RSA) oraz szyfrowa- użyciu klucza prywatnego) są zabezpieczone
cja CryptGetProvParam z parametrem PP_ nie danych. kodami PIN.
ENUMCONTAINER). Pojedynczy kontener służy Komunikacja z apletem na karcie odbywa
w standardzie CSP do przechowywania pa- się poprzez tzw. pakiety APDU (Application Przyszłość to mobilePKI
ry kluczy oraz przypisanego do niej certy- Protocol Data Unit). Interfejs pozwalający na Przedstawione wyżej, wdrożone już rozwią-
fikatu. komunikację z kartą poprzez APDU jest do- zanie, wykorzystuje tylko część potencjału,
stępny zarówno dla czytników PC/SC pod- jaki niesie ze sobą integracja świata mobilne-
Kryptograficzne karty łączanych do stacjonarnych komputerów (są go z technologią PKI. Klucz prywatny prze-
SIM – programowanie w Java Card to znane większości z nas czytniki kart kryp- chowywany na karcie SIM może być wyko-
Najniższą warstwą opisywanego rozwią- tograficznych), jak i dla czytników kart zain- rzystany do szeregu innych czynności i stać
zania, która pozwala na korzystanie z me- stalowanych w urządzeniach mobilnych róż- się uniwersalnym środkiem dostarczającym
chanizmów PKI, jest kryptograficzna karta nego typu. niezawodnego mechanizmu bezpieczeń-
SIM. Na karcie rezyduje specjalny kompo- stwa w bardzo wielu zastosowaniach. Mo-
nent, zwany apletem, który umożliwia wy- Bezpieczeństwo rozwiązania bilny podpis elektroniczny mobilePKI stwa-
konywanie operacji personalizacyjnych karty Przy okazji dyskusji o kartach kryptograficz- rza możliwość integracji infrastruktury klu-
(np. generacji kluczy szyfrujących, eksportu/ nych nie można zapomnieć o dodatkowych cza publicznego z praktycznie dowolnym sys-
importu certyfikatów) oraz operacji krypto- elementach bezpieczeństwa, jakie wpro- temem lub aplikacją, a dodatkowo w znacz-
graficznych (np. podpisywanie czy szyfrowa- wadzane są do infrastruktury wdrożonego nym stopniu upraszcza korzystanie z mecha-
nie danych). systemu poprzez samo zastosowanie kart nizmów zapewniających najwyższy dostęp-
ny obecnie poziom bezpieczeństwa. Przy wy-
korzystaniu omawianej technologii, a zatem
O AUTORACH korzystając wyłącznie z telefonu, bez które-
Leszek Siwik, współzałożyciel i jeden z wiceprezesów MobileExperts sp. z o.o. oraz Krzysztof Lewan- go i tak nie ruszamy się z miejsca, można np.
dowski i Adam Woś – architekci i zarządzający m.in. projektem mobilnego PKI realizowanym w spół- podpisać dokument Microsoft Word czy wia-
ce. Wszyscy trzej specjalizują się w zagadnieniach szeroko pojętego oprogramowania mobilnego, a w domość email w programach pocztowych
szczególności tematyką wykorzystania urządzeń mobilnych w płatnościach, bankowości oraz do za- Outlook czy Thunderbird. Prostą operacją
pewnienia bezpieczeństwa informacji. na naszym telefonie można zastąpić też wpi-
sywanie jednorazowych haseł potwierdzają-
cych operacje bankowe czy ujednolicić proce-
durę dostępu do bezpiecznych zasobów fir-
mowych poprzez przeglądarkę internetową.
Wszystko to możliwe jest dzięki wykorzy-
staniu oprogramowania oraz bibliotek kryp-
tograficznych analogicznych do opisywanych
w tym artykule. Wierzymy, że zastosowanie
mobilnego podpisu elektronicznego sprawi,
że koncepcja PKI stanie wreszcie przed szan-
są szerokiego zastosowania.

Rysunek 4. Przykładowy łańcuch znaków Hello


World! zapisany w formacie narzuconym przez API
Rysunek 3. Przykład kodu pobierającego informacje o dostępnych w CSP kontenerach oraz kluczach i Java Card 2. Łańcuch jest zakodowany w UCS-2,
certyfikatach w nich zapisanych stąd występujące co drugi bajt zera

42 02/2009
Programowanie urządzeń mobilnych

Mobilny Magazyn
Łamigłówki architektoniczne

Autor przedstawia dylematy związane z doborem właściwej architektury


systemu komputerowego do obsługi magazynu. Zadaniem jest
przeniesienie wybranych procesów logistycznych na urządzenia mobilne
przy równoczesnej integracji z tradycyjnym systemem zarządzania
magazynem a szerzej z systemem klasy ERP.
niczenia, które wpływają na sposób rozwią-
Dowiesz się: Powinieneś wiedzieć: zania:
• Jakie trudności są związane z tworzeniem rozwią- • Posiadać znajomość podstaw technologii
zań wykorzystujących urządzenia mobilne oraz z .NET. • Urządzeniami mobilnymi używanymi w
integracją z istniejącym kodem (legacy code). magazynie są terminale firmy Motorola
• Jak zaprojektować elastyczną i skalowalną ar- pracujące pod kontrolą systemu operacyj-
chitekturę systemu komputerowego dla oma- nego Windows CE;
wianego zadania. • Komunikacja urządzeń ze światem ze-
wnętrznym odbywa się drogą radiową –
WiFi;
Założenia • System PS_2000 został napisany w C++
Wróćmy jednak do początków naszej przygody Builder i jedyną metodą integracji z jego
Poziom trudności z urządzeniami mobilnymi (potocznie przez modułami jest bezpośrednia wymiana ko-
nas zwanymi terminalami). Zadanie postawio- munikatów przez TCP/IP;
ne przed nami było złożone: • Urządzenia mobilne mają bardzo
ograniczoną wielkość pamięci trwa-

P
S_2000 to system zarządzania przed- • Urządzenie mobilne ma komunikować się łej (flash), w której są przechowywane
siębiorstwem. Przez lata obrastał no- w czasie rzeczywistym z systemem PS_ pliki. Programy po pełnym zimnym re-
wymi funkcjonalnościami, modyfika- 2000, tak aby każda zmiana na urządze- starcie są usuwane z pamięci urządze-
cjami, wariantami spowodowanymi potrzeba- niu miała bezpośrednie odzwierciedlenie nia.
mi różnych klientów. Wydawałoby się nic spe- w systemie i odwrotnie;
cjalnego – system jak wiele innych na rynku. • Praca w magazynie odbywa się w spo- Od początku nie mieliśmy wątpliwości, że to
Pewnego jednak poranka, trudno w tej chwi- sób ciągły (24h/dobę przez 7dni w tygo- rozwiązanie powinno powstać w technologii
li dociec w jaki sposób (potrzeba matką wyna- dniu), więc oprogramowanie musi być Microsoft .NET. Pragnęliśmy również stwo-
lazków?), zrodził się pomysł rozbudowy sys- niezawodne, a instalacja uaktualnień rzyć rozwiązanie modułowe, rozproszone, z
temu zarządzania magazynem w PS_2000 nie może dezorganizować pracy maga- łatwą możliwością skalowania.
o moduł obsługujący urządzenia mobilne. zynu;
Obecnie wszystkim nam wydaje się, że uży- • Każdy terminal musi być identyfikowal- Rozwiązanie
wanie urządzeń mobilnych w magazynie to ny, każdy użytkownik jest autentykowany Ostatecznie zaproponowaliśmy system, które-
oczywista oczywistość. Oprogramowanie na i autoryzowany w oprogramowaniu na ter- go architekturę można przedstawić za pomo-
urządzeniu mobilnym bezpośrednio komu- minalu; cą Rysunku 1.
nikujące się z systemem PS_2000 i wykorzy- • Wybrane oprogramowanie z dokładnością Na każdym urządzeniu mobilnym zostaje
stujące kody kreskowe porządkuje i znacząco do wersji ma działać na konkretnych urzą- początkowo zainstalowane oprogramowanie
upraszcza procesy magazynowe. Ponadto da- dzeniach mobilnych; Uploader, służące jedynie do instalacji pozo-
je możliwość pełnego nadzorowania ruchów • Rozwiązanie musi być skalowalne – po- stałych programów. Programy takie jak Ko-
magazynowych czy kompletacji tak, że towary czątkowo obsługiwało około 100 urzą- mora przyjęć, Przesunięcia Międzymagazy-
opuszczają magazyn zgodnie z zamówieniem dzeń, obecnie ponad 200, a kolejne maga- nowe, Stacja wydań itp. są programami wie-
(w uzgodnionym czasie, z towarem określonej zyny i oddziały czekają na wdrożenie; lowarstwowymi, których cienki klient pra-
serii i o właściwej dacie ważności). Rozmawia- • Musi istnieć możliwość monitorowania cujący na terminalu łączy się z serwerem
jąc obecnie z pracownikami magazynów Far- liczby zalogowanych użytkowników i ob- aplikacji. W poszczególnych modułach ła-
macol S.A. – bo o tej firmie właśnie tu mo- ciążenia systemu. dowanych przez serwer aplikacji została za-
wa, wielokrotnie spotykam się ze stwierdze- implementowana logika biznesowa progra-
niem, że nie wyobrażają sobie obecnie pracy Prócz trudnych wyzwań, które powyżej mów i warstwa dostępu do danych. Modu-
bez tych urządzeń. krótko opisałem, dochodzą również ogra- ły logiki biznesowej aplikacji często wywołu-

44 02/2009
Mobilny Magazyn

ją operacje z systemu ERP (tutaj PS_2000). adres serwisu Business Logic Interface. Roz- staniem .NET Remoting. Daje to oczywiście
Wywołanie tych operacji odbywa się z wy- wiązanie takie pozwala na znaczną konfigu- możliwość wdrożenia każdego z tych serwe-
korzystaniem serwera poleceń (command se- rację systemu i skalowalność. W zależności rów na oddzielnych maszynach.
rver). Serwer poleceń może być połączony z od potrzeb na tym samym komputerze lub fi- Wspomniałem na początku artykułu o wy-
wieloma instancjami modułu systemu ERP, zycznie innej maszynie, można zaimplemen- maganiu związanym z niezawodnością i wy-
dlatego jego głównym zadaniem jest kolejko- tować kolejny serwis Business Logic Interfa- dajnością rozwiązania. Szczególnie narażo-
wanie, balansowanie obciążenia i dystrybu- ce, gdy np. chcemy, aby nowa wersja progra- ne na potencjalne problemy wydawała nam
cja poleceń. mu działała jedynie na wybranych termina- się komunikacja z system ERP. Dlatego w ser-
Szczególne znaczenie ma XML Web Servi- lach. Skalowalność jest też zapewniona na werze poleceń został zaimplementowany sys-
ce: Dynamic URL. Aplikacja uruchamiając następnym poziomie. Mianowicie zarówno tem monitoringu (Rysunek 3). Monitorowa-
się na urządzeniu mobilnym woła Dynamic komunikacja między Business Logic Interfa- ne są czasy wykonania poszczególnych po-
URL. Na podstawie ID terminala i nazwy ce a serwerem aplikacji oraz serwerem aplika- leceń, liczby operacji oczekujących w kolej-
oraz wersji aplikacji Dynamic URL zwraca cji i serwerem poleceń odbywa się z wykorzy- kach, ale również istnieje możliwość zablo-
kowania wykonania konkretnego polecenia,
czy testowanie poleceń. W serwerze aplika-
cji kontrolowana jest ilość równocześnie pra-
cujących użytkowników z daną aplikacją (Ry-
sunek 2). Dane związane z działaniem apli-
����������� kacji, dla każdego użytkownika są przecho-
����
�������� wywane w obiektach sesji serwera aplikacji.
������������� ����� ����
��������� Web serwis Busines Logic Interface pozosta-
��������
������
������������ je bezstanowy i jest tylko prostą warstwą po-
����������� ����������� �������
���� ������ średniczącą – fasadą serwera aplikacji. Jak w
����
����������������
�������
���
każdym rozwiązaniu opartym o sesje użyt-
������� kownika czasem istnieje potrzeba przecho-
wywania informacji wspólnych dla wielu
������������������������������������
sesji. Powstał w tym celu oddzielny moduł
������� (nie umieszczony na diagramie). Niezależ-
������
ny moduł był niezbędny aby zapewnić wy-
mianę informacji między sesjami pochodzą-
��������������� ���������� cymi z potencjalnie wielu serwerów aplika-
������ cji. Moduł ten został zrealizowany jako ser-
���
��������
���
������ wis Windows.
�������������������� W artykule przedstawiłem architekturę
������������ ���������������� wdrożonego systemu zarządzania magazynem
z wykorzystaniem urządzeń mobilnych. Roz-
wiązanie jest nowoczesne, zapewnia skalowal-
ność i możliwość dowolnej konfiguracji modu-
łów. W końcu, co najważniejsze, spełnia oczeki-
Rysunek 1. Architektura rozwiązania wania klienta.

RAFAŁ DEJA
Autor jest doktorem nauk technicznych z zakre-
su informatyki. Specjalizuje się w projektowaniu
rozwiązań webowych opartych na technologiach
.NET. Jest Architektem Rozwiązań w Polsoft Engine-
ering Sp. z o.o. oraz wykładowcą na Wyższej Szko-
le Biznesu.
Kontakt z autorem: rdeja@polsoft.pl.

Rysunek 3. System monitoringu dla serwera


Rysunek 2. System monitoringu dla serwera aplikacji poleceń

www.sdjournal.org 45
Programowanie urządzeń mobilnych

MOTOROLA and the Stylized M Logo are registered in the US Patent & Trademark Office. All other product or service names are the property of
their respective owners. © Motorola, Inc. 2008

Jak to się robi w Krakowie


Dla każdego, kto nie miał do czynienia z programowaniem urządzeń
mobilnych, specyfika tego zajęcia sprowadza się do kilku znanych haseł, jak
real-time, środowisko embedded itp. Wszystko to prawda, jednak wiele z
tych haseł straciło ważność, inne zyskały na znaczeniu, a w dodatku pojawiły
sie nowe, nigdy niebrane pod uwagę w kontekście systemów embedded.
Urządzenia te muszą zapewnić pełną funk-
Dowiesz się: cjonalność nawet (czy też – zwłaszcza) w sy-
• Jakie są charakterystyczne cechy programo- tuacjach kryzysowych, ale też gwarantować
wania urządzeń mobilnych; poufność i integralność transmisji. Cele te
• Jak przekładają się one na codzienną pracę na realizowane są z jednej strony poprzez speł-
przykładzie radiotelefonów systemu TETRA. nianie rygorystycznych standardów dotyczą-
cych sprzętu, a z drugiej przez implementa-
cję różnorodnych typów szyfrowania danych
mobilnych mogłaby przyprawić o zawrót gło- i autentykacji terminali, jak również sieci, w
wy, jednak nowe urządzenia coraz częściej której radia się rejestrują.
Poziom trudności korzystają z tych wiodących na rynku. Nieco mniej oczywistym elementem two-
Na tym tle krakowskie centrum Motoro- rzenia oprogramowania dla tego typu urzą-
li cechuje się pewną specyfiką, związaną z dzeń jest złożoność i różnorodność same-
obszarem prowadzonej działalności. Wbrew go standardu TETRA, do której należy do-

D
zisiejsze urządzenia mobilne obej- obiegowym skojarzeniom, nie znajdziemy w dać specyficzne dla poszczególnych produ-
mują tak wiele różnych zagadnień nim zespołów odpowiedzialnych za rozwój centów rozszerzenia nie objęte standardem.
programistycznych, że praktycznie oprogramowania dla telefonów komórko- Na bazie dwóch typów komunikacji: Trun-
każdy znajdzie tu coś dla siebie. Programi- wych, gdyż polski oddział tej firmy skoncen- ked Mode (TMO – z infrastrukturą) i Direct
sta rozproszonych systemów bazodanowych trowany jest na tworzeniu rozmaitych ele- Mode (DMO – bezpośrednia komunikacja
nie zrealizuje może swojego największego mentów systemów łączności radiowej prze- między radiotelefonami) może funkcjono-
projektu, ale z pewnością spędzi trochę cza- znaczonych (głównie, choć nie wyłącznie) wać szeroka gama serwisów opartych zarów-
su, próbując zintegrować silnik swojej bazy dla służb bezpieczeństwa publicznego. Inte- no o transmisję głosu jak i danych. Mieszczą
z konkretną platformą systemową. Właśnie resujący nas obszar urządzeń mobilnych re- się w tym zarówno głosowe połączenia jeden-
te szerokie możliwości są charakterystycz- prezentuje w niej ponad stuosobowa grupa do-wielu, pełnodupleksowe rozmowy jeden-
ne dla współczesnych urządzeń mobilnych. architektów, programistów i testerów, posia- do-jednego (obsługujące rozbudowany sys-
Z jednej strony potrafią zaoferować bardzo dająca niemal całkowitą odpowiedzialność tem priorytetyzacji), transmisja wiadomo-
rozbudowany, graficzny interfejs użytkowni- za proces tworzenia oprogramowania dla ra- ści tekstowych, danych pakietowych, pozy-
ka, czekający tylko na coraz to nowe aplika- diotelefonów systemu TETRA. cjonowanie GPS i wiele innych. Zakres stwa-
cje, z drugiej zaś realizują skomplikowaną lo- TErrestrial Trunked RAdio, bo tak wła- rzanych przez standard możliwości sprawia,
gikę łączności bezprzewodowej. śnie rozwija się ten skrót, jest otwartym że żaden z dostawców terminali TETRA nie
Proces tworzenia aplikacji użytkownika na standardem cyfrowej komunikacji radiowej dysponuje jego pełną implementacją. Z ko-
taki system praktycznie nie różni się od tego opracowanym i rozwijanym w ramach prac lei różnorodny profil klientów (od wojska po
znanego z komputerów PC. Trzeba dokład- European Telecommunications Standardi- komunikację publiczną) generuje zapotrze-
nie poznać możliwości konkretnego systemu sation Institute (ETSI). Sieci telekomunika- bowanie na wprowadzanie kolejnych funk-
operacyjnego, ustalić wymagania – i można cyjne tego typu są tworzone – z wykorzysta- cjonalności i rozwiązań sprzętowych.
zaczynać pisanie nowej gry, kalendarza, edy- niem infrastruktury i terminali różnych pro- Profil zmian implementowanych w kra-
tora czy przeglądarki obrazów. Istnieje kilka ducentów – w Europie, Azji czy na Bliskim kowskim centrum odzwierciedla tę różno-
środowisk developerskich wspomagających Wschodzie. Największy system tego typu to rodność: sięga on od wymiany kluczy dla al-
tworzenie takich aplikacji (jak choćby WIN- Airwave, pokrywający swoim zasięgiem te- gorytmów szyfrowania poprzez interfejs ra-
DEV Mobile czy NetBeans Mobile) a same rytorium Wielkiej Brytanii i używany tam diowy po stworzenie protokołu komunika-
systemy operacyjne dostarczają szeregu nie- m.in. przez policję i straż pożarną. cyjnego pomiędzy radiotelefonem samo-
zbędnych bibliotek, ukrywając sporą część Jak łatwo się domyślić, kluczowymi aspek- chodowym a nowym typem głowicy kontro-
implementacji. Naturalnie liczba systemów tami działania radiotelefonów systemu TE- lnej; od funkcjonalności bezpośrednio zwią-
operacyjnych używanych w urządzeniach TRA są niezawodność i bezpieczeństwo. zanych z warstwą aplikacji, jak obsługa no-

46 02/2009
Jak to się robi w Krakowie

wych zestawów czcionek, po czysto sprzęto- nym elementem kolejnych releasów i swo- wiele urządzeń posiada szereg interfejsów ze-
we – np. komunikację z nowymi typami ak- istym polem do popisu dla programistów, wnętrznych czy wspiera standard JTAG (co jest
cesoriów; od wprowadzenia obsługi wiado- bez względu na to, czy ich obszarem działa- też udziałem motorolowych terminali TETRy).
mości tekstowych w trybie DMO po mody- nia jest MMI czy DSP. Każdy jednak rodzaj debugowania zmienia wa-
fikacje dostosowujące oprogramowanie do Odpowiadając na pytanie, czy aplikacje pi- runki pracy systemu, co znacznie utrudnia ba-
działania na terminalu spełniającym stan- sane na urządzenia mobilne należą właśnie danie problemów zależności czasowych. Może
dard ATEX (dopuszczony do działania w do tych najwyższych lotów można zadać ko- się na przykład okazać, że bardzo dobrze znana
strefie zagrożonej wybuchem). Często nad lejne: "Czy sądzicie, że w sprawie prędkości i przetestowana logika nie zadziała poprawnie
jednym feature’em pracują zarówno progra- działania np. waszego telefonu komórkowe- po wymianie układu pamięci na szybszy i więk-
miści zajmujący się cyfrowym przetwarza- go nic więcej nie trzeba już robić?" Prędkość szy. Zapewnienie obsługi zdarzeń w zdefinio-
niem sygnałów, specjaliści od sprzętu, osoby działania całego systemu to jest właśnie jed- wanym i skończonym czasie zmusza niejedno-
dobrze znające standard i programiści war- na z tych rzeczy, których nie można lekcewa- krotnie do stosowania najróżniejszych rozwią-
stwy aplikacyjnej. Ale bez względu na to, czy żyć podczas tworzenia oprogramowania. I zań, niestety również wbrew dobremu stylowi
zmiana dotyczy sprzętu czy interfejsu użyt- chociaż istnieją możliwości zmiany taktowa- i podstawom praktyk programistycznych. Wy-
kownika, specyfika programowania syste- nia procesorów, wprowadzania coraz to szyb- woływanie metod innego taska w sposób jaw-
mów wbudowanych dotyka tej pracy niemal szych jednostek obliczeniowych w kolejnych ny, kłóci się przecież z tak piękną ideą syste-
zawsze – choć na różne sposoby. wersjach sprzętowych – to zabiegi te są dość mu message driven, ale jeśli jest jedynym moż-
Na poziomie tworzenia warstwy aplika- mocno ograniczone przez jeden bardzo waż- liwym rozwiązaniem, to nie pozostawia inne-
cji wiedza z zakresu systemów czasu rze- ny element, który znacząco odróżnia urzą- go wyboru. Każdy przypadek trzeba rozważyć
czywistego nie jest szczególnie istotna, MI- dzenia mobilne od pozostałych urządzeń indywidualnie, znalezienie balansu pomiędzy
DLet nie musi z reguły uruchamiać się w ści- embedded. O tym jednak, za chwilę. skutecznością a dobrym stylem nie jest wca-
śle określonym czasie. Należy jednak uświa- Każde urządzenie mobilne musi się jakoś le takie łatwe. Bardzo często powyższe ograni-
domić sobie jedną zasadniczą różnicę pomię- komunikować ze światem zewnętrznym, czy czenia nie pozwalają zaimplementować funk-
dzy urządzeniem mobilnym a komputerem to poprzez łącze szeregowe, bluetooth, Wi- cjonalności tak, jak byśmy sobie tego życzyli,
osobistym. Jeśli w tym drugim zabraknie pa- Fi, czy w końcu siecią komórkową. Logikę tak jak nam podpowiada nasz instynkt progra-
mięci na daną aplikację, to najzwyczajniej w niektórych protokołów można kupić od ze- mistyczny. Jesteśmy spragnieni kodu, z którego
świecie powiększamy przestrzeń dyskową. wnętrznego dostawcy. W przypadku radio- bylibyśmy dumni, który nie wymaga poprawek,
Jeśli aplikacja będzie działała zbyt wolno, to telefonów Motoroli można tu wskazać WAP refaktoringu, i którym można by pochwalić się
znaczy, że już czas na nowy procesor bądź pa- realizowany jako zewnętrzna biblioteka. Z innym, równie spragnionym programistom
mięć RAM. Przycinający się obraz w trakcie kolei TETRA PDA, nowa, zorientowana na (udało się komuś napisać taki kod?). Wzno-
filmu lub gry - nowa karta graficzna. Takich transmisję danych platforma sprzętowa, w simy się na wyżyny naszych możliwości, aby
możliwości rozbudowy 'on-demand' urzą- warstwie aplikacyjnej w całości opiera się na chwilę później skonfrontować pierwotne plany
dzenie mobilne jest praktycznie pozbawio- produktach innych dostawców. z rzeczywistością i uznać wyższość ograniczeń
ne (podobnie jak większość urządzeń em- Co jednak, jeśli żaden producent nie oferu- sprzętowych. I ten kompromis pomiędzy wie-
bedded). Nie oznacza to jednak, że końcowa je kompletnych rozwiązań w interesującym nas dzą, chęcią i możliwościami jest również nieod-
aplikacja uruchamiana w telefonie komórko- obszarze? Na tym etapie wiedza z zakresu sys- łączną częścią programowania – a w szczegól-
wym będzie ograniczona funkcjonalnie z po- temów czasu rzeczywistego bardzo sie przyda. ności rozwijania – urządzeń mobilnych.
wodu jednego z powyższych ograniczeń. Nic To właśnie na tutaj najczęściej można stanąć Dla programistów z lekkim zacięciem elek-
z tych rzeczy – musi ona oferować pełny za- oko w oko z zagadnieniami teorii współbieżno- tronicznym idealnym wręcz obszarem wyda-
kres usług w konkretnych warunkach. ści, takimi jak zagłodzenie, deadlock, priority je się być warstwa obsługująca sprzęt. Pisanie
Przy braku pamięci na stosie, nie można inheritance. Rozwiązywanie zaawansowanych sterowników nie jest zadaniem trywialnym za-
powiększać go w nieskończoność. Być mo- problemów w tym obszarze potrafi dać wie- równo w systemach embedded, jak i kompu-
że należy przeorganizować stos oraz umie- le przyjemności, jak również przysporzyć wie- terach osobistych. Znajomość potencjałów po-
ścić potrzebne dane w innym miejscu. Jeśli lu zmartwień. Debugowanie kodu na tym eta- szczególnych układów i zależności pomiędzy
aplikacja zbyt wolno działa, to niewykluczo- pie nie jest jeszcze niesamowitym wyczynem, nimi pozwala wycisnąć z nich maksimum ich
ne, że wykonuje wiele niepotrzebnych ope-
racji (jak np. sortowanie posortowanej już
tablicy, czy odświeżanie ciągle aktualnego
ekranu). Każdy krok, każda operacja powin-
ny być dokładnie przeanalizowane, aby za-
pewnić jak najefektywniejsze wykorzysta-
nie dostępnych zasobów oraz by nie obciążać
nadmiernie całego systemu. Ten rodzaj ana-
lizy nie jest szczególnie trudny podczas two-
rzenia kodu, ale niezwykle czasochłonny na
późniejszym etapie. A ponieważ obok wpro-
wadzania nowych platform Motorola utrzy-
muje i rozwija oprogramowanie dla star-
szych modeli radiotelefonów (co oczywiste,
klienci są o wiele bardziej skłonni do zaku-
pu software'u z nowymi funkcjonalnościami
niż wymiany dużej – niekiedy idącej w tysią-
ce – liczby terminali), również ciągła opty-
malizacja istniejącego kodu pozostaje istot- Rysunek 1. Różne rodzaje radiotelefonów TETRA

www.sdjournal.org 47
Programowanie urządzeń mobilnych

możliwości. W procesie projektowania nowe- wielu wersji będzie kosztować mniej im wię- tym, że są służbami). Warto też wspomnieć
go układu samodzielnie trzeba zaproponować cej będzie wspólnego kodu. Tutaj również tutaj o kolejnym aspekcie pracy programi-
sprzęt spełniający wymagania przed układem może ujawnić się nowe wymaganie: jeśli ko- stycznej w środowisku wieloplatformowym:
stawiane. Także krakowski zespół – mimo że lejna platforma będzie oparta na procesorze kluczowym i nietrywialnym zagadnieniem
jego profil jest czysto software'owy – jest czę- o odwrotnym endiannessie, to kod niezależ- staje się w takiej sytuacji configuration ma-
ścią procesu decyzyjnego przy opracowywa- ny od endiannessu będzie nieoceniony. Jeże- nagement. Od tego, na ile przemyślany jest
niu rozwiązań sprzętowych dla nowych plat- li chodzi o terminale Motoroli, to obecnie system wersjonowania i procedura integra-
form i modyfikacji platform istniejących. rozwijanych jest siedem platform sprzęto- cji pracy kilkudziesięciu programistów, od
Kolejnym elementem, na który warto wych, startują prace nad kilkoma kolejnymi, wydajności systemu budowania software'u
zwrócić uwagę jest właśnie wieloplatformo- a trzy starsze modele jeszcze nie zakończy- – zależy produktywność całego zespołu.
wość. Jeśli firma dobrze się rozwija, to prę- ły swojego żywota. Całkowicie lub w dużej Mimo iż podzespoły elektroniczne stają
dzej czy później wprowadzi na rynek kolej- części powstawały w Krakowie: wspomniana się coraz szybsze i tańsze wielu producen-
ne wersje swojego produktu, być może de- nowa głowica kontrolna i radiotelefon ATEX tów urządzeń mobilnych nie wymienia ich
dykowane potrzebom konkretnego klienta. oraz model Covert (jak sama nazwa wskazu- przy pierwszej nadarzającej się okazji. Jeśli
Oczywiście naturalnym staje się maksymal- je, jest on przeznaczony dla służb nieprzepa- projektujemy całkowicie nową platformę,
ny re-use istniejącego kodu. Utrzymywanie dających za ostentacyjnym afiszowaniem się która ma zastąpić dotychczas istniejącą, to
możliwości wydają się być niemal nieogra-
niczone. Co stoi na przeszkodzie? Tutaj do-
chodzimy do sedna naszych rozważań. Obok
oczywistych ograniczeń związanych z kosz-
tami, bardzo poważnym ograniczeniem jest
bateria. To ona decyduje o mobilności każ-
dego urządzenia. Nie ma znaczenia, jak wy-
rafinowane funkcje będzie pełnił system i jak
szybko poradzi sobie z najtrudniejszymi za-
daniami, jeśli wszystko to odbędzie się kosz-
tem zwiększonej eksploatacji baterii, czyli w
rzeczywistości utraty części mobilności.
Kupilibyście telefon o powiększonych
możliwościach, który trzeba by ładować w
połowie dnia? Jeśli nie byłoby alternatywy,
to oczywiście tak, ale w większości przypad-
ków jest to bardzo ważny parametr. Urządze-
nia mobilne to nie tylko telefony komórkowe
(te akurat charakteryzują się całkiem dobry-
mi parametrami czasów pracy i czuwania).
To również urządzenia telemetryczne, game-
boys, audio/video recorders i inne. Gdy już
raz określimy wymagania co do czasu pracy
systemu i przyzwyczaimy końcowego użyt-
kownika, późniejsza degradacja tego para-
metru kosztem zwiększenia możliwości jest
bardzo często niemożliwa. Zaczyna się wte-
dy rozwiązywanie ograniczeń sprzętowych
w oprogramowaniu i jest to ten aspekt pracy
z systemami mobilnymi, który będzie towa-
rzyszyć ich twórcom do samego końca.

KAMIL KOWALSKI
Wykształcenie w dziedzinie telekomunikacji, zwią-
zany z programowaniem radiotelefonów Motoroli
od prawie 5 lat. Odpowiedzialny za rozwijanie pro-
tokołu komunikacji z infrastrukturą.
Kontakt z autorem: kamil.kowalski@motorola.com

ARTUR CHRUŚCIEL
Z wykształcenia informatyk, w Motoroli pracuje
od 2005 roku. Od początku w zespole tworzącym
oprogramowanie dla radiotelefonów systemu TE-
TRA. Zajmuje się głównie warstwami związanymi z
protokołem komunikacji po interfejsie radiowym w
trybie DMO (bez infrastruktury).
Rysunek 2. Radio systemu TETRA, model MTP850 Kontakt z autorem: artur.chrusciel@motorola.com

48 02/2009
Programowanie urządzeń mobilnych

Wąż w komórce
Telefony komórkowe obecnie to nie tylko proste urządzenia do
wykonywania połączeń głosowych czy korzystania z wiadomości
tekstowych i multimedialnych. To zaawansowane mikrokomputery,
pełniące często role elektronicznych terminarzy (PDA), wyposażone
nierzadko we własny system operacyjny.
Python dla platformy S60 umożliwia tworzenie
Dowiesz się: Powinieneś wiedzieć: aplikacji dla telefonów Nokia Series 60 w postaci
• O podstawach systemu operacyjnego Sym- • Jak połaczyć telefon z komputerem za pomo- skryptów Pythona o wysokim poziomie integra-
bian; cą połączenia kablowego lub Bluetooth; cji z funkcjami Symbian OS. Tworzone aplikacje
• Jak rozpocząć tworzenie aplikacji dla telefo- • Jak instalowac i uruchamiac aplikacje w telefo- mają taki sam wygląd jak te wykonane przy uży-
nów komórkowych przy użyciu języka Python. nie z Symbianem. ciu C++ SDK. Niewątpliwym plusem takiego roz-
wiązania jest szybkość tworzenia oprogramowania
i łatwość testowania. Obecna wersja pyS60 opar-
uwagi na dość zawiłe budowanie szkieletu aplika- ta jest na wersji 2.2.2 Pythona i wspiera takie ele-
cji, tworzenie GUI, przymus zadbania o przydzie- menty platformy Symbian jak: dostęp do natyw-
Poziom trudności lanie i zwalnianie zasobów czy wreszcie sam pro- nego GUI, łącza Bluetooth, kamery, książki adre-
ces budowania aplikacji. sowej, skrzynki SMS, sieci danych, modułu tele-
Inżynierowie z Nokii postanowili więc upro- fonicznego, lokalizacji z wykorzystaniem nadaj-
ścić nieco proces tworzenia aplikacji dla Symbian ników BTS itp.

J
ednych z systemów operacyjnych stoso- OS. Tak więc w 2004 roku powstał projekt o na-
wanych w telefonach komórkowych jest zwie kodowej Amaretto, który miał na celu uczy- Kilka słów o Pythonie
Symbian. System ten został stworzony w nić programowanie aplikacji dla Symbiana szyb- Python jest obiektowo zorientowanym języ-
oparciu o środowisko EPOC, wykorzystywane szym i łatwiejszym, a uzyskane w ten sposób apli- kiem interpretowanym powstałym w 1991 (je-
w PDA firmy Psion PLC. W skład konsorcjum kacje miały były w pełni funkcjonalne i mogłyby go twórca Guido van Rossum pracuje obecnie
o takiej samej nazwie, wchodzą takie firmy jak korzystać z większości modułów systemu opera- dla Google), używany jest najczęściej do tworze-
Samsung, Motorola, Siemens, Sony Ericsson cyjnego. W październiku tego samego roku uka- nia serwisów internetowych, jak i do tworzenia
i Nokia. I właśnie ta ostatnia firma jest głów- zał się port języka Python przeznaczony do uru- narzędzi do administrowania systemami opera-
nym popularyzatorem telefonów z systemem chamiania skryptów działających w telefonach cyjnymi. Dostępne są wersje interpretera języ-
Symbian, modeli ze średniej i górnej półki, któ- Nokia Series 60 a projekt zmienił nazwę na Python ka dla wielu systemów operacyjnych (Windows,
rych użytkownikami są w dużej mierze klien- for S60 (pyS60). Unix, MacOS). Składnia Pythona jest dość ory-
ci biznesowi.
Symbian (najnowsza stabilna wersja to 9.5)
daje programiście zbiór bibliotek i funkcji, które
umożliwiają pełny dostęp do systemu operacyj-
nego (włączając w to funkcje niskopoziomowe),
peryferiów telefonu i interfejsu użytkownika. W
przypadku telefonów Nokia istnieje dodatkowo
podział na tzw. serie w zależności do rodzaju in-
terfejsu użytkownika. Obecnie wyróżnia się te-
lefony: Series 60, Series 80 i Series 90. W porów-
naniu do innych mobilnych systemów operacyj-
nych Symbian umożliwia programiście na naj-
większe możliwości i kontrolę funkcji telefonu.
Nokia udostępnia programistom zestaw na-
rzędzi (SDK i emulator) do tworzenia aplikacji
dla Symbian OS w języku C++. Mimo że sam ję-
zyk jest znany dość dużej liczbie developerów, to
umiejętność programowania dla platformy Sym-
bian OS jest obarczona wysoką barierą wejścia z Rysunek 1. Architektura Symbian OS

50 02/2009
Wąż w komórce

ginalna: zakres pętli czy instrukcji warunkowej jemy dla obydwu archiwów Symbian, przy czym na ikona Pythona. To znak, że środowisko testo-
jest wyznaczony za pomocą wcięć, jednak dzięki jako pierwszy należy instalować plik zgodny z ma- we dla naszych skryptów zostało poprawnie przy-
temu programy są przejrzyste i czytelne. Python ską PythonForS60_1_4_4*.sis. gotowane.
posiada dynamiczny system typów danych oraz Po zakończonym procesie instalacji w menu Kliknięcie tej ikonki powinno spowodować
automatyczny system zarządzania pamięcią. Osobiste telefonu powinna pojawić się dobrze zna- uruchomienie shella interpretera Python.
Python oferuje zestaw kolekcji takich jak: listy,
krotki i słowniki, funkcje rzutowania typów da-
nych (sprawdzane w umiarkowanym stopniu), a
także funkcje operujące na łańcuchach znaków.
Programujący wcześniej w takich językach jak
Perl z pewnością szybko odnajdą się w Pythonie.
Ponieważ istotą artykułu nie jest nauka Pythona,
pomocne adresy internetowe zostały umieszczo-
ne w ramce W sieci.

Zestaw startowy
Aby rozpocząć zabawę (i nie tylko) w programo-
wanie dla Symbian OS z wykorzystaniem Pytho-
na potrzebne będą następujące elementy:

• Telefon Nokia Series 60 drugiej lub trze-


ciej edycji (lista telefonów na http://
www.forum.nokia.com/devices/matrix_all_
1.html).
• Komputer z jednym z systemów z grupy
Windows, Unix, MacOS. Rysunek 2. Instalacja aplikacji przy pomocy Nokia Application Installer
• Kabel połączeniowy USB do telefonu lub in-
terfejs Bluetooth w komputerze (do transfe-
ru skryptów).

Z sekcji Download strony WWW projektu


pyS60 (http://sourceforge.net/projects/pys60) należy
pobrać dwa pliki z rozszerzeniem SIS (archiwum
Symbian) – PythonForS60_1_4_4_3rdEd.sis i Py-
thonScriptShell_1_4_4_3ndEd.SIS lub Python-
ForS60_1_4_4_2ndEd.SIS i PythonScriptShell_
1_4_4_2ndEd.SIS (w zależności od typu posia-
danego telefonu).
Aby ułatwić sobie pisanie skryptów Pythona,
warto zainstalować edytor ConTEXT, PythonWin
czy EditPlus choć nic nie stoi na przeszkodzie, aby
korzystać z poczciwego Notatnika czy pobrać in-
terpreter Pythona ze strony http://www.python.org
i korzystać z jego IDE. Programiści korzystający z
Eclipse’a mogą pobrać plugin PyDev.
Przygotowane skrypty czy też pobrane pliki SIS
muszą zostać załadowane do telefonu, z pomocą
przyjdzie tu Nokia PC Suite (http://www.nokia.pl/ Rysunek 3. Ikona interpretera Python w telefonie Rysunek 4. Konsola interpretera
A4745165) – darmowe oprogramowanie umożli-
wiające m.in. instalację oprogramowania za pomo-
cą kabla USB czy Bluetooth.
Prace przygotowawcze zaczynamy od instalacji
interpretera i konsoli Pythona w telefonie. W tym
celu uruchamiamy Nokia PC Suite i łączymy się
z telefonem za pomocą jednego ze wcześniej wy-
mienionych sposobów. Po szczegóły związane z
połączeniem via USB czy Bluetooth odsyłam do
instrukcji obsługi konkretnego telefonu. Klika-
my ikonę Instaluj aplikacje. Wskazujemy w lewym
oknie dyskową lokalizację wcześniej pobranych
plików SIS, klikamy przycisk oznaczony strzałką i
postępujemy zgodnie z instrukcjami dotyczącymi
przebiegu instalacji pojawiającymi się na ekranie
monitora oraz telefonu. Powyższy proces wykonu- Rysunek 5. Skrypty Pythona w katalogu na karcie pamięci telefonu

www.sdjournal.org 51
Programowanie urządzeń mobilnych

Na koniec konfiguracji środowiska testowego jako drugi parametr przyjmuje typ wprowadza- Python Pizza
należy zadbać, aby na karcie pamięci lub w pa- nej wartości. Obok text dostępne są: number, da- W celu szerszego zapoznania się z możliwo-
mięci telefonu znajdował się katalog o nazwie te, time, query, code; z kolei drugi parametr funk- ściami i modułami Pythona dla Symbian OS,
Python, w takiej lokalizacji interpreter będzie cji note() przyjmować może również wartości przygotujemy przykładową, w pełni funkcjo-
poszukiwał skryptów do wykonania. Katalog error lub conf. Dobrym źródłem wiedzy na te- nalną aplikację umożliwiającą zamawianie piz-
taki możemy utworzyć za pomocą menedżera mat funkcji i ich parametrów jest tekst PyS60 zy przez telefon – tym razem bez użycia głosu.
plików wywoływanego z menu głównego apli- API and Python reference dostępny na stronach Działanie aplikacji polegać będzie na prezenta-
kacji Nokia PC Suite. Również za pomocą tego projektu pyS60. cji użytkownikowi formularza złożonego z róż-
modułu możemy dokonywać niezbędnych ope-
racji na plikach, takich jak kopiowanie plików Listing 1. Najprostsza aplikacja
między dyskami a telefonem.
import appuifw
Hello world! data = appuifw.query(u"Type your name:", "text")
Naszą przygodę z pyS60 rozpoczniemy od nie- appuifw.note(u"Hello world from " + str(data), "info")
śmiertelnego programu typu Hello word. Krót-
ki, kilkuwierszowy skrypt będzie pobierał tekst Listing 2. Tworzenie menu aplikacji
z okna dialogowego, a następnie wyświetlał go w import appuifw
koniunkcji ze słynną sentencją. Otwieramy więc import e32
ulubiony edytor programistyczny i wpisujemy 3
linijki (Listing 1.). def exit_key_handler():
Zapisujemy na dysku pod nazwą hellowold.py, app_lock.signal()
a następnie kopiujemy do telefonu do katalogu o
nazwie Python. Uruchamiamy interpreter w te- # funkcje obsługujące zdarzenia menu
lefonie, z menu Opcje wybieramy pozycję Run def menu1():
script, a następnie z listy skryptów zapisany wcze- appuifw.note(u"Menu 1", "info")
śniej plik hellowold.py. Wynik działania aplikacji
jest widoczny na rysunkach 6. i 7. def menu2a():
Pora na omówienie kodu. Pierwszą linią ko- appuifw.note(u"Menu 2 - opcja A", "info")
du importujemy do skryptu bibliotekę odpo-
wiedzialną za dostęp do elementów UI. W ko- def menu2b():
lejnym wierszu wywołujemy funkcję query() appuifw.note(u"Menu 2 - opcja B", "info")
realizującą wyświetlenie pola tekstowego z
możliwością edycji. Jako parametr funkcji po- # utwórz menu apikacji
dana jest treść komunikatu wyświetlanego nad appuifw.app.menu = [(u"Menu 1", menu1),
editboxem. Wynik działania funkcji zwracany (u"Menu 2", ((u"Opcja A", menu2a),
jest do zmiennej data, która przechowuje wpro- (u"Opcja B", menu2b)))]
wadzony łańcuch znaków. Ostania linia skryp-
tu to wywołanie funkcji wyświetlającej okno appuifw.app.exit_key_handler = exit_key_handler
informacyjne z podanym tekstem. Ponieważ w app_lock = e32.Ao_lock()
Symbianie kodowanie znaków odbywa się z wy- app_lock.wait()
korzystaniem Unikodu, przed literałami należy
podać literkę u w celu właściwego rzutowania Listing 3. Szkielet pętli głównej aplikacji
tekstu. Użyta w przykładzie funkcja query() running = 1
while running:
##odśwież ekran
refresh_screen()
##sprawdz stan klawiszy

check_keys()
##odczekaj chwilę
e32.ao_sleep(0.5)

Listing 4. Szkielet pętli głównej aplikacji


# utworzenie tzw. Active Object typu Ao_lock
app_lock = e32.Ao_lock()

# przypisanie obsługi zamknięcia aplikacji


appuifw.app.exit_key_handler = exit_key_handler

# aplikacja oczekuje na zdarzenia od UI


# do momentu wywołania app_lock.signal()
# kiedy to powoduje zakończenie działania aplikacji
app_lock.wait()
Rysunek 6. Okno wprowadzania danych

52 02/2009
Wąż w komórce

nego rodzaju pól, z którego dane po zapisaniu


będą odpowiednio formatowane i wysyłanie w
formie SMS-a do pizerii.
Na samym początku kodu deklarujemy za po-
mocą dyrektywy import, jakich będziemy uży-
wać modułów, możemy również określić wy-
brane funkcje modułów poprzez składnie from
nazwa_modułu import nazwa_funkcji1, na-
zwa_funkcji2. W opisywanym przykładzie nie-
zbędne będą funkcje operujące na UI telefo-
nu (appiufw), umożliwiające wysyłanie wiado-
mości SMS (messaging), a także konwertujące
czas na tekst (localtime, strftime). A ponie-
waż Python umożliwia programowanie obiek-
towe, utworzymy klasę PizzaFormView, w której
umieścimy metody wykorzystywane przez apli-
kację. Oczywiście kod zawierać będzie również
sekcję startową inicjalizującą całą aplikację. W
konstruktorze klasy inicjalizowana jest zmien-
na _iIsSaved informująca czy użytkownik za-
pisał zmiany w formularzu. Następnie wystę- Rysunek 7. Monit informacyjny Rysunek 10. Treść wysyłanego przez aplikację SMS-a
puje deklaracja list przechowujących rodzaje ty-
pów pizzy oraz dodatków do nich. Kierując się
dobrze rozumianą ergonomią, będziemy wyma-
gali od użytkownika wyboru wyżej wymienio-
nych wartości tylko z predefiniowanej listy. Na
końcu konstruktora definiowana jest również li-
sta definiująca pola formularza, tym razem skła-
dającą się z tzw. krotek. W odróżnieniu od typo-
wej listy, krotki (ang. tuple) nie mogą być mody-
fikowane w trakcie działania aplikacji.
Metoda setActive() odpowiada już za utwo-
rzenie właściwego formularza z wykorzystaniem
funkcji appuifw.Form, przypisanie do pola sa-
ve_hook obiektu _iForm funkcji, która będzie no-
tyfikowana o zapisie bądź odrzuceniu zmian war-
tości pól i wyświetlenie całości poprzez wywoła-
nie metody execute(). Klasa zawiera również
szereg funkcji odpowiedzialnych za pobieranie
informacji o wprowadzonych wartościach do po-
szczególnych pól formularza: getPizzaName(),
getAmount() itd. Rysunek 11. Obszary ekranu aplikacji
Rysunek 8. Interfejs użytkownika aplikacji
Sekcja startowa skryptu ustawia odpowiedni ty-
tuł aplikacji u góry okna, inicjalizuje obiekt klasy
PizzaFormView i go wykonuje. Od tego momen-
tu aplikacja przechodzi w tryb interakcji z użyt-
kownikiem, a w momencie naciśnięcia przyci-
sku Wróć, pojawia się monit z zapytaniem o za-
pis wprowadzonych danych, skutkiem czego bę-
dzie ustawienie odpowiedniej wartości logicznej
zmiennej _iIsSaved.
Jeśli zmiany zostaną potwierdzone, nastąpi
odczytanie poszczególnych pól formularza. W
przypadku pól z wyborem, na podstawie indek-
su musimy zlokalizować wartość tekstową z li-
sty, a dla pola z maską czasu – dokonać konwer-
sji na czytelną dla człowieka postać z użyciem
funkcji localtime() i strftime(). Końcowym
elementem jest odpowiednie sformatowanie łań-
cucha znaków, a następnie wysłanie SMS-em
pod wskazany numer funkcją messaging.sms_
send(numer.txt). Aplikacja kończy się komuni-
katem informacyjnym. Odbiorca (pizzeria) otrzy-
ma wiadomość podobną do tej z rysunku 10. Rysunek 9. Monitor z potwierdzeniem Rysunek 12. Ekran aplikacji

www.sdjournal.org 53
Programowanie urządzeń mobilnych

Odrobina teorii wanie aplikacji bez blokowania zdarzeń syste- Bluetooth i moduł telefoniczny
Najlepszą praktyką podczas nauki programowania mowych czy interfejsu użytkownika. Dla apli- Symbian OS oferuje programiście bardzo szero-
jest tworzenie niewielkich aplikacji. Nie zaszkodzi kacji, które nie muszą mieć pętli głównej pro- ki dostęp do takich peryferiów jak moduł telefo-
jednak opisać kroki, jakie należy wykonać w celu gramu, gdyż realizują prosty scenariusz pole- niczny czy interfejs Bluetooth. Pierwszy z przed-
stworzenia aplikacji z wykorzystaniem pyS60. gający na wprowadzeniu danych, wykonaniu stawionych programów realizuje wysyłanie pli-
operacji i poinformowaniu o wyniku użytkow- ku graficznego przez Bluetooth z wykorzysta-
Ekran nika wystarczy konstrukcja przedstawiona na niem protokołu OBEX. Oprócz znanych z po-
Ekran telefonu komórkowego można podzielić Listingu 4. przednich skryptów modułów, w tym przykła-
obszary przedstawione na Rysunku 11.
Każdy z nich reprezentowany jest przez odpo- Listing 5. Wysyłanie plików przez Bluetooth
wiednią zmienną, tak więc, aby ustawić tytuł apli-
kacji, należy przypisać wartość do appuifw.app.ti- import e32, socket, appuifw, graphics
tle, a obsługę zakończenia aplikacji podpiąć do ap-
puifw.app.exit_key_handler. ##lokalizacja pliku graficznego do wysłania
IMAGE = u"e:\\Images\\python-logo.jpg"
Import modułów ##funkcja wysyłająca grafikę przez Bluetooth
Na początku aplikacji należy zaimportować mo- def send_photo():
duły lub dane funkcje z modułów. try:
## skanowanie urządzeń BT w pobliżu
Określenie wielkości ekranu aplikacji i address, services = socket.bt _ obex _ discover()
tytułu aplikacji. except:
Zmienna appuifw.app.screen może przyjmo- ## komunikat wyjątku
wać wartości: normal (widoczny pasek tytułu i appuifw.note(u"OBEX Push not available", "error")
etykiety klawiszy funkcyjnych), large (widocz- return
ne tylko etykiety klawiszy funkcyjnych) lub full ## wyszukianie protokołu OBEX Object Push
(tryb pełnoekranowy). Aby ustawić tytuł apli- if u'OBEX Object Push' in services:
kacji, należy przypisać wartość do zmiennej ## odczyt kanału
appuifw.app.title. channel = services[u'OBEX Object Push']
## wysłanie pliku na podany adres urządzenia i poprzez
Menu aplikacji ## wskazany numer kanału

Do zmiennej appuifw.app.menu należy przypi- socket.bt_obex_send_file(address, channel, IMAGE)


sać listę krotek, które będą składać się z dwóch ele- appuifw.note(u"Photo sent", "info")
mentów: nazwy pozycji menu oraz nazwy funkcji else:
obsługującej wybranie pozycji menu. Oczywiście appuifw.note(u"OBEX Push not available", "error")
dozwolone jest zagnieżdżanie krotek. (Listing 2)
## obsługa klawisza Wyjdź
Pętla główna aplikacji def quit():
Utworzenie pętli głównej polega na odpowied- app_lock.signal()
niej konstrukcji pętli while; zgodnie z przykła-
dem z Listingu 3. ## ekran aplikacji pracuje w trybie graficznym
Tuż przed powrotem do warunku sprawdza- ## pobranie uchwytu ekranu do operacji graficznych
jącego warto odczekać chwilę wywołując me- canvas = appuifw.Canvas()
todę e32.ao_sleep(), zatrzymującą wykony-
## przypisanie do zmiennej
appuifw.app.body = canvas

## załadowanie grafiki do pamięci


img = graphics.Image.open(IMAGE)

## wyświetlenie na ekranie (bez skalowania)


canvas.blit(img, scale = 0)

## określenie funkcji obsługującej


## zakończenie aplikacji
appuifw.app.exit_key_handler = quit

## ustaw tytuł aplikacji


appuifw.app.title = u"Bluetooth photo sender"
## definicja menu
appuifw.app.menu = [(u"Send", send_photo)]
## utworzenie Active Object (odbiór zdarzeń z UI)
app_lock = e32.Ao_lock()
app_lock.wait()
Rysunek 13. Lista urządzeń BT

54 02/2009
Wąż w komórce

dzie konieczne jest zadeklarowanie dodatkowo ści zostanie załadowany do pamięci plik graficz- Po wybraniu odpowiedniej opcji z menu apli-
pakietów socket i graphics, przez co otrzymamy ny, a następnie zostanie on wyświetlony bez ska- kacji rozpocznie się proces wyszukiwania znaj-
odpowiednio dostęp do funkcji operujących na lowania na ekranie (Rysunek 12). dujących się w pobliżu urządzeń z interfejsem
gniazdach oraz do funkcji graficznych. W tym Bluetooth za pomocą funkcji socket.bt _
przykładzie po raz pierwszy uzyskamy dostęp canvas = appuifw.Canvas() obex _ discover() (Rysunek 13).
do ekranu aplikacji metodą appuifw.Canvas() appuifw.app.body = canvas Po wybraniu danego urządzenia zwrócona zo-
a wynik tej operacji zostanie przypisany do img = graphics.Image.open(IMAGE) stanie struktura, na którą składa się unikatowy
zmiennej appuifw.app.body. W dalszej kolejno- canvas.blit(img, scale = 0) numer interfejsu Bluetooth urządzenia oraz in-
formacja o nazwie usługi i numerze kanału, na
którym jest ona dostępna. W dalszej części nastę-
W Sieci puje sprawdzenie czy usługa nosi nazwę OBEX
• Strona projektu PyS60 – http://sf.net/projects/pys60; Object Push – jeśli tak, odczytywany jest numer
• PyS60 Library Reference – http://downloads.sourceforge.net/pys60/PythonForS60_1_4_4_doc.pdf;
kanału i wywoływana jest funkcja socket.bt_
• Wszystko o Symbianie – http://www.symbian.com/;
obex_send_file() wysyłająca plik.
• Wszystko o Pythonie (kursy, artykuły, forum) – http://www.python.org.pl/;
• Plugin Pythona do Eclipse’a – http://pydev.sourceforge.net/; Kolejną aplikacją demonstrującą dostęp do
• E-book Dive Into Python – http://diveintopython.org/; funkcji modułu telefonicznego jest rejestrator
• Python Wiki Nokia – http://wiki.forum.nokia.com/index.php/Category:Python; rozmów, który będzie automatycznie nagrywał
• Nokia OpenSource – http://wiki.opensource.nokia.com/projects/PyS60; każdą przychodzącą rozmowę z zastrzeżonego
• pyS60’s Snippets – http://snippets.dzone.com/tag/pys60;
numeru telefonu.
• Forum Nokia – http://discussion.forum.nokia.com/forum/forumdisplay.php?f=102;
• Protokół OBEX – http://en.wikipedia.org/wiki/OBEX. Najważniejszym punktem aplikacji jest wska-
zanie jako dla telephone.call_state() funk-
cji, która będzie odpowiedzialna za identyfikację
Listing 6. Rejestrator rozmów stanu połączenia oraz numeru telefonu. W pre-
zentowanym przykładzie funkcja handleCall()
import appuifw bada parametr callState - lista stałych opisują-
import e32 cych status połączenia znajduje się w dokumen-
import telephone cie PyS60 Library Reference – i podejmuje akcję
import audio rejestrowania połączenia do pliku WAV. Nagry-
#ścieżka do pliku z nagraniem wane są wyłącznie połączenia, dla których nie
AUDIOFILE = "E:\\Sounds\\call.wav" można zidentyfikować numeru dzwoniącego
sound = None (parametr number funkcji jest pusty). Aby uzy-
recording = False skać dostęp do funkcji rejestrujących dźwięk, ko-
## funkcja przechwytująca status połączenia nieczne jest skorzystanie z modułu audio, wywo-
def handleCall((callState, number)): łanie metody record() podczas trwania rozmo-
#status zakończenia rozmowy wy powoduje rozpoczęcie jej nagrywania.
if callState == telephone.EStatusDisconnecting:
if recording == True: Słowem zakończenia
print "end of call" Mam nadzieję, że zaprezentowany artykuł gład-
sound.stop() ko wprowadził czytelników w temat programo-
sound.close() wania w Pythonie dla Symbian OS. Oczywi-
recording = False ście jest to tylko wprowadzenie do tematu, ale
#odebranie rozmowy mimo to myślę, że już dziś, po przeczytaniu te-
if callState == telephone.EStatusAnswering: go artykułu, zwiększyła się rzesza developerów
if number == "": chętnych do programowania w tej technologii.
print "incoming unknown call-id" Z pewnością nie można przejść obok szybkości
recording = True tworzenia i debugowania aplikacji, dużej liczby
sound = audio.Sound.open(AUDIOFILE) dodatkowych modułów, możliwości kompilacji
sound.record() skryptów do postaci archiwum Symbian (pliki
else: SIS) czy wsparcia stale rosnącej społeczności ko-
print "call from " + number rzystającej z Pythona.

def quit():
app_lock.signal() MARIAN WITKOWSKI
## określenie funkcji obsługującej Marian Witkowski jest miłośnikiem oraz entuzja-
## zakończenie aplikacji stą wykorzystywania technologii mobilnych w ży-
appuifw.app.exit_key_handler = quit ciu codziennym. Cenne doświadczenie w zakresie
#ustaw tytuł aplikacji usług mobilnych nabył podczas współpracy w la-
appuifw.app.title = u"Call Manager" tach 2001-2006 z firmą One-2-One S.A. zajmującą
#okreś funkcję odczytującą status rozmowy się integracją usług dodanych w telefonii komórko-
telephone.call_state(handleCall) wej. Prowadzi własną firmę świadczącą usługi in-
## utworzenie Active Object (odbiór zdarzeń z UI) formatyczne w zakresie tworzenia mikroproceso-
app_lock=e32.Ao_lock() rowych systemów czasu rzeczywistego, technologii
app_lock.wait() mobilnych oraz układów automatyki.
Kontakt z autorem: mw@it-mobile.net

www.sdjournal.org 55
Programowanie urządzeń mobilnych

GPS z .NET Compact


Framework
Chip GPS coraz częściej znajduje się w niedrogich telefonach oraz
urządzeniach PDA z zainstalowanym systemem Windows CE lub Mobile.
Z dobrą baterią można takie urządzenie zabrać nawet na całodzienną
wędrówkę i późniejsze pytania gdzie byłeś? skwitować gotowym zapisem
trasy.
wolnych urządzeń jak PDA, powinna umożliwić
Dowiesz się: Powinieneś wiedzieć: w każdym momencie jej przerwanie czy też uru-
• Jak napisać prosty program na urządzenie • Posiadać znajomość podstaw .NET i C#. chomienie innego programu lub funkcji. Oznacza
przenośne wykorzystując Microsoft .NET Com- • Jak korzystać z Microsoft Active Sync. to, że po pierwsze należy koniecznie ustawić wła-
pact Framework. sność ReadTimeout na wartość mniej więcej mię-
• Jak komunikować się z Chipem GPS poprzez dzy 500-2000 ms, nie za mało, aby nie przemę-
port szeregowy. czać małego komputerka i nie za dużo, aby jed-
• Jak przeliczyć współrzędne przesyłane przez nak zapewnić reakcję programu w przewidywal-
GPS na format UTM. nym czasie. Po drugie odczyt portu powinien od-
bywać się w oddzielnym, najlepiej przeznaczo-
nym tylko do tego celu wątku. Znawcy platfor-
Obsługa portu szeregowego my .NET i ogólnie programowania systemów MS
Do obsługi portu szeregowego w .NET służy kla- Windows wypomną mi jeszcze istnienie w klasie
Poziom trudności sa Serial.IO.Ports.SerialPort. Za pomocą SerialPort zdarzenia DataReceived, wywołują-
własności PortName, BaudRate, Databits, Parity, cego zdefiniowanego delegata w momencie poja-
StopBits ustala się parametry komunikacji szere- wienia się na porcie informacji. Niestety, tu mój
gowej, statyczna metoda GetPortNames() zwraca telefon sprawił mi niemiłą niespodziankę, ponie-

N
iedawno otrzymałem nowy telefon T- nieposortowaną tablicę nazw portów szeregowych waż port szeregowy GPS-u nie zgłaszał żadnych
Mobile MDA Compact III, znany rów- dostępnych w systemie, a metody Open() oraz zdarzeń, ani w .NET, ani w C (porównaj również
nież jako HTC 3300, wyposażony w Close() otwierają i zamykają port szeregowy. Do [WEB02]), podczas gdy np. na porcie szeregowym
chip GPS SiRF STAR III oraz Windows Mobile 6. odczytu portu służy kilka wersji metody Read() do komunikacji z komputerem desktop zdarzenia
Natychmiast postanowiłem wykorzystać nawiga- ReadByte(), ReadChar() oraz ReadLine(). generowane były bez zarzutu.
cję GPS do swoich całodziennych wędrówek i za- Wszystkie te metody są blokujące, praca progra-
miast studiować możliwości, cenniki i instrukcje mu zostaje wstrzymana aż do czasu pojawienia
obsługi dostępnego oprogramowania nawigacyj- się jakiejkolwiek informacji na porcie, w przypad-
nego zdecydowałem się na napisanie prostego pro- ku metody ReadLine() aż do pojawienia się znaku
gramu pokazującego aktualną pozycję, którą po- końca linii. Własność ReadTimeout klasy określa
tem można by skonsultować z drukowaną mapą, i czas w milisekundach, po którym wygenerowany
tak zawsze obecną w plecaku i dużo wygodniejszą zostanie wyjątek System.TimeoutException, jeśli
w porównaniu ze skromnymi możliwościami wy- na porcie nie pojawi się żadna informacja, względ-
świetlacza 240x320. Dodatkowy regularny zapis nie znak końca linii. Standardowa wartość tej wła-
pozycji miał gwarantować wieczorną rozrywkę w sności to stała InfiniteTimeout.
gronie przyjaciół przed ekranem Google Earth. Wybór właściwej metody do odczytu portu sze-
Szybka konsultacja z Google zdradziła ist- regowego ma ogromny wpływ na efektywność,
nienie zgrabnej biblioteki programistycznej czy w ogóle możliwość działania programu. Chi-
GPS Intermediate Driver, zawartej w Micro- py GPS generują duże ilości informacji i np. meto-
soft Windows Mobile SDK, dobrze udoku- da ReadLine() kończyła się wyjątkiem z enigma-
mentowanej, opatrzonej przejrzystymi przy- tycznym wyjaśnieniem o przepełnieniu dostępne-
kładami zarówno w C, jak i C# oraz ... niedzia- go bufora, natomiast odczyt bajtu po bajcie za po-
łającej z moim telefonem i systemem operacyj- mocą metody ReadByte() skutecznie powstrzy-
nym ([WEB01]). mywał telefon od robienia czegokolwiek poza czy-
Na szczęście z GPS-em można komunikować taniem portu.
się za pomocą zwykłego portu szeregowego i Każda przyjazna dla użytkownika aplikacja,
można obyć się bez dodatkowych API. a szczególnie aplikacja przeznaczona dla tak po- Rysunek 1. Program sgps.exe

56 02/2009
GPS z .NET Compact Framework

Listing 1. zawiera uproszczoną wersję kla- ani jeden bajt, wtedy generowany jest wyjątek lonych za pomocą znaków karetki, końca li-
sy otwierającej i odczytującej port szeregowy TimeoutException , który w tej metodzie jest nii lub (najczęściej) obydwu. Jeśli ustawili-
COM4, COM4 to port programowego dostępu po prostu ignorowany. Przed przystąpieniem śmy wcześniej zmienną m_rdlinecb za pomo-
do GPS na HTC3300 Najważniejszą część kla- do kolejnego odczytu sprawdzana jest wartość cą własności RdLineCb, a zatem jeśli zdefinio-
sy stanowi metoda readFkt(). Wywołanie zmiennej m _ doread , którą można ustawić na waliśmy funkcję callback (delegata) do ob-
false w implementacji własności Read . W ten sługi odebranych linii tekstu, to metoda prze-
len = this.m_serial.Read(this.m_buf, 0, sposób w każdej chwili można przerwać od- kształca tablicę bajtów z m_buf na listę łańcu-
Serial.BUFLEN); czyt portu i metoda readFkt() wraz ze swo- chów znaków i przekazuje ją jako parametr do
im wątkiem zakończy działanie najpóźniej po naszego delegata. W ten sposób klasa pozwa-
powoduje odczytanie maksymalnie 4096 baj- około 2 sekundach. la na elastyczne zdefiniowanie własnej obsłu-
tów, przy czym dokładna ilość odczytanych Po udanym odczycie w tablicy m_buf znaj- gi każdej odczytanej linii tekstu lub po prostu
bajtów zwracana jest do zmiennej len . Jeśli w duje się maksymalnie 4096 bajtów zawiera- na zaniechanie robienia z tą informacją czego-
ciągu 2 sekund na porcie GPS-u nie pojawi się jących potencjalnie wiele linii tekstu oddzie- kolwiek. W tym ostatnim wypadku program

Listing 1. Klasa do obsługi portu szeregowego

using System; this.m_thr = new Thread(this.readFkt);


using System.Collections; this.m_thr.IsBackground = true;
using System.IO.Ports; this.m_thr.Start();
using System.Text; }
using System.Threading; }
public delegate void ReadLineDelegate(ArrayList arr); else {
public class Serial { this.m_doread = false;
private const int BUFLEN = 4096; if (this.m_thr != null) {
private const int DEFAULT_TIMEOUT = 2000; this.m_thr.Join();
private SerialPort m_serial; this.m_thr = null;
private Thread m_thr; }
private ReadLineDelegate m_rdlinecb; }
private StringBuilder m_sbline; }
private byte[] m_buf; }
private bool m_doread; private void readFkt() {
public Serial() { ArrayList arr;
this.m_buf = new byte[Serial.BUFLEN]; string s;
this.m_sbline = new StringBuilder(Serial.BUFLEN); int len, i;
this.m_serial = new SerialPort(); char c;
this.m_serial.ReadTimeout = Serial.DEFAULT_TIMEOUT; if (this._serial.IsOpen) {
this.m_serial.PortName = "COM4"; while (this.m_doread) {
this.m_thr = null; try {
this.m_rdlinecb = null; len = this.m_serial.Read(this.m_buf, 0, Serial.BUFLEN);
this.m_doread = false; if (len > 0) {
} if (this.m_rdlinecb != null) {
public ReadLineDelegate RdLineCb { arr = new ArrayList();
set { this.m_rdlinecb = value; } for(i = 0; i < len; i++) {
} c = Convert.ToChar(this.m_buf[i]);
public virtual void Open() { if (c == '\r' || c == '\n') {
this.Close(); if (this.m_sbline.Length > 0) {
this.m_serial.Open(); s = this.m_sbline.ToString();
this.Read = true; arr.Add(s);
} this.m_sbline.Length = 0;
public void Close() { }
this.Read = false; }
if (this.m_serial.IsOpen) this.m_serial.Close(); else this.m_sbline.Append(c);
} }
public bool Read { if (this.m_doread && arr.Count > 0) this.m_
get { rdlinecb(arr);
if (this.m_thr == null) return false; }
return true; }
} }
set { catch(TimeoutException) { }
if (value) { }
if (this.m_serial.IsOpen) { }
this.Read = false; }
this.m_doread = true; }

www.sdjournal.org 57
Programowanie urządzeń mobilnych

oparty o opisywaną klasę może posłużyć np. mem morza. Sentencja ta ma format przedsta- • E (wschód) lub W (zachód)
do rozładowania baterii PDA. wiony na Listingu 2. i składa się z poniższych • Wskaźnik jakości sygnału GPS.
pól oddzielonych przecinkami: • Ilość widocznych satelitów.
Sentencje NMEA 0183 • Niedokładność pozioma w metrach.
National Marine Electronics Association, w • Każda sentencja NMEA 0183 zaczyna się • Wysokość nad poziomem morza.
skrócie NMEA, to organizacja zajmująca się od znaku dolara i dwóch dowolnych zna- • Jednostka wysokości nad poziomem mo-
ujednoliceniem standardów elektroniki sto- ków, za którą następuje trzyliterowe ozna- rza, M dla metrów.
sowanej w marynarce ([WEB03]). Ogromna czenie sentencji. W przypadku SiRF tuż • Różnica między elipsoidą WGS84 i pozio-
większość chipów GPS generuje tzw. senten- za dolarem znajdują się znaki SP a GGA to mem morza.
cje NMEA 0183 i ogromna większość z nich oznaczenie typu sekwencji. • Jednostka dla 11, M dla metrów.
czyni to standardowo tuż po otwarciu portu. • Czas UTC. • Wiek danych różnicowych GPS.
Doskonały zestaw dokumentacji przeróżnych • Długość geograficzna w formacie stop- • ID stacji odniesienia.
implementacji chipsetu SiRF znajduje się pod nie, minuty, sekundy, części dziesiętne se- • Suma kontrolna.
adresem [WEB04]. Opis samych łańcuchów kund. Np. 1234.5678 oznacza 12 stopni,
NMEA można znaleźć pod adresem [WEB05]. 34 minuty i 56.78 sekundy. Przykład
Najczęściej wykorzystywaną sentencją NMEA • N (północ) lub S (południe)
jest tzw. string GGA, zawierający zarówno ak- • Szerokość geograficzna w podobnym for- $GPGGA,200329.000,4932.7248,N,01159.2531,E,
tualne współrzędne, jak i wysokość nad pozio- macie jak długość. 1,06,1.5,401.0,M,47.4,M,,0000*5A

oznacza czas UTC 20:03:29, 49°32'72.48”N,


Listing 2. Format sentencji GGA
11°59'25.31”E, 401 metrów nad poziomem
morza.
0 1 2 3 4 5 6 7 8 9 10 | 12 13 14 15 Z powyższych pól interesujące są długość, sze-
| | | | | | | | | | | | | | | | rokość geograficzna, wysokość nad poziomem
$--GGA,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx*hh morza oraz jednostki, czyli pola 2, 3, 4, 5, 9 oraz
ewentualnie jeszcze 10, choć jednostką wysokości

Listing 3. Metoda Utils.fromGGA()

sing System; if (sa.Length < 10) goto end;


using System.Globalization; for(i = 0; i < 10; i++) if (string.IsNullOrEmpty(sa[i]))
public class Utils { goto end;
private static double dms2dec(double dms) { try {
double deg, min, deg100, part; tim = Double.Parse(sa[1], ST, CultureInfo.InvariantCulture);
lat = Double.Parse(sa[2], ST, CultureInfo.InvariantCulture);
deg = Math.Floor(0.01 * dms); lon = Double.Parse(sa[4], ST, CultureInfo.InvariantCulture);
deg100 = 100 * deg; alt = Double.Parse(sa[9], ST, CultureInfo.InvariantCulture);
min = Math.Floor(dms - deg100); }
part = dms - deg100 - min; catch(Exception) {
return deg + (min + part)/ 60; }
} lat = Utils.dms2dec(lat);
public static bool fromGGA(out double utcTime, lon = Utils.dms2dec(lon);
out double n_lat, switch(sa[3].Trim()) {
out double e_long, case "N" :
out double altitude, case "n" : break;
string gga) { case "S" :
const NumberStyles ST = NumberStyles.AllowDecimalPoint | case "s" : lat = -lat; break;
NumberStyles.AllowLeadingSign | default : goto end;
NumberStyles.AllowLeadingWhite | }
NumberStyles.AllowTrailingWhite; switch(sa[5].Trim()) {
string[] sa; case "E" :
double lat, lon, tim, alt; case "e" : break;
int i; case "W" :
bool retval; case "w" : lon = -lon; break;
retval = false; default : goto end;
utcTime = 0.0; }
n_lat = 0.0; e_long = 0.0; altitude = 0.0; utcTime = tim;
if (string.IsNullOrEmpty(gga) || gga.Length <= 6 || n_lat = lat; e_long = lon; altitude = alt;
gga[0] != '$' || gga[3] != 'G' || gga[4] != 'G' || retval = true;
gga[5] != 'A') { end:
goto end; return retval;
} }
sa = gga.Split(Utils.GGASEPS); }

58 02/2009
GPS z .NET Compact Framework

są zawsze metry. Listing 3. przedstawia przykład Format GPX Listing 5 przedstawia implementację kla-
metody interpretującej sentencję GGA. Format GPX pozwala na zapis ścieżki, po któ- sy generującej pliki gpx. Metoda klasy Gpsx
Metoda sprawdza w najprostszy sposób for- rej poruszaliśmy się z urządzeniem GPS. Pliki tworzy nowy obiekt klasy XmlWriter i zaczy-
mat przekazanego łańcucha znaków i usiłuje w formacie GPX rozumiane są również bezpo- na zapis do podanego pliku, umieszczając tam
zinterpretować pole drugie, trzecie, piąte i dzie- średnio przez Google Earth, potrafiący tak za- element główny pliku gpx oraz element time
wiąte jako liczby określające długość, szerokość pisane trasy dosyć spektakularnie odtworzyć. wraz z czasem rozpoczęcia zapisu. Metoda
geograficzną oraz wysokość nad poziomem mo- Dokładny opis formatu znajduje się pod adre- addLocation zapisuje pojedynczy element
rza. Proszę zwrócić uwagę na zastosowanie stałej sem [WEB08]. Listing 4. przedstawia przykła- wpt wraz z podanymi współrzędnymi i wyso-
System.Globalization.CultureInfo.Invaria dowy plik w formacie GPX. kością. Jako czas zapisywany jest aktualny czas
ntCulture przekazanej do metody Parse(). W Element time to czas startu zapisu, stem- systemowy. Elementy name oraz description
naszej strefie kulturowej część dziesiętna liczby ple czasowe zapisywane są w plikach GPX w ustawiane są na aktualną wartość licznika,
zmiennoprzecinkowej oddzielana jest od całko- formacie yyyy-MM-ddTHH:mm:ssZ. Element przez co nazwą każdego punktu ścieżki będzie
witej za pomocą przecinka, podczas gdy łańcu- bounds zawiera maksymalne i minimalne dłu- po prostu liczba od zera w górę. Elementy sym
chy NMEA stosują w tym miejscu typową dla gości i szerokości geograficzne występujące oraz type zawierają wspomnianą wartość Dot.
krajów anglosaskich kropkę. Bez zastosowania we wszystkich elementach wpt. Współrzędne Metoda close zapisuje element bounds wraz
stałej InvariantCulture decyzja o użyciu krop- zapisywane są w sposób dziesiętny. Elemen- z maksymalnymi i minimalnymi współrzęd-
ki czy przecinka powzięta by została na podsta- ty wpt zawierają jeden punkt ścieżki, element nymi znalezionymi podczas kolejnych wywo-
wie aktualnych ustawień regionalnych kompu- elekażdego elementu wpt zawiera wysokość łań metody addLocation, po czym zapisywa-
tera i z dużym prawdopodobieństwem wybór na poziomem morza, time – czas zapisu punk- ny jest kończący znacznik XML dla elemen-
padłby na niewłaściwy w tym miejscu przeci- tu, name i desc to czytelna nazwa i opis punktu. tu głównego .
nek. Odczytanie współrzędnych z sentencji Wartość Dot dla elementów sym i type określa
NMEA może się często nie udać, np. gdy odbior- pojedynczy punkt ścieżki. Usypianie i wyłączanie ekranu
nik GPS straci kontakt z satelitami lub jeszcze go Pliki XML, a do tego typu należy również for- Na pewno żaden użytkownik nie pozwoli na-
nie nawiązał. Metoda Utils.dms2dec() zamie- mat GPX, najwygodniej utworzyć w .NET za mówić się na klikanie raz na kilka minut w
nia współrzędne z sentencji NMEA na postać pomocą klasy System.Xml.XmlWriter, meto- ekran lub na wciskanie któregoś z klawiszy
dziesiętną, tzn. np. współrzędna 01159.2531 dy WriteStartElement i WriteEndElement PDA. Niestety, jeśli użytkownik tego nie bę-
(11°59'25.31”) zostanie przeliczona na zapisują do zdefiniowanego pliku lub stru- dzie robił, to PDA zostanie po prostu uśpio-
11,987552°. Dalej przyjmuje się, że współrzęd- mienia pojedynczy element XML, metoda ny, nasz program ani nie pokaże, ani nie za-
ne północne i wschodnie są dodatnie, natomiast WriteAttributeString – atrybut elementu pisze aktualnej pozycji do pliku, a chip GPS
południowe i zachodnie zwracane są jako współ- XML. Za pomocą statycznej metody Create moż- zgubi satelity i będzie po obudzeniu PDA po-
rzędne ujemne. Odczytany czas, współrzędne na utworzyć nowy obiekt klasy, metoda Close za- trzebował przynajmniej kilku minut, aby je
oraz wysokość metoda Utils.fromGGA() zwraca myka zapisywany plik lub strumień XML. Podob- ponownie znaleźć. Oczywiście można zmie-
w parametrach wyjściowych utcTime, n_lat, nie jak w przypadku sentencji GGA należy zapew- nić parametry zarządzania energią PDA i za-
e_long oraz altitude. nić zapis liczb zmiennoprzecinkowych z kropką bronić mu się usypiać, ale wtedy wystarczy,
jako separatorem części dziesiętnej. że zapomnimy o tym, zostawimy urządzenie
Współrzędne UTM
UTM (Universal Transverse Mercator Projec- Listing 4. Przykład pliku GPX
tion) to współrzędne określające odległość w
metrach lub kilometrach od równika oraz od <?xml version="1.0" encoding="utf-8"?>
najbliższego z rozmieszczonych co sześć stopni <gpx xmlns="http://www.topografix.com/GPX/1/0">
południków (-3°, 3°, 9°, 15°, 21° itd.). Współ- <time>2008-11-25T18:37:18Z</time>
rzędne UTM mogą różnić się typem zastosowa- <wpt lat="49.5480166666667" lon="11.999805">
nej elipsoidy rotacyjnej, przy czym najpopular- <ele>444.9</ele>
niejszy jest system WGS84. Wiele dokładnych <time>2008-11-25T18:37:19Z</time>
map, czyli tych najbardziej przydatnych do wę- <name>0</name>
drówek po bezdrożach, oraz planów miast za- <desc>0</desc>
wiera właśnie siatkę współrzędnych UTM za- <sym>Dot</sym>
miast współrzędnych biegunowych. Ponadto <type>Dot</type>
mając współrzędne UTM można w miarę ła- </wpt>
two określić odległość do innego punktu. ...
Sposób przeliczenia z i na współrzędne UTM <wpt lat="49.5453083333333" lon="11.9878866666667">
został doskonale opisany na stronie profeso- <ele>418.3</ele>
ra Steve'a Dutcha [WEB06]. Profesor Dutch <time>2008-11-25T18:51:59Z</time>
nie tylko opisuje konwersję między systema- <name>347</name>
mi współrzędnych, ale również pod adresem <desc>347</desc>
[WEB07] udostępnia arkusz Microsoft Excel <sym>Dot</sym>
implementujący algorytm konwersji, nieco <type>Dot</type>
różniący się zresztą od teoretycznego opisu </wpt>
pod adresem [WEB06]. Na podstawie tego ar- <bounds minlat="49.5445216666667"
kusza i za wyraźnym pozwoleniem profesora minlon="11.9876866666667"
pozwoliłem sobie zaimplementować metodę maxlat="49.5482366666667"
Utils.toUTM() przeliczającą współrzędne geo- maxlon="12.0002133333333" />
graficzne na UTM. Zainteresowanych odsyłam </gpx>
do kodu załączonego do artykułu.

www.sdjournal.org 59
Programowanie urządzeń mobilnych

włączone na noc i po baterii. Jest jeszcze in- niu mobilnym, wersje MS Windows dla kom- Obsługa GPS
ne rozwiązanie. Nie musimy regularnie kli- puterów PC, nie wspominając o innych sys- Czas, aby poskładać zaprezentowane wcześniej
kać w ekran, aby PDA myślał, że wciąż aktyw- temach operacyjnych, na których programy elementy i odczytać choćby jedną współrzędną
nie na nim pracujemy. Wystarczy, że wyzeru- .NET obsługiwane są za pomocą Mono czy z GPS. Listing 7. przedstawia klasę SerialGPS,
jemy licznik bezczynności za pomocą funkcji Portable.NET, nie znają tej funkcji i jej pierw- pochodną od wcześniej opisanej klasy Serial,
C SystemIdleTimerReset() znajdującej się sze wywołanie wygenerowałoby wyjątek. Te- definiującą metodę parseNMEA(), która słu-
w bibliotece coredll.dll ([WEB09]). Funk- raz tylko wystarczy regularnie wywoływać me- ży jako callback (delegat m_gpscb) wywo-
cje C używa się w .NET za pomocą technolo- todę Utils.dontSuspend() i PDA nie zostanie ływany dla linii tekstu odczytanych z por-
gii zwanej P/Invoke (Platform Invoke) dosko- uśpiony. tu szeregowego w metodzie readFkt() kla-
nale opisanej choćby w [WEB10] i której opis Zerowanie licznika bezczynności ma jed- sy Serial. Dla każdej linii tekstu przekaza-
stanowczo wykracza poza ramy tego artyku- nak pewien niemiły efekt uboczny: powodu- nej w tablicy metoda parseNMEA() wywo-
łu. Użycie funkcji SystemIdleTimeReset() z je, że prądożerczy ekran PDA również nie jest łuje metodę Utils.fromGGA() odczytującą
poziomu C# sprowadza się do zdefiniowania wyłączany. Ekran można wyłączyć za pomo- współrzędne i wysokość nad poziomem mo-
jej jako metody klasy za pomocą polecenia Sy cą dosyć kiepsko udokumentowanej funkcji C rza z sentencji GGA. W tablicy przekazanej
stem.Runtime.InteropServices.DllImport, ExtEscape() ([WEB11]) do parseNMEA() może znajdować się nawet kil-
patrz Listing 6. Wystarczy zatem wywołać metodę ka poprawnych sentencji GGA, dlatego meto-
Klasa Utils definiuje metodę SystemIdle Utils.displayOff(), choćby z metody obsłu- da Utils.fromGGA() wywoływana jest w pę-
TimerReset() za pomocą P/Invoke. Pu- gującej zdefiniowany do tego celu klawisz lub tli, tak aby po zakończeniu pętli współrzędne
bliczna metoda dontSuspend() wywołu- punkt menu GUI, aby wyłączyć ekran. Ekran ostatniej sentencji znalazły się w zmiennych
je SystemIdleTimerReset(), ale tylko wtedy, rozjaśnia się ponownie po wciśnięciu któregoś lat2, lon2 i alt2. Jeśli znaleziono przynajm-
kiedy program wykonywany jest na urządze- z klawiszy PDA. niej jeden poprawny łańcuch GGA (isValid

Listing 5. Klasa Gpsx do generacji plików gpx

using System; this.m_writer.WriteAttributeString("maxlon", this.m_maxlon


using System.Globalization; .ToString(CultureInfo.InvariantCulture));
using System.IO; this.m_writer.WriteEndElement();
using System.Xml; this.m_writer.WriteEndElement();
public class Gpsx { this.m_writer.Close();
private const string TIMEFORMAT = "yyyy-MM-ddTHH:mm:ssZ"; this.m_writer = null;
private const string SYM = "Dot"; }
private XmlWriter m_writer; this.m_counter = 0; this.m_minlat = 180.0; this.m_minlon
private double m_minlat; = 180.0; this.m_maxlat = -180.0; this.m_
private double m_minlon; maxlon = -180.0;
private double m_maxlat; }
private double m_maxlon; public void addLocation(double nlat, double elon, double ele)
private int m_counter; {
public Gpsx() { string name;
this.m_writer = null; if (this.m_writer != null) {
this.m_minlat = 180.0; this.m_minlon = 180.0; this.m_maxlat name = this.m_counter.ToString();
= -180.0; this.m_maxlon = -180.0; this.m_ this.m_counter++;
counter = 0; this.m_writer.WriteStartElement("wpt");
} this.m_writer.WriteAttributeString("lat", nlat.ToString(Cu
~Gpsx() { this.close(); } ltureInfo.InvariantCulture));
public void open(string filename) { this.m_writer.WriteAttributeString("lon", elon.ToString(Cu
XmlWriterSettings settings; ltureInfo.InvariantCulture));
this.close(); this.m_writer.WriteElementString("ele", ele.ToString(Cultu
settings = new XmlWriterSettings(); settings.Indent = true; reInfo.InvariantCulture));
this.m_writer = XmlWriter.Create(filename, settings); this.m_writer.WriteElementString("time", DateTime.Now.ToSt
this.m_writer.WriteStartElement("gpx", "http:// ring(TIMEFORMAT));
www.topografix.com/GPX/1/0");
this.m_writer.WriteElementString("time", DateTime.Now.ToStri this.m_writer.WriteElementString("name", name);
ng(TIMEFORMAT)); this.m_writer.WriteElementString("desc", name);
} this.m_writer.WriteElementString("sym", Gpsx.SYM);
public void close() { this.m_writer.WriteElementString("type", Gpsx.SYM);
if (this.m_writer != null) { this.m_writer.WriteEndElement();
this.m_writer.WriteStartElement("bounds"); }
this.m_writer.WriteAttributeString("minlat", this.m_minlat if (nlat < this.m_minlat) this.m_minlat = nlat; if (nlat >
.ToString(CultureInfo.InvariantCulture)); this.m_maxlat) this.m_maxlat = nlat;
this.m_writer.WriteAttributeString("minlon", this.m_minlon if (elon < this.m_minlon) this.m_minlon = elon; if (elon >
.ToString(CultureInfo.InvariantCulture)); this.m_maxlon) this.m_maxlon = elon;
this.m_writer.WriteAttributeString("maxlat", this.m_maxlat }
.ToString(CultureInfo.InvariantCulture)); }

60 02/2009
GPS z .NET Compact Framework

będzie wtedy true), to znalezione współrzęd-


ne porównywane są ze współrzędnymi uzyska- Listing 6. Metody użytkowe klasy Utils
nymi podczas ostatniego wywołania tej meto- using System.Runtime.InteropServices;
dy. Jeśli współrzędne lub wysokość zmieniły using System.IO;
się w zauważalny sposób, to wywoływany jest class Utils {
kolejny callback tym razem z wartością współ- [DllImport("coredll.dll"]
rzędnych. Nieco później przekonamy się, że tą private static extern void SystemIdleTimerReset();
funkcją callback będzie metoda prezentująca [DllImport("coredll.dll"]
współrzędne w kontrolce GUI. Po każdym wy- private static extern IntPtr GetDC(IntPtr hwnd);
wołaniu metoda parseNMEA() wywołuje meto- [DllImport("coredll.dll"]
dę Utils.dontSuspend() aby odwieźć PDA od private static extern int ExtEscape(IntPtr hdc, int nEscape, int cbInput, byte[]
wyłączenia się. lpszInData, int cbOutput, IntPtr lpszOutData);
public static bool isMobile() {
GUI if (Environment.OSVersion.Platform == PlatformID.WinCE)
Ostatnią, choć zdaniem chyba każdego kierow- return true;
nika projektu informatycznego najważniejszą return false;
częścią programu jest interfejs użytkownika. }
W opisywanym tu programie do odczytu GPS public static void dontSuspend() {
sgps.exe interfejs użytkownika to pojedyncza if (Utils.isMobile()) { try {
forma zrealizowania w klasie SerialGPSForm Utils.SystemIdleTimerReset(); } catch(Exception) {} }
pochodnej od System.Windows.Forms.Form }
(porównaj plik SerialGPSForm.cs w załączo- public static void displayOff() {
nych źródłach). W górnej części formy znajdują const int SETPOWERMANAGEMENT = 6147;
się kontrolki typu ComboBox m_ports, m_baud, const int VIDEOPOWEROFF = 4;
m_databits, m_parities i m_stopbits do wy- const int SIZ = 12;
boru i definicji parametrów portu szeregowe- const int DPMSVER = 1;
go, inicjowane nazwami portów szeregowych IntPtr hdc;
dostępnych w systemie (Serial.GetPortNa- byte[] vpm;
mes()), kilkoma częściej używanymi wartościa-
mi prędkości transmisji lub wielkości słowa da- if (Utils.isMobile()) {
nych (m_baud i m_databits) czy wszystki- hdc = Utils.GetDC(IntPtr.Zero); vpm = new byte[SIZ];
mi dostępnymi wartościami enumeracji (jak BitConverter.GetBytes(SIZ).CopyTo(vpm, 0);
w polach m_parities i m_stopbits). W ostat- BitConverter.GetBytes(DPMSVER).CopyTo(vpm, 4);
niej kontrolce combo m_system można wybrać BitConverter.GetBytes(VIDEOPOWEROFF).CopyTo(vpm, 8);
standard używany przy przeliczeniu współrzęd- Utils.ExtEscape(hdc, SETPOWERMANAGEMENT,
nych geograficznych na UTM. Poniżej znajdu- SIZ, vpm, 0, IntPtr.Zero);
ją się pola m_lblutctim, m_lbllat, m_lbllon, }
m_lbleutm, m_lblnutm (Obsługa współrzęd- }
nych UTM została pominięta w przedstawio- public static string Exepath {
nym opisie zarówno klasy SerialGPS jak i for- get {
my SerialGPSForm aby nie powiększać i tak już Uri u;
długich listingów prezentowanych w artykule. string s;
Pełna implementacja klas wraz z pełną obsługą s = Assembly.GetExecutingAssembly().GetName()
UTM znajduje się w załączonym kodzie źródło- .CodeBase;
wym), m_lblalt, wszystkie typu System.Windo u = new Uri(s); if (u.IsFile) s = u.LocalPath;
ws.Forms.Label, służące do wyświetlenia ostat- return s;
nio odebranych z GPS: czasu UTC, współrzęd- }
nych geograficznych oraz wysokości nad pozio- }
mem morza. Program kontroluje się za pomocą public static string getDateFileName(string ext) {
menu Port zawierającego następujące punkty: StringBuilder sb;
string exe, dir, fn;
• Open – otwórz port szeregowy i zacznij exe = Utils.Exepath;
odczyt sentencji NMEA dir = Path.GetDirectoryName(exe);
• Close – zakończ odczyt portu i zamknij go fn = Path.GetFileNameWithoutExtension(exe);
• Log – włącz lub wyłącz zapis współrzęd- sb = new StringBuilder(fn);
nych do pliku gpx. sb.Append(DateTime.Now.ToString("yyyyMMddHHmmss"));
• Display off – wyłącza ekran PDA sb.Append(ext);
• Exit – kończy program. W przeciwieństwie return Path.Combine(dir, sb.ToString());
do Larry'ego Roofa, jednego z autorów [RO- } // getUniqFileName()
OF01], uważam, że aplikacja PDA powinna public static string getExtFileName(string ext) {
mieć menu Exit do ostatecznego jej zakoń- return Path.ChangeExtension(Utils.Exepath, ext);
czenia i np. bardzo brak mi tego menu w } // getExtFileName()
istniejących programach, jak Communica- }
tion Manager czy Active Sync.

www.sdjournal.org 61
Programowanie urządzeń mobilnych

Port szeregowy GPS reprezentowany jest dzięki zdefiniowaniu tej metody wcześniej w tający po naszej aplikacji, w naszym wypad-
przez zmienną prywatną m _ serial typu konstruktorze jako obsługi zdarzenia Closing ku wywołujemy wspomniane metody zamy-
SerialGPS. W metodzie menuOpen _ Click() za pomocą this.Closing += this.onClose. kające obiekty obsługi portu szeregowego i za-
obsługującej menu Port/Open port szeregowy W tej metodzie możemy umieścić kod sprzą- pisu ścieżki.
otwierany jest z parametrami odczytanymi z
kontrolek typu combo. Metoda menuCloce _ Listing 7. Klasa SerialGPS
Click() zamyka port, wywołując metodę
Close() obiektu m _ serial, czyli ostatecznie using System;
wywołując metodę Serial.Close(). using System.Collections;
Włączanie lub wyłączanie zapisu współrzęd- using System.IO.Ports;
nych do pliku gpx zrealizowane zostało w me- public delegate void CoordDelegate(double utcTime,
todzie menuLog_Click() oraz we własności Log double n_lat, double e_long, double altitude);
klasy SerialGPSForm. Podczas rozpoczęcia zapi- public class SerialGPS : Serial {
sywania do pliku, czyli w momencie przypisa- private double[] m_lastcoord;
nia własności Log wartości prawdy, wywoływa- private ReadLineDelegate m_gpscb;
nia jest metoda Gpsx.open(), zakończenie za- private CoordDelegate m_coordcb;
pisu do pliku realizowane jest poprzez wywoła- public SerialGPS() {
nie Gpsx.close(), mające miejsce w momencie int i;
przypisania własności Log wartości fałszu. Dla this.m_coordcb = null;
ułatwienia nazwa pliku gpx generowania jest au- this.m_system = SerialGPS.DEFAULT_SYSTEM;
tomatycznie przez program jako pełna ścieżka this.m_lastcoord = new double[3];
do pliku wykonywalnego (assembly) programu for(i = 0; i < this.m_lastcoord.Length; i++)
uzupełniona o aktualną datę systemową i roz- this.m_lastcoord[i] = 0.0;
szerzenie gpx. W ten sposób wynikowe pliki gpx this.m_gpscb = new ReadLineDelegate(this.parseNMEA);
nie nadpisują się nawzajem przy kolejnym włą- }
czaniu i wyłączaniu zapisu, można je w miarę public CoordDelegate CoordCb {
jednoznacznie zidentyfikować i znaleźć w zna- set {
nym miejscu – tam gdzie znajduje się plik wyko- this.m_coordcb = value;
nywalny naszego programu. Poszukiwanie ścież- }
ki do pliku programu zrealizowano we własności }
Utils.Exepath jako przedstawionej na Listingu private void parseNMEA(ArrayList arr) {
6. Własność CodeBase użyta w metodzie zwra- double tim1, lat1, lon1, alt1;
ca string typu URI (file://katalog/plik.exe) z lo- double tim2, lat2, lon2, alt2;
kalizacją pliku wykonywalnego programu, któ- bool isValid;
ry za pomocą własności System.Uri.LocalPath if (this.m_coordcb != null) {
przekształcany jest na ścieżkę zwykle używa- tim2 = 0.0; lat2 = 0.0; lon2 = 0.0;
ną w systemie (\katalog\plik.exe). Metoda utmn2 = 0.0; utme2 = 0.0; alt2 = 0.0;
Utils.getDateFileName() tworzy nazwę pli- isValid = false;
ku gpx. W metodzie tej pełna ścieżka do pliku foreach(object o in arr) {
wykonywalnego rozkładana jest za pomocą me- if (Utils.fromGGA(out tim1, out lat1, out lon1, out alt1,
tod klasy System.IO.Path na katalog i nazwę o.ToString())) {
bez rozszerzenia. Do nazwy bez rozszerzenia do- tim2 = tim1; lat2 = lat1; lon2 = lon1; alt2 = alt1;
dawany jest łańcuch znaków aktualnej daty oraz isValid = true;
podane rozszerzenie ext i za pomocą metody }
System.IO.Path.Combine() budowana jest po- }
nownie pełna ścieżka do pliku. if (isValid &&
Wyłączenie ekranu w punkcie menu Port/ (Math.Abs(lat2 - this.m_lastcoord[0]) > 0.0002 ||
Display off zrealizowano w metodzie menuDoff_ Math.Abs(lon2 - this.m_lastcoord[1]) > 0.0002 ||
Click() wywołującej przedstawioną na Listin- Math.Abs(alt2 - this.m_lastcoord[3]) > 0.5)) {
gu 6. metodę Utils.displayOff(). Wyłącze- this.m_lastcoord[0] = lat2; this.m_lastcoord[1] = lon2;
nie programu w menu Port/Exit zrealizowano this.m_lastcoord[2] = alt2;
w metodzie menuExit_Click() jako wywoła- this.m_coordcb(tim2, lat2, lon2, alt2);
nie metody System.Windows.Forms.Close() }
. Przed opuszczeniem programu należy jednak Utils.dontSuspend();
koniecznie zamknąć ewentualnie otwarty port }
szeregowy i zakończyć ewentualny zapis do pli- }
ku gpx. Wprawdzie odpowiednie operacje za- public override void Open() {
mknięcia zrealizowane zostały również w de- this.Close();
struktorach klas zarówno SerialGPS jak i Gpsx, this.RdLineCb = this.m_gpscb;
dużo pewniej jest jednak zakończyć operacje base.Open();
samemu niż liczyć na mechanizm odśmieca- this.Read = true;
nia wywołujący nasze destruktory. Tuż przed } // Open()
zamknięciem formy SerialGPSForm wywoły- }
wana jest jej metoda onClose(). Dzieje się tak

62 02/2009
GPS z .NET Compact Framework

Metoda onClose() dokonuje jeszcze zapisu


aktualnej konfiguracji formy. Przy konfigura-
cji chodzi o aktualne ustawienia portu szere-
gowego oraz systemu konwersji na UTM wy-
branego w polach combo na górze formy. Za-
pisując te ustawienia w pliku tuż przed opusz-
czeniem formy i odczytując je z pliku tuż po
jej uruchomieniu (np. w konstruktorze) chro-
nimy użytkownika przed koniecznością wy-
bierania wciąż tych samych wartości po każ-
dym uruchomieniu programu. Zapis i od-
czyt konfiguracji zrealizowany został w meto-
dach SerialGPSForm.writeCfg() (Listing 8.)
i SerialGPSForm.readCfg(). Plik konfigura-
cyjny składa się z szeregu linii tekstu, z których
każda zawiera aktualną wartość kontrolek com-
bo. Dosyć istotna jest obsługa błędów – lub jej
niemal całkowity brak – w obydwu metodach,
które wywoływane tuż na początku lub tuż
przed samym końcem działania aplikacji nie
powinny generować denerwujących komunika-
tów błędów lub – co gorsza – przerywać działa-
nie programu. Możliwymi błędami w przypad-
ku plików konfiguracyjnych może być brak pli-
ku, niemożność utworzenia go z powodu zapeł-
nienia woluminu lub ekskluzywnego dostę-
pu, zły format pliku konfiguracyjnego zapisa-
nego np. przez poprzednią wersję aplikacji itp.
Szczególnie metoda readCfg() powinna zwró-
cić w wypadku błędu w miarę rozsądne warto- Rysunek 2. Kompilacja za pomocą NAnt
ści standardowe, zamiast ubolewać nad wyge-
nerowanym wyjątkiem. Listing 8. Zapis pliku konfiguracyjnego formy
Nazwa pliku konfiguracyjnego zwracana
przez Utils.getExtFileName() (Listing 6.) to using System.IO;
pełna nazwa pliku wykonywalnego programu z private void writeCfg() {
rozszerzeniem zamienionym z .exe na .cfg. StreamWriter s;
Najważniejszą i jednocześnie najtrudniej- s = null;
szą częścią interfejsu użytkownika nasze- try {
go programu było przedstawienie współrzęd- s = new StreamWriter( Utils.getExtFileName(".cfg"));
nych otrzymanych z klasy SerialGPS. Metoda s.WriteLine(this.m_ports.Text);
parseNMEA() wywołuje zdefiniowanego dele- s.WriteLine(this.m_baud.Text);
gata przy każdej poprawnej i nieco różniącej się s.WriteLine(this.m_databits.Text);
od poprzedniej współrzędnej. Takiego delega- s.WriteLine(this.m_parities.Text);
ta implementuje w formie metoda gpscoord() s.WriteLine(this.m_stopbits.Text);
przedstawiona w Listringu i zgłoszona obiekto- s.WriteLine(this.m_system.Text);
wi m_serial za pomocą zastosowanego w kon- }
struktorze klasy wywołania catch(Exception excp) {}
if (s != null) s.Close();
this.m_serial.CoordCb = new CoordDelegate(t }
his.gpscoord);
Listing 9. Metoda SerialGPSForm.gpscoord()
Metoda gpscoord() zapisuje otrzymane private void gpscoord(double utcTime, double n_lat, double e_long, double altitude) {
współrzędne do pliku gpx, jeśli za pomocą me- try {
nu Port/Log uaktywniono taki zapis, następ- this.m_utctim = utcTime; this.m_alt = altitude;
nie zapamiętuje otrzymane współrzędne w this.m_nlat = n_lat; this.m_elon = e_long;
zmiennych prywatnych klasy m _ nlat , m _ if (this.Log) {
elon , m _ utctim i m _ alt i ostatecznie za po- this.m_gpsx.addLocation(n_lat, e_long, altitude);
mocą metody Form.Invoke() wywołuje kolej- }
ną metodę do wyświetlenia parametrów za- this.Invoke(this.m_gpscoordcb);
pamiętanych w zmiennych prywatnych kla- }
sy (Listing 11.). catch(Exception excp) {}
Dlaczego to tak skomplikowane? Dlaczego }
nie ustawimy pól m_lblutctim, m_lbllat, m_ }
lbllon i m_lblalt już w metodzie gpscoord(),

www.sdjournal.org 63
Programowanie urządzeń mobilnych

tylko zadajemy sobie trud wywołania jeszcze ku prób wywołań metody Join(int32) z po- tencji CGA. Wywołanie utm.exe (mono
jednej metody, i to nie bezpośrednio tylko za daniem maksymalnego czasu oczekiwania za- utm.exe na systemach wyposażonych w
pośrednictwem Form.Invoke()? Otóż imple- miast jednego blokującego wywołania Join(). mono) podaje bliższe informacje o sposo-
mentacja Windows.Forms ma spore problemy bie użycia programu.
z kodem wielowątkowym, a w tym wypadku Kompilacja kodu • psrf103.exe – również aplikacja konsolo-
mamy do czynienia z dwoma wątkami. O ile Z plików źródłowych dołączonych do artykułu wa do generacji sentencji PSRF103, ro-
forma SerialGPSForm stworzona została i ob- tworzone są następujące aplikacje: zumianych przez niektóre odmiany
sługiwana jest w wątku głównym aplikacji, to chip-ów SiRF i służących do sterowania
metoda callback gpscoord() wywoływana jest • sg.exe – program oparty o System.Win- ilością i częstotliwością generowanych
z wątku odczytującego port szeregowy GPS i dows.Forms pokazujący wszystkie in- przez chip sentencji. Niestety, mój tele-
stworzonego we własności Serial.Read. Mo- formacje pojawiające się na porcie szere- fon skutecznie odmawiał przyjęcia ja-
dyfikacja wartości kontrolek formy w wątku gowym. Może być np. użyty do podglą- kiejkolwiek informacji na porcie szere-
innym niż ten obsługujący formę kończy się du sentencji NMEA generowanych przez gowym COM4 i niezależnie od wysła-
w najlepszym wypadku wygenerowaniem wy- chip GPS. nego łańcucha PSRF103 generował tą sa-
jątku. Opisane jest to np. w dokumentacji wła- • scpy.exe – kopiuje dane z jednego portu mą ogromną ilość informacji, dlatego po-
sności Form.InvokeRequired, pod adresem szeregowego na drugi. Np. kopiując z por- stanowiłem nie zajmować się tym proble-
[WEB12]. Jeśli InvokeRequired zwróci war- tu COM4 na COM8 na HTC 3300 moż- mem na łamach artykułu. Zainteresowa-
tość true, a w naszym wypadku zawsze zwró- na przekierować strumień GPS na port nych odsyłam do przestudiowania zwar-
ci, to jedyną możliwością przypisania naszych połączenia USB między komputerem de- tości metod Utils.psrf103(), Utils.nme-
współrzędnych kontrolkom formy jest wywo- sktop i PDA i analizować ten strumień na aChksum() oraz dokumentacji chip-ów
łanie metody Invoke(). Invoke() sprawia jesz- nieco wydajniejszym i wygodniejszym w pod adresem [WEB04]
cze dodatkowy problem: jest to operacja bloku- obsłudze komputerze PC. • gpsx.exe – to również konsolowa aplika-
jąca i bardzo łatwo zakleszczająca się z wywoła- • utm.exe – aplikacja konsolowa przeznaczo- cja do zamiany plików typu flat na format
niem np. Thread.Join() zastosowanym w im- na dla komputerów desktop do testowania gpsx.
plementacji własności Serial.Read(). Rozwią- konwersji między współrzędnymi geogra- • sgps.exe – to nareszcie opisywana w arty-
zaniem problemu może być zastosowanie kil- ficznymi i UTM oraz do testowania sen- kule aplikacja do obsługi GPS.

Listing 10. Skrypt do kompilacji programu sgps.exe Przed kompilacją programu konieczne jest
zainstalowanie .NET Compact Framework
@ECHO OFF 2.0 Redistributable (NETCFSetupv2.msi,
SETLOCAL http://downloads.microsoft.com). W przeciw-
IF "%NETCF%" == "" SET NETCF=%ProgramFiles%\Microsoft.NET\SDK\CompactFramework nym razie program skompiluje się jako pro-
IF "%NETFK%" == "" SET NETFK=%SystemRoot%\Microsoft.NET\Framework\v2.0.50727 gram dla komputera desktop i nie będzie
IF "%CSC%" == "" SET CSC=%NETFK%\csc.exe działał na urządzeniach PDA. Wprawdzie
SET CSCOPTS=/nologo /debug /noconfig /nostdlib /target:exe /win32icon:ico\Marta2.ico aplikacje typu .NET są przenośne i powin-
/keyfile:serial.snk ny działać praktycznie z każdym interpre-
SET REFERENCE=/reference:"%NETCF%\mscorlib.dll" terem, jednak zastosowanie tzw. mocnych
SET REFERENCE=%REFERENCE% /reference:"%NETCF%\System.dll" nazw i wymaganie ich podczas uruchomie-
SET REFERENCE=%REFERENCE% /reference:"%NETCF%\System.Drawing.dll" nia skutecznie powstrzymuje np. kod skom-
SET REFERENCE=%REFERENCE% /reference:"%NETCF%\System.Data.dll" pilowany w środowisku mono przed uru-
SET REFERENCE=%REFERENCE% /reference:"%NETCF%\System.Windows.Forms.dll" chomieniem go na urządzeniu przenośnym.
SET REFERENCE=%REFERENCE% /reference:"%NETCF%\System.Xml.dll" Można sobie z tym wprawdzie poradzić po-
SET RESOURCE=/resource:ico\Marta1.ico,Marta1.ico przez podmianę klucza publicznego moc-
SET RESOURCE=%RESOURCE% /resource:ico\Marta2.ico,Marta2.ico nych nazw, patrz również [WEB13]. Jeśli jed-
SET SOURCE= AssemblyInfo.cs Gpsx.cs Serial.cs SerialGPS.cs SerialGPSForm.cs nak nie jesteśmy zdani na kompilowanie ko-
SerialGPSGUI.cs Utils.cs du w środowisku Mono czy PortableNET i
echo "%CSC%" %CSCOPTS% /out:sgps.exe %REFERENCE% %RESOURCE% %SOURCE% mamy do dyspozycji zarówno system opera-
"%CSC%" %CSCOPTS% /out:sgps.exe %REFERENCE% %RESOURCE% %SOURCE% cyjny, jak i kompilator Microsoftu, to zasto-
ENDLOCAL sowanie .NET Compact Framework Redi-
stributable będzie miało jeszcze jedną ogrom-
Listing 11. Metoda SerialGPSForm.updGPSControls() ną zaletę: już w czasie kompilacji zostaniemy
private void updGPSControls(object sender, EventArgs e) { poinformowani o nieprzemyślanym zastoso-
try { waniu klasy, własności lub metody, obecnej
this.m_lblutctim.Text = this.m_utctim.ToString("00:00:00.000"); wprawdzie w .NET Framework dla kompu-
this.m_lbllat.Text = this.m_nlat < 0? (-this.m_n_lat).ToString("00.0000S"): terów desktop, ale w związku z ograniczony-
this.m_nlat.ToString("00.0000N"); mi zasobami PDA nie zaimplementowanej w
this.m_lbllon.Text = this.m_elon < 0? (-this.m_elon).ToString("00.0000W"): .NET Compact Framework. Metody zaimple-
this.m_elon.ToString("00.0000E"); mentowane w NETCF zaznaczone są w do-
this.m_lblalt.Text = this.m_alt.ToString("0.0m"); kumentacji MSDN małym symbolem telefo-
} nu komórkowego, jeśli jednak pisze się z pa-
catch(Exception excp) {} mięci lub na podstawie książkowych przykła-
} dów, łatwo zagalopować się i zastosować kod
this.m_gpscoordcb = new EventHandler(this.updGPSControls); niedopuszczalny dla małych urządzeń prze-
nośnych. Bez współpracy kompilatora tego

64 02/2009
GPS z .NET Compact Framework

typu błąd mógłby objawić się dopiero po la- polecenia PUSHD skrypt najpierw zmienia ka- Użytkownicy systemów uniksowych mo-
tach, i to np. na PDA naszego najbardziej wy- talog do katalogu źródłowego i sprawdza, czy gą zdefiniować połączenie PPP między kom-
magającego klienta. są ustawione zmienne NETCF (katalog .NET puterem desktop a PDA, tak jak to opisano w
Do źródeł programów dołączony jest plik Compact Framework), NETFK (.NET Frame- [WEB16], przynajmniej, dopóki projekt Syn-
nant.build, plik konfiguracyjny dla progra- work) i CSC (ścieżka do kompilatora). Jeśli nie, CE jest jeszcze w powijakach. Po nawiązaniu
mu NAnt ([WEB14]), narzędzia do sterowa- to ustawia je na standardowe wartości, które na- połączenia IP między komputerem uniksowym
nia kompilacją programów .NET. Po zainsta- leży zapewne nieco dostosować w zależności od i PDA można transferować pliki choćby za po-
lowaniu Nant-a, .NET Compackt Framework aktualnej konfiguracji systemu. Następnie wy- mocą FTP, HTTP czy samby, konfigurując od-
i ustawieniu zmiennej środowiskowej NETCF wołuje kompilator wraz ze wszystkimi źródła- powiedni serwis na komputerze UNIX.
na katalog zainstalowanego NETCF wywołanie mi, zasobami i parametrami linii poleceń. Po Ostatni problem, z którym musimy sobie
w katalogu źródeł powinno stworzyć nam bez- udanym wywołaniu w katalogu skryptu powi- poradzić, jest wybranie właściwego portu sze-
błędnie wszystkie wymienione pliki exe. Wy- nien pojawić się plik sgps.exe. regowego GPS po uruchomieniu aplikacji. Nie-
wołanie nant doc dodatkowo stworzy w kata- stety, nie istnieje jednoznaczna procedura po-
logu doc dokumentację HTML z komentarzy Uruchomienie programu na PDA zwalająca określić, który z dostępnych – z re-
umieszczonych w kodzie źródłowym. Aby uruchomić nasze programy na PDA, nale- guły – około dziesięciu portów szeregowych
Z kompilacją można sobie poradzić również ży je najpierw tam przekopiować. Użytkowni- na PDA jest portem GPS. Oczywiście możemy
bez Nant-a. Oprócz .NET Compact Framework cy Microsoft Windows powinni w tym celu za- po kolei otwierać wszystkie porty, np. korzysta-
potrzebujemy jedynie kompilator C#, który fir- instalować aplikację Microsoft Active Sync al- jąc z aplikacji sg.exe. Chip GPS po otwarciu je-
ma Microsoft dostarcza wraz z .NET Frame- bo dostarczaną wraz z PDA na CD towarzy- go portu powinien zacząć praktycznie natych-
work. Można zatem spokojnie założyć, że kom- szącym dokumentacji do urządzenia albo do- miast wysyłać sentencje NMEA. Jeśli próba
pilator C# znajduje się praktycznie na każdym stępną w strefie download serwisu www.micro- otwarcia portu się nie powiedzie lub jeśli w cią-
komputerze wyposażonym w średnio nawet ak- soft.com. Po podłączeniu, zdefiniowaniu i zsyn- gu maksymalnie kilku sekund na ekranie sg.exe
tualny system MS Windows, w dosyć trudnym chronizowaniu się PDA z komputerem może- nie pojawi się łańcuch znaków wyglądający na
do znalezienia katalogu my dostać się do systemu plików PDA za pomo- sentencję NMEA, to oznacza, że otworzyliśmy
%SystemRoot%\Microsoft.NET\Framework\ cą dołączonego do AcitveSync specjalnego eks- niewłaściwy port.
v2.0.50727. ploratora plików. Na moim WHTC3300 problem ten roz-
Listing 10. przedstawia przykład skryptu Za pomocą przesuwania lub kopiowania wiązał za mnie sam system operacyjny telefo-
compile-sgps.cmd kompilującego aplikację i wklejania możemy przenieść skompilowa- nu. Po prostu nie mogę bezpośrednio otwo-
sgps.exe: ny wcześniej plik naszej aplikacji z kompu- rzyć portu szeregowego GPS, mogę dostać się
Proszę zwrócić uwagę na opcje /noconfig tera PC na PDA. Na PDA możemy urucho- do niego tylko za pomocą zainstalowanego ste-
i /nostdlib wywołania kompilatora csc.exe. mić nasz program, klikając na niego na ekra- rownika GPSID. Wprawdzie na początku pi-
Dzięki nim program nie będzie konsolidowa- nie PDA w eksploratorze plików. [ROOF01] sałem, że API GPSID nie funkcjonuje na mo-
ny ze standardowymi bibliotekami .NET 2.0, w rozdziale 21 podaje opis tworzenia własne- im telefonie jak należy i w ciągu kilku stron
zamiast nich zostaną dołączone wymienione go pliku instalacyjnego cab, wraz ze skrótami artykułu ten stan nie uległ zmianie. GPSID
opcjami /reference biblioteki .NET Compact w \Windows\Start Menu\Programs. Zaintere- oprócz niedziałającej API kopiuje jeszcze da-
Framework. sowanych odsyłam do książki lub polecam za- ne z portu GPS na tzw. programowy port sze-
Skrypt powinien być umieszczony w tym sa- poznanie się z programem CAB Wizard pod ad- regowy. Ta funkcja sterownika GPSID akurat
mym katalogu, co pliki źródłowe. Za pomocą resem [WEB15]. działa bez zarzutu. To poprzez taki programo-
wy port szeregowy opisywany w artykule pro-
gram pobierał sentencje NMEA. Z moim wy-
W Sieci danym przez niemiecką się komórkową T-Mo-
• WEB01: WM5 to WM6 GPSID Problem on HTC P3300 – http://www.eggheadcafe.com/software/ bile HTC3300 dostarczany jest program kon-
aspnet/31057319/wm5-to-wm6-gpsid-problem.aspx; figuracyjny GPSID, który można znaleźć pod
• WEB02: Native Mobile – http://nativemobile.blogspot.com/2007_01_01_archive.html; Einstellungen/System/Externes GPS. W zakładce
• WEB03: National Marine Electronics Association (NMEA) – http://www.nmea.org; Programme nazwa portu programowego zdefi-
• WEB04: Dokumentacja SiRF – http://gpsd.berlios.de/vendor-docs/sirf/;
niowana jest w polu GPS-Programmanschluss.
• WEB05: NMEA 0183 – http://gpsd.berlios.de/NMEA.txt;
• WEB06: Converting UTM to Latitude and Longitude (Or Vice Versa) – http://www.uwgb.edu/ Standardowo jest to COM4.
DutchS/UsefulData/UTMFormulas.HTM; Kilka dobrych sposobów rozpoznania,
• WEB07: Spreadsheet For UTM Conversion – http://www.uwgb.edu/DutchS/UsefulData/UTM- który port szeregowy PDA do czego słu-
Conversions1.xls; ży, można znaleźć w kodach źródłowych
• WEB08: GPX: The GPS exchange format – http://www.topografix.com/gpx.asp; programu GPSProxy ([WEB17]). W pli-
• WEB09: SystemIdleTimerReset – http://msdn.microsoft.com/en-us/library/aa930260.aspx;
• WEB10: Platform Invoke Tutorial – http://msdn.microsoft.com/en-us/library/aa288468.aspx; ku GPSProxy/FormComPortSelect.cs w meto-
• WEB11: ExtEscape w pinvoke.net – http://www.pinvoke.net/default.aspx/coredll/ dzie EnumerateComPorts() autorzy programu
ExtEscape.html; przeszukują klucze Drivers\Active i Software\
• ROOF01: Larry Roof, Dan Fergus, , 2003 Microsoft\Bluetooth\Serial\Ports w celu zna-
• WEB12: InvokeRequired – http://msdn.microsoft.com/de-de/library/system.windows.forms.con- lezienia jakiegokolwiek opisu portu lub zna-
trol.invokerequired.aspx;
lezieniu portów Bluetooth. Rejestr Windows
• WEB13: Mono and the Compact Framework in Love, Part Two – http://evain.net/blog/articles/
2006/03/31/mono-and-the-compact-framework-in-love-part-two; CE możemy przeglądać za pomocą programu
• WEB14: NAnt - A .NET Build Tool – http://nant.sourceforge.net; PHM Registry Editor ([WEB18]).
• WEB15: CAB Wizard – http://msdn.microsoft.com/en-us/library/aa924359.aspx;
• WEB16: Chris De Herrera's Windows CE Website – http://www.poctepcfaq.com/wce/linux-serial.htm DANIEL STOIŃSKI
• WEB17: GPS Proxy – http://sourceforge.net/projects/gpsproxy/ Informatyk w firmie Nagler & Company
• WEB18: PHM Registry Editor – http://www.phm.lu/Products/PocketPC/RegEdit/
(http://www.nagler-company.com).
Kontakt z autorem: stoyac@gmx.de.

www.sdjournal.org 65
Programowanie urządzeń mobilnych

Android vs. Java ME


Platforma Sun dla urządzeń mobilnych istnieje już od dłuższego czasu.
Podbiła rynek dzięki implementacji na wielu urządzeniach różnych
producentów (obecnie istnieje około 2000 różnych typów modeli z Java
ME). Główną ideą Sun było zapewnienie uniwersalności i jednolitości
aplikacji wytworzonych na platformę Java ME.
systemie operacyjnym i własnej implemen-
Dowiesz się: Powinieneś wiedzieć: tacji maszyny wirtualnej. Wykorzystuje jako
• Podstawowych informacji o platformach Java- • Podstawowa znajomość języka Java; język programowania Javę w bogatszym ze-
Me oraz Android; • Ogólna filozofia technologii Java. stawie i o dziwo nie wprowadza tak restryk-
• Jakie różnice można dostrzec w architekturach cyjnych ograniczeń, jak w Java ME (maksy-
porównywanych technologii. malny rozmiar pliku jar czy heap). Oczy-
wiście chodzi tutaj o fenomen dziecka Go-
ogle, czyli Android. Niedawno ukazało się
od dostawcy urządzenia. Pociągało to za so- pierwsze urządzenie a aplikacje na platfor-
bą rozdzielenie kodów źródłowych oraz zaso- mę powstawały na długo przed jego premie-
Poziom trudności bów (np. różne rozdzielczości obrazków) na rą. Czy rzeczywiście platforma Android jest
określone platformy. Historia prowadzi do lepsza od Java ME w obecnych wersjach? Sun
jednego wniosku, że stworzenie jednej apli- co prawda zapowiada wprowadzenie profi-
kacji na wszystkie urządzenia sprawiało kło- lu MIDP 3, który zwiększa potencjał apli-

Z
aczęło się od konfiguracji CLDC oraz poty. W obecnej chwili większość atrakcyj- kacji. Jednak Google swoje idee zrealizowa-
profilu MIDP 1.0, które wprowadza- nych aplikacji wymaga procesu portowania. ło już na urządzeniu a kolejne są przygoto-
ły podstawowy zbiór interfejsów i Zazwyczaj na początku tworzy się aplikację wywane. Czy Sun nie spóźni się z premierą
klas dostępnych w tej wersji maszyny KVM na grupę podobnych technologicznie urzą- swojego najnowszego produktu i nie przegra
(ang. Kilobyte Virtual Machine). Po drodze dzeń. Następnie jest porting, czyli przeniesie- wojny na starcie? Jakie możliwości obecnych
dochodziły opcjonalne biblioteki API roz- nie aplikacji na inne urządzenia. Jednak nie i przyszłych wersji Java ME są konkurencyjne
szerzające możliwości podstawowej maszyny rozwiązuje to problemu, że pewne operacje w porównaniu do Android? Na pierwsze py-
wirtualnej. Dzięki nim można było przykła- mogą być wykonywane tylko na ograniczonej tanie odpowiedź przyniesie życie i pokaże, w
dowo uzyskać dostęp do aparatu fotograficz- grupie urządzeń, która akurat wspiera daną którym kierunku podąży społeczeństwo. Na
nego, wysyłać dane przez SMS lub Bluetooth. funkcjonalność. ostatnie pytanie postaram się odpowiedzieć
Jednak model sandbox maszyny wirtualnej Z tego względu Sun wprowadził także w serii artykułów, porównując wymienione
okazał się dość odporny na zmiany. Rozsze- mocniejszą platformę Java ME konfiguracji platformy z punktu widzenia ich możliwo-
rzenie jej o pewne funkcjonalności API nie CDC. Jednak nie zdobyła ona takiej popu- ści technicznych. Niniejszy artykuł stanowi
było możliwe. Jedynym rozwiązaniem by- larności jak CLDC. Zbiór klas był bogatszy a wprowadzenie do cyklu artykułów badają-
ła zmiana modelu telefonu, w którym po- możliwości bliskie maszynie wirtualnej pra- cych Java ME oraz Android na kilku pozio-
żądane cechy były dostępne. Nagromadze- cującej na komputerach osobistych JRE. Pro- mach. Poczynając od podstaw, czyli filozofii
nie opcjonalnych bibliotek spowodowało, że blem braku pewnych funkcjonalności został technologii, w której skupiać się będziemy
pewien ich zakres został wciągnięty w nowy rozwiązany przez możliwość rozszerzenia na cechach i architekturze platform. Zosta-
profil MIDP 2. Postęp technologiczny spo- maszyny wirtualnej przez interfejs JNI. Gdy nie wzięta pod uwagę anatomia aplikacji, aby
wodował, że urządzenia miały coraz więk- brakowało interfejsu API, na przykład dla programista mógł zrozumieć zachowanie się
szą moc oraz nowe cechy. Z tego względu po- bluetootha, to można było dopisać bibliotekę aplikacji w określonych sytuacjach.
wstawały kolejne opcjonalne biblioteki wyda- w języku natywnym. Co prawda przywiązy- W kolejnych artykułach przechodzić będzie-
wane także przez producentów tylko dla ich wało to aplikację do konkretnego urządzenia my do zagadnień praktycznych i zaczniemy od
modeli telefonów. Producenci implemento- i bez portingu na inne urządzenie się nie oby- szkieletu aplikacji. Krótkie testy oraz bench-
wali maszyny wirtualne, co niejednokrot- ło. Jednak w większości przypadków nie by- marki urządzeń przedstawią nam krótki zarys
nie prowadziło do odmiennego zachowania liśmy ograniczeni do zbioru interfejsów API możliwości obliczeniowych platform. Zbada-
się aplikacji w pewnych sytuacjach. Docho- dostarczonych przez producentów. ny zostanie dostęp do kodów źródłowych, do-
dziły do tego także różne ograniczenia - na Konkurencja jednak nie spała i wkroczyła kumentacji oraz ograniczeń wynikających z li-
wielkość rozmiaru aplikacji czy wykorzysta- na rynek z platformą, która na pierwszy rzut cencji. Wsparcie ze strony portali developer-
nie pamięci sterty, które oczywiście zależało oka wydaje się bardzo atrakcyjna. Oparta na skich oraz system dystrybucji oprogramowania

66 02/2009
Android vs. Java ME

ułatwiający rozpowszechnianie aplikacji będzie oraz wyniki przechowywane są w specjalnym jest różna w zależności od zastosowań, z re-
także celem porównania. Opisane zostaną rów- obszarze pamięci zwanym stosem. Dla pro- guły większa niż 8 poziomów.
nież dotychczasowe problemy, które zostały na- gramu dostępny jest jedynie szczyt struktu- Natomiast Android wykorzystuje maszy-
potkane w Java ME, a także odpowiem na pyta- ry stosu. Tylko ze szczytu można pobrać war- nę wirtualną opartą na rejestrach . Istnieje kil-
nie czy udało się rozwiązać je w Google Andro- tość lub na nim ją położyć. Głębokość stosu ka powodów, dla których ten model został wy-
id. Artykuły będą się skupiały na porównaniu
na kilku obszarach:

• Interfejs użytkownika;
• Bezpieczeństwo;
• Multimedia;
• Komunikacja;
• Wybrane biblioteki API.

Oczywiście w każdym artykule, w zależno-


ści od zastosowań, zostanie opisane, w jaki
sposób wykorzystać dostarczone narzędzia.
W celu zapewnienia odpowiedniej jakości
oprogramowania zostaną zaprezentowane
biblioteki oraz aplikacje, które ułatwią zada-
nia działom QA (ang. quality assurance).

Filozofia technologii
Android jest platformą dla urządzeń mobil-
nych zawierającą system operacyjny, maszy-
nę wirtualną oraz zbiór podstawowych aplika-
cji. Programiści mogą tworzyć aplikacje głów-
nie w języku Java, wykorzystując dostarczone
przez Google SDK. Natomiast według Sun Ja- Rysunek 1. Architektura platformy Android (http://code.google.com/android/what-is-android.html)
va ME zapewnia solidne oraz elastyczne śro-
dowisko dla aplikacji działających na urządze- Listing 1. Klasa Activity
niach przenośnych. Dostarczaniem maszyny
wirtualnej oraz systemu operacyjnego zajmu- public class Activity extends ApplicationContext {
ją się producenci urządzeń mobilnych sugeru- protected void onCreate(Bundle savedInstanceState);
jąc się specyfikacją Suna. Aplikacje działają w protected void onStart();
zamkniętym środowisku zwanym piaskownicą
(ang. sandbox). Mają w niej ograniczony dostęp protected void onRestart();
do zasobów urządzenia, które mogą stanowić protected void onResume();
potencjalne zagrożenie. Zatem przyjrzyjmy się protected void onPause();
bliżej które z podejść okazało się lepsze oraz w protected void onStop();
których miejscach są do siebie podobne. protected void onDestroy();
}
System operacyjny
Google Android pracuje na własnym systemie Listing 2. Klasa MIDletu
operacyjnym Linux (kernel 2.6), który odpo- public class BasicMIDlet extends MIDlet {
wiada za bezpieczeństwo, zarządzanie pamię- public BasicMIDlet(){
cią oraz procesami, sieć i dostęp do sterowni- //Konstruktor
ków urządzeń. Stanowi warstwę dostępu po- }
między sprzętem a resztą oprogramowania.
Natomiast w Java ME dostarczaniem systemu protected void destroyApp( boolean unconditional )
operacyjnego zajmują się producenci urządzeń. throws MIDletStateChangeException {
Nie ma jasno określonej (tak jak to ma miejsce
w Android) specyfikacji określającej wymaga- }
nia dla systemu. Zazwyczaj jest tak, że dostaw-
ca urządzenia wprowadza swój własny system, protected void pauseApp(){
na którym pracuje maszyna wirtualna Java ME.
Istnieją jednak systemy operacyjne takie jak }
Symbian lub Windows Mobile, które dostęp-
ne są na wielu modelach urządzeń niezależnie protected void startApp()
od dostawcy. throws MIDletStateChangeException {

Maszyna wirtualna }
Większość wirtualnych maszyn jak Java VM, }
Microsoft .Net bazuje na stosie. Argumenty

www.sdjournal.org 67
Programowanie urządzeń mobilnych

brany dla Dalvika. Wcześniejsza optymalizacja Maszyny KVM dostarczane przez produ- trudno jest powiedzieć nad swobodą inter-
kodu, co w ograniczonych środowiskach takich centów są implementacją, która jest zgodna pretacji specyfikacji do implementacji syste-
jak urządzenia mobilne jest rozwiązaniem ko- ze specyfikacją Suna. Dodatkowo producenci mu, ponieważ jest jedno urządzenie. Po wie-
rzystnym. Argumenty oraz wyniki przechowy- w ramach własnej implementacji dodają bo- lu doświadczeniach udało się zaobserwować,
wane są w rejestrach, a rzadziej w pamięci da- nusowe biblioteki. Wynika to z jednej strony że pewne bugi, które występują na emulato-
nych. Są zaszyte wewnątrz maszyny wirtualnej, z tego, że każdy dostawca urządzenia posia- rze, obecne są także na urządzeniu. Zatem
które wspierają obliczenia elementarne. Ich da swoje własne oryginalne cechy i chce, aby przynajmniej starają się odwzorować faktycz-
liczba jest zazwyczaj niewielka od 4 do 32. były prawidłowo obsłużone. Z drugiej strony ny stan postępu prac developerskich Google.
Głębsza analiza działania wymienionych Sun bardzo wolno wprowadza nowe standar- Z jednej strony to źle, że są błędy z drugiej
maszyn doprowadza do wniosku, że maszy- dy w Java Me i niecierpliwość dostawców po- dobrze, że producenci na własną rękę ich nie
na bazująca na rejestrach pozwala na szybszy woduje, że wydają oni własne. Istnieją maszy- naprawiają. Jak ogólnie wiadomo, gdy każdy
czas uruchamiania kosztem większego roz- ny, które są wbudowane w system operacyjny doda coś swojego, to później można się spo-
miaru kodu skompilowanych programów. Na lub istnieją jako niezależne aplikacje tego sys- dziewać różnych zachowań systemu. Pociąga
maszynie Suna operandy do operacji prze- temu. Do wbudowanych maszyn w system to za sobą rozdzielenie kodu lub użycie pre-
chowywane są na stosie. Zatem nie jest wy- operacyjny producenta można zaliczyć urzą- procesora, dokładnie jak to ma miejsce w Ja-
magane ich wyspecyfikowanie jako argumen- dzenia z systemem Symbian OS czy Motoro- va ME. Dużym plusem jest wgląd w kod źró-
tów funkcji. Natomiast w maszynie opartej la Linux. Więcej informacji na temat emula- dłowy zarówno maszyny wirtualnej, jak i sa-
na rejestrach wymagane jest podanie operan- torów i wsparcia programistów można zna- mego systemu operacyjnego.
dów razem z instrukcją. Powoduje to przy- leźć na portalach developerskich. Natomiast Każda aplikacja w Androidzie zostaje uru-
rost wielkości kodu. Na podstawie artyku- jako dołączaną aplikację można tutaj zaliczyć chomiona w swoim własnym procesie oraz
łu Virtual Machine Showdown: Stack Versus system operacyjny Windows Mobile i jego instancji maszyny wirtualnej. Architektura
Registers dostępnego na stronie internetowej maszyny wirtualne (patrz ramka W Sieci). Dalvika umożliwia efektywne uruchamianie
(patrz ramka W Sieci) maszyna ta wymaga Google natomiast zintegrował swoją ma- wielu maszyn wirtualnych. Nasuwa się pyta-
47% mniej uruchomionych instrukcji. Efek- szynę wirtualną z system operacyjnym Li- nie, dlaczego nie wykorzystano architektury
tem tego jest fakt, że maszyna działa 26,5% nux. Co prawda wykorzystuje ona jako ję- OSGi, która pozwala na uruchamianie wielu
szybciej kosztem przyrostu około 25% kodu. zyk programowania Java i na tym całe po- aplikacji w jednej maszynie wirtualnej. Jedną
Oczywiście w artykule bazowano na własnej wiązanie się kończy. Ponieważ implementa- z odpowiedzi może być zapewnienie stabil-
implementacji maszyn wirtualnych i przed- cja maszyny wirtualnej jest całkowicie nie- ności całego systemu. W OSGi w przypadku
stawione podejście jest czysto naukowe. Dla zależna od JVM Suna. Wynika to z licen- krytycznego błędu w jednej z aplikacji nastą-
porównania wydajności maszyn wirtualnych cji Open Source, na której bazuje Android. pi zamknięcie całej maszyny wirtualnej z in-
w kolejnym artykule zostaną zaprezentowa- Chcąc uwolnić się od restrykcji nałożonych nymi aplikacjami. Model Dalvika chroni stan
ne wyniki testów benchmark, które przepro- przez Sun, zaimplementowali własną ma- pozostałych aplikacji i odseparowuje je od
wadziłem na kilku urządzeniach. Najpierw szynę wirtualną. Wprowadzili także możli- siebie. Należy zwrócić w tym miejscu uwagę,
jednak przyjrzymy się innym cechom wymie- wość obsługi paczek opcjonalnych, która po- że pomiędzy aplikacjami istnieje mechanizm
nionych technologii, aby lepiej zinterpreto- dobnie jak w Java ME będzie uzależniona od wymiany komunikatów, który zostanie opi-
wać uzyskane rezultaty. dobrej woli producentów. W obecnej chwili sany w dalszej części tego artykułu.
Natomiast w Java ME zależy to od rodza-
ju urządzenia, na którym działa. Najczęściej,
��������� ��������� ������������� ������ ����� jeżeli jest to system operacyjny taki jak Sym-
���������� �������� ���������������� ������� �����
��������� ��������� ���������������� �����������
bian lub Windows Mobile to pozwala na uru-
���� chamianie różnych aplikacji w wielu instan-
cjach maszyny wirtualnej. W pozostałych by-
�������� wa różnie i czasami zdarzało się, że mogła
�������� pracować tylko jedna instancja maszyny wir-
�������� tualnej i jedna aplikacja. Aplikacje z tzw. ze-
��������
��������
stawu MIDletów mogą pracować tylko w jed-
�������� nej maszynie wirtualnej (obecnego profilu
MIDP 2).
������ ������ ����������������
��������� ��������� Architektura systemów
���������� �������� �������� Android został podzielony na kilka warstw,
������� ��������
�������
������
����� poczynając od systemu operacyjnego. W
������ ������� ��������
tej najniższej warstwie znajdują się przede
wszystkim sterowniki do urządzeń takich jak
������������������ ���� ekran, kamera, klawiatura, WiFi, audio itd.
Następnie jest maszyna wirtualna oraz zbiór
���� bibliotek C/C++ podzielonych w zależności
��� ���� ����
od zastosowania . Powyżej znajdują się kom-
���� ��� ��� ��� ������� ponenty szkieletu aplikacji, przez które pro-
gramiści mogą odwoływać się do opisanych
wyżej natywnych bibliotek. Końcowym przy-
�������������������������������������� stankiem są już same aplikacje, które wyko-
rzystują infrastrukturę dostarczonych kom-
Rysunek 2. Architektura platformy Java ME (http://java.sun.com/javame/technology/index.jsp) ponentów.

68 02/2009
Android vs. Java ME

Szerzej widoczne komponenty oraz biblio-


Listing 3. Standardowa klasa aplikacji Personal Profile
teki atrakcyjne z punktu widzenia tworzenia
aplikacji zostaną opisane w kolejnych artyku- public class MyClass {
łach (Rysunek 1.). public static void main( String[] args ){
Jedynym urządzeniem, które ukazało się
pod koniec października 2008 jest HTC Dre- }
am G1 w sieci T-Mobile (patrz ramka W Sie- }
ci). Producent nie określa ograniczeń, jak to
miało miejsce w Java ME, co do wykorzysta- Listing 4. Aplet
nia pamięci. Zatem przypuszczać należy, że <applet code="BasicApplet.class"
do dyspozycji mamy całą fizyczną jej ilość. width="300" height="200">
Został także stworzony specjalny model tele- </applet>
fonu dla programistów. Posiada on odbloko- public class BasicApplet extends java.applet.Applet {
wany SIM oraz program rozruchowy, który public BasicApplet(){
umożliwia uruchamianie innych wersji An-
droida (patrz ramka W Sieci). }
W Java ME jak można zobaczyć na Rysun-
ku 2., w najniższej warstwie znajduje się ma- public void init(){
szyna wirtualna. KVM dla urządzeń słab-
szych oraz JVM dla mocniejszych. System }
operacyjny jak to opisano wcześniej, jest do-
starczany przez producentów konkretne- public void start(){
go urządzenia. Następnie znajduje się rdzeń
każdej maszyny wirtualnej, konfiguracja oraz }
profile, które określają podstawowy zbiór in-
terfejsów oraz klas. Opcjonalne biblioteki są public void stop(){
dodatkami, których obecność zależy również
od producenta. }
Ze względu na masę urządzeń, u których
opcjonalne biblioteki były lub nie, Sun zde- public void destroy(){
cydował się wprowadzić kategorie. Katego-
rie zgrupowały pewne opcjonalne biblioteki }
i zostały oznaczone odpowiednią specyfika- }
cją JSR. Z tego względu grupuje się urządze-
nia ze względu na wersję CLDC (1.0 lub 1.1) Listing 5. Klasa Xlet
lub MIDP (1.0 lub 2.x). Kolejną grupę JTWI import javax.microedition.xlet.*;
(Java Technology for the Wireless Industry),
które w minimalnej wersji zawierają następu- public class BasicXlet implements Xlet {
jące specyfikacje CLDC 1.0 (JSR 30), MIDP private XletContext context;
2.0 (JSR 118), and WMA 1.1 (JSR 120),
CLDC 1.1 (JRS 139) and MMAPI (JSR 135). public BasicXlet(){
Ostatnią najbardziej bogatą w możliwości
grupą jest MSA (Mobile Service Architec- }
ture). W jej skład wchodzi większość opcjo-
nalnych bibliotek podzielonych w zależności public void initXlet( XletContext context )
od zastosowań. Większość z nich doczekała throws XletStateChangeException {
się urzeczywistnienia na urządzeniach - ich
szczegółowa charakterystyka zostanie opisa- this.context = context;
na na późniejszym etapie (rysunek 3.).
Wymagania stawiane urządzeniom narzu- }
cone przez Sun jako minimalne (patrz ramka
w sieci) określone są następująco: public void destroyXlet( boolean unconditional )
throws XletStateChangeException {
• Typ procesora: głównie ARM (16 lub 32
bitowy); }
• Częstotliwość taktowania: minimalna
50 MHz; public void pauseXlet(){
• Wielkość pamięci RAM: około 300 KB
(włączając MIDP), typowo 600 KB; }
• ROM/Flash min. 1MB, typowo > 1.5
MB. public void startXlet() throws XletStateChangeException {

Można się spotkać z dokumentami, które }


szczegółowo opisują, jakie są wymagania w

www.sdjournal.org 69
Programowanie urządzeń mobilnych

zależności od wersji MIDP czy konfiguracji Istnieją także implementacje, które rozsze- sorach. Specyfikacja CDC 1.0 zawiera pod-
CLDC (patrz ramka W Sieci). rzają pewne mobilne systemy operacyjne jak zbiór klas platformy Java 2 Standard Edi-
Postęp technologiczny spowodował, że naj- Windows Mobile czy PalmOS. Linki do po- tion wersji 1.3.1. Natomiast kolejna wersja
nowsze urządzenia wykraczają daleko poza pularnych portali developerskich znajdują się CDC 1.1.2 (JSR 218) bazuje na J2SE w wer-
ramy przedstawione przez Sun. Szczegóły, na w ramce W Sieci. sji 1.4.2. Konfiguracja CDC została uzupeł-
jakie programiści zwracają uwagę, a które zo- Sun wprowadził nową specyfikację zwaną niona o profil Fundation Profile, wzbogaca-
stały narzucone przez producentów to: MSA2 (Rysunek 4.), w której doczekaliśmy jąc go o bogate operacje I/O oraz szybką sieć.
się kilku innowacji. Przede wszystkim po- Na końcu znalazł się profil Personal Profi-
• Maksymalny rozmiar sterty (ang. max. łączenie konfiguracji CDC oraz CLDC. Ko- le dostępny w podstawowej i pełnej wersji.
heap size) określające maksymalną do- lejną nowością jest wprowadzenie nowego Personal Basis Profile wprowadził podzbiór
stępną pamięć RAM na aplikację; profilu MIDP 3.0. Oficjalnie trzecia wersja klas AWT do budowy interfejsu oraz model
• Maksymalny rozmiar jar (ang. max jar si- MIDP 3.0 jest projektem Open Source pro- aplikacji nazwanych Xlet.
ze) określające maksymalny rozmiar apli- wadzonym przez grupę firm pod przewod- Aplikacje Xlet, które są w dużym stopniu
kacji, jaka może być zainstalowana na nictwem Motorola (patrz ramka W Sieci). W podobne do MIDletów. Wprowadzają dobrze
urządzeniu; chwili pisania artykułu nie ma jeszcze urzą- zdefiniowany cykl życia aplikacji, który bar-
• Maksymalny rozmiar pamięci stałej dzenia, jednak specyfikacja precyzuje nową dziej szczegółowo zostanie opisany w kolejnej
(ang. max storage size) oraz maksymalny architekturę i możliwości tego profilu. Spe- części artykułu.
rozmiar rekordu; cyfikacja określa minimalne wymagania dla Pełna wersja Personal Profile wprowadza
• Rozmiar ekranu; urządzeń adaptujących MIDP 3, jest to: natomiast pełną implementację AWT oraz
• Biblioteki interfejsów API. aplikacje oparte na modelu Java Applet. Bi-
• 1MB dla nieulotnej pamięci dla imple- blioteka AWT dobrze znana jest programi-
Różne wartości, które producenci określają, mentacji MIDP poza wymaganiami dla stom Java SE, za pomocą jej komponentów
doprowadziły do włączenia procesu portin- CDC i CLDC; można wytwarzać graficzny interfejs użyt-
gu w wytwarzaniu aplikacji. Szerzej proces • 512 KB pamięci nieulotnej dla pamięci kownika. Urządzenia na konfigurację CDC
ten zostanie opisany w kolejnych częściach trwałej; można policzyć na palcach jednej ręki:
publikacji. • 1 MB dla pamięci ulotnej (java heap run-
Najnowsze urządzenia wprowadzają dy- time); • Nokia 9300;
namiczną wartość ograniczeń - zależną od • Jeden lub więcej logicznych interfejsów • Nokia 9500;
ilości zasobów przydzielonych przez system sieciowych. • Sony-Ericsson /M600;
operacyjny. • Sony Ericsson P990i;
Na rynku dostępnych jest około 95. produ- Konfiguracja CDC wprowadzona zosta- • Implementacje na Windows Mobile.
centów urządzeń J2ME oraz około 2000 mo- ła dla urządzeń wyposażonych w oko-
deli wliczając w to branding (modele różnią- ło 2MB pamięci RAM oraz około 2,5 MB W dalszej części skupimy się na możliwo-
ce się tylko wyglądem). ROM i pracujących na 32 bitowych proce- ściach oferowanych dla aplikacji przez obie
platformy. Porównanie będzie polegało naj-
pierw na przyrównaniu stanu dotychcza-
sowego, czyli Android do profilu MIDP 2
oraz PersonalProfile. Następnie, jeśli jakaś
funkcjonalność znalazła się w nowym pro-
filu MIDP 3 zostanie ona porównana z An-
droidem.

Anatomia aplikacji

Android
Aplikacje w Android mogą być zrealizowane
z następujących bloków:

• Activity;
• Intent;
• Broadcast recivier;
• Service;
• Content Provider.

Activity
Stanowi najczęściej używany komponent do
budowania aplikacji. Zwykle jest to pojedyn-
czy ekran interfejsu użytkownika. Wiele apli-
kacji wykorzystuje jednak wiele widoków do
prezentowania swojej treści i można je za-
implementować jako osobne activity. Prze-
chodzenie do innego ekranu polega na star-
cie nowego acitvity, poprzedni ekran prze-
Rysunek 3. Architektura MSA (http://java.sun.com/javame/technology/msa/) chodzi wówczas w stan pauzy i umieszcza-

70 02/2009
Android vs. Java ME

ny jest na stosie historii. Android zachowu-


je historię dla każdej aplikacji uruchomionej
z ekranu domowego. Użytkownik może prze-
chodzić między widokami w historii a w ra-
zie potrzeby usuwać je. W pewnych przypad-
kach activity mogą przekazywać komunikaty
między sobą.
Intent
Wchodzi w skład mechanizmu umożliwia-
jącego wymianę komunikatów zdarzeń (in-
tencji) w Android. Zawiera zbiór pól opisu-
jących, co aplikacja chciałaby zrobić. Wywo-
łany komunikat intent jest przesyłany do me-
chanizmu zwanego intent resolver. Wykorzy-
stuje on filtr (intent filters) ustawiony w apli-
kacjach, aby znaleźć odbiorcę danej wiado-
mości. IntentFilter jest opisem, jakie komu-
nikaty intent może obsłużyć activity (lub
BroadcastReceiver, Service). Pola w intent za-
wierają określoną akcję, kategorię, dane ty-
pu String, dane typu MIME, docelową klasę
oraz inne wartości. Najczęściej wykorzysty-
wany jest mechanizm w przejściach między
widokami aplikacji. Jeden acitvity urucha- Rysunek 4. Architektura MSA2 (http://java.sun.com/developer/technicalArticles/javame/msa2-intro/)
mia inny z określonym intenetm.
Intent receiver (Broadcast intent receiver)
Wykorzystują go aplikacje, które oczeku- Activity
starts
ją na komunikaty typu broadcast. Najczę-
ściej aplikacja reaguje na zewnętrzne zdarze-
nia jak np. nadchodzące połączenie lub inne
przerwania. Aplikacja nie musi być urucho- onCreate()
miona, aby odpowiedzieć na określone zda-
rzenie, system zatroszczy się o jej urucho-
User navigates
mienie. Istnieje także możliwość wysyłania back to your
komunikatów typu broadcast z tego typu Activity onStart() onRestart()
aplikacji do innych.
Intent filter
Activity oraz intent receivers zawierają jed-
Process is
ną lub więcej filtrów wpisanych w pliku ma- onResume()
killed
nifest określające, na jakie zdarzenia reagują.
Dla activity Android szuka najbardziej od-
powiadającej aplikacji, która będzie w sta- Activity is
running Your Activity
nie odebrać Intent. Natomiast dla komuni- comes to the
katów broadcast wysyła go do wszystkich foreground
odbiorców, dla których filtr pasuje do dane- New Activity is started
go Intentu.
Service Your Activity
Other applications comes to the
onPause()
Program wykonywany w tle bez interfej- need memory foreground
su użytkownika realizujący określone zada-
nia jak np. odgrywanie muzyki czy monito- Your Activity is no longer visible
ring sieci. Istnieje możliwość połączenia się
z serwisem, wykorzystując do tego komuni-
katy Intent. onStop()
ContentProvider
Klasa implementująca zestaw metod umożli-
wiających innym aplikacjom na dostęp do jej
danych. Największe zastosowanie ma w przy- onDestroy()
padku, gdy występuje potrzeba współdziele-
nia danych między aplikacjami.
Cykl życia aplikacji
W większości przypadków każda aplikacja Activity is
shut down
Android działa na własnym procesie Linuxa.
Proces jest tworzony dla aplikacji, kiedy pe-
wien kod musi być uruchomiony. Po zakoń- Rysunek 5. Cykl życia Activity (http://code.google.com/android/reference/android/app/Activity.html)

www.sdjournal.org 71
Programowanie urządzeń mobilnych

czeniu wykonywania określonego kodu sys- me() a onPause - w dalszej części bę- ciągu stan oraz zmienne są przechowy-
tem zwraca pamięć innym aplikacjom. dzie to wyjaśnione - Listing 1.); wane w pamięci, jednak w przypadku
Fundamentalną cechą Androida jest to, że • jego BroadcastReceiver jest uru- alarmowego stanu pamięci zostaną na-
cykl życia aplikacji nie jest bezpośrednio kon- chamiany (wywołanie metody tychmiast zabite. Zazwyczaj takich uru-
trolowany przez aplikację. Zamiast tego jest onReceive()); chomionych procesów jest dużo i są one
determinowany przez system kombinacją • posiada serwis, który obecnie wyko- przechowywane na liscie LRU (ang. Le-
części aplikacji, o których system wie, że są nuje fragment kodu na jedną odpo- ast Recently Used), aby zagwarantować,
uruchomione, jak bardzo ważne są czynności wiedź. że proces najbardziej odwiedzany będzie
dla użytkownika, które wykonuje oraz ile pa- usunięty na końcu.
mięci jest dostępnej w systemie. Należy tutaj Takich procesów będzie w systemie niewiele • Procesy bezczynne (ang. empty process) nie
podkreślić, że bardzo ważne jest zrozumie- i będą one w ostateczności zniszczone, jeżeli zawierają żadnych aktywnych kompo-
nie funkcjonowania podstawowych kompo- stan pamięci jest zbyt niski, aby żaden z pro- nentów systemu. Są najszybciej zabijany-
nentów aplikacji (Activity, Services, Broadca- cesów nie mógł kontynuować działania. Ge- mi procesami w systemie w przypadku
stReceivers), aby w przyszłości nie doszło do neralnie założono, żeby zapewniona była in- braku pamięci. Powodem ich zastosowa-
sytuacji, że system niszczy proces, który wy- terakcja z użytkownikiem. nia jest zwiększenie czasu uruchamia-
konuje istotne zadania. nia w przypadku, gdy komponent apli-
Jednym z przykładów podstawowego błę- • Procesy widoczne (ang. visible process) są kacji będzie następnym razem urucho-
du, jakie podaje Google, jest start wątku Bro- to te procesy, które są widoczne na ekra- miony. Sytuacja, kiedy proces może stać
adcastReceivers, kiedy odbiera komunikat nie, jednak nie są procesami foreground. się empty, jest opisany wcześniej pro-
Intent w metodzie BroadcastReceiver.onR Dzieje się tak w przypadku, gdy aplika- blemem w przypadku wyjścia z funkcji
eceive() cja utraciła focus, jednak jest wciąż wi- onReceive() BroadcastReceiver.
i wyjście z funkcji. Po pierwsze system bie- doczna. Na przykład została częściowo
rze pod uwagę, że Broadcast receiver nie bę- zasłonięta okienkiem dialogowym. Na- Model aplikacji Android
dzie już aktywny oraz to że jego proces nie stępuje wtedy przejście w stan pauzy W większości systemów operacyjnych ist-
będzie już potrzebny, pomimo tego, że in- (jej metoda onPause() została wywoła- nieje mocne powiązanie pomiędzy obrazem,
ne komponenty aplikacji są w nim aktyw- na), jednak cały czas jest ona gotowa do z którego uruchamiamy aplikację (w Win-
ne. Rozwiązaniem tego problemu jest uru- powrotu w stan działania (przechowu- dows .exe), procesem oraz powiązaną z apli-
chomienie serwisu (Service) z BroadcastRe- je w pamięci swoje informacje). W eks- kacją ikoną.
civiera co spowoduje, że system będzie wie- tremalnych sytuacjach, jeżeli procesy W Android podejście jest bardziej elastycz-
dział, że proces ma wciąż aktywne zadania i foreground będą potrzebowały pamięci, ne i warto poznać jak pewne części mogą
go nie usunie. aplikacje mogą zostać zabite. współpracować ze sobą:
Aby określić, które procesy powinny być • Procesy serwisu (ang. service process) sys-
zabijane (ang. killed), kiedy jest niski po- tem utrzymuje działające serwisy do • Paczka aplikacji .apk zawiera kod aplika-
ziom wolnej pamięci, Android umieszcza je czasu, gdy nie ma wystarczającej ilości cji oraz jej zasoby. To jest plik, który jest
w hierarchii ważności. Bazuje ona na kom- pamięci dla powyższych dwóch typów. dystrybuowany oraz pobierany przez
ponentach uruchomionych w nich, jak i sta- • Procesy pracujące w tle (ang. backgo- użytkownika, gdy użytkownik instaluje
nie ich samych. Typy procesów są następują- rund process) zaliczamy do tej katego- aplikację.
ce (aby ułatwić zrozumienie zagadnienia na rii wszystkie aplikacje, które nie są wi- • Zadania (ang. task) z reguły jest to to,
Rysunku 5. został przedstawiony cykl życia doczne dla użytkownika (metoda on- co użytkownik spostrzega jako aplika-
Activity): Stop() została wywołana). W dalszym cja, którą może uruchomić. Najczęściej

• Procsy pierwszego planu (ang. foreground


process) to proces, z którym użytkownik
w danej chwili pracuje. Proces może pra-
cować na pierwszym planie z kilku po-
wodów:
���� ��� ���� ������
• jest Activity, z którym użytkownik ����������� ����������� �����������
jest w interakcji (jest to czas pomię-
dzy wywołaniem metody onResu-

����� ���
��� �����������
�������
��������

������ ������
������ ������
�������� ����������� �����������
���������� ���������� ����
�����������

���������

Rysunek 6. Cykl życia MIDletu (http://


developers.sun.com/mobility/midp/articles/fsm/) Rysunek 7. Proces komunikacji między Xletami (http://java.sun.com/j2me/docs/cdc_appmgmt_wp.pdf)

72 02/2009
Android vs. Java ME

zawiera ikonę i jest dostępne na naj- Kontekst MIDletu AMS


wyższym poziomie elementów tak, że- Aplikacja może mieć interakcję ze środowi- Całym środowiskiem aplikacji JavaME oraz
by można to było szybko przywrócić na skiem operacyjnym. Przez getAppProperty() cyklem życia MIDletu zarządza system AMS
pierwszy plan. (lub getProperty()) można otrzymać pa- (ang. application management software). Egze-
• Proces (ang. process) opisany wcześniej rametry inicjalizujące aplikację (w plikach kwuje on politykę bezpieczeństwa, pozwole-
niskopoziomowy proces kernela Linu- JAD, MANIFEST lub systemowe wartości). nia, stany aplikacji oraz dostarcza klasy syste-
xa. Najczęściej cały kod w aplikacji .apk Aplikacja może znaleźć się w stanie zawie- mowe oraz harmonogram. Serwisy oraz me-
jest uruchamiany w jednym procesie. szenia z różnych powodów, jak np. przycho- chanizm wymiany komunikatów jak Intent
Chociaż odpowiednia konfiguracja po- dząca rozmowa telefoniczna lub samoczyn- nie zostały jednoznacznie określone w Java
zwala na uruchamianie w kilku proce- ne przejście w stan pauzy przez wywoła- ME. Pośrednio można posłużyć się mechani-
sach. Poprawia to stabilność oraz bez- nie notifyPaused. Chciałbym zwrócić tu- zmem PushRegistry, który zapewnia system
pieczeństwo Android, gdy pewien nie- taj uwagę, że metoda pasueApp nie jest wy- AMS. Umożliwia on uruchamianie aplikacji
zaufany lub awaryjny kod umieścimy w woływana po notifyPaused. System zakła- w odpowiedzi na określone zdarzenia (np.
osobnym procesie. Redukcja obciążenia da, że MIDlet został przygotowany do przej- przychodzące połączenia, SMS). Po otwar-
przez wykonywanie kodu z wielu .apk ścia w ten stan. Dlatego często spotyka się ciu odpowiedniego kanału komunikacyjne-
w jednym procesie. Pomaga to systemo- wywołanie przed metodą notifyPaused go można stworzyć system do wymiany ko-
wi na umieszczanie wymagającego kodu – pauseApp. Przejście z powrotem w stan ak- munikatów. Więcej na temat tego mechani-
w osobnym procesie, gdzie system może tywny odbywa się przez wywołanie metody zmu można znaleźć w jednym z artykułów,
go spokojnie zabić bez obawy o inne czę- resumeRequest(). który został opublikowany w Software Deve-
ści aplikacji. ResumeRequest() odpytuje system zarządza- loper's Journal 08/2008. W przypadku zesta-
• Wątki (ang. threads) każdy proces może nia o reaktywację MIDletu. Jak tylko będą do- wu MIDletów, kiedy urządzenie pozwala na
zawierać jeden lub więcej wątków uru- stępne zasoby, to następuje wywołanie metody uruchamianie ich jednocześnie, to zazwy-
chomionych w nim. W większości sytu- startApp. Rodzi się tutaj pewne niebezpieczeń- czaj pracują w tej samej maszynie wirtualnej.
acji Android unika tworzenia nowych stwo związane z ponownym wywołaniem me- Oznacza to, że wykorzystują te same obiek-
wątków w procesie, trzyma aplikacje w tody startApp(). Jeżeli w ciele metody zostały ty oraz interfejsy. Daje to możliwość zbudo-
pojedynczym do czasu, gdy ona sama zainicjalizowane obiekty, to może dojść do sy- wania interfejsu komunikacji między aplika-
utworzy kolejny. Należy w tym miejscu tuacji ich zdublowania. Należy więc w miarę cjami z koniecznością synchronizacji części
zwrócić uwagę, że instancje Activity, możliwości część inicjalizacji przeprowadzić w wspólnej. Niestety nie zostało to tak zgrab-
BroadcastReceiver, Services są tworzone konstruktorze, a w metodzie startApp kontro- nie zrealizowane, jak na platformie Android
tylko z głównego wątku procesu. lować ilość wywołań metody (np. flaga). Dla- w postaci Intentów.
tego w ciele metody pauseApp powinny nastą- Współdzielenie danych prywatnych apli-
MIDP 2 pić działania przygotowujące MIDlet do przej- kacji, które zapewnia ContentProvider w An-
Aplikacje Java ME MIDP to kolekcja jednego ścia w stan zawieszenia. Powinny również zo- droid, między aplikacjami w JavaME możli-
lub więcej klas MIDletów umieszczonych w stać zwolnione wykorzystywane zasoby lub ich wy jest tylko w obrębie zestawu MIDletów.
archiwum JAR znanych również jako zestaw część bądź zawieszone działania pętli oraz ti-
MIDletów. W archiwum znajdują się także merów. Zalecaną praktyką w zależności od sy-
wszystkie pozostałe klasy oraz zasoby (ob- tuacji jest niszczenie w pauseApp tych obiek-
razki, dźwięki) . W parze z plikiem JAR idzie tów, które były stworzone w startApp a zwłasz-
plik JAD, w którym określa się podstawowe cza tych, które wymagają dostępu do ekranu.
parametry, jak nazwa aplikacji, wersje MIDP Specyfikacja maszyny wirtualnej nie wymaga,
oraz CLDC oraz inne, które bardziej szczegó- aby ekran był dostępny już w konstruktorze,
łowo będą opisane w kolejnych częściach. MI- zależy to od implementacji KVM.
Dlet podobnie jak Activity posiada swój cykl Metoda notifyDestroyed powoduje na-
życia składający się z czterech stanów: tychmiastowe zamknięcie aplikacji bez wy-
woływania kodu w ciele metody destroyApp.
• Start – ma miejsce podczas uruchamia- Jeżeli metoda destroyApp wywołana jest
nia aplikacji Java ME. przez system z parametrem true, to powo-
• Pause – występuje, gdy użytkownik tra- duje to natychmiastowe przejście w stan de-
ci możliwość interakcji z aplikacją. Jed- stroyed, niezależnie od przebiegu meto- Rysunek 8. Idle screen (http://www.slideshare.net/
nak aplikacja jest cały czas uruchomio- dy destroyApp. W przypadku false, MIDlet paulsu/midp-30-master-class/)
na. Przykładowo taka sytuacja zacho- chce zakomunikować, że chce pozostać w
dzi w przypadku nieoczekiwanych prze- obecnym stanie i może wyrzucić wyjątek MID
rwań jak przychodząca rozmowa telefo- letStateChangeException. To żądanie może
������������� �������������
niczna lub sam użytkownik przełącza zostać uszanowane i wywołanie metody mo-
się na inną aplikację, jeżeli system opera- że nastąpić w późniejszym czasie . Jeśli pod- ���� ����
cyjny mu na to pozwala. czas metody startApp wystąpi wyjątek inny
• Active – sytuacja, gdy użytkownik ma niż MIDletStateChangeException, metoda
bezpośrednią styczność z interfejsem destroyApp będzie wykonana (Listing 2.).
użytkownika. Generalnie porównując możliwe stany MI- �������
• Destroyed – stan, gdy aplikacja zostaje Dletu z Activity Androida można dopatrzyć �������������
zakończona. się podobieństw. Ze względu na to, że Andro-
id zarządza swoimi procesami i w zależności
Rysunek 6. prezentuje przejścia pomiędzy od stanu przyznaje określony priorytet, do- Rysunek 9. Dostęp do zmiennej statycznej w
kolejnymi stanami. szło w nim kilka pośrednich stanów. konkurencyjnych MIDletach MIDP 3.

www.sdjournal.org 73
Programowanie urządzeń mobilnych

Jeżeli aplikacje znajdują się w dwóch różnych Nie powinno się tworzyć w konstruktorze mogła zdalnie wywoływać metody obiektów
plikach jar, to MIDlety nie mają bezpośred- żadnych zmiennych, ponieważ w tym mo- (Rysunek 7.).
niego dostępu do ich lokalnych baz (RMS). mencie kontekst systemu operacyjnego nie
Personal Profile (CDC) został przygotowany; MIDP 3
Dla JavaME PP istnieje kilka możliwości budo- Obserwując poczynania grupy zajmującej się
wy aplikacji: • Stopped – aplet został zainicjalizowany, rozwijaniem technologii MIDP 3, można wy-
jednak jest nieaktywny w danej chwi- pisać kilka innowacyjnych rozwiązań, które
• tradycyjna aplikacja (znana z JSE); li. Kiedy kontekst jest gotowy, następu- były bardzo oczekiwane w poprzednich wer-
• applet; je wykonanie metody init(). W tej meto- sjach. Zostały wprowadzone kategorie aplika-
• xlet; dzie powinny znajdować się wszelkie in- cji takie jak standardowe MIDlety, IdleScre-
• midlet. formacje startowe; en MIDlet oraz Screen Savers MIDlet (wyga-
• Started – aplet jest aktywny; szacze ekranu). IdleScreen MIDlet jest ekra-
Tradycyjna aplikacja • Destroyed – zamknięcie i wyczyszczenie nem, który jest prezentowany użytkowniko-
W głównej klasie aplikacji definiuje się sta- pamięci po aplikacji. wi, kiedy żadna aktywność nie jest zaobser-
tyczną metodę main, której szuka maszy- wowana na urządzeniu. Typowo taki ekran
na wirtualna, aby ją wywołać podczas star- Kontekst apletu pozwala na interakcję ze nie jest psuty, ale wypełniony komponentami
tu. Program działa do momentu wywołana swoim środowiskiem operacyjnym. Dzię- UI, które prezentują informacje jak na przy-
metody System.exit lub zabicia procesu z ki kontekstowi można wykonać wiele czyn- kład siłę sygnału, poziom baterii, serwisy na
poziomu systemu operacyjnego (Listing 3.). ności na przeglądarce lub systemie opera- urządzeniu, nagłówki wiadomości (Rysunek
Z wielu powodów tradycyjny model aplika- cyjnym (odegranie muzyki, komunikaty, 8.). Automatyczne uruchamianie MIDletów
cji sprawdza się w systemach, gdzie nie ma otwarcie nowego okna przeglądarki). wraz ze startem systemu. Należy zwrócić tu-
potrzeby przejmowania się zasobami (pa- MIDlety także mogą znaleźć się na platfor- taj uwagę na mechanizm PushRegistry, który
mięcią, procesorem) systemu. Gdy aplika- mie JavaME CDC, jednak w większości przy- nadal pozostaje.
cja jest chwilowo niepotrzebna, zostaje np. padków ich klasy oraz maszyny wirtualne są Konkurencyjne MIDlety
zminimalizowana bez potrzeby przejmowa- odseparowane od siebie. Zapewniają niezależne działanie aplikacji,
nia się jej stanem pauzy. W przypadku profi- Xlety biorąc pod uwagę:
lu MIDP, gdzie każdy bajt jest cenny, ten typ Xlety stanowią kolejny typ aplikacji zarzą-
aplikacji jest nieoptymalny. dzanych i podobnie jak MIDlety wymagają • Izolację danych, które będzie polegała na
Applet systemu AMS. Oryginalnie dostępne w Ja- tym, że MIDlety zostaną uruchomione
Applet jest rodzajem wbudowanej aplikacji va TV API zostały zaadaptowane do Perso- we własnym kontekście . Klasy oraz sta-
działającej w środowisku przeglądarki inter- nal Basic Profile oraz Personal Profile (Li- tyczne dane nie będą dzielone między
netowej. Jest ściśle powiązany ze stroną inter- sting 5.). Cykl życia Xletu składa się z nastę- MIDletami, nawet jeśli są w tym samym
netową, ponieważ zawiera ona obszar inter- pujących stanów: zestawie. Natomiast cechy jak pozwole-
fejsu użytkownika. Użytkownik może prze- nia (ang. persmissions), dostęp do RMS
chodzić przez strony w przeglądarce bez po- • loaded – podobnie jak aplety instancja oraz zasoby pozostaną dla zestawu dzie-
trzeby informowania o tym appletu (Listing została skonstruowana, ale niezainicjo- lone. Zatem należy się spodziewać, że
4.). System zarządzania zadba, aby aplikacja wana; dla przykładu zmienna statyczna nie bę-
przeszła w stan pauzy lub zniszczenia. Cykl • paused – stan pauzy Xletu; dzie zmienną globalną dla zestawu jak
życia apletu składa się z następujących sta- • active – aktywna aplikacja; to miało miejsce dotychczas. Każdy MI-
nów: • destroyed – zamknięta aplikacja. Dlet będzie posiadał swoją własną kopię
niedostępną dla drugiego (Rysunek 9.).
• Loaded – instancja apletu została utwo- Wraz z Xletami został wprowadzony me- • Obsługa błędów w MIDletach będzie po-
rzona, jednak nie przeprowadzono żad- chanizm wymiany komunikatów IXC (in- legała podobnie jak w platformie Andro-
nej inicjalizacji. ter-Xlet communication). IXC jest prostą od- id. Błąd w jednej aplikacji nie powinien
mianą mechanizmu RMI, w której aplikacja mieć wpływu na drugą.
• MIDP 3 powinien zapewniać MIDletom
������������ politykę szeregowania, aby nie dopuścić
�������������� ������ do tzw. zagłodzenia, czyli sytuacji, gdy
któraś aplikacja zbyt długo oczekuje na
zasoby. Podobnie jak w Android wprowa-
dzą priorytety dla aplikacji, aby zapew-
niać im dostęp w zależności od ich waż-
������������������������������� ności. Szczególnie nacisk jest kładziony,
jeżeli aplikacja ma focus, czyli użytkow-
����������������� nik bezpośrednio na niej działa.
������
���������������������������� ��������������������������������������� Komunikacja między MIDletami.
�������������
Inter Midlet Communication wprowadza
����������������������������������
asynchroniczny dwukierunkowy strumienio-
wy protokół komunikacji. Podobnie jak pro-
tokół gniazd umożliwia ustawienie dwóch po-
łączeń jako klient lub serwer. Dostęp do tych
połączeń będzie kontrolowany przez politykę
Rysunek 10. Zdarzenia w MIDP 3. bezpieczeństwa. Klient może wyspecyfikować

74 02/2009
Android vs. Java ME

URL do jednego serwera lub użyć maski wild- niowane są zależności między MIDletami oraz ności w ramach jednej platformy. Natomiast
card, aby dostać się do jakiegokolwiek serwera między nimi samymi. Mogą ograniczyć czas po- Sun porozbijał swoje na kilka platform Java
wspierającego dany serwis. Aplikacje mogą wy- bierania aplikacji, jeżeli ta zadeklaruje, że wy- ME (takich jak PersonalProfile, MIDP 2 oraz
korzystać PushRegistry, aby mogły być urucho- korzystuje daną bibliotekę (więcej patrz ram- MIDP 3). Uzależnione to było od mocy ob-
mione w przypadku nadchodzącego połącze- ka W Sieci). Inne cechy nowego profilu zostaną liczeniowej dostępnych w ówczesnym czasie
nia. Serwer IMC ma możliwość filtrowania opisane w kolejnych artykułach gdzie będą po- urządzeń, które nie mogły zrealizować pew-
klientów, którzy się do niego chcą połączyć na równywane z możliwościami Android. nych zadań. Ale postęp technologiczny nie
podstawie domeny, producenta, podpisu. stanął w miejscu, a polityka innowacyjności
Mechanizm notyfikacji o zdarzeniach Podsumowanie Suna chyba tak. Od kilku lat urządzenia mo-
W MIDP 3 zdefiniowano dwa typy zdarzeń: Przedstawiony artykuł ukazuje pierwszą bi- gą pochwalić się coraz szybszymi procesora-
systemowe i między aplikacjami. Systemowe twę między platformą Android oraz Java mi oraz większą pamięcią. Google wykorzy-
komunikaty są informacją od systemu o zaist- ME. W obszarze konfrontacji znalazły się stało tę sytuację i udało się mu wprowadzić
niałym przerwaniu lub innym zdarzeniu. App- ogólne koncepcje cech funkcjonalnych po- platformę, która skupia wszystkie najlepsze
to-app są zdarzeniami między aplikacjami, któ- równywanych technologii. Jak można było cechy pozostałych trzech platform Java ME.
re się zarejestrowały w celu ich odbioru (Rysu- zaobserwować, istnieje duże podobieństwo Tak naprawdę z Androidem może konkuro-
nek10.) . na pewnych szczeblach architektury. Wpro- wać jedynie konfiguracja MSA2. Skupia ona
Współdzielone biblioteki wadzono maszynę wirtualną oraz zbiór bi- wszystkie dotychczasowe osiągnięcia Java-
LIBlety są niezależną paczką kodu oraz zaso- bliotek odpowiedzialnych za określone za- ME oraz wprowadza nowy profil MIDP 3.
bów, które mogą być dzielone przez MIDlety. dania. Każda aplikacja posiada swój cykl ży- Jednak do tej pory nie doczekaliśmy się urzą-
Mogą także być zależne od innych LIBletów. cia oraz istnieją mechanizmy wymiany ko- dzenia z tą platformą. Przekonanie produ-
Wszystkie te biblioteki są zależne od kontekstu munikatów. Jednak rzuca się w oczy fakt, że centów do wprowadzenia nowej architektury
uruchomionego MIDletu. W LIBletach zdefi- Google zrealizowało wszystkie funkcjonal- Sun będzie coraz trudniejsze. Już w obecnej
chwili można zaobserwować wiele deklara-
cji wytwórców urządzeń mobilnych wdroże-
W Sieci nia Androida. Przewagą liczby urządzeń, na
Telefon Android: których dostępna jest Java ME, na razie może
poszczycić się Sun. Z tego względu na pewno
• http://www.androidal.pl/t-mobile-g1htc-dream-podzespoly/176;
• http://www.fkn.pl/1,351,1860762,1,wiadomosc.html; przez jakiś czas będą powstawały aplikacje na
• http://www.t-mobileg1.com/not-found.aspx?aspxerrorpath=/g1-announcement.aspx; te urządzenia. Dlatego w kolejnych artyku-
• http://www.androidal.pl/t-mobile-g1-dla-deweloperow/209. łach pójdziemy dalej i porównany dane tech-
nologie w kolejnych obszarach:
Wymagania urządzenia Sun:

• http://java.sun.com/j2me/docs/pdf/CLDC-HI_whitepaper-February_2005.pdf); • Możliwości języka programowania;


• http://java.sun.com/products/cldc/wp/KVMwp.pdf, http://pl.wikipedia.org/wiki/MIDP http://mi- • Licencje oraz dostęp do kodów źródło-
dlety.net. wych;
• Typowe problemy;
Portale developerskie: • System dystrybucji oprogramowania;
• http://developer.samsungmobile.com/Developer/index.jsp; • Bezpieczeństwo;
• https://developer.sonyericsson.com/site/global/home/p_home.jsp; • Interfejs użytkownika;
• http://www.forum.nokia.com/; • Multimedia i gry;
• http://developer.motorola.com/; • Komunikacja;
• http://developer.openwave.com/dvl/; • Wybrane biblioteki;
• http://www-01.ibm.com/software/wireless/weme/;
• Optymalizacja oraz narzędzia.
• http://na.blackberry.com/eng/developers/.

Java ME: W następnej części zostanie wprowadzony


szkielet aplikacji, którą będę rozwijał przez
• https://opensource.motorola.com/sf/frs/do/downloadFile/projects.jsr271/frs.jsr_271_early_ następne odcinki kampanii wojennej. Dzi-
draft_release.jsr_271_public_review_release/frs1659?dl=1;
siejszy odcinek wygrywa Android ze wzglę-
• https://opensource.motorola.com/sf/projects/jsr271;
• http://java.sun.com/javame/index.jsp. du na eleganckie zintegrowanie funkcjo-
nalności oczekiwanych od dłuższego czasu
VM: przez programistów.

• http://java.sun.com/products/cldc/wp/KVMwp.pdf;
• http://www.sagecertification.org/events/vee05/full_papers/p153-yunhe.pdf.
ALBERT WACHOWICZ
Albert Wachowicz pracuje na stanowisku Techno-
Android: logy Unit Manager w BLStream wchodzącym w
skład Grupy BLStream. Grupa BLStream powstała,
• http://forum.xda-developers.com/forumdisplay.php?f=446; by efektywniej wykorzystywać potencjał dwóch,
• http://groups.google.com/group/android-developers;
szybko rozwijających się producentów oprogramo-
• http://www.androidal.pl/;
• http://code.google.com/android/. wania – BLStream i Gamelion. Firmy wchodzące w
skład grupy specjalizują się w wytwarzaniu opro-
OSGi: gramowania dla klientów korporacyjnych, w roz-
wiązaniach mobilnych oraz produkcji i testowa-
• http://www.osgi.org/About/Technology?section=2. niu gier.
Kontakt z autorem: albert.wachowicz@gmail.com.

www.sdjournal.org 75
Felieton

Czy nowoczesna firma


może funkcjonować bez
najnowszej technologii?

P
o przeczytaniu poniższej historii, z pewnej firmy odpowiedź nie ma w tej ciężarówce. Wszystko zostało spakowane i odesłane
nasuwa się sama. zwrotem do dostawcy. Wiem, bo sam wysyłałem.
Zarzewski pędził jak szalony. Wiedział, że teraz może się wszystko – Szeroko się uśmiechnął.
odmienić. Silnik szybko wchodził na obroty, a kolejne biegi zmieniały się, To było dla Zarzewskiego za dużo. Zacisnął pięść, która po chwili spo-
gdy tylko było to możliwe. Drzewa migały za oknami podobnie jak my- tkała się ze szczęką dawnego przyjaciela. Otoczewski upadł, a Zarzew-
śli, których nie mógł wszystkich ogarnąć. ski wcale się nie uspokoił, zaczął wrzeszczeć.
Od 10 lat był przedstawicielem, bywały lepsze i gorsze okresy, ale – Zapieprzam cały dzień. Na oślep robię zamówienia, nie wiedząc cze-
teraz miał szansę odzyskać najlepszego klienta. Co chwila spoglą- go ile mamy. Wypruwam z siebie flaki. Świecę oczami przed klientami. A
dał na siedzenie, w tej stercie kartek leżało, jak gdyby nic, zamó- potem przyjeżdżam tu i widzę jak ruszacie się jak muchy w smole, wy-
wienie od Zoweksu. To zamówienie może wszystko zmienić. Jeśli dajecie nie to, co na dokumentach, sami nie wiecie gdzie znaleźć jaki-
uda mu się je dostarczyć szybko do firmy, a towar dotrze do klien- kolwiek towar, a do tego macie to wszystko gdzieś. Niech Cię szlag tra-
ta, odzyskają zaufanie, kolejne zamówienia będą już tylko formal- fi. Co się z Tobą stało?!
nością, a oni zawsze zamawiają dużo. Pozostaje tylko pytanie, czy – Odwal się. – Otoczewski powoli wstawał – Też mam tego dosyć,
mamy towary, które są na zamówieniu. Dlaczego akurat, gdy tego skąd mam wiedzieć gdzie wstawił towar koleś z poprzedniej zmiany, no
najbardziej potrzebował, Majewska nie odbiera telefonów? Każde- skąd? A jak jesteś taki mądry, to sam wydawaj prawidłowo towary, jeże-
go dnia wydzwaniali przecież krocie, żeby potwierdzić stany ma- li najpierw go musisz szukać, a potem widzisz na WZ tylko fragment na-
gazynowe, pewnie akurat dzwonili cały czas inni. Teraz to już nie zwy, tych towarów są teraz tysiące, dla mnie sztuka jest sztuką, inaczej
ważne, ma zamówienie, trzeba tylko wpaść na magazyn i zabloko- bym zwariował. A ten twój lofix, gdyby zamówienie było wcześniej, na
wać sobie ten towar, dostawa musi być jutro. pewno by nie wyjechał. Jak Ci się nie podoba, namów szefa, żeby wresz-
– Gdzie jest lofix? Gdzie do cholery jest ten lofix? – Kurzajowski cie kupił jakiś system, który sobie z tym poradzi, a jak nie, to zostaw mnie
popatrzył na niego spode łba. –Biegaj, skakaj, i tak nie znajdziesz w spokoju…
w pięć minut. – za dużo nas tu jest, każdy stawia towar, gdzie wy- Zastosowanie systemów opartych o rozwiązania mobilne ty-
daje mu się najlepiej, ale jak trzeba coś znaleźć, trzeba zorgani- pu palmtopy Pocket PC czy terminale radiowe z zainstalowa-
zować wielką obławę, to jak poszukiwanie zbiega. Pracujemy na nym Windows CE umożliwia rozwiązanie wielu problemów zwią-
dwie zmiany, każdy wydaje i przyjmuje, nie ma już nikogo, kto zanych z przetwarzaniem, zamówień czy logistyką magazynową.
ogarnia to wszystko… Obecnie urządzenia mobilne znajdują także zastosowanie po-
Zarzewski pędził przez magazyn, każdego magazyniera pytał, za handlem i logistyką magazynową, np. w firmach transporto-
czy wie gdzie jest lofix. To był najważniejszy towar na zamówieniu, wych, leśnictwie i innych branżach, w których przemieszczają-
wiedział, że jeśli go jutro nie dostarczą, nie będzie następnych za- cy się pracownicy gromadzą dane, przetwarzają je lub rejestru-
mówień. Te zamówienia mogą być przełomem nie tylko dla niego, ją swoje działania.
ale dla całej firmy.
Na końcu pod ścianą zobaczył Otoczewskiego, który był ostat- Przedstawiciele handlowi
nią deską ratunku. Ściągał coś z regału i układał na palecie. Wie- Systemy serii PS_Mobile wspomaga pracę przedstawicieli handlo-
le lat temu zatrudniali się razem, byli nawet przyjaciółmi, potem wych. Zadaniem programu jest dostarczanie przedstawicielom infor-
poszli w innych kierunkach. Zdarza się. Otoczewski odwrócił się, macji potrzebnych w codziennej pracy, a których aktualność ma za-
był dziwnie zadowolony. - O, pan szanowny handlowiec, jaki roz- sadnicze znaczenie dla procesów handlowych. System pobiera da-
ogniony pewnie jakieś ważne zamówienie – odwrócił się i zachi- ne z systemu handlowego i w dogodny sposób wyświetla potrzeb-
chotał. ne informacje.
– Marek! to nie chwila na żarty, wiesz gdzie jest lofix? W trakcie przyjmowania zamówienia często krytyczna jest wie-
– A co, świat się zawali, bo ważny klient, a dostawa to już mu- dza o stanach magazynowych, tak by przedstawiciel mógł po-
si być na jutro, co? twierdzić klientowi, że realizacja zamówienia jest możliwa. Istot-
– Heheheheheh. Otoczewski zaczynał się droczyć. ne jest także informowanie klienta o dokładnych cenach produk-
– To naprawdę jest ważne, muszę wiedzieć gdzie to jest, od tego tów, także wynikających ze wcześniejszych szczegółowych wa-
bardzo wiele zależy. runków cenowych przyznanych klientowi czy okresowych promo-
– Powiedzieć Ci gdzie to jest? – powiedział i spojrzał na zegarek. cji. W trakcie przyjmowania zamówienia, może być także istotne,
– Teraz jest pewnie jakieś 50 kilometrów od Warszawy i wygod- kiedy, w jakiej ilości i cenie klient wcześniej kupował wybrany pro-

76 02/2009
Felieton

dukt. Rejestracja historii sprzedaży na urządzeniu może być tak-


że pomocna w przypadku wyszukiwania produktów. W sytuacji,
gdy przedstawiciel posiada w ofercie kilka lub kilkadziesiąt tysię-
cy produktów ograniczenie listy do towarów kupowanych przez
danego klienta może bardzo przyspieszyć edycję zamówienia, a
często zwiększyć jego wartość, gdyż przedstawiciel może zasuge-
rować klientowi ponowienie zakupów wybranych towarów, o któ-
rych klient może nie pamiętać.
System jest także pomocny w realizacji dodatkowych zadań.
Wyświetlane na palmtopie rozrachunki zgodne ze stanem rozra-
chunków z centrali pozwalają zwiększyć skuteczność windykacji.
Istniejący moduł Kasa pozwala na rejestracje wpłat gotówkowych
od klientów, umożliwia automatyczne tworzenie dokumentów KP
i daje możliwość ich wydruku na drukarkach mobilnych. Dodat-
kowo, centrala ma stały dostęp do informacji o stanie kasy u po-
szczególnych przedstawicieli.
Innym często stosowanym udogodnieniem jest zbieranie infor-
macji miękkich z terenu. Pracownik w centrali definiuje ankiety
zawierające odpowiednie pytania, które mogą być przyporząd-
kowane do poszczególnych klientów lub grup. Handlowcy gro- Rysunek 2. Menu główne aplikacji wspomagającej pracę handlowca w terenie
madzą na palmtopach i automatycznie, podobnie jak zamówie-
nia, przesyłają do centrali. W panelu administracyjnym dostęp- nować błędy powstające przy przepisywaniu zamówień. Dodat-
ne są wyniki zobrazowane dodatkowo wykresami, pozwalające kową często zauważalną zmianą jest większa skuteczność ścią-
szybko i precyzyjnie ocenić, potrzeby klientów, procent zadowo- gania należności.
lenia itd.
Zastosowanie systemu pozwala zwiększyć wartość zamówień, Mobilny magazyn
znacznie przyspieszyć czas upływający od momentu przyjęcia Zastosowanie mobilnych rozwiązań na magazynie pozwala na nie-
zamówienia do dostarczenia do klienta, zwiększyć skuteczność mal całkowitą eliminację dokumentów papierowych. Magazynier
przedstawicieli, którzy są w stanie realizować więcej wizyt. Prze- posługując się terminalem radiowym w każdym miejscu magazy-
noszenie zamówień bezpośrednio do systemu pozwala wyelimi- nu ma dostęp on-line do systemu. Zarówno poszczególne lokali-
zacje na magazynie, jak i produkty mogą być oznaczone kodami
kreskowymi, które pozwalają na zapisanie niezbędnych informacji
koniecznych do zidentyfikowania produktów, nawet jeśli konkret-
ny produkt musi być identyfikowany z dokładnością do daty pro-
dukcji lub serii.
System ułatwia przyjmowanie towaru do magazynu, wydawa-
nie, przeprowadzanie inwentaryzacji i inne operacje magazyno-
we. Przygotowanie towaru do wydania odbywa się na podsta-
wie dokumentu WZ wyświetlanego na ekranie urządzenia. Sys-
tem wskaże prawidłową lokalizację towaru, a także zweryfiku-
je przy pomocy kodu kreskowego wydanie odpowiedniego pro-
duktu. Już w momencie skanowania kodu kreskowego produktu
informacje na temat tej operacji są widoczne w systemie central-
nym, nawet jeśli praca odbywa się w magazynie odległym od cen-
trali o setki kilometrów.
Zastosowanie rozwiązań mobilnych na magazynie pozwa-
la znacznie zwiększyć zdolność do wydawania i przyjmowania
towarów bez konieczności zatrudniania dodatkowych pracow-
ników.

Inne zastosowania
Mobilne oprogramowanie w połączeniu z zaletami urządzeń
przenośnych znajduje zastosowanie w wielu innych obszarach.
Zastosowanie urządzeń mobilnych może być pomocne również
w zarządzaniu flotą - w przypadku firm transportowych, dla któ-
rych istotne jest nie tylko aktualne położenie pojazdów, ale też
informacje, które powinny docierać do firmy od kierowców, do-
tyczące przewożonego towaru, stanu licznika, miejsc docelo-
wych itd.

ADAM TYLA
Rysunek 1. Zastosowanie mobilnych terminali radiowych w logistyce Koordynator ds. Współpracy z Partnerami w firmie Polsoft Engineering.
magazynowej. Kontakt z autorem: atyla@polsoft.pl

www.sdjournal.org 77
KLUB PRO
Oferta skierowana dla firm
Jeżeli Twoja firma jest prenumeratorem Software Developer’s Journal za comiesięczną
dopłatą 50 PLN +VAT możesz dodatkowo otrzymać reklamę.
Wystarczy tylko, aby profil Twojej firmy pokrywał się z naszym magazynem.
Wyślij do nas: logo firmy, dane kontaktowe i informację o firmie
Reklama przez 12 kolejnych numerów tylko za 600 PLN +VAT.
Jeżeli nie posiadasz jeszcze prenumeraty możesz ją zamówić w atrakcyjnej cenie.
Dla nowych prenumeratorów specjalna oferta – 690 PLN.

Skontaktuj się z nami:


sdj@software.com.pl tel. 22 427 36 91
pren@software.com.pl http://buyitpress.com

Opera Software Architektury systemów IT


Opera Software’s vision is to deliver the best In- Twórca frameworków JUVE i serwera aplikacji
ternet experience on any device. We are offering AVAX oferuje usługi, doradztwo, rozwiązania do
browser for PC/desktops and embedded pro- tworzenia nowoczesnych, dużych systemów i roz-
ducts that operates across devices, platforms wiązań informatycznych/internetowych, integrują-
and operating systems. Our browser can deliver ce architektury ery post-J2EE/.NET, wykorzystu-
a faster, more stable and flexible Internet expe- jące MDD/MDA dla dziedzin – bankowość, teleko-
rience than its competitors. munikacja, handel, e-commerce, ERP/Workflow/
CRM, rozwiązania internetowe, portalowe.
http://www.opera.com www.mpsystem.com mpsystem@mpsystem.com

FRONTLINE STUDIOS Future Processing


Frontline Studios – amerykańsko-polski twórca gier Future Processing to dynamiczna firma techno-
konsolowych oraz PC – szuka utalentowanych ko- logiczna działająca na globalnym rynku opro-
derów (bardzo dobra znajomość C/C++; Java, Del- gramowania. Jesteśmy zespołem wysokiej klasy
phi, UML), doświadczonych grafików (2D, 3D) oraz specjalistów posiadających wiedzę i doświadcze-
zespołów developerskich. Oferujemy długotermi- nie niezbędne do realizacji ambitnych projektów
nową pracę nad poważnymi projektami. Nie prze- informatycznych. Jeśli programowanie to Twoja
gap tej okazji! pasja dołącz do nas! (możliwość pracy zdalnej).

kadry@frontstudios.com http://www.future-processing.pl

Kei.pl WSISiZ w Warszawie


Kei.pl działa na rynku usług hostingowych od 2000 INFORMATYKA ZARZĄDZANIE
roku. Do naszych zadowolonych Klientów z du- studia stopnia I i II (stacjonarne i niestacjonar-
mą możemy zaliczyć wiele przedsiębiorstw sekto- ne) specjalności: inżynierskie, magisterskie i li-
ra MSP, instytucji oraz osób prywatnych. W ofer- cencjackie. Szczegółowe plany studiów, opisy
cie Kei.pl znajdują się pakiety hostingowe, a także poszczególnych specjalności – zapraszamy na
usługi dla wymagających Użytkowników – platfor- stronę uczelni.
my e-Biznes oraz serwery fizyczne.

http://www.kei.pl http://www.wit.edu.pl
KLUB PRO

StatConsulting TTS Company Sp. z o.o.


StatConsulting to firma o znaczącej pozycji na ryn- Sprzedaż i dystrybucja oprogramowania komputero-
ku usług analitycznych oraz Data Mining. Nasza wego. Import programów na zamówienie. Ponad 200
oferta obejmuje m.in. modele scoringowe, rozwią- producentów w standardowej ofercie. Chcesz kupić
zania Fraud Detection oraz modelowanie ryzyka. oprogramowanie i nie możesz znaleźć polskiego do-
Tworzymy także własne rozwiązania informatycz- stawcy? Skontaktuj się z nami – sprowadzimy nawet
ne na potrzeby projektów Data Mining, Data Quali- pojedyncze licencje.
ty, zarządzania ryzykiem itd.

http://www.statconsulting.com.pl http://www.OprogramowanieKomputerowe.pl

Transition Technologies S.A. EPRO


Firma w branży high-tech od 1991. Producent opro- Naszą misją jest projektowanie najwyższej jako-
gramowania dla przemysłu (ponad 350 referencji z ści dedykowanych systemów IT, które cechuje
instalacji na całym świecie). Usługi z zakresu: hur- wysoka niezawodność, wydajność, ergonomicz-
townie danych i Business Intelligence, rozwiązania ność i intuicyjność w obsłudze oraz administracji.
eBusiness, optymalizacja, integracja danych, aplika- Głównym elementem oferty EPRO jest oprogra-
cji oraz procesów biznesowych, portale korporacyj- mowanie sklepu internetowego oraz identyfika-
ne, consulting i outsourcing usług IT, zaawansowa- cja wizualna.
na automatyka cyfrowa. tel. 085 743 66 38
http://www.tt.com.pl http://www.epro.com.pl

IT SOLUTIONS Softline rozwiązania mobilne


Wdrożenia i szkolenia z zakresu: Wiodący producent systemów mobilnych, do-
• SQL Server stawca aplikacji użytkowych dla biznesu (Sym-
• SharePoint Services bian OS, Windows Mobile, J2ME ) zaprasza do
IT SOLUTIONS • MS Project / Server
• Tworzenie aplikacji w technologii .NET
współpracy. Zostań naszym partnerem. Dołącz
do zespołu.

http://www.itsolutions.biz.pl
marcin.pytlik@itsolutions.biz.pl http://www.softline.com.pl

Proximetry Poland Sp. z o.o. SWD Software Sp. z o.o


Proximetry Poland Sp. z o.o. jest polskim od- System operacyjny czasu rzeczywistego RTOS
działem amerykańskiej firmy Proximetry Inc. – QNX. Oficjalny dystybutor w Polsce.
dostawcy systemów zarządzania sieciami bez- Zakres działalności: lokalizacja produktów QNX,
przewodowymi opartymi na technologiach WiFi i dostawy sprzętu i oprogramowania, doradztwo
WiMAX. Naszą misją jest dostarczenie klientom
przedsprzedażowe, wsparcie techniczne, certyfi-
rozwiązań poprawiających jakość usług (QoS)
dostarczanych drogą radiową. Dołącz do najlep- kowane szkolenia, opracowania na zamówienie.
szych i zostań członkiem naszej ekipy!

http://www.proximetry.com http://www.swdsoft.pl

Systemy bankowe, ISOF


HEUTHES istnieje na rynku od 1989 r. Obok
systemów informatycznych dla banków, ofe-
ruje nowoczesne oprogramowanie do obsługi
firm. System ISOF jest udostępniany klientom
w trybie SaaS lub licencji. Pracuje na platfor-
mie Linux i zawiera m.in. takie moduły jak
CRM, DMS, Magazyn, Sprzedaż, Logistyka
oraz Rachunkowość.
http://www.isof.pl
Roczna prenumerata

tylko
250,-
Software Developer’s Journal (poprzednio Software 2.0)
jest miesięcznikiem głównie dla programistów, którzy li-
czą, że dostarczymy im gotowe rozwiązania, oszczędza-
jąc im czasu i pracy. Jesteśmy czytani przez tych, któ-
rzy chcą być na bieżąco informowani o najnowszych osią-
gnięciach w dziedzinie IT i nie chcą, żeby jakiekolwiek
istotne wydarzenia umknęły ich uwadze. Aby zadowolić
naszych czytelników, prezentujemy zarówno najnowsze
rozwiązania, jaki starsze, sprawdzone technologie.

Kontakt
1. Telefon 2. Online
+48 22 427 36 91 pren@software.com.pl
+48 22 427 36 79
+48 22 427 36 50 3. Adres
Bokserska 1
2. Fax 02-682 Warszawa
+48 22 244 24 59 Polska
Zamówienie prenumeraty

Prosimy wypełniać czytelnie i przesyłać faksem na numer:


00 48 22 244 24 59
lub listownie na adres:
Software-Wydawnictwo Sp. z o. o.
ul. Bokserska 1
02-682 Warszawa
Polska
E-Mail: pren@software.com.pl
Przyjmujemy też zamównienia telefoniczne:
0048 22 427 36 91
0048 22 427 36 79
0048 22 427 36 50

Jeżeli chcesz zapłacić kartą kredytową,


wejdź na stronę naszego sklepu internetowego www.buyitpress.com.

Imię i nazwisko ...............................................................................

Nazwa firmy.....................................................................................

Dokładny adres ..............................................................................

.........................................................................................................

Telefon ............................................................................................

E–mail .............................................................................................

ID kontrahenta ................................................................................

Numer NIP firmy .............................................................................

Fax (wraz z nr kierunkowym) .........................................................

□ automatyczne przedłużenie prenumeraty

Prenumerujesz
– zyskujesz
l oszczędność
pieniędzy Ilość Od
l szybka dostawa Tytuł
Ilość zama- numeru
nume- wianych pisma Cena
l prezenty rów prenume- lub mie-
rat siąca
l bezpieczna płatność Software Develope-
r’s Journal (1 płyta CD) 12 250
ność on–line – dawniej Software 2.0 PLN
W NASTĘPNYM NUMERZE SOFTWARE DEVELOPER’S JOURNAL 3/2009 171

Kolejny numer SDJ będzie poświęcony


Testowaniu oprogramowania

Ponadto w magazynie:

• Testowanie aplikacji ASP. NET - WebAii

• Integracja ciągła – proces, który na bieżąco śledzi


gotowość projektu do utworzenia wersji instalacyjnej

• Spring Java Configuration Project – alternatywa


dla tradycyjnej konfiguracji XML

• Weryfikacja przez model z narzędziem SPIN

W spr
zedaż Redakcja zastrzega sobie możliwość zmiany zawartości pisma.
y w dru
giej p
ołow
ie lut
e go

You might also like