You are on page 1of 84

Bazy danych

2 09/2008
09/2008 (165)

SPIS TREŚCI
06 AKTUALNOŚCI 30 Oracle 11g
Rafał Kocisz – platforma przetwarzania danych
Michał Jerzy Kostrzewa
12 OPIS CD Baza danych Oracle 11g to technologia wspierająca klientów w
tworzeniu skalowalnych, bezpiecznych systemów sprawnie do-
pasowujących się do zmiennych potrzeb. W oparciu o trzydzieści
BIBLIOTEKA MIESIĄCA lat doświadczeń na polu tworzenia niezawodnych baz danych,
14 C5 – nowoczesna biblioteka kolekcji dla .NET Oracle 11g umożliwia budowę elastycznej, łatwej w zarządzaniu
Maciej Paczewski infrastruktury, jaką będziemy mogli prosto, bezpiecznie i plano-
Maciej opisuje C5, czyli nową bibliotekę kolekcji dla .NET stworzoną wo dopasować do zmieniających się wymagań.
na Uniwersytecie IT w Kopenhadze. C5 nie tylko jest użyteczną bi-
blioteką kolekcji ale również nowym podejściem do wykorzystania
kontenerów w .NET. Mimo swojego niewielkiego wieku jest ona wy- TESTOWANIE OPROGRAMOWANIA
korzystywana w przemyśle gier komputerowych, sektorze banko- 34 Była sobie inspekcja
wym, instytucjach finansowych oraz nawet w US Naval Research. Arkadiusz Merta
Arkadiusz w pierwszej części artykułu skoncentrował się na
wprowadzeniu do zagadnień z dziedziny inspekcji oraz na skon-
BAZY DANYCH struowaniu odpowiedniego procesu. Proces ten został oparty na
22 Optymalizacja bazy danych modelu PDAC, który można odnaleźć m.in. w ISO 9001. Podsta-
Marek Krokiewicz wowymi jego wyróżnikami są elastyczność, skalowalność i uni-
Każda aplikacja funkcjonuje w ramach ograniczonych zasobów sys- wersalność. Choć większość przykładów odnosi się do imple-
temu, takich jak – pamięć, czas procesora, przepustowość sieci itp. mentacji oprogramowania, autor pokazuje, że takie same regu-
Słaba wydajność SZBD to zwykle problem zużycia dostępnego za- ły dotyczą np. inspekcji dokumentów. W następnym artykule zo-
sobu. Należy więc unikać takich sytuacji, uwzględniając możliwe, staną zamieszczone uwagi dotyczące sposobów realizacji opisa-
chwilowe obciążenie systemu dodatkową pracą. nego procesu.

26 Inżynieria baz danych 42 Rzeczywisty czas czy rzeczywisty Linux?


Andrzej Dąbrowski Racjonalny wybór
Andrzej przeprowadza analizę narzędzi Embarcadero wskazując jed- Paul N. Leroux, Romain Saha
noznacznie na to, że producentowi zależy na jak największej wszech- Autorzy prezentują że pomimo tego, że system operacyjny QNX
stronności narzędzi. Są one przydatne w firmach, gdzie wykorzystuje Neutrino stanowi doskonałą platformę dla aplikacji czasu rzeczy-
się wiele serwerów baz danych oraz dokonuje się migracji pomiędzy wistego, nie ma konieczności dokonywania definitywnego wybo-
różnymi typami platform bazodanowych. Rozwiązania te rewolucjo- ru między QNX Neutrino a systemem Linux. Projektanci, którzy
nizują sposób pracy z wieloma serwerami, pozwalając użytkownikom korzystają z API standardu POSIX, mogą tworzyć programy dla
na znaczne ograniczenie czasu potrzebnego na wykonanie powierzo- obu systemów operacyjnych, wykorzystując każdy z nich tam,
nych im zadań oraz sprawniejsze ich zrealizowanie. gdzie jest to najbardziej efektywne.

Miesięcznik
PHP Software
Solutions Developer’s
jest wydawany przezJournal
Software-Wydawnictwo
(12 numerów w Sp.
roku)
z o.o. Le périodique
Dział reklamy:hakin9 est publié par
adv@software.com.pl
jest wydawany przez Software-Wydawnictwo Sp. z o.o. Software-Wydawnictwo
Prenumerata: Marzena Sp. z o.o. pren@software.com.pl,
Dmowska
Dyrektor wydawniczy: Sylwia Pogroszewska Bokserska,
tel. 02-682
+48 22 427 Varsovie,
36 79; +48 22Pologne
427 36 53
Dyrektor wydawniczy: Sylwia Małecka Tél. +48 22 887 10 10, Fax. +48 22 887 10 11
Redaktor naczelny: Patrycja Wądołowska patrycja.wadolowska@software.com.pl www.phpsolmag.org
Redaktor naczelny: Iwona Chwedoruk iwona.chwedoruk@software.com.pl Adres korespondencyjny:
Redaktorzy prowadzący: Anna Kozioł anna.koziol@software.com.pl Directeur de la publication
Software-Wydawnictwo Sp.: Jarosław
z o.o., Szumski
Kierownik produkcji: MartaMagdalena
KurpiewskaSobiś
marta.kurpiewska@software.com.pl
magdalena.sobis@software.com.pl ul. Bokserska 1, 02-682 Warszawa, Polska
tel. +48 22 427
Imprimerie, 36 91, fax :+48
photogravure 10122 244 24
Studio, 59 Tęgi
Firma
Projekt
Skład i łamanie:
okładki: Grzegorz
AgnieszkaLaskowski
Marchocka www.sdjournal.org
Ekonomiczna 30/36,redakcja@software.com.pl
93-426 Łódź
Imprimé en Pologne/Printed in Poland
DTP Manager:
Projekt okładki:Robert
Agnieszka
Zadrożny
Marchocka
robert.zadrozny@software.com.pl
Abonnement (France métropolitaine, DOM/TOM) : 1 an
KierownikPiotr
Korekta: produkcji:
Ozaist Marta Kurpiewska marta.kurpiewska@software.com.pl Dołączoną do magazynu
(soit 6 numéros) 38 € płytę CD przetestowano programem AntiVirenKit firmy
G DATA Software Sp. z o.o.
Wyróżnieni
Korekta: betatesterzy:
Mateusz Lipiński matlipinski@wp.pl
Ł. Lechert, S. Nieszwiec, R.Zacharczyk Dépôt légal : à parution
Wyróżnieni betatesterzy: P. Bańka, A. Poniedziałek, R.Zacharczyk ISSN : 1731-7037
Nakład: 6 000 egz. Distribution : MLP
Dział reklamy: adv@software.com.pl Redakcja dokłada
Parc d’activités dewszelkich
Chesnes,starań,
55 bdbydepublikowane
la Noirée w piśmie i na towarzyszących mu
Prenumerata: Marzena Dmowska pren@software.com.pl nośnikach
BP 59 F - informacje i programy były poprawne, jednakże
38291 SAINT-QUENTIN-FALLAVIER CEDEXnie bierze odpowiedzialności
Artykuły pt. „Oracle 11g – platforma przetwarzania danych” oraz „Inżynieria za
(c) efekty wykorzystania ich; nie gwarantuje
2005 Software-Wydawnictwo, także réservés
tous les droits poprawnego działania programów
Nakład:
baz danych”
6 000sąegz.
artykułami sponsorowanymi. shareware, freeware i public domain.

4 09/2008
PROGRAMOWANIE JAVA
48 Swing Application Framework – GUI na nowo
Piotr Kochański
Technologia Java Swing, pozwalająca tworzyć graficzny interfejs
użytkownika w języku Java, od samego początku swojego istnienia,
czyli od ponad 10 lat, była bardzo pechowa. Pierwsze implementa-
cje były mało wydajne i uciążliwe w użyciu, kolejne wersje tego in-
terfejsu powoli wprowadzały potrzebne ulepszenia, ale nigdy Swing
nie stał się czymś lubianym i docenianym.

PROGRAMOWANIE
URZĄDZEŃ MOBILNYCH
54 Podstawy tworzenia gier w JME
Jacek Zagrodzki
Celem artykułu Jacka jest wprowadzenie w tematykę tworzenia apli-
kacji JME, a w szczególności gier. Artykuł podzielony jest na dwie
części. Pierwsza ma formę tutoriala z jasno określonymi krokami,
które należy wykonać aby otrzymać podstawową aplikację, która
może być stosowana jako punkt wyjściowy do tworzenia gier.

66 Programowanie gier dla Symbian OS


– szkielet aplikacji
Rafał Kocisz
Rafał tym tekstem rozpoczyna cykl artykułów traktujących o progra-
mowaniu gier dla Symbian OS – jednego z czołowych graczy na ryn-
ku mobilnych systemów operacyjnych. Na dzień dzisiejszy, za cał-
kiem rozsądną cenę otrzymujemy urządzenie wyposażone w kame-
rę o wysokiej rozdzielczości, kolorowy wyświetlacz, dostęp do sze-
rokopasmowego internetu, zintegrowany moduł GPS, wysokiej ja-
kości odtwarzacz dźwięku stereo, akcelerometr i układ wspomaga-
jący renderowanie grafiki 3D w czasie rzeczywistym. No i przy oka-
zji – aparat telefoniczny. Ten szalony pęd technologiczny tworzy
ogromną, otwartą przestrzeń dla nowych aplikacji, zaś lwią ich część
stanowią gry.

WYWIAD
76 Wywiad z przedstawicielami firmy Gamelion

Uszkodzone podczas wysyłki płyty wymienia redakcja.

Wszystkie znaki firmowe zawarte w piśmie są własności odpowiednich firm zostały


użyte wyłącznie w celach informacyjnych.

Redakcja używa systemu automatycznego składu

Osoby zainteresowane współpracą prosimy o kontakt:


sdj@software.com.pl

Druk: 101studio DTP

Wysokość nakładu obejmuje również dodruki. Redakcja nie udziela pomocy


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

Sprzedaż aktualnych lub archiwalnych numerów pisma po innej cenie niż


wydrukowana na okładce – bez zgody wydawcy – jest działaniem na jego
szkodę i skutkuje odpowiedzialnością sądową.

www.sdjournal.org 5
Aktualności

Ważna fuzja w świecie


mobilnego Linuksa
Organizacje Linux Phone Standard Forum
Microsoft przejmuje firmy
P
(LiPS) oraz Linux Mobile Foundation (LiMo), o porażce w negocjacjach mających na tów Windows Mobile i Windows Live w dostar-
zajmujące się na co dzień rozwojem linuk- celu zakup Yahoo!, zarząd Microso- czaniu innowacyjnych i bezprzewodowych spo-
sowych rozwiązań dla urządzeń mobilnych ftu nie spoczął na przysłowiowych lau- sobów na stałą łączność. Na chwilę obecną nie
połączyły siły, bym móc stawić czoła swoim rach i szykuje się do kolejnych zakupów. W są znane szczegóły dotyczące terminu i warun-
rynkowym konkurentom – platformie Andro-
jednym z wywiadów przedstawiciele Micro- ków ewentualnego przejęcia portugalskiej kor-
id oraz Symbianowi. Obie wspomniane fun-
dacje od początku swojego istnienia praco- softu poinformowali o planach koncernu, do- poracji, wiadomo natomiast, iż po przejęciu zo-
wały nad ułatwieniem wprowadzenia syste- tyczących nabycia portugalskiej firmy Mobi- stanie ona częścią microsoftowego działu Mo-
mu operacyjnego Linux do urządzeń prze- Camp. Firma MobiCamp została założona w bile Communications Business i wesprze pra-
nośnych. LiPS zajmowała się opracowaniem roku 2000 w Bradze w Portugalii, specjalizuje ce nad rozwiązaniami dla platformy Windows
API, które umożliwiłoby rozwój oprogramo- się w dostarczaniu rozwiązań dla rynku urzą- Mobile oraz usługami sieciowymi Windows Li-
wania dedykowanego dla mobilnych rozwią-
zań. Z kolei LiMo skupiało się nad stworze-
dzeń mobilnych. Opracowała i ciągle rozwija ve. Microsoft zamierza również kupić firmę Po-
niem platformy, która umożliwiłaby progra- oprogramowanie MobileKeeper Backup & Re- werset specjalizującą się w mechanizmach wy-
mistom łatwe kreowanie oprogramowania store, MobileKeeper Sharing & Communities szukiwawczych wykorzystujących zapytania se-
dla smartphone'ów. Teraz natomiast człon- i Active mTicker, które używane jest przez du- mantyczne, oparte na języku naturalnym. Fir-
kowie LiPS wraz z realizowanymi przez siebie że przedsiębiorstwa do tworzenia kopii zapaso- ma ma zostać przejęta za co najmniej 100 mi-
projektami trafią do LiMo, które na chwilę
wych danych zgromadzonych na smartfonach, lionów dolarów. Oficjalne ogłoszenie pojawi się
obecną jest największą organizacją zajmu-
jącą się rozwojem mobilnych wersji platfor- publikacji ich zawartości w serwisach społecz- w ciągu miesiąca. Na razie ani Microsoft ani Po-
my Linux. Obserwując ostatnie poczynania nościowych, jak np. Facebook itp. Microsoft werset nie chcą komentować transakcji. Czemu
na rynku urządzeń przenośnych, fuzja orga- wraz z przejęciem MobiCamp wiąże duże na- mają służyć te wszystkie zakupy? Tego do koń-
nizacji LiPS oraz LiMo ma jak największy sens. dzieje na polepszenie jakości i funkcjonalno- ca nie wie zapewne nikt, poza kluczowymi pra-
Z jednej strony zmniejszy się ilość przedsię- ści swoich produktów oraz usług, świadczą o cownikami korporacji z Redmond. Faktem jest
wzięć, których głównym celem jest tworze-
tym słowa Todda Petersa, wiceprezesa działu jednak to, że Microsoft ciągle nie potrafi stwo-
nie konkurencyjnych rozwiązań, a z drugiej
umożliwi opracowanie innowacyjnych tech- Mobile Communications Business w Micro- rzyć wyszukiwarki, która byłaby konkurencją
nologii, które będą w stanie rywalizować na sofcie – „Użytkownicy oczekują od swoich te- dla Google. Nie pomagają zapewnienia Ballme-
rynku z oprogramowaniem komercyjnym. lefonów, by te dostarczały im najlepsze funk- ra, że programiści Live Search są tylko o krok od
http://www.limofoundation.org/ cjonalności znane z komputerów stacjonar- sukcesu. Konieczne są więc zakupy. Ponieważ
nych oraz dawały możliwość surfowania w In- nie wyszło z Yahoo!, Microsoft musi rozglądać
Microsoft wyróżnia polskie firmy
Laureatami tegorocznego konkursu Micro- ternecie”. Peters dodał także, iż Microsoft in- się za innymi firmami. Być może nowe nabytki
soft Partner Program Awards w regio- westując we właściwe rozwiązania takich firm okażą się tym, czego w Redmond brakowało.
nie Europy Środkowo-Wschodniej zostały jak np. MobiCamp zwiększy potencjał produk- http://news.zdnet.co.uk/
cztery polskie firmy. W tym roku jury kon-
kursu doceniło krakowski Axence za opro-

MSN.pl oficjalnie uruchomiony


gramowanie do zarządzania siecią nVision,
krakowski Comarch za system klasy ERP do
zarządzania przedsiębiorstwem Comarch

P
ALTUM, warszawską firmę DCS Computer o kilku miesiącach testów Microsoft sja MSN jest pierwszym samodzielnym porta-
Consultants Group za aplikację Orange E- oficjalnie uruchomił polską wersję por- lem z rodziny MSN w Europie Środkowej, fir-
mail Box, zaimplementowaną u operatora talu MSN. Jest to 21 wersja językowa ma podchodzi więc do niej na razie ostrożnie.
Orange oraz wrocławski IT-Dev za rozwiąza-
portalu utrzymywana przez Microsoft. Wielu Michał Kostrzewa, kierownik działu produk-
nie IT-Dev SharePoint DSL ToolKit for Visual
Studio. Ciekawostką jest, że jedno z rozwią- rodzimych użytkowników czekało na nią od tów MSN w polskim oddziale Microsoft, wy-
zań – Comarch ALTUM – w chwili obecnej dawna, zwłaszcza biorąc pod uwagę fakt, że powiedział się, iż wierzę, że portal MSN znaj-
nie jest jeszcze w ogóle oferowane w Polsce. dotąd brakowało obecnej za granicą integracji dzie swoje miejsce na rynku, a jego popular-
System ten powstał z myślą o rynkach zagra- usług Windows Live z witryną MSN. Co znaj- ność pozwoli korporacji z Redmond dołączyć
nicznych – przede wszystkim Niemczech, dziemy w portalu MSN.pl? Serwis stawia na w perspektywie kilku lat do czołówki polskie-
Ukrainie, Włoszech, Stanach Zjednoczo-
informację i rozrywkę. Najnowsze wiadomo- go rynku internetowego – powiedział. Warto
nych oraz Wielkiej Brytanii. Wersja dostoso-
wana do polskich wymagań ma pojawić się ści z kraju i ze świata dostarczać będzie Agora, przypomnieć, że pod koniec ubiegłego roku
w 2009 roku pod nazwą CDN Altum. Micro- wydawca Gazety Wyborczej. Część rozrywko- uruchomiony został inny portal przeniesio-
soft Partner Program Awards to konkurs wa i zawartość multimedialna tworzona bę- ny z amerykańskiego rynku – AOL.pl. Mimo
w którym wyróżniane są firmy oferujące dzie z pomocą Sony BMG, MTV i Starlounge. upływu miesięcy nie zdobył on jednak więk-
innowacyjne rozwiązania przygotowane na
Na razie portal jest dość ubogi w treść i póki szej oglądalności i jak na razie nic nie wskazu-
bazie narzędzi i rozwiązań firmy Microsoft.
Zwycięzcy i finaliści konkursu zostali oficjal- co sporą powierzchnię zajmują reklamy (głów- je aby miało się to zmienić. Podobnie stało się
nie nagrodzeni podczas Microsoft Worldwi- nie usług Microsoftu) – firma zapowiada jed- zresztą z serwisem aukcyjnym eBay.pl, który
de Partner Conference 2008 – ogólnoświa- nak, że zawartość będzie stale poszerzana. W po szumnych zapowiedziach dogorywa. Czy
towej konferencji dla partnerów firmy, która ramach jedynej premierowej atrakcji urucho- z MSN.pl będzie inaczej? Na pewno Micro-
odbyła się w tym roku w Houston, w dniach miono 1 lipca konkursu na najlepszy mini soft, za sprawą ugruntowanej pozycji na pol-
7-10 lipca. Warto dodać, że w ubiegłorocz-
klip wideo. Do wygrania była konsola Xbox skim rynku, ma dużo szersze możliwości pro-
nej edycji konkursu Microsoft Partner Pro-
gram Awards nie została nagrodzona żadna 360. Na świecie z różnych wersji językowych mocji swojego portalu. Czy to wystarczy – po-
firma z Polski. MSN korzysta miesięcznie ponad 465 milio- każe czas.
http://dobreprogramy.pl nów unikalnych użytkowników. Polska wer- http://www.microsoft.com/poland

6 9/2008
Aktualności

Fiji nie na sprzedaż Chiny blokują SourceForge.net


Niedługo od zniesienia przez chińskie
władze blokady na anglojęzyczną wersję

N
azwa kodowa „Fiji” w kontekście która będzie dodawać obsługę nowych stan- internetowej encyklopedii Wikipedia,
produktów Microsoftu funkcjonuje dardów telewizyjnych, zapewni nowe inte- chińscy decydenci zdecydowali się dla
już od dosyć dawna. Odkąd świat o raktywne funkcje oraz ulepszy interfejs użyt- odmiany zablokować dostęp do stron
niej usłyszał, nie słabną spekulacje na temat te- kownika i proces instalacji Media Center. Jak projektu SourceForge. Decyzja chińskich
władz może bezpośrednio odnosić się do
go, co też firma z Redmond przygotowuje pod nietrudno się domyślić, Green poinformował niedawnych protestów przeciw letnim
tym kryptonimem. Do tej pory udało się usta- też, że ostateczna nazwa produktu będzie zu- Igrzyskom Olimpijskim rozgrywanym w
lić, że będzie to najprawdopodobniej coś zwią- pełnie inna, niż kryptonim obowiązujący w Pekinie, stolicy Chin. Kilka dni wcześniej
zanego z Media Center, ale korporacja nie- fazie beta. Zachowanie rządu Fiji może wyda- autor popularnego edytora dla programi-
chętnie chwaliła się swoją pracą. Niezależnie wać się nieco dziwne – Microsoft, jak i wie- stów Notepad++, dostępnego na łamach
SourceForge.net rozpoczął bojkot Pekinu,
od tego, całą sprawą najwyraźniej bardzo prze- le innych firm na świecie wykorzystuje rozma-
tłumacząc, iż nie kieruje on swojego sprze-
jął się rząd Fiji, który poprzez swoich prawni- ite nazwy kodowe dla swoich projektów. Przy- ciwu przeciwko ludziom w Chinach, a rzą-
ków wystosował oficjalne i bardzo stanowcze kładowo, Whistler (później Windows XP) to dowi chińskiemu. Bojkot dotyczy sytuacji
pismo, w którym oświadcza, że nie zgadza się szczyt w Kanadzie, a Longhorn (Windows Vi- politycznej w Chinach, ale odnosi się także
na jakiekolwiek wykorzystanie nazwy kraju sta) to bar położony u podnóża gór Whistler i do tamtejszego problemu praw człowie-
do celów marketingowych, a w razie koniecz- Blackcomb (początkowo następca Visty, póź- ka. Władze chińskie regularnie bloku-
ją dostęp do stron, poruszających wrażli-
ności jest przygotowany do obrony swoich niej nazwę porzucono). Nazwy wysp, pasm
we tematy polityczne Chin, ale czy sprze-
praw. Na list natychmiast odpowiedział Ben górskich czy nawet miast np. Windows Vien- ciw twórcy jednej z aplikacji dostępnej na
Green z działu Windows Client firmy Micro- na) są więc często używane. Pytanie – gdzie łamach strony SourceForge jest powodem
soft, przy okazji – chcąc, nie chcąc – ujawnia- leży granica? Widocznie w oczach urzędni- do całkowitej blokady dostępu do tegoż
jąc rąbka tajemnicy na temat nowego produk- ków Fiji została ona przekroczona. Właściciele projektu?
tu. Zapewnił on, że Fiji to po prostu nazwa ko- Longhorn Saloon byli innego zdania. http://www.moon-blog.com/
dowa aktualizacji do Windows Media Center, http://news.zdnet.co.uk/ Google pozwane
na prawie miliard dolarów
Firma LimitNone oskarżyła Google o kra-

Hyper-V oficjalnie wydany dzież jej pomysłów i zażądała 950 milio-


nów dolarów odszkodowania. LimitNone

M
uważa, że Google bezprawnie wykorzysta-
icrosoft opublikował w centrum że wprowadzenie do sprzedaży zintegrowa-
ło w swojej aplikacji Google Email Uplo-
prasowym oficjalną informację, nych serwerów, już zawierających wbudowa- ader rozwiązania z jej programu gMove.
że platforma wirtualizacyjna Hy- ny Hyper-V. Są wśród nich HP, Dell, IBM, Fu- Program ten służył do migracji poczty i
per-V została skierowana do produkcji. W be- jitsu, Hitachi, NEC oraz Unisys. Cena Hy- kalendarza. Ray Glassmann, szef Limit-
ta testach aktywnie brało udział ponad 250 per-V w takiej konfiguracji będzie wynosić 28 None, uważa, że choć dewizą Google jest
aby nie być złym, Google zaprosiło Limit-
firm partnerskich Microsoftu, a także wiele dolarów. Kupując natomiast licencję na Win-
None do współpracy, a potem ukradło jej
innych – na własną rękę. Łącznie wersję be- dows Server 2008 zawierającą Hyper-V otrzy- technologię. Podkreśla, iż pomimo tego,
ta pobrano półtora miliona razy. Hyper-V to muje się dodatkowe licencje na systemy wir- że jego firma jest mała to jej działalność
platforma wirtualizacyjna o architekturze ty- tualne pracujące w ramach pierwszej, fizycz- powodowała wzrost sprzedaży produk-
pu 1 (hypervisor) i rozmiarze około 1 MB, za- nej instancji – jedną w przypadku edycji Stan- tów Google.
rządzająca systemami wirtualnymi w party- dard, cztery dla edycji Enterprise i nieograni- http://betanews.com/
cjach, gdzie na partycji podstawowej pracu- czoną ilość dla edycji Datacenter. Te dodatko- Google zaprzecza opóźnieniu
je system Windows Server 2008 (w wersji we licencje nie ograniczają jednak użytkowni- Androida
pełnej lub Server Core). Obsługuje systemy ka do platformy Hyper-V. Za sprawą publikacji The Wall Street Jour-
wirtualne 32- i 64-bitowe, do 4 wirtualnych http://www.techit.pl/ nal, świat opanowała informacja o rzeko-
procesorów i do 64 GB pamięci RAM na sys- mym opóźnieniu premiery nowego sys-
temu Google dla urządzeń mobilnych
tem. Oficjalnie jako systemy wirtualne wspie-
– Android. Powodem takie stanu rzeczy
rane są Windows 2000/2003/2008, Win- miały być problemy po stronie operatorów
dows XP/Vista oraz Novell SUSE Enterpri- T-Mobile i Sprint Nextel. Android na rynku
se Linux. Hyper-V posiada dodatkowo funk- miał być więc tak naprawdę widoczny
cję szybkiej migracji maszyn wirtualnych po- dopiero w 2009 roku. Google po raz kolej-
między fizycznymi serwerami (choć wyma- ny oficjalnie zaprzecza takim informacjom.
Firma stanowczo stwierdza, że pierwsze
ga to niestety wcześniejszego ich wstrzyma-
urządzenia mobilne z systemem Android
nia – migracja na żywo, podobnie jak możli- na pokładzie zadebiutują jeszcze w drugiej
wość modyfikowania parametrów fizycznych połowie tego roku. Google zaznacza rów-
maszyny w trakcie pracy zostały wycięte z fi- nież, że obserwuje duże zainteresowanie
nalnego produktu ponad rok temu). W usłu- Androidem ze strony producentów sprzę-
dze Windows Update dla systemów Windows tu. Taki obraz sytuacji wydaje się potwier-
dzać słowa Kevina Chena z HTC, który kilka
Server 2008 w wersjach 64-bitowych z licen- dni temu zapowiedział premierę pierwsze-
cją na Hyper-V nowy produkt pojawi się w go smartfonu HTC z systemem Android na
postaci aktualizacji w okolicach 8 lipca. Sze- koniec 2008 roku.
reg producentów sprzętu zapowiedziało tak- http://betanews.com/

www.sdjournal.pl 7
Aktualności

Linuksowe repozytorium
firm i specjalistów
Stowarzyszenie Linux Profesjonalny urucho-
Korporacje – „nie” dla Visty!
F
miło pierwsze w Polsce repozytorium osób irmy Intel oraz General Motors dołączyły
i firm specjalizujących się w zagadnieniach do grona korporacji, które rezygnują z cał-
związanych z systemem Linux. Serwis http: kowitej migracji na platformę Windows
//www.linuxpro.org.pl rozpoczął swoją działal- Vista. Takie informacje podał do wiadomości
ność i w pierwszym etapie zaprasza do reje-
dziennik New York Times powołując się na rze-
stracji osoby bądź firmy, które mogą pomóc
we wdrożeniu Linuksa w domu lub firmie. komo sprawdzonych informatorów. Decyzja ta
Linuksowe repozytorium firm i specjalistów podjęta została po analizie kosztów i korzyści mi-
to serwis internetowy, który powstał w celu gracji do najnowszego systemu operacyjnego Mi-
ułatwienia komunikacji pomiędzy osoba- crosoftu, który swoją premierę miał już 18 mie-
mi i firmami specjalizującymi się w zagad- sięcy temu. Zarząd Intela planuje wstrzymać się z
nieniach dotyczących systemu Linux, a ich
potencjalnymi klientami z pobliskiego miasta
migracją do momentu wydania środowiska Win-
czy regionu. Podstawą serwisu jest baza kon- dows 7, czyli do roku 2010. Pomimo tego, iż fir-
taktów do firm i osób prywatnych, które spe- ma Intel korzysta z Visty w swoich pojedynczych
cjalizują się w dziedzinie Wolnego Oprogra- oddziałach, to całkowita aktualizacja wszystkich
mowania. Korzystając z wyszukiwarki na stro- stanowisk komputerowych do tego systemu ope- także informacja o rezygnacji z migracji do pa-
nie można będzie znaleźć fachowca, który nie
racyjnego nie wchodzi na chwilę obecną w grę i kietu biurowego Microsoft Office 2007. Warto
tylko wdroży Linuksa w domu czy firmie, ale
także w razie potrzeby zajmie się administra- około 80 tys. pracowników nadal korzystać będą przypomnieć, że w gronie przedsiębiorstw, które
cją serwerami i zadba o ich bezpieczeństwo. na swoich komputerach z Windowsa XP. Z ba- nie przeprowadzą migracji do Windows Vista, a
Jeżeli nie znajdzie się specjalisty spełniające- dań przeprowadzonych przez analityków rynko- wstrzymają się do wydania jego następcy znaleźć
go określone wymagania, można wówczas wych wynika, iż około 30 procent klientów biz- można m.in. firmy Intel i General Motors. Przed-
zamieścić ogłoszenie, które ukaże się na stro- nesowych decyduje się na „przeskoczenie” któ- stawiciele korporacji Daimler oznajmili, iż firma
nie i w kanałach RSS. Firmy oraz osoby pry-
rejś z edycji systemu Windows. Zdaniem Mi- nie zamierza rozpoczynać migracji do Visty, a za-
watne zajmujące się Wolnym Oprogramowa-
niem i zainteresowane obecnością w serwisie chaela Silvera, analityka z firmy Gartner, w przy- trzyma się z aktualizacją środowiska operacyjne-
mogą się rejestrować na specjalnej podstro- padku Visty takich właśnie przedsiębiorstw bę- go na stanowiskach komputerowych do momen-
nie: http://www.linuxpro.org.pl/rejestracja. dzie o wiele więcej. Jedną z głównych przyczyn tu wydania Windowsa 7, czyli do roku 2010. Po-
http://www.linuxpro.org.pl/o-stowarzyszeniu braku zainteresowania Vistą przez duże firmy dobne stanowisko przyjął motoryzacyjny poten-
jest fakt, iż system ten posiada duże wymagania tat w sprawie „przeskoczenia” pakietu Office
Red Hat pracuje
nad linuksowym hypervisorem sprzętowe, co w dzisiejszych realiach wiąże się z 2007 i wstrzymania się z migracją do wydania
Red Hat ogłosił, że pracuje nad wbudowanym gigantycznymi wydatkami, które przecież mogą kolejnej wersji. Pomimo tych deklaracji przed-
linuksowym hypervisorem, który według pro- zostać dużo lepiej zaplanowane. Do grona kor- stawiciele Daimler zapewnili, że na chwilę obec-
ducenta ma być uzupełnieniem, a nie konku- poracji, które najnowszemu systemowi Micro- ną nie rozważają opcji zmiany dostawcy oprogra-
rencją dla istniejącego już rozwiązania Xen. softu mówią stanowcze „nie” dołączyła firma Da- mowania i usług.
Aktualnie Embedded LInux Hypervisor znaj-
imler. Nie byłoby w tym fakcie nic niezwykłego, http://www.nytimes.com/
duje się w fazie beta i nie ma jeszcze informa-
cji co do planowanego terminu ukończenia gdyby oprócz rezygnacji z Visty nie pojawiła się http://www.heise.de/
prac i metody dystrybucji. To będzie pierwszy
linuksowy hypervisor open-source – mówił
Paul Cormier, jeden z szefów działów Red Hat.
To system operacyjny następnej generacji Eclipse 3.4
U
– dodaje tłumacząc, że mówiąc o wirtualizacji
i systemach operacyjnych powinno się myśleć kazała się nowa wersja popularne- składa się on z siedmiu różnych pakietów opro-
o nich jak o całości. Fundamentem nowego go darmowego środowiska programi- gramowania, które zostały przystosowane do
hypervisora będzie projekt Kernel-based Vir- stycznego Eclipse, które zgodnie z tra- zastosowań na szeroką skalę. Wśród nich zna-
tual Machine, już zintegrowany z jądrem dycją otrzymało nazwę kolejnego księżyca Jowi- lazły się m.in. Eclipse IDE for Java EE Develo-
Linuksa od 2006 roku. KVM umożliwia m.in. sza – Ganymede. Aktualizacja powiązana jest pers, Eclipse Classic, Eclipse IDE for Java Deve-
migrację wirtualnych maszyn on-line i oferu-
z wydaniem pakietów od 23 zespołów zrzeszo- lopers, Eclipse IDE for C/C++ Developers, Eclip-
je rozbudowane funkcje wysokiej dostępno-
ści. Wysiłek Red Hata w dziedzinie wirtualizacji nych w projekcie Eclipse. Projekt Eclipse powstał se Modeling Tools, Eclipse for RCP/Plug-in De-
skupiony był jak dotąd na projekcie Xen. Teraz w roku 2001 z inicjatywy firmy IBM, aktualnie velopers oraz nowy pakiet Eclipse IDE for Java
jest to produkt Citrixa. Na pytanie, czy podję- and Report Developers. Z racji tego, iż platforma
cie prac nad nowym hypervisorem oznacza, jest bardzo elastyczna, każdy użytkownik za po-
że firma widzi dla siebie mizerne perspektywy średnictwem systemu wtyczek może ją niemal
w technologii Xen, Red Hat wymijająco odpo-
dowolnie dostosować do swoich potrzeb. Obec-
wiada, że chciałby udostępnić klientom obie
platformy i wybór najlepszego dla nich roz- nie obsługuje ona następujące języki programo-
wiązania. Niejasny jest też sposób dystrybucji wania – Java, C/C ++, Perl, PHP, Python, Cobol
hypervisora – być może będzie zintegrowany oraz HTML. W nowej odsłonie Eclipse wprowa-
z Red Hat Enterprise Linux (tak jak w tej chwili dzono cały szereg usprawnień mających na celu
w wersji 5 zintegrowano Xen). Póki co wersję
ułatwienie pracy i zwiększenie produktywności
beta Embedded Linux Hypervisor można
pobrać z witryny oVirt (http://ovirt.org/). programistów. Opis wspomnianych usprawnień
http://www.techit.pl/ znaleźć można na witrynie projektu.
http://www.eclipse.org/

8 9/2008
Aktualności

Nokia otworzy Symbiana Java wolna w 100%


Proces otwierania Javy trwa od ponad
dwóch lat. W jego efekcie Java zosta-

N
ajwięksi światowi producenci tele- ni mają możliwość wyboru pomiędzy różny- ła wydana na licencji GPL. Pozostało
fonów komórkowych, w tym Nokia, mi platformami. Poza samą Nokią, Fundację jednak około 5% kodu, które nie zosta-
Sony Ericsson, Motorola i NTT DO- planują wesprzeć również takie firmy jak Sony ło uwolnione. Free Software Founda-
COMO poinformowali o planach połączenia Ericsson, Motorola, LG Electronics, Samsung tion nazwała to pułapką Javy. W celu jej
ominięcia powstał projekt IcedTea. Pro-
Symbiana, UIQ oraz MOAP(S), w celu utwo- Electronics i STMicroelectronics oraz najwięk- jekt ten bazuje na GNU Classpath i ma
rzenia jednej otwartej platformy. Nokia za- si światowi giganci telekomunikacyjni – NTT na celu stworzenie wolnej implementa-
mierza przejąć wybrane części Symbian Limi- DoCoMo, AT&T Texas Instruments, czy też cji własnościowego fragmentu Javy w
ted nie będące jeszcze w posiadaniu przez niko- Vodafone. Fundacja ma zacząć pracować tuż OpenJDK. Najnowsza wersja OpenJDK
go, a następnie przekazać Symbiana i S60 nowo po całkowitym przejęciu Symbiana przez No- zawarta w linuksowej dystrybucji Fedora
9 spełniła rygorystyczne wymogi Java
powstałej Fundacji. Tym samym, otwarcie Sym- kię, czyli w pierwszej połowie 2009 roku. Ser-
Test Compatibility Kit (TCK). Oznacza to,
biana przez Nokię wydaje się ciosem skierowa- wis Slashdot podaje, że kod Symbiana ma być że dostarcza wszystkie wymagane API
nym w stronę Androida, nowego systemu pro- dostępny na wolnej licencji Eclipse Public Li- Javy i działa dokładnie tak jak inne imple-
dukcji Google dla urządzeń mobilnych. Acz- cense (EPL) 1.0. mentacje Javy SE 6. Java TCK jest wszech-
kolwiek już teraz, także użytkownicy mobil- http://osnews.pl/ stronnym testem, mającym ponad milion
linii kodu, który sprawdza czy dana
implementacja Javy jest zgodna ze spe-

List Microsoftu do klientów


cyfikacją. W tej chwili wymogi Java TCK
spełnia tylko Fedora 9, ale można się spo-
dziewać, że jej śladami pójdą też inne sys-

Windows – co dalej? temy Linuksowe.


http://www.osnews.com/

P
onad miliard komputerów na świe- specjalnymi, niskobudżetowymi notebookami.
Microsoft
cie pracuje dzisiaj pod kontrolą syste- Co ze wsparciem technicznym i aktualizacjami znów Najlepszym Pracodawcą
mu Windows – za to Microsoft dzię- zabezpieczeń? Również tutaj nic się nie zmie- Microsoft zdobył tytuł Najlepszego Pra-
kuje swoim klientom na początku listu otwar- ni. Jeszcze ponad rok temu Microsoft wydłu- codawcy w Europie Środkowo-Wschod-
tego, jaki Bill Veghte, Senior Vice President żył okres wsparcia technicznego do 2014 ro- niej, w corocznym rankingu przeprowa-
wystosował do użytkowników swojego flago- ku. Przez blisko sześć następnych lat Windows dzonym wśród ponad 500 firm z dwuna-
stu krajów naszego regionu. Firma zosta-
wego produktu. Zbliżając się do znaczącej da- XP pozostanie więc bezpieczny. Microsoft w li-
ła uhonorowana tytułem po raz trzeci
ty 30 czerwca 2008, kiedy zakończona zosta- ście dzieli się też informacjami na temat Win- z rzędu. W tegorocznej edycji rankingu
nie sprzedaż detaliczna i dystrybucja do part- dows Vista. Firma chwali się, że system obsłu- Microsoft znalazł się na czołowych miej-
nerów OEM systemu Windows XP, Microsoft guje już ponad 77 tysięcy urządzeń i 98 z listy scach w siedmiu krajach – w tym w Polsce.
informuje o skutkach tej decyzji oraz planach Top 100 aplikacji na świecie. Filtr antyphishin- Wyniki opracowano na podstawie kwe-
stionariuszy wypełnionych przez niemal
na najbliższe lata. Zakończenie sprzedaży Win- gowy Internet Explorera blokuje natomiast po-
120 tys. pracowników oraz 3 tys. przed-
dows XP przypada na 30 czerwca. Po tym ter- nad milion szkodliwych stron tygodniowo. Vi- stawicieli najwyższej kadry menedżerskiej
minie Microsoft przestanie dostarczać partne- sta to jednak nie wszystko. Microsoft zapowia- z firm z całego regionu. Ocenie podlega-
rom paczki z systemem, podobnie zamknięty da wydanie kolejnego systemu z rodziny Win- ło zaangażowanie osób zatrudnionych w
zostanie kanał sprzedaży OEM. Firma przypo- dows – na razie oznaczonego kodowo jako „7”. firmie oraz stosowane praktyki w zakre-
mina jednak, że takie rozwiązanie nie zamyka W liście oficjalnie podano, że jego premiery na- sie zarządzania zasobami ludzkimi. Bada-
nie przeprowadziła firma doradztwa stra-
drogi do użytkowania Windows XP na nowych leży oczekiwać około trzy lata po premierze
tegicznego – Hewitt Associates. Najlep-
komputerach – wystarczy zakupić Windows Windows Vista. Termin ten przypada zatem na szy Pracodawca jest konkursem, w którym
Vista w edycjach Business lub Ultimate, które styczeń 2010. Nowy system będzie zbudowany pracodawcę oceniają jego pracownicy.
posiadają prawo do downgrade'u do Windows na fundamentach Windows Vista – nie będzie Od innych tego typu inicjatyw konkurs
XP Professional. Sprzedaż Windows XP Ho- żadnych spektakularnych zmian w jądrze. Najlepszy Pracodawca wyróżnia metodo-
me i Starter będzie też kontynuowana wraz ze http://www.microsoft.com/poland logia, bazująca na audycie stosowanych w
organizacji systemów, programów i prak-
tyk z zakresu zarządzania zasobami ludz-
kimi, analizie zaangażowania pracowni-
ków oraz ocenie roli funkcji personalnej z
perspektywy najwyższej kadry menedżer-
skiej. W naszym regionie udział w badaniu
wzięło udział 591 firm z dwunastu krajów:
Austrii, Bułgarii, Chorwacji, Czech, Węgier,
Słowacji, Słowenii, Turcji, Polski, Rumunii,
Rosji i Ukrainy. Konkurs na Najlepszego
Pracodawcę jest przeprowadzany przez
Hewitt Associates w kilkudziesięciu kra-
jach na całym świecie. Pierwsza edycja
miała miejsce w Stanach Zjednoczonych
w 1994 r.
http://www.microsoft.com/poland

www.sdjournal.pl 9
Aktualności

92% programistów ignoruje Vistę


Według badania Evans Data (http:
//www.evansdata.com/) zaledwie 8% pro-
Firefox 3
S
gramistów tworzyło aplikacje dla systemu tało się! Miesiąc po wydaniu pierwszej ciej odsłony Ognistego Liska nie da się po-
Windows Vista w kwietniu. Dla porówna- wersji kandydującej światło dzienne minąć planowanej przez Mozillę próby usta-
nia dla XP pisze około 49% programistów. oficjalnie ujrzała stabilna wersja prze- nowienia nowego rekordu Guinnessa w licz-
Vista jest wśród programistów mniej popu- glądarki Firefox 3. Nowy Ognisty Lisek w po- bie pobrań aplikacji w ciągu 24 godzin. Z tej
larna od GNU/Linuksa. Oprogramowanie na
ten system tworzy 9%-11% programistów.
równaniu do wersji 2.0.0.14 wnosi całkiem właśnie okazji, dzień wydania trzeciej odsło-
Większym powodzeniem od Visty cieszy sporo nowości. Pierwsze co rzuca się w oczy ny Firefox'a nazwany został „Dniem Pobiera-
się też Windows Server 2003, który osiągnął to odświeżony interfejs, integrujący się z wy- nia” (ang. Download Day). Już od przeszło
wynik 11%. Przewiduje się, że w przyszłym glądem używanego systemu i nowa domyśl- paru tygodni przed wypuszczeniem „trój-
roku popularność Visty wzrośnie do pozio- na skórka. Prócz tego rozwinięto mechanizm ki”, korporacja przekonywała członków swo-
mu 24% i zbliży się do wyniku Windows XP:
ochrony przed różnego rodzaju złośliwym jej globalnej społeczności do rozpowszech-
29%. Udział Linuksa ma wzrosnąć do 15%.
Ze względu na szereg krytycznych opinii o oprogramowaniem, zwiększono integrację z niania informacji i włączenia się do akcji, po-
najnowszym klienckim systemie operacyj- zainstalowanymi programami zabezpieczają- przez organizowanie specjalnych imprez, czy
nym Microsoftu wielu programistów przy- cymi oraz dodano wsparcie dla certyfikatów też umieszczania na swoich stronach interne-
jęło postawę wyczekującą. Niektórzy z nich Extended Validation SSL i modułu kontroli towych przycisków promujących akcję. Jed-
chcą nawet przeczekać Vistę i zacząć pisać rodzicielskiej systemu Windows Vista. Prze- ną z form było również składanie deklara-
pod Windows 7. Innym czynnikiem odstra-
pisano także zupełnie od nowa mechanizm cji online, na czele listy których, pod wzglę-
szającym autorów oprogramowania jest fakt,
że pisanie dla Visty jest trudniejsze. Jest to odpowiedzialny za zarządzanie pamięcią, dem ilości osób, Polska uplasowała się w czo-
spowodowane mechanizmami zabezpiecza- dzięki czemu nowy Firefox nie pobiera tak łówce, tuż obok Stanów Zjednoczonych, Bra-
jącymi, a także mniejszą kompatybilnością. dużo pamięci RAM jak swój poprzednik. Do- zylii i Włoch. Niestety, wynik ten nie przeło-
http://www.cnet.com/ datkowo w „trójce” znajdziemy usprawnio- żyło się na faktyczne wyniki. że Polska uplaso-
nego menadżera przechowywania haseł, ob- wała się na 11 miejscu za Stanami Zjednoczo-
Opera nawiązuje współpracę z Allegro
Firma Opera Software, producent jednej z sługę wznawiania pobierania plików i pełny nymi (3.252.673), Niemcami (852.432), Ja-
najpopularniejszych przeglądarek interneto- zoom. Wiele zmian zostało wprowadzonych ponią (533.369), Wielką Brytanią (367.773),
wych, poinformowała tuż po premierze naj- w silniku aplikacji. Wśród nich znaleźć moż- Hiszpanią (355.335), Francją (346.319), Li-
nowszej wersji swojego produktu o nawiąza- na nową architekturę wyświetlania czcionek twą (328.785), Kanadą (294.933), Włocha-
niu współpracy z największym polskim ser-
i grafik, obsługę JavaScript 1.8, kilka zmian mi (291.305) i Iranem (264.804) z wyni-
wisem aukcyjnym – Allegro.pl. Efektem tej
współpracy ma być promowanie polskiego w sposobie renderowania HTML, styli CSS kiem 242.649 pobrań, zaś liczba wszystkich
serwisu aukcyjnego za pośrednictwem naj- i grafik SVG, menadżera profili kolorów i wyniosła blisko jedenaście milionów, co daje
nowszej wersji Opery 9.5 oraz Opery Mini wsparcie dla aplikacji uruchamianych w try- 83 terabajty pobranych danych i transfer na
4.1. Na karcie szybkiego wyboru domyślnie bie offline. Dodano również możliwość przy- poziomie 20 Gb/s. Nad przebiegiem całej ak-
pojawi się wpis dotyczący Allegro, ponad- stosowania lokalizacji i wielkości panelu wy- cji czuwał komitet Guinessa pilnując, aby nie
to mechanizm wyszukiwania wbudowany w
szukiwania, instalacji rozszerzeń bezpośred- doszło do nieprawidłowości. Szczegółowy
przeglądarkę obsługiwał będzie przeszukiwa-
nie stron serwisu aukcyjnego autorstwa QXL nio z poziomu menadżera dodatków, a tak- ranking poszczególnych państw znaleźć moż-
Poland. Jon von Tetzchner, szef Opera Softwa- że nowe strony błędów SSL z czytelniejszy- na na oficjalnej stronie akcji.
re, tłumaczy, iż Polska to dla jego firmy ważny mi informacjami. Przy okazji premiery trze- http://www.mozilla-europe.org/pl/firefox/
rynek, dlatego zdecydowała się ona na doda-
nie usługi Allegro do najnowszej wersji Opery.
http://opera.com/

IBM otworzy kod DB2?


Całkiem możliwe, że za jakiś czas IBM wyda
swój serwer bazodanowy DB2 na licencji
open-source. Chris Livesey, dyrektor ds. opro-
gramowania do zarządzania informacją w
brytyjskim oddziale IBM zaznacza, że w naj-
bliższej przyszłości nie ma co do tego kon-
kretnych planów, ale już wkrótce takie posu-
nięcie może wymusić sam rynek. Już teraz
IBM udostępnia bezpłatną, oferującą pod-
stawową funkcjonalność edycję DB2 Express.
Livesey wspomina, że firma zawsze starała się
wspierać open-source, a nawet aspirowała do
bycia liderem na tym rynku. Otwarcie kodu
DB2 wydaje się naturalnym posunięciem i
IBM z pewnością to rozważy. Priorytetem dla
IBM w dalszym rozwoju DB2 jest ścisła inte-
gracja silnika baz danych z narzędziami Busi-
ness Intelligence. W drugiej kolejności firma
planuje wprowadzenie nowej technolo-
gii kompresji danych oraz kolejne funkcje w
zakresie bezpieczeństwa i ochrony danych.
http://www.cnet.com/

10 9/2008
Aktualności

NetSprint walczy o przetrwanie Microsoft wypuszcza Open XML SDK 1.0


Microsoft udostępnił pierwszą wersję Softwa-
re Development Kit dla formatu Open XML.

P
olska wyszukiwarka NetSprint.pl ne plusy tej operacji – łatwiej będzie pozycjo- SDK zawiera interfejs programowy aplika-
oraz portal Wirtualna Polska połączy- nować witryny, ma być także mniej spamu w cji (API), który ma ułatwić tworzenie progra-
ły platformy sprzętowe. Jak deklarują wynikach wyszukiwania. Nie należy jednak mów przeszukujących, tworzących oraz wali-
obaj partnerzy, w wyniku tej operacji inter- oczekiwać, że zmiany te zagrożą pozycji Go- dujących dokumenty. Oferuje też funkcjonal-
ność związaną z modyfikacją danych oraz
nauci będą mieli możliwość przeszukiwania ogle w Polsce na rynku wyszukiwarek. We- wykonywaniem innych zadań. Z API będzie
znacznie większej bazy polskich dokumen- dług ostatnich danych badania gemiusTraf- można korzystać z poziomu każdego języka
tów. Czy powstrzyma to ekspansję Google fic, udostępnianych w serwisie Ranking.pl, wspieranego przez .NET Framework. Obecna
na polskim rynku? Wirtualna Polska współ- Google jest już na tym polu praktycznie mo- wersja SDK obsługuje wersję Office Open
pracuje z firmą NetSprint od 2002 roku. Mi- nopolistą – aż 91,7% z wizyt z wyszukiwarek XML zawartą w MS Office 2007, a więc nieco
inną od tej, która stała się standardem ISO.
mo stosowania tej samej technologii wyszuki- na polskie strony objęte badaniem pochodzi
http://www.slashdot.org/
wawczej dotąd firmy utrzymywały jednak od- bezpośrednio z domeny Google.com. Do tego
dzielne platformy sprzętowe oraz stosowały doliczyć trzeba czołowe polskie portale hory- Polska szóstym spamerem świata
zróżnicowane algorytmy wpływające na po- zontalne, które poza wspomnianą Wirtualną Z Polski pochodziło aż 3% majowego ruchu
zycję stron w wynikach wyszukiwania. Te- Polską, również korzystają mechanizmów wy- spamowego na świecie – wynika z opubliko-
wanego raportu firmy Symantec, The State of
raz zacieśniają współpracę – celem jest ujed- szukiwawczych opartych o rozwiązania Go-
Spam. Stawia to nasz kraj na szóstym miejscu
nolicenie wyników wyszukiwania w porta- ogle. Z kolei z wyszukiwarki na łamach WP.pl wśród światowej czołówki – wyżej niż Niemcy,
lu WP.pl z tymi znajdującymi się w serwi- generowanych jest jedynie 2,2% wizyt, a bez- Włochy, Tajlandię, czy Wielką Brytanię. Pierw-
sie Netsprint.pl oraz w serwisach korzystają- pośrednio z NetSprint.pl poniżej 0,1%. Dane szą pozycję zajęły Stany Zjednoczone (28%
cych z tej wyszukiwarki. Połączenie instancji te należy traktować oczywiście orientacyjnie, wszystkich niechcianych wiadomości), daleko
wyszukiwarek ma pozwolić użytkownikom niemniej oddają proporcje udziałów w pol- prześcigając pod tym względem inne państwa
– m.in. Rosję (7%), Turcję (6%), Chiny (4%), Bra-
otrzymywać bardziej trafne i bardziej aktual- skim rynku. Wydaje się, że dla tandemu WP i
zylię (4%). Specjaliści już dawno ostrzega-
ne wyniki wyszukiwania, m.in. dzięki więk- NetSprint, jedyną szansą na przynajmniej za- li przed spamem wykorzystującym bieżące
szej mocy obliczeniowej serwerów. W efekcie trzymanie ekspansji wyszukiwarki Google na wydarzenia do uwiarygodnienia przekazu. W
zmian zbieranie i indeksowanie dokumen- polskim rynku może być właśnie koncentra- maju użytkownicy w Stanach Zjednoczonych
tów ma przebiegać znacznie szybciej. Wspól- cja na jak najbardziej trafnych i rzetelnych wy- otrzymywali niechciane wiadomości od fik-
cyjnej firmy pożyczkowej. Ze względu na złą
na instancja ma być też podstawą do znaczne- nikach wyszukiwania polskiego Internetu. Je-
sytuację gospodarczą byli oni zachęcani do
go powiększenia liczby indeksowanych do- żeli wierzyć obu firmom – pierwszy krok w zaciągania szybkich pożyczek w przypadku
kumentów. NetSprint oraz WP.pl zakładają, tym kierunku został już uczyniony. Pytanie problemu ze spłatą bieżących wydatków. Ci,
że do końca roku 2008 wzrośnie ona o oko- tylko – czy nie za późno? którzy wypełnili formularz na stronie firmy, w
ło 300%. To oczywiście nie jedyne deklarowa- http://netsprint.pl/ rzeczywistości przekazywali swoje dane oso-
biste do nieznanego źródła. Według najnow-
szego raportu w maju spam osiągnął poziom
ponad 80% wszystkich wysyłanych wiadomo-

ICANN zatwierdza plany ści. Oznacza to, że tylko jedna na pięć wiado-
mości e-mail odebranych przez użytkowni-
ków nie była spamem. 27% spamu dotyczyło
uwolnienia domen tematyki produktowej, 17% – usług interneto-
wych, zaś 16% – tematyki finansowej.

W
http://dobreprogramy.pl
czerwcu bieżącego roku ICANN dowanie bardziej skomplikowany, niż dzisiaj w
(The Internet Corporation for Assi- przypadku zwykłych domen. Po złożeniu apli- Google Docs z obsługą plików PDF
gned Names and Numbers) głoso- kacji do ICANN i pomyślnym zweryfikowaniu Firma Google udostępniła nową wersję pakie-
wał nad planami uwolnienia domen najwyż- nazwy (czy nie jest obraźliwa lub nie narusza tu biurowego Google Docs, oferującego moż-
szego poziomu (TLD) i umożliwienia ich reje- praw firm i osób trzecich) trzeba będzie jesz- liwość edycji dokumentów tekstowych i arku-
szy kalkulacyjnych, poprzez przeglądarkę,
stracji. Wynik głosowania okazał się pomyślny cze słono zapłacić, znacznie więcej, niż speku- wzbogacając ją o jedną z najbardziej oczeki-
dla zwolenników nowej koncepcji. W związku lowano wcześniej – od 100 do 500 tysięcy do- wanych funkcjonalności – wsparcie dla plików
z tym można spodziewać się, że już niedługo larów. Dodatkowo podmiot rejestrujący będzie PDF. Aktualnie Google Docs pozwala na
możliwe będzie rejestrowanie nie tylko domen musiał wykazać, że jest w stanie technicznie wykonywanie podstawowych operacji zwią-
z aktualnie dostępnymi rozszerzeniami taki- utrzymać nową końcówkę – albo samodziel- zanych z obsługą tego typu plików, takich jak
podgląd, przesyłanie, czy udostępnianie. Acz-
mi jak .com, .pl lub .net, ale także ze swoim wła- nie, albo z pomocą firmy partnerskiej. Podczas
kolwiek, nie jest możliwa ich edycja, a jedy-
snym rozszerzeniem. W sieci pojawią się więc konferencji w Paryżu ICANN debatował tak- nie przenoszenie pochodzących z nich treści
nazwy zakończone na przykład .google, .ebay że nad umożliwieniem rejestracji domen naj- do innych dokumentów. Działanie pierwszej
czy .microsoft. Zaakceptowany plan musi teraz wyższego poziomu zawierających znaki spoza z nich prezentuje się bardzo podobnie do
przerodzić się w oficjalny dokument, ostatecz- alfabetu łacińskiego. Dzięki temu realna była- dostępnej w sąsiedniej usłudze Google Books
nie definiujący zasady rejestracji TLDs. Taki by rejestracja końcówek np. z chińskimi znaka- natomiast jej działanie przypomina typowe,
okienkowe aplikacje. Dodatkowo użytkowni-
dokument ma powstać na początku 2009 ro- mi. Dyskusja, na razie bez konkretnych wnio-
cy, którym został udostępniony dany doku-
ku i jeśli zostanie zatwierdzony przez zarząd sków, będzie kontynuowana na kolejnym po- ment mogą go pobrać na twardy dysk swo-
ICANN, rejestracja domen rozpocznie się w siedzeniu, które odbędzie się w listopadzie jego komputera. Niewykluczone, że podobna
pierwszym kwartale przyszłego roku. Wygląda bieżącego roku. funkcjonalność trafi też do Gmaila.
jednak na to, że proces rejestracji będzie zdecy- http://arstechnica.com/ http://mashable.com/

www.sdjournal.pl 11
Opis CD

Delphi for PHP 2.0 – pierwsze uszkodzeniach sprzętu i oprogramowania, a podczas monitoringu za-
wizualne środowisko RAD dla PHP wiadamia o możliwych naruszeniach zasad bezpieczeństwa.
Korzyści:
Delphi for PHP rewolucjonizuje tworzenie aplikacji interneto-
wych wprowadzając w pełni zintegrowane, wizualne podejście ty- • centralizuje zdarzenia Syslog, W3C i Windows, generowane
pu RAD do programowania PHP oraz dostarczając liczne kompo- przez firewall, serwery, routery, stacje robocze i inne urzą-
nenty. Rozbudowany edytor PHP, debugger oraz nowe możliwo- dzenia pracujące w sieci;
ści optymalizacji znacznie zwiększają szybkość oraz wydajność • asystent upraszczający instalację, konfigurację i zarządzanie;
tworzonego kodu. Tworzenie połączeń z czołowymi bazami da- • bezkonkurencyjne skanowanie zdarzeń z wydajnością do po-
nych w tym MySQL, Oracle, Microsoft SQL Server, PostgreSQL nad 6 milionów na godzinę;
oraz InterBase jest łatwe a zintegrowana biblioteka komponentów • wstępnie skonfigurowane reguły przetwarzania zawarte w
VCL for PHP pomaga programistom w szybkim i wizualnym two- produkcie zapewniają efektywną klasyfikację i zarządzanie
rzeniu Webowych aplikacji PHP oraz łatwym integrowaniu PHP, zdarzeniami;
JavaScript/AJAX oraz komponentów i kodu open source. • automatyczne monitorowanie zdarzeń oraz powiadamianie;
Jedynie Delphi for PHP dostarcza zarówno możliwość wglądu w • zaawansowane raporty do efektywnego monitorowania ak-
sam kod aplikacji PHP, jak też wgląd w jej projekt bezpośrednio z po- tywności w sieci, dające szybki zwrot inwestycji.
ziomu środowiska IDE. Wgląd w projekt aplikacji pozwala progra-
mistom na tworzenie interfejsów użytkowników, połączeń bazoda-
nowych oraz wielu innych elementów poprzez przenoszenie odpo-
wiednich komponentów dostępnych na Palecie Narzędzi (Tool Palet-
ce) na formatkę. Właściwości i zdarzenia (properties and events) mogą
być określane poprzez Inspektora Obiektów (Object Inspektor) a zmia-
ny we właściwościach, dotyczące np. rodzaju czcionki, koloru oraz jej
rozmiaru są natychmiast odzwierciedlane w widoku projektu.
Delphi for PHP wykorzystuje zintegrowana bibliotekę PHP o na- IntelliJ IDEA
zwie VCL for PHP. VCL for PHP jest biblioteką przechowującą prak- Przeznaczone do wykonania wydajnych opracowań – zintegrowa-
tycznie każdy kod źródłowy PHP, strukturę (framework) lub inną bi- ne środowisko intelektualne Java, zapewniające stabilny zestaw
bliotekę w postaci wizualnych komponentów wielokrotnego wyko- rozbudowanych środków narzędziowych. Możliwości funkcjonal-
rzystania. Wystarczy umieścić komponent na formatce i wykorzystać ne IntelliJ IDEA są przeznaczone dla użytkowników oraz innych
go w swojej aplikacji. Komponenty znajdujące się w bibliotece VCL osób chcących korzystać z funkcji programu.
for PHP mają wbudowane właściwości, metody i zdarzenia czyniąc z Cechy kluczowe programu:
tworzenia interfejsów Webowych proste i szybkie zadanie. Biblioteka
VCL for PHP jest w pełni elastyczna i rozszerzalna, pozwalając użyt- • pomoc intelektualna przy kodowaniu – potężny edytor, roz-
kownikowi na łatwe dodawanie nowych klas lub komponentów. poznający Java, HTML/XHTML, XML/XSL, CSS, Ruby oraz
Zaawansowany edytor oraz debuger mogą uczynić żmudny i ner- JavaScript, obsługuje struktury podobnie jak Rails i GWT, za-
wowy procesu śledzenia i wyłapywania błędów w kodzie szybkim i pewniając środowisko dla zaawansowanego kodowania. Nieza-
bezbolesnym. Delphi for PHP posiada dostosowywany edytor kodu leżnie od stosowanego przez Państwa języka, rozbudowane za-
źródłowego pozwalający na podświetlanie składni, tworzenie zakła- bezpieczenie kodu, weryfikacja poprawności, formatowanie i
dek do nawigowania po dużych plikach oraz technologię Code Insi- modelowanie – zawsze pozostają w Państwa rękach;
ght wspierającą określanie metod i właściwości. Zintegrowany debu- • nawigacja i przeszukiwanie – rozbudowana projektowa na-
ger pomaga w znajdowaniu i naprawie błędów, przeglądaniu break- wigacja struktury kodu, ułatwia analizę nawet dużych pli-
pointów oraz lokalnych i zdalnych zmiennych. Nowy zintegrowany ków, zapewniając wygodny sposób ich przeglądania. System
profiler Delphi for PHP umożliwia łatwe wyszukiwanie wąskich gar- przeszukiwania rozpoznaje elementy języków, wyświetlając
deł w aplikacjach Webowych PHP optymalizując ich wydajność. wyniki na interaktywnym panelu nawigacyjnym i pomaga
Państwu przeanalizować wszystkie znalezione pliki;
GFI EventsManager • pojemny refaktoring – duży zestaw refaktoringu (50+) rzeczy-
Zarządzanie logami zdarzeń z sieci rozległej – nie wymaga stania się wiście obejmuje każdy aspekt przetwarzania kodu i pozwala sku-
specjalistą! GFI EventsManager jest prostym w użyciu rozwiązaniem, tecznie obsługiwać i modernizować projekty. Wszystkie refak-
zbierającym informacje ze wszystkich urządzeń, które są odnotowane toringi obsługują języki i technologie Java, XML, JSP, EJB, Java-
w rejestrze zdarzeń systemu Windows, W3C i Syslog. Chwalony jest script i Ruby oraz zapewniają elastyczne sterowanie kodem;
za zaawansowane procesy obróbki zdarzeń z zastosowaniem dostar- • analiza kodu – wbudowany analizator dynamicznego kodu,
czonych reguł i filtrów, dając tym samym informację co się wydarzy- zawierający ponad 600 rodzajów weryfikacji, wykonuje w lo-
ło w infrastrukturze IT. Umożliwia to ocenienie jak pracownicy wyko- cie analizę kodu i ujawnia wspólne błędy syntaktyczne oraz
rzystują swój czas pracy np. kiedy włączają swoje komputery i z jakich inne błędy, ujawnione w procesie kompilacji. Analiza staty-
plików korzystają. Ponadto zapewnia maksymalną efektywność pra- styczna kodu wykrywa krytyczne parametry pracy, „mar-
cy sieci dzięki wczesnemu powiadamianiu o wszelkich potencjalnych twe” kody, zależności i inne problemy dotyczące kodów;

12 09/2008
Opis CD

• kompilacja, wykonanie, uruchamianie – IntelliJ IDEA współ- • Memory – 512 Mb minimum (1Gb recommended);
pracuje z licznymi kompilatorami Java. Mogą Państwo kompilo- • Disk space – 100 Mb;
wać projekty, stosując swój ulubiony kompilator bez konieczno- • Microsoft Visual Studio 2005 with Service Pack 1 or Micro-
ści instalowania zintegrowanego środowiska do wykonania opra- soft Visual Studio 2008 codename "Orcas" Beta
cowań. IntelliJ IDEA zawiera najlepszy w generacji JPDA moduł
przygotowania do pracy, posiadający prosty i wygodny interfejs DotTrace 3.1
użytkownika. Unikatowa technologia HotSwap pozwala Pań- Profiler wysokiej jakości, przy pomocy którego deweloperzy będą mo-
stwu na modyfikowanie i rekompilację elementów kodu w pro- gli dokonywać profilowania aplikacji .NET i ASP.NET, a także wykry-
cesie uruchamiania (przygotowania do pracy), bez konieczności wać fragmenty kodu programowego, ograniczającego wydajność syste-
uruchamiania procesu w całości; mu, szybciej i dokładniej niż wcześniej. Najważniejszą z funkcji odno-
• API i pluginy – istnieje ponad 300 dodatków do programu In- wionej wersji jest profil pamięci . Dzięki niemu, użytkownik może ob-
telliJ IDEA, które poszerzają jego możliwości funkcjonalne i serwować dynamiczną zmianę stanu pamięci w czasie wykorzystywa-
dodają różne wartościowe funkcje do procedury weryfikacji nia aplikacji .NET. do optymalizacji zasobów. Teraz możliwe jest rów-
kodu i refaktoringu, edytory i narzędzia, obsługę języków i ser- nież tworzenie migawek różnych momentów używania pamięci, w ce-
werów aplikacji, itd. lu dalszej analizy, w dziewięciu różnych etapach. Kolejna widoczna in-
nowacja to funkcja integracji z Microsoft Visual Studio i obróbka przy
Wymagania systemowe: pomocy programu serwisów Windows.
Znaczącą innowacją jest również opcja szybkiego przeglądu pro-
• Intel Pentium III/800 MHz or higher (or compatible); filu Quick Info, przeznaczona do natychmiastowego przeglądu
• 256 MB RAM minimum; migawek pamięci z ulepszoną filtracją.
• 1 GB RAM recommended;
• 300 MB hard disk space + at least 200 MB for caches; Wymagania systemowe:
• 1024x768 minimum screen resolution.
• Windows 32-bit;
Windows: • Processor with IA32 architecture;
• Microsoft Windows 2000, XP or 2003 Server;
• Microsoft Windows Vista/2003/XP/2000/NT 4.0 SP6a. • Microsoft .NET Framework 1.1 or 2.0;
• Internet Explorer 6;
Linux: • 512 megabytes of RAM or more is recommended;
• 40 megabytes of hard drive space;
• Red Hat Linux Fedora/9.x/8.x/7.3; • Please note – Memory profiling works only with Microsoft
• GNOME or KDE desktop; .NET Framework 2.0 applications
• JDK 1.6.
for Windows 64-bit (x64)
Mac OS X:
• A processor with x64 architecture;
• Mac OS X 10.4 (Tiger); • Microsoft Windows XP x64 or 2003 Server x64;
• 1.42 GHz G4, G5 or Intel-based Mac recommended. • Microsoft .NET Framework 2.0 x64;
• Internet Explorer 6;
ReSharper • 512 megabytes of RAM or more is recommended;
Dodatkowy moduł dla środowiska developerskiego dla C#, Visual Ba- • 40 megabytes of hard drive space
sic .NET, XML, XAML, i ASP.NET. Dostęp do funkcji ReSharper po- • Please note – Memory profiling works only with Microsoft
chodzi bezpośrednio z interfejsu Visual Studio, co znacznie upraszcza .NET Framework 2.0 applications
tworzenie programów o dobrej jakości przez indywidualnych dewelo-
perów lub grupy. ReSharper jest dostępny w trzech wersjach – pełna, TeamCity 3.1
C# i Visual Basic .NET. Daje deweloperom innowacyjne narzędzia do Innowacyjne, niezależne środowisko deweloperskie do stałej integracji i
refaktoringu, udoskonalone mechanizmy testowania modułowego i efektywnej pracy nad kodem aplikacji Java i .NET. Pakiet TeamCity za-
wiele innych opcji. JetBrains ReSharper gwarantuje podniesienie efek- wiera wtyczki Eclipse, Microsoft Visual Studio, i IntelliJ IDEA, które za-
tów pracy programistów, zapewniając im inteligentne narzędzia uła- bezpieczają funkcje zintegrowanych środowisk deweloperskich.Team-
twiające wpisywanie kodu, narzędzia do wykrywania i szybkiego po- City automatyzuje i koordynuje kluczowe procesy współdziałania, za-
prawiania błędów, a także opcje projektowania wstecznego. cieśnia integrację z wieloma środowiskami deweloperskimi, jak również
przyspiesza i upraszcza procesy testowania i analizy kodów aplikacji.
Wymagania systemowe: Nowa wersja zawiera wiele proponowanych przez użytkowników
funkcji, takich jak wsparcie Microsoft Visual SourceSafe 2005 i 6.0, in-
• Operating System – Microsoft Windows 2000/XP/Vista; tegracja z pakietem Microsoft Visual Studio 2005, opcja pozwalająca na
• Processor – Pentium III 850 Mhz minimum; szybkie przejście z testu do właściwego fragmentu kodu wyjściowego.

www.sdjournal.org 13
Biblioteka miesiąca

C5
nowoczesna biblioteka kolekcji dla .NET

Artykuł ten dotyczy C5, czyli nowej biblioteki kolekcji dla .NET stworzonej
na Uniwersytecie IT w Kopenhadze w Danii przez Niels’a Kokholm oraz
Peter’a Sestoft. C5 nie tylko jest użyteczną biblioteką kolekcji ale również
nowym podejściem do wykorzystania kontenerów w .NET.

przez te kolekcje. Co więcej SCG zostały za-


Dowiesz się: Powinieneś wiedzieć: projektowane w celu przyspieszenia operacji
• Czym jest biblioteka kolekcji C5 i jakie są jej • Czytelnik powinien znać podstawy programo- na niewielkich ilościach danych (dbając o sta-
zastosowania; wania w języku C#; łe współczynniki przy złożoności obliczenio-
• Jak efektywnie użyć kontenerów dostępnych • Czytelnik powinien posiadać podstawową we operacji). W C5 zdecydowano się nie dbać
w ramach tej biblioteki; wiedzę z zakresu struktur danych i algoryt- o stałe współczynniki w złożoności obliczenio-
• Jakie są wady i zalety C5. mów. wej dając bardziej bogate właściwości. Niedo-
ciągnięcia SCG miała uzupełnić biblioteka Po-
wer Collections Peter’a Golde z firmy Wintel-
nych, kolejek priorytetowych, stosów, zbio- lect. Biblioteka ta wniosła dodatkowe struktu-
rów, wielozbiorów czy słowników. Dodatko- ry danych oraz algorytmy, co jest zauważalną
Poziom trudności wo kolekcje, które są generyczne (ang. gene- zaletą. Niemniej jednak jej wadą jest sam fakt,
ric), pozwalają na bezpieczeństwo typu i pa- że została ona zbudowana na bazie SCG i tym
rametryzacje poszczególnych implementacji samym większość problemów SCG jest nadal
klas (unikami rzutowania z i na typ object jak aktualna w PowerCollections. O Power Col-

M
imo swojego niewielkiego wieku w .NET 1.1). Niniejszy artykuł dotyczyć bę- lections oraz System.Collections.Generic
(wersja 1.0 została opublikowana dzie jednej z takich kolekcji napisanej całko- w dalszej części artykułu.
na początku 2006 a 1.1 w lutym wicie w C# i dostępnej dla wszystkich języ- Biorąc pod uwagę wady i problemy związa-
2008) jest ona wykorzystywana w przemyśle ków .NET od wersji 2.0 oraz Mono od 1.2. ne z istniejącymi kolekcjami powstały założe-
gier komputerowych, sektorze bankowym, in- Jest to C5, której nazwa pochodzi (najpraw- nia projektowe biblioteki C5. O założeniach
stytucjach finansowych oraz nawet w US Na- dopodobniej, bo sami autorzy nie są pewni) tych traktuje kolejny rozdział a tymczasem
val Research. Autorzy projektując i implemen- od Copenhagen Comprehensive Collection Clas- warto jeszcze wspomnieć o tym, że biblioteka
tując bibliotekę wykorzystali bagaż doświad- ses for C#, mimo że, wbrew nazwie, do C# jej ta dostępna jest zarówno w postaci binarnej jak
czeń i obserwacji wywodzących się jeszcze z ję- użycie się nie ogranicza. i kodu źródłowego. Biblioteka rozpowszechnia-
zyka Smalltalk, Java oraz obecnych kolekcji w Po tym krótkim wstępie opisującym kon- na jest na licencji zbliżonej do BSD a to ozna-
.NET. Co w połączeniu ze wsparciem ze strony cepcję biblioteki kolekcji nasuwa się na myśl cza, że można modyfikować ją w dowolny spo-
Microsoft Research przyczyniło się do powsta- następujące stwierdzenie – przecież dla każ- sób nawet w celach komercyjnych bez potrze-
nia sporo ponad 25000 linii kodu implemen- dego języka czy framework’u mamy dostępne by zgłaszania tego autorom pod warunkiem za-
tujących bardzo zaawansowaną bibliotekę, jaką gotowe biblioteki kolekcji. Po co więc tworzyć chowania wszystkich nagłówków dotyczących
jest C5, wspartą równie obszerną ilością testów nowe? Jest kilka takich bibliotek dla .NET, z praw autorskich.
jednostkowych. których najważniejszymi (poza C5) są Win-
Czym jest biblioteka kolekcji oraz jakie tellect Power Collections oraz dostępne wraz Założenia projektowe biblioteki
jest jej przeznaczenie nie trzeba nikomu spe- z BCL (Base Class Libraries) kolekcje z prze- Zanim poznamy szczegóły biblioteki, jak jej
cjalnie wyjaśniać. Biblioteka taka dostarcza strzeni nazw System.Collections.Generic. używać oraz jak jest zbudowana, przyjrzyjmy
struktury oraz metody ułatwiające manipu- Wadami SCG, jak dalej nazywać będę System. się podstawowym założeniom projektowym i
lowanie kolekcjami danych. Musi być na ty- Collections.Generic, jest m.in. ograniczona implementacyjnym C5. Założenia te są jedno-
le ogólna by mogła być użyta w wielu dziedzi- ilość struktur danych. Co więcej niektóre kla- cześnie charakterystyką tej biblioteki. A to dla-
nach oraz na tyle szczegółowa, aby była wydaj- sy mają podobną funkcjonalność a nie są do- tego ponieważ wszystkie podstawowe postula-
na i pozwalała na efektywne tworzenie aplika- stępne za pomocą wspólnego interfejsu, np. ty postawione w 2004 roku, kiedy to biblioteka
cji niezależnie od tego, czy stosujemy bibliote- listy połączone a tablice. Dodatkowo autorzy zaczęła się dynamicznie rozwijać, zostały zre-
kę kolekcji w grach komputerowych, bazach C5 zarzucają SCG, że brak spójnych interfej- alizowane. Rozdział ten jednocześnie stanowi
danych, kompilatorach czy podczas tworze- sów powoduje wydłużenie czasu nauki kolek- opis cech biblioteki i właściwości.
niu aplikacji WWW. Większość bibliotek po- cji oraz naukę interfejsu poszczególnych klas a Jednym z podstawowych założeń projekto-
siada implementacje wektorów, list połączo- nie ogólnych interfejsów implementowanych wych było, oczywiście, wsparcie dla najczę-

14 09/2008
C5 – nowoczesna biblioteka kolekcji dla .NET

ściej używanych kolekcji, czyli m.in. list, ko- Software autorstwa Bandy Czworga. Zasada Pisząc o założeniach implementacyjnych
lejek priorytetowych, zbiorów, wielozbiorów ta to w oryginale program to an interface, not Peter Sestoft i Niels Kokholm zdecydowali
(ang. multiset lub bag) czy słowników. Kolek- an implementation. Innymi słowy autorzy bi- się użyć najlepszych możliwie struktur da-
cje uwzględniają wzorce wykorzystywane w blioteki odseparowali właściwą implementa- nych i algorytmów. Wybór ten oznacza, że
.NET (np. enumeracje z wykorzystaniem cję kolekcji od implementowanych przez nie C5 niekoniecznie korzysta z łatwych do za-
foreach w C#). Dodatkowo kolekcje poza interfejsów. Interfejsy ułożone są w logiczną implementowania algorytmów – wręcz prze-
iteratorami wspierają wyjątki (dziedziczenie strukturę dziedziczenia na dole której znaj- ciwnie. Źródła projektu są dostępne, więc za-
z klasy System.Exception) oraz, co jest jedną dują się konkretne kolekcje. Każdy z inter- praszam do ciekawej lektury. Na samym po-
z ich cech charakterystycznych, posiadają za- fejsów (np. IList<T> czy ICollection<T>) czątku postanowiono również, że najważniej-
implementowane zdarzenia! Zakodowane są ma minimalny niezbędny zestaw właściwo- sza jest wydajność kolekcji w ujęciu asympto-
również bardzo przydatne (a nieco trudne i ści i metod. Dzięki temu osiągnięto to, że tycznym oraz bogate właściwości kolekcji. In-
drobiazgowe do implementacji) właściwości za pomocą tego samego interfejsu możemy nymi słowy algorytmy nie są zoptymalizo-
jak enumeracja kolekcji w odwrotnej kolejno- korzystać z wielu zupełnie inaczej zaimple- wane pod kątem małej ilości elementów. W
ści czy bardzo przydatna cecha zwana upda- mentowanych kolekcji. Dla przykładu za po- porównaniu do kolekcji z System.Collecti
teable view, o której nieco później w dalszej mocą IList<T> możemy korzystać zarów- ons.Generic C5 może wypaść nieco wolniej
części artykułu. Kolejną i bardzo ważną ce- no z tablicy (listy opartej o tablicę) jak i li- przy niewielkiej ilości elementów, lecz szyb-
chą jest programowanie bazujące na interfej- sty połączonej, czyli odpowiednio z kolekcji ciej w przypadku olbrzymiej ich ilości. Nie-
sie, a nie implementacji. Innymi słowy biblio- ArrayList<T> oraz LinkedList<T>. Ostatnią mniej jednak nie zapomniano o wydajnej im-
teka zaprojektowana jest z wykorzystaniem z ważniejszych cech było udokumentowanie plementacji i profilowano użycie struktur
jednej z dwóch głównych zasad projektowych złożoności obliczeniowej operacji wszystkich w porównaniu do obiektów w algorytmach.
przedstawionej w klasycznej już pracy Design kolekcji. Dokumentacja ta dostępna jest na Oczywiście całość została napisana tylko w
Patterns: Elements of Reusable Object-Oriented stronie projektu. kodzie zarządzanym bez ani jednego bloku

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

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

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

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

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

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

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


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

Rysunek 1. Diagram hierarchii interfejsów kolekcji C5

www.sdjournal.org 15
Biblioteka miesiąca

unsafe. Ostatnim z założeń implementa- Budowa indeksu TreeSet<uint>>. Jak widać, wyrazy są
cyjnych jest odcięcie się od istniejących im- dla pliku tekstowego – przykład kluczami identyfikującymi zbiór nume-
plementacji kolekcji i zaimplementowanie Przyjrzyjmy się bardzo prostej aplikacji za- rów linii (typ TreeSet<uint>). Użycie
wszystkiego od zera. Oznacza to, że C5 nie mieszczonej na Listingu 1. Zadaniem apli- TreeDictionary<K,V> pozwala nam wyeli-
jest rozszerzeniem kolekcji z System.Colle kacji jest dla zadanego pliku (w tym przy- minować duplikaty słów w prosty sposób.
ctions.Generic. Piszę o tym, ponieważ in- padku file.txt) stworzyć indeks. Indeks ten Dla każdego słowa zapisujemy obiekt kolek-
na biblioteka kolekcji czyli Wintellect .NET ma przedstawiać posortowaną listę wyra- cji przechowującej numery linii (uint). Apli-
Power Collections jest swego rodzaju rozsze- zów oraz numery linii, w jakich one wystę- kacja najpierw tworzy obiekt index, następ-
rzeniem System.Collections.Generic w pują. Funkcja CreateIndex tworzy indeks nie korzystając z funkcji BCL otwieramy plik
konwencji istniejących już w tej przestrzeni natomiast funkcja PrintIndex wyświetla in- i czytając linia po linii dzielimy go na słowa.
nazw kolekcji .NET, co do wielu zastosowań deks na konsoli. Elementem głównym jest Następnie każde słowo sprawdzamy, czy jest
może być ograniczeniem. obiekt index typu TreeDictionary<string, już w naszym indeksie czy jeszcze nie. Je-

Listing 1. Program budujący indeks pliku


using System; TreeSet<uint>());
using SCG = System.Collections.Generic;
using C5; index[word].Add(lineNumber);
using System.Text.RegularExpressions; }
using System.IO; }

namespace SDJ }
{ }
class IndexProgram
{
static TreeDictionary<string, TreeSet<uint>> index = static void PrintIndex()
null; {
foreach (string word in index.Keys)
// Uwaga: obsluga bledow celowo pominieta {
static void Main(string[] args) Console.Write("{0}: ", word);
{
CreateIndex("file.txt"); foreach (uint lineNumber in index[word])
PrintIndex(); Console.Write("{0} ", lineNumber);
PrintIndex2();
} Console.WriteLine();
}
}
static void CreateIndex(string fileName)
{
index = new TreeDictionary<string, static void PrintIndex2()
TreeSet<uint>>(); {
Act<KeyValuePair<string, TreeSet<uint>>> act =
// Wyrazenie regularne nie uwzgledniajace polskich new Act<KeyValuePair<string, TreeSet<uint>
// znakow diakrytycznych >>(PrintKVP);
Regex sepRegex = new Regex("[^a-zA-Z0-9]+"); index.Apply(act);
}
using (TextReader reader = new
StreamReader(fileName))
{ static void PrintKVP(KeyValuePair<string,
uint lineNumber = 0; TreeSet<uint>> kvp)
{
string line; Console.Write("{0}: ", kvp.Key);
while ( (line = reader.ReadLine()) != null) kvp.Value.Apply(new Act<uint>(delegate(uint
{ number) { Console.Write("{0} ", number);
lineNumber++; }));
string[] words = sepRegex.Split(line); Console.WriteLine();
}
foreach ( string word in words )
if (word.Length > 0) }
{ }
if (!index.Contains(word))
index.Add(word, new

16 09/2008
C5 – nowoczesna biblioteka kolekcji dla .NET

żeli nie to dodajemy nową parę <string, mu, że jest ona dostępna w interfejsie już bardzo wygodny sposób na polimorficzne
TreeSet<uint>>. Jak możemy wyświetlić ICollectionValue (czyli wysoko w hierar- manipulowanie elementami kolekcji. Efekt
tak stworzony indeks? Otóż napisałem dwie chii dziedziczenia) to implementowana jest działania programu podobny będzie do Li-
funkcje (PrintIndex oraz PrintIndex2). przez wszystkie kolekcje C5. Stanowi ona stingu 2.
Jedna korzysta z foreach a druga z metody
Apply interfejsu ICollectionValue. O inter-
fejsach kolekcji i słowników dalej w artyku-
le. Natomiast metoda void Apply(Act<T> �������������� ��������������
����������������� �����������������
act) pobiera jako argument delegata przyj- ����������������������� ������������������
mującego argument typu T czyli kolejno �������������� ���������������

KeyValuePair<string, TreeSet<uint>>
oraz uint. Metoda ta wykonuje kod delega-
ta dla każdego elementu kolekcji. Dzięki te-

Listing 2. Wynik działania programu z


Listingu 1 (fragment) ��������������
�����������������
����������������������
a: 2 5
an: 2 ����������
anagram: 1 2 3 4
�������������
and: 1 3 4 5
�����
before: 4 ����������
belong: 2
�������
check: 4
���
class: 2 3 4
classes: 1 �����

create: 5 ��������

dictionary: 2 ��������������
... �������������
������
����
���������
������������������� ����������������������
�����������������
������������������ ������������������
�������������
���������������������
���������� ������������

������������ ���������������
����� ������������
���������� �����������
������� �����������������
���������������� ���������������������
������� ��������������������������
���
����� Rysunek 3. Interfejs ICollection
������
������� Power Collections
������ Biblioteka Power Collections jest projektem open source mającym na celu stworzenie biblioteki
generycznych kolekcji dla .NET. Podstawowym założeniem projektu było rozszerzenie klas z .NET
������
BCL (Base Class Libraries) w przeciwieństwie do tworzenia własnych rozwiązań od początku (jak
���� w przypadku C5). Biblioteka ta została stworzona przez firmę Wintellect i obecnie do pobrania
������� jest w portalu http://www.codeplex.com. Zawiera kolekcje i słowniki:
������ • Set;
����������������� • Bag;
• MultiDictionary;
�����������������
• OrderedDictionary;
������������ • OrderedMultiDictionary;
������������� • OrderedSet;
• OrderedBag;
����������
• Dequeue;
������������ • PriorityQueue.

Więcej o Power Collections na stronie http://www.codeplex.com/PowerCollections, gdzie dostępna


Rysunek 2. Interfejs ICollectionValue. Jeden z również jest dokumentacja.
podstawowych interfejsów C5

www.sdjournal.org 17
Biblioteka miesiąca

Przegląd interfejsów kolekcji IEnumarable<T> na samej górze Rysunku czących bezpośrednio po interfejsach z .NET
Interfejs jest to definicja operacji, które są im- 1 jest interfejsem kolekcji o nieznanej wielko- Framework. ICollectionValue<T> jest ko-
plementowane przez daną klasę. Z racji, że jed- ści i niewielu specyficznych właściwościach. lekcją o znanej wielkości lecz niepozwala-
nym z podstawowych założeń projektowych Jest to interfejs pochodzący z SCG. Ważnym jącą na zmianę elementów w kolekcji. Roz-
C5 jest programowanie na bazie interfejsu, in- członkiem interfejsu jest GetEnumerator(), szerza IEnumerable<T> o metody CopyTo()
terfejsy i ich zrozumienie jest bardzo ważnym która to metoda zwraca obiekt klasy SCG.IE- oraz ToArray(), które kopiują elementy ko-
elementem poznawania biblioteki. Rysunek 1 numerator<T> pozwalający na iterowanie po lekcji do istniejącej lub nowej tablicy. Kolejny-
przedstawia hierarchię dziedziczenia. Z szesna- elementach kolekcji za pomocą słowa kluczo- mi nowymi członkami interfejsu są właściwo-
stu prezentowanych interfejsów czternaście po- wego foreach (w C#). Warto zauważyć, że ści Count oraz IsEmpty. Metody i właściwo-
chodzi z C5 natomiast dwa (IEnumerable<T> każda z kolekcji implementuje ten interfejs ści ICollectionValue<T> są widoczne na Ry-
oraz IShowable) są interfejsami z .NET Frame- i dlatego też w każdej z kolekcji możliwe jest sunku 2.
work. Na Rysunku widać zależności pomiędzy użycie foreach. Interfejs ICollection<T> jest implemento-
interfejsami. Poniżej opisałem wybrane inter- ICollectionValue<T> z biblioteki C5 jest wany przez wiele kolekcji C5. ICollection<T>
fejsy prezentując ich cechy charakterystyczne. jednym z ważniejszych interfejsów dziedzi- implementuje interfejs SCG.ICollection<T>
oraz C5.IExtensible<T>. Kolekcja taka jest
Listing 3. ICollection rozszerzalna (interfejs C5.IExtensible<T>),
czyli pozwala na dodawanie, usuwanie ele-
using System; mentów i grup elementów, pozwala na
using SCG = System.Collections.Generic; sprawdzanie przynależności elementu do
using C5; kolekcji oraz inne metody charakterystycz-
ne dla większości kolekcji. Listing 3 pre-
namespace CollectionApplication zentuje proste użycie kolekcji implemen-
{ tującej C5.ICollection<T> w postaci kla-
class ICollectionProgram sy C5.ArrayList<T> (oraz zakomentowanej
{ C5.LinkedList<T>).
static ICollection<string> collection = null; Na tym krótkim Listingu widzimy uży-
cie zdarzeń, właściwości ActiveEvents z
static void Main(string[] args) C5.ICollectionValue<T> oraz Apply z te-
{ go samego interfejsu. Dzięki metodzie Apply
collection = new ArrayList<string>(); oraz delegatowi Act<T> możemy w prosty spo-
//collection = new LinkedList<string>(); sób wyświetlić zawartość kolekcji na konsolę.
Diagram interfejsu jest prezentowany na Ry-
collection.ItemsAdded += new ItemsAddedHandler<string>(list_ItemsAdded); sunku 3.
collection.ItemsRemoved += new ItemsRemovedHandler<string>(list_ Kolejnym godnym uwagi interfejsem z bi-
ItemsRemoved); blioteki C5 jest IStack<T>. Jest to ukierunko-

EventTypeEnum events = collection.ActiveEvents;


// if ( events ... ���������������������������
�����������������
�����������������������
collection.Add("jeden"); ��������������������������
collection.Add("dwa");
collection.AddAll(new string[] { "trzy", "cztery", "piec" }); �������

���������
collection.Remove("trzy");
��������

collection.Apply(new Act<string>(Console.WriteLine));

static void list_ItemsRemoved(object sender, ItemCountEventArgs<string>


eventArgs)
���������
{ �����������������
// obsluga zdarzenia �������������������������������

} ����������

static void list_ItemsAdded(object sender, ItemCountEventArgs<string>


����������������
����
eventArgs)
{ �������
// obsluga zdarzenia ���
} ����
}
}
Rysunek 4. Interfejs IStack

18 09/2008
C5 – nowoczesna biblioteka kolekcji dla .NET

wana kolekcja implementującą zachowanie sto- • HashedLinkedList<T> , czątku lub w środku tablicy powoduje przesu-
su, czyli innymi słowy FIFO (First-In-First-Out). • HashedArrayList<T> , nięcie elementów znajdujących się pomiędzy
Jak widać z diagramu na Rysunku 4 IStack<T> • WrappedArray<T> , miejscem wstawiania nowego elementu a koń-
rozszerza IDirectedCollectionValue<T> • SortedArray<T> , cem tablicy, czyli mówimy tutaj o liniowej zło-
o metody charakterystyczne dla stosu, czy- • TreeBag<T> , żoności tej operacji. Dodatkowo ArrayList<T>
li Pop i Push. Listing 4 prezentuje proste uży- • TreeSet<T> , implementuje metodę Sort, która korzysta z al-
cie interfejsu IStack<T> wobec implementacji • HashSet<T> , gorytmu quicksort.
C5.LinkedList oraz C5.ArrayList. Prezentu- • HashBag<T> LinkedList<T> tak samo jak ArrayList<T>
je to elastyczność C5 – stos zaimplementowany • oraz IntervalHeap<T>. implementuje interfejsy IList<T>, IStack<T>
zarówno jako lista połączona lub tablica. oraz IQueue<T>. W odróżnieniu jednak od
Więcej szczegółowych i wyczerpujących in- Poniżej skupiłem się na kolejce cyklicznej (cir- dwóch poprzednich kolekcji nie korzysta z ta-
formacji o interfejsach znajduje się w doku- cular queue), tablicy oraz liście połączonej. blicy elementów lecz wewnętrznie wykorzystu-
mentacji a szczególnie w książce pod tytulem Reszta kolekcji jest opisana w materiałach on- je podwójnie połączoną listę węzłów, z których
The C5 Generic Collection Library dostępnej na line, do których podałem linki w Ramce. każdy przechowuje elementy kolekcji. Stąd też
stronie projektu. CircularQueue<T> (znany również jako bu- wstawienie elementu w dokowanym miejscu
for cykliczny) jest kolekcją implementującą listy zajmuje stały czas – O(1), lecz dostęp do
Kolekcje – implementacje IStack<T> oraz IQueue<T>. Jej diagram prezen- elementu za pomocą indeksu już stały – O(n).
W rozdziale tym przyjrzymy się wybranym im- towany jest na Rysunku 5. Jak można sprawdzić Niemniej jednak dostęp do elementów znajdu-
plementacjom kolekcji C5. Jest to uzupełnie- w kodzie źródłowym kolekcji CicularQueue<T> jących się w pobliżu jednego z końców jest w
nie rozdziału traktującego o interfejsach i ce- używa tablicy elementów T[] i implementu- praktyce dosyć szybki.
lem jego jest ułatwienie zrozumienia budowy je metody Push i Pop oraz Enqueue i Dequeue Celem tego krótkiego rozdziału było przed-
całej biblioteki i przedstawienie dostępnych do nawigacji po elementach tablicy. Pary me- stawienie wstępu do implementacji kolekcji C5
kolekcji. C5 posiada następujące implementa- tod Push i Enqueue oraz Pop i Dequeue są sobie oraz zaprezentowanie podejścia do opisu ko-
cje kolekcji: odpowiednikami. CircularQueue<T> korzysta lekcji, jakie zostało zaprezentowane przez au-
z tablicy elementów T[] stąd też posiada stałą torów kolekcji. W dokumentacji C5 stawiany
• CircularQueue<T> , prędkość dostępu do elementów za pomocą in- jest bowiem nacisk na implementowane inter-
• LinkedList<T> , deksu, czyli O(1), w porównaniu do dostępu do fejsy, sposób w jaki przechowywane są elemen-
• ArrayList<T> , bufora cyklicznego zbudowanego na liście połą- ty oraz złożoność obliczeniową poszczególnych
czonej, czyli O(n). operacji (a w szczególności tych wykonywa-
ArrayList<T> jest kolekcją implementują- nych najczęściej). Reszta kolekcji, jak już pisa-
���������
cą aż 3 interfejsy – IList<T>, IStack<T> oraz łem, jest wyczerpująco opisana w dokumenta-
���������
IQueue<T>. Jest to kolejna kolekcja, która ko- cji projektu.
rzysta z tablicy elementów. Stąd też dostęp do
����������������
������������� poszczególnych elementów za pomocą indek- Słowniki
��������������������
��
su ma stałą prędkość, czyli O(1). Należy jed- Słowniki jako struktury danych działają analo-
nak pamiętać, że wstawienie elementu na po- gicznie do słowników znanym nam z życia. Po-
������

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

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

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

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

Rysunek 5. Klasa CircularQueue Rysunek 6. Słownik

www.sdjournal.org 19
Biblioteka miesiąca

zwalają dla zadanego klucza odnaleźć odpowia- elementów jest stałej złożoności obliczeniowej, stawiłem cechy i założenia biblioteki, inter-
dające jemu elementy. Dobrym przykładem tzn. O(1). Warto również pamiętać, że enume- fejsy oraz implementacje. Nie jest to jednak
może być słownik angielsko – polski. Dla za- racja elementów w słowniku nie gwarantuje za- wszystko, co ma do zaoferowania bibliote-
danego słowa (klucza) otrzymujemy odpowia- chowania żadnego specjalnego porządku. ka C5.
dające hasło (wartość). C5 jak System.Collec TreeDictionary<T> implementuje ISorted Autorzy postanowili wzbogacić bibliote-
tions.Generic oraz Power Collections posiada Dictionary<T>. Słownik ten do reprezentacji kę o dodatkowe, zaawansowane i użyteczne
również słowniki. Na Rysunku 6 przedstawi- par [klucz, wartość] używa zbalansowanego elementy. W rozdziale tym wspomnę o naj-
łem drzewo dziedziczenia słowników. Jak wi- drzewa czerwono-czarnego (ang. balanced red ważniejszych z nich. Elementy te to – list
dać mamy dostępne dwie implementacje, czyli black binary tree). Dostęp do elementów, doda- view, read-only wrappers, sortowanie ta-
HashDictionary<T> oraz TreeDictionary<T>. wanie i ich usuwanie jest złożoności O(log n). blic, formatowanie kolekcji, zdarzenia, klono-
Obydwa implementują IDictionary<T> nato- Enumeracja słownika zwraca elementy posor- wanie kolekcji oraz serializacja. Poniżej skupi-
miast TreeDictionary<T> implementuje rów- towane zgodnie z uporządkowaniem klucza w łem się na list view, zdarzeniach oraz na se-
nież ISortedDictionary<T>. drzewie. rializacji.
HashDictionary<T> reprezentuje pary List view jest w zasadzie tym, co mówi
[klucz, wartość] używając do tego celu tabli- Zaawansowane elementy C5 sama nazwa. Jest to widok listy, czyli inny-
cy mieszającej (ang. hash table). Dostęp do ele- Poznaliśmy już podstawy kolekcji i słowni- mi słowy ciągły fragment dowolnej listy czy
mentów korzystając z klucza oraz wstawianie ków C5. W poprzednich rozdziałach przed- tablicy, na którym można dokonywać wszel-
kich operacji, które są de facto wykonywa-
ne na kolekcji, dla której stworzyliśmy list
Listing 4. IStack view. Listing 5 prezentuje przykład użycia
using System; list view. W najbardziej podstawowy spo-
using SCG = System.Collections.Generic; sób stworzenie list view polega na wywo-
using C5; łaniu metody View. Metoda ta należy do in-
terfejsu IList<T>. Elementem zwracanym
namespace StackApplication z metody jest obiekt typu IList<T>, który
{ spełnia warunki określone za pomocą argu-
class IStackProgram mentów do IList<T>.View(int start, int
{ count).
static IStack<int> stack = null; Pierwszy z nich określa numer elementu
początkowego listy a drugi ilość elementów,
static void Main(string[] args) które wejdą w skład widoku listy. Na pierw-
{ szy rzut oka jest to po prostu kolejna lista,
stack = new LinkedList<int>(); lecz dzięki swoim właściwościom pozwala
PushValues(stack, new int[] { 1, 2, 3, 4, 5 }); na wygodną implementację algorytmów wy-
magających operacji na fragmentach kolek-
cji (niezależnie od tego czy jest to lista po-
stack = new ArrayList<int>(); łączona czy tablica). Jak widać na Listingu
PushValues(stack, new int[] { 1, 2, 3, 4, 5 }); collection.View(0, 1) powoduje zwróce-
} nie widoku listy z pierwszym elementem.
Dla kontrastu collection.View(0, 0) byłby
to widok z zerową ilością elementów wskazu-
static void PushValues<T>(IStack<T> stack, T[] collection) jący na początek listy. Za pomocą widoków
{ można wstawiać, usuwać i edytować elemen-
foreach (T i in collection) ty kolekcji. Dodatkowo nie jest problemem
stack.Push(i); operowanie na jednej kolekcji za pomocą wie-
} lu widoków nawet jeżeli część z nich zawiera
} te same elementy.
} Zdarzeń w .NET nie trzeba przedstawiać.
Jest to standardowy mechanizm powiada-
miania części systemu o zmianach w innej
jego części. Odbywa się to za pomocą me-
chanizmu łączącego zdarzenia z metoda-
System.Collections.Generic mi reagującymi na te zdarzania przy pomo-
SCG jest przestrzenią nazw w .NET Framework od wersji 2.0 włącznie. Zawiera klasy, struktury i
interfejsy kolekcji i słowników generycznych. Z racji, że jest elementem .NET Framework nie wy- cy delegatów. C5 jest biblioteką, której ele-
maga dodatkowych bibliotek i jest dokładnie opisana w dokumentacji MSDN. Klasy kontenerów menty sygnalizują zdarzenia w przeciwień-
to: stwie do SCG czy innych mniej znanych ko-
lekcji. Przykład użycia zdarzeń znajduje się
• Dictionary;
na Listingu 3.
• LinkedList;
• List; Jak widać z przykładu metody list_
• Queue; ItemsAdded i list_ItemsRemoved są powiąza-
• SortedDictionary; ne ze zdarzeniami odpowiednio ItemsAdded
• SortedList; oraz ItemsRemoved. Dodatkowo dzięki in-
• Stack .
terfejsowi ICollectionValue<T> mamy
dostępne właściwości ActiveEvents oraz

20 09/2008
C5 – nowoczesna biblioteka kolekcji dla .NET

ListenableEvents. Właściwości te pozwala- nu obiektu w celu zapisania jej na innym me- Powodem tego jest fakt, że po pierwsze to wy-
ją na odczyt zdarzeń, które są aktywne (jest dium. Może być to na przykład zapis na dys- magałoby implementacji metody Add(object
przypisany odpowiedni event handler) oraz ku albo przesył przez sieć. Wszystkie klasy obj) co spowodowałoby, że C5 nie wspiera-
jakie w ogóle są dostępne dla danej imple- kolekcji, słowników oraz wyjątków są seriali- łoby bezpieczeństwa typów (ang. type safe-
mentacji kolekcji. zowalne za pomocą binarnych formaterów z ty). Dodatkowo serializer XML nie wspiera
Kolejnym zaawansowanym elementem jest System.Runtime.Serialization.Formatter współdzielenia w grafie obiektów i tym sa-
serializacja. Celem serializacji jest transfor- .Binary. Należy jednak pamiętać, że C5 nie mym powodowałoby to niespójność większo-
macja kolekcji do postaci szeregowej (np. ta- wspiera serializacji XML, czyli serializacji za ści wewnętrznych struktur.
blica bajtów) z zachowaniem aktualnego sta- pomocą klas z System.Xml.Serialization.
Podsumowanie
Listing 5. List view W artykule tym przedstawiłem wstęp do bi-
blioteki C5 opisując różne elementy, jak in-
using System; terfejsy, implementacje kolekcji i słowników
using SCG = System.Collections.Generic; oraz wspominając o elementach zaawan-
using C5; sowanych. C5 jest na pewno godnym uwa-
gi rozwiązaniem, gdy potrzebujemy inten-
namespace ListViewApplication sywnie korzystać i przetwarzać duże ilości
{ danych.
class ListViewProgram Nie jest jednak ona pozbawiona wad, o
{ czym należy pamiętać decydując się na jej
static IList<string> collection = null; użycie. Wady te, jak na przykład brak zgod-
ności z interfejsami z .NET, rzutują na utrud-
static void Main(string[] args) nione łączenie kolekcji z kontrolkami GUI
{ dostępnymi w .NET. Dodatkowo należy pa-
collection = new LinkedList<string>(); miętać, że przy niewielkiej ilości danych ko-
lekcje C5 bywają mniej wydajne niż odpo-
//collection = new ArrayList<string>(); wiedniki z SCG.
Problemy te, jak zapewnia Peter Sestoft, ma-
collection.AddAll(new string[] { "raz", "dwa", "trzy", "cztery", "piec" ją zostać wkrótce rozwiązane – zostały zgło-
}); szone odpowiednie feature requests. C5 jest
tak rozbudowaną biblioteką, iż można by na-
IList<string> view1 = collection.View(0, 1); pisać o niej książkę. Na stronie projektu moż-
Console.Write("view1: "); na pobrać szczegółową dokumentację, która
foreach (string str in view1) przypomina książkę poświeconą poszczegól-
Console.Write(str); nym problemom użycia biblioteki. Dokumen-
tacja ta zawiera dokładny opis każdego z inter-
Console.WriteLine(); fejsów czy implementacji. Dodatkowo zawiera
// na konsoli: wiele przykładów użycia oraz ponad sto wzor-
// view1: raz ców i antywzorców, jak korzystać a jak nie z
klas biblioteki!
IList<string> view2 = collection.View(3, 0); Uważam, że C5 jest godnym uwagi roz-
view2.Insert(0, "view2_insert"); wiązaniem, które dzięki doskonałej doku-
Console.Write("collection: "); mentacji i logicznemu projektowi jest pro-
foreach (string str in collection) stą do nauki i kompletną biblioteką i, moż-
Console.Write("{0} ", str); na zaryzykować stwierdzenie, że w przyszło-
ści C5 mogłoby śmiało zastąpić klasy z .NET
Console.WriteLine(); Framework.
// na konsoli:
// collection: raz dwa trzy view2_insert cztery piec
} MACIEJ PACZEWSKI
} Autor tekstu pracuje w firmie BLStream Sp. z o. o.
} na stanowisku Senior Software Specialist. Na co
dzień zajmuje się m.in. .NET, Windows Mobile oraz
technologiami pokrewnymi. Programuje najczę-
W Sieci ściej w językach C++, C oraz C#. Firma BLStream
wchodzi w skład Grupy BLStream, która powstała
• http://www.itu.dk/research/c5/ – Strona główna projektu C5. Na stronie dostępne źródła oraz by efektywniej wykorzystywać potencjał dwóch,
binarka szybko rozwijających się producentów oprogra-
• http://www.itu.dk/research/c5/Release1.1/ITU-TR-2006-76.pdf – Książka opisująca C5 w wersji 1.1 mowania – BLStream i Gamelion. Firmy wchodzą-
• http://channel9.msdn.com/ShowPost.aspx?PostID=370368 – Interesujący wywiad ze współ-
twórcą biblioteki C5 (Peter Sestoft) na Channel 9 ce w skład grupy specjalizują się w wytwarzaniu
• http://www.codeplex.com/PowerCollections – Wintellect .NET Power Collections na Codeplex oprogramowania dla klientów korporacyjnych, w
• http://msdn.microsoft.com/en-us/library/system.collections.generic.aspx – Dokumentacja Sys- rozwiązaniach mobilnych oraz produkcji i testo-
tem.Collections.Generic (MSDN) waniu gier.
Kontakt z autorem: maciej@paczewski.com.

www.sdjournal.org 21
Bazy danych

Optymalizacja
bazy danych
Wprowadzenie
Każda aplikacja funkcjonuje w ramach ograniczonych zasobów
systemu, takich jak – pamięć, czas procesora, przepustowość sieci itp.
Słaba wydajność SZBD (System Zarządzania Bazą Danych) to zwykle
problem zużycia dostępnego zasobu. Należy więc unikać takich sytuacji,
uwzględniając możliwe, chwilowe obciążenie systemu dodatkową pracą.
definiują tzw. postacie normalne(jest ich pięć,
Dowiesz się: Powinieneś wiedzieć: wyższy numer oznacza większe restrykcje).
• Jakie elementy wpływają na wydajność bazy • Czym jest system zarządzania bazą danych;
danych; • Czym jest tabela oraz więzy integralności; Co daje normalizacja danych?
• Jak projektant/programista może poprawić • Czym jest zapytanie SQL. Z praktycznego punktu widzenia najistotniej-
wydajność systemu. sze jest to, że normalizacja chroni przed po-
wielaniem tej samej informacji (np. nazwa
producenta) w tej samej lub w różnych tabe-
Problem niskiej wydajności może dotyczyć do- lach. Brak normalizacji, prowadzi to do wielu
wolnego składnika systemu bazy danych, np: poważnych utrudnień, w trakcie użytkowania
Poziom trudności system i modyfikacji danych, tzw. anomalie.
• reguły biznesowe i projekt bazy danych;
• operacje wykonywane na bazie danych; Problemy braku normalizacji danych
• dostępna wolna pamięć operacyjna i czas Błędny projekt bazy danych skutkuje wielo-

O
ptymalizacja SZBD angażuje admini- procesora; ma ograniczeniami (Rysunek 1). Poniżej kil-
stratora, a więc sprzęt, konfiguracja i • intensywność operacji dyskowych; ka przykładów:
utrzymanie oraz programistę, a więc • konflikty dostępu do zasobów;
projekt bazy danych oraz implementacja aplika- • inne aplikacje działające na serwerze; • anomalia modyfikacji danych, chcąc po-
cji. Artykuł jest wstępem do programistycznego • platforma sprzętowa i system operacyjny; prawić np. Nazwę producenta trzeba by ją
aspektu optymalizacji. Stanowi ogólny przegląd • sieć komputerowa. poprawiać we wszystkich miejscach gdzie
teoretycznych oraz praktycznych elementów, ja- występuje. Może to prowadzić do szeregu
kie należy wziąć pod uwagę, optymalizując bazę Normalizacja pomyłek;
danych. Wymaga od czytelnika znajomości pod- schematu bazy danych • anomalia usuwania danych, chcąc usunąć
stawowych pojęć, jak baza danych, tabela, trans- Po ustaleniu reguł biznesowych, projekt sche- zabawkę musimy również usunąć infor-
akcja, relacja, zapytanie SQL, itp. Jako podstawę matu bazy danych jest pierwszym elementem macje o producencie;
przyjęto Oracle 10g Express Edition. Jednakże optymalizacji. Projektowanie skupia się na od- • redundancja, niepotrzebnie powtórzone
większość z przedstawionych tu zagadnień ma wzorowaniu wybranych obiektów i ich relacji nazwa i kraj producenta.
charakter ogólny i nie zależy od SZBD. ze świata rzeczywistego na encje (zwykle encja
Cele optymalizacji są różne, zależnie od ro- = tabela w bazie danych) i ich powiązań w sys- Kiedy stosować normalizację danych?
dzaju systemu, np: temie bazy danych. Zasady poprawnej budowy W praktyce schemat bazy danych normalizuje
schematu, czyli normalizacji schematu danych, się do trzeciej postaci normalnej (Rysunek 2).
• OLTP (ang. On-Line Transaction Processing,
system bieżącego przetwarzania transak-
ZABAWKA
cji, np. system sprzedaży), zwykle optyma-
NazwaZabawki NazwaProducenta KrajProducenta
lizacja czasu odpowiedzi systemu. Arty-
kuł skupia się na tego typu rozwiązaniach; Klocki P.H.U. Blok Polska
• OLAP (ang. On-Line Analytical Processing, Lalka Kubuś sp. z.o.o. Polska
hurtownie danych, zastosowania anali- Rower Biker Francja
tyczne), zwykle optymalizacja czasu odpo- Piłka Kubuś sp. z.o.o. Polska
wiedzi, technik agregacji danych oraz zu-
życia zasobów. Rysunek 1. Schemat przed normalizacją, obarczony anomaliami

22 09/2008
Optymalizacja bazy danych

Czasem, aby poprawić szybkość działania apli- ku danych, bloku danych i pozycji tego rekordu w więcej niż około 15% rekordów. Indeksy odgrywa-
kacji, dopuszcza się pewne odstępstwa od tej bloku danych. W indeksie zapamiętany jest wła- ją także istotną rolę przy zapytaniach ze złączenia-
zasady, ale tylko jako wyjątek od reguły. Istnieje śnie ten RowId. Przez to dostęp do rekordu zloka- mi tabel. W typowych aplikacjach biznesowych
ścisła definicja każdej postaci normalnej. Prak- lizowanego przez indeks jest bardzo szybki i efek- indeksuje (B-Tree) się zwykle klucze główne i obce.
tyczna normalizacja do trzeciej postaci normal- tywny. Dodatkowo, jeżeli zapytanie SQL wymaga Dla pozostałych pól poszukuje się kompromisu.
nej sprowadza się głównie do: tylko pól zawartych w indeksie, czytanie plików
danych może okazać się zbyteczne, ponieważ wy- Ile kosztuje indeks?
• wszystkie rozpoznawalne obiekty (ZA- starczyć może informacja zawarta w indeksie. Zastosowanie indeksu przyspiesza odczyt da-
BAWKA , PRODUCENT, KRAJ) umieścić w Najpopularniejsze typy indeksów (różniące nych. Spowalnia jednak modyfikowanie danych
osobnych tabelach z unikalnym klu- się algorytmem działania) to: (INSERT, DELETE, UPDATE), ponieważ wymagana
czem głównym. Realizuje się to przez jest odpowiednia aktualizacja informacji w in-
usuwanie wszystkich pól nie związa- • B-Tree, domyślny typ indeksu, najefektyw- deksach. Wg dokumentacji Oracle, utrzymanie
nych bezpośrednio z kluczem głów- niejszy przy wysoce selektywnych danych jednego indeksu w tabeli, w przybliżeniu trzy-
nym (np: IdZabawki (tu klucz główny) i jak klucze główne i obce. Używany także, krotnie wydłuża czas operacji modyfikacji da-
NazwaProducenta nie mogą być w jednej gdy indeks obejmuje kilka pól w tabeli; nych na tej tabeli. Jeżeli tabela zawiera trzy indek-
tabeli bo ten sam producent może być też • Bitmap, stosowany do nisko selektywnych sy to czas modyfikacji danych może być w przy-
producentem innych zabawek, a więc z danych jak np. płeć. W połączeniu z me- bliżeniu 9 razy dłuższy w porównaniu z aktuali-
podania producenta nie wynika bezpo- chanizmem kompresji tabeli, umożliwia zacją tej tabeli bez indeksów. Paradoksalnie, jeże-
średnio IdZabawki); zwrócenie dużej liczby rekordów przy mi- li aplikacja np. tylko dodaje nowe dane, użycie in-
• wszędzie gdzie odwołujemy się do innego nimalnym odczycie z dysku. Indeks może deksów może wręcz spowolnić jej działanie.
obiektu (referencja), należy podać tylko być szczególnie wydajny przy zapytaniach Po co w ogóle zapisywać dane na dysk skoro
jego klucz główny, który pełni wtedy rolę typu COUNT(), gdzie wystarczyć może tyl- operacja odczytu to wąskie gardło systemu? Po-
klucza obcego (np. powiązanie zabawka – ko odczyt danych z samego indeksu (bez wody są co najmniej dwa:
producent). czytania danych tabeli).
• dysk jest znacznie pojemniejszy niż pamięć
Obiekty w bazie danych Kiedy stosować indeksy? operacyjna;
Przygotowanie prawidłowego projektu sche- Zastosowanie indeksowania daje najlepsze rezul- • jest to wymóg, aby po awarii zasilania od-
matu bazy danych jest podstawą do praktycz- taty przy wybieraniu małej liczby rekordów z du- tworzyć aktualny i spójny stan danych.
nej realizacji systemu. Tak więc, w dalszej czę- żego zbioru. Wtedy najlepiej widać korzyść z ogra-
ści artykułu opisane zostaną wybrane obiek- niczenia ilości bloków danych, które muszą zo- Więzy integralności
ty bazy danych oraz ich wpływ na wydajność stać odczytane z dysku. Zwykle przyjmuje się, że Jeżeli dane gromadzone w bazie danych mają
SZBD. indeks jest opłacalny, gdy z tabeli czytane jest nie być poprawne musi istnieć mechanizm, który

Indeksowanie ZABAWKA
Załóżmy, że mamy tabelę dokumentów maga-
IdZabawki NazwaZabawki IdProducenta
zynowych z dziesiątkami tysięcy a nawet mi-
lionami rekordów (rekord = wiersz w tabeli). 1 Klocki 1
Dane z tabeli przechowywane są w plikach da- 2 Lalka 2
nych (ang. datafile) na dysku. Pliki te czytane są 3 Rower 3
z dysku blokami (ang. data block). Chcemy po- 4 Piłka 2
brać z tabeli tylko dokumenty wybranego klien-
ta. Zwykłe czytanie kolejnych bloków danych z PRODUCENT
dysku, celem odnalezienia rekordów spełniają- IdZabawki NazwaZabawki IdProducenta
cych warunek byłoby szalenie nieefektywne.
1 P.H.U. Blok 1
Należy więc ograniczać ilość odczytów z dysku.
2 Kubuś sp. z o.o. 1

Co daje indeksowanie? 3 Biker 2


Utworzenie indeksu na wybranym polu tabe-
KRAJ
li oznacza, że w osobnym miejscu zapisywana
jest informacja (adres), w jakich blokach danych IdKraju NazwaKraju
można odnaleźć rekord zawierający konkretną, 1 Polska
indeksowaną wartość, np. Rekordy z dokumenta- 2 Francja
mi klienta o identyfikatorze K znajdują się na dys-
ku twardym, w blokach danych o numerach B1 i Rysunek 2. Schemat znormalizowany do trzeciej postaci normalnej
B2. Dzięki temu wybierając indeksowane rekor-
dy można czytać z dysku tylko wymagane bloki
danych, ograniczając powolne operacje dyskowe KLIENT KLIENT_GRUPA GRUPA
(operacje I/O). Indeksy wykorzystywane są głów-
nie w zapytaniach typu SELECT z klauzulą WHERE Klient_ID bigint <pk> Grupa_ID bigint Grupa_ID bigint <pk>
oraz przy złączeniach tabel.
Nazwa char Klient_ID bigint Nazwa char
W praktyce zrealizowane jest to tak, że każdy re-
kord w bazie danych ma przypisany unikalny iden-
tyfikator wiersza w tabeli, tzw. RowId. Równocze-
śnie wartość RowId jest wskazaniem kolejno do pli- Rysunek 3. Schemat przykładowej bazy danych

www.sdjournal.org 23
Bazy danych

będzie tą poprawność kontrolował. Dane moż- tek edycji danych w tabeli. Załóżmy, że wykona- zbioru oryginalnych wartości danych, na
na sprawdzać na poziomie aplikacji użytkow- na jest operacja: wypadek wycofania zmian (ROLLBACK).
nika (często stosowane jako uzupełnienie) lub
bezpośrednio w bazie danych, definiując odpo- UPDATE KLIENT SET KRAJ=2 WHERE KOD=’PL’ W praktyce, zakres transakcji zwykle wymusza
wiednie reguły. logika biznesowa systemu, a nie względy optyma-
Zmodyfikowane zostaną wszystkie wiersze lizacji. Jedynie w przypadkach wyjątkowych, np.
Co dają więzy integralności? spełniające zadany warunek. Ważne jest, że aktualizacja danych w bardzo dużej tabeli, moż-
Podstawowym zadaniem więzów integralno- tworząc wyzwalacz można określić jak ma być na rozważyć wykonanie częstszych COMMIT, np.
ści (ang. integrity constraints) jest wymuszenie uruchomiony, tj: co 200 zaktualizowanych rekordów.
przestrzegania narzuconych reguł poprawno-
ści danych. Tak więc nie są one narzędziem do • CREATE TRIGGER ... kod wyzwalacza będzie Optymalizacja zapytań SQL
przyspieszania aplikacji. Stanowią jednak istot- wykonany tylko jeden raz dla całej operacji Poniższy rozdział ma jedynie na celu zaprezento-
ny element wydajności w rozumieniu szer- UPDATE wanie wagi optymalizacji zapytań SQL. Dokład-
szym. Wydajna baza danych to również taka, • CREATE TRIGGER ... FOR EACH ROW... kod ny opis zagadnienia to materiał na książkę. Na
która działa pewnie i broni się przed logicznie wyzwalacza będzie wykonany dla każde- początek wyjaśnienie podstawowych zagadnień.
niespójnymi informacjami. Ograniczenia zde- go modyfikowanego rekordu osobno, tzn. Plan wykonania (ang. execution plan) – aby
finiowane bezpośrednio na bazie danych, po- wszędzie gdzie KOD=’PL’ Ile kosztują wy- wykonać zapytanie SQL, SZBD musi je prze-
zwalają bezpiecznie podłączać do źródła da- zwalacze i kiedy je stosować? analizować i przygotować tzw. plan zapytania.
nych różne systemy. Gdy ograniczenie zadziała, Plan zawiera dokładny opis użytych indeksów,
do aplikacji wysyłany jest wyjątek, który moż- Tworząc wyzwalacz należy pamiętać, że jego sposób dostępu do danych z tabeli, sposób i ko-
na odpowiednio obsłużyć. Typowe zadania wię- kod będzie wykonany dla każdej, powiązanej lejność łączenia tabel, uwzględnienie warun-
zów integralności to: z tym wyzwalaczem operacji na danych. W ków z sekcji WHERE. Aby plan wykonania był
typowych aplikacjach biznesowych wyzwala- wydajny, SZBD wykorzystuje tzw. optymaliza-
• ochrona powiązań (referencji) między ta- cze stosowane są często ze względu na ich uży- tor zapytań. Analiza wygenerowanego planu to
belami; teczność. Zwykle do utrzymania bardziej zło- ważny element optymalizacji zapytań.
• podstawowa walidacja danych wpisywa- żonych więzów integralności lub reguł bizne- Optymalizator zapytań (ang. query optimizer)
nych do danego pola w tabeli (np. określe- sowych. – mechanizm SZBD, którego zadaniem jest wy-
nie zakresu dopuszczalnych wartości). generowanie możliwie optymalnego planu wy-
Transakcja konania (o najmniejszym wskaźniku kosztów
Ile kosztują więzy Nieodzownym składnikiem typowego SZBD wykonania zapytania). Domyślnie dla Oracle,
integralności i kiedy je stosować? jest transakcja, czyli niepodzielny zbiór opera- optymalny znaczy zużywający najmniej zaso-
Jakkolwiek istnienie w bazie danych więzów in- cji na bazie danych. Cała transakcja może być bów. System Oracle udostępnia mechanizm pod-
tegralności narzuca pewne koszt można przy- zatwierdzona (COMMIT) lub wycofana (ROLL- powiedzi (ang. hints), który pozwala dodatkowo
jąć, że w typowej aplikacji biznesowej ich stoso- BACK). Wszystkie operacje w bazie danych wy- wpływać na działanie optymalizatora. Obecnie
wanie jest nieodzowne. konywane są w ramach jakiejś transakcji. Sama dostępne są dwa rodzaje optymalizatora:
transakcja nie jest narzędziem optymalizacji,
Wyzwalacze natomiast może mieć na nią wpływ. • regułowy, bazuje na ustalonych zasadach
Czasem może zaistnieć potrzeba wykonania ja- budowy planu zapytania. Mniej dyna-
kiejś dodatkowej czynności w trakcie edycji da- Ile kosztuje transakcja? miczny, ale bardziej przewidywalny w śro-
nych w tabeli. Przykładowo może być konieczne, Co do kosztów należy głównie pamiętać, że: dowisku produkcyjnym (obecnie Oracle
aby każdą zmianę danych w tabeli odnotowywać odchodzi od tego rozwiązania);
w osobnym dzienniku (tabeli). • zatwierdzenie transakcji (COMMIT) zmusza • kosztowy, bazuje na luźniejszych zasadach
SZBD do utrwalenia dokonanych zmian, budowy planu oraz na dostępnych staty-
Co dają wyzwalacze? czyli zapis na dysk; stykach dotyczących tabel, indeksów, itp.
Podstawowym zadaniem wyzwalaczy (ang. trig- • odwlekanie zatwierdzenia transakcji zmu- Potrafi na bieżąco uwzględniać charak-
gers) jest wykonanie dodatkowego kodu na sku- sza SZBD do utrzymywania rosnącego terystykę przechowywanych danych, ale
może być mniej przewidywalny w środo-
wisku produkcyjnym.
W Sieci
• ciekawe artykuły dotyczące Oracle – http://www.orafaq.com/, Należy pamiętać, że mówimy tu o optymali-
• dokumentacja Oracle 10g XE – http://www.oracle.com/pls/xe102/homepage, zacji zapytania SQL głównie w takiej postaci,
• dokumentacja Oracle 10g – http://www.oracle.com/pls/db102/homepage, w jakiej je podano. Właściwe budowanie za-
• dokumentacja Oracle 10g, optymalizacja – http://download.oracle.com/docs/cd/B19306_01/ pytań przez użytkownika ma, więc wciąż zna-
server.102/b14211/toc.htm
czenie podstawowe i przebiega następująco:

• przygotowanie lub poprawa zapytania i


Optymalizacja zapytań SQL wygenerowanie planu zapytania;
• analiza planu oraz poszukiwanie operacji
Planując optymalizację zapytań SQL w systemie Oracle, warto zapoznać się z następującymi te- czasochłonnych (np. pełny przegląd dużej
matami:
tabeli);
• SQLPLUS – narzędzie do wykonywania zapytań SQL (konsola tekstowa); • opcjonalne uzupełnienie zapytania o pod-
• SQL TRACE, TKPROF – narzędzia do analizy zapytań SQL wykonywanych przez działającą powiedzi dla optymalizatora (ang. hints);
aplikację. • powrót do pkt. 1 aż do osiągnięcia satys-
fakcjonującego wyniku.

24 09/2008
Optymalizacja bazy danych

Zaprezentowane poniżej przykłady, zreali- ne, jak buforowanie danych, mogą w pew- Kompresja danych
zowano przy pomocy programu SQL Com- nym stopniu zniwelować niekorzystny efekt. Kompresji danych może obejmować całą prze-
mands. Jest on udostępniony razem z ca- Na Listingu 2. to samo zapytanie w wersji strzeń tabel lub wybrane tabele. Głównym ce-
łym panelem zarządzania Oracle Database poprawionej. Odczytany koszt wykonania po- lem kompresji jest ograniczenie ilości danych
Express Edition. Posiada zakładkę Explain, wyższego zapytania wynosi 54. czytanych bezpośrednio z dysku, co jak wiado-
prezentującą zestawienie szczegółów wyko- mo jest operacją czasochłonną.
nania zapytania. Z kolumny Koszt (ang. Cost) Optymalizacja SQL, przykład 2 Mechanizm ten działa w sposób następujący.
odczytać można koszt wykonania bieżącego Kolejny przykład zaprezentuje efektywność in- W bloku danych, przechowującym dane tabe-
zapytania. deksu. Załóżmy, że na tabeli KLIENT założony li, wszystkie powtarzające się dane zastępowa-
jest indeks na polu NAZWA. Szukamy klienta, któ- ne są skróconym ciągiem. Oryginalna wartość
Optymalizacja SQL, przykład 1 ry w swojej nazwie na początku lub końcu zawie- zapisywana jest tylko raz. Takie podejście spra-
Rozpatrzmy następujący przykład. Jest tabela ra słowo SKLEP. Należy pamiętać, że indeks na wia, iż skompresowany blok danych jest bardzo
KLIENT z 5 0 000 rekordów oraz tabela KLIENT_ polu tekstowym analizowany jest od pierwsze- podobny to zwykłego bloku i stosunkowo szyb-
GRUPA z 50 rekordów. Klient może należeć do go znaku tekstu, i dalej poprzez kolejne znaki. ki do odtworzenia.
wielu grup. Do danej grupy może należeć wie- Poniżej przykład zapytania SQL (indeks nie bę- Zastosowanie kompresji daje najlepsze rezul-
lu klientów (Rysunek 3). dzie użyty): taty w systemach, obciążonych częstym odczy-
Tworzymy zapytanie SQL, którego celem jest tywaniem dużych ilości danych z dysku. Oczy-
wypisanie klientów, którzy należą do więcej niż select * from klient wiście większa powtarzalność danych daje lep-
jednej grupy. where szy współczynnik kompresji.
Na Listingu 1. pokazano przykład nieopty- nazwa like '%SKLEP'
malnego zapytania SQL. Odczytany koszt wy- Widok zmaterializowany
konania powyższego zapytania wynosi 1572. Odczytany koszt wykonania powyższego za- Mechanizm widoku zmaterializowanego ma
Problem w tym zapytaniu polega na ty, że pytania wynosi 205. SZBD nie mógł użyć in- szerokie zastosowania. Ze względu na wydaj-
tabela KLIENT ma dużo rekordów i pełni ro- deksu, ponieważ co prawda, nazwa klienta ność, jego główny cel to przyspieszenie zapytań
lę tabeli zewnętrznej. Równocześnie wystę- musi kończyć się słowem SKLEP, ale zaczynać SELECT odwołujących się do obszernych i wy-
puje tu podzapytanie skorelowane, tzn. od- się może od dowolnych znaków (a więc pierw- magających agregacji (uogólnienia) źródeł da-
wołujące się do rekordów z tabeli zewnętrz- sze znaki nazwy są nieokreślone). Spowodo- nych. Przykładem może być zestawienie mie-
nej KLIENT. wało to, że konieczny był odczyt pola NAZWA z sięcznych obrotów budowane na podstawie
całej tabeli KLIENT. wszystkich operacji sprzedaży.
knt_grp.klient_id = knt.klient_id. Poniżej przykład zapytania SQL (indeks bę- Ze względu na sposób użycia, widok zma-
dzie użyty): terializowany jest podobny do tabel czy zwy-
Powoduje to, że osobno dla każdego rekordu kłych widoków. Może on jednak przechowy-
z tabeli KLIENT (50 000 rekordów) należy select * from klient wać w sobie gotowy wynik czasochłonnego za-
wykonać podzapytanie skorelowane. A więc where pytania. Dzięki temu pisząc SELECT ... FROM
dużą ilość razy system musi czytać małe por- nazwa like 'SKLEP%' {nazwa widoku zmaterializowanego} uzysku-
cje danych z dysku. To tak jakby na zakupach jemy szybki dostęp do gotowych, odpowiednio
biegać po każdą rzecz osobno, zamiast napeł- Odczytany koszt wykonania powyższego za- spreparowanych danych. Dodatkowo widok
niać koszyk. Tak więc w tym przypadku po- pytania wynosi 4. SZBD mógł użyć indeksu za zmaterializowany potrafi automatycznie kon-
dzapytanie skorelowane, okazało się nieko- pola NAZWA , ponieważ narzucono warunek na trolować swoje tabele źródłowe i odpowiednio
rzystne. Oczywiście mechanizmy wbudowa- pierwsze znaki z nazwy klienta. Pozwoliło to uaktualniać się.
znacząco obniżyć koszt tego zapytania, ponie-
Listing 1. Nieoptymalne zapytanie SQL waż system odczytał tylko wymagane rekordy Podsumowanie
z tabeli KLIENT. Optymalizator zapytań, buforowanie danych,
select knt.klient_id, knt.nazwa Otrzymane wyniki mogą się nieco różnić, za- analiza statystyk, domyślna konfiguracja, itd,
from klient knt leżnie od wersji Oracle, ilości i rodzaju przetwa- to wszystko już działa w tle. W systemach małej
rzanych danych, itp. skali, w zasadzie zapewnia to odpowiednią wy-
where dajność, bez dodatkowych zabiegów.
exists ( Kiedy stosować W systemach dużej skali, jak fabryka, hur-
select knt_grp.klient_id optymalizację zapytań SQL? townia, laboratorium wydajność jest bardzo
from klient_grupa knt_grp W praktyce, optymalizacja wszystkiego nie ma ważna, chwilami pierwszoplanowa. Dodatko-
where knt_grp.klient_id = sensu. Optymalizuje się przede wszystkim za- wo jest to proces ciągły, powiązany z ewolu-
knt.klient_id pytania SQL: cją środowiska produkcyjnego. Zadaniem ad-
group by klient_id ministratora jest optymalizacja tego środowi-
having count(*) > 1 • powiązane z kluczowymi i najczęściej uży- ska, a zadaniem programisty jest dostarczanie
) wanymi funkcji systemu; wydajnych komponentów w postaci modułów
• uruchamiane przez wielu użytkowników programu. Temat wydajności pojawia się więc
Listing 2. Poprawione zapytanie SQL lub wielokrotnie w pętlach. na każdym etapie życia projektu.
select knt.klient_id, knt.nazwa
from klient knt, klient_grupa knt_grp Inne mechanizmy optymalizacji
where Często SZBD oferuje dodatkowe możliwości MAREK KROKIEWICZ
knt.klient_id = knt_grp.klient_id optymalizacji danych, niezwiązanych bezpo- Autor jest programistą w firmie P.I. KAMSOFT. Zaj-
group by knt.klient_id, knt.nazwa średnio z koncepcją bazodanową. Również sys- muje się tworzeniem informatycznych systemów
having count(*) > 1 tem Oracle oferuje takie udogodnienia. Przy- zarządzania dla przedsiębiorstw.
kłady poniżej. Kontakt z autorem: mkrokiewicz@gmail.com

www.sdjournal.org 25
Bazy danych

Inżynieria baz danych


Wykorzystanie narzędzi Embarcadero

Programowanie aplikacji i baz danych to dwie strony tej samej monety. Firma
Embarcadero, specjalizująca się do tej pory w rozwiązaniach dla baz danych,
poszerzyła swoją ofertę o narzędzia dla programistów poprzez przejęcie od
firmy Borland grupy CodeGear (Delphi, JBuilder). Przyjrzyjmy się zatem, co
firma Embarcadero ma do zaoferowania w swojej dotychczasowej dziedzinie.
konać przelewów, a niektórym klientom banko-
Dowiesz się: Powinieneś wiedzieć: maty odmawiają wypłaty gotówki pomimo po-
• Jak narzędzia mogą pomóc w pracy administra- • Podstawowe wiadomości na temat baz danych. siadanych przez nich środków. Klienci są infor-
tora, architekta oraz programisty baz danych. mowani o chwilowej przerwie w pracy systemu,
zaś informatycy gorączkowo starają się zdiagno-
zować i usunąć problem. Powodem takiej kry-
łające nawet bez połączenia z serwerem bazy da- tycznej sytuacji może być działanie któregoś
nych. Drugą istotną zaletą narzędzi Embarcade- z użytkowników bazy danych, który zmienia-
Poziom trudności ro jest możliwość pracy z różnymi serwerami baz jąc dane nie zakończył transakcji powodując za-
danych. Jedno narzędzie obsługuje wiele serwe- blokowanie zmienionych danych. Na potrzeby
rów baz danych, zaczynając od platform komer- połączenia aplikacji użytkownika baza danych
cyjnych, takich jak Oracle, DB2, MS SQL Server, tworzy proces obsługujący to połączenie. Pro-

W
połowie maja 2008 roku świat kom- Sybase ASE, a kończąc na darmowych jak Fire- ces wykonuje kolejne instrukcje i zakłada blo-
puterowy zelektryzowała wiado- bird, czy MySQL. Dla osób pracujących z wieloma kady na aktualnie wykorzystywane dane. Dopó-
mość o sprzedaży przez firmę Bor- serwerami baz danych stanowi to bardzo wygod- ki transakcja nie zostanie zakończona (tj. nie zo-
land grupy CodeGear. Nowym właścicielem pro- ne rozwiązanie, dzięki wykluczeniu konieczności stanie wykonane polecenie COMMIT lub ROL-
duktów takich jak: Delphi, C++ Builder, Interbase poznawania i pracowania z różnymi narzędziami, LBACK), inne procesy nie mogą zmieniać za-
i JBuilder jest firma Embarcadero. Do tej pory fir- specyficznymi dla każdego z typów serwerów. Wy- blokowanych danych. Nie jest możliwe wtedy
ma Embarcadero oferowała szeroki wachlarz roz- mienione rozwiązania są sztandarowymi produk- na przykład zmodyfikownie stanu konta, co jest
wiązań dla osób zajmujących się bazami danych tami Embarcadero, więc właśnie im się przyjrzyj- przecież warunkiem niezbędnym do dokonania
(architektów danych, administratorów, programi- my na przykładzie praktycznych zagadnień. przelewu, czy wypłaty gotówki w bankomacie.
stów), a więc podobnego kręgu odbiorców, co gru- Przed taką sytuacją trudno się zabezpieczyć.
pa CodeGear. Jak mówią sami przedstawiciele fir- Administracja z DBArtisan Do problemu może doprowadzić nawet niepra-
my, programowanie aplikacji i baz danych to dwie Wyobraźmy sobie następującą sytuację: pewne- widłowe zamknięcie aplikacji, nieodpowiednio
strony tej samej monety, a obydwa obszary są za- go dnia w kilku oddziałach banku nie można do- napisane oprogramowanie lub nadmiar upraw-
zwyczaj obsługiwane przez te same osoby. Po zapo-
znaniu się z narzędziami Embarcadero pierwszą
rzeczą, która rzuca się w oczy jest ich ukierunko-
wanie na osobę, a dokładniej na rolę pełnioną w ze-
spole. Propozycją dla administratorów baz danych
jest DBArtisan, architektom firma oferuje narzę-
dzie ER/Studio, a z kolei dla osób zajmujących się
kodowaniem oraz logiką biznesową w bazach inte- Rysunek 1. DBArtisan – zakładka Blocking Lock
resujacą propozycją jest RapidSQL. Wszystkie na-
rzędzia z oferty firmy Embarcadero są specjalizo-
wane i mają służyć konkretnej grupie informaty-
ków do łatwej pracy w ich głównym obszarze za-
dań. Zarazem specjalizacja nie oznacza zawężenia
funkcjonalności, ponieważ typowe zadania moż-
na wykonywać za pomocą wszystkich narzędzi.
Przykładowo procedurę składowaną można utwo-
rzyć przy użyciu każdego z wymienionych progra-
mów, przy czym program RapidSQL posiada do-
datkowo rozbudowane analizatory składni, dzia- Rysunek 2. DBArtisan – zakładka Processes

26 09/2008
Wykorzystanie narzędzi Embarcadero

nień użytkownika w stosunku do jego wiedzy. generowanych przez bazę na potrzeby obsługi po- Studio. W programie ER/Studio uruchamiamy
Jeśli mamy do czynienia z aplikacją do fakturo- łączeń użytkowników. Ponieważ DBArtisan ob- funkcję New data model, a następnie wybieramy
wania, wtedy problem trzeba rozwiązać szybko. sługuje równocześnie wiele rodzajów baz danych, Reverse engineer an existing database.
Jeśli dotyczy systemów finansowych, to trzeba to na przykład dla bazy DB2 z racji jej budowy bę- Mamy dwie metody dostępu do baz danych –
go rozwiązać natychmiast. Skorzystajmy z unika- dziemy mówić o wątkach, a nie procesach. Za- natywny i poprzez sterowniki ODBC. W sposób
towej funkcjonalności programu DBArtisan do kładki przy podłączeniu programu DBArtisan do natywny są obsługiwane serwery – IBM DB2, MS
wykrywania blokujących się procesów i błyska- DB2 wyglądają nieco inaczej, ale posiadają iden- SQL Server, Oracle i Sybase ASE, a posiadając ste-
wicznie rozwiążmy problem. tyczną funkcjonalność. rowniki ODBC możemy pracować z innymi baza-
Na potrzeby tego przykładu użyjemy SQL Se- Szybka analiza zakładki Processes (Rysunek 2) mi danych jak chociażby Interbase, Firebird czy
rver 2005 Express Edition wraz z przykładową pozwala stwierdzić, że kłopotliwy proces nr 54 MySQL. W przypadku połączeń natywnych two-
bazą Northwind oraz standardowej konsoli SQL użytkownika BLOK pochodzi z komputera TO- rzona dokumentacja będzie zawierała wszystkie
Server Management Studio Express. Do wygene- SHIBAA80 i w chwili obecnej oczekuje na po- typy obiektów dostępne w bazach danych, włącz-
rowania sytuacji testowej wykorzystamy specjal- lecenie (Awaiting command). Oczekujący pro- nie z specyficznymi dla danego serwera, takimi jak
nie napisany program, który po otwarciu transak- ces nr 55 użytkownika SA ma status wstrzyma- choćby tablespaces, packages, rollback segments
cji modyfikuje dane i nie zakończy transakcji. Na- ny (Suspended), a ostatnią komendą, jaką próbo- czy sequences dla serwerów Oracle. Przy zastoso-
stępnie spróbujemy dokonać zmian tych samych wał wykonać było polecenie UPDATE. Jeśli chcie- waniu połączeń ODBC liczba rozpoznawanych
danych z poziomu konsoli. Zgodnie z oczekiwa- libyśmy uzyskać dokładniejsze informacje o blo- typów obiektów zależy od jakości sterownika.
niami Management Studio nie może wykonać in- kadach, które założyły obydwa procesy, możemy Wszystkie obecnie używane sterowniki ODBC
strukcji UPDATE i pozostaje w stanie oczekiwania skorzystać z zakładki Locks. pozwalają nam na utworzenie podstawowej struk-
wyświetlając komunikat Executing query. Mając wszystkie informacje o procesie blo- tury danych (tabele, widoki, relacje, itp.).
Po uruchomieniu programu DBArtisan i za- kującym przetwarzanie możemy skontaktować Po wskazaniu bazy danych pojawia się okno,
logowaniu do serwera „rozwijamy” jego zakład- się z konkretnym użytkownikiem, a jeśli oceni- w którym możemy wybrać, jakiego typu obiek-
ki przechodząc do sekcji odpowiedzialnej za wy- my jego proces za niezbyt ważny, od razu termi- ty chcemy odczytać z bazy danych. Do wyboru
dajność (Performance). Sekcja Performance po- nować ten proces poleceniem KILL. Po usunię- mamy wszystkie typy obiektów znajdujące się
zwala obserwować procesy (Processes) oraz zało- ciu procesu nr 54 Management Studio realizu- w bazie włącznie z tabelami systemowymi. Do-
żone przez nie blokady (Locks), w tym najistot- je w końcu swoje polecenie UPDATE. Po odświe- datkowo dla każdego obiektu możemy zdecy-
niejsze dla nas w tym przypadku blokady, któ- żeniu zakładek DBArtisana widzimy, że zniknę- dować, czy ma zostać uwzględniony przy two-
re uniemożliwiają pracę innym procesom (Bloc- ły wszystkie blokady – rozwiązaliśmy problem, rzeniu modelu czy też nie. Istnieje więc możli-
king locks). Ponieważ szukamy szkodnika, od ra- bankomaty działają! wość ustawienia zakresu obiektów do odczytu z
zu przechodzimy do zakładki Blocking locks, aby dokładnością do każdego obiektu, a nie tylko do
sprawdzić wstrzymywane procesy (Rysunek 1). Modelowanie danych z ER/Studio typu obiektów.
Jak widać na ilustracji, zakładka ta udostępnia Pewnego dnia otrzymujemy polecenie dołoże- Po określeniu zakresu prac reinżynieryjnych
szczegółowe dane o blokujących się wzajemnie nia nowej funkcjonalności do istniejącej bazy da- (ang. reengineering) (Rysunek 3) generujemy mo-
procesach ID procesu wstrzymującego i wstrzy- nych. Dowiadujemy się, że nie ma aktualnej spe- del bazy danych (Rysunek 4). Najpierw tworzo-
mywanego, nazwy użytkowników tych proce- cyfikacji dla naszej bazy. Istniejącą dokumenta- ny jest model fizyczny, który w wybranym wcze-
sów, bazę danych oraz obiekty, których sytuacja cję kierownik projektu wręcza nam z lekkim za- śniej zakresie jest wiernym odwzorowaniem ba-
konfliktowa dotyczy. Od razu widzimy, że proces kłopotaniem, bo ostatnia aktualizacja tego doku- zy danych. Model ten zawiera obiekty z bazy ta-
nr 54 użytkownika BLOK wstrzymuje proces nr mentu odbyła się pięć lat temu. Dokumentacja kie jak tabele, procedury składowane, użytkowni-
55 użytkownika SA, a obydwa procesy odwołują jest nam niezbędna do pracy z klientem i progra- ków, uprawnienia, itp. Typy obiektów, jakie znaj-
się do bazy Northwind. Chcąc dokładnie ziden- mistami, dlatego najpierw musimy ją stworzyć. dują się w modelu fizycznym są zależne od bazy
tyfikować proces wstrzymujący korzystamy z za- W praktyce tego typu problemy z dokumen- danych, dla której ten model jest dedykowany.
kładki Processes, która udostępnia szczegółowe da- tacją zdarzają się w wielu firmach. Sprawdźmy, Rozbudowane edytory obiektów pozwalają na
ne o procesach, takie jak ID procesów, ich statusy, jak łatwo możemy uzyskać dokumentację ist- graficzne modelowanie właściwości obiektów.
użytkowników za nie odpowiedzialnych, nazwy niejącej bazy danych za pomocą programu ER/ Na rysunku 5 przedstawiono widok edytora ta-
lub adresy IP komputerów z których nawiązano
połączenia, typ aktualnie wykonywanej komen-
dy, a w niektórych przypadkach nazwę programu
użytego do połączenia (Rysunek 2). Warto wspo-
mnieć, że mówimy o procesach bazy danych wy-

Rysunek 3. ER/Studio – wybór typów obiektów


podczas reinżynierii Rysunek 4. ER/Studio – model danych

www.sdjournal.org 27
Bazy danych

bel dla tabeli Employees. Za pomocą edytora ta- na modyfikować, a zmiany modelu fizycznego W powyższy sposób, używając dwóch funkcji
bel możemy modyfikować nie tylko podstawowe możemy od razu nanosić na bazę danych. ER/Studio, odtworzyliśmy szczegółowy model
cechy tabel wynikające ze składni SQL samej ta- Na podstawie modelu możemy utworzyć bazy danych i wygenerowaliśmy na jego podsta-
beli (kolumny, typy danych, klucze obce, indek- dokumentację. W tym celu z menu Tools wy- wie dokumentację w HTML-u.
sy), ale także inne obiekty wymagające dodatko- bieramy Generate reports i ustalamy zakres da-
wych poleceń SQL (uprawnienia użytkowników nych, które chcemy umieścić w dokumentacji. Tworzenie kodu
dotyczące tej tabeli, powiązania z procedurami Możemy wybrać format HTML, lub RTF, kata- bazodanowego z RapidSQL
składowanymi, triggery, statystyki danych, itp.). log docelowy oraz bardzo szczegółowo określa- W ramach kontynuacji poprzedniego zadania
Dzięki takiemu ukierunkowaniu modelu fizycz- my zakres obiektów, a nawet cech obiektów do otrzymaliśmy polecenie utworzenia widoku
nego możemy bezpośrednio z niego generować umieszczenia w dokumentacji. (View) jako źródła danych raportu dla progra-
skrypty SQL tworzące bazę danych. Tak duża możliwość wybierania zakresu wszel- misty. Szczegóły widoku takie jak lista kolumn,
Na podstawie modelu fizycznego automa- kich prac z obiektami baz danych w ER/Studio sposób grupowania, oraz wyświetlania ustalamy
tycznie generowany jest model logiczny. Model jest wielką zaletą tego programu. Zakładkowa bu- z programistą. Wiadomo, że najlepiej pracuje się
logiczny jest modelem ogólnym i nie jest zdeter- dowa okien do wyboru obiektów sprawia, że po- z obrazem, więc na spotkanie zabieramy wyge-
minowany typem serwera SQL. Z tego modelu mimo tak rozbudowanych możliwości, obsługa nerowaną w poprzednim zadaniu dokumenta-
logicznego możemy generować modele fizycz- programu jest prosta. Możliwość określania za- cję. Zamiast tracić czas i energię na ręczne prze-
ne dla różnych typów baz danych. Jest to bar- kresu z dokładnością do pojedynczego obiektu pisywanie ustaleń ze spotkania, wszystkie infor-
dzo przydatna funkcjonalność podczas migra- jest bardzo ważna podczas reinżynierii, generacji macje z łatwością przełożymy na instrukcję SQL
cji bazy danych pomiędzy serwerami różnych skryptu SQL czy tworzenia dokumentacji. przy pomocy modułu Query Builder dostępne-
producentów. Dodatkowymi danymi do wprowadzenia są in- go w programie RapidSQL.
Program ER/Studio przedstawia w sposób formacje o dokumentacji, czyli nazwa dokumen- Program RapidSQL jest przeznaczony do
graficzny strukturę bazy danych, prezentu- tacji, autor, firmowe logo, itp. Po generacji otrzy- tworzenia i analizy kodu obiektów bazodano-
jąc na diagramie wszystkie obiekty i powiąza- mujemy dokumentację w wybranym formacie wych (np. procedur składowanych, wyzwala-
nia pomiędzy nimi. Utworzone modele moż- wyglądającą jak model w ER/Studio (Rysunek 6). czy, instrukcji DDL) oraz pracy ze skryptami. W
przykładzie użyjemy podprogramu Query Buil-
der, który służy do wizualnego budowania zło-
żonych instrukcji SQL.
Podczas tego zadania posłużymy się bazą Nor-
thwind umieszczoną na serwerze Oracle. Baza ta
jest wynikiem migracji pomiędzy serwerami MS
SQL Serwer i ORACLE. Migracji tej z braku miej-
sca tutaj nie pokażę, nie jest ona zreszta skompli-
kowana – wykorzystałem model utworzony w
poprzednim przykładzie i na jego podstawie
stworzyłem model fizyczny dla bazy Oracle, a na-
stępnie wygenerowałem skrypt SQL, który uru-
chomiłem na serwerze jako użytkownik HR.
Po uruchomieniu programu RapidSQL z me-
nu Tools wybieramy Query builder. Nowo otwar-
te okno pozwala nam przeciągać tabele z listy po
lewej stronie na część roboczą po prawej. Pro-
gram automatycznie pokazuje relacje pomiędzy
tabelami na podstawie kluczy obcych oraz po-
kazuje listę kolumn w tabelach (Rysunek 5). Po
przeciągnięciu tabel zaznaczamy kolumny, które
mają znaleźć się w tworzonym zapytaniu. Ponie-
waż domyślnie tworzone jest polecenie SELECT,
musimy zmieć typ polecenia na VIEW.
Do bardziej zaawansowanej pracy z SQL uży-
jemy zakładki DML. Widzimy tu nasze zapyta-
nie w postaci drzewa z pogrupowanymi informa-
Rysunek 5. ER/Studio – edytor tabel cjami w zakładkach COLUMNS, FROM, WHE-
RE, GROUP BY, HAVING, ORDER BY (dla SE-
LECT), SET (dla UPDATE), itp. W zakładkach
O firmie tych można dokonywać zmian w tworzonym za-
Założona w 1993 roku Embarcadero Technologies oferuje szeroką gamę międzyplatformowych
narzędzi bazodanowych wspierających wszystkie etapy cyklu życia baz danych: modelowanie, pytaniu. Zmiany będą automatycznie przenoszo-
tworzenie, optymalizację, administrację, a także wspierających migrację baz danych pomiędzy ne na model graficzny. Jeśli używamy kilku po-
serwerami SQL. W połowie 2008 roku firma podpisała porozumienie z Borland Software Corpo- wiązanych tabel, klucze obce automatycznie zo-
ration i przejęła firmę CodeGear, światowego lidera w dostarczaniu narzędzi programistycznych, staną przeniesione do klauzuli WHERE, gdzie
w tym Delphi, C++Builder iJBuilder. Obecnie Embarcadero łączy i stale rozwija w swojej ofercie
musimy samodzielnie określić sposób oraz hie-
rozwiązania z obszaru narzędzi programistycznych i narzędzi bazodanowych, stając się najwięk-
szym na świecie niezależnym dostawcą tych rozwiązań. Firma BSC Polska, przedstawiciel firmy rarchię łączenia warunków (AND, OR i kolejność
Borland jest także przedstawicielem Embarcadero w naszym kraju. Więcej informacji na stronie nawiasów). W zakładce DML możemy także do-
http://www.embarcadero.com.pl. dawać nowe warunki, zmieniać domyślny sposób
łączenia tabel (na np. LEFT JOIN), a także uży-

28 09/2008
Wykorzystanie narzędzi Embarcadero

wać bardziej zaawansowanych możliwości SQL Dlaczego warto? uzupełniają standardowe możliwości interesują-
jak GROUP BY czy HAVING. Dokładny tekst Przedstawione przykłady to zaledwie znikoma cymi funkcjonalnościami, jak chociażby lista za-
powstałego polecenie SQL widzimy w dolnym część funkcjonalności omawianych narzędzi. Ich blokowanych procesów w DBArtisanie wraz z
oknie, z możliwością edycji w osobnym oknie. olbrzymią zaletą jest łatwość i intuicyjność obsłu- przejrzystym pokazaniem procesów blokujących
Utworzyliśmy właśnie widok (View) o na- gi oraz wsparcie wielu typów serwerów baz da- i blokowanych. Część ułatwiających pracę funk-
zwie NOWE. Warto jeszcze dla pewności spraw- nych. Zadziwiająco łatwo udało mi się dokonać cjonalności wprowadzono na zgłaszane poprzez
dzić jego poprawność składni (check syntax). Ta- migracji bazy danych Northwind z MS SQL Ser- firmowy portal sugestie użytkowników.
ki test wykonuje RapidSQL samodzielnie i nie wer do serwera Oracle Co więcej mogłem porów-
wymaga łączenia z serwerem. Jeżeli jesteśmy nać modele fizyczne dla obydwu baz i upewnić Portal internetowy
podłączeni do bazy danych, to utworzone po- się, że migracja jest kompletna. Kłopotliwe jest Na koniec niniejszego artykułu kilka słów o wspo-
lecenie SQL możemy uruchomić (execute) od używanie wielu programów wykonujących te sa- mnianym już firmowym portalu internetowym
razu. Jak widać na Rysunku 5, polecenie SQL me funkcje w inny sposób dla różnych baz. Zuni- (http://www.embarcadero.com). Oprócz standar-
używa przedrostków HR (zalogowanego użyt- fikowanie narzędzi do jednego rozwiązania bar- dowych informacji handlowych, promocji oraz
kownika), co jest niezbędne dla bazy Oracle, ale dzo ułatwia pracę oraz ogranicza liczbę aplika- możliwości pobrania produktów w wersjach te-
może stwarzać problemy dla innych typów baz, cji, które trzeba poznać i obsługiwać. Znikają od- stowych (TRIAL) portal oferuje silne wsparcie dla
np. MS SQL Server. Aby dostosować sposób ge- wieczne problemy typu: wiem jak to zrobić dla użytkowników. Znajdziemy w nim bardzo dużo
neracji kodu do wymogów serwera SQL użyje- DB2, ale jak to się robi w Oracle? materiałów technicznych, włącznie z obszerny-
my zakładki Query Builder/Statement Prospe- Pomimo iż Embarcadero nie koncentruje się mi dokumentacjami (np. UserGuide dla ERStu-
rites. Możemy tutaj ustawić szereg parametrów, na obsłudze jednego, wybranego typu bazy da- dio – 603 strony). Inną formą wsparcia są fora te-
jak chociażby opcje generate owner names, include nych, ale dostarcza zintegrowane rozwiązania matyczne dotyczące poszczególnych narzędzi, na
row count limits. wspierające wiele rodzajów baz możliwości na- których dyskusje służą nie tylko wymianie wiedzy
Zadanie wykonane – dzięki RapidSQL au- rzędzi Embarcadero w niczym nie ustępują pomiędzy użytkownikami, ale również do komu-
tomatycznie utworzyliśmy widok korzystając z funkcjonalności oferowanej przez narzędzia firm nikacji ze specjalistami Embarcadero. Fora te od-
graficznej reprezentacji struktury danych. trzecich. Rozwiązania firmy Embarcadero często wiedzają konsultanci techniczni firmy, odpowia-
dając na pytania i udzielając porad technicznych.
Dodatkowym ciekawym audiowizualnym wspar-
ciem są seminaria internetowe (WEBseminaria),
przygotowane dema, oraz szczegółowo opisane
przykłady użycia poszczególnych narzędzi.

Podsumowanie
Analiza narzędzi Embarcadero wskazuje jedno-
znacznie na to, że producentowi zależy na jak naj-
większej wszechstronności narzędzi. Dzięki te-
mu są one przydatne w firmach, gdzie wykorzy-
stuje się wiele serwerów baz danych oraz dokonu-
je się migracji pomiędzy różnymi typami plat-
form bazodanowych. Rozwiązania Embarcadero
rewolucjonizują bowiem sposób pracy z wieloma
serwerami, pozwalając użytkownikom na znacz-
ne ograniczenie czasu potrzebnego na wykona-
nie powierzonych im zadań oraz sprawniejsze ich
zrealizowanie. Dostępność dokumentacji oraz
Rysunek 6. ER/Studio – dokumentacja w HTML
konsultantów technicznych znacznie ułatwia po-
znawanie narzędzi oraz wykorzystywanie w peł-
ni oferowanych przez nie możliwości.
Nastawienie firmy Embarcadero pozwala
również spokojnie patrzeć na przyszłość Del-
phi. Możemy nawet oczekiwać interesujących
efektów synergii produktów CodeGear i Embar-
cadero. Pozostaje nam tylko z niecierpliwością
oczekiwać na pierwszy po połączeniu plan stra-
tegiczny rozwoju produktów (RoadMap).

ANDRZEJ DĄBROWSKI
Andrzej Dąbrowski jest trenerem i konsultantem
technicznym BSC Polska. Pełni obowiązki CodeGe-
ar Technical Evangelist w Polsce. Pracował jako kie-
rownik działu oprogramowania zajmującego się
tworzeniem aplikacji bazodanowych. Zajmował się
zarówno tworzeniem baz danych, jak i oprogramo-
wania korzystającego z tych baz. Ukończył Wydział
Cybernetyki Wojskowej Akademii Technicznej.
Rysunek 7. RapidSQL – graficzne tworzenie polecenia SQL. Kontakt z autorem: adabrowski@borland.pl

www.sdjournal.org 29
Bazy danych

Oracle 11g – platforma


przetwarzania danych
Przegląd nowych możliwości oferowanych przez bazę Oracle 11g
W trakcie ostatnich lat globalne znaczenie technologii informatycznych stało
się faktem – ich powszechne zastosowanie we wszelkich dziedzinach ludzkiej
działalności generuje potrzebę równie powszechnego, niezawodnego i
łatwego dostępu do wszelkich danych, jakie są przechowywane w rozmaitych
systemach.
Dostęp do danych
Dowiesz się: Efektywny dostęp do informacji znajdujących
• Co nowego pojawiło się w silniku bazy danych Oracle 11g; się w firmowych systemach wymaga sięgnię-
• Jakie nowe opcje są dostępne wraz z bazą Oracle 11g. cia zarówno do danych dobrze ustrukturalizo-
wanych, takich jak relacyjne bazy danych – jak
i nieustrukturalizowanych; przyjęło się szaco-
o koncepcje Grid Gomputing – współdziele- wać, iż około 80% informacji znajdujących się
nia zasobów przetwarzania dla efektywniej- w organizacji to dane zapisane poza bazami re-
Poziom trudności szego wykorzystania posiadanej infrastruk- lacyjnymi, w systemach takich jak poczta elek-
tury oraz zapewnienia maksymalnej nieza- troniczna, w dokumentach w systemie plików.
wodności. Koncepcja Grid Computing w im- Jednym z poważniejszych wyzwań stojących
plementacji Oracle to jedyna na rynku ofer- przed działem IT jest zapewnienie efektywne-

S
łużby informatyczne stoją przed wyzwa- ta oferująca równocześnie skalowalność syste- go dostępu do tychże dokumentów, jak też ła-
niem: jak sprostać nieustannie rosnącym mów, wydajność i niezawodność przetwarza- twość konsolidacji danych pochodzących z róż-
potrzebom składowania i dostępu do in- nia, pełne wykorzystanie już posiadanej infra- nych źródeł.
formacji, w jaki sposób zapewnić adekwatny struktury IT (tak sprzętu jak i licencji na opro- Oracle 11g oferuje szeroką paletę narzędzi
poziom usług – niezawodność przetwarzania, gramowanie). pozwalających korzystać ze zróżnicowanych
bezpieczeństwo, wydajność, jak reagować na Oferta Oracle obejmuje wszystkie elementy źródeł informacji, pozwalając na konsolidację
zmieniające się potrzeby ich organizacji. Jak niezbędne do stworzenia, wdrożenia i zarzą- tak samych informacji – co umożliwia auto-
sprawić, by mimo wciąż rosnących wymagań dzania środowiska Grid – poczynając od war- matyzację procesów organizacyjnych, jak też
oraz złożoności systemów, efektywnie wspierać stwy składowania danych (Automated Storage umożliwia implementację zunifikowanego me-
działalność macierzystej organizacji. Management), poprzez infrastrukturę (Orac- chanizmu zarządzania danymi wraz ze spójną
Baza danych Oracle 11g to technologia le Clusterware), bazę danych (Oracle Real Ap- polityką bezpieczeństwa i archiwizacji.
wspierająca klientów w tworzeniu skalowal- plication Clusters), serwer aplikacyjny (Orac-
nych, bezpiecznych systemów sprawnie do- le Fusion Middleware), aż do narzędzi zarzą- Dane nieustrukturalizowane
pasowujących się do zmiennych potrzeb, ja- dzania i monitoringu (Oracle Enterprise Grid Baza danych Oracle od lat posiada wzorcowo
kie narzuca rynek. W oparciu o trzydzieści Control, wsparty przez specjalizowane rozsze- sprawną implementację składowania i dostę-
lat doświadczeń na polu tworzenia niezawod- rzenia Management Packs, oracz System Mo- pu do nieustrukturalizowanych, takich jak pli-
nych baz danych, Oracle 11g umożliwia bu- nitoring Plug-ins). Co jest szczególnie istotne ki i multimedia w bazie danych, dane geogra-
dowę elastycznej, łatwej w zarządzaniu infra- – oferta korporacji Oracle jest nie tylko uni- ficzne (opcja Spatial), dokumenty XML. Orac-
struktury, jaką będziemy mogli prosto, bez- kalna na rynku, ale także sprawdzona w prak- le 11g rozbudowuje te możliwości o nowe tech-
piecznie i planowo dopasować do zmieniają- tyce przez tysiące klientów na całym świecie, nologie jak binary XML oraz XML index, ofe-
cych sie wymagań. poczynając od wielkich korporacji, poprzez rujące rewelacyjną poprawę wydajności (wedle
organizacje publiczne, systemy policyjne i in- wewnętrznych testów – do 1500%).
Grid Computing stalacje wojskowe, na małych i średnich syste- Kolejne usprawnienia wersji Oracle 11g to
Jednym z naczelnych problemów dla służb mach kończąc. dostęp do nowych typów danych, takich jak
informatycznych jest koszt tworzenia i za- Oracle 11g jest kolejną wersją niezawodne- przetwarzanie obrazów zgodnie ze standar-
rządzania niezawodną infrastrukturą. Kor- go silnika bazy danych, optymalizowaną z my- dem DICOM, łatwa implementacja technolo-
poracja Oracle jest twórcą i dostawcą unikal- ślą o szczególnie ważnych systemach wyma- gii RFID, wsparcie dla analiz i przechowywa-
nej technologii, umożliwiającej budowę skalo- gających najwyższej niezawodności, a także nia danych przestrzennych Spatial (2D, 3D, To-
walnej, bezpiecznej infrastruktury w oparciu uproszczenia procedur administracyjnych. pology, Networking, TIN, Georaster). Znaczą-

30 09/2008
REKLAMA
Bazy danych

cą innowacją jest także możliwość zarządzania Zarządzanie cyklem życia danych Usprawniona diagnostyka (Oracle Automatic
dokumentami w systemie plików za pomocą Information Lifecycle Management (ILM, zarzą- Database Diagnostic Monitor) pozwala teraz na
mechanizmów bazy danych (Secure Files), co dzanie cyklem życia danych) to metodyka skon- szczegółową analizę wydajności Oracle RAC.
umożliwia ujednolicenie mechanizmów dostę- centrowana na redukcji kosztów infrastruktu-
pu (bezpieczeństwo informacji!) bez koniecz- ry przy zachowaniu niezbędnej jakości dostę- Bezpieczeństwo
ności fizycznej konsolidacji danych. pu do danych. ILM opiera się o idee logicznego Bezpieczeństwo jest podstawowym wymaga-
podziału danych wedle kryteriów dostępności niem dla systemów naszych klientów – wspomi-
Zintegrowana analiza danych (najczęściej używane dane – bieżące, versus da- nając pierwsze, historyczne wdrożenia dla klien-
Wzrastająca waga i ilość danych w bazach pocią- ne historyczne, niemodyfikowane i rzadziej od- tów (służby wywiadowcze, wojsko). Wychodząc
ga za sobą rosnące zapotrzebowanie na dostęp czytywane). naprzeciw zapotrzebowaniu klientów oraz wy-
do informacji, tak historycznych jak i bieżących. Zastosowanie technologii partycjonowa- maganiom prawnym (SOX, Basel II, PCI) korpo-
Użytkownicy oczekują wydajnych mechani- nia oraz kompresji umożliwia daleko sięgają- racja Oracle oferuje kompletny pakiet technolo-
zmów pozwalających na odczyt i analizę dużych ce oszczędności w infrastrukturze, co nabie- gii pozwalających na stworzenie kompleksowe-
zbiorów danych. Wychodząc naprzeciw tym po- ra szczególnego znaczenia przy dużych wolu- go, wielowarstwowego systemu zabezpieczeń w
trzebom i oczekiwaniom, korporacja Oracle po- menach danych i urządzeniach pamięci maso- przedsiębiorstwie – poczynając od systemów za-
siada znakomite narzędzia (takie jak OLAP, Da- wej, pozwalając na optymalizację warstwy skła- rządzania tożsamością (Identity Management),
ta Mining), silnie zintegrowane z motorem bazo- dowania danych przy daleko idącej (wedle na- poprzez elastyczne technologie Middleware aż
danowym oraz jego możliwościami analityczny- szych szacunków – do 94%) redukcji kosztów. do wysublimowanych technologii zabezpieczeń
mi (możliwości PLSQL, materialized views). Wsparciem tu może być nowe narzędzie – Par- bazy danych.
Oracle 11g rozbudowuje te możliwości o no- titioning Advisor, upraszczające pracę admini- Dla bazy Oracle 11g oferujemy szeroką paletę
wą funkcjonalność – Cube-organized materia- stratorów bazy. możliwości zabezpieczania dostępu do informa-
lized views, unikalną kombinację pozwalającą cji, oprócz standardowych mechanizmów uwie-
na wykorzystanie posiadanych systemów, apli- Najwyższy poziom dostępności rzytelniania i autoryzacji opartych o hasło (do-
kacji i umiejętności do odczytu danych z bazy Znakomita większość kosztów utrzymania in- datkowa autoryzacja – Secure Application Ro-
wielowymiarowej, z pełną szybkością oferowa- frastruktury IT obraca się wokół zapewnienia les, selektywny dostęp do poszczególnych wier-
ną przez OLAP. Kolejne innowacje to nowy al- bezpieczeństwa, niezawodności i efektywności szy – Virtual Private Database, szczegółowy au-
gorytm i sprawniejsze zarządzanie modelami przetwarzania danych. Implementacja koncepcji dyt – Fine Grained Auditing). Tym uzupełnie-
Data Mining, Grid Computing dzięki technologii Real Appi- niem są technologie Oracle Secure Backup (za-
Te właściwości, wspierane przez kolejne na- cation Clusters jest unikalną na rynku propozy- bezpieczenie nośników kopii zapasowej), Orac-
rzędzia z oferty korporacji (Oracle Warehouse cją – co ważniejsze sprawdzoną w codziennym le Database Vault (umożliwia wprowadzenie
Builder, Oracle Data Integrator) tworzą kom- użytkowaniu przez tysiące klientów, uzupełnia- separacji uprawnień oraz implementację szcze-
pletną, zunifikowaną infrastrukturę dla two- ną przez znaczące innowacje tak w silniku bazy gółowej polityki bezpieczeństwa w oparciu o
rzenia i zarządzania hurtowniami danych i ba- danych jak i specjalizowanych opcjach wspiera- wielostopniowe uwierzytelnienie). Uzupełnie-
zami analitycznymi. jących wysublimowane możliwości ochrony da- niem dla powyższych są technologie Oracle Au-
nych, tak w samej bazie jak i poza nią. dit Vault (dedykowana składnica zdarzeń, moni-
Zarządzanie dużą ilością danych Nowością w bazie danych Oracle 11g jest toring w oparciu o reguły) oraz Oracle Advan-
Szybko wzrastająca ilość informacji przechowy- opcja Oracle Total Recall, umożliwiająca imple- ced Security (całkowicie przezroczyste dla apli-
wanych w systemach jest coraz większym wy- mentację repozytorium zmian w danych (histo- kacji szyfrowanie danych w bazie oraz w czasie
zwaniem dla służb informatycznych. Korpora- ria zmian). Opcja Oracle Total Recall wraz z no- transmisji).
cja Oracle od lat wspiera klientów w efektyw- wym modułem SQL Recovery Advisor umożli-
nym zarządzaniu dużymi bazami danych, dzię- wiają także szybki dostęp do danych historycz- Efektywne zarządzanie zmianami
ki innowacyjnym i wydajnym możliwościom nych (stan sprzed zmian). Elastyczna infrastruktura informatyczna umoż-
oferowanym w ramach opcji partycjonowania liwia lepsze dostosowanie systemów do potrzeb
danych (Partitioning). Wydajność organizacji, stawiając jednak przed służbami in-
Oracle 11g przynosi znaczące nowości w Baza Oracle od lat dzierży palmę pierwszeń- formatycznymi istotne wyzwania przy imple-
technologii partycjonowania, oferując nowe stwa w testach wydajnościowych, wyznaczając mentacji tychże zmian. W szczególności moż-
sposoby partycjonowania (Interval – automa- poziom odniesienia dla innych silników bazo- liwość bezpiecznego – planowego – testowania
tyzujący zarządzanie partycjami w oparciu o danowych. Wersja Oracle 11g przynosi znaczą- i wprowadzania zmian w infrastrukturze (tak
predefiniowane reguły oraz REF partitioning ce usprawnienia i optymalizacje podnosząc po- w warstwie oprogramowania jak i sprzętu) sta-
wspierający implementację jednolitego party- przeczkę jeszcze wyżej. Znaczące optymalizacje nowiła najważniejsze wyzwanie dla działalno-
cjonowania tabel połączonych relacjami). samego to nowe mechanizmy kompilacji zapy- ści specjalistów.
Uzupełnieniem mechanizmów partycjono- tań (Native Compilers), nowy mechanizm bu- Oracle 11g przynosi nowe narzędzia ułatwia-
wania jest nowy mechanizm kompresji danych, forowania danych (Client-side result caching). jące planowe i bezpieczne testowanie oraz imple-
oferowany jako opcja bazy danych (Compres- Daleko idące usprawnienia zostały wprowadzo- mentację zmian, upraszczając zarządzanie i mo-
sion) – całkowite przezroczysta dla istniejących ne także do Real Application Clusters (Oracle dyfikację systemów. Opcja Real Application Te-
mechanizmów dostępu do danych. RAC), poprawiając wydajność zapytań do 70%. sting wspiera specjalistów w analizie zmian sys-
temowych, pozwalając oszacować wpływ zmian
na wydajność systemów działających pod rze-
W Sieci czywistym obciążeniem. Dzięki funkcjonalno-
• http://www.oracle.com/database/index.html – Baza danych Oracle 11g ści Database Replay istnieje możliwość weryfi-
• http://www.oracle.com/technologies/grid/index.html – Oracle Grid computing kacji wprowadzonych zmian oraz szczegółowej
• http://www.oracle.com/technology/deploy/availability/htdocs/maa.htm – Maximum Availabili- analizy wpływu tych zmian na wydajność syste-
ty Architecture mu. Moduł SQL Performance Analyzer umoż-
liwia szczegółową analizę wydajności zapytań

32 09/2008
Oracle 11g

zmienionej bazy danych, wraz ze szczegółową tworzą nasi klienci i nasi partnerzy. Staramy się pieczną i skalowalną podstawę dla wszelkiego ty-
optymalizacją zapewnianą dzięki SQL Tunning dostarczyć technologie najlepiej wspierające na- pu systemów informatycznych. Praktyczne spo-
Advisor (dostępny w Enterprise Manager Tun- szych klientów, antycypując ich potrzeby oraz re- soby implementacji bazy Oracle 11g wraz z po-
ning Pack). agując na zgłaszane zapotrzebowania. zostałymi technologiami (Middleware, Identi-
Opcja Real Application Testing wraz z nową Oracle 11g przynosi znaczące usprawnienia ty Management, zabezpieczenia) oferowanymi
funkcjonalnością w Oracle Data Guard pozwala w obszarach, które nasi Klienci uznali za istot- przez korporację Oracle są opisane w dokumen-
na łatwe i bezpieczne wykorzystanie zapasowe- ne – największy nacisk to efektywne wsparcie tacji Maximum Availability Architecture, do-
go środowiska przetwarzania danych od testów, zarządzania informacją, pozwalające na reduk- stępnej na witrynie Oracle.
przy zachowaniu pełnej funkcjonalności tegoż cję kosztów utrzymania systemów (TCO) oraz
środowiska (nowa możliwość bazy Oracle 11g łatwą i bezpieczną adaptację do zmiennych po- MICHAŁ JERZY KOSTRZEWA
– Snapshot Standby). trzeb organizacji. Kolejne obszary to bezpieczeń- Specjalista IT, 20 lat doświadczeń jako programista
stwo przetwarzania oraz optymalizacja wyko- (xBase, C/C++, języki skryptowe, aplikacje intrane-
Podsumowanie rzystania posiadanej infrastruktury (Grid Com- towe), kierownik działu nowych technologii, specja-
Przez ostatnich trzydzieści lat korporacja Orac- puting), a także sprawny i wygodny mechanizm lista baz danych i systemów wysokiej dostępności a
le jest liderem rynku baz danych, wyznaczając dostępu do wszelkich informacji przechowywa- następnie architekt w polskim oddziale Microsoft.
dalsze kierunki rozwoju dla całego rynku. Na- nych w organizacji. Obecnie zatrudniony w korporacji Oracle jako Dyrek-
sze technologie stanowią efekt lat pracy specjali- Baza danych Oracle 11g stanowi kluczowy tor Regionalny, odpowiada za opcje bazy danych.
stów, tworzących narzędzia dla systemów, jakie element oferty korporacji Oracle, stanowiąc bez- Kontakt z autorem: Michal.Kostrzewa@Oracle.com

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@software.com.pl

Redakcja nie udziela pomocy technicznej w instalo-


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

Była sobie inspekcja


Określenie, przygotowanie i definicja procesu inspekcji

Inspekcja jest jednym z bardziej kontrowersyjnych sposobów podnoszenia


jakości produktu. Wszyscy zgadzają się co do jej pozytywnych skutków,
z drugiej strony jest rozpoznawana jako proces kosztowny (w sensie
czasu i zasobów) oraz trudny do zarządzania. Okazuje się jednak, że
wymienionemu ryzyku można łatwo zapobiec poprzez konstrukcję
elastycznego procesu inspekcji i jego odpowiedzialną aplikację.

kacja do różnych organizacji niezależnie od


Dowiesz się: Powinieneś wiedzieć: ich charakteru i rozmiarów.
• Czym jest inspekcja; • Podstawy zarządzania projektami; Zgodnie z tą ideą poniższe opracowanie
• Jak stworzyć efektywny proces inspekcji; • Podstawy planowania jakości. składa się z części przygotowującej (zawie-
• Jak go przystosować do swoich potrzeb. rającej podstawowe pojęcia i operacje), de-
finicji procesu i przykładowej jego aplikacji.
I tak, w części wstępnej znajdziemy określe-
kiwanie źródła problemu w źle napisanym, nie pojęcia rola, w części procesowej pokaza-
nieprzejrzystym kodzie jest bardzo nieefek- ny zostanie zakres obowiązków przyporząd-
Poziom trudności tywne. Niestabilne zachowanie, przypadko- kowany do poszczególnych ról, a w części
we błędy są często pochodną niechlujnej im- aplikacyjnej – przedstawię zależności mię-
plementacji. dzy rolami w procesie inspekcji a rolami w
Przeciwnicy podobnej pracy u podstaw projekcie.

O
roli zarządzania jakością (ang. Qu- podniosą kwestie praco- i czasochłonności Podobnie, przybliżone we wstępie pojęcie
ality Management) nie muszę ni- procedur inspekcji. Sam widziałem projek- procesu, będzie wykorzystane do zdefinio-
kogo przekonywać. Obecnie więk- ty, w których inspekcja kodu stawała się pod- wania etapów inspekcji, aby w części aplika-
szość firm zajmujących się produkcją oprogra- stawowym zadaniem zespołu projektowe- cyjnej zamieścić uwagi do realizowania tych
mowania legitymuje się zgodnością z wytycz- go. Oczywiście są dziedziny programowania, procesów.
nymi ISO 9001, ewaluacją dojrzałości proce- gdzie podobne podejście jest pożądane. Tak Te trzy części stanowią razem pełny obraz
sów (ang. Capability Maturity Model, CMM) jest w przypadku produktów od których za- (jak ramy, szkic i wypełnienie). Mogą być ska-
lub podobnymi. leży życie i zdrowie człowieka. Pozostawmy lowane, dostosowywane do różnych potrzeb
Jakość stała się ważnym narzędziem walki je jednak wąskiemu gronu specjalistów kon- (adaptowane) oraz kombinowane w zależno-
rynkowej – jej formalne zapewnienie jest co- centrując się na projektach nie związanych z ści od potrzeb.
raz częściej warunkiem zawierania kontrak- leczeniem, lataniem i podatkami. Spróbujmy Skalowalność pokażę na przykładzie kom-
tów (zwłaszcza na wykonanie usług projek- wykonać sztukę będącą esencją umiejętności pletnej i osobistej inspekcji. Mimo że ich za-
towania). menadżera. sięg jest różny (odpowiednio cały produkt i
Jednym z bardziej istotnych procesów za- Mając na uwadze znane osiągnięcia – wy- pojedyncza zmiana) – w obydwóch przypad-
pewniania jakości są mechanizmy inspekcji. bierzmy z nich to, co najlepsze i najbardziej kach wykorzystane mechanizmy (doktryny)
Przesłanie jest tu proste: lepiej zapobiegać pasujące do ograniczającej nas rzeczywisto- są identyczne.
niż leczyć. Zamiast czekać na objawy (pro- ści projektu. Większość podanych uwag będzie się odno-
blemy podczas wykonania), poszukajmy naj- sić do kodu źródłowego, do fazy implementa-
pierw błędów u źródła (np. w kodzie źródło- Proces a jego aplikacja cji oprogramowania. Kod źródłowy jest tu jed-
wym). Poniższy tekst został skonstruowany z myślą nak używany jako pewien przykład – szczegól-
Spróbujmy konstruować rozwiązania zgod- rozdzielenia definicji procesu inspekcji, od je- ny przypadek.
nie ze sztuką (ang. best practices). Spróbujmy go aplikacji. Podobna metodologia zosta- Generalne zasady formułowane będą
zacząć od zapewnienia stabilnej podstawy, ła przyjęta np. w przypadku ISO 9001. Sam względem produktu (jako rezultatu projek-
później zajmijmy się analizą zachowania pro- dokument – norma, jest jedynie zbiorem wy- tu) a nie oprogramowania, przedmiotów in-
duktu. Trudno nie docenić zalet takiego po- tycznych. Od konkretnego klienta zależy, w spekcji a nie kodu źródłowego i wreszcie ele-
dejścia. W projektach, gdzie kompilacja mo- jaki sposób spełni on postawione wymagania. mentów a nie funkcji. Zamierzeniem takie-
że trwać dziesiątki minut każdy podstawowy Dzięki takiemu rozdziałowi proces jest uni- go uogólnienia jest zwrócenie uwagi na uni-
błąd oznacza wymierną stratę czasu. Poszu- wersalny i skalowalny. Możliwa jest jego apli- wersalność przytoczonych reguł. Od same-

34 09/2008
Była sobie inspekcja

go Czytelnika zależy, czy zastosuje je do ko- Osobista inspekcja jest na to zbyt lokal- dokonanych zmian, ich logiki, wymaga od
du źródłowego, dokumentów projektowych, na, odnosi się do niewielkich fragmentów, autora ponownego przejścia ścieżki wnio-
procesów w swojej firmie – do jakiegokol- które do reszty rozwiązania mogą nie paso- skowania.
wiek tworu, którego natura umożliwia pod- wać. Wystarczy, że np. autorowi nieznane by- Prześledzenie napisanego kodu, powtó-
danie inspekcji. ły wszystkie powiązania poprawianego frag- rzenie toku rozumowania, skonfrontowanie
Ostania uwaga dotyczy akcji wprowadzania mentu – jego kontekst. To co prawidłowe w z już istniejącymi rozwiązaniami, sprawdze-
poprawek (ang. maintenance). W niektórych ograniczonym zakresie, może okazać się zu- nie kontekstu pozwoli na odnalezienie wcze-
publikacjach inspekcja i naprawa są rozdzie- pełnie chybione w niektórych aspektach ca- śniej niezauważonych błędów implemen-
lane tak, jakby dokonanie analizy było celem łości – np. ciągu operacji, jednoznaczności tacji. Efekt poprawy jakości będzie tym sil-
samym w sobie. Niestety praktyka pokazuje, przekazu. niejszy.
że w takich wypadkach wysiłek poświęcony Spotykamy tu się również z subiektywno-
na inspekcję jest często marnowany. Produkt ścią analizy osobistej. Jakość dostarczanej pra- Ulepszanie
ewoluuje, dojrzewa, dostosowuje do zmienia- cy jest ograniczona stopniem zaawansowa- Dosłowna aplikacja procesów jest wymienia-
jącego się zapotrzebowania. Inspekcja musi nia jego autora. Kod, z którego student będzie na jako jedna z przyczyn porażek projektów.
za nim nadążać. Właśnie dlatego wprowadza- dumny, profesjonalista uzna zapewne za nie- Brak krytycyzmu, ustawianie projektów pod
nie zmian będących następstwem wniosków dopracowany. obowiązujący proces czy wręcz jawne celo-
z inspekcji rozpatrzę jako integralną część te- Podobne zagrożenie może stwarzać dodanie wanie w zewnętrzny audyt a nie faktyczne
go procesu. kodu autorstwa osoby dopiero wdrażającej się potrzeby podnoszenia jakości są częstymi
w projekcie, która nie zna szczegółowych roz- zjawiskami. A przecież istotą każdego pro-
Kiedy zacząć? wiązań. cesu jest jego stałe dostosowywanie i ulep-
Zwykle pierwsza inspekcja kompletna (IK) po- Określiłbym więc, że inspekcja osobista szanie.
winna mieć miejsce po wykonaniu 10% całej stwarza raczej domniemanie jakości niż jej do- To właśnie tu leży trudność jego prawi-
pracy (Rysunek 1). W większości popularnych wód. Nie może zastąpić inspekcji kompletnej. dłowej aplikacji: w dobraniu elementów nie-
cykli życia produktu oznacza to przeglądanie IO można traktować jak środek konieczny ale zbędnych i dostosowywaniu ich do konkret-
szkieletu rozwiązania. Daje to unikalną moż- nie wystarczający. nych potrzeb.
liwość weryfikacji struktury (np. podziału na Oczywiście rezultatów wprowadzenia IO nie Taki jest też proces inspekcji. Jego formal-
moduły), spójności, konsekwencji w stosowa- można nie doceniać. Posiadanie wstępnej wery- na definicja jest uniwersalna. Szybko widać
niu odpowiednich standardów (np. dla kodu fikacji pozwala na wczesne wykrywanie proble- jednak, że jego aplikacja wymaga znacznie
– nazewnictwa funkcji i zmiennych, komen- mów, ogranicza wysiłek związany z kompletną większego nakładu pracy przy wykonaniu i
towania kodu). inspekcją. jeszcze większego w zakresie monitorowa-
Kolejne powtórzenia inspekcji komplet- O ile inspekcja osobista może przyczy- nia postępów.
nej mogą być ograniczane do nowo doda- nić się do opóźnień poszczególnych zadań To jednak nie wszystko. Proces, aby miał
nych części, nie sprawdzanych wcześniej. Na- w projekcie, wpływ kompletnej inspekcji na sens, musi być stale ulepszany – tak od stro-
leży tu jednak zadbać o ich spójność z resztą harmonogram może być bardziej znaczący ny formalnej definicji, jak i aplikacji. Wnio-
rozwiązania. (choć, jak twierdzi Brooks, najczęściej opóź- ski płynące z każdego etapu muszą być anali-
Bardzo istotne jest przeprowadzenie inspek- nienia powodują termity, nie tornada – [5]). zowane nie tylko pod kątem ulepszania pro-
cji po wykonaniu 90% pracy nad produktem. Sposoby radzenia sobie z jej przeprowadze- duktu (aspekt techniczny), ale i samego pro-
Jest to praktycznie ostatnia szansa doszlifowa- niem podam w dalszej części niniejszego cesu inspekcji (aspekt formalny). Taki pro-
nia produktu przed publikacją. opracowania. ces ewoluuje, żyje, dojrzewa wraz z produk-
W przypadku gdy przedmiotem jest kod tem; jest aktualny i adekwatny. Powoli prze-
Inspekcja osobista źródłowy, inspekcję osobistą można dodat- staje być pojedynczym aktem, zrywem zwią-
Użyty powyżej termin inspekcji kompletnej kowo połączyć z uzupełnianiem dokumen- zanym z nagle poznanym dodatkowym kryte-
(IK) odnosi się do zakresu przedmiotu anali- tacji projektu. Autor kodu ma wtedy obo- rium akceptacji produktu. Staje się ważnym
zy. Inspekcja kompletna obejmuje swoim za- wiązek odzwierciedlić wprowadzone zmia- (owocnym, regularnym) elementem mecha-
sięgiem całość rozwiązania. Dla porównania, ny w odpowiednich dokumentach (ang. de- nizmu zapewniania jakości w projekcie (or-
na Rysunku 1 zaznaczona została inspekcja tailed design). Konieczność wytłumaczenia ganizacji).
osobista (IO).
Polega ona na przeprowadzaniu inspekcji
przez każdego z członków zespołu w czasie
tworzenia nowego fragmentu (lub poprawiania ������������������
����
już istniejącego) przed dodaniem go do główne-
go rozwiązania. Chodzi tutaj o aplikację takie-
��
go samego procesu jak dla inspekcji komplet-
���
��� �

��� �����

nej w skali ograniczonej do pojedynczej zmia- ������������� ����������


ny. Każdy z deweloperów jest zobowiązany do
����

��������
��

�������
rozpatrzenia stworzonego przez siebie frag- ������� ����
��� �� �� ��
mentu (nowej funkcji, rozdziału w dokumen- ������������� ���
cie) z punktu widzenia nie tylko wartości doda- ������
nej (nowej funkcjonalności, nowych informa-
������������� �������������
cji, nowego formatowania), ale i rzemiosła, ja- ��������� ���������
kości wykonania.
Weryfikacja poszczególnych fragmentów nie
pozwala oczywiście na jednoznaczne orzekanie
o poprawności całości rozwiązania. Rysunek 1. Powtarzanie inspekcji kompletnej (IK) w czasie trwania projektu oraz inspekcja osobista (IO)

www.sdjournal.org 35
Testowanie oprogramowania

Nie dzieje się to jednak samoistnie. Wy- W przypadku kodowania – jeżeli właśnie cie (w PMBok [7] – ang. inputs, tools and
maga całkiem sporego nakładu pracy – ob- poprawiliśmy zarządzanie pamięcią, zamiast techniques, outputs,ITTO);
serwacji rezultatów inspekcji, wyciągania wycieków pamięci raczej będzie nas intereso- • D (ang. Do) – wykonaj to co zaplanowałeś;
wniosków z uzyskanych wyników i dokony- wać jej fragmentacja. Likwidacja strat pamięci • C (ang. Check) – kontroluj, monitoruj wy-
wania na ich podstawie odpowiednich akcji była celem pierwszej fazy inspekcji kodu; dru- konanie, sprawdzaj rezultaty i porównuj je
naprawczych. ga faza ma się koncentrować się na optymali- z założonymi celami;
Trzeba zwrócić uwagę, które elemen- zacji rozwiązania. W przypadku dokumenta- • A (ang. Act) – znając rozbieżności między
ty (aspekty funkcjonowania, dziedziny rze- cji – rozpoznanie rozbieżności w wyglądzie założeniami i rzeczywistymi efektami po-
miosła) wymagają większej uwagi (duża ilość różnych dokumentów może być impulsem do dejmuj akcje w celu ulepszania.
uwag w czasie inspekcji) a które wydają się do- stworzenia wspólnego wzorca (ang. template) i
brze opanowane. wprowadzenia go do systemu jakości. Uzyska- Kontynuując przykład dokumentacji – uży-
Trzeba zdać sobie sprawę z ważności zaob- my wtedy referencję, punkt odniesienia, pod wając wzorca stworzonego w wyniku po-
serwowanych braków oraz ich wpływu na pro- kątem którego będziemy wykonywać kolejne przedniej inspekcji oraz listy dokumentów
dukt (obecny lub przyszłe wersje). Na tej pod- iteracje inspekcji. z nim niezgodnych (P) poprawiamy je (D)
stawie można decydować o zasięgu akcji na- Produkt dojrzewa – wymagania stawiane sprawdzając czy zbieżność ze wzorcem zosta-
prawczych – krótkoterminowych (usunięcie przed nim będą coraz ostrzejsze. Inspekcja mu- ła osiągnięta (C).
zaobserwowanego problemu) lub długoter- si je wspierać. Jeżeli zauważymy, że wzorzec jest nie do
minowych (odpowiednie przeprojektowanie Powyższe stwierdzenia odzwierciedla szero- końca adekwatny dla wszystkich posiadanych
eliminujące możliwość ponownego wystąpie- ko stosowana metodologia cyklu PDCA, gdzie: typów dokumentów, poprawiamy go z zamia-
nia). Proces musi za takimi zmianami podą- rem użycia jako odnośnika w następnej inspek-
żać – np. poprzez dostosowane priorytetów • P (ang. Plan) – zaplanuj, ustal przedmioty, cji (A).
inspekcji. cele i metody pozwalające na ich osiągnię-
Przygotowanie do inspekcji
W poniższym tekście przywołam niejedno-
krotnie pojęcie procesu, należy się więc jego
przybliżenie. Proces odwołuje się do zarzą-
dzanej aktywności angażującej zasoby w ce-
������� �������
lu przekształcania wartości wejściowych w
wartości wyjściowe. Grupa procesów powią-
��������� ��������� zana jest przyczynowo – skutkowo, tzn. wyj-
������������ ������������ ścia jednego procesu stanowią wejścia dla dru-
giego procesu.
Takie podejście pozwala na traktowanie
przedmiotu procesów w sposób nie struktu-
��������� ���������
ralny (komu podlega, jak jest zorganizowa-
����������� ����������� ny), ale funkcjonalny (jak działa, jak się zacho-
�������� �������� wuje). Różnica polega na przejściu z modelu
wertykalnego (granice wyznaczone strukturą)
������������������� na model horyzontalny (granice wyznaczone
funkcjonowaniem).
Można to zobrazować na przykładzie za-
rządzania pamięcią. Jak pokazano na Ry-
������� �������
������������������ sunku 2, przyjęcie podejścia procesowego
��������
(horyzontalnego) może znacząco wpłynąć

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

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

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

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

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

Rysunek 2. Podejście strukturalne i procesowe Rysunek 3. Definiowanie perspektyw

36 09/2008
Była sobie inspekcja

na architekturę rozwiązania. Zamiast pa- Doświadczenia dowodzą, że średnia wy- Inspektor może stwierdzić:
trzyć na operacje wykonywane w poszcze- dajność będzie się wahać około 200 linii w
gólnych modułach (punktowe, lokalne), po- ciągu 9 godzin ([8])! Konieczne jest rów- • naruszenie standardów kodowania –
dejście procesowe pozwala śledzić zachowa- nież odpowiednie przygotowanie i przeszko- brak komentarzy nad funkcją, bloki ko-
nie całego produktu, efektywność w wybra- lenie zespołu. du niepoprawnie sformatowane lub nie
nym horyzoncie (tu: zarządzania pamięcią). Kolejna grupa inspekcji odznacza się ogra- zaznaczone, nic nie mówiąca nazwa
Kryterium sukcesu staje się automatycznie niczeniem ilości wykorzystywanych ról do funkcji;
poprawność funkcjonowania całego rozwią- inspektora i autora (faktyczna liczebność in- • przenośność – natywny dla C typ int mo-
zania, a nie jego poszczególnych części. Od- spektorów i autorów jest tu kwestią obojęt- że być interpretowany zależnie od rodzaju
zwierciedla to cel projektu, którym jest sa- ną). Komunikacja na danym etapie jest zre- platformy, na której kod zostanie wykona-
tysfakcja klienta. dukowana do osób bezpośrednio zaintereso- ny (8, 16, 32, 64 bity);
wanych. Preferowane są mało formalne spo- • operacje wejścia/wyjścia – zmienna wyj-
Role tkania. ściowa nie zainicjowana dla y<=0.
Proces inspekcji wymaga zdefiniowania no- Rozszerzenie tej metody jest szczególnie
wych ról, do których będą przyporządkowa- często wykorzystywane przy implementacji Oczywiście powyższa lista jest całkowicie
ni jego uczestnicy. Kwestią odpowiedniej apli- z użyciem doktryn agile (np. programowa- prawdziwa.
kacji procesu będzie ich skojarzenie z rolami nie w parach). W przypadku większego roz- Czy jednak obejmuje wszystkie możliwe
projektowymi (np. architekt, deweloper, te- proszenia zespołu, komunikacja może odby- przypadki? Problem polega na tym, że in-
ster). Podstawowymi rolami w zespole inspek- wać się za pomocą poczty elektronicznej czy spektor sprawdza wiele różnych czynników
cyjnym są: list dyskusyjnych (stanowiących dodatkowo na raz. Jego uwaga jest rozproszona. Jest więc
medium dokumentacji). Taką technikę czę- wielce prawdopodobne, że przy dziesiątej
• kierownik inspekcji (ang. review chair- sto stosuje się w przypadku projektów typu funkcji z kolei zapomni zanotować brak ko-
man); OpenSource [2], tworzonych przez luźną spo- mentarzy, przy dwudziestej nie wykaże bra-
• inspektor (ang. reviewer); łeczność. ku sprawdzania parametrów wejściowych
• autor (ang. author). Rolę inspektora mogą z powodzeniem peł- (tu – groźba dzielenia przez zero). A może
nić narzędzia dokonujące statycznej analizy ko- w ogóle nie pomyślał, ile podobnych funk-
Potrzebujemy kogoś, kto będzie kierował du (skrypty czy specjalistyczne oprogramowa- cji znajduje się w całym rozwiązaniu (redun-
całym procesem, nadzorował i kontrolo- nie jak PCLint). dantny kod)?
wał jego wykonanie, zbierał i rozpowszech- Rola człowieka – inspektora ogranicza się Analiza przedstawionej funkcji pod jednym,
niał wyniki, przedstawiał ich interpretacje wtedy do odpowiedniego przygotowania (skon- wybranym kątem byłaby o wiele szybsza. Co
i płynące z nich wnioski. Konieczni są in- figurowania, zainstalowania) narzędzia, wyko- więcej, inspektor na pewno zauważyłby moż-
spektorzy, którzy przeprowadzą właściwą nania go i przetworzenia wygenerowanych wy- liwości zautomatyzowania swojego zadania.
analizę. ników. I po godzinie pracy nie zapomniałby, co miał
Aby analiza była efektywna, potrzebny bę- W końcu mamy techniki tzw. inspekcji oso- sprawdzić.
dzie rodzaj konsultanta technicznego, ktoś bistej (IO). Polegają one na tym, że każdy au- Oczywiście zanalizowanie wszystkich aspek-
odpowiedzialny za dany fragment kodu, mo- tor jest zobowiązany do zweryfikowania wyni- tów przedmiotu inspekcji będzie wymagało za-
duł. Niekoniecznie to musi być fizyczny au- ków swojej pracy zanim ją doda do całego roz- deklarowania wielu perspektyw.
tor kodu, chociaż tak tą rolę zwykło się na- wiązania. Pokrycie przedmiotu inspekcji jest zależne
zywać. Oczywiście wymaga to odpowiedniego po- od ilości i rodzaju zdefiniowanych perspek-
W zależności od wybranej techniki inspek- ziomu samodyscypliny i jest skażone subiek- tyw. Na przykładzie kodu źródłowego (Ry-
cji, zestaw można modyfikować. Należy za- tywnością oceny własnej pracy, może rów- sunek 3) – niektóre linie kodu (ang. lines of
chować jednak ostrożność przy łączeniu tych nież ograniczać propagację doświadczeń w code, LOC) sprawdzi się tylko raz (przypa-
ról ze sobą. Autor nie będzie przecież obiek- zespole. dek A), niektóre wielokrotnie (przypadek
tywnie patrzył na własne dzieło. Kierownik B) a niektóre w ogóle (przypadek C). Jedno-
pełniący rolę inspektora musi wybierać po- Strategie inspekcji krotne sprawdzenie każdej linii kodu (czy-
między zadaniami analizy i kierowania pro- Podane wyżej techniki inspekcji będziemy uży- li określenie perspektyw rozłącznych i jed-
cesem. wać z dwoma podstawowymi strategiami in- nocześnie dopełniających się) jest sytuacją
spekcji – perspektywami i listami sprawdzają- idealną i trudną do osiągnięcia. Wielokrot-
Techniki inspekcji cymi (ang. checklist). ne sprawdzanie tych samych LOC jest ma-
Na potrzeby tego opracowania podzieliłem Perspektywy pozwalają skoncentrować uwa- ło efektywne.
techniki inspekcji na trzy grupy klasyfikowane gę inspektora na pojedynczym aspekcie. Za- Oczywiście w praktyce najczęściej będzie-
według wymaganego stopnia wykorzystania ze- miast patrzeć na przedmiot inspekcji szuka- my mieli do czynienia z sytuacją, gdy zdefi-
społu projektowego. jąc w nim wszelkich możliwych niedoskonało- niowane perspektywy nie obejmą dokładnie
Pierwsza grupa wymaga zaangażowania ści, inspektor koncentruje swoją uwagę na jed- całego kodu. Czy jest to sytuacją akceptowal-
całego zespołu. Przykładem takiej techni- nej, wybranej kategorii problemów, na aspek- na? Z punktu widzenia kompletności inspek-
ki jest inspekcja formalna (Fagana). Jest to cie (funkcjonalnym, organizacyjnym, estetycz- cji (odsetku dotkniętego kodu – ang. code co-
proces opierający się na serii spotkań. W ich nym) produktu. verage) – nie.
trakcie przedstawia się analizowany element Weźmy dla przykładu następujący fragment Z punktu widzenia ograniczeń projekto-
(np. fragment kodu) wszystkim zgromadzo- kodu: wych odpowiedź ta musi być ważona wzglę-
nym, odbywa się dyskusja nad nim i w obec- dem konkretnych potrzeb. Ale przecież
ności wszystkich rozważane są możliwe po- int FOO(int x, int y){ klientowi nie chodzi o ładne słupki w specy-
prawki. Metoda ta pozwala na bardzo szcze- int a; fikacji produktu!
gółową inspekcję ale wiąże się z dużymi na- if( y > 0 )a = x / y; Dla klienta ważne jest, żeby produkt realizo-
kładami. return a;} wał jego wymagania. Jeżeli produktem jest pro-

www.sdjournal.org 37
Testowanie oprogramowania

gram – ważne będzie żeby np. zadowalał się Inną funkcję pełnią listy sprawdzające. Są zy przedmiotu inspekcji, będą ograniczać się
niewielką ilością pamięci. Zwiększenie zapo- one zbiorem cech, które zawsze należy spraw- jedynie do ich sprawdzenia.
trzebowania na pamięć oznacza bowiem wyż- dzać. Wybór odbywa się na zasadzie kwalifi-
sze wymagania w stosunku do sprzętu a więc kacji znalezionych błędów według częstotli- Proces inspekcji
ograniczenie zysku (zamiast o pececie pomyślcie wości występowania oraz zagrożenia jakie mo- W tym rozdziale zdefiniujemy inspekcję jako
o telefonie komórkowym). Jeżeli stwierdzamy gą stwarzać. Interpretacja wyników każdej in- proces wykonywany w ramach procedur za-
problemy z konsumpcją pamięci – konstruuje- spekcji sprawi, że niektóre zagadnienia z listy pewniania jakości produktu. Inspekcja będzie
my perspektywę koncentrującą się jedynie na sprawdzającej będą usuwane (jako wcale lub podzielona na kilka faz. Każda faza będzie mia-
kwestiach związanych z alokacja, zwalnianiem, stosunkowo rzadko występujące) a inne będą ła zdefiniowane wejścia przekształcane z uży-
fragmentacją pamięci i możliwymi wyciekami. się pojawiać. ciem zasobów w określone wyjścia. Te fazy to
Niepełne pokrycie kodu przez inspekcję opartą W ten sposób buduje się bazę podstawo- (Rysunek 4):
na takiej perspektywie nie stanowi problemu. wych mankamentów produktu. Śledzenie
Skuteczność takiego horyzontalnego (przekro- zmian w takich listach może dostarczyć do- • analiza;
jowego, funkcjonalnego) podejścia do tematu datkowych wiadomości o silnych i słabych • naprawa;
może okazać się kluczem do rynku. stronach rzemiosła autorów oraz ich zmia- • weryfikacja;
Każdą perspektywę należy określić przez: nach w czasie. Jeżeli np. mimo przeprowa- • ulepszanie.
dzonego szkolenia w listach nadal dominu-
• aspekt – czego szukać; ją kwestie związane z zarządzaniem pamię- W następnych rozdziałach scharakteryzuję
cią – jest to jasny sygnał, że szkolenie było nie- każdą z faz.
Jakie cechy należy rozważyć? Pod jakim ką- skuteczne. Podobieństwo modelu przedstawionego
tem powinniśmy patrzeć na przedmiot in- Największymi zaletami list sprawdzających na Rysunku 4 do znanej z ISO 9001 PDAC
spekcji? jest to, że potrafią one zwrócić uwagę inspekto- ([3]) jest nieprzypadkowe. Zdefiniowanie
ra na konkretne, często powtarzające się proble- procesu inspekcji w ten sposób umożliwia
• zakres – gdzie szukać; my. Dobrze spisują się również w przypadku in- łatwe włączenie inspekcji do obowiązujące-
spekcji osobistych. Mogą stanowić materiał do go systemu jakości w organizacji. Analogie
Które części przedmiotu zostaną poddane in- automatyzacji. można również odnaleźć w PMBok. Analiza
spekcji? Z drugiej jednak strony listy sprawdza- w inspekcji odniesie się do grupy procesów
jące, koncentrując się na pewnych szczegó- związanych z planowaniem (ang. planning);
• cel – co chcemy osiągnąć; łach, tracą z widoku szerszy obraz, funkcjo- naprawa i weryfikacja do realizacji (ang. exe-
nalność. Nie można w nich zawrzeć wiedzy cuting) i kontroli (ang. controlling); ulepsza-
Jakie efekty ma przynieść inspekcja? Czego eksperckiej, intuicji inspektora. Co więcej nie ujęte jest w ramach zamykania procesów
powinniśmy się nauczyć? Jakich rezultatów – zbyt duże ich uszczegółowienie może spra- (ang. closing).
poszukujemy? wić, że inspektorzy, zamiast dokładnej anali-
Analiza
Pierwszą fazą inspekcji jest analiza. To etap,
podczas którego inspektorzy przegląda-
ją przedmiot inspekcji. Zadaniem inspekto-
������������
ra jest skoncentrowanie się na wyszczegól-
��������
��������� ��������� nionym zakresem (pliki, katalogi lub modu-
������������������� ły) pod kątem pojedynczego aspektu w wy-
znaczonym celu – zgodnie z definicję zada-
nej perspektywy.
Przeprowadzenie takiej analizy wymaga do-
starczenia:

• odpowiedniej dokumentacji;
���������� �������
• odpowiednich narzędzi;
���������� • przedmiotu analizy (np. kodu źródłowego).

����� Wymaganą dokumentację możemy podzielić


na dwie kategorie – procesową i projektową.
Dokumentacja procesowa powinna pomóc in-
����������� ������� spektorowi zrozumieć jak ma wypełnić swo-
je zadanie.
Stanowi rodzaj kodeksu postępowania, zbio-
ru zasad wobec których należy postępować.
� �
Częścią dokumentacji procesowej jest np. de-
� � finicja perspektyw.
���� W przypadku inspekcji kodu ważnym ele-
mentem dokumentacji procesowej są stan-
dardy kodowania. Stanowią zbiór reguł, któ-
rych należy przestrzegać podczas pisania ko-
du źródłowego. Odnoszą się do konwencji
Rysunek 4. Etapy procesu inspekcji nazewnictwa, komentarzy ale i samej sztu-

38 09/2008
Była sobie inspekcja

ki kodowania. Przykładowo dla C# najczę- Przedmiot analizy ma odpowiadać mini- stosunkowo długa lista, musi być więc od-
ściej wykorzystuje się standardy sformułowa- malnym wymaganiom jakości, np kod źró- powiednio precyzyjna pod względem okre-
ne dla Philips Medical Systems [4]. Z reguły dłowy musi się kompilować. Jeżeli podczas ślenia problemu i sposobów jego reproduk-
standardy kodowania określa się na poziomie kompilacji zgłaszane są ostrzeżenia, dobrym cji. Komentarze mogą zawierać sugestie co
organizacji, jako część obowiązującego syste- pomysłem jest rozpoczęcie inspekcji od per- do sposobów rozwiązania problemu. Trze-
mu jakości. spektywy, której celem jest ich usunięcie. ba jednak podchodzić do nich z pewną re-
Dokumentacja projektowa powinna z kolei Przedmiot poddawany inspekcji powinien zerwą – mogą bowiem sugerować rozwiąza-
pomóc inspektorowi w zrozumieniu przed- być również stabilny w sensie jego rozwoju nia lokalne podczas gdy szersza analiza wy-
miotu analizy. Wymagane są wszelkie źródła – nie ma większego sensu inspekcja kodu, każe konieczność podjęcia bardziej general-
pozwalające na ogarnięcie natury przedmio- który w ciągu najbliższego czasu ma czeka nych akcji.
tu, sposobu jego działania i przeznaczenia. przeprojektowanie (potrzeba taka może być Z podobną ostrożnością należy traktować
Mogą to być materiały źródłowe, dokumen- jednak wnioskiem z inspekcji). uwagi o charakterze ogólnym (np. moduł XX
ty zawierające specyfikacje wymagań użyt- W przypadku kodu, wiele źródeł proponu- powinien zostać przepisany). Mogą one wyni-
kownika, architektury, ogólnych i szczegóło- je dokonywanie inspekcji na wydruku zamiast kać z przesłanek nie mających swojego uspra-
wych rozwiązań projektowych, interfejsów, na ekranie. Nakłada to dodatkowe wymaganie wiedliwienia w szerszym kontekście.
konfiguracja projektu (np. reguły używania odpowiedniego sformatowania poprzez np. Dobrą praktyką jest określanie wpływu opi-
systemów kontroli wersji) oraz dotyczące te- dostosowanie maksymalnej długości linii do sanego problemu na całe rozwiązanie (ang. se-
stowania. możliwości drukarki. verity). Pozwala to później odpowiednio szere-
Zakłada się, że inspektor będzie miał rów- Dbając o efektywność, pozostawiłbym jed- gować zadania.
nież dostęp do odpowiedniego zestawu na- nak wybór osobistym preferencjom inspek- Komentarz może zawierać również pytanie
rzędzi, który umożliwi mu przeprowadze- torów. lub uwagę do zastosowanego rozwiązania.
nie analizy oraz udokumentowanie wnio- Sam proces analizy wykonuje inspektor. Jednoznaczne określenie sposobu repro-
sków (komentarzy). Zazwyczaj jest to ze- Przegląda on przedmiot analizy w poszuki- dukcji problemu opisywanego przez ko-
staw narzędzi używany na co dzień przez waniu wszelkich naruszeń rzemiosła. Takie mentarz warunkuje efektywność naprawy.
autorów do pracy (edytory, systemy kontro- naruszenia odnoszą się do typowych błędów Identyfikacja miejsca, które sprowokowało
li wersji, systemy raportowania błędów, pa- w sztuce oraz naruszania przyjętych w pro- komentarz, musi być niezależna od poten-
kiety biurowe, kompilatory, środowisko te- jekcie (organizacji) standardów, jak np. ko- cjalnych zmian (wprowadzanych np. w wy-
stowe). dowania, formatowania dokumentów zgod- niku innych komentarzy). Podanie np. sa-
Proszę zwrócić uwagę, że w czasie analizy nie ze wzorcem, gramatyki języka. Wnioski mego numeru linii w pliku nie zawsze wy-
mogą powstać nowe narzędzia (np. skrypty) z analizy zapisywane są w postaci komenta- starczy.
automatyzujące pracę inspektora. Należy je rzy (Tabela 2). Wszystkie komentarze z inspekcji nale-
potem odpowiednio włączyć do konfigura- Należy tu zwrócić szczególną uwagę na ży gromadzić. Umożliwia to późniejszą ich
cji projektu. format ich raportowania. Zazwyczaj jest to analizę pod kątem np. dojrzałości produk-

Tabela 1. Wybrane techniki inspekcji


Technika Opis Zalety Wady
Cały zespół
Formalna Uczestniczy cały zespół • Bardzo szczegółowa • Wymagająca pod względem zasobów i czasu
(Fagana) Definiowane są role • Bardzo dobra dystrybucja wiedzy • Wymaga szkolenia
• Moderator (prowadzi spotkania)
• Inspektor (przeprowadza analizę)
• Obserwator (dostarcza wiedzy do-
menowej)
• Prezenter (pokazuje analizowany
fragment)
• Autor (fizyczny autor dyskutowane-
go fragmentu)
Inspektor + Autor
Jeden na jeden Uczestniczy jedynie autor i inspektor. • Prosta, nie wymaga szkolenia • Ograniczony zasięg inspekcji
Spotkania osobiste, w małym zespo- • Elastyczna w zasobach wykorzy- • Autor i inspektor mogą zanalizować jedynie
le lub poprzez wymianę poczty elek- stania czasu wybrane aspekty, omijają bardziej skomplikowa-
tronicznej ne kwestie
• Trudności w śledzeniu postępów
• Trudności w dokumentowaniu
Wspomagana narzę- Rolę inspektora odgrywają narzędzia • Szybkość analizy • Narzędzia wymagają szkolenia
dziami do statycznej analizy kodu • Obiektywność • Zapewnienie wsparcia dla nich
• Możliwość śledzenia trendów w • Koszty zakupu zaawansowanych narzędzi mo-
analizie gą być wysokie
• Narzędzia są jedynie tak dobre, jak ich autorzy
Autor
Osobista Analiza tworzonego przez siebie ko- • Duża oszczędność czasu • Ograniczony zasięg inspekcji
du zanim udostępniony zostanie in- • Kod oddawany do rozwiązania • Subiektywna (autor nie może w pełni zastąpić
nym jest już wstępnie zweryfikowany inspektora)
• Trudności w propagacji doswiadczeń autora na
resztę zespołu

www.sdjournal.org 39
Testowanie oprogramowania

tu. Na podstawie takiej dokumentacji moż- zmian (ang. change request, CR) lub nowych cy ich zmierzenie. Jedynie wtedy można bę-
na wysnuć wnioski co do generalnych środ- wymagań (ang. requirement, REQ). Takie CR dzie zweryfikować czy naprawa osiągnęła za-
ków zapewniających podniesienie jakości i REQ trzeba uwzględnić w przyszłych wer- mierzony efekt.
produktu. Dla przykładu, może to być ko- sjach produktów (np. iteracjach implemen-
nieczność przeszkolenia zespołu w zakresie tacji – w zależności od przyjętego cyklu ży- Weryfikacja
standardów kodowania, specyfikacji platfor- cia produktu). Etap weryfikacji polega na sprawdzeniu, czy
my docelowej. Proszę zwrócić uwagę, że komentarze nale- komentarze zgłoszone przez inspektorów
W ten sposób komentarze stają się ważną ży zawsze uzupełniać o odpowiednie notatki podczas analizy przedmiotu inspekcji zosta-
częścią dokumentacji projektowej. dotyczące zmiany ich stanu oraz podjętych ak- ły odpowiednio rozwiązane (przez autorów
cji. Jest to konieczne, aby nie zgubić się w ich w fazie naprawy). Odpowiednie rozwiązanie
Naprawa mnogości. oznacza że:
Na podstawie komentarzy zgłoszonych przez Efektywność procesu inspekcji wyma-
inspektorów na etapie analizy, można przy- ga, żeby etap analizy i naprawy operowały • problem zasygnalizowany przez inspekto-
stąpić do poprawiania produktu. Na wstę- na tym samym przedmiocie. Jedynie wte- ra nie jest już obserwowany;
pie wszystkie komentarze powinny być ze- dy wszystkie komentarze będą adekwat- • modyfikacja została dokonana zgodnie z
brane przez kierownika inspekcji. W konsul- ne i elementy przedmiotu (funkcje w ko- kontekstem i przyjętymi standardami dla
tacji z autorem, każdy z komentarzy klasyfi- dzie, rozdziały w dokumencie), do które- produktu;
kuje się jako: go się odnoszą, były łatwe do identyfikacji. • modyfikacja nie stwarza nowych proble-
Im dłużej zwleka się z rozpoczęciem wpro- mów i nie ma negatywnego wpływu na
• zaakceptowany, tzn. uznany za zasadny; wadzania zasugerowanych zmian, tym wię- resztę rozwiązania.
• odrzucony, gdy uwaga jest bezpodstawna; cej komentarzy będzie się odnosić do nie-
• odroczony, w przypadku gdy komentarz istniejącego elementów lub zlokalizowanie Powyższe stwierdzenia, na pierwszy rzut oka
nie ma szans na realizację w najbliższej odpowiedniego fragmentu może być bar- trywialne, odnoszą się do realnych, codzien-
przyszłości; dziej pracochłonne (np. zmieni się numera- nych problemów jakości. Pierwsze z nich od-
• do dyskusji, gdy komentarz wymaga kon- cja rozdziałów). nosi się do konieczność określenia sposobów
sultacji. Łatwo w ten sposób zniweczyć cały nakład reprodukcji problemu. W przypadku kodu
pracy, który został włożony w fazie analizy. Jest źródłowego będzie to najczęściej wskazanie
Zaakceptowane komentarze, o ile dotyczą to oczywiście krytyczne jedynie dla PR'ów. pliku, funkcji, linii kodu, charakterystycz-
konkretnej zmiany (np. pomyłki w kodzie, W przypadku CR lub REQ ma mniejsze nej sekwencji. Weryfikacja będzie polegać na
błędu merytorycznego w artykule) należy znaczenie, gdyż odnoszą się one do przyszłych sprawdzeniu czy odpowiedni fragment został
zamieniać na raporty o błędach (ang. pro- rozwiązań. zmieniony. Podobnie łatwo zweryfikować ko-
blem reports, PR) i zgłosić do systemu kon- Patrząc na model przedstawiony na Ry- mentarze dotyczące np. błędów gramatycz-
troli błędów (np. Bugzilla). Komentarze o sunku 4 widzimy, że etap naprawy powi- nych w dokumencie. Mówimy wtedy, że ko-
charakterze ogólnym (lub wnioski płyną- nien zakończyć się osiągnięciem wyznaczo- mentarz był testowalny.
ce z zebrania komentarzy szczegółowych) nych przez perspektywę celów. Cele te po- Załóżmy jednak, że inspektor zalecił uszcze-
powinny zostać ujęte w formie propozycji winny być określone w sposób umożliwiają- gółowienie opisu. Jeżeli to zrobimy – skąd pew-
Tabela 2. Przykładowe komentarze z inspekcji kodu
Inspektor Typ Wpływ Plik/ Funkcja Opis Status Akcje
Rozdział
arekm Błąd Krytyczny foo.c FOO Zmienna wyjściowa nie zainicjowana dla Nowy
y<=0
arekm Uwaga Ważny foo.c FOO Nazwa funkcji nic nie mówi o jej przeznacze- Nowy
niu – zob. standardy kodowania rozdz. 3.1.5
arekm Uwaga Normalny foo.c FOO Brak komentarzy Nowy

PMBok
Project Management Body of Knowledge (PMBok) jest publikacją Project Management Institute (PMI) zawierającą zbiór najlepszych praktyk stosowanych
w zarządzaniu projektami. PMBok definiuje etapy projektu (grupy procesów) i określa jakie (w jakiej kolejności) powinny zajść w nich procesy. Każdy z
procesów (razem 44) jest określony przez wejścia, narzędzia i techniki oraz wyjścia (ITTO). Procesy są przyporządkowane do obszarów wiedzy aktyw-
nych w zależności od etapu projektu [1].

Bibliografia
• Project Management Institute, www.pmi.org;[1]
• The Cathedral and the Bazaar, Eric Raymond, 1997;[2]
• The TickIT Guide, British Standards Institution, 2001;[3]
• Coding Standards: C#, Philips Medical Systems – Software / SPI, 2005;[4]
• The Mythical Man-Month: Essays on Software Engineering, Fred Brooks, 1995;[5]
• The Executive in Action, Peter F. Drucker, 1996; [6]
• A Guide to the Project Management Body of Knowledge (Third Edition), Project Management Institute, 2004;[7]
• Four ways to a Practical Code Review, Jason Cohen, 2007;[8]

40 09/2008
Była sobie inspekcja

ność, że dokonana zmiana jest wystarczająca, ich pracy. Dla przykładu – brakowało odpo- sokiej jakości przedmiotu analizy. Obie te sy-
tzn. sporny opis po naprawie jest wystarczają- wiedniego wzorca dla dokumentów, nie zo- tuacje są negatywne a wynikają ze złej aloka-
co szczegółowy? stało określone czy dokument ma być napi- cji zasobów.
Stąd wniosek, że weryfikacja niektórych sany z użyciem brytyjskiej czy amerykań- Pozostaje kwestia motywacji: nie łudźmy
komentarzy (np. ogólnych) będzie wyma- skiej wersji angielskiego. Inspektorzy oparli się, inspekcja nie jest najbardziej efektow-
gała współpracy z inspektorem. Musi to zo- więc swoją analizę na niepełnych przesłan- nym z zadań projektowych. To żmudna praca
stać ujęte przy tworzeniu harmonogramu in- kach. Jakość ich pracy (nie z ich winy) mo- wymagająca wiele samodyscypliny. Jej efekty
spekcji. że być niższa niż się tego po nich spodzie- nie zawsze są od razu widoczne. Brak prze-
Druga uwaga dotyczy integralności produk- wano. konania o jej potencjalnych korzyściach mo-
tu. Każdy produkt wykonywany jest z pomo- Źródłem problemów może być także spo- że sprawić, że inspektorzy potraktują swoje
cą zestawu formalnych (standardy) i niefor- sób w jaki porozumiewali się członkowie ze- zadanie bez należytego zaangażowania. Re-
malnych (zwyczaje) metod. Żadna wprowa- społu inspekcyjnego. Zbyt duża nieformalność zultatami takich działań nie trzeba chyba
dzona poprawka nie powinna tego stanu za- doprowadza do chaosu i niemożności śledze- straszyć.
kłócać – wewnętrzna spójność produktu mu- nia postępów inspekcji. Za duża formalność Przyczyną tego problemu mogą być nie-
si być zachowana. (np. skomplikowane formularze zgłaszania ko- jasno określone lub słabo mierzalne cele in-
Trzecia uwaga stanowi odzwierciedlenie mentarzy) spowalnia pracę i czyni ją mało efek- spekcji.
częstego problemu kontrolowania kontrolo- tywną. Oprócz powyższych korekt, powinniśmy
wanych. Trzecia uwaga dotyczy organizacji pracy również zadać sobie następujące pytania:
Polega to na konieczności upewnienia się, podczas inspekcji. Jeżeli odpowiedzialność, ja-
że poprawka nie uczyniła więcej zła niż po- ka łączy się z każdą z ról, nie zostanie dokład- • Czy zastosowane przez nas techniki in-
dejrzewano o to oryginał. Czasami niewiel- nie określona, członkowie zespołu inspekcyj- spekcji sprawdziły się? Czy któreś z nich
ka zmiana, może mieć bardzo poważne kon- nego nie będą świadomi swoich obowiązków. powinniśmy używać częściej (więcej z
sekwencje – np. doprowadzić do znaczącego Nie będą wiedzieli kto np. zleca zadania napra- nich zaczerpnąć)?
spadku wydajności poprzez nieuważne uży- wy (kierownik inspekcji a może menadżer pro- • Czy perspektywy są efektywne? Które z
cie muteksów. jektu), kto powinien odbierać od nich raporty nich, ze względu na stan (dojrzałość) pro-
Problem ten jest szczególnie ważny w itp. Brak znajomości zależności pogorszy efek- duktu, są najważniejsze? Czy mają odpo-
przypadku poprawek przy końcu cyklu pro- tywność. wiedni zasięg (cały produkt/najważniejsze
dukcji (np. przy inspekcji 90%). Im mniej Patrząc od strony aplikacji procesu, wspo- moduły)?
czasu do publikacji, tym poważniejsze kon- mniana niewielka ilość komentarzy, może • Czy można usprawnić analizę poprzez
sekwencje popełnienia błędu (brak czasu oznaczać, że: stosowanie narzędzi? Czy narzędzia uży-
na poprawki i powtórzenia procedury te- te (powstałe) podczas analizy powin-
stowania). • inspektorzy nie mieli wystarczająco czasu; ny być włączone na stałe do konfiguracji
Powyższe uwagi powinny być uwzględnione • inspektorzy otrzymali zadania spoza ich projektu?
przez obowiązujący w projekcie proces kontro- domeny; • Czy komentarze są użyteczne? Czy łatwo
lowania zmian. Inspekcja powinna ten proces • inspektorzy nie zostali dostatecznie zmo- odtworzyć problemy, które sygnalizują?
wykorzystywać. tywowani.
Zestawienie osiągniętych rezultatów z cela- Powyższe rozważania nazywamy walidacją.
mi wyznaczonymi w perspektywach pozwoli Pierwszy przypadek odnosi się do sytuacji, gdy To jest sprawdzenie, czy robimy dobre rze-
na stworzenie miar określających efektywność inspektor nie był w stanie należycie przygo- czy [6].
przeprowadzonego procesu inspekcji. W ten tować się do inspekcji z powodu nadmierne-
sposób będziemy mogli upewnić się, że robimy go obciążenia innymi obowiązkami. Najczę- Podsumowanie części pierwszej
rzeczy dobrze [6]. ściej jest tak, że inspektor musi dzielić swój W pierwszej części opracowania skoncentro-
czas miedzy zadania inspekcji i inne zadania wałem się na wprowadzeniu do zagadnień z
Ulepszanie projektowe. dziedziny inspekcji oraz na skonstruowaniu
Etap ulepszania należy wykorzystać do prze- Nie jest to dziwne i nie będzie zaskocze- odpowiedniego procesu. Proces ten został
analizowania uzyskanych w czasie pozosta- niem, jeżeli codzienne potrzeby projektu bę- oparty na modelu PDAC, który można od-
łych etapów miar. Niezadowalające wyniki bę- dą brały górę nad zadaniami inspekcji (chy- naleźć m.in. w ISO 9001. Podstawowymi je-
dą oznaczać, że albo proces zastosowany przez ba że priorytety zostaną celowo ustawione go wyróżnikami są elastyczność, skalowalność
nas był niewystarczający, albo jego aplikacja by- inaczej). i uniwersalność.
ła niepoprawna. Jeżeli jednak dodatkowo tempo inspekcji Choć większość przykładów odnosiła się do
Przykładowo niewielka ilość komentarzy narzucone przez kierownika będzie zbyt du- implementacji oprogramowania – pokazałem,
zgłoszonych przez inspektorów może ozna- że – materiał zostanie przeanalizowany po- że takie same reguły dotyczą np. inspekcji do-
czać, że: bieżnie. kumentów.
Możliwe jest również, że dziedzina w któ- W drugiej części opracowania zamieszczę
• proces nie zagwarantował wszystkich rej inspektor jest ekspertem, nie pokrywa się z uwagi dotyczące sposobów realizacji opisane-
możliwych referencji; umiejętnościami wymaganymi do wyznaczo- go procesu.
• proces nie zagwarantował odpowiednich nego mu zadania. Dociekliwy inspektor posta-
kanałów komunikacji; nowi zdobyć nową wiedzę (oczywiście jeżeli ARKADIUSZ MERTA
• proces nie zagwarantował odpowiedniego będzie miał na to wystarczającą ilość czasu). Autor od 10 lat zajmuje się zagadnieniami pro-
przepływu informacji. Leniwy – wystawi kilka poślednich ko- jektowania i realizacji oprogramowania. Aktual-
mentarzy dla spokoju sumienia. Dociekli- nie jest pracownikiem Silicon & Software Systems
Uwaga pierwsza odnosi się do sytuacji, wy inspektor, zamiast wykorzystywać swoje Polska zatrudnionym na stanowisku menadżera
gdy inspektorom nie zostały dostarczone zdolności, będzie godzinami douczał się w projektów.
wszystkie źródła, jakie mogły pomóc im w Internecie. Leniwy da fałszywe poczucie wy- Kontakt z autorem: arkadiusz.merta@s3group.com

www.sdjournal.org 41
Testowanie oprogramowania

Rzeczywisty czas czy


rzeczywisty Linux?
Racjonalny wybór

Twórcy systemów wbudowanych coraz bardziej interesują się systemem


operacyjnym Linux, czego głównym powodem jest otwarta struktura jego kodu
źródłowego. Tym niemniej, standardowe jądro Linux nie zapewnia możliwości
systemu czasu rzeczywistego, wymaganych w wielu systemach wbudowanych,
takich jak przewidywalny czas odpowiedzi i mikrosekundowe wstrzymania.

uprawnienia, która daje każdemu z procesów moż-


Dowiesz się: Powinieneś wiedzieć: liwość wykonania. W efekcie, procesy z wysokim
• Jakie są możliwości czasu rzeczywistego Linuxa; • Co to jest czas rzeczywisty; priorytetem, które wymagają szybkiej realizacji,
• Jakie są możliwości czasu rzeczywistego RTOS • Czym są systemy operacyjne czasu rzeczywistego. nie zawsze mają możliwość uzyskania natychmia-
QNX. stowego dostępu do zasobów procesora. W rzeczy-
wistości system operacyjny czasami wstrzymuje
wykonanie procesu z wysokim priorytetem, aby
operacyjnego Linux i jego dodatków, odpowiada- udostępnić część zasobów procesora procesowi o
jących za pracę w trybie czasu rzeczywistego. niskim priorytecie. Co więcej, system operacyjny
gubi informacje dotyczące priorytetów, kiedy ste-
Poziom trudności Możliwości czasu rzeczywistego rownik lub inna usługa systemowa, zwykle reali-
w systemie operacyjnym Linux zowana poprzez jądro systemu, realizowana jest
System operacyjny Linux stawia programistę po stronie wskazanego przez użytkownika wąt-
systemów wbudowanych przez dylematem. Z ku. Takie zachowanie powoduje nieprzewidywal-

W
celu rozszerzenia funkcjonalności jednej strony, Linux pozwala mu na pracę z wie- ne opóźnienia i nie pozwala na realizację krytycz-
czasu rzeczywistego, których bra- loma edytorami, wykorzystanie dużej części ist- nych procesów na czas.
kowało w systemie operacyjnym niejącego kodu źródłowego i interfejsów progra- Należy zaznaczyć, że takiego modelu szerego-
Linux, stworzono kilka produktów, które roz- mowania aplikacji (API) standardu POSIX. Jed- wania nie należy traktować jako wady systemu
wiązywały ten problem z różnym skutkiem. Na nocześnie standardowe jądro systemu Linux operacyjnego Linux. Przykładowo, model ten
przykład, niektórzy z producentów wykorzy- nie daje takich możliwości pracy w trybie cza- zapewnia wysoką wydajność na ogólnym pozio-
stali możliwości struktury dwurdzeniowej, któ- su rzeczywistego, jak gwarantowany czas reakcji mie, która potrzebna jest aplikacjom biurowym
ra daje możliwość korzystania z niechronione- i mikrosekundowe wstrzymania, koniecznych w i serwerowym. Tym niemniej, nie spełnia ocze-
go środowiska wykonawczego dla zadań reali- wielu urządzeniach. kiwań w sytuacji, gdy musi pracować w środowi-
zowanych w czasie rzeczywistym i zmusza pro- Przyczyną jest to, że system operacyjny Linux skach szeregowania deterministycznego takich,
gramistów do pisania nowych sterowników i pro- ma architekturę o ogólnym przeznaczeniu. Sys- jak routery sieciowe, narzędzia medyczne, ro-
jektowania usług nawet w przypadku obecności tem Linux został stworzony w celu zachowania boty przemysłowe i aplikacje wykorzystywane w
ich odpowiedników w systemie Linux. W niniej- funkcjonalności systemu UNIX i w znacznym przemyśle motoryzacyjnym, dla których nie był
szym artykule rozpatrywane jest inne podejście, stopniu udoskonalony na potrzeby technologii sie- zaprojektowany.
u którego podstaw leży wykorzystanie systemu ciowych i informacyjnych. Wymogi tych techno- W celu usunięcia mankamentów, które nie
operacyjnego czasu rzeczywistego (RTOS), opra- logii w znacznym stopniu różnią się od wymogów pozwalają systemowi operacyjnemu Linux na
cowanego zgodnie ze standardem POSIX specjal- stawianych przez systemy wbudowane, � tym sa- pracę w czasie rzeczywistym, stworzono kilka
nie dla aplikacji wbudowanych. Podejście takie mym rozwiązania kompromisowe, których reali- produktów. Niektóre z nich opracowane zo-
pozwala programistom systemu Linux nie tylko zacja ma miejsce w systemie Linux, często nie mo- stały przez producentów komercyjnych, in-
korzystać ze znanych sposobów programowania, gły być zastosowane w aplikacjach wbudowanych. ne są efektem prac projektowych na otwar-
ale także na wykorzystanie kluczowych zalet mo- Zapoznajmy się dla przykładu z mechanizmem tym kodzie źródłowym. Istnieją także rozwią-
delu otwartego kodu źródłowego systemu opera- szeregowania procesów. Zamiast korzystać z szere- zania, w którym połączono te dwa podejścia.
cyjnego Linux. Oprócz tego takie podejście daje gowania z wywłaszczaniem opartego na prioryte- Tym niemniej żadna z zastosowanych filozofii
możliwość pracy z wieloma usługami systemo- tach tak, jak miałoby to miejsce w RTOS, system nie stała się standardem. Co więcej, niektóre z
wymi, których nie ma w standardzie systemu operacyjny Linux wykorzystuje strategię równo- tych rozwiązań odchodzą od standardowych

42 09/2008
Rzeczywisty czas czy rzeczywisty Linux?

zasad programowania dla systemu operacyjne- systemu operacyjnego Linux zazwyczaj muszą Niedeterministyczne zachowanie istnie-
go Linux i standardu POSIX. tworzyć potrzebne sterowniki na nowo, często jących aplikacji i sterowników Linux
korzystając z nieznanego sobie interfejsu pro- Ponieważ procesy w systemie operacyjnym Li-
Możliwości czasu rzeczywistego gramowania. nux działają poza jądrem czasu rzeczywistego,
poza systemem Linux ich zachowanie nie jest deterministyczne. Sze-
Niektórzy z producentów starają się zapewnić Niezawodne środowisko wykonawcze regowanie tych procesów nadal realizowane jest
działanie systemu operacyjnego Linux w cza- System operacyjny Linux oparty jest o architek- przy pomocy algorytmu ze sprawiedliwym po-
sie rzeczywistym kosztem jego realizacji w try- turę z jednolitym jądrem. Oznacza to, że aplika- działem, który stosowany jest w systemie opera-
bie zadania w jądrze czasu rzeczywistego (Rysu- cje działają w przestrzeni użytkownika z pamię- cyjnym Linux.
nek 1). Wszystkie pozostałe zadania, wymagają- cią chronioną. Tym niemniej, zadania realizowa-
ce szeregowania deterministycznego, także reali- ne w jądrze czasu rzeczywistego nie korzystają Ograniczone możliwości projektowania
zowane są w jądrze pod kontrolą mechanizmu z zalet środowiska wykonawczego chronionego Jak już wspomniano, API wspierane przez jądro
wywłaszczania, jednak posiadają wyższy priory- przez solidny układ zarządzania pamięcią, które czasu rzeczywistego oferują tylko część usług
tet niż sam system operacyjny Linux. W ten spo- system operacyjny Linux oferuje zwykłym pro- API w standardzie POSIX i systemu operacyj-
sób zadania te wywłaszczają system operacyjny cesom, nie działającym w trybie czasu rzeczywi- nego Linux. Tym samym programiści otrzymują
Linux w momencie, w którym muszą zostać zre- stego. Zadania te realizowane są w niechronio- bardziej ograniczone możliwości projektowania,
alizowane i zwracają mu zasoby procesora po za- nym obszarze jądra. Co za tym idzie, dowolne niż w przypadku wykorzystania systemu opera-
kończeniu swojej pracy. zadanie czasu rzeczywistego, które zawiera typo- cyjnego Linux lub rozwiniętego RTOS.
W opisanym modelu dwurdzeniowym jądro wy błąd w kodzie, np. błędny znacznik C, zdol-
czasu rzeczywistego zawsze daje pierwszeństwo ne jest do spowodowania nieodwracalnej awarii Połączenie zalet
przerwaniom sprzętowym. Jeśli przerwanie re- jądra systemu. Cecha taka jest problemem, po- System operacyjny czasu rzeczywistego QNX
alizowane jest w trybie czasu rzeczywistego, ją- nieważ większość systemów czasu rzeczywiste- Neutrino jest znacznie bardziej elastycznym i
dro zaplanuje wykonanie tego zadania. W prze- go ma bardzo wysokie wymagania dotyczące niezawodnym sposobem rozwiązania proble-
ciwnym razie jądro przekaże zadanie do wyko- niezawodności. mów, które rozpatrujemy. Zamiast zmuszać pro-
nania przez system operacyjny Linux. Działa- gramistów do korzystania z niepewnych rozwią-
nia te są transparentne dla aplikacji, działających Ograniczona przenośność zań, QNX Neutrino oferuje sprawdzone środo-
w środowisku Linux; wyjątek stanowi rzecz ja- W podejściu dwurdzeniowym zadania czasu wisko operacyjne czasu rzeczywistego, które:
sna czas procesora przeznaczony na pracę jądra rzeczywistego są nie procesami systemu opera-
czasu rzeczywistego i jego zadań. Tym niemniej, cyjnego Linux, a wątkami i interpretatorami sy- • pozwala programistom oprogramowania
opisane podejście ma kilka wad, które zostały gnałów, które stworzone zostały dla wąskiej gru- dla systemu Linux na korzystanie z istnie-
opisane w kolejnych rozdziałach. py interfejsów programowania aplikacji (API) jących API i modeli programowania;
standardu POSIX lub, w niektórych przypad- • rekompensuje braki w rozszerzeniach czasu
Zwiększenie natężenia kach, dla niestandardowych API. Przeniesienie rzeczywistego dla systemu operacyjnego Li-
podczas kodowania istniejącego kodu i aplikacji systemu Linux do nux dzięki bardziej rygorystycznemu mode-
Zadania wykonywane w jądrze czasu rzeczywi- środowiska czasu rzeczywistego jest zadaniem lowi środowiska wykonawczego, rozwinię-
stego nie mogą w pełni korzystać z istniejących trudnym. tym możliwościom projektowania i jednoli-
usług systemu operacyjnego Linux — systemów Problem ten zwiększa się także dlatego, że w temu środowisku tworzenia aplikacji czasu
plików, sieci itd. W rzeczywistości zwrot zadania różnych implementacjach systemów dwurdze- rzeczywistego i zwykłych aplikacji;
w czasie rzeczywistym do dowolnej usługi Linux niowych wykorzystywane są różne API. Zada- • stworzone jest w oparciu o takie kluczowe
powoduje te same problemu z wywłaszczaniem, nia, które zostały stworzone w celu wykorzy- możliwości modelu systemu operacyjnego
które powodują niemożność deterministyczne- stania w aplikacjach czasu rzeczywistego jedne- Linux z otwartym kodem źródłowym, jak
go zachowania procesów Linux. go producenta, mogą okazać się nieprzydatne łatwość usuwania błędów i dostosowywa-
W takim przypadku konieczne jest utworze- w przypadku aplikacji opracowanej przez inne- nia systemu operacyjnego do potrzeb użyt-
nie nowych sterowników i usług systemowych go producenta. Zamiast wykorzystania ogólno- kownika. W rzeczywistości, system opera-
dla jądra czasu rzeczywistego, nawet jeśli analo- dostępnych API systemu operacyjnego Linux, cyjny czasu rzeczywistego oparty o mikro-
giczne usługi istnieją w systemie operacyjnym producenci systemów wbudowanych zmusze- jądrową strukturę taki jak QNX Neutrino
Linux. O ile liczba takich gotowych sterowni- ni są do wybierania między konkurencyjnymi oferuje zalety obydwu możliwości;
ków nie jest duża, twórcy oprogramowania dla standardami.
oferuje różne usługi systemowe (np. bezpiecz-
������������������ ną partycjonowanie, przetwarzanie rozproszo-
������������ ne, rozbudowany system wsparcia procesorów
��������������� wielordzeniowych), których nie posiadają roz-
������������������
wiązania oferowane w oparciu o system opera-
cyjny Linux.

����������� Pełna zgodność ze standardem POSIX


����������������������������� Grupa standardów IEEE pod nazwą POSIX
(Portable Operating System Interface – interfejs
������������������������� przenośnych systemów operacyjnych) pierwot-
nie została stworzona na potrzeby systemów
������ operacyjnych Unix i określa interfejs programo-
wania, który często pozwala na pracę aplikacji,
Rysunek 1. W modelu dwurdzeniowym system operacyjny Linux pracuje jako zadanie o niskim priorytecie opracowanych dla jednego systemu operacyjne-
w osobnym rdzeniu czasu rzeczywistego go zgodnego ze standardem POSIX, w innym

www.sdjournal.org 43
Testowanie oprogramowania

systemie operacyjnym, zgodnym z tym standar- Otwartość na rozwiązywanie problemów nego nie wymaga znajomości jądra i korzystania
dem, bez konieczności wprowadzania jakichkol- i dostosowywanie systemu operacyjnego ze specjalnych debugerów jądra. Opracowywa-
wiek modyfikacji. Należy pamiętać, że standard Tym niemniej, zgodność systemu operacyjnego nie rozszerzeń systemu operacyjnego jest tak sa-
POSIX określa nie architekturę systemu opera- czasu rzeczywistego z systemem Linux jest za- mo łatwe, jak w przypadków zwykłych aplikacji,
cyjnego, a interfejs programowania. Z tego po- letą pozorną, jeśli RTOS nie tworzy modelu na ponieważ rozszerzenia są programami znajdują-
wodu system operacyjny czasu rzeczywistego bazie otwartego kodu źródłowego, dla którego cymi się w przestrzeni użytkownika. Programy
zdolny jest do oferowania wsparcia tych samych większość programistów wykorzystuje Linux. te można debugować za pomocą standardowych
interfejsów programowania w standardzie PO- Otwartość kodów źródłowych programów po- narzędzi opracowania kodu, znanych każdemu
SIX, co system operacyjny Linux, a także wiele zwala programistom na analizowanie architektu- twórcy oprogramowania dla systemu Linux.
cech charakterystycznych Linux, bez wykorzy- ry systemu operacyjnego w celu lepszej integracji
stania jego niedeterministycznego jądra. z nią własnych kodów, adaptowania komponen- Redukcja nakładów pracy
System operacyjny czasu rzeczywistego QNX tów systemu operacyjnego do specyficznych wy- Jak już wspomniano, zastosowanie dwóch jąder
Neutrino reprezentuje podejście do programo- mogów aplikacji, a także przyspieszenia proce- zmusza programistów do pisania własnych ste-
wania aplikacji, niezależne od realizacji: oferu- su usuwania błędów w programach tworzonych rowników, z wykorzystaniem nieznanych inter-
je API zgodne ze standardem POSIX, które two- przez programistów oraz problemów związa- fejsów programowania. Jak w większości środo-
rzone są w oparciu o mikrojądrową architekturę nych z nieoczekiwanymi efektami wykonania ko- wisk operacyjnych, opracowanie tych sterowni-
czasu rzeczywistego (Rysunek 2). du systemu operacyjnego. Krótko mówiąc, pro- ków wymaga zastosowania złożonych narzędzi
Ważną cechą RTOS QNX Neutrino jest to, że gramiści są w pewnym stopniu niezależni od do- debugowania jądra, długiej jego kompilacji i ko-
POSIX nie jest jego uzupełnieniem. Podstawo- stawcy systemu operacyjnego i mogą pracować z rzystania z drogich usług programistów.
wy składnik systemu QNX Neutrino – mikro- systemem samodzielnie (co nie jest możliwe przy System operacyjny czasu rzeczywistego QNX
jądro od samego początku opracowywane było wykorzystaniu modelu „czarnej skrzynki” w wie- Neutrino pozwala na rozwiązanie tego proble-
w celu zapewnienia wsparcia dla narzędzi stan- lu komercyjnych systemach operacyjnych), choć mu na kilka sposobów. Po pierwsze, QNX Neu-
dardu POSIX pracujących w trybie czasu rzeczy- jednocześnie są zmuszeni do samodzielnego pro- trino należy do zaawansowanych systemów ope-
wistego, w tym także wątków. Dzięki temu sys- wadzenia własnego systemu operacyjnego. racyjnych z dużą ilością użytkowników i oferuje
tem operacyjny QNX Neutrino jest maksymal- System operacyjny czasu rzeczywistego QNX wsparcie wielu sterowników do standardowych
nie zgodny ze standardem POSIX, a jednocze- Neutrino oferuje te zalety na dwa sposoby: po urządzeń. Jak już wspomniano, wszystkie ste-
śnie z systemem operacyjnym Linux. pierwsze z pomocą rozszerzalnej architektury rowniki w systemie QNX Neutrino działają w
mikrojądrowej, a po drugie dając dostęp do kodu przestrzeni użytkownika, a co za tym idzie, moż-
Jednolite środowisko źródłowego sterowników, bibliotek, usług siecio- na je opracowywać za pomocą standardowych
W RTOS QNX Neutrino aplikacje czasu rze- wych i pakietów BSP, w tym do dokładnie udo- narzędzi i metod tworzenia kodu źródłowego.
czywistego i pozostałe aplikacje wykonywane kumentowanych pakietów projektowania ste- Zadanie to jest prostsze dzięki pakietom projek-
są w tym samym środowisku. Aplikacje czasu rowników (DDK) do wielu urządzeń. towania sterowników firmy QNX, w skład któ-
rzeczywistego mogą w pełni korzystać z API W związku z tym, że QNX Neutrino jest mi- rych wchodzi dokumentacja, biblioteki, pliki na-
standardu POSIX i mają pełen dostęp do usług krojądrowym systemem operacyjnym, można go główkowe i kod źródłowy, na podstawie którego
systemowych — interfejsów graficznych, syste- dostosowywać do potrzeb użytkownika. Za wy- można tworzyć różne sterowniki.
mów plików, stosów protokołów itd. Oprócz jątkiem niektórych podstawowych usług (takich
tego, istniejące aplikacje POSIX i Linux mogą jak szeregowanie, timery, obsługa przerw), któ- Dodatkowe usługi mikrojądrowe
działać w systemie operacyjnym QNX Neutri- re znajdują się w obrębie jądra, większość usług Ponieważ QNX Neutrino jest mikrojądrowym
no w sposób deterministyczny. I w końcu, w systemowych (sterowniki, systemy plików, sto- systemem operacyjnym przeznaczonym dla
związku z tym, że aplikacje czasu rzeczywiste- sy protokołów itd.) to aplikacje umieszczone w wbudowanych systemów, w jego skład wcho-
go i aplikacje zwykłe działają w tym samym śro- przestrzeni użytkownika poza jądrem. Dzięki te- dzą usługi, których nie ma zarówno w standar-
dowisku, komunikacja między procesami jest mu opracowanie własnych sterowników i wyspe- dowej dystrybucji systemu Linux, jak i w rozsze-
znacznie prostsza. cjalizowanych rozszerzeń dla systemu operacyj- rzeniach czasu rzeczywistego dla tego systemu.
Usługi te opisane są w kolejnych rozdziałach.

�������������������������� Zaawansowane wsparcie wieloproceso-


wości dla procesorów wielordzeniowych
��������� ��������� ��������� System operacyjny czasu rzeczywistego QNX
Neutrino od początku był budowany z my-

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

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


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

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

Rysunek 3. Konfigurator systemu QNX Momentics


Rysunek 2. Mikrojądro RTOS QNX Neutrino zawiera tylko podstawowe usługi systemowe. Wszystkie pozwala programistom na wizualizację
usługi wyższego poziomu, w tym sterowniki i stosy protokołów, działają jako procesy dodatkowe, złożonych zachowań systemu wielordzeniowego
które umieszczone są w przestrzeni użytkowej. W efekcie tego programiści mogą bez problemów i koncentrację wysiłków na obszarach, które
rozszerzać funkcjonalność systemu poprzez usługi specjalistyczne, bez konieczności skomplikowanego gwarantują maksymalną równoległość i
programowania i debugowania kodu rdzenia. wydajność

44 09/2008
Testowanie oprogramowania

ślą o wieloprocesowym przetwarzaniu danych. Oprócz tego, technologia inteligentnego party- rzanie rozproszone (TDP), która zapewnia aplika-
W 1997 roku firma QNX wprowadziła na ry- cjonowania firmy QNX może dynamicznie prze- cjom przeźroczysty dostęp do sterowników urzą-
nek technologię wieloprocesowości symetrycznej nosić moc procesora z partycji, które nie są zaję- dzeń, stosów sieciowych i innych usług systemo-
(SMP) i zajmowała się jej rozwojem na przestrzeni te, do partycji, które wymagają dodatkowym mo- wych, działających na innych węzłach sieci. Do-
ostatniego dziesięciolecia. Niedawno firma QNX cy procesora, to znaczy ilość obsługiwanych party- wolny proces, posiadający odpowiednie prawa do-
zaprezentowała innowacyjną technologię wielo- cji zmienia się tylko w przypadku pełnego jego ob- stępu, może korzystać z prawie wszystkich zdal-
procesowości hybrydowej (BMP). Wieloproceso- ciążenia. Dzięki temu system zachowuje się stabil- nych zasobów, jakby były one dostępne lokalnie.
wość hybrydowa pozwala na realizację istnieją- nie przy maksymalnym obciążeniu, wykorzystuje Przezroczystość umiejscowienia usług syste-
cych aplikacji na procesorach wielordzeniowych 100% mocy procesora, zachowując jednocześnie mowych upraszcza projektowanie stabilnych
bez wprowadzania zmian, a jednocześnie daje bezpieczeństwo dzięki gwarantowanemu przy- systemów, oferujących funkcjonalność wyrów-
aplikacjom, dopuszczającym działanie równole- dzielaniu zasobów obliczeniowych. Aby docenić nywania obciążenia. Wyobraźmy sobie na przy-
głe, możliwość działania w pełnym trybie SMP, co zalety inteligentnego partycjonowania, wystarczy kład, że komputer oferuje usługi obliczeniowe
zapewnia maksymalną skalowalność. Wieloproce- porównać je z tradycyjnymi metodami szeregowa- aplikacjom klienta poprzez sieć. W przypadku
sowość hybrydowa pozwala na przydzielenie ist- nia na bazie partycji, w których niewykorzystana awarii tego komputera i uruchomienia kompu-
niejącej aplikacji i wszystkich jej wątków do jedne- moc obliczeniowa procesora jest tracona, co powo- tera zapasowego, aplikacje klienta nie muszą być
go jądra, co zapewnia poprawność funkcjonowa- duje, że projektanci systemów muszą korzystać z powiadomione o tym, że obróbka ich zapytań
nia aplikacji, nawet jeśli wykorzystywane są w niej droższych jednostek procesorowych. dokonywana jest przez nowy komputer, ani nie
metody synchronizacji wątków, nieprzystosowane W związku z tym, że system operacyjny Li- jest konieczne wykonywanie dodatkowych czyn-
do pracy w środowisku wielordzeniowym. nux ma jednolity charakter, większość sterowni- ności w celu nawiązania połączenia z tym kom-
Zintegrowane środowisko programistyczne ków, systemów plików i stosów protokołów przy- puterem. Wszystkie komunikaty, które wysyła-
QNX Momentics, utworzone zgodnie ze stan- pisana jest do jądra. Z tego powodu nawet jeden ne są przez aplikacje klienta, są automatycznie
dardami Eclipse, zawiera także możliwości wie- błąd w którymś z wymienionych komponentów kierowane pod nowy adres.
loprocesowości i daje dostęp do narzędzi wizuali- może doprowadzić do nieodwracalnego zakłóce- Mechanizm przetwarzania rozproszonego fir-
zacji w celu dokonywania analizy, debugowania i nia pracy jądra. Składniki systemu operacyjnego my QNX zmniejsza także koszty urządzeń. Na
optymalizacji systemów wielordzeniowych (Rysu- QNX Neutrino działają w osobnych przestrze- przykład, jeśli jedno z urządzeń samochodowego
nek 3). W odróżnieniu od tradycyjnych narzędzi, niach adresowych z chronioną pamięcią, dzię- systemu informacyjno-rozrywkowego wyposażo-
to instrumentarium odzwierciedla działania za- ki czemu trudniej im zakłócić pracę jądra lub ne jest w połączenie Bluetooth, inne urządzenia
chodzące w całym systemie wielordzeniowym, co innych składników systemu. W taki sposób sys- nie muszą posiadać własnego stosu Bluetooth i
pozwala programistom na ujawnianie potencjal- tem QNX Neutrino zapewnia kluczowym apli- urządzenia nadawczo-odbiorczego, ponieważ mo-
nych możliwości obróbki równoległej, zmniejsze- kacjom czasu rzeczywistego stabilniejsze środo- gą one korzystać z istniejącego połączenia.
nie ilości zbędnej migracji wątków między rdze- wisko wykonawcze niż system operacyjny Linux
niami, ograniczenie kosztownej komunikacji mię- i znacznie bardziej bezpieczne, niż niechronione Stabilna współpraca sieciowa
dzy procesami i lokalizację złożonych problemów rdzenie czasu rzeczywistego, na których oparta Mechanizm przetwarzania rozproszonego sys-
rywalizacji o zasoby, często pojawiające się w syste- jest struktura dwurdzeniowa. temu operacyjnego QNX Neutrino, który za-
mach wielordzeniowych. Przedstawienie całego pewnia niezależność od sieci, umożliwia prze-
systemu, które umożliwia to instrumentarium, w Dynamiczna aktualizacja źroczystą komunikację aplikacji poprzez zapaso-
połączeniu z szerokimi możliwościami wielopro- usług systemowych we linie sieci – w przypadku awarii jednej z linii
cesowości systemu operacyjnego QNX Neutrino W mikrojądrowym systemie operacyjny można system operacyjny automatycznie przekierowu-
pozwala na znaczne ograniczenie nakładów pracy, dynamicznie aktualizować praktycznie każdy z je ruch na inne. Oprócz tego istnieje możliwość
koniecznych podczas przejścia ze środowiska jed- komponentów, czy to jest sterownik urządzenia, wyrównania obciążenia wszystkich linii w sieci,
nordzeniowego do wielordzeniowego. stos protokołów lub aplikację, nie przerywając co zwiększa jej przepustowość. Aplikacje mogą
przy tym pracy innych składników systemu. Po- korzystać z zalet tej usługi bez konieczności two-
Bezpieczeństwo i dostępność dzięki gwa- zwala to na łatwiejsze zapewnienie współczynni- rzenia specjalnego kodu sieciowego.
rantowanemu wyodrębnieniu zasobów ka dostępności systemu, wynoszącego lub prze-
procesora wyższającego wartość 99,999%. W praktyce sys- Mniejsze zużycie pamięci
Wiele współczesnych systemów wbudowanych temy oparte na technologiach firmy QNX czę- W związku z tym, że mikrojądrowa architektura
to urządzenia sieciowe, których funkcjonalność sto działają przez 5-10 lat bez przerwy, chociaż RTOS QNX Neutrino oferuje bardzo precyzyjną
rozszerzana jest przy pomocy niestabilnych apli- regularnie pojawiają się w nich nowe aplikacje i skalowalność, QNX Neutrino zapewnia znacznie
kacji dodatkowych i składników informacyjnych. komponenty systemowe. bardziej kompaktowe środowisko wykonawcze,
Bezpieczeństwo i dostępność systemu mogą być niż system Linux. To najważniejsza zaleta w przy-
zakłócone, jeśli architektura systemu nie zawiera Przeźroczyste przetwarzanie rozproszone padku takich urządzeń, jak multimedialne i mo-
odpowiednich środków zaradczych. Na przykład, System operacyjny QNX Neutrino oferuje usługę toryzacyjne systemy telematyczne, w których spa-
szkodliwe programy mogą spowodować krytyczne systemową określaną jako „przeźroczyste przetwa- dek ceny pamięci o 2 dolary daje miliony dolarów
awarie podstawowych funkcji systemu, pozbawia-
jąc je dostępu do zasobów procesora. ��� ��� ��� ���
W celu rozwiązania tego problemu, system ope- ��������� ��������� ���������
racyjny QNX Neutrino wspiera technologię inte- ���������� ����
����������� ���������� ���������
ligentnego partycjonowania, która pozwala na łą- ������������
czenie aplikacji w bezpieczne rozdziały i przydzie-
lenie każdemu z nich gwarantowanej ilości pamię-
ci i czasu procesora. Dzięki temu pamięć i proce-
sor są dostępne dla najważniejszych procesów na- Rysunek 4. Dzięki technologii inteligentnego partycjonowania każdy z podsystemów otrzymuje
wet w przypadku dużego obciążenia mocy obli- gwarantowaną minimalną moc obliczeniową nawet przy pełnym obciążeniu procesora. Model środowiska
czeniowych oraz odmowy wykonania poleceń. wykonawczego o podwyższonej pewności

46 09/2008
Rzeczywisty czas czy rzeczywisty Linux?

dodatkowych przychodów. Własny system okien- oparty, cały kod powinien zostać otwarty. Ozna- Zadanie określenia źródła i czystości otwar-
kowy QNX Neutrino, QNX Photon microGUI, cza to, że rozwiązania autora mogą być wykorzy- tego kodu leży po stronie firmy, która korzysta
także korzysta z architektury mikrojądrowej, co stywane przez jego konkurencję. z tego kodu. Przez to stosowanie otwartego ko-
pozwala programistom na bezproblemowe „odłą- W chwili powstawania tego artykułu trze- du nie tylko wprowadza do projektowania ele-
czanie” usługi graficznego interfejsu użytkownika, cia wersja licencji GPL jest dyskutowana przez menty ryzyka, ale także powoduje bezpośred-
która nie jest potrzebna w urządzeniach z ograni- Free Software Foundation. Jest ona znacznie ni wzrost nakładów. Ryzyko złamania praw au-
czoną ilością pamięci. surowsza od wersji drugiej i, chociaż nie jest to torskich zależy bezpośrednio od ilości kodu, a
do końca potwierdzone, licencja ta zmusi du- koszty są uwarunkowane koniecznością wyko-
Zgodne, przetestowane jądro żą liczbę firm do ujawnienia kodu źródłowe- nania prawnych i technicznych ekspertyz w ce-
W odróżnieniu od monolitycznego jądra systemu go swoich prac, jeżeli zdecydują się one na ko- lu kontroli czystości kodu.
operacyjnego Linux, którego zawartość zależy od rzystanie z programów, które są przedmiotem Ryzyko związane z własnością intelektualną
konkretnego systemu wbudowanego, mikrojądro tej licencji. może także pojawić się przy równoległym wy-
systemu QNX Neutrino można wykorzystać w Firma QNX Software Systems stara się zrobić korzystaniu programów z otwartym kodem źró-
szerokiej gamie produktów bez konieczności mo- wszystko, aby ochronić swoich klientów przed dłowym w urządzeniu wbudowanym. Istnieje
dyfikacji. Praktycznie dla każdej rodziny proceso- tego rodzaju problemami. QNX oferuje wiele możliwość, że dwie prace osobno nie łamią żad-
rów, wspieranej przez system QNX Neutrino, ist- zalet otwartego kodu bez ryzyka związanego z nych patentów, jednak połączenie ich prowadzi
nieje tylko jedno binarne mikrojądro. Pracując na wykorzystaniem programów chronionych suro- do złamania prawa własności intelektualnej.
nim, programiści mogą być pewni, że przeszło wymi warunkami licencji. Firma QNX Software Systems nieustannie
ono wszelkie konieczne testy w laboratorium fir- dokłada starań, które mają na celu zapewnie-
my QNX Software Systems oraz testy eksploata- Czysta własność intelektualna nie czystości własności intelektualnej, uwalnia-
cyjne u klientów. Ochrona własności intelektualnej to koniecz- jąc swoich klientów od konieczności straty czasu
ność, której świadomi są producenci systemów i pieniędzy na rozwiązanie tych problemów. W
Kwestie dotyczące wbudowanych. Tym niemniej, ryzyko związane żadnym ze składników środowiska wykonawcze-
licencjonowania ze złamaniem praw własności intelektualnej in- go firmy QNX nie jest wykorzystany kod, któ-
Warunki licencyjne, które określają zasady użyt- nych firm często jest ignorowane. ry chroniony jest licencją General Public Licen-
kowania i rozpowszechniania systemu operacyj- Oprogramowanie z otwartym kodem źródło- se projektu GNU. Oprócz tego, firma QNX bie-
nego, mają duże znaczenie dla każdej firmy zaj- wym nie chroni użytkowników przed złama- rze na siebie odpowiedzialność za cały kod jądra
mującej się projektowaniem urządzeń wbudo- niem praw patentowych. Dla przykładu, sys- swoich systemów operacyjnych niezależnie od
wanych. Na przykład, zasady posługiwania się tem operacyjny Linux tworzony jest przez pro- tego, czy został on stworzony przez ekspertów
systemem operacyjnym Linux oparte są na Gene- gramistów, którzy nie mają możliwości ostatecz- firmy, czy zapożyczony z otwartych źródeł.
ral Public License (GPL) wersja 2, zgodnie z którą nie udowodnić, że tworzony przez nich kod nie
dowolne modyfikacje kodu źródłowego tego sys- narusza istniejących lub przedstawionych do za- Podsumowanie
temu powinny mieć otwarty charakter. twierdzenia patentów. Ponieważ licencje na pro- Pomimo tego, że system operacyjny QNX Neu-
Licencja GPL wymaga, aby prace pochodne dukty z otwartym kodem źródłowym nie prze- trino stanowi doskonałą platformę dla aplikacji
były dostępne bezpłatnie na tych samym warun- widują możliwości rekompensaty, firmy posłu- czasu rzeczywistego, nie ma konieczności doko-
kach, jak prace źródłowe. Inaczej rzecz ujmując, gujące się kodem źródłowych w swoich syste- nywania definitywnego wyboru między QNX
jeśli programista tworzy własny kod, który mo- mach są odpowiedzialne za możliwe naruszenie Neutrino a systemem Linux. Projektanci, któ-
dyfikuje system źródłowy lub system na nim praw patentowych. rzy korzystają z API standardu POSIX, mogą
tworzyć programy dla obu systemów operacyj-
nych, wykorzystując każdy z nich tam, gdzie jest
��������
to najbardziej efektywne. Aby przenieść więk-
�������
szość aplikacji spod systemu Linux lub aplika-
����������� cji z otwartym kodem do systemu operacyjnego
QNX Neutrino, z reguły wystarczy dokonać po-
nownej kompilacji kodu źródłowego i przypisać
�������� ������������������������� go do bibliotek QNX Neutrino.
Tym niemniej system operacyjny QNX Neu-
trino, w odróżnieniu od Linux, od początku
��������� tworzony był do pracy w trybie czasu rzeczy-
wistego, a co za tym idzie, uwalnia programi-
stów od wielu nakładów i problemów, charakte-
rystycznych dla rozszerzeń czasu rzeczywistego.
Programiści mają dostęp do programów z otwar-
tym kodem w standardzie POSIX, a jednocze-
śnie mogą korzystać z zalet zgodnego i spraw-
��������
dzonego środowiska czasu rzeczywistego.

���� PAUL N. LEROUX


���������
������ Analityk techniczny firmy QNX Software Systems,
paull@qnx.com

Rysunek 5. Przeźroczyste przetwarzanie rozproszone łączy sieć oddzielnych systemów w jedną


maszynę logiczną. Pozwala to aplikacji, działającej na jednym z komputerów, na uzyskanie dostępu ROMAIN SAHA
do zasobów (sieć, systemy plików, portów USB itd.), umieszczonych na innym węźle, bez konieczności Manager działu systemów sieciowych firmy QNX
przeprogramowania Software Systems, rsaha@qnx.com

www.sdjournal.org 47
Programowanie JAVA

Swing Application
Framework
GUI w języku Java na nowo

Technologia Java Swing, pozwalająca tworzyć graficzny interfejs


użytkownika w języku Java, od samego początku swojego istnienia, czyli
od ponad 10 lat, była bardzo pechowa. Pierwsze implementacje były
mało wydajne i uciążliwe w użyciu, kolejne wersje tego interfejsu powoli
wprowadzały potrzebne ulepszenia, ale nigdy Swing nie stał się czymś
lubianym i docenianym.
Żeby nie przedłużać wstępu przejdźmy do rze-
Dowiesz się: Powinieneś wiedzieć: czy, czyli przyjrzyjmy się przykładowej aplika-
• co to jest Swing Application Framework (SAF); • czytelnik powinien znać podstawy języka Java cji Szukacz (Rysunek 1). Szukacz jest napisaną
• w jaki sposób tworzyć aplikacje GUI w Java oraz technologii Java Swing. w Javie kulawą i ubogą funkcjonalnie namiast-
Swing wykorzystując SAF. ką unixowego grep-a, ma za to graficzny inter-
fejs użytkownika.
Aplikacja jest skonstruowana inaczej niż w
poznamy najważniejsze elementy interesują- większości demonstracyjnych aplikacji Swing
cej nas technologii. Application Framework, które można zna-
Poziom trudności leźć w Internecie. Problemem używanych tam
Do czego służy SAF przykładów jest ich mała użyteczność w rzeczy-
SAF z założenia ma być rozwiązaniem pro- wistej sytuacji. Przykłady te dzielą się na dwie
stym, koncentrującym się na zasadniczych grupy:

W
końcu firma SUN podjęła bar- problemach, na jakie napotykamy się two-
dziej zdecydowane kroki, mające rząc programy z interfejsem użytkownika w • aplikacje wyklikane od początku do koń-
usprawnić działanie Java Swing Javie. ca w środowisku NetBeans, korzystające
zarówno od strony użytkownika końcowego SAF zajmuje się następującymi aspektami z kreatorów kodu tam dostępnych – SAF
jak i programisty. Java SE w wersji 6.0 wpro- tworzenia aplikacji z interfejsem użytkownika: jest produktem firmy SUN, podobnie jak
wadziła wiele pozytywnych zmian jeśli cho- NetBeans, który w najnowszej wersji za-
dzi o funkcjonalność, szybkość działania i wy- • cyklem życia aplikacji od jej uruchomienia wiera wsparcie dla SAF;
gląd aplikacji tworzonych w Javie. Następnym po zamknięcie; • aplikacje napisane całkowicie ręcznie,
krokiem, skierowanym głównie do programi- • zarządzaniem zasobami: łańcuchami zna- włącznie z elementami GUI.
stów, jest uproszczenie tworzenia aplikacji z ków, kolorami, ikonami, czcionkami itp.
interfejsem użytkownika przez wprowadze- artefaktami, które występują w typowej Żadna z tych sytuacji nie jest typowa. Po
nie frameworka Swing Application Frame- aplikacji. Oczywiście wszystkie zasoby pierwsze, nie każdy chce używać NetBean-
work (JSR-296). mogą być internacjonalizowane/lokalizo- sa (fakt, jest on bardzo dobrym produktem
Swing Application Framework jest dłu- wane; jeśli chodzi o tworzenie GUI), a nawet jeże-
go oczekiwaną nakładką na niskopoziomową • obsługą zdarzeń (co ma się stać, gdy użyt- li go używamy, to istnieje duża szansa, że ma-
funkcjonalność Swinga, która znacznie ułatwia kownik naciśnie przycisk X). W szczegól- my już napisany kawałek kodu, który nie uży-
i przyspiesza pracę przy budowie GUI. Artykuł ności SAF upraszcza znacząco obsługę dłu- wa SAF i chcielibyśmy go gładko zintegrować
jest poświęcony zwięzłemu omówieniu SAF, w gotrwałych zdarzeń, które powinny wy- frameworkiem.
szczególności zobaczymy jak ułatwia on opro- konywać się w wątkach roboczych, a nie Co do drugiej sytuacji, jeśli nie jesteśmy
gramowanie typowych elementów aplikacji z głównym; maniakalnymi zwolennikami ręcznego pi-
GUI (ang. Graphical User Interface) – inicjali- • przechowywaniem stanu aplikacji. Po za- sania kodu GUI, co zazwyczaj kończy się
zacji i zamykania aplikacji, programowania wie- mknięciu aplikacji pamięta ona jaki był mniejszą lub większą katastrofą połączoną z
lowątkowego, obsługi zdarzeń. stan interfejsu użytkownika (rozmiar gromami rzucanymi na Swinga i Javę w ogó-
Naszym celem jest utworzenie prostej apli- okien, ich położenie) przed zamknię- le, to pewnie chcemy użyć jakiegoś wizual-
kacji szukającej plików na dysku, na jej bazie ciem. nego narzędzia, które pozwoli nam wykli-

48 09/2008
Swing Application Framework – GUI na nowo

kać strukturę interfejsu użytkownika. Narzę- Listing 1. Główna klasa aplikacji Szukacz inicjalizuje powstawanie interfejsu użytkownika oraz
dzie to na pewno jeszcze nie wspiera SAF, a zawiera obsługę zakończenia działania aplikacji
my oczywiście nie chcemy być zmuszeni do
rezygnacji z jego użycia. package pl.xoft.saf.finder.ui;
Zobaczymy dalej jak tworzyć GUI tak, jak import java.awt.Component;
nam jest najwygodniej i móc go w każdej chwili import java.util.EventObject;
zintegrować z SAF. Zatem do dzieła. import javax.swing.JOptionPane;
import org.jdesktop.application.*;
Cykl życia aplikacji public class MainApp extends SingleFrameApplication{
Zajmiemy się teraz podstawowym elemen- ResourceMap resource;
tem każdej aplikacji SAF, czyli klasą uru- ApplicationContext ctxt;
chamiającą interfejs użytkownika. Musi
ona dziedziczyć po klasie Application lub @Override
SingleFrameApplication frameworka. Kla- protected void startup() {
sa SingleFrameApplication daje nam kil- FrameView view = new MainViewFrame(this);
ka dodatkowych usług oraz gotową instan- view.setFrame(new MainFrame());
cję klasy reprezentującej okno w Swingu, show(view);
czyli JFrame.
Z powodów opisanych powyżej będziemy addExitListener(new ExitListener() {
jednak samodzielnie tworzyć okno aplikacji public boolean canExit(EventObject e) {
– chcemy używać SAF, ale nie chcemy, żeby Object[] options = {resource.getString("label.yes"),
nam się on w aplikacji za bardzo panoszył. Kla- resource.getString("label.no")};
sa Application jest abstrakcyjna, dziedzicząc
po niej musimy zaimplementować samodziel- Object source = (e != null) ? e.getSource() : null;
nie metodę void startup(), którą za chwilę Component owner =
się zajmiemy. (source instanceof Component) ?
Popatrzmy na Listing 1, na którym znajduje (Component)source : null;
się główna klasa aplikacji Szukacz, MainApp.
Zacznijmy analizę klasy MainApp od końca, boolean mayExit = JOptionPane.showOptionDialog(
od metody main(String[]). Metoda Applic owner,
ation.launch(Application) uruchamia ca- resource.getString("label.exit"),
łą aplikację. Jest ona bardzo wygodna, bo dzię- resource.getString("Application.name"),
ki niej nie musimy pamiętać o inicjalizacji in- JOptionPane.YES_NO_OPTION,
terfejsu użytkownika z poziomu odpowied- JOptionPane.QUESTION_MESSAGE,
niego wątku – wątku EDT (ang. Event dispat- null,
ching thread). options,
Zróbmy w tym miejscu małą dygresję, żeby options[1]) == JOptionPane.YES_OPTION;
ustalić terminologię no i żeby osoby mniej oby-
te z tematem wiedziały w czym rzecz. return mayExit;
Trzeba pamiętać, że typowa, ale bardziej zło- }
żona aplikacja Swingowa, potrzebuje co naj- public void willExit(EventObject event) {
mniej trzech wątków: //do nothing
}
• głównego, który powinien tylko urucho- });
mić aplikację; }
• wątku Event dispatching thread, w którym, i
tylko w którym można tworzyć i modyfiko- @Override
wać komponenty interfejsu użytkownika; protected void initialize(String[] args) {
• wątku lub wątków roboczych, które wy- System.out.println("Inicjalizacja... ");
konują wszystkie dłużej trwające zadania this.ctxt = getContext();
– nie chcemy ich wykonywać w ramach ResourceManager mgr = ctxt.getResourceManager();
EDT, żeby nie blokować interfejsu użyt- resource = mgr.getResourceMap(MainApp.class);
kownika. }

@Override
protected void shutdown() {
System.out.println("Koniec pracy!! Czyścimy");
}

public static void main(String[] args) {


Application.launch(MainApp.class, args);
}
}
Rysunek 1. Główny ekran aplikacji Szukacz

www.sdjournal.org 49
Programowanie JAVA

Często popełnianym błędem jest inicjalizacja inicjalizujemy tworzenie interfejsu SAF polega na tym, że klasa okna aplika-
GUI z poziomu wątku głównego, a nie EDT; użytkownika. Musi powstać w niej in- cji dziedziczy po klasie FrameView SAF,
zazwyczaj nie powoduje to problemów, ale stancja klasy FrameView, która jest mo- czego właśnie chcemy uniknąć
zdarza się, że pojawiają się przykre i trudne do stem pomiędzy SAF a oknem aplika- • metody void ready() nie ma na Listingu
wykrycia błędy. cji, reprezentowanym u nas przez klasę 1, przesłaniamy ją wtedy, gdy potrzebne są
Metoda Application.launch() powoduje MainFrame . Potencjalnie MainFrame nie jakieś czynności inicjalizacyjne po utwo-
rozpoczęcie wywołania kolejnych metod odpo- musi nic wiedzieć o SAF, dzięki czemu rzeniu GUI, które mogą na przykład za-
wiedzialnych za obsługę cyklu życia aplikacji. mamy dużą swobodę pracy z nią – nie brać więcej czasu. Zazwyczaj chcemy jak
Jedyna metoda, którą musimy przesłonić jesteśmy uzależnieni od SAF, ale w każ- najszybciej pokazać użytkownikowi inter-
to void startup(), pozostałymi możemy za- dej chwili możemy używać tych jego ele- fejs aplikacji, a gdy się on mu z podziwem
jąć się wtedy, gdy są nam do czegoś potrzebne. mentów, które chcemy – demonstruje to przygląda, możemy spokojnie dokończyć
Przyjrzyjmy się teraz metodom, które mamy do diagram na Rysunku 2; inicjalizację;
dyspozycji: Po lewej stronie diagramu znajdują się • metoda void exit() kończy działanie
klasy zależące silnie od klas interfejsu aplikacji. Odbywa się to w ten sposób, że
• metoda void initialize(String[]). Mo- programistycznego SAF, najważniejsza z jeśli z poziomu aplikacji wywołane jest
żemy w niej wykonać różnego rodzaju nich to główna klasa aplikacji, MainApp . zdarzenie żądające zakończenia pracy (np.
czynności inicjalizacyjne, które są potrzeb- Po prawej stronie diagramu są klasy im- klikniemy przycisk z krzyżykiem okienka
ne przed konstrukcją interfejsu użytkow- plementujące graficzny interfejs użyt- aplikacji), to przejmowane jest ono przez
nika. Jako parametr przyjmuje ona automa- kownika. Mogą one w ogóle nie zależeć klasę typu ExitListener, która spraw-
tycznie tablicę parametrów uruchomienio- od SAF, albo zależeć w taki sposób, że- dza, czy wolno zakończyć działanie apli-
wych aplikacji; by nie przeszkadzało nam to używać do- kacji. W naszym przypadku w metodzie
• metodę void startup() musimy prze- wolnego narzędzia do graficznego two- startup() dodajemy naszą implementa-
słonić obowiązkowo: w tej metodzie rzenia GUI. Klasyczny sposób użycia cję ExitListener -a, który wyświetla okno
dialogowe z pytaniem o pozwolenie za-
mknięcia aplikacji;
• metoda void shutdown(). Gdy zapadnie
������������� decyzja, że możemy zamknąć aplikację, to
ostatnią rzeczą, jaka jest robiona, jest wy-
wołanie tej metody.
���������������������� ������������������
������� ��������� Zarządzanie zasobami
Kolejnym elementem, który daje nam SAF
�������������������������
��������������������������� ��������������
jest ustandaryzowane zarządzanie zasoba-
��������������������������� mi. Dotyczy to w zasadzie wszystkich skład-
������������������
������������������������������
���������������������� ników aplikacji, które nie są kodem Java: na-
�����������������������
�������������������� pisów na etykietach, przyciskach, itp., ikon,
używanych czcionek, kolorów. W jaki sposób
to się odbywa?
Zasoby dzielą się na globalne i lokalne. Za-
��������� ������������������
łóżmy, że główną klasą naszej aplikacji jest
������������� �������� GlownaKlasaAplikacji.
Zasoby globalne są umieszczone wte-
�����������������
����������������������������� ���������������������������������������� dy w pliku GlownaKlasaAplikacji.proper-
ties, który musi się znajdować w pakiecie na-
�������������� zwa.pakietu.resources, przy założeniu, że klasa
��������������������������� GlownaKlasaAplikacji znajduje się w pakie-
������������������
cie nazwa.pakietu. W naszym przypadku za-
����������������������������
������������������������������������������ soby globalne dla języka polskiego znajdzie-
���������������������� my w pliku MainApp.properties, a dla języ-
������������������
ka angielskiego w MainApp_en_US.proper-
ties. Oba pliki są w pakiecie pl.xoft.saf.fin-
der.ui.resources.
Zasoby lokalne są przechowywane zgod-
nie z tę samą konwencją co powyżej – każ-
����
da klasa ma swój plik z zasobami umieszczo-
ny w pliku properties o nazwie takiej samej
���������������
�����������������������������
�����������������������������
���������������������������
��������������������������������������

Rysunek 3. Fragment menu aplikacji Szukacz,


Rysunek 2. Architektura aplikacji Szukacz pozwalający zmieniać wielkość czcionki.

50 09/2008
Swing Application Framework – GUI na nowo

jak nazwa klasy. Do zasobów dostajemy się


tak, jak to demonstruje listing klasy MainApp Listing 2. Demonstracja automatycznej konwersji definicji zasobów, czyli łańcuchów znaków, na
klasy języka Java
(Listing 1).
W metodzie initialize(String[]) two-
rzymy uchwyt do bardzo użytecznej klasy, 66. jMenuItem3.setAction(actionMap.get("makeLarger"));
ApplicationContext, reprezentującej środo- 67. jMenuItem3.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP,
wisko (kontekst) działania aplikacji. Następ- InputEvent.ALT_MASK | InputEvent.CTRL_MASK));
nie z kontekstu aplikacji wyciągamy klasę za- 68. jMenuItem3.setIcon(resourceMap.getIcon("jMenuItem3.icon"));
rządzającą zasobami: ResourceManager. W kla- 69. jMenuItem3.setText(resourceMap.getString("jMenuItem3.text"));
sie MainApp zasobów używamy przy tworzeniu 70. jMenuItem3.setName("jMenuItem3");
okna dialogowego, które pojawia się, gdy ktoś 71. jMenu2.add(jMenuItem3);
chce zamknąć aplikację.
Bardzo użyteczną cechą SAF jest automa- Listing 3. Demonstracja obsługi zdarzenia polegającego na naciśnięciu przycisku Szukaj w oknie
aplikacji
tyczna konwersja niektórych zasobów na kla-
sy Java.
Przeanalizujmy pokazany na Listingu 2 frag- 1. //fragmenty klasy MainPane
ment klasy MainFrame. Interesuje nas element 2. public class MainPane extends javax.swing.JPanel {
menu pozwalający zwiększyć lub zmniejszyć 3.
wielkość czcionki. 4. File f = null;
Aby menu było czytelniejsze jest tam 5.
umieszczona odpowiednia ikona (Rysunek 6. public MainPane() {
3). Bez SAF sami byśmy musieli z łańcucha 7. initComponents();
znaków, reprezentującego konkretny zasób, 8. }
wyprodukować obiekt klasy ImageIcon, a tu- 9.
taj wystarczy, że użyjemy metody Resource 10. //w metodzie pozostawiona jest tylko inicjalizacja
Map.getIcon(String). Podobnie konwerto- //interesujących nas w tej chwili komponentów
wane są z łańcuchów znaków definicje czcio- 11. private void initComponents() {
nek i kolory. 12. jTextArea1 = new javax.swing.JTextArea();
Niby drobne udogodnienie, ale jeśli doło- 13. jButton1 = new javax.swing.JButton();
żymy do tego internacjonalizację i pomno- 14. jTextField2 = new javax.swing.JTextField();
żymy wszystko przez, powiedzmy, 500 wy- 15.
stąpień w dużej aplikacji, to okaże się, że 16. jTextArea1.setColumns(20);
jednak trochę rękę i klawiaturę oszczędzi- 17. jTextArea1.setEditable(false);
liśmy. 18. jTextArea1.setFont(resourceMap.getFont("jTextArea1.font"));
19. jTextArea1.setRows(5);
Akcje – obsługa zdarzeń 20. jTextArea1.setName("jTextArea1");
Wreszcie dochodzimy do najciekawszego ele- 21.
mentu SAF, uproszczonego definiowania ak- 22. ActionMap actionMap = Application.getInstance(MainApp.class).getContext().
cji. W Swingu jeśli chcemy, żeby jakiś kom- getActionMap(MainPane.class, this);
ponent oprócz siedzenia w oknie aplikacji 23. jButton1.setAction(actionMap.get("search"));
mógł zrobić coś pożytecznego, musieliśmy 24. jButton1.setText(resourceMap.getString("jButton1.text"));
dodać do niego nasłuchiwacza zdarzeń (Ac- 25. jButton1.setName("jButton1");
tionListener lub innego), a następnie tegoż 26.
nasłuchiwacza zaimplementować jako osob- 27. jTextField1.setEditable(false);
ną klasę. 28. jTextField1.setText(resourceMap.getString("jTextField1.text"));
SAF całą tę procedurę bardzo upraszcza, po 29. jTextField1.setName("jTextField1");
prostu tworzymy metodę, oznaczamy ją meta- 30. }
daną @Action i dodajemy do mapy akcji infor- 31.
mację o tym, że pojawiła się obsługa pewnego 32. @Action
zdarzenia. 33. public void search() {
Popatrzmy na fragment kodu, wzięty z klasy 34. jTextArea1.setText("");
MainPane (Listing 3). 35. Grep g = new Grep(jTextField2.getText());
Interesuje nas wyłącznie obsługa przyci- 36. try {
sku Szukaj, dlatego cały kod służący do in- 37. if(f != null)
nych celów został usunięty z Listingu 3. W 38. g.searchInFiles(f);
linii 32 zaczyna się metoda search, oznacza- 39. } catch (FileNotFoundException ex) {
my ją metadaną @Action, żeby zarejestrować 40. Logger.getLogger(MainPane.class.getName()).log(Level.SEVERE, null, ex);
ją jako akcję. 41. } catch (IOException ex) {
Pozostaje jeszcze powiązać odpowiedni 42. Logger.getLogger(MainPane.class.getName()).log(Level.SEVERE, null, ex);
przycisk (JButton1) z tę akcją. Robimy to w li- 43. }
nii 23, wykorzystując klasę javax.swing.Ac- 44. getJTextArea1().setText(g.getFormatedSearchResults());
tionMap. 45. }
Warto zwrócić uwagę na to, że może- 46. }
my się odwoływać do akcji zdefiniowanych

www.sdjournal.org 51
Programowanie JAVA

Listing 4. Implementacja wyszukiwania zrobiona w ten sposób, by odbywało się ono w osobnym wątku

1. //fragmenty klasy MainPane 29. }


2. public class MainPane extends javax.swing.JPanel { 30.
3. 31. private class SearchNoBlockingTask extends Task<String,
4. File f = null; Void> {
5. 32. StringBuilder str = null;
6. public MainPane() { 33. Grep g = null;
7. initComponents(); 34.
8. } 35. SearchNoBlockingTask(Application app) {
9. //w metodzie pozostawiona jest tylko inicjalizacja 36. super(app);
interesujących nas w tej chwili 37. jTextArea1.setText("");
komponentów 38. g = new Grep((jTextField2.getText()));
10. private void initComponents() { 39. }
11. ActionMap actionMap = Application.getInstance(MainApp.c 40.
lass). 41. protected String doInBackground() {
getContext().getActionMap(MainPane.class, this); 42. try {
12. 43. if(f != null )
13. jButton2.setAction(actionMap.get("searchNoBlocking") 44. g.searchInFiles(f);
); 45. } catch (FileNotFoundException ex) {
14. jButton2.setText(resourceMap.getString("jButton2.text 46. Logger.getLogger(MainPane.class.getName()).log(Leve
")); l.SEVERE, null, ex);
15. jButton2.setName("jButton2"); 47. } catch (IOException ex) {
16. 48. Logger.getLogger(MainPane.class.getName()).log(Leve
17. jTextField2.setText(resourceMap.getString("jTextField2 l.SEVERE, null, ex);
.text")); 49. }
18. jTextField2.setName("jTextField2"); 50. return g.getFormatedSearchResults();
19. 51. }
20. jButton4.setAction(actionMap.get("cancel")); 52. protected void succeeded(String result) {
21. jButton4.setText(resourceMap.getString("jButton4.text 53. getJTextArea1().setText(result);
")); 54. }
22. jButton4.setName("jButton4"); 55. }
23. } 56.
24. 57. @Action
25. @Action(block=Task.BlockingScope.COMPONENT) 58. public void cancel() {
26. public Task searchNoBlocking() { 59. if(searchTask != null)
27. searchTask = new SearchNoBlockingTask(Application.getIns 60. searchTask.cancel(true);
tance(MainApp.class)); 61. }
28. return searchTask; 62. }

Uruchomienie przykładów dołączonych do artykułu


Kod źródłowy wszystkich przykładów jest dostępny razem z czasopismem na płycie oraz na stronie http://www.xoft.pl/wp-content/uploads/2008/03/
szukacz.zip.
Przykłady są dołączone w postaci projektu środowiska NetBeans. W katalogu zawierającym projekt umieszczone są źródła języka Java (src), w
podkatalogu dist z kolei umieszczone jest archiwum Szukacz.jar, zawierający binarną wersję aplikacji. Aby go uruchomić należy mieć zainstalo-
waną wersję 6.0 języka Java. Uruchomienie polega na dwukrotnym kliknięciu archiwum JAR lub, jeśli to nie działa, na wykonaniu z linii poleceń
komendy java -jar Szukacz.jar.
Osoby niecierpliwe mogą bezpośrednio uruchomić aplikację przez Java Web Start wchodząc na stronę http://www.xoft.pl/wp-content/uploads/
2008/03/szukacz.jnlp.

Bibliografia
SAF jest nową technologią, nie do końca ustandaryzowaną, z tego powodu nie znajdziemy zbyt wielu źródeł informacji. Poniżej jest kilka miejsc war-
tych odwiedzenia:

• strona główna projektu: https://appframework.dev.java.net/.


• wywiad z Hansem Mullerem, twórcą SAF A Framework for Swing: http://www.artima.com/lejava/articles/swingframework.html.
• wprowadzenie do tworzenia aplikacji SAF w NetBeans Introduction to the Swing Application Framework: http://www.netbeans.org/kb/60/java/gui-saf.html.
• dwa ciekawe artykuły poświęcone programowaniu z użyciem SAF: Using the Swing Application Framework (http://java.sun.com/developer/
technicalArticles/javase/swingappfr/) i Swing Application Framework Hacks Unleashed For Smarty Pantses (http://weblogs.java.net/blog/diverson/
archive/2007/04/swing_applicati.html).
• informacje o klasie SwingWorker, służącej do zarządzania wątkami w aplikacjach Swing znajdziemy na stronie http://swingworker.dev.java.net/.

52 09/2008
Swing Application Framework – GUI na nowo

w innych klasach, przekazując odpowiedni tacja klasy Task nazywa się SearchNoBlocking pu. Gdy będziemy dodawać nowe elementy
obiekt do metody ApplicationContext.ge Task (linia 31), przesłaniamy w niej trzy me- interfejsu użytkownika NetBeans będzie tak-
tActionMap(Class, Object) – jest to bar- tody: że automatycznie tworzył odpowiednie pli-
dzo wygodne, gdyż raz zdefiniowaną ak- ki zasobów.
cję można wykorzystywać w całej aplikacji. • konstruktor, w którym inicjalizujemy po- Dodawanie obsługi zdarzeń odbywa się w
Pewnie najwygodniejszy byłby tutaj mecha- trzebne obiekty, warto zwrócić uwagę na bardzo przyjazny sposób, klikamy prawym kla-
nizm wstrzykiwania zależności (ang. depen- to, że możemy w nim modyfikować stan wiszem na wybranej kontrolce GUI (na przy-
dency injection), ale SAF ma być prosty, więc GUI; kład na przycisku) i wybieramy Set Action. Po-
przynajmniej w obecnej wersji wyszukuje- • doInBackground(), która jest odpowie- jawia się wtedy okienko (Rysunek 4), w którym
my odpowiednią klasę i metodę z kontek- dzialna za uruchomienie wyszukiwa- możemy przypisać jako akcję istniejącą meto-
stu aplikacji. nia – ta metoda działa w osobnym wąt- dę lub utworzyć nową oraz skonfigurować ak-
Opisana implementacja funkcjonalności ku, nie blokuje zatem interfejsu użytkow- cję – możemy akcji przypisać skrót klawiszo-
wyszukiwania jest bardzo prosta, ma jednak- nika, nie wolno w tej metodzie odwoły- wy, skonfigurować ją tak, żeby wykonywała się
że jedną dosyć zasadniczą wadę: jeżeli wy- wać się w związku z tym do elementów w tle, itp.
szukiwanie trwa dłużej, to blokuje ono in- GUI. Metoda ta jest automatycznie uru-
terfejs użytkownika, w szczególności nie ma chomiana, gdy tworzymy instancję klasy Podsumowanie
możliwości przerwania wyszukiwania. Dla- SearchNoBlockingTask ; Czy SUN-owi uda się spopularyzowanie
czego tak się dzieje jest jasne – długotrwa- • succeeded , która jest wywoływana SAF? Niewątpliwie Swing potrzebuje tego ty-
łe zadanie wykonujemy w wątku EDT, od- gdy tylko skończy się działanie meto- pu rozwiązania, a jak na razie nie bardzo wi-
powiedzialnym za rysowanie interfejsu użyt- dy doInBackground() – w tej metodzie dać konkurencję na tym polu. SAF musi mieć
kownika. możemy zaktualizować interfejs użyt- także dobre wsparcie narzędzi do tworzenia
Musimy zatem uruchomić wyszukiwanie w kownika przy pomocy danych uzyska- interfejsu użytkownika. Obecnie mamy do
osobnym wątku. Brzmi to z pozoru dość pro- nych z metody doInBackground(). Me- dyspozycji tylko NetBeansa, który sprawdza
sto, ale w praktyce jest uciążliwe, gdyż trzeba toda ta jest oczywiście uruchomiona w się całkiem dobrze, mimo kilku drobnych
zsynchronizować działanie wątku szukające- wątku EDT, dlatego może modyfikować uciążliwości.
go z wątkiem EDT, rysującym interfejs użyt- GUI. W szerszym kontekście ciekawsze pyta-
kownika. nie brzmi, co się będzie działo na polu two-
Dotychczas najwygodniejszym rozwiąza- Klasa SearchNoBlockingTask ma jeszcze rzenia interfejsu użytkownika, bo ewident-
niem było wykorzystanie klasy narzędzio- inne użyteczne metody, z jednej z nich ko- nie szykuje się tutaj mniejszy lub większy
wej SwingWorker. Podobne podejście sto- rzystamy w metodzie cancel , umieszczonej przełom.
suje SAF, tyle, że użycie analogicznego me- na samym końcu Listingu 4, przerywa ona Z jednej strony tradycyjne aplikacje gru-
chanizmu jest prostsze niż w przypadku wyszukiwanie po kliknięciu w odpowied- bego klienta przestają być wystarczające w
SwingWorker-a. ni przycisk. niektórych zastosowaniach, z drugiej stro-
Przyjrzymy się jeszcze raz klasie MainPane, ny webowy interfejs użytkownika, któ-
tyle, że innemu jej fragmentowi, który znajdu- Co jeszcze potrafi SAF ry można utworzyć przy pomocy HTML/
je się na Listingu 4. Jest jeszcze kilka rzeczy, o których warto CSS/JavaScript, nawet jeśli wykorzystuje się
Tak jak wcześniej, do komponentu, w tym wspomnieć. SAF ułatwia implementację bar- AJAX, jest daleki od tego, co byśmy chcieli
przypadku przycisku, przypisujemy akcję dzo często pożądanej funkcjonalności, czy- dostać. Jaka więc technologia ma szansę się
searchNoBlocking (linia 13). Metoda obsłu- li paska postępu dla długotrwałych operacji. przebić?
gująca wyszukiwanie zwraca obiekt typu Task, SAF zapamiętuje także automatycznie stan Być może uproszczenie instalacji Javy, które
którego instancję musimy utworzyć w meto- GUI – wielkość i położenie okien. Ponieważ ma być wkrótce dostępne w ramach Java SE 6
dzie searchNoBlocking (linia 27). nasz przykład nie do końca jest skonstruowa- Update 10 (zwanego wcześniej 6uN), do łask
Oczywiście nikt nam nie da gotowej klasy ny zgodnie z duchem SAF to akurat ta funk- wrócą applety.
Task – trzeba ją samodzielnie napisać, przesła- cjonalność nie działa. Z technologicznego punktu widzenia są
niając odpowiednie metody. Nasza implemen- one w wielu zastosowaniach bardzo skutecz-
Użycie SAF nym rozwiązaniem. Być może zyska popu-
w środowisku NetBeans larność najnowsze dziecko firmy SUN, Ja-
Mimo, że założeniem artykułu jest przeźroczy- vaFX, który ma zdecydowanie uprościć two-
stość ze względu na używane środowisko pro- rzenie GUI. Trzeba jednak pamiętać o twar-
gramistyczne, warto wspomnieć w jaki spo- dych konkurentach na tym polu – Adobe
sób można uprościć sobie życie dzięki NetBe- Flex i Adobe Air oraz oczywiście Silverlight
ansowi. od Microsoftu. Niewątpliwie czekają nas cie-
Środowisko NetBeans w wersji 6.1 daje do kawe czasy.
ręki programiście narzędzia pozwalające na Uwaga: artykuł bazuje na aktualnej, czyli
szybki start ze Swing Application Framework. dość wczesnej wersji SAF, która może się jesz-
Przede wszystkim tworząc nowy projekt Java cze zmieniać, także z czasem niektóre przykła-
możemy wybrać jako typ projektu Java Desk- dy mogą przestać działać.
top Application.
Kreator projektu utworzy dla nas najważ-
niejsze klasy, jakich potrzebuje SAF, czyli kla- PIOTR KOCHAŃSKI
sę główną aplikacji i klasę reprezentującą głów- Autor jest konsultantem firmy Erudis, odpowiedzial-
ne okno aplikacji. Dodatkowo dostajemy kilka nym za technologię Java.
Rysunek 4. Kreator NetBeansa służący do gotowych składników GUI, takich jak goto- Kontakt z autorem: p.kochanski@erudis.pl,
przypisywania akcji do kontrolki GUI. wy szkielet menu aplikacji czy pasek postę- strona WWW: http://www.xoft.pl

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

Podstawy
tworzenia gier w JME
Jeśli zawsze chciałeś stworzyć gierkę na swój telefon komórkowy lub po
prostu poznać podstawy Javy Micro Edition – to jest artykuł dla ciebie.
Najpierw, krok po kroku, stworzymy prostą szkieletową aplikację. Następnie
przedstawię trochę tajników tworzenia gier i smaczków związanych z JME.
Aby stworzyć projekt należy wybrać New
Dowiesz się: Powinieneś wiedzieć: Project. Pojawi się okienko (Rysunek 2), w któ-
• Co to jest JME; • Jak programować w Javie. rym podajemy nazwę projektu i nazwę klasy,
• Jak stworzyć prostą aplikację JME na telefon, która będzie punktem wejściowym naszej apli-
skompilować, uruchomić w emulatorze i na te- kacji. Aplikacje w JME nazywają się MIDlety.
lefonie; Nazwa klasy może być dowolna ale dobrą prak-
• Jak można ugryźć zagadnienie tworzenia gier. tyką jest zawarcie w niej słowa MIDlet.
Gdy podamy nazwy klikamy Create Project i
przechodzimy do kolejnego okna (Rysunek 3).
ne rzeczy na prawdziwych telefonach mogą nie Z lewej strony mamy dużo zakładek, w których
działać tak jak się tego spodziewamy. możemy poustawiać masę opcji. My jednak
Poziom trudności Do tworzenia gry będziemy używać pakietu skupimy się tylko na wyborze platformy doce-
WTK (patrz Słowniczek). Stworzymy w nim lowej, która określi na jakich telefonach nasza
projekt oraz będziemy go używać do kompilowa- aplikacja będzie (a przynajmniej powinna) się
nia, robienia buildów które można wgrać na tele- uruchamiać oraz jakie API będziemy mieli do

J
ak to wynika ze wstępu celem artykułu fon (pliki jad/jar) oraz uruchamiania gry w emu- dyspozycji w czasie programowania.
jest wprowadzenie w tematykę tworze- latorze telefonu. Klikamy w pole wyboru wartości Target Plat-
nia aplikacji JME, a w szczególności gier. form i wybieramy JTWI. Ogólnie można przy-
Artykuł podzielony jest na dwie części. Pierw- Aplikacja bazowa jąć, że są to telefony z MIDP2 i CLDC1.0 (patrz
sza ma formę tutoriala z jasno określonymi kro- ramka Java Micro Edition) czyli grupa obejmują-
kami, które należy wykonać aby otrzymać pod- Krok 1: Ściągnij i zainstaluj WTK ca szeroką gamę telefonów (nie pokrywa starych
stawową aplikację, która może być stosowana WTK dostępne jest za darmo ze strony Suna bardzo ograniczonych urządzeń, ale też nie ogra-
jako punkt wyjściowy do tworzenia gier. Dru- (W Sieci). Instalacja jest banalna i sprowadza nicza się do tylko najnowszych-super-hiper). Po wy-
ga część artykułu stanowi poglądowy opis bu- się do klikania dalej. braniu platformy klikamy OK co zakończy two-
dowy prostej gry napisanej w JME, opartej na rzenie projektu. Powinniśmy powrócić do główne-
podstawie stworzonej w części tutorialowej. Krok 2: Tworzymy projekt w WTK go okna WTK, w którym pojawi się informacja, że
Przy okazji druga część artykułu powinna na- Odpalamy WTK (Start -> Programy -> Sun Ja- stworzony został katalog z projektem i jego lokali-
świetlić pewne trudności, z którymi muszą się va (TM) Wireless Toolkit 2.5.2 for CLDC -> zacja. Znajduje się on domyślnie w:
zmierzyć twórcy gier dla JME. Wireless Toolkit 2.5.2). Naszym oczom uka- [Documents and Settings]/[user]/j2mewtk/
Artykuł zakłada znajomość podstaw Javy. rze się okienko z Rysunku 1. 2.5.2/apps/[nazwa projektu].
Nic poza tym. Pomóc może obeznanie z IDE,
w którym lubimy pisać, gdyż będziemy dołą-
czać zewnętrzne biblioteki. Aczkolwiek moż-
na też pisać w notatniku, wtedy nic nie trze-
ba dołączać.
Droga, którą przebędziemy tworząc naszą
grę jest trochę wyidealizowana dla celów edu-
kacyjnych. Idealizacja polega na tym, że nie bę-
dziemy się zbytnio przejmować tym co w świat-
ku JME określa się jako porting – póki co zakła-
damy, że wszystko działa na telefonach tak jak
powinno, zgodnie ze specyfikacją i tak samo jak
na emulatorze.
Jednakże, będę sygnalizował miejsca, na któ-
re trzeba zwrócić szczególną uwagę gdyż pew- Rysunek 1. WTK

54 09/2008
Podstawy tworzenia gier w JME

Krok 3: Konfiguracja IDE tive, Paused, Destroyed. Na moment obecny wy- Dlet, które muszą zostać zaimplementowane. W
Kod możemy pisać w Notatniku ale na pewno o starczy wiedzieć że gdy telefon pomyślnie stwo- naszym bardzo prostym przykładzie ich imple-
wiele wygodniej jest używać dobrego IDE. Istnie- rzy instancję midletu wprowadza go w stan Ac- mentacja ograniczy się do samego faktu ich ist-
ją różne pluginy do popularnych IDE ułatwiające tive, co skutkuje wywołaniem metody startApp. nienia. Jednak gdy będziemy chcieli dopiąć na-
tworzenie aplikacji JME (np. NetBeans Mobili- Jest to punkt wejściowy dla naszej gry. szą grę do końca należy się tymi metodami zająć,
ty Pack, EclipseME) jednak my nie będziemy ich W metodzie startApp tworzony jest obiekt a w zasadzie zająć obsługą zmian stanu midletu,
używać, do naszych potrzeb nie są one potrzebne. naszej klasy SimpleGameCanvas i ustawiany ja- które są wynikiem tzw. interrupcji (np. gdy w cza-
W naszym ulubionym IDE tworzymy pusty ko obiekt, który odbierał będzie wywołania me- sie działania gry ktoś do nas zadzwoni).
projekt zwykłej aplikacji Javowej. Jako katalog tody paint (czyli będzie nam służył do rysowa- Ostatnią metodą klasy SimpleGameMIDlet jest
z kodem źródłowym wskazujemy katalog [ka- nia). Ostatnią rzeczą, którą robimy przy uru- run. Stanowić ona będzie główną pętlę naszej gry.
talog projektów WTK]/SimpleGame/src. Musi- chamianiu aplikacji jest wywołanie metody Pierwszy raz zostaje ona wywołana pośrednio po
my także podłączyć biblioteki zawierające pa- callSerially, która poprosi midlet o wywoła- wywołaniu callSerially w metodzie startApp.
kiety javax.microedition.*, których będzie- nie metody run wskazanego obiektu (obiekt ten Metoda run wywołuje metodę tick obiektu
my używać; podłączamy pliki cldcapi10.jar i musi implementować interface Runnable). W canvas (jest on instancją klasy SimpleGameCanvas,
midpapi20.jar, które można znaleźć w katalo- naszym przypadku do callSerially przekazu- a jak wspomniałem wcześniej, klasa ta poza ryso-
gu lib pakietu WTK. jemy this, czyli zostanie wywołana metoda run waniem zajmuje się także całą logiką gry) w ce-
klasy SimpleGameMIDlet. lu aktualizacji stanu gry. Następnie, jeśli gra po-
Krok 4: Hello World – prosta aplikacja Kolejne dwie metody to destroyApp i winna toczyć się dalej prosimy o przerysowanie
W tym momencie powinniśmy być gotowi pauseApp. Są to abstrakcyjne metody klasy MI- ekranu (wywołanie canvas.repaint) oraz po-
do programowania. Ogólna architektura na-
szej gry wyglądać będzie następująco: Java Micro Edition
Java Micro Edition (JME, popularny też jest skrót J2ME) jest wersją języka Java zaprojektowaną z
• klasa SimpleGameMIDlet – punkt wejścia dla myślą o urządzeniach o ograniczonych możliwościach (najczęściej są to urządzenia przenośne,
aplikacji, tu odbędzie się podstawowa inicja- np. telefony, palmtopy). Od strony programisty na JME można patrzyć jako na Javę w wersji 1.4
lizacja; także tutaj znajduje się główna pętla z wyciętymi pewnymi pakietami i dodanymi kilkoma innymi, stworzonymi specjalnie z myślą o
JME. Co zostało usunięte, a co dodane określają tzw. konfiguracje, które definiują podstawowe
gry (która nie implementuje funkcjonalności
wymagania stawiane urządzeniom oraz podstawowe dostępne API. Na bazie konfiguracji two-
gry, a tylko naprzemiennie wywołuje metody rzone są tzw. profile, które określają dodatkowe funkcje dostępne dla programistów.
aktualizującą grę i rysującą); Dwie główne konfiguracje: CDC i CLDC (Słowniczek). CLDC jest powszechnie używane w telefo-
• klasa SimpleGameCanvas – tutaj znajduje się nach komórkowych. Najpopularniejszym profilem spotykanym u nas jest MIDP, bazujący na CLDC.
implementacja naszej gry, dwie główne meto-
dy to tick (tu się dzieje wszystko co nie jest
rysowaniem, np. obsługa wciśniętych klawi-
szy, update obiektów na planszy, wykrywa-
nie kolizji, liczenie punktów itd.) i paint (od-
powiedzialna za rysowanie); metody te będą
naprzemiennie wywoływane z pętli głównej
znajdującej się w SimpeGameMIDlet.

Na Listingu 1 i Listingu 2 znajdują się obie


wspomniane klasy. Jeżeli przepiszemy ich kod
to powinno być możliwe skompilowanie i uru-
chomienie naszej aplikacji. Ale najpierw przyj-
rzyjmy się kodowi.
Klasa SimpleGameMIDlet jest klasą dziedziczą-
cą z abstrakcyjnej klasy MIDlet. Każda aplikacja
JME (dla precyzji dodam, że profilu MIDP) mu-
si posiadać klasę dziedziczącą z MIDlet. W chwili
gdy użytkownik z menu telefonu uruchamia nasz
program, stworzona zostanie instancja naszej kla-
sy dziedziczącej z MIDlet, a następnie midlet zo-
stanie wprowadzony w swój cykl życia. Nie będę
wchodził w szczegóły dotyczące stanu życia mi-
dletu (polecam link z ramki W Sieci), wspomnę
tylko, że midlet może znajdować się w stanach Ac-

Rysunek 2. Podajemy nazwę projektu i nazwę


głównej klasy Rysunek 3. Opcje projektu, nam wystarczy tylko wybór platformy

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

nowne wywołanie metody run (przez wywoła- następnie odpalane w kolejności ich zgłoszenia. czyć naciskając RSK (patrz Słowniczek). Przyj-
nie metody callSerially). W przypadku gdy Dzięki temu mechanizmowi otrzymujemy na- rzyjmy się kodowi klasy SimpleGameCanvas że-
gra powinna się zakończyć wywołujemy meto- przemienne wykonywanie metod tick i paint by zobaczyć jak to działa (Listing 2).
dę notifyDestroyed, która wprowadzi midlet w klasy SimpleGameCanvas. Pierwszą rzeczą jaka rzuca się w oczy jest
stan Destroyed co powinno zaowocować wyłącze- dziedziczenie z klasy GameCanvas (która dzie-
niem i posprzątaniem po midlecie przez oprogra- Wprawka do gry dziczy z Canvas). W aplikacjach JME klasa,
mowanie telefonu. Na tym etapie nasza gra wyświetli żółte tło, ru- która będzie używana do rysowania musi dzie-
Prośby przerysowania i wywołania metody chomy napis Hello World!, kod ostatniego naci- dziczyć z klasy Canvas – zawiera ona metodę
run są wewnętrznie przez midlet kolejkowane, a śniętego klawisza oraz będzie ją można wyłą- paint, która jest wywoływana przez telefon w
celu przerysowania ekranu.
Listing 1. Klasa SimpleGameMIDlet
Nasza klasa dziedziczy z GameCanvas (a zatem
i z Canvas). GameCanvas jest dostępna w telefo-
import javax.microedition.lcdui.Display; nach z profilem MIDP2 i umożliwia (między
import javax.microedition.midlet.MIDlet; innymi) włączenie trybu pełnoekranowego na
import javax.microedition.midlet.MIDletStateChangeException; większości telefonów (na np. Motorolach zawsze
zostaje widoczny u góry pasek stanu telefonu).
public class SimpleGameMIDlet extends MIDlet implements Runnable Na początku klasy SimpleGameCanvas de-
{ finiujemy:
SimpleGameCanvas canvas;
• stałą kodu klawisza RSK (omówione dalej
protected void startApp() throws MIDletStateChangeException { w części poświęconej obsłudze klawiatury);
• zmienną lastKeyPressed zawierająca kod
if( canvas == null) ostatnio wciśniętego klawisza;
{ • zmienną isRunning – przechowuje infor-
// create canvas object: mację czy należy dalej kontynuować grę;
canvas = new SimpleGameCanvas(); • zmienną x – pozycja napisu Hello World!,
który będziemy wyświetlać.
// use our canvas for painting:
Display.getDisplay(this).setCurrent(canvas); Następnie mamy konstruktor, w którym wy-
wołujemy konstruktor GameCanvas (znacze-
// call run() nie przekazywanego parametru pozostawiam
Display.getDisplay(this).callSerially(this); do samodzielnego zbadania) oraz ustawiamy
} pełnoekranowy tryb wyświetlania.
} Kolejnym elementem jest metoda rysująca.
Jak już wspomniałem, wypełnia ona tło żółtym
protected void destroyApp(boolean unconditional) throws MIDletStateChangeException kolorem oraz rysuje napis Hello World! oraz kod
{ ostatniego wciśniętego klawisza. Wydaje mi się,
} że jej kod jest dość oczywisty. Warto jednak
wspomnieć o metodach:
protected void pauseApp() {
} • kolor rysowania ustawiamy meto-
dą setColor klasy Graphics, np.:
public void run() g.setColor(0xFFFF00), kolor podajemy ja-
{ ko jedną liczbę int w formacie 0xAARRG-
// update game: GBB (alpha, red, green, blue), w większości
canvas.tick();

//
if(canvas.isRunning())
{
// request repaint:
canvas.repaint();

// request to call run() again:


Display.getDisplay(this).callSerially(this);
}
else
{
// tell the phone that we've finished and MIDlet can be destroyed
this.notifyDestroyed();
}
}
} Rysunek 4. Emulator: przed uruchomieniem
midletu i po

56 09/2008
Podstawy tworzenia gier w JME

zastosowań możemy pominąć składową


Listing 2. Klasa SimpleGameCanvas alpha (przezroczystość);
• rozmiar ekranu (w pikselach) pobieramy
import javax.microedition.lcdui.Graphics; metodami getWidth i getHeight ; warto tu
import javax.microedition.lcdui.game.GameCanvas; wspomnieć że spora grupa telefonów ma
problemy z tą metodą i zwraca złe wymia-
public class SimpleGameCanvas extends GameCanvas ry, nie zdziw się więc jeśli na twoim telefo-
{ nie nie będzie wypełniony cały ekran;
public static final int KEY_RSK = -7; • do wypełnienia prostokątnego obszaru
ustawionym wcześniej kolorem służy me-
private boolean isRunning = true; // wheter game should still run toda fillRect klasy Graphics ;
• do rysowania tekstu ustawionym wcze-
private int x = 10; // x position of "Hello World" string śniej kolorem służy metoda drawString
private int lastKeyPressed; // last key pressed klasy Graphics .

public SimpleGameCanvas() Po metodzie rysującej znajduje się metoda tick ,


{ której zadaniem jest aktualizacja stanu gry. W
super(false); tej chwili wykonuje one tylko dwie czynności –
setFullScreenMode(true); zwiększa zmienną x aby napis Hello World! się
} przesuwał, oraz sprawdza czy wciśnięty został
klawisz RSK, jeśli tak to ustawia flagę informu-
public void paint(Graphics g) jącą o tym, że chcemy wyłączyć grę.
{ Wartość flagi zawierającej informację o wci-
System.out.println("paint"); śnięciu klawisza RSK jest zmieniana w me-
todzie keyPressed. Jest to metoda odziedzi-
// fill background: czona z klasy Canvas i jest ona wywoływana
g.setColor(0xFFFF00);
int w = getWidth();
int h = getHeight();
g.fillRect(0, 0, w, h);

// draw some texts:


g.setColor(0x0);
g.drawString("key: "+lastKeyPressed, 10, 10, Graphics.TOP | Graphics.LEFT); Rysunek 5. Elementy gry
g.drawString("Hello World!", x, 30, Graphics.TOP | Graphics.LEFT);
}
Słowniczek
public void tick()
• CLDC – Connected Limited Device Confi-
{ guration, najczęściej spotykana w tele-
System.out.println("tick"); fonach konfiguracja Javy Microedition;
• JME – Java Micro Edition, wersja Javy na
x++; urządzenia o ograniczonych zasobach
if(x > 200) {
(mało pamięci, wolne procesory);
• konfiguracja – specyfikacja podstawo-
x = 10;
wych wymagań i API które muszą po-
} siadać telefony;
} • MIDP – Mobile Information Device Pro-
file, najczęściej stosowanych w telefo-
protected void keyPressed(int key) nach profil Javy Microedition, stworzo-
ny na bazie CLDC;
{
• OTA – over the air, metoda wgrywania
lastKeyPressed = key; aplikacji na telefon przez ściągnięcie ich
na telefonie z sieci (najczęściej przez in-
if(key == KEY_RSK) ternet);
{ • profil – specyfikacja dodatkowych wy-
// this will result in stop calling SimpleGameMIDlet.run
magań i API zbudowanych na bazie
określonej konfiguracji;
isRunning = false;
• RSK – right soft key, prawy soft key, patrz
} soft keys;
} • soft keys – dwa klawisze (lewy i prawy,
czasem jeszcze trzeci środkowy), które
public boolean isRunning() najczęściej znajdują się bezpośrednio
pod ekranem telefonu i są standardo-
{
wo używane w menu telefonu do wy-
return isRunning; borów typu tak/nie;
} • WTK – Wireless Toolkit, pakiet firmy Sun
} potrzebny do tworzenia aplikacji JME.

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

przez telefon gdy zostanie wciśnięty jakiś kla- Hello World!. Istne szaleństwo (Rysunek 4). skrócie nazywane przeze mnie BT). Oczywiście
wisz. Analogicznie klasa Canvas posiada meto- Bardzo przydatną cechą emulatora jest kon- zarówno telefon jak i komputer muszą posia-
dę keyReleased, wywoływaną gdy jakiś klawisz sola. Wszystkie komunikaty normalnie wy- dać BT. W przypadku komputera wiele lapto-
przestaje być wciśnięty. świetlane w konsoli będą widoczne w oknie pów posiada wbudowane urządzenie BT. Moż-
WTK (np. wywołania System.out.println). na także kupić BT podłączany do komputera
Krok 5: Zrobienie builda Polecam przeprowadzenie eksperymentu i do- przez port USB.
Wiemy już jak wygląda kod naszego programu. danie na początku metod tick i paint wywo- Procedura wgrania midletu na większość tele-
Czas go skompilować – należy kliknąć przycisk łań, odpowiednio: System.out.println(„tic fonów polega na wysłaniu do telefonu pliku jar.
Build w głównym oknie WTK. Jeśli kod nie za- k”) i System.out.println(„paint”). W kon- Niektóre telefony (mniejszość) wymagają także
wiera błędów pojawi się napis Build complete. W soli WTK, po uruchomieniu midletu, powinny wgrania pliku jad lub połączenia BT przez spe-
przypadku błędów zostaniemy o tym poinformo- na przemian wypisywać się te dwa napisy. cjalny program. Jednak w większości wypadków
wani, a błędy zostaną wypisane w oknie WTK. po prosty wgrywamy plik jar na telefon.
Krok 7: Wgranie na telefon Aby tego dokonać należy włączyć Bluetooth
Krok 6: Uruchomienie w emulatorze Aby wgrać midlet na telefon musimy utworzyć w menu telefonu oraz ustawić tryb widoczno-
Zanim spróbujemy uruchomić naszą grę na te- pakiet dystrybucyjny (para plików jar/jad). W ści (żeby inne urządzenia, np. komputer, mogły
lefonie warto sprawdzić jej działanie w emula- pasku menu WTK wybieramy Project -> Packa- wykryć telefon). Jeśli posiadamy dobrze skon-
torze. Jest to bardzo proste – klikamy przycisk ge -> Create Package. Spowoduje to skompilowa- figurowany BT wystarczy (w Windowsie) klik-
Run z głównego okna WTK. nie aplikacji i umieszczenie klas oraz plików za- nąć na pliku jar prawym guzikiem myszy, a na-
Przed uruchomieniem gry należy ją zbudo- sobów (obrazki, dźwięki itp.) w pliku jar oraz stępnie z menu kontekstowego wybrać Wyślij
wać. Jest to szczególnie ważne jeżeli dokonamy stworzenie pliku jad. Umieszczone zostaną one do -> Bluetooth. W zależności od sterowników
zmian w kodzie i chcemy zobaczyć ich działa- w [katalog projektów WTK]/SimpleGame/bin. BT w naszym systemie kolejne menu mogą wy-
nie – po każdej zmianie należy ponownie zbu- Teraz czas na wgranie gotowej do dystrybucji glądać różnie ale najczęściej sprowadzają się do
dować projekt. aplikacji na telefon. Sposobów jest kilka, a ten następujących kroków:
Jeżeli wszystko przebiegło sprawnie zobaczy- który wybierzesz zależy od twojego telefonu.
my okno emulatora, a w nim nazwę naszego • wyszukaj urządzenia BT;
midletu. Myszką należy kliknąć na RSK telefo- Bluetooth • gdy pojawi się spis urządzeń wybieramy
nu aby uruchomić midlet. Naszym oczom uka- Najwygodniejszą chyba metodą wgrywania nasz telefon;
rze się żółty ekran z poruszającym się napisem aplikacji na telefony jest Bluetooth (dalej w • zostaniemy poproszeni o podanie hasła
PIN – wpisujemy coś, np. 1234;
• telefon powinien zareagować i powiado-
mić nas o przychodzącym połączeniu –
akceptujemy połączenie i wpisujemy taki
sam kod PIN jak wcześniej na kompute-
Loading
rze;
• powinniśmy zostać zapytani o chęć zain-
stalowania aplikacji;
aplikacja instaluje się na telefonie.
Splash
Port podczerwieni
3s delay Procedura wgrywania przez port podczerwień
jest bardzo podobna do wgrywania przez Blu-
any key pressed etooth. Umieszczamy telefon względem kom-
Intro Gameplay
putera tak żeby czujniki podczerwieni obu
urządzeń były w siebie wycelowane. Następnie
musimy nawiązać połączenie między telefo-
any key pressed [end game conditions] nem i komputerem. Jeśli się to uda to w menu
Wyślij Do dostępna będzie opcja wysłania pliku
do podłączonego komputera (ikonka połącze-
Game over nia podczerwienią), którym na prawdę będzie
nasz telefon. Po przesłaniu pliku na telefon po-
winien uruchomiać się proces instalacji.
Rysunek 6. Stany gry
OTA
Listing 3. Stany gry Over The Air (OTA) to nazwa sposobu dys-
trybucji aplikacji poprzez ściągnięcie jej na
public static final short STATE_Loading = 1; // ladowanie gry telefon przez sieć operatora, najczęściej uży-
public static final short STATE_Splash = 2; // ekran z tytulem gry wając połączenia GPRS.
public static final short STATE_Intro = 3; // tekst informacyjny przed gra Dla nas oznacza to tyle, że wgrywamy pli-
public static final short STATE_Gameplay = 4; // rozgrywka ki jad i jar na jakiś serwer, skąd dostępne będą
public static final short STATE_GameOver = 5; // po grze przez HTTP (czyli w praktyce przez wpisanie
adresu pliku w przeglądarce internetowej). Te-
// obecny stan gry: lefon musimy skonfigurować aby można było z
protected short state = STATE_Loading; niego wchodzić na strony internetowe, odpala-
my przeglądarkę wbudowaną w telefon i w po-

58 09/2008
Podstawy tworzenia gier w JME

lu adresu strony do otworzenia wpisujemy link


Listing 4. Metoda tick, decydowanie co zaktualizować to pliku jad. Plik jad powinien się ściągnąć, a te-
lefon powinien zainicjować instalację midletu.
public void tick()
{ Czas na grę
if (isKeyTyped(KEY_RSK)) Na tym etapie mamy działającą aplikację JME,
{ która coś rysuje i odświeża się, możemy ją zbudo-
// wcisniety RSK - wychdzimy z gry wać oraz uruchomić w emulatorze i na telefonie.
this.isRunning = false; Mamy więc punkt wyjściowy do stworzenia gry.
return; Czas zatem zabrać się za grę – będzie to pro-
} sta strzelanka o jakże wysublimowanym tytule
Attack of the Killer Space Monsters. Design gry
/* wygląda następująco:
* --- obliczamy czas miedzy klatkami ---
*/ • gracz porusza w prawo/lewo statkiem ko-
long currentTime = System.currentTimeMillis(); smicznym znajdującym się na dole ekranu;
• statek gracza posiada dwa działka, z pra-
if(this.lastFrameTime == 0) { // to wystapi na samym poczatku dzialania gry wej i lewej strony;
this.lastFrameTime = currentTime; • gracz wciskając klawisz wyboru na telefo-
} nie strzela z działek, na przemian z lewego
i prawego;
int tickTime = (int)(currentTime – this.lastFrameTime); • zadaniem gracza jest strzelanie do potwo-
rów, jeden celny strzał zabija potwora;
• potwory pojawiają się u góry ekranu i po-
/* ruszają w dół;
* --- aktualizacja gry --- • potwory pojawiają się w falach, każda kolej-
*/ na fala generuje większą ilość potworów, po-
switch(this.state) jawiają się one częściej i poruszają szybciej;
{ • wystrzał odejmuje 10 punktów graczowi;
case STATE_Loading: • trafienie potwora usuwa go z gry i daje gra-
tickLoading(); czowi 20 punktów;
break; • gracz przegrywa gdy choć jeden potwór
dotrze do dołu ekranu bądź zderzy się ze
case STATE_Splash: statkiem gracza.
tickSplash(tickTime);
break; Rysunek 5 przedstawia wszystkie elementy gra-
ficzne występujące w grze. Kolejno są to: kosmicz-
case STATE_Intro: ny potwór, statek gracza i dwie klatki animacji po-
if(isAnyKeyPressed()) cisku plazmowego, którymi strzela gracz.
{
changeState(STATE_Gameplay); Architektura gry
} Cały kod gry zajmuje sporo miejsca i nie zmie-
break; ściłby się cały w artykule. Gotowa gra (kod źró-
dłowy wraz z projektem WTK oraz pliki jad/
case STATE_Gameplay: jar) dostępna jest na stronie SDJ. Zachęcam do
tickGame(tickTime); ściągnięcia kodu i analizowanie go wraz z czyta-
break; niem artykułu.
Podstawą gry są stworzone przez nas klasy
case STATE_GameOver: klasy SimpleGameMIDlet i SimpleGameCanvas.
if(isAnyKeyPressed()) Pierwsza z nich w ogóle się nie zmieni wzglę-
{ dem tego co do tej pory stworzyliśmy. Nato-
changeState(STATE_Intro); miast druga będzie stanowić trzon gry odpo-
} wiedzialny m.in. za: zarządzanie stanami i logi-
break; ką gry, ładowanie potrzebnych zasobów, reago-
} waniem na input gracza, aktualizowaniem i ry-
sowaniem obiektów w świecie gry.
Dodatkowo stworzymy klasy reprezentują-
/* ce obiekty w świecie gry: klasę Actor stanowią-
* --- zapisywanie wartosci z obecnej klatki, beda uzyte w nastepnej klatce --- cą klasę bazową dla klas Monster, Projectile i
*/ SpaceShip.
this.prevKeysState = this.currKeysState; Stworzymy także klasy pomocnicze:
this.lastFrameTime = currentTime; ResManager (menadżer zasobów) i FP (arytmety-
} ka stałoprzecinkowa) oraz klasy stanowiące tylko
zbiory stałych DeviceConstants (różne stałe spe-

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

cyficzne dla telefonu, dla którego tworzymy grę) i prawdziwych enumeracji) wraz ze zmienną Punktami wyjścia dla operacji przeprowadza-
ResConstants (identyfikatory zasobów). state, określającą aktualny stan gry. Do tego nych w każdej klatce są metody tick i paint (wy-
dochodzą metody changeState (zmienia stan), woływane naprzemiennie w głównej pętli gry, w
Maszyna stanów onStateLeave (wywoływana z changeState klasie SimpleGameMIDlet, patrz Listing 1). W
Sama gra na wysokim poziomie abstrakcji jest tuż przed zmianą stanu) oraz onStateEnter nich na podstawie aktualnego stanu gry podejmo-
maszyną stanów (Rysunek 6), która zaimple- (wywoływana z changeState tuż po zmianie wana jest decyzja co w danym momencie zrobić.
mentowana jest w bardzo prosty sposób – sta- stanu). Polecam wyszukanie w kodzie wystą- Przyjrzyjmy się Listingowi 4, zawierającemu
ny zdefiniowane są jako niby-enumeracje (Li- pień metody changState, da to dobry obraz nową metodę tick. Wykonuje ona następujące
sting 3; często stosowane w JME gdzie nie ma implementacji przejść między stanami. czynności:

Listing 5a. Decyzja co narysować w zależności od stanu • sprawdzanie czy wciśnięty został RSK, je-
śli tak ustawia flagę która spowoduje za-
public void paint(Graphics g) mknięcie gry;
{ • obliczanie czasu pomiędzy klatkami (tzw.
switch(state) tick time); metoda System.currentTime
{ Millis() zwraca aktualny czas (ilość mili-
case STATE_Loading: sekund od 1 stycznia 1970 roku); tick time
paintLoading(g); będziemy używać do poruszania obiektów;
break; • sprawdzany jest aktualny stan gry i w zależ-
ności od niego wywoływane są odpowied-
case STATE_Splash: nie metody, specyficzne dla danego stanu.
paintSplash(g);
break; Analogicznie do metody tick działa metoda
paint (Listing 5a) – sprawdzany jest stan gry
default: i wywoływana jest odpowiednia metoda ry-
paintGame(g); sująca, aczkolwiek część decyzji odnośnie te-
} go co ma być narysowane trafia to metody
} paintGame (Listing 5b).

Listing 5b. Dalszy ciąg decydowania co narysować Zasoby – ładowanie i zarządzanie


Nasza gra ładuje potrzebne jej zasoby (zaledwie
private void paintGame(Graphics g) cztery obrazki) w metodzie tickLoading. Me-
{ toda ta jest wywoływana co klatkę tak długo jak
// narysuj obiekty w swiecie gry: gra znajduje się w stanie STATE_Loading, a w
paintGameField(g); każdym jej wywołaniu ładujemy kolejne części
potrzebnych nam zasobów. Do ładowania uży-
// narysuj elementy nad obszarem gry: wamy obiektu klasy ResManager.
g.setColor(0xFFFFFF); ResManager to menadżer zasobów – w na-
szym przypadku kontroluje on obrazki i teksty,
switch(state) i przechowuje referencje do nich. W klasach
{ gry nie będziemy bezpośrednio trzymać refe-
case STATE_Intro: rencji do obrazków ani tekstów, w zamian bę-
paintIntro(g); dziemy przechowywać ich identyfikatory (zde-
break;

case STATE_Gameplay:
paintHUD(g);
break;

case STATE_GameOver:
paintHUD(g);
paintGameOver(g);
break;
}
}

Listing 6. Ładowanie obrazu z pliku znajdującego się w pliku jar gry


// pobieranie strumienia do pliku znajdujacego sie w jar:
in = this.getClass().getResourceAsStream(fileName);

// tworzenie obrazu ze strumienia:


images[imageId] = Image.createImage(in);

Rysunek 7. Screen z gry, z emulatora

60 09/2008
Podstawy tworzenia gier w JME

finiowane w klasie ResConstants) i na żądanie, co prawda metody keyPressed i keyReleased Metod pressed używa się do sprawdzania cią-
używając identyfikatora, pobierać potrzebny ale brak metod, które można odpytać w do- głego inputu z klawiatury, np. gracz musi ca-
obrazek lub tekst z menadżera. W dowolnym wolnym momencie, np. w kodzie decydują- ły czas trzymać wciśnięty klawisz prawo/lewo
momencie możemy też usunąć wszystkie zaso- cym o przejściu między stanami gry. Dlatego w żeby poruszać statkiem kosmicznym. Nato-
by przechowywane przez menadżera. SimpleGameCanvas takie metody zostały zaim- miast metod typed używa się gdy reakcja na
Menadżer wewnętrznie przechowuje obrazy plementowane, są to: wciśnięcie klawisza jest impulsowa, tzn. gracz
i teksty w zwykłych tablicach. Identyfikatory za- musi puścić klawisz i wcisnąć go jeszcze raz że-
sobów to po prostu indeksy do tablic. Jeśli więc • – czy dany klawisz jest w
isKeyPressed by ponownie wywołać akcję – np. strzelanie z
zasób jest załadowany to pobranie go jest bardzo obecnej klatce wciśnięty; karabinu.
szybkie i odbywa się przez wyciągnięcie elementu • isAnyKeyPressed – czy jakikolwiek kla- Analizę implementacji powyższych me-
tablicy. Należy przy tym uważać bo jeśli zasób nie wisz jest w obecnej klatce wciśnięty; tod zostawiam we własnym zakresie czytel-
był załadowany to pobranie go zwróci nam null • isKeyTyped – czy dany klawisz został w nikowi. Warto jednak wspomnieć o proble-
(stosuje się też menadżery, w których nie trzeba obecnej klatce wciśnięty (tzn. w poprzed- mie jakim jest fakt, że producenci telefonów
jawnie ładować zasobów, przy pierwszej próbie niej nie był wciśnięty, a w obecnej jest). stosują różne kody klawiszy. Nasza gra może
pobrania zasobu menadżer sam go załaduje).
Schemat używania naszego menadżera za-
sobów jest następujący, na przykładzie ładowa- W Sieci
nia obrazów: • http://java.sun.com/products/sjwtoolkit/download.html – strona, z której można ściągnąć WTK
• http://developers.sun.com/mobility/learn/midp/lifecycle/ – cykl życia midletu
• w fazie ładowania (metoda tickLoading ) • http://www.humanbalance.net/gale/us/download.html – program GraphicsGale, bardzo do-
wywołujemy metodę loadImage przeka- bre narzędzie do przygotowywania plików PNG dla gier JME
zując identyfikator obrazu;
• w kodzie gry, np. podczas rysowania mu-
simy dostać obiekt klasy Image , wywołu-
jemy więc metodę getImage przekazując
PNG dla JME
Tworząc grafiki do gier JME należy mieć na uwadze kilka rzeczy: rozmiar aplikacji, przezroczy-
identyfikator obrazu; stość oraz rozmaite niedoskonałości telefonów.
• w chwili gdy potrzebujemy usunąć obrazki
z pamięci (najczęściej gdy przeładowujemy Rozmiar
W JME zawsze trzeba liczyć się z rozmiarem aplikacji, dlatego praktyką jest tworzenie jak naj-
zasoby, np. ładując nową plansze czy prze-
mniejszych plików graficznych (w sensie ilości bajtów).
chodząc między różnymi modułami gry) Pierwszą podstawową techniką redukcji rozmiaru jest zapisywanie plików z użyciem palety (za-
wystarczy wywołać freeAllImages, dzięki miast zapisywania dla każdego piksela kanałów RGB). Im mniej kolorów w palecie tym obraz jest
temu że jedyne referencje do obrazów były mniejszy (czasami walczy się o kilkadziesiąt bajtów). Często stajemy przed dylematem – czy jesz-
trzymane przez menadżera garbage collector cze zredukować paletę (kosztem jakości) i zyskać trochę miejsca. Najczęściej stosuje się kompro-
będzie mógł usunąć obrazy z pamięci. mis – redukcja ilości kolorów tak, że prawie nie widać różnicy, a rozmiar jest odczuwalnie mniej-
szy od oryginału.
Drugą techniką jest stosowanie programów optymalizujących pliki PNG. Bardzo często pliki
Ogromną zaletą używania menadżera za- stworzone w popularnych programach graficznych posiadają zapisane różne dodatkowe dane,
sobów jest kontrola pamięci. Jeśli będziemy nie będące danymi obrazu, a sam obraz jest zapisany nieoszczędnie. Istnieje kilka narzędzi (naj-
trzymać się schematu, że nasz kod przecho- częściej w formie programu uruchamianego z linii komend), które służą do czyszczenia i opty-
wuje tylko identyfikatory zasobów zamiast re- malizacji plików PNG. Polecam poszperanie w sieci i poczytanie o takich programach jak: pngo-
ferencji do nich, możemy praktycznie jawnie ut, pngcrush, pngcrunch czy pngshrink.
usuwać zasoby z pamięci. Przezroczystość
Co do samych zasobów – aby móc w czasie Format PNG daje nam dwie możliwości zapisania informacji o przezroczystości. Możemy albo za-
działania midletu załadować jakiś plik, plik ten wrzeć w pliku kanał alfa (czyli dla każdego piksela zapisujemy jego stopień przezroczystości, w
musi znajdować się w archiwum jar midletu. Aby skali 0-255) albo użyć palety i wskazać jeden dowolny jej kolor z palety jako przezroczysty (tele-
fon rysując naszą grafikę nie będzie rysował pikseli o kolorze oznaczonym jako przezroczysty).
to nastąpiło umieszczamy pliki zasobów w podka-
Jeśli chodzi o kanał alfa to bardzo dużo telefonów sobie z nim nie radzi i najczęściej opcja ta jest
talogu res katalogu projektu WTK naszej gry. pomijana. Jeśli jednak zależy nam na efektach opartych na częściowej przezroczystości to mu-
A jak odczytać dane z pliku, który znaj- simy liczyć się z tym, że będą dostępne na tylko niektóre telefony. Na pozostałe trzeba będzie
duje się w archiwum jar? Używając metody tworzyć jakieś techniki zastępcze.
getResourceAsStream klasy Class, która zwra- Jeśli chodzi o przezroczystość jednego koloru, to wiele telefonów zakłada, że kolor oznaczony
ca nam strumień do czytania z pliku. Listing jako przezroczysty jest pierwszym kolorem w palecie. Jeśli tak nie jest informacja o przezroczy-
stości jest na tych telefonach pomijana. Wymaganie to jest problematyczne gdyż większość po-
6 przedstawia przykład ładowania obrazka za- pularnych programów graficznych nie daje nam możliwości bezpośredniego operowania na pa-
czerpnięty z klasy ResManager. lecie. Z tego powodu często zdarza się, ze nie jesteśmy w stanie w łatwy sposób wymusić aby ko-
Jeszcze słowo o obrazkach – standardem w lor przezroczysty znajdował się na pierwszym miejscu.
JME jest obsługa obrazów w formacie PNG. Polecam zapoznanie się z programem GraphicsGale (patrz ramka W Sieci), dzięki któremu można
Teoretycznie możemy użyć dowolnego takiego uniknąć wielu frustracji, a który pozwala na różne przydatne operacje dotyczące palety.
pliku, jednak w praktyce stosuje się kilka tech- Smaczki
nik aby uniknąć rozmaitych problemów (patrz Po za opisanymi wcześniej problemami zdarzają się (rzadko, ale się zdarzają, i dotyczą konkret-
Ramka PNG dla JME). nych modeli telefonów) różne bardzo dziwne rzeczy. Spotkałem się z kilkoma telefonami, któ-
re potrafiły wczytać grafiki PNG tylko o parzystej szerokości obrazu. Pewne telefony traktują ko-
Input z klawiatury lor biały zawsze jako przezroczysty, niezależnie od tego co zapisane jest w pliku. Do tego zawsze
trzeba nastawić się na możliwość, że telefon po prostu odmówi wczytania obrazu. Jeżeli przytra-
i problemy z telefonami fi ci się taka właśnie sytuacja i mimo wszelkich prób pliku wczytać się nie uda – spróbuj go otwo-
Tworząc grę bardzo wygodnie jest posiadać rzyć i zapisać w jakimś programie graficznym, którego to dej pory nie używałeś. Zdarzyło mi się
zestaw metod do sprawdzania stanu klawi- kilka razy, gdy to magicznie pomogło.
szy w danej klatce. Klasa Canvas oferuje nam

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

Listing 7. Podstawowe operacje arytmetyki stałoprzecinkowej


public class FP czesc ulamkowa)
{ public static int toInt(int fp_value)
// ilosc bitow przeznaczonych na czesc ulamkowa {
public final static int BIT_SHIFT = 16; return (fp_value >> 16);
// zwraca reprezentacje fixed-point podanej wartosci }
public static int toFP(int value) // mnozenie dwoch liczb fixed-point, wynik tez jest FP
{ public static int mulFP(long fp_a, long fp_b)
return (value << 16); {
} return (int)((fp_a * fp_b) >> BIT_SHIFT);
// zwraca reprezentacje fixed-point podanego ulamka }
zwyklego (a/b) // dzielenie dwoch liczb fixed-point, wynik tez jest FP
public static int toFP(int a, int b) public static int divFP(int fp_a, int fp_b)
{ {
return (a << BIT_SHIFT) / b; return (int)((long)(fp_a) << BIT_SHIFT / fp_b);
} }
// zamienia wartos fixed-point na zwykla liczbe (tracimy }

Listing 8. Klasa Actor

public class Actor {


{ case DRAW_Image:
// mozliwe tryby rysowania aktora: {
public static final byte DRAW_Image = 0; int x = FP.toInt(fp_posX) - refX;
public static final byte DRAW_Line = 1; int y = FP.toInt(fp_posY) - refY;
public static final byte DRAW_Box = 2; Image img = ResManager.getInstance().getImage(im
public static final byte DRAW_Custom = 10; ageId);
public static final byte DRAW_None = 11; g.drawImage(img, x, y, Graphics.LEFT |
Graphics.TOP);
byte drawType = DRAW_Box; // domyslnie aktor rysowany jest break;
jako kwadrat }
int color = 0xFFFFFF; // uzywane przez typy: line, box
short imageId; // uzywane przez typ : image case DRAW_Box:
{
// pozycja w swiecie: int x = FP.toInt(fp_posX) - refX;
int fp_posX; int y = FP.toInt(fp_posY) - refY;
int fp_posY; g.setColor(color);
g.drawRect(x, y, width, height);
// wektor predkosci: break;
int fp_velX; }
int fp_velY;
case DRAW_Line:
// punkt referencyjny (offset wzgledem gornego-lewego rogu) {
short refX = 10; int x = FP.toInt(fp_posX) - refX;
short refY = 10; int y = FP.toInt(fp_posY) - refY;
g.setColor(color);
// rozmiar: g.drawLine(x, y, x+width, y+height);
short width = 20; break;
short height = 20; }
}
// flaga oznaczajaca czy obiekt jest do usuniecia ze swiata gry: }
private boolean toBeDestroyed = false;
public void destroy()
public void tick(int tickTime, int fp_dt) {
{ toBeDestroyed = true;
// na podstawie aktualnej predkosci wyznacz nowe polozenie: }
fp_posX += FP.mulFP(fp_dt, fp_velX);
fp_posY += FP.mulFP(fp_dt, fp_velY); public boolean isToBeDestroyed()
} {
return toBeDestroyed;
public void paint(Graphics g) }
{ }
switch(drawType)

62 09/2008
Podstawy tworzenia gier w JME

otrzymywać różne kody w wywołaniach me- Jako, że wartości fixed-point są przechowywa- dodawanie przedrostka fp_ do nazw wszystkich
tod keyPressed i keyReleased w zależności ne w zmiennych typu int problemem staje się zmiennych, które będą przechowywać wartości
od telefonu. rozróżnienie, która liczba jest normalna, a któ- fixed-point. Dzięki temu zawsze wiemy z jaką
Zresztą różnych niespójności pomiędzy pro- ra jest wartością fixed-pint. Dobrą praktyką jest liczbą mamy do czynienia.
ducentami (a często i pomiędzy modelami tej
samej firmy) jest dużo więcej. Ponadto, często Listing 9a. Fragment metody tickGame, który aktualizuje aktorów
zdarzają się błędy w implementacji Javy na te-
lefonach i niektóre metody nie działają tak // update monsters:
jak powinny. Z tych powodów powstała klasa for(int i=0; i < enemies.size(); i++)
DeviceConstants, która zwiera stałe wartości, {
które mogą różnić się między telefonami lub Actor monster = (Actor)enemies.elementAt(i);
ich otrzymanie w czasie działania midletu mo- monster.tick(tickTime, fp_dt);
że być problematyczne. W chwili obecnej znaj- }
dują się tam:
// update projectiles:
• rozdzielczość ekranu – tą informację spo- for(int i=0; i < projectiles.size(); i++)
ro telefonów zwraca błędnie w czasie dzia- {
łania midletu; Actor projectile = (Actor)projectiles.elementAt(i);
• kody klawiszy – tutaj jest duża niespój- projectile.tick(tickTime, fp_dt);
ność wśród producentów. }

Jeśli na twoim telefonie masz problemy z roz- // update player ship:


dzielczością lub klawiszami, spróbuj dostoso- boolean left = isKeyPressed(KEY_LEFT);
wać stałe z DeviceConstants. boolean right = isKeyPressed(KEY_RIGHT);
W profesjonalnych build systemach uży- boolean fire = isKeyTyped(KEY_SELECT);
wanych to tworzenia aplikacji i gier JME
często stosuje się bazy danych z ogrom- playerShip.setSteering(left, right, fire);
ną ilością parametrów opisujących poszcze- playerShip.tick(tickTime, fp_dt);
gólne modele telefonów. Kod klas typu
DeviceConstants nie zawiera wartości wpi- Listing 9b. Metoda rysująca aktorów
sanych na sztywno tylko referencje do pól ba- private void paintGameField(Graphics g)

zy. W fazie budowania wstawiane są tam kon- {


kretne wartości dla telefonu, dla którego robi // fill background:
się builda (najczęściej używa się do tego celu g.setColor(0x0);
preprocesora). g.fillRect(0, 0, DeviceConstants.screenWidth, DeviceConstants.screenHeight);

Arytmetyka stałoprzecinkowa // paint monsters:


Bardzo często w grach potrzebujemy ułamków. if(enemies != null)
Pozycje postaci, prędkości, kod liczący fizykę i {
wiele innych modułów używa ułamków. for(int i=0; i < enemies.size(); i++)
Niestety w konfiguracji CLDC1.0 nie mamy {
typu float. Co prawda pojawił się w CLDC1.1, Actor monster = (Actor)enemies.elementAt(i);
ale procesory telefonów najczęściej nie mają jed- monster.paint(g);
nostki FPU do obliczeń zmiennoprzecinkowych }
więc obliczenia na floatach są strasznie powolne. }
Ponadto ogromna grupa telefonów na rynku to
CLDC1.0. // paint projectiles:
Bardzo łatwo i wydajnie można poradzić so- if(projectiles != null)
bie z tym problemem stosując tzw. arytmety- {
kę stałoprzecinkową (fixed point). Przeznacza- for(int i=0; i < projectiles.size(); i++)
my pewną ilość bitów zwykłej liczby całkowitej {
na część ułamkową. Na przykład jeśli przezna- Actor projectile = (Actor)projectiles.elementAt(i);
czymy 16 bitów na część ułamkową to liczba 1 projectile.paint(g);
będzie reprezentowana przez wartość 65536, }
liczba 0.5 przez wartość 32768. }
Wartości fixed-point można dodawać i odej-
mować jak zwykłe liczby: 1+0.5 = 1.5 jest repre- // paint player's ship:
zentowane przez 65536+32768 = 98304. Na- if(playerShip != null)
tomiast mnożenie i dzielenie wymaga dodatko- {
wych operacji. playerShip.paint(g);
Do wygodnej obsługi operacji na liczbach fi- }
xed-point używamy klasy FP. Jej kod znajduje się }
na Listingu 7. Komentarze metod opisują krót-
ko ich zastosowanie.

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

Obiekty w świecie gry sy SpaceShip odpowiedzialna jest za reagowa- symulacja. Jednak zostaje nam jeszcze jeden ele-
Czas zająć się tym co dzieje się w czasie działa- nie na input gracza, poruszanie statku w obrę- ment – coś co decyduje czy gra się skończyła czy
nia gry. Jak to jest zrobione, że pojawiają się po- bie ekranu i tworzenie nowych pocisków (gry nie, ile gracz ma punktów i za co je zdobywa, co
twory, gracz może poruszać statkiem i że poci- gracz strzeli), a obiekty klasy Projectile w cza- się ma stać gry trafimy potwora lub gdy potwór
ski trafiają (lub nie) w przeciwników. sie swojej aktualizacji obsługują zmianę używa- pożre statek gracza – logika gry.
Zacznijmy od klasy Actor (Listing 8). Defi- nego podczas rysowania obrazka, przez co ma- W naszej grze większość logiki zawarta jest w
niuje ona obiekt, który jest elementem świata my prosty efekt animacji lecącego pocisku. kilku zdefiniowanych stałych i kilku metodach
gry, pewnej wirtualnej przestrzeni. Dalej będę Poza tym, w metodzie tickGame, po zaktu- (Listing 10) wywoływanych w czasie trwania
nazywał takie obiekty aktorami. Klasa Actor alizowaniu aktorów, dzieje się kilka rzeczy do- symulacji gdy zaistnieją pewne okoliczności.
definiuje takie cechy jak: wygląd, rozmiar, po- tyczących świata gry: Inaczej mówiąc, tocząca się w czasie gry sy-
zycja w świecie, prędkość poruszania się. Do te- mulacja informuje o wystąpieniu pewnych zda-
go dochodzą funkcje tick/paint, które mają • obliczany jest czas jaki pozostał do wyge- rzeń, a kod logiki gry reaguje – zmienia ilość
aktualizować i rysować aktora. nerowania nowego potwora – co klatka punktów, usuwa aktorów, zmienia stan gry.
Klasa Actor przewidziana jest by z niej dzie- odejmowany jest tick time; jeśli czas do-
dziczyć. I robimy to. W naszej grze nie uży- biegł do zera tworzony jest nowy potwór Podsumowanie i co dalej
wamy instancji klasy Actor ale jej podklas: (metoda spawnMonster, losowane są jego Nauczyliśmy się jak stworzyć prostą aplika-
Monster, Projectile, SpaceShip. pozycja i parametry); cję JME, którą można wykorzystać jako bazę
Chciałbym także zauważyć, że klasa Actor • sprawdzane jest czy pociski i potwory nie do tworzenia własnych projektów. Mam tak-
korzysta z pewnych wcześniej opisanych me- wyszły poza obszar gry – jeśli tak, są za- że nadzieję, że przybliżyłem pewne zagadnie-
chanizmów, np. pozycja i prędkość zapisana znaczane do usunięcia ze świata gry (wy- nia dotyczące szeroko pojętego programowania
jest jako fixed-point, pole imageId definiuje jaki wołanie na nich metody destroy); gier, w szczególności w aspekcie JME. Ponadto
obrazek będzie używany do rysowania aktora, a • sprawdzane są kolizje (używana metoda przedstawiłem przykład architektury prostej
sam kod rysujący używa resource managera. actorsIntersect) – kolizje oparte są na te- gry (oszałamiający efekt na Rysunku 7).
Wszyscy aktorzy w naszej grze przechowy- ście przecięcia dwóch prostokątów; spraw- Jeszcze raz zachęcam do analizy kodu (jak
wani są w klasie SimpleGameCanvas. Stwo- dzamy kolizje między pociskami i potwora- już wspomniałem w trakcie artykułu, kod do-
rzone są dwa obiekty klasy Vector: enemies i mi oraz między statkiem gracza i potworami; stępny jest na stronie SDJ) gdyż zawiera on peł-
projectiles, oraz referencja do statku kosmicz- • na końcu usuwani są aktorzy, którzy w ną działającą grę, a niestety nie wszystko dało
nego kontrolowanego przez gracza: playerShip. czasie przebiegu gry zostali oznaczeni jako się zmieścić w artykule i na listingach.
W trakcie samej rozgrywki (stan STATE_ do usunięcia. Kończąc chciałbym jeszcze wspomnieć o rze-
Gameplay) co klatka na wszystkich aktorach czywistym świecie, w którym praktycznie na każ-
wywoływane są metody tick i paint (Listingi Logika gry dy telefon (ewentualnie grupę kilku telefonów)
9a i 9b). Klasy dziedziczące z klasy Actor mogą Wiemy już, że co klatka wszyscy aktorzy są aktu- trzeba wykonać porting, tzn. dostosować grę tak
dodawać funkcjonalność, np. metoda tick kla- alizowani i rysowani. Cały czas toczy się swoista żeby wszystko działało jak trzeba na konkretnym
telefonie. A niestety bardzo często pojawiają się
Listing 10. Obsługa różnych zdarzeń w czasie gry niespodziewane bugi mimo iż gra chodzi wspa-
niale w emulatorze, a nawet na kilku telefonach
private static final int MONSTER_KILL_AWARD = 20; – na kilku innych na pewno coś się zepsuje.
private static final int FIRE_PENALTY = -10; Dlatego jeśli zainteresowało cię robienie gier w
JME zachęcam do zapoznania się z jakimś build
// gdy gracz wystrzelil pocisk systemem (np. J2ME Polish) oraz do testowania
void onProjectileFired(Projectile projectile) swoich gier na prawdziwych telefonach. No i oczy-
{ wiście do rozwijania swojej wiedzy o tworzeniu
projectiles.addElement(projectile); gier – wiele technik znanych z pecetów lub konsol
score += FIRE_PENALTY; można stosować z powodzeniem także w medium
} jakim są telefony komórkowe.

// gdy jakis potwor ma kolizje z jakims pociskiem


void onMonsterHit() JACEK ZAGRODZKI
{ Jacek Zagrodzki od długiego czasu interesuje się sze-
score += MONSTER_KILL_AWARD; roko pojętą tematyką tworzenia gier komputerowych.
} W sferze zawodowej Jacek pracuje na stanowisku Se-
nior Java Developer w firmie Gamelion, wchodzącej
// gdy jakis potwor doszedl do dolu planszy w skład grupy BLStream, gdzie zajmuje się tworzeniem
void onMonsterEscaped() gier w Javie na telefony komórkowe. Grupa BLStream
{ powstała by efektywniej wykorzystywać potencjał
changeState(STATE_GameOver); dwóch, szybko rozwijających się producentów opro-
} gramowania - BLStream i Gamelion. Firmy wchodzące
w skład grupy specjalizują się w wytwarzaniu oprogra-
// gdy jakis potwor ma kolizje ze statkiem gracza mowania dla klientów korporacyjnych, w rozwiąza-
void onPlayerHit() niach mobilnych oraz produkcji i testowaniu gier.
{ Kontakt z autorem: jzagrodzki@gmail.com
changeState(STATE_GameOver); Autor pragnie podziękować swojej ukochanej na-
} rzeczonej Ani, która wspierała go w trakcie pisa-
nia artykułu.

64 09/2008
Programowanie urządzeń mobilnych

Programowanie
gier dla Symbian OS
Szkielet aplikacji
Niniejszy tekst rozpoczyna cykl artykułów traktujących o programowaniu
gier na telefony komórkowe działające pod kontrolą Symbian OS. W
pierwszym odcinku cyklu przedstawiona jest implementacja szkieletu aplikacji
zawierającego takie podstawowe udogodnienia jak pętla gry, rysowanie, a także
przechwytywanie i obsługa zdarzeń klawiatury oraz interakcja z systemem.
Środowisko pracy
Dowiesz się: Powinieneś wiedzieć: Przygodę z programowaniem gier dla Sym-
• Jak rozpocząć pracę z narzędziami do progra- • Średnio zaawansowana wiedza ogólna z za- bian OS rozpoczniemy od przygotowania
mowania aplikacji dla Symbian OS; kresu programowania w języku C++; środowiska pracy. Zakładam, że Czytelnik
• Jak zaimplementować pętlę gry w aplikacji dla • Podstawowa wiedza z zakresu programowa- posiada system operacyjny Windows XP. Na
Symbian OS; nia orientowanego obiektowo w języku C++. początek musimy zainstalować dystrybu-
• Jak w grach pisanych pod Symbian OS efek- cję Perl'a oraz środowisko uruchomieniowe
tywnie renderować grafikę, obsługiwać zda- języka Java. W dalszej kolejności będziemy
rzenia klawiatury i przechwytywać podstawo- potrzebowali SDK (Software Development
we zdarzenia systemowe. Kit), zawierającego podstawowy zestaw na-
rzędzi potrzebnych do tworzenia aplikacji
dla Symbian OS. Nasz wybór pada w tym
niu gier na telefony komórkowe działające pod przypadku na pakiet S60 3rd Edition SDK
kontrolą Symbian OS. Cykl poświęcony jest for Symbian OS, Feature Pack 2. Pakiet ten
Poziom trudności przede wszystkim dla programistów języka dostępny jest za darmo na portalu Forum No-
C++, którzy nie znają, lub znają słabo system kia – przed jego ściągnięciem wymagana jest
operacyjny Symbian, a chcieliby na poważnie jednak rejestracja (ramka W Sieci). Aby roz-
zainteresować się programowaniem gier na począć instalację wystarczy rozpakować po-

M
aszyny, które jeszcze kilkadziesiąt urządzenia mobilne pracujące pod jego kon- brane archiwum z SDK i uruchomić plik se-
lat temu stanowiły jedynie mrzon- trolą. Symbian jest tworem potężnym i z pro- tup.exe. Proces powinien odbyć się bezpro-
kę wąskiej garstki specjalistów, dziś gramistycznego punktu widzenia dość kon- blemowo. Na sam koniec instalator zapyta
mieszczą się w naszych kieszeniach. Mowa tu trowersyjnym (ciekawą dyskusję na ten temat się o zgodę na doinstalowanie zestawu na-
oczywiście o nowoczesnych telefonach komór- przedstawia artykuł pt. Unix – piszemy pro- rzędzi kompilacyjnych dla procesora ARM.
kowych. Na dzień dzisiejszy, za całkiem rozsąd- gram na komórkę autorstwa Bartosza Taudula, Na pytanie to należy odpowiedzieć twierdzą-
ną cenę otrzymujemy urządzenie wyposażone przedstawiony w numerze 06/2008 Software co – bez tego zestawu nie będziemy w sta-
w kamerę o wysokiej rozdzielczości, kolorowy Developer's Journal). Cykl moich artykułów nie zbudować naszej aplikacji w wersji dzia-
wyświetlacz, dostęp do szerokopasmowego in- ma na celu przedstawienie tych udogodnień łającej na urządzeniu. Jeśli chodzi o wymaga-
ternetu, zintegrowany moduł GPS, wysokiej ja- oferowanych przez Symbiana, które są klu- nia dla SDK, to przed jego instalacją powin-
kości odtwarzacz dźwięku stereo, akcelerometr czowe przy programowaniu gier. Aby nieco niśmy uzbroić się w około 1GB wolnej prze-
i układ wspomagający renderowanie grafiki 3D uprościć to niełatwe zadanie, przedstawione strzeni dyskowej oraz odrobinę wolnego cza-
w czasie rzeczywistym. No i przy okazji – apa- rozważania ograniczać się będą do dziewiątej su (ze względu na dużą liczbę małych pli-
rat telefoniczny. Ten szalony pęd technologicz- wersji wspomnianego systemu oraz platformy ków w archiwum instalacja trwa dość dłu-
ny tworzy ogromną, otwartą przestrzeń dla no- Series60. W niniejszym tekście przedstawiony go). Pracę ze środowiskiem warto rozpocząć
wych aplikacji, zaś lwią ich cześć stanowią gry. zostanie szkielet aplikacji dostosowany do po- od uruchomienia emulatora. Można to zro-
Niniejszy tekst rozpoczyna cykl artykułów trzeb mobilnych gier, stanowiący bazę dla ko- bić wybierając odpowiednią opcję z Menu
traktujących o programowaniu gier dla Sym- lejnych, bardziej zaawansowanych rozważań. Start lub – prościej – wpisując z linii pole-
bian OS – jednego z czołowych graczy na ryn- W ramach omówienia wspomnianego szkie- ceń komendę epoc. Jeśli wszystko poszło do-
ku mobilnych systemów operacyjnych. letu przeanalizowane zostaną takie zagadnie- brze, to nasze dotychczasowe wysiłki nagro-
nia jak implementacja głównej pętli gry, ryso- dzone zostaną uruchomieniem się emulatora
Zanim zaczniemy... wanie, obsługa interakcji aplikacji z użytkow- (Rysunek 1).
...kilka słów wstępu. Tak jak wspomniano wy- nikiem poprzez klawiaturę, oraz obsługa pod- Po uruchomieniu emulatora należy zareje-
żej, niniejszy artykuł traktuje o programowa- stawowych zdarzeń systemowych. strować SDK wybierając z menu opcję Help

66 09/2008
Programowanie gier dla Symbian OS – szkielet aplikacji

–>Register. Drugim narzędziem składającym


Listing 1. Definicja klasy CGameSkeletonApplication się na nasze środowisko pracy – w odniesie-
class CGameSkeletonApplication niu do tego artykułu – będzie Carbide.C++
: public CAknApplication v1.3. Carbide to IDE stworzone w oparciu o
{ platformę Eclipse, dedykowane jako wspar-
public: cie dla programistów tworzących aplikacje
TUid AppDllUid() const; pod Symbian OS. Narzędzie to w darmowej
wersji Express można pobrać z portalu Fo-
protected: rum Nokia (ramka W Sieci).
CApaDocument* CreateDocumentL(); Przy pierwszym uruchomieniu Carbide
prosi o ustalenie folderu roboczego – najwy-
}; // class CGameSkeletonApplication godniej jest w tym celu stworzyć sobie kata-
log przeznaczony na symbianowe projekty
Listing 2. Implementacja metod klasy CGameSkeletonApplication (najlepiej na tym samym dysku, na którym
const TUid KUidGameSkeletonApp = { 0xA000958F }; zainstalowane było SDK). Po uruchomieniu
IDE automatycznie załaduje wtyczki z SDK
CApaDocument* CGameSkeletonApplication::CreateDocumentL() i poprosi o restart. Po ponownym urucho-
{ mieniu IDE nasze środowisko będzie goto-
return ( static_cast< CApaDocument* >( we do pracy.
CGameSkeletonDocument::NewL( *this ) ) );
} Szkielet aplikacji – przegląd
Rozważania przedstawione w dalszej czę-
TUid CGameSkeletonApplication::AppDllUid() const ści artykułu opierać się będą na kodach źró-
{ dłowych przykładowej aplikacji – GameSke-
return KUidGameSkeletonApp; leton. Kody te można pobrać z witryny SDJ.
} Kluczowe fragmenty wspomnianych ko-
dów przedstawione będą na listingach w ni-
Listing 3. Interfejs klasy CGameSkeletonDocument niejszym artykule, aczkolwiek gorąco nama-
class CGameSkeletonDocument wiam do pobrania całej paczki, chociażby w
: public CAknDocument celu uruchomienia przykładowego progra-
{ mu i poeksperymentowania z kodem źró-
public: dłowym.
static CGameSkeletonDocument* NewL( Symbian uważany jest za system trudny do
CEikApplication& aApp ); nauki. Wynika to chociażby z faktu, że apli-
static CGameSkeletonDocument* NewLC( kacja typu Hello World składa się z około 50
CEikApplication& aApp ); kilobajtów kodu i konfiguracji rozmieszczo-
nych w kilkunastu plikach. Dodatkowo Sym-
virtual ~CGameSkeletonDocument(); bian narzuca pewne specyficzne idiomy ko-

CEikAppUi* CreateAppUiL();

private:
CGameSkeletonDocument( CEikApplication& aApp );

void ConstructL();
}; // class CGameSkeletonDocument

Listing 4. Interfejs klasy CGameSkeletonAppUi


class CGameSkeletonAppUi
: public CAknAppUi
{
public:
CGameSkeletonAppUi();
virtual ~CGameSkeletonAppUi();
void ConstructL();
private:
void HandleCommandL( TInt aCommand );
TKeyResponse HandleKeyEventL(
const TKeyEvent& aKeyEvent,
TEventCode aType );
private:
CGameSkeletonContainer* iAppContainer;
}; // class CGameSkeletonAppUi Rysunek 1. Okno emulatora przy pierwszym
uruchomieniu po instalacji SDK

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

dowania, które mocno odbiegają od standar-


du języka C++. W przypadku pisania progra- Listing 5. Definicja konstruktora klasy CGameSkeletonAppUi
mów dla Symbian OS stosuje się często kre- void CGameSkeletonAppUi::ConstructL()
atory generujące szkielety aplikacji. W dal- {
szej części artykułu opiszę właśnie taki szkie- CAknAppUiBase::SetFullScreenApp( ETrue );
let, stanowiący punkt wyjścia przy progra- BaseConstructL();
mowaniu gier. Symbian oferuje cały szereg
architektur aplikacji z graficznym interfej- CAknAppUi::SetKeyBlockMode();
sem (np. architektura jednowidokowa lub
wielowidokowa). Z punktu widzenia pro- iAppContainer
gramisty gier, dużą cześć wiedzy na temat = new ( ELeave ) CGameSkeletonContainer;
wspomnianych architektur można pominąć. iAppContainer->ConstructL( ApplicationRect() );
W naszej szkieletowej aplikacji zastosujemy
bardzo prostą architekturę bazującą na jed- AddToStackL( iAppContainer );
nej, pełnoekranowej kontrolce. Osoby zainte- }
resowane szczegółami technicznymi związa-
nymi z architekturą aplikacji w Symbian OS Listing 6. Definicja destruktora klasy CGameSkeletonAppUi
zapraszam do ramki Bibliografia gdzie przed- CGameSkeletonAppUi::~CGameSkeletonAppUi()
stawiłem tytuły nawiązujące do tego tematu. {
W niniejszym podpunkcie przedstawię jedy- if ( iAppContainer )
nie to, co konieczne jest do zrozumienia pre- {
zentowanego przykładu. Na początek – szyb- RemoveFromStack( iAppContainer );
ki przegląd klas wchodzących w skład naszej delete iAppContainer;
przykładowej aplikacji. Zacznijmy od klasy C }
GameSkeletonApplication. definicja tej kla- }
sy przedstawiona jest na Listingu 1.
Jak widać na wspomnianym Listingu, de- Listing 7. Definicja metody HandleCommandL
finicja ta nie jest specjalnie skomplikowana. void CGameSkeletonAppUi::HandleCommandL( TInt aCommand )
Klasa CXXXApplication (gdzie wedle kon- {
wencji Symbianowej XXX to nazwa projek- switch ( aCommand )
tu) odgrywa rolę punktu wejścia aplikacji {
(ang. entry point). Kluczowa jest tu metoda case EEikCmdExit:
fabrykująca CreateDocumentL(), która od- {
powiada za tworzenie dokumentu aplikacji Exit();
(CApaDocument). Osoby zaciekawione zna-
czeniem magicznych prefiksów i postfiksów break;
(np. C lub L) w nazwach prezentowanych klas }
oraz ich metod zapraszam do przeczytania default: break;
}
}

Listing 8. Funkcje zdefiniowane w pliku GameSkeleton.cpp


LOCAL_C CApaApplication* NewApplication()
{
return new CGameSkeletonApplication;
}

GLDEF_C TInt E32Main()


{
return EikStart::RunApplication( NewApplication );
}

Listing 9. Schemat pętli gry


while ( Gra trwa )
{
1. Oblicz czas który minął od poprzedniego
przebiegu pętli.
2. Uaktualnij model gry na podstawie różnicy czasu,
który upłynął od ostatniego przebiegu pętli czasu.
3. Narysuj na podstawie modelu kolejną ramkę gry
i wyświetl ją na ekranie.
4. Zsynchronizuj dźwięk z modelem gry.
Rysunek 2. Efekt działania aplikacji }
GameSkeleton

68 09/2008
Programowanie gier dla Symbian OS – szkielet aplikacji

ramki zatytułowanej Idiomy kodowania przy


programowaniu aplikacji dla Symbian OS. Listing 10. Interfejs klasy CGameSkeletonContainer
Wracając do metody CreateDocumentL(), class CGameSkeletonContainer
w jej ciele (Listing 2) jest dynamicznie two- : public CCoeControl
rzona i jednocześnie zwracana instancja kla- {
sy CGameSkeletonDocument. Druga meto- public:
da klasy CGameSkeletonApplication, czyli static TInt Tick( TAny* aCallback );
AppDllUid() zwraca tzw. UID aplikacji. Pi-
sząc w uproszczeniu, UID to niepowtarzal- ~CGameSkeletonContainer();
ny identyfikator aplikacji. Skąd i w jaki spo- void ConstructL( const TRect& aRect );
sób taki UID można pobrać, to już odręb-
na kwestia – będę o tym pisał w dalszej czę- void FocusChanged( TDrawNow aDrawNow );
ści artykułu. Dociekliwi Czytelnicy zaintere- void SizeChanged();
sują się zapewne dlaczego instancja obiektu
CGameSkeletonDocument tworzona jest przy TInt CountComponentControls() const;
pomocy tajemniczej metody statycznej NewL. CCoeControl* ComponentControl( TInt aIndex ) const;
Tychże Czytelników odsyłam tym razem do TKeyResponse OfferKeyEventL(
ramki zatytułowanej Idiomy kodowania przy const TKeyEvent& aKeyEvent,
programowaniu aplikacji dla Symbian OS. TEventCode aType );
W dalszej kolejności warto zainteresować
się klasą CGameSkeletonDocument. Interfejs private:
tej klasy przedstawiony jest na Listingu 3. void Draw( const TRect& aRect ) const;
Według nomenklatury symbianowej klasa
CXXXDocument reprezentuje część M (model) void StartTickGenerator();
z wzorca MVC (ang. Model-View-Controller) void StopTickGenerator();
na którym bazuje architektura aplikacji UI. void OnTick();
Innymi słowy – klasa ta odpowiada za zarzą-
dzanie danymi tej aplikacji (np. wczytywanie void Draw( CGraphicsContext& aGc ) const;
i zapisywanie danych na dysk w przypadku void Update( TInt64 aDt );
tzw. aplikacji opartych na plikach). W przy-
padku naszego szkieletu gry nie będziemy ko- CWsBitmap* iBackupBitmap;
rzystać z klasycznego MVC i w tym kontek- CFbsBitmapDevice* iBitmapDevice;
ście klasa CGameSkeletonDocument ma cha- CFbsBitGc* iBitmapGc;
rakter pomocniczy. To co nas w tej klasie inte- CFpsCounter* iFpsCounter;
resuje to metoda fabrykująca CreateAppUiL, CPeriodic* iTickGenerator;
która istnieje jedynie po to, aby zwrócić in- TTime iTickStart;
stancję obiektu klasy CGameSkeletonAppUi. TTime iTickStop;
Klasa ta (jej interfejs pokazany jest na Li- TKeyState iKeyState;
stingu 4) odpowiada za zarządzanie graficz-
nym interfejsem użytkownika – reprezentu- }; // class CGameSkeletonContainer
je część V (ang. view, czyli widok) we wspo-
mnianym wcześniej wzorcu MVC. Listing 11. Definicja metody CGameSkeletonContainer::ConstructL
Klasa CGameSkeletonAppUi nawiązuje do void CGameSkeletonContainer::ConstructL( const TRect& aRect )
interesujących nas tematów, więc przeanali- {
zujemy ją bardziej szczegółowo. Gdyby nasz CreateWindowL();
szkielet reprezentował aplikację z systemo- SetBlank();
wym interfejsem graficznym dla Symbia- SetRect( aRect );
na, to właśnie ta klasa byłaby odpowiedzial- iBackupBitmap
na za przechowywanie i kontrolę jej widoku = new ( ELeave ) CWsBitmap( iCoeEnv->WsSession() );
(lub widoków). Widoki, z kolei odgrywają ro- iBackupBitmap->Create(
lę kontenerów kontrolek. W przypadku pi- Rect().Size(),
sania gry niepotrzebny nam jest cały ten na- iEikonEnv->DefaultDisplayMode() );
rzut, dlatego skorzystamy z prostego konte- iBitmapDevice
nera (CGameSkeletonContainer), który re- = CFbsBitmapDevice::NewL( iBackupBitmap );
prezentuje prostą kontrolkę przykrywają- User::LeaveIfError(
cą cały wyświetlacz urządzenia. Do szcze- iBitmapDevice->CreateContext( iBitmapGc ) );
gółów samej kontrolki przejdziemy w dal- iTickGenerator
szej części artykułu – teraz skupmy się na = CPeriodic::NewL( CActive::EPriorityStandard );
implementacji poszczególnych metod klasy iFpsCounter = CFpsCounter::NewL(
CGameSkeletonAppUi. Na początek konstruk- KFpsCounterIntervalInSeconds );
tor ConstructL() (Czytelników zdziwio-
nych dlaczego nazywam zwyczajną metodę ActivateL();
konstruktorem, zapraszam do lektury ram- }
ki Idiomy kodowania przy programowaniu na-

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

tywnych aplikacji dla Symbian OS). Ciało tej ekranowy. Kolejna instrukcja (wywołanie żemy zaobserwować dwufazową konstruk-
funkcji przedstawione jest na Listingu 5. BaseConstructL()) odpowiada za inicjali- cję naszej kontrolki (patrz: Idiomy kodowa-
Pierwsza instrukcja tej metody, czy- zację składowych kontrolki odziedziczonych nia przy programowaniu natywnych aplikacji
li wywołanie funkcji SetFullScreenApp() z klasy bazowej. Cel wywoływania funkcji dla Symbian OS). Na końcu metody umiesz-
z klasy bazowej CAknAppUiBase odpowia- SetKeyBlockMode() opisany będzie w dalszej czono kod odpowiedzialny za bardzo istotną
da za przełączenie aplikacji w tryb pełno- części artykułu. W następnym kroku mo- operację – dodanie wspomnianej kontrolki
do stosu kontrolek. Gdybyśmy pominęli ten
Listing 12. Definicja metody StartTickGenerator odpowiedzialnej za uruchomienie timera krok, to nasza kontrolka nie otrzymywałaby
systemowych powiadomień związanych z ob-
void CGameSkeletonContainer::StartTickGenerator() sługą klawiatury i nie bylibyśmy w stanie ob-
{ służyć interakcji użytkownika z aplikacją.
if ( !iTickGenerator->IsActive() ) W destruktorze klasy CGameSkeletonAppUi
{ (Listing 6) nie dzieje się nic ciekawego oprócz
iTickGenerator->Start( zdjęcia naszego kontenera ze stosu kontrolek
oraz zniszczenia go przy pomocy operato-
KDesiredFramesPerSecond, ra delete.
KDesiredFramesPerSecond, Definicja metody HandleCommandL (Listing
7) może wydawać się mało ciekawa, ale warto
TCallBack( CGameSkeletonContainer::Tick, przeanalizować jej treść.
this ) ); W systemie Symbian, w kontekście interak-
iTickStart.HomeTime(); cji z użytkownikiem mamy do czynienie z dwo-
} ma typami komunikatów: są to komendy oraz
} zdarzenia klawiatury. Komendy reprezentu-
ją pewne zdarzenie logiczne, związane z sys-
Listing 13. Definicja metody CGameSkeletonContainer::Tick() temowymi komponentami graficznego inter-
TInt CGameSkeletonContainer::Tick( TAny* aCallback ) fejsu użytkownika (np. wybór opcji w menu).
{ W przypadku programowania gier, z kompo-
ASSERT( aCallback ); nentów tych rzadko się korzysta. Jeśli potrze-
bujemy menu w grze, to raczej narysujemy je
CGameSkeletonContainer* gameSkeletonContainer = ręcznie i obsłużymy przy pomocy niskopozio-
mowych zdarzeń klawiatury. W tej sytuacji po-
static_cast< CGameSkeletonContainer* >( aCallback ); wstaje pytanie: po co implementujemy metodę
HandleCommandL() w naszym szkielecie? Otóż
gameSkeletonContainer->OnTick(); istnieje ku temu konkretny powód. Chodzi o
to, że każda aplikacja symbianowa musi w po-
return ETrue; prawny sposób obsłużyć systemową komendę
} EEikCmdExit. Komenda ta przychodzi do apli-
kacji od systemu w takich sytuacjach jak zabi-
Listing 14. Implementacja metody CGameSkeletonContainer::Draw() cie aplikacji:
void CGameSkeletonContainer::Draw( const TRect& aRect )
const • z poziomu listy aktywnych zadań syste-
{ mowych;
CWindowGc& gc = SystemGc(); • przy pomocy czerwonego klawisza;
• z powodu jej deinstalacji;
gc.BitBlt( aRect.iTl, iBackupBitmap, aRect ); • z powodu niskiego poziomu pamięci w
} systemie.

Listing 15. Implementacja metody CGameSkeletonContainer::OnTick() Zignorowanie tej komendy nie przynosi ra-
void CGameSkeletonContainer::OnTick() czej nic dobrego. Teoretycznie moglibyśmy nie
{ przeładowywać definicji HandleCommandL() z
iTickStop.HomeTime(); klasy bazowej, która poprawnie obsługuje ten
komunikat, aczkolwiek w takiej sytuacji traci-
TInt64 dt = iTickStart.Int64() - iTickStop.Int64(); my możliwość reakcji na to istotne zdarzenie
(można przy tej okazji spróbować np. zapisać
iTickStart = iTickStop; stan gry na dysk, aby następnym razem nie za-
czynać rozgrywki od początku).
Update( dt ); Na końcu pozostaje nam rozważyć definicję
Draw( *iBitmapGc ); metody HandleKeyEventL(). Metoda ta służy
do obsługi niskopoziomowych zdarzeń genero-
DrawNow(); wanych przez klawiaturę. W naszym przypad-
ku implementacja tej metody jest trywialna i
iFpsCounter->Update(); mieści się w jednej linii:
}
return EKeyWasNotConsumed;

70 09/2008
Listing 16. Implementacja metody uaktualniającej zawartość tylnego bufora
void CGameSkeletonContainer::Draw(
CGraphicsContext& aGc ) const
{
aGc.Reset();
aGc.SetBrushColor( KRgbBlack );
aGc.SetBrushStyle( CGraphicsContext::ESolidBrush );
aGc.DrawRect( Rect() );

TBuf< KFpsMessageMaxLength > fpsMessage;


fpsMessage.Format( KFpsMessageFormatString,
iFpsCounter->Fps() );

aGc.UseFont( iEikonEnv->NormalFont() );
aGc.SetPenColor( KRgbWhite );
aGc.DrawText( fpsMessage,
TPoint( KFpsMessagePosX,
KFpsMessagePosY ) );
aGc.DiscardFont();
}

Listing 17. Obsługa zdarzeń klawiatury


TKeyResponse CGameSkeletonContainer::OfferKeyEventL(
const TKeyEvent& aKeyEvent,
TEventCode aType )
{
TKeyResponse response = EKeyWasConsumed;
TKeyState input = KKeyNull;

switch ( aKeyEvent.iScanCode )
{
case EStdKeyDevice0: input = KKeySoftLeft; break;
case EStdKeyDevice1: input = KKeySoftRight; break;
case EStdKeyUpArrow: input = KKeyUp; break;
case EStdKeyDownArrow: input = KKeyDown; break;
case EStdKeyLeftArrow: input = KKeyLeft; break;
case EStdKeyRightArrow: input = KKeyRight; break;
case EStdKeyDevice3: input = KKeyFire; break;
case '0': input = KKey0; break;
case '1': input = KKey1; break;
case '2': input = KKey2; break;
case '3': input = KKey3; break;
case '4': input = KKey4; break;
case '5': input = KKey5; break;
case '6': input = KKey6; break;
case '7': input = KKey7; break;
case '8': input = KKey8; break;
case '9': input = KKey9; break;
default: response = EKeyWasNotConsumed; break;
}

if ( EEventKeyDown == aType )
{
iKeyState |= input;
}
else if ( EEventKeyUp == aType )
{
iKeyState &= ~input;
}

return response;
}

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

Zwrócenie takiej wartości przez tę funkcję Pętla gry (panik to w nomenklaturze Symbian OS pe-
jest sygnałem dla silnika aplikacji, że zda- Większość aplikacji przeznaczonych dla Sym- wien rodzaj assercji), stanowiącego zmorę
rzenia klawiatury będą obsługiwane gdzie bian OS działa w oparciu o zdarzenia gene- wielu programistów symbianowych. W prak-
indziej – w naszym przypadku będą one rowane na bazie interakcji z użytkownikiem. tyce fakt ten objawia się wystąpieniem sys-
przekierowywane bezpośrednio do naszej Typowa aplikacja symbianowa (na przykład temowej notki z napisem ViewSrv 11 i za-
kontrolki. program do pisania SMS-ów) czeka na reak- trzymaniem aplikacji. Aby w pełni zrozu-
Tak oto przebrnęliśmy przez klasy stanowią- cję użytkownika (np. wciśnięcie klawisza). mieć skąd bierze się ten komunikat, należa-
ce fundament szkieletu gry. Ostatnia klasa z Jeśli wspomniana reakcja nie następuje, to ło by wyjaśnić ideę tzw. aktywnych obiektów
tego zestawu, czyli CGameSkeletonContainer aplikacja po prostu nie robi nic. Podejście ta- (ang. active objects), czyli mechanizmu lek-
zawiera to, co stanowi istotę niniejszego ar- kie jest jak najbardziej uzasadnione w przy- kich wątków zaimplementowanych w syste-
tykułu – czyli wszystkie podstawowe mecha- padku programów dedykowanych systemom mie Symbian. Temat ten wykracza jednak
nizmy obsługi gry. Wspomniane mechani- mobilnym. Przy jego stosowaniu, w sytuacji poza ramy niniejszego artykułu, zaś jego zro-
zmy będą opisywane w kolejnych podpunk- kiedy użytkownik nie generuje żadnych zda- zumienie nie jest konieczne do pisania gier
tach artykułu. rzeń, wątek aplikacji może być zawieszony, bazujących na przedstawionym tu szkielecie.
Aby zakończyć przegląd prezentowanego dzięki czemu urządzenie zużywa mniej cen- Osoby zainteresowane pogłębieniem swojej
szkieletu aplikacji, warto wyjaśnić znacznie nej energii. W przypadku gier sytuacja wy- wiedzy w zakresie aktywnych obiektów odsy-
funkcji zdefiniowanych w pliku GameSkele- gląda nieco inaczej: wnika to z faktu, że w łam do ramki Bibliografia, w której przedsta-
ton.cpp (Listing 8). przypadku tego rodzaju aplikacji tematem wiłem listę tytułów zgłębiających między in-
Funkcje te definiują główny punkt wejścia przewodnim jest zazwyczaj akcja. Jeśli użyt- nymi i tę tematykę.
całego projektu – taki odpowiednik funk- kownik nie reaguje, to (zazwyczaj) przegry- Pisząc w dużym uproszczeniu, opisany
cji main() w konsolowych programach pisa- wa, gdyż akcja w międzyczasie toczy się da- wyżej problem wynika z faktu, że aktywne
nych w języku C lub C++. Prawdziwa funk- lej. Innymi słowy – brak reakcji użytkowni- obiekty, na których opiera się wielowątko-
cja main() ukryta jest w systemowym silni- ka w grze nie oznacza, że będzie ona stać bez- wość w Symbian OS, nie podlegają wywłasz-
ku aplikacji (ang. application framework), któ- czynnie. W przypadku tego rodzaju aplikacji czaniu i kręcąca się bez końca pętla while()
ry wykorzystuje funkcje przedstawione na Li- – wymagających ciągłej aktualizacji zarówno sprawiłaby, iż inne wątki działające w sys-
stingu 8 w celu stworzenia instancji naszej w warstwie graficznej (widok) jak i logicznej temu nie mogłyby dojść do głosu. Kluczem
aplikacji. (model) – jako mechanizm sterujący stosuje do rozwiązania tego problemu jest wyko-
Duża część przedstawionego wyżej kodu się tzw. pętlę gry. Pętla taka przedstawiona rzystanie tzw. timera (będącego w rzeczywi-
ma charakter powtarzalny – przy tworze- jest w postaci pseudokodu na Listingu 9. stości aktywnym obiektem), czyli mechani-
niu nowego projektu trzeba go napisać od no- W dalszej części tego podpunktu przedsta- zmu, który powoduje cykliczne wywoływa-
wa, podmieniając jedynie pewne jego części. wię, w jaki sposób można zrealizować wspo- nie funkcji zwrotnej (ang. callback). W na-
Aby uprościć ten proces, przy tworzeniu no- mnianą pętlę w aplikacji dedykowanej dla szym przypadku, każde takie wywołanie od-
wych projektów aplikacji symbianowych, wy- Symbian OS. Już na samym początku trzeba powiadać będzie jednemu przebiegowi opisa-
korzystuje się różnego rodzaju generatory ko- mocno podkreślić, że blokująca pętla while, nej wyżej pętli gry. W tym momencie, w gło-
du. W drugiej części cyklu artykułów o pro- podobna do tej, którą pokazałem na Listingu wach niektórych Czytelników może pojawić
gramowaniu gier dla Symbian OS, w którym 9, absolutnie nie wchodzi w rachubę. Gdy- się myśl o tym, aby wykorzystać wielokrotne
będę między innymi pokazywał, jak na przy- by ktoś pokusił się o jej zastosowanie, to po timery do kontroli logiki aplikacji. Pomysły
kładzie zaprezentowanego tu szkieletu stwo- kilkunastu sekundach miałby okazję zaob- takie należy raczej odrzucić – ich stosowanie
rzyć prostą grę, zaprezentuję narzędzie auto- serwować skutki wystąpienia niechlubnego, prowadzi do powstawania trudnych proble-
matyzujące ten proces. systemowego panika EVwsViewEventTimeOut mów synchronizacyjnych, zaś wynikowy kod
trudno się rozwija i pielęgnuje. Dodatkowo,
Listing 18. Obsługa zdarzenia utraty aktywności używanie wielu aktywnych obiektów pro-
wadzi do zużywania zasobów jądra systemu
void CGameSkeletonContainer::FocusChanged( i znacznie obniża wydajność aplikacji. Jeden
TDrawNow aDrawNow ) timer stanowiący serce naszej gry będzie jak
{ najbardziej wystarczający. W tym momencie
if ( IsFocused() ) proponuję spojrzeć na Listing 10 zawierający
{ interfejs klasy CGameSkeletonContainer.
StartTickGenerator(); Do zawartości wspomnianego Listingu
} będę odnosił się wielokrotnie. W tym miej-
else scu proponuję zwrócić uwagę na wskaź-
{ nik do obiektu CPeriodic. Obiekt ten, two-
if ( iTickGenerator->IsActive() ) rzony dynamicznie w konstruktorze klasy
{ CGameSkeletonContainer (Listing 11) repre-
StopTickGenerator(); zentuje wspomniany timer.
} Dostęp do obiektu otrzymujemy przez
} wskaźnik iTickGenerator. Działanie timera
jest bardzo proste. Tuż po stworzeniu jest on
if ( aDrawNow ) nieaktywny. Sposób jego uruchomienia przed-
{ stawiony jest na Listingu 12.
DrawNow(); Na początek musimy sprawdzić czy ti-
} mer nie jest przypadkiem już uruchomio-
} ny. Jeśli ten warunek jest spełniony to mo-
żemy rozpoczynać pracę. Uruchomienie ti-

72 09/2008
Programowanie gier dla Symbian OS – szkielet aplikacji

mera wykonujemy za pośrednictwem funk- sekund, to tyknięcia i tak będą występować co go API (DSA, czyli Direct Screen Access), bądź
cji Start(). Funkcja ta przyjmuje trzy argu- około 30 milisekund (2 x 15.625 milisekund). wykorzystaniu biblioteki OpenGL ES. W na-
menty – pierwszy z nich określa po jakim Stąd wniosek, że w celu uzyskania równomier- szym przykładzie wykorzystane jest jeszcze
czasie timer ma ruszyć, druga definiuje in- nego tykania warto przydzielać interwały o inne podejście, powszechnie znane jako po-
terwał pomiędzy kolejnymi tyknięciami zaś wielokrotności 15 milisekund. Dobrana prze- dwójne buforowanie (ang. double buffering).
ostatni opakowuje funkcję zwrotną. Obiekt ze mnie wartość daje stosunkowo równomier- Podejście to w kontekście Symbian OS może
opakowujący przyjmuje adres funkcji (w na- ną częstotliwość odświeżania ekranu na pozio- być z powodzeniem wykorzystywane zarów-
szym przykładzie jest to statyczna metoda mie 30/31 FPS. Częstotliwość ta jest stosunko- no przy implementacji stosunkowo statycz-
CGameSkeletonContainer::Tick) oraz adres wo optymalna dla większości gier uruchamia- nych gier logicznych, jak i szybkich, dyna-
obiektu, który do tej metody będzie przeka- nych na telefonach komórkowych. Pętlę gry, w micznych gier akcji. W przypadku stosowa-
zywany przy każdym jej uruchomieniu. W zależności od potrzeb, można zaimplemento- nia tej techniki aplikacja wykorzystuje tzw.
naszym przypadku jest to wskaźnik na siebie wać na bazie innych timerów, np. CHeartBeat, tylny bufor (ang. back buffer), na którym ry-
samego (this). Ten prosty trik pozwala nam CTimer czy CIdle. Niektóre, alternatywne roz- suje się scenę. Później bufor ten jest przeno-
przekazać do funkcji zwrotnej obiekt, który wiązania w tym zakresie przedstawię w kolej- szony do bufora ramki (czytaj: na ekran) przy
kontroluje timer. Spójrzmy teraz na defini- nych artykułach z cyklu Programowanie Gier pomocy jednej, szybkiej operacji binarnego
cję funkcji CGameSkeletonContainer::Tick Dla Symbian OS. kopiowania (ang. blitting). Z racji tego, że po-
(Listing 13). jedyncze operacje rysowania w buforze ram-
Ta statyczna metoda rzutuje otrzymany Rysowanie ki są zazwyczaj bardzo czasochłonne, to ryso-
wskaźnik typu TAny* (symbianowy odpo- System Symbian oferuje cały szereg API prze- wanie poszczególnych elementów sceny gry
wiednik typu void* – ramka zatytułowana znaczonych do rysowania. Najprostszy spo- bezpośrednio na ekran jest zazwyczaj wą-
Symbian a definicje typów) na wskaźnik do sób renderowania grafiki wiąże się z wyko- skim gardłem wydajnościowym i na doda-
kontenera (CGameSkeletonContainer*) i wy- rzystaniem standardowego kontekstu gra- tek powoduje nieprzyjemne dla oka migota-
wołuje na nim metodę OnTick(). Ta ostatnia ficznego (CWindowGc). Dostęp do tego kon- nie. Korzystając z techniki podwójnego bu-
jest już zwyczajną metodą niestatyczną i ja- tekstu można uzyskać następująco: forowania unikamy obydwu problemów. W
ko taka posiada dostęp do wszystkich skład- przypadku aplikacja GameSkeleton, do imple-
ników klasy. W metodzie tej możemy umie- CWindowGc& gc = SystemGc(); mentacji opisanej wyżej techniki wykorzy-
ścić ciało pętli gry. stamy klasę CWsBitmap, która posłuży nam ja-
Uważni czytelnicy analizujący implemen- Za odrysowanie kontrolki na ekranie odpo- ko tylny bufor. Kod odpowiedzialny za two-
tację metod klasy CGameSkeletonContainer wiada funkcja Draw() w klasie ją reprezen- rzenie i inicjację obiektu tej klasy znajduje
zauważyli być może pewien potencjalny de- tującej. się w metodzie CGameSkeletonContainer::
fekt. Chodzi o to, że w konstruktorze kla- Do funkcji tej przekazywany jest prostokąt ConstructL (Listing 11). Oprócz samej bit-
sy nie występuje inicjacja wszystkich skła- określający fragment ekranu, na którym kon- mapy (iBackupBitmap) potrzebne są nam
dowych (np. iTickStart, iTickStop czy trolka może rysować (w naszym przypadku dwie dodatkowe składowe: iBitmapDevice
iKeyState). Wbrew pozorom, efekt ten jest jest to pełny obszar wyświetlacza). Na Listingu oraz iBitmapGc. Obiekty reprezentowane
zamierzony i wiąże się z tym, że składowe w 14 przedstawiona jest implementacja metody przez te składowe niezbędne są do stworze-
klasach oznaczonych prefiksem C, czyli – we- CGameSkeletonContainer::Draw(). Do zawar- nia kontekstu graficznego związanego z bit-
dług symbianowych konwencji kodowania tości tego Listingu powrócimy za moment. mapą reprezentującą tylny bufor. W rezulta-
– dziedziczących po klasie bazowej CBase, Kolejna alternatywna metoda rysowania cie możemy używać iBitmapGc jak zwyczaj-
są automatycznie zerowane przez konstruk- polega na bezpośrednim odwoływaniu się nego kontekstu graficznego, zaś wyniki prze-
tor CBase. do bufora ekranu przy pomocy dedykowane- prowadzanych na nim operacji zostaną zapi-
Zanim przejdziemy do omawiania kolej-
nych zagadnień, warto jeszcze ustosunkować
się do wykorzystania stałej KDesiredFrames Konwencje oraz idiomy kodowania
PerSecond. Stała ta określa częstotliwość tyka- przy programowaniu aplikacji dla Symbian OS
nia naszego timera i co za tym idzie – maksy-
malną liczbę ramek rysowanych w trakcie jed- Symbian narzuca na swoich programistów cały szereg konwencji oraz idiomów kodowa-
nej sekundy, czyli tzw. współczynnik FPS (ang. nia, które dość znacząco wpływają na postać kodu źródłowego aplikacji tworzonych pod
ten system. Jeśli chodzi o konwencje kodowania, to najbardziej w oczy rzucają się defini-
Frames Per Second). W przypadku prezentowa-
cje typów podstawowych (TInt, TReal itd.); prefiksy w nazwach klas, atrybutów i składowych
nego przykładu wartość wspomnianej stałej oraz postfiksy w nazwach funkcji. Co do nazw klas – wyróżniane są cztery podstawowe ich
wynosi 1000000/30. 1000000 określa licz- rodzaje i w tym kontekście stosuje się różne nazewnictwo. Klasy T reprezentują typu pod-
bę mikrosekund w jednej sekundzie (timer stawowe oraz ich złożenia, klasy C alokują zasoby, klasy M reprezentują interfejsy zaś kla-
przyjmuje interwały zapisane w mikrosekun- sy R – uchwyty do zasobów. Najczęściej spotykany postfiks w nazwach funkcji to L – ozna-
dach). W tej sytuacji zakładamy, że timer uru- cza on tzw. funkcje leave'ujace. Mechanizm ucieczki (ang. leave) to symbianowa podróbka
wyjątków. Z mechanizmem tym wiąże się idiom dwufazowej konstrukcji obiektów (metody
chomi funkcję OnTick() około trzydziestu razy
NewL()/ NewLC()/ConstructL()) oraz tzw. stos czyszczenia (ang. cleanup stack). Wszystkie te
w trakcie jednej sekundy. Dociekliwi czytelni- konstrukcje stosuje się o to, aby uniknąć gubienia zasobów systemowych (głównie pamię-
cy mogą zastanawiać się dlaczego dobrałem tę ci). Co do symbianowych konwencji kodowania, to trzeba przyznać, że posiadają one swo-
wartość w taki, a nie inny sposób. Oto wyjaśnie- je plusy (np. narzucają spójność i porządek w kodach źródłowych). Idiomy kodowania nie-
nie. W systemie Symbian w wersji 9 standardo- stety wypadają nieco gorzej – stanowią one zazwyczaj źródło nadmiarowej pracy i utrudnia-
ją pielęgnację programów. Pozytywne jest to, że Symbian dostrzega powoli potrzebę stoso-
wa rozdzielczość timera wynosi 1/64 sekundy
wania alternatyw w odniesieniu do idiomatycznego sposobu kodowania i wspiera nowe roz-
(dokładnie 15.625 milisekund) – ogranicze- wiązania (np. wtyczki Open C/C++). W kolejnych odsłonach cyklu przedstawię bliżej te spo-
nie to dotyczy zarówno emulatora jak i sprzę- śród symbianowych idiomów kodowania, które są niezbędne dla programistów gier. Opo-
tu. Inaczej mówiąc – timer nie jest w stanie ty- wiem także o wspomnianych wtyczkach (Open C/C++), które dla tychże programistów są
kać szybciej niż 64 razy na sekundę. W tej sytu- szczególnie ciekawe.
acji, jeśli ustawimy interwał timera na 20 mili-

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

sane (czytaj: narysowane) w iBackupBitmap. kiem do obiektu klasy CFpsCounter. W ra- mentacji, a wydajnością. Bardziej zaawanso-
W tym miejscu warto wrócić do przedsta- mach tej klasy zaimplementowano prosty wane techniki renderowania w Symbian OS
wionej wcześniej funkcji odrysowującej za- mechanizm zliczania ilości narysowanych planuję zaprezentować w jednym z kolejnych
wartość kontrolki na ekranie (Listing 14). klatek na sekundę (ang. frames per second, odcinków cyklu.
Jak widać na wspomnianym listingu, funk- FPS). Z punktu widzenia klientów tej klasy
cja ta odpowiada jedynie za skopiowanie za- najistotniejsze jest wywoływanie na jej obiek- Interakcja z użytkownikiem
wartości tylnego bufora na ekran. Operację tę cie metody Update() po narysowaniu każdej, Interakcja z użytkownikiem w systemie
realizujemy przy pomocy funkcji BitBlit(). kolejnej klatki (co też czynimy w prezento- Symbian OS odbywa się przede wszystkim
W tym momencie warto przeanalizować ko- wanym przykładzie – Listing 15). Na Listin- przy pomocy klawiatury. Jak już wcześniej
lejność operacji związanych z rysowaniem w gu 16 pokazana jest implementacja metody wspominałem, w naszym szkielecie gry za
naszej przykładowej aplikacji. Kluczową rolę Draw(), odpowiedzialnej za uaktualnianie za- obsługę tejże interakcji odpowiada klasa
w tym procesie odgrywa kod zawarty w me- wartości tylnego bufora. CGameSkeletonContainer. Implementacja
todzie CGameSkeletonContainer::OnTick() Pierwsza część metody Draw() odpowia- tego mechanizmu umieszczona jest w funk-
(Listing 15). da za zamalowanie całego prostokąta ekra- cji OfferKeyEventL (Listing 17).
Na początku tej metody wyliczamy różnicę nu czarnym kolorem. Część druga odpowia- Funkcja ta jest asynchronicznie wywo-
czasu, na podstawie której uaktualniać będzie- da za rysowanie licznika FPS (wartość liczni- ływana przez silnik aplikacji w przypad-
my logikę gry – zakładamy, że odpowiadać bę- ka pobierana jest z obiektu reprezentowane- ku występowania kolejnych zdarzeń klawia-
dzie za to funkcja Update(), która jest wywoły- go przez składową iFpsCounter). Rysowanie tury. W naszym przypadku system obsłu-
wana w dalszej kolejności. Następnie mamy wy- za pomocą kontekstu graficznego (CGraphic- gi wspomnianych zdarzeń opiera się na uak-
wołanie funkcji Draw(). Warto w tym miejscu sContext) jest stosunkowo nieskomplikowa- tualnianiu odpowiednich bitów w składowej
zauważyć, że wywołana funkcja ma sygnaturę: ne i nie odbiega specjalnie od konwencji spo- iKeyState. W przypadku gdy dany klawisz
tykanych na innych platformach. Ciekawość jest wciśnięty, to odpowiedni bit w tej skła-
void CGameSkeletonContainer::Draw( CGra- Czytelników może pobudzić za to zmienna dowej zostaje zapalony. W sytuacji odwrotnej
phicsContext& aGc ) const; lokalna zdefiniowana jako: – bit jest gaszony. Maski dla poszczególnych
klawiszy zdefiniowane są w oddzielnym pli-
Innymi słowy – nie jest to systemowa funkcja TBuf< KFpsMessageMaxLength > fpsMessage; ku nagłówkowym (KeyState.h), tak aby moż-
rysująca zawartość kontrolki na ekranie, tyl- na było je wykorzystywać wielu plikach źró-
ko zdefiniowana przez użytkownika metoda Zmienna ta jest przykładem tzw. deskrypto- dłowych. Testowanie wciśnięcia danego kla-
służąca do renderowania tylnego bufora. Ge- ra – czyli obiektu reprezentującego napis w wisza można łatwo zrealizować przy pomo-
neralnie, przy programowaniu gier w Sym- programach pisanych pod Symbian OS. W cy operatorów bitowych. Dla przykładu, na-
bian OS dobrze jest definiować w klasach re- porównaniu do standardowego szablonu re- stępujący fragment kodu testuje czy wciśnię-
prezentujących wizualne elementy aplikacji prezentującego napisy w języku C++ (std: ty został klawisz 7:
metody rysujące, które przyjmują argument :string ), deskryptory to dość skompliko-
o typie CGraphicsContext , stanowiący klasę wany twór i na tym etapie pominiemy ich if ( iKeyState & KKey7 ) { /* ... */ }
bazową dla wszystkich kontekstów graficz- szczegółowy opis. Do tematu wrócimy w ko-
nych. Jeśli skorzystamy z tego interfejsu, to lejnych odcinkach cyklu. Prezentowana aplikacja obsługuje klawisze
wynikowy kod źródłowy będzie niezależny Podsumowując zawartość tego podpunk- kierunkowe oraz enter, a także klawisze ste-
od zastosowanej metody renderowania. tu warto zauważyć, że przedstawiony tu me- rujące (tzw. softkeys – duże klawisze znajdu-
Analizując zawartość klasy CGameSkele chanizm rysowania nie jest najbardziej efek- jące się zazwyczaj bezpośrednio pod wyświe-
tonContainer, warto zwrócić uwagę na skła- tywnym z możliwych, aczkolwiek reprezen- tlaczem telefonu komórkowego) oraz klawi-
dową iFpsCounter. Składowa ta jest wskaźni- tuje złoty środek pomiędzy prostotą imple- sze numeryczne. Warto w tym miejscu dodać,
że w aplikacjach Symbian OS równoczesna ob-
sługa wielu klawiszy jest domyślnie wyłączo-
Bibliografia na. Aby włączyć tę obsługę, należy dodać w
• Developing Software for Symbian OS: An Introduction to Creating Smartphone Applications konstruktorze klasy CGameSkeletonAppUi (Li-
in C++; Steve Babin; John Wiley & Sons, 2005. Ta pozycja dobra jest dla Czytelników, któ- sting 4) wywołanie:
rzy chcieliby stosunkowo szybko poznać podstawy programowania aplikacji dla Sym-
bian OS CAknAppUi::SetKeyBlockMode( ENoKeyBlock );
• Symbian OS Explained: Effective C++ Programming for Smartphones; Jo Stichbury; John
Wiley & Sons, 2004. Ta pozycja dobra jest dla czytelników, którzy chcieli by poznać bar-
dziej specjalistyczne tematy związane z programowaniem Symbian OS, np. szczegóły Niestety, metoda ta dostępna jest tylko na
dotyczące implementacji i korzystania z aktywnych obiektów platformie Series60.

Interakcja z systemem
Dość specyficzną cechą dotyczącą progra-
W Sieci mowania gier na urządzenia mobilne, jest
• ftp://ftp.activestate.com/ActivePerl/Windows/5.6/ActivePerl-5.6.1.635-MSWin32-x86.msi – obsługa tzw. przerwań (bądź interrupcji).
dystrybucja Perla potrzebna do tworzenia aplikacji dla Symbian OS Wyobraźmy sobie, że podczas trwania akcji
• http://java.sun.com/ – stąd można pobrać środowisko uruchomieniowe języka Java gry dzwoni telefon. W tej sytuacji warto by
• http://www.forum.nokia.com/ – portal dla programistów piszących oprogramowania dla wstrzymać pętlę gry – przynajmniej do cza-
telefonów firmy Nokia; można stąd pobrać bezpłatne narzędzia programistyczne wyko-
su zakończenia rozmowy. Powodów ku temu
rzystywane w niniejszym artykule
• http://www.newlc.com/ – portal programistów aplikacji dla Symbain OS; można tu zna- jest wiele. Najważniejsze z nich to:
leźć cały szereg interesujących informacji – zarówno dla początkujących jak i zaawanso-
wanych • automatyczna ochrona użytkownika przed
skutkami nagłego wyrwania się z akcji gry –

74 09/2008
Programowanie gier dla Symbian OS – szkielet aplikacji

można w tym przypadku założyć, że mało nu oraz wykrywanie braku aktywności użyt- ponuję zapoznać się z metodami dostępny-
kto będzie w stanie kontynuować grę w trak- kownika) będę omawiał w kolejnych artyku- mi w ramach klasy CGraphicsContext. Ko-
cie rozmowy; łach z cyklu. rzystając ze wspomnianych metod warto w
• oszczędzanie energii telefonu – wszak ramach ćwiczenia zaimplementować me-
kręcąca się pętla gry tę cenną energię zu- Testujemy! chanizm wizualizacji zdarzeń klawiatury.
żywa. Nadszedł wreszcie upragniony moment W tym celu można narysować zbudowaną z
przetestowania naszej przykładowej aplika- prymitywów graficznych oraz tekstów imita-
Na dodatek, Symbian jest systemem wielo- cji. Aby tego dokonać, należy wykonać nastę- cję klawiatury telefonu i w zależności od sta-
zadaniowym i użytkownik może w każdej pujący szereg czynności. Na początek aplika- nu zmiennej iKeyState podświetlać (np. ry-
chwili przeskoczyć do innej aplikacji – w tej cję trzeba zbudować. W tym celu posłużymy sować innym kolorem) te jej fragmenty, dla
sytuacji spauzowanie pętli gry byłoby rów- się środowiskiem Carbide.C++. Archiwum z których wystąpiło naciśnięcie klawisza. Me-
nież jak najbardziej na miejscu. Wszystkie aplikacją należy rozpakować, a następnie za- chanizm ten można wykorzystać do przete-
omówione powyżej sytuacje można uogól- importować do Carbide korzystając z opcji stowania systemu obsługi zdarzeń klawiatu-
nić do jednego systemowego zdarzenia ja- File –> Import –> Symbian OS –> Symbian OS ry – warto zaimplementować go tak, aby we-
kim jest utrata aktywności (ang. focus). Zda- Bld.inf file. Wspomniany plik Bld.inf znaj- ryfikował obsługę wciśnięć wielu klawiszy
rzenie to występuje w aplikacji wtedy, gdy duje się w podkatalogu group projektu. Ro- jednocześnie.
inna aplikacja przejmuje kontrolę (mogliby- lę tego, oraz pozostałych plików konfigura-
śmy użyć analogii ze świata Windows i po- cyjnych w projektach symbianowych omó- Podsumowanie
wiedzieć: kiedy inne okienko wyskakuje na wię w kolejnym odcinku z serii moich ar- W niniejszym artykule przedstawiłem szkie-
wierzch). Tak właśnie dzieje się, kiedy w tele- tykułów. Teraz skupimy się na uruchomie- let aplikacji dla Symbian OS, stanowiący so-
fonie symbianowym rozpoczyna się rozmo- niu aplikacji. Po zaimportowaniu projek- lidny punkt wyjścia przy pisaniu gier. W ko-
wa (za obsługę połączenia głosowego odpo- tu należy go zbudować (Project –> Build Pro- lejnych podpunktach pokazałem jak oprogra-
wiada dedykowana aplikacja), tak samo jest ject). Jako, że domyślnie ustawioną konfigu- mować pętlę gry, renderowanie zawartości
gdy użytkownik wybierze z listy zadań in- racją w tym projekcie jest Emulator Debug, ekranu, prosty system obsługi zdarzeń kla-
ny program. to efektem naszego ostatniego działania bę- wiatury oraz podstawowe mechanizmy inte-
Zdarzenie utraty aktywności obsługuje- dzie stworzenie binarnej wersji naszej aplika- rakcji z systemem. W kolejnym artykule z cy-
my z poziomu klasy kontrolki (CGameSke- cji działającej pod emulatorem. Przy pomocy klu pokażę jak:
letonContainer). W przypadku wystąpie- komendy Run –> Run (Ctrl + F11) możemy
nia tego zdarzenia, silnik aplikacji asyn- obejrzeć efekt działania aplikacji GameSkele- • zaimplementować prostą grę bazującą na
chronicznie wywoła na kontrolce funkcję ton (Rysunek 2). przedstawionym szkielecie;
FocusChanged(). Przyjrzyjmy się, jak funkcja Wspomniany efekt – czyli czarny ekran z • zaprogramować operacje odczytu i zapi-
ta jest zaimplementowana w naszej kontrol- narysowanym licznikiem FPS – nie jest mo- su danych z/do plików;
ce (Listing 18). że porażający, aczkolwiek mając na uwadze • dołączyć do przedstawionego szkieletu
Implementacja jest prosta: na począt- przedstawioną wyżej analizę, wiemy, że stoi obsługę dźwięku;
ku sprawdzamy czy aplikacja utraciła bądź za nim dość obszerna mechanika. • wykorzystać idiomy programistyczne
odzyskała kontrolę (służy do tego funk- W dalszej kolejności warto by zająć się Symbian OS przy tworzeniu gier;
cja IsFocused()). W pierwszym z tych uruchomieniem naszego przykładu na fi- • uruchomić grę na telefonie.
dwóch przypadków wywołujemy pomocni- zycznym urządzeniu. Niestety, ze wzglę-
czą funkcję StopTickGenerator(), spraw- du na dość skomplikowany proces certyfi- Na koniec chciałbym wymienić osoby, któ-
dziwszy uprzednio czy aby nasz timer kacji (Symbiana wymaga, by każda aplikacja re dzięki swoim wnikliwym recenzjom przy-
wcześniej był uruchomiony (iTickGenera- działająca na telefonie została podpisana od- czyniły się do znacznej poprawy jakości ni-
tor->IsActive()). Implementacja funkcji powiednim certyfikatem bezpieczeństwa), niejszego artykułu. Wspomniane osoby to:
StopTickGenerator() jest trywialna i spro- kwestię tę chwilowo pominiemy (wrócimy David de Rosier, Jacek Noe Cybularczyk oraz
wadza się do wywołania funkcji Cancel() do niej w kolejnym artykule z cyklu). Mateusz Kula. Chciałbym również podzięko-
na obiekcie timera, co powoduje jego zatrzy- wać mojej ukochanej żonie – Oli, za cierpli-
manie: Zadanie domowe wość, którą okazała mi w trakcie pisania te-
Przedstawiony wyżej szkielet aplikacji sta- go artykułu.
void CGameSkeletonContainer::StopTickGe- nowi solidny wstęp do bardziej zaawanso-
nerator() wanych i ciekawszych tematów związanych z
{ iTickGenerator->Cancel(); } programowaniem gier. Czytelników, którym RAFAŁ KOCISZ
przypadł do gustu niniejszy tekst i planują Pracuje na stanowisku Dyrektora Techniczne-
W przypadku odwrotnym (tj. kiedy apli- kontynuować lekturę mojego cyklu w kolej- go w firmie Gamelion, wchodzącej w skład Gru-
kacja odzyskuje kontrolę) wywołuje- nym numerze SDJ, zachęcam do wykonania py BLStream. Rafał specjalizuje się w technolo-
my omówioną już wcześniej funkcję kilku ćwiczeń związanych z przedstawiony- giach związanych z produkcją oprogramowa-
StartTickGenerator(), odpowiedzialną za mi tu materiałami. Po pierwsze, warto zapo- nia na platformy mobilne, ze szczególnym na-
uruchomienie timera (Listing 12). Dzięki znać się bliżej z narzędziem Carbide, a szcze- ciskiem na tworzenie gier. Grupa BLStream po-
temu prostemu zabiegowi, jesteśmy w sta- gólnie z debuggerem. Jako pierwszą część za- wstała by efektywniej wykorzystywać potencjał
nie obsłużyć cały szereg wydarzeń zakłóca- dania domowego zalecam powstawianie w dwóch, szybko rozwijających się producentów
jących naszą grę. różnych miejscach naszej przykładowej apli- oprogramowania – BLStream i Gamelion. Firmy
Oczywiście, interakcja z systemem nie kacji punktów wstrzymania (ang. breakpo- wchodzące w skład grupy specjalizują się w wy-
kończy się na obsłudze zdarzenia utraty ints), uruchomienie jej w trybie debug (F11) twarzaniu oprogramowania dla klientów korpo-
kontroli przez aplikację. Kolejne przydatne i przeprowadzenie praktycznych obserwacji racyjnych, w rozwiązaniach mobilnych oraz pro-
mechanizmy związane z tą tematyką (mię- mechaniki działania szkieletu (pętla głów- dukcji i testowaniu gier.
dzy innymi obsługę zmiany orientacji ekra- na, zdarzenia itd.). Jako drugie zadanie, pro- Kontakt z autorem: rafal.kocisz@gmail.com

www.sdjournal.org 75
Wywiad

Wywiad z przedstawicielami
firmy Gamelion
SDJ: Panie Sebastianie, czy mógłby Pan po- z metodą sprzedaży gier mobilnych. Najwięk-
krótce przedstawić naszym Czytelnikom sza część przychodów pochodzi bezpośred-
charakterystykę rynku mobilnych gier? nio z portali operatorów komórkowych, zwy-
Sebastian Szczygieł: Aby zapewnić sukces na kle łatwo dostępnych, możliwych do pobrania
rynku gier mobilnych niezbędnym jest zagwa- za pomocą jednokrotnego wciśnięcia klawisza,
rantowanie najwyższego pokrycia rynku urzą- a także z telefonów dystrybuowanych przez da-
dzeń mobilnych. Wielu operatorów sieci ko- nego operatora. Ze względu na małe rozmia-
Sebastian Szczygieł mórkowych po prostu odmawia sprzedaży gry ry ekranu i ograniczoną przestrzeń na prezen-
Sebastian Szczygieł pracuje w firmie Gamelion jeśli nie wspiera ona dostatecznej liczby tele- tację nowej produkcji, często tytuł gry zostaje
(http://www.game-lion.com/) na stanowisku Kie- fonów z oferty przezeń prezentowanej. To jest tym czynnikiem, który decyduje o powodze-
rownika Produkcji. Jest odpowiedzialny za kom- największe wyzwanie dla firm oraz różnica w niu marketingowym gry. Gry tworzone wyłącz-
pleksowe zarządzanie pracami projektowymi, któ- stosunku do innych rynków gier, jak rynek PC nie na telefony komórkowe odnoszą sukces ko-
re są wykonywane w ramach czterech niezależnych czy konsol, gdzie gry są tworzone zwykle na mercyjny tylko wtedy, jeśli są najwyższej jakości
Studio, wchodzących w skład firmy. Sebastian jest określoną platformę. Skalę tego wyzwania ilu- i wydawca zainwestował w działania marketin-
od siedmiu lat zawodowo związany z produkcją struje fakt, iż najwięksi wydawcy mobilnych gowe na portalach operatorów. Dobrym przy-
oprogramowania (o charakterze zarówno bizneso- gier, np. Gameloft czy Electronic Arts, publikują kładem są produkcje lidera rynku, firmy Game-
wym jak i rozrywkowym) dla urządzeń mobilnych, tytuły wspierające ponad 800 telefonów. loft, chociażby gra samochodowa Asphalt któ-
tworzonego na bazie takich technologii jak Sym- ra jest najlepszą grą wyścigową na telefony ko-
bian, Windows Mobile, BREW oraz Java. SDJ: Jaką rolę na tym rynku odgrywa Ga- mórkowe.
Kontakt: sebastian.szczygiel@game-lion.com melion?
SS: Gamelion jest największym europejskim SDJ: Jakich zagrożeń można się spodzie-
niezależnym twórcą gier na platformy mobil- wać w tej branży?
ne. Posiada trzy studia w trzech polskich mia- SS: Chociaż rynek gier mobilnych ciągle się roz-
stach (Szczecin, Bydgoszcz i Łódź) oraz studio wija, wyraźnie widać, iż branża ta stawia sta-
we Lwowie na Ukrainie, zatrudniając łącznie po- le rosnące wymagania i coraz mniej nowych
nad 140 osób. Ponadto Gamelion posiada jed- firm pojawia się na rynku. Wyróżnić można
ną z największych baz telefonów wśród firm te- dwa główne powody takiego stanu rzeczy. Po
go rodzaju. Składa się ona z ponad 1000 urzą- pierwsze, koszty portingu na setki urządzeń
dzeń, nie tylko europejskich, ale także amery- stają się wyższe z każdym rokiem i tylko nie-
kańskich, południowoamerykańskich i australij- liczne firmy w branży (włączając Gamelion) są
skich. Klienci Gamelion wywodzą się z dziesiąt- w posiadaniu wszystkich niezbędnych po te-
ki najlepszych wydawców gier, włączając po- mu urządzeń. Po drugie, operatorzy zmniejsza-
wszechnie znane firmy, jak Electronic Arts, Sony ją liczbę wydawców i dostawców treści z który-
Pictures, Disney, Namco Bandai czy Nokia. War- mi współpracują. Wydawca, który chce nadal
to również w tym miejscu wspomnieć, że Ga- współpracować bezpośrednio z operatorem
melion wchodzi w skład Grupy BLStream. Gru- komórkowym, musi zapewniać nie tylko sta-
pa ta powstała by efektywniej wykorzystywać łą wysoką jakość swoich gier na wszystkie wy-
potencjał dwóch, szybko rozwijających się pro- magane modele telefonów, ale być zdolnym
Rafał Kocisz ducentów oprogramowania – BLStream i Ga- do spełnienia wszystkich wymagań operatora
Rafał Kocisz pracuje w firmie Gamelion (http:// melion. Firmy wchodzące w skład grupy specja- w jak najkrótszym czasie.
www.game-lion.com/) na stanowisku Dyrekto- lizują się w wytwarzaniu oprogramowania dla
ra Technicznego. Jest odpowiedzialny za komplek- klientów korporacyjnych, w rozwiązaniach mo- SDJ: Czy na rynku Polskim istnieje zapo-
sowe zarządzanie technicznym pionem firmy, na bilnych oraz produkcji i testowaniu gier. trzebowanie na mobilne gry?
co składa się kontrola rozwoju firmowej bazy ko- SS: Polska jest największym z nowych kra-
du, równoważenie wewnętrznego portfolio wie- SDJ: Jak według Pana wygląda najpew- jów Unii Europejskiej i ma potężny poten-
dzy, wyznaczanie kierunków technologicznego niejsza droga do sukcesu w biznesie gier cjał aby stać się ważnym rynkiem dla wydaw-
rozwoju, utrzymywanie wysokiej jakości technicz- na telefony komórkowe? ców gier mobilnych. Jednakże w tym wyścigu
nej produktów oraz oraz zarządzanie personelem SS: Gry odnoszące największy sukces na rynku, nadal znajdujemy się daleko w tyle za konku-
technicznym w ramach czterech niezależnych Stu- to konwersje dobrze znanych klasycznych tytu- rentami pokroju Wielkiej Brytanii, Niemiec czy
dio, wchodzących w skład firmy. Rafał jest od sied- łów, jak Tetris czy Pacman, gry oparte na licen- Francji, które są wiodącymi krajami w Europie
miu lat zawodowo związany z produkcją oprogra- cjach filmowych (dla przykładu Gamelion stwo- pod względem przychodów z produktów na
mowania (o charakterze zarówno biznesowym jak rzył grę mobilną na bazie filmu Hancock, świe- telefony komórkowe. Główną przyczyną ta-
i rozrywkowym) dla urządzeń mobilnych, tworzo- żej produkcji w której wystąpił Will Smith), al- kiego stanu rzeczy jest fakt, że na dzień dzi-
nego na bazie takich technologii jak Symbian, Win- bo konwersje najnowszych tytułów z platform siejszy Polacy nie są przyzwyczajeni do kupo-
dows Mobile, BREW oraz Java. PC lub konsolowych. Patrząc na wyniki sprze- wania oprogramowania do swoich telefonów.
Kontakt: rafal.kocisz@game-lion.com daży łatwo zauważyć, że większość użytkow- Na tym polu operatorzy komórkowi, dostaw-
ników telefonów kupuje gry bazujące na tytu- cy treści i wydawcy w Polsce ciągle mają do
łach, które już znają. Jest to częściowo związane odrobienia pracę domową pod tytułem: mak-

76 09/2008
Wywiad

symalizacja przychodów z treści dostarcza- związanych z programowaniem gier (np. gra- dynamiczne, rozwojowe firmy, zdolne do zaofe-
nych na telefony komórkowe. fika 2D/3D, matematyka, fizyka, AI). rowania pełnego pakietu usług – zarówno pro-
gramistycznych jak i portingowych. Ważne jest
SDJ: Jak w Pańskiej opinii rynek mobil- SDJ: Z jakimi technicznymi problemami również posiadanie w swoich szeregach ela-
nych gier będzie rozwijał się w najbliż- potykają się programiści gier dedykowa- stycznych technologicznie i chętnych do nauki
szych latach? nych na platformy mobilne? Jak można ich pracowników. Ten ostatni warunek jest szcze-
SS: Wraz z następną generacją telefonów mo- uniknąć? gólnie istotny ze względu na szalony pęd tech-
bilnych w Europie i Stanach Zjednoczonych, jak RK: Problemów zdecydowanie nie brakuje. Jak nologiczny we wspomnianym segmencie ryn-
również stałej poprawie zasięgu sieci 3G, bę- już było wcześniej wspomniane, największym ku. W Gamelion cały czas jesteśmy otwarci na
dziemy mogli obserwować więcej zaawanso- wyzwaniem firm egzystujących na rynku mo- zatrudnianie zdolnych i otwartych ludzi, speł-
wanych technicznie gier w przyszłości. Nie tylko bilnych gier jest zapewnienie przenośności na niających powyższe warunki.
jakość gier będzie ulegać poprawie, ale gry bę- jak największą liczbę urządzeń. Wyzwanie to
dą coraz intensywniej wykorzystywały połącze- poza warstwą biznesową ma również swój wy- SDJ: Jak widzi Pan przyszłość branży gier
nie telefonów z siecią komórkową do wymia- miar technologiczny. W przypadku produkcji mobilnych w kontekście technicznym?
ny danych. Najprostszym sposobem, aby zoba- gier natywnych stosuje się zazwyczaj tzw. multi- Czy gry mobilne mają szansę dogonić
czyć, czego można się spodziewać w przyszło- platformowe wrappery, tj. biblioteki, które ukry- swoje desktopowe odpowiedniki?
ści, jest spojrzenie na obecny rozwój w Japonii. wają pod ujednoliconym interfejsem szczegó- RK: To trudne pytanie. Jeszcze kilkanaście lat
Nie tylko telefony są tam bardziej zaawansowa- ły systemowe poszczególnych platform doce- temu mało kto przewidywał tak dynamiczny
ne, ale znacznie więcej gier korzysta aktywnie lowych zapewniając w ten wygodną warstwę rozwój technologii mobilnych z jakim mamy
z połączenia sieciowego, zarówno do łączenia abstrakcji. Programiści korzystający z takiego aktualnie do czynienia. Pytanie o rozwój gier
użytkownika z innymi graczami, jak też do po- narzędzia mogą skupić się na programowaniu mobilnych jest w zasadzie pytaniem o rozwój
bierania dodatkowych materiałów do gier. warstwy gry, bez zawracania sobie głowy szcze- technologii komórkowych samych w sobie. W
gółami systemowymi. Dodatkową zaletą takie- bliskiej perspektywie należy spodziewać się
SDJ: Panie Rafale, jakie trendy technolo- go rozwiązania jest przenośność – na bazie jed- przypływu coraz to bardziej technologicznie
giczne dominują na rynku gier mobilnych? nego kodu źródłowego można zbudować bi- zaawansowanych urządzeń mobilnych, a co
Rafał Kocisz: Rynek gier mobilnych zdomino- narne wersje danej gry działające na odmien- za tym idzie coraz bardziej rozbudowanych
wały obecnie dwa trendy: programowanie nych platformach. Niestety, budowanie i utrzy- gier, zarówno pod kątem ilości treści jak i ja-
natywne oraz programowanie multiplatfor- mywanie takich rozwiązań jest bardzo trudne i kości grafiki oraz dźwięku. Takie tytuły jak Fifa
mowe w oparciu o technologię JME. W pierw- drogie. Biblioteki tego rodzaju są zazwyczaj roz- 08 czy Assassin’s Creed w wersji mobilnej mó-
szym przypadku gry pisane są pod konkret- wiązaniami komercyjnymi (na przykład FUSE wią same za siebie. Pomimo stosunkowo dużej
ne platformy mobilne (np. Symbian, Windows firmy Polarbit) bądź wewnętrznymi projektami mocy, która drzemie pod maską urządzeń mo-
Mobile czy BREW) w języku C++, z wykorzy- firm produkujących oprogramowanie mobilne. bilnych, ich głównym ograniczeniem pozosta-
staniem systemowych API, bądź na bazie mul- Gamelion, dla przykładu, rozwija swoją własną je mały wyświetlacz i stosunkowo niewygod-
tiplatformowych bibliotek opakowujących te warstwę abstrakcji o nazwie CLAW. Biblioteka ta ny kontroler. Dopóki te problemy nie będą roz-
API. W drugim przypadku mamy do czynienia została użyta przy produkcji takich tytułów jak wiązane, trudno mówić o tożsamości gier de-
z programowaniem w Javie. Fifa 08 na platformy Symbian S60 oraz N-Gage. sktopowych i mobilnych. Aczkolwiek, możli-
W przypadku rozwiązań opartych na platformie we jest, że w nieco dalszej przyszłości telefony
SDJ: Którą z opisanych wyżej technologii JME sytuacja nie wygląda wcale lepiej. Co praw- zaczną zastępować komputery osobiste i wte-
proponowałby Pan naszym Czytelnikom ja- da JME zapewnia podstawowy poziom przeno- dy owa bariera zostanie przełamana. Aktualnie
ko punkt startowy? Czego warto się uczyć, śności, jednakże przy projektach, które mają za- można by raczej dyskutować o podobieństwie
aby móc zaistnieć na rynku gier mobilnych? pewniać wsparcie dla kilkuset urządzeń, wystę- gier mobilnych do ich odpowiedników na kie-
RK: Obydwa podejścia są ciekawe i na pewno puje cała masa problemów wynikających z róż- szonkowe konsole pokroju Sony PSP czy Nin-
warto uczyć się ich obydwu. W przypadku pro- nic sprzętowych oraz software’owych na po- tendo DS. Myślę, że na dzień dzisiejszy jest to
gramowania w Javie na pewno dużo łatwiej ziomie implementacji maszyny wirtualnej. Kło- główne wyzwanie zarówno dla producentów
jest rozpocząć naukę, aczkolwiek mi osobiście pot w tym, że różne implementacje JME w od- mobilnych urządzeń jak i gier, aczkolwiek na
bardziej interesujące wydają się technologie mienny sposób obsługują dźwięk czy przerwa- jego osiągniecie zapewne przyjdzie nam jesz-
natywne. Pracując z takim technologiami ma- nia systemowe. Przerwania to kolejny poważ- cze trochę poczekać. Kolejnym dużym wyzwa-
my o wiele większe pole do popisu. Wynika to z ny problem, z którym muszą borykać się pro- niem jest unifikacja narzędzi i bibliotek do bu-
faktu, że korzystając z natywnych API uzyskuje- gramiści gier mobilnych. W przypadku aplikacji dowy oprogramowania na komórki. Sądzę,
my bezpośredni dostęp do zasobów systemo- desktopowych nie trzeba kłopotać się tym, że w że najbliższe lata przyniosą nam jakieś pozy-
wych i możemy w pełni wykorzystać możliwo- trakcie pracy programu rozpocznie się połącze- tywne zmiany w tym zakresie. Dla przykładu,
ści urządzenia. Nie musimy się również zmagać nie głosowe bądź przyjdzie SMS. Przerwań te- bardzo interesująco zapowiada się inicjaty-
z ograniczeniami, które ze względu na wymo- go typu występuje na urządzeniach mobilnych wa Khronos Group, w ramach której tworzo-
gi przenośności nakłada platforma JME. Przy bardzo dużo i co gorsza, na rożnych telefonach ny jest zestaw standardów wspierających opi-
wyborze kierunku nauki warto też pamiętać (często nawet w ramach jednej serii) trzeba je sany wyżej cel. Dla przykładu, aktualnie trwają
o równoważeniu portfolio wiedzy poprzez roz- obsługiwać w odmienny sposób. Ze względu prace nad implementacją standardu OpenGL
wijanie swoich umiejętności z zakresu wiedzy na opisane wyżej problemy, proces produkcji ES 2.0 w telefonach komórkowych. Standard
ogólnej. Technologie ewoluują i zmieniają się z gier dzieli się zazwyczaj na dwie fazy: progra- ten oferując programowalny potok graficzny
dnia na dzień, zaś wiedza ogólna deaktualizuje mowanie – gdzie powstaje bazowa wersja apli- w postaci sprzętowo wspomaganych shade-
się znacznie wolniej. Programiście gier mobil- kacji obsługująca wąski zakres urządzeń refe- rów przybliży nasze kieszonkowe cuda do ich
nych na pewno przyda się zaawansowana zna- rencyjnych, oraz porting – gdzie przystosowuje PC’towych odpowiedników. Jedno jest pewne
jomość obiektowych języków programowania się grę do pracy z resztą urządzeń. Podsumowu- – przyszłość mobilnych gier, zarówno w kon-
(C++/Java), umiejętność stosowania wzorców jąc – trudno jest zaistnieć na rynku gier mobil- tekście technologicznym jak i biznesowym za-
projektowych czy specjalizacja w obszarach nych w pojedynkę. Szansę na wybicie się mają powiada się bardzo ekscytująco.

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

Intercon Sp. z o.o. Kei.pl


Dostawca zaawansowanych rozwiązań informa- Kei.pl działa na rynku usług hostingowych od 2000
tycznych, nowoczesnych systemów sprzedażo- roku. Do naszych zadowolonych Klientów z du-
wych, systemów e-commerce oraz programów mą możemy zaliczyć wiele przedsiębiorstw sekto-
partnerskich. Oferujemy systemy wspierające za- ra MSP, instytucji oraz osób prywatnych. W ofer-
rządzanie przedsiębiorstwem oraz wielokanałową cie Kei.pl znajdują się pakiety hostingowe, a także
sprzedaż, rozwiązania typu e-CRM, systemy typu usługi dla wymagających Użytkowników – platfor-
work-flow, zaawansowane wnioski internetowe, roz- my e-Biznes oraz serwery fizyczne.
wiązania portalowe.
http://www.intercon.pl http://www.kei.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

Osmosys Technologies Sp. z o.o. SWD Software Sp. z o.o


Dostarczamy kompletne rozwiązania dla rynku cy- System operacyjny czasu rzeczywistego RTOS
frowej telewizji interaktywnej. Oferujemy oprogra- QNX. Oficjalny dystybutor w Polsce.
mowanie typu middleware, aplikacje JAVA, syste- Zakres działalności: lokalizacja produktów QNX,
my nadawcze oraz usługi „pod klucz”. Nowe obsza- dostawy sprzętu i oprogramowania, doradztwo
ry działalności firmy to: odtwarzacze Blu-ray Disc, przedsprzedażowe, wsparcie techniczne, certyfi-
DLNA/Home Networking, akceleratory 3D, systemy kowane szkolenia, opracowania na zamówienie.
‘Video on Demand’, Push VoD oraz systemy rekla-
my interaktywnej.
http://www.osmosys.tv http://www.swdsoft.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 ..............................................................................

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

Zadzwoń Telefon ............................................................................................

3
+48 22 427 36 9
E–mail .............................................................................................

lub ID kontrahenta ................................................................................

zamów Numer NIP firmy .............................................................................

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

□ automatyczne przedłużenie prenumeraty

Prenumerujesz
– zyskujesz
l oszczędność
pieniędzy Ilość Od
Ilość zama- numeru
l szybka dostawa Tytuł nume- wianych pisma Cena
rów prenume- lub mie-
l prezenty rat siąca

l bezpieczna płatność Software Develope-


12
180*/

ność on–line r’s Journal (1 płyta CD)


– dawniej Software 2.0
250
PLN

* cena prenumeraty rocznej dla osób prywatnych


W następnym numerze Software Developer’s Journal 10/2008 (166)

W sprzedaży od 18 września

PROGRAMOWANIE JAVA PROGRAMOWANIE PHP


Obliczenia numeryczne Zaawansowana obróbka
w programach kompute- grafiki w PHP
rowych
Porównanie opensource-
owych platform
blogowych opartych
o PHP i bazy danych

TESTOWANIE NOWE ARTYKUŁY


OPROGRAMOWANIA W DZIAŁACH
Inteligentne partycjono- Biblioteka miesiąca
wanie zasobów w syste-
mach czasu rzeczywistego XML

I wiele innych artykułów, których nie możesz przeoczyć!

Redakcja zastrzega sobie


możliwość zmiany zawartości pisma.

You might also like