You are on page 1of 84

Jeśli wiesz o co

chodzi z karteczkami
aplikuj teraz!
www.adocean-global.com/praca

Jesteśmy zespołem młodych ludzi - naszą pasją jest


to, co robimy. Nasz zespół został starannie dobrany
i jest główną siłą naszych działań. Ciągle poszuku-
jemy nowych rozwiązań w „Oceanie Możliwości”.
Wiedza, entuzjazm, solidarność i profesjonalizm
osób zatrudnionych w firmie pozwala nam świadczyć
usługi o najwyższej jakości. O pracę w AdOcean
ubiegają się osoby z najwyższymi kwalifikacjami.

AdOcean Sp. z o.o.


ul. Wołoska 7, 02-675 Warszawa tel. (+48 22) 874 41 53
www.adocean-global.com fax (+48 22) 874 41 01
08/2009 (176)

SPIS TREŚCI
38 WS-BPEL – Instrumentacja procesów biznesowych
06 Aktualności Piotr Zerynger
Rafał Kocisz Web Services Business Process Execution Language (WS-BPEL)
jest językiem programowania, którego celem jest opisanie pro-
21 Opis CD cesów zachodzących między partnerami biznesowymi. W ar-
tykule zostanie przedstawiona przykładowa procedura BPEL,
korzystająca z jednego z ogólnodostępnych w Internecie Web
serwisów.
BIBLIOTEKA MIESIĄCA
14 Grails, Groovy i rusztowania
Mariusz Róg 46 Język skryptowy Lua – Charakterystyka i rola
Grails jest prostym środowiskiem z ogromnymi możliwościami. języka skryptowego Lua w programowaniu gier
Czytając artykuł, dowiesz się, co ukrywa się w jego wnętrzu, ja- (i nie tylko)
kiego rodzaju rozwiązania są stosowane oraz jaką rolę w tym Paweł Rohleder
wszystkim ma język Groovy. Krok po kroku dowiesz się, jak ła- Lua jest obok Pythona jednym z najczęściej wykorzystywa-
two i przyjemnie można napisać aplikację internetową, która w nych języków skryptowych w programowaniu gier kompute-
większości stworzy się sama. rowych. Skrypty często służą implementacji algorytmów logiki
gry, sztucznej inteligencji czy interface'u użytkownika, co uła-
twia modyfikację i rozbudowę aplikacji bez konieczności zmia-
ny kodu wynikowego. W artykule przyjrzymy się (poprzez licz-
KLUB TECHNICZNY ne przykłady) charakterystyce języka Lua oraz integracji skryp-
22 Bazy danych w Adobe AIR tów Lua w aplikacjach takich jak gry komputerowe.
Mateusz Małczak
Adobe AIR i SQLite. Zapoznajemy się z wbudowaną w runtime AIR
obsługą bazy danych.
WARSZTATY
52 SQL Server 2008 – Data Mining
JĘZYKI PROGRAMOWANIA Paweł Wilkosz
26 Groovy – na pohybel Javie, z miłością do Javy Każdego dnia do firmowych baz danych napływają niezli-
– wprowadzenie do języka czone ilości informacji. Dane składowane w tabelach zazwy-
David de Rosier czaj przekładają się na statystyki zakupionych towarów lub
Groovy to dynamiczny język dla środowiska Java, w pełni integru- usług przez klientów. Ale coraz częściej posiadanie wiedzy,
jący się z tym językiem, pozwalając na korzystanie z istniejących ilu konsumentów zostało obsłużonych w danym czasie, nie
bibliotek i szkieletów. wystarcza.

Miesięcznik Software Developer’s Journal (12 numerów w roku) Le périodique hakin9 est publié par
Adres korespondencyjny:
jest wydawany przez Software Press Sp. z o.o. SK Software-Wydawnictwo
Software Press Sp. zSp. o.o.z SK,
o.o.
Bokserska, 02-682
ul. Bokserska 1, Varsovie, Pologne Polska
02-682 Warszawa,
Dyrektor wydawniczy: Anna Adamczyk Tél.tel.
+48 2222
+48 887 1036
427 10,91,
Fax.
fax+48
+482222887
22410
2411
59
www.phpsolmag.org
www.sdjournal.org cooperation@software.com.pl
Redaktor naczelny: Łukasz Łopuszański lukasz.lopuszanski@software.com.pl
Directeur de la publication : Jarosław Szumski

Imprimerie, photogravure : 101 Studio, Firma Tęgi


Ekonomiczna 30/36, 93-426 Łódź
Projekt okładki: Agnieszka Marchocka Dział en
Imprimé reklamy: adv@software.com.pl
Pologne/Printed in Poland

Skład i łamanie: Monika Grotkowska monika.grotkowska@software.com.pl Obsługa prenumeraty:


Abonnement EuroPress
(France métropolitaine, Polska software@europress.pl
DOM/TOM) : 1 an
(soit 6 numéros) 38 €
Dział produkcji i kolportażu: Alina Stebakow alina.stebakow@software.com.pl Dołączoną do magazynu płytę CD przetestowano programem AntiVirenKit
firmy
Dépôt G DATA
légal Software Sp. z o.o.
: à parution
Wyróżnieni betatesterzy: Roger Zacharczyk ISSN : 1731-7037
Redakcja: dokłada
Distribution MLP wszelkich starań, by publikowane w piśmie i na towarzyszących
Parcmu nośnikach
d’activités informacje55i bd
de Chesnes, programy były poprawne, jednakże nie bierze
de la Noirée
BP odpowiedzialności za efekty wykorzystania ich;CEDEX
59 F - 38291 SAINT-QUENTIN-FALLAVIER nie gwarantuje także poprawnego
Nakład: 6 000 egz. (c) działania programów shareware,
2005 Software-Wydawnictwo, freeware
tous i public
les droits domain.
réservés

4 08/2009
NARZĘDZIA AKADEMIA UML
56 Dogadajmy się – O komunikacji dla programistów 72 Dziedziczenie – Tworzenie hierarchii klas
Michał Bartyzel, Mariusz Sieraczkiewicz Szymon Zioło
Im więcej osób pracuje nad projektem, tym bardziej powodzenie W poprzednim odcinku Akademii UML poznaliśmy sytuacje, w
przedsięwzięcia zależy od efektywnej komunikacji pomiędzy ni- których nie należy stosować dziedziczenia. Zobaczmy, kiedy po-
mi. Prace nad projektami IT dotyczą programistów, architektów, winniśmy tworzyć wspólną nadklasę dla kilku klas, a kiedy taka
analityków. Systemy są udoskonalane przez lata, a zaangażowa- hierarchia klas jest zbędna.
ne osoby zmieniają się. W artykule przyglądamy się aspektom ko-
munikacji, szczególnie dotyczących osób pracujących w projek-
tach IT.
PRAWO W IT
76 Prawo autorskie dla programistów – Programi-
58 Analiza biznesowa – Wymagania sta jako twórca dzieła w postaci programu kom-
– pozyskiwanie, dokumentowanie, komunikowanie puterowego
Karolina Zmitrowicz Piotr Przegaliński
Etap analizy biznesowej jest jednym z kluczowych momen- W przypadku, gdy programista tworzy program komputero-
tów w projekcie informatycznym. Jakość analizy i uzyskanych wy, który jest przejawem jego działalności twórczej, ma indy-
za jej pomocą produktów w znacznym stopniu determinuje widualny charakter i jest rezultatem jego pracy, wówczas taki
jakość kolejnych etapów realizacji systemu. Dobrze zaplano- program należy traktować jako utwór w rozumieniu Prawa au-
wana i wykonana analiza w znacznym stopniu skraca czas im- torskiego. Sam programista powinien być natomiast traktowa-
plementacji i testowania oraz pozwala uniknąć problemów ny jako twórca.
związanych z brakami w wymaganiach i niespójnością. Ar-
tykuł przedstawia podstawowe elementy dobrego procesu
analizy.

66 Monitorowanie oprogramowania – Lepiej za-


pobiegać, niż leczyć...
Karolina Zmitrowicz
Coraz częściej instytucje zamawiajce usługi informatyczne po-
siadają własne departamenty IT i pragną w określonym zakresie
uczestniczyć w procesie wytwarzania oprogramowania. Artykuł
przedstawia najczęściej spotykane z punktu widzenia klienta pro-
blemy związane z taką wspópracą oraz propozycje rozwiązania
czy uniknięcia owych problemów.

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:


cooperation@software.com.pl

Druk: Artdruk www.artdruk.com

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

API dla wyszukiwarki Bing do-


Opera Unite: serwer w przeglądarce
Opera Software zaprezentowała tech-
nologię, dzięki której każdy użytkow-
nik Opery będzie miał możliwość uru-
chomienia własnego serwera w prze-
glądarce. Na początek Opera w ramach
stępne bez żadnych limitów!
N
technologii Opera Unite udostępni- owa wyszukiwarka Microsoftu razki czy odpowiedzi encyklopedii Encar-
ła 6 usług: File Sharing (udostępnia- wzbudziła dużą sensację wśród ta. Zapytania można zaś wysyłać w forma-
nie plików z serwera), Fridge (zostawia-
internautów. Po raz pierwszy ma- cie zgodnym ze standardem OpenSearch.
nie notatek właścicielowi komputera),
Media Player (udostępnianie materiałów my do czynienia z produktem, który ma Co jednak najbardziej ciekawe, to fakt, że
multimedialnych), Photo Sharing pozwa- szansę zagrozić monopolowi Google'a. Aby Microsoft nie wprowadził żadnych ograni-
lający na przeglądanie materiałów gra- uczynić swoją ofertę jeszcze atrakcyjniejszą czeń w wykorzystaniu API Binga – aplika-
ficznych, The Lounge dający możliwość dla niezależnych deweloperów, gigant Red- cje mogą odpytywać wyszukiwarkę Micro-
rozmowy pomiędzy zaproszonymi użyt-
mond udostępnił pełne API Binga – i to softu dowolną liczbę razy, pobierać dowol-
kownikami, a usługa Web Server pozwoli
na proste uruchomienie serwera WWW. bez żadnych ograniczeń dostępowych. Po- ną ilość danych. Jest to wielki krok naprzód
Wartym uwagi jest fakt, że Opera nie dobnie jak i sam Bing, tak też API wyszu- w stosunku do Live Search, a także w od-
ma zamiaru ograniczać programisty w kiwarki jest rozszerzoną wersją istniejącego niesieniu do innych API oferowanych przez
tworzeniu nowych usług. W oparciu o już interfejsu programistycznego wyszuki- firmy konkurencyjne; warunki nieodpłat-
te, które już istnieją, możliwe stanie się
warki Live Search. Nowy interfejs progra- nego korzystania z tych ostatnich wiążą
stworzenie np. własnego silnika blogo-
wego w oparciu o JavaScript, CSS oraz mistyczny jest częścią Projektu Silk Road. się zazwyczaj z poważnymi ograniczenia-
HTML5. Do uruchomienia Opera Unite Pozwoli on na łatwe rozbudowywanie ist- mi. Aby skorzystać z usługi, deweloperzy
wymaga konta w usłudze My Opera. niejących witryn lub tworzenie całkowicie muszą jedynie wygenerować sobie unikal-
Witryny użytkownika będą dostęp- nowych aplikacji. Jak możemy przeczytać ny identyfikator AppID za pomocą syste-
ne w specjalnej subdomenie, np. [lo-
na stronie Bing Developer Center, praca z mu logowania Windows Live ID. Czy to po-
gin].operaunite.com. Dodatkowo użyt-
kownik posiadający więcej kompute- nowym API jest bardzo prosta: wystarczy może wyszukiwarce Microsoftu w odbiciu
rów będzie mógł zdefiniować ich dodat- wybrać typ źródła, protokół wyjściowy (ob- części rynku? Tego nie sposób przewidzieć,
kowe adresy dostępowe. Serwer Opery sługiwane są JSON, SOAP i XML) i dosto- ale niewątpliwie za sukces Google'a w wiel-
będzie współpracował również z urzą- sować całość do naszych potrzeb. Szczegó- kim stopniu odpowiada darmowe udostęp-
dzeniami sieciowymi, udostępniającymi
ły wykorzystania poszczególnych źródeł da- nianie swoich usług – praktycznie bez żad-
protokół UPnP. Dostęp usług, urucho-
mionych w ramach domowego serwe- nych opisane są na stronie serwisu MSDN, nych ograniczeń. Najwyraźniej w Red-
ra, będą mieli również właściciele alter- tu wspomnijmy tylko, że pobrane dane mo- mond postanowiono, przynajmniej w czę-
natywnych wobec Opery przeglądarek gą być ograniczone do takich kategorii, jak ści, przyjąć podobną strategię.
internetowych. Użytkownicy zaintere- wyniki przeszukiwania WWW, newsy, ob- http://webhosting.pl/
sowani usługą powinni zapoznać się z
wprowadzeniem przygotowanym przez
deweloperów z Opera Software. Testo-
wą wersję przeglądarki Opera z wbudo- Exploit powodem
zniknięcia 100000 witryn
wanym modułem Unite można pobrać
ze strony producenta.
http://opera.com/

B
Bazy danych od Google rytyjski dostawca usług hostingowych, mianie własnych poleceń powłoki, włącznie z
Google ogłosiło udostępnienie testowej firma VAserv, stał się ofiarą ataku hake- rm -rf. Korzystjąc z tej luki, hakerzy (a może
wersji nowego typu bazy danych, który rów, którzy wykorzystali exploit w po- należałoby powiedzieć: wandale) skasowali po-
ma być rewolucyjny w stosunku do tra- pularnym oprogramowaniu wirtualizacyjnym nad połowę kont klientów firmy. Teraz na stro-
dycyjnych, relacyjnych baz danych.
Nowa baza nosi nazwę Fusion Tables HyperVM, wydanym przez firmę LXLabs. Ata- nie poszkodowanej firmy można jedynie zapo-
i została opracowana w celu uprosz- kującym udało się skasować praktycznie wszyst- znać się z próbami odzyskania danych prowa-
czenia wielu operacji, które zwykle są kie dane na serwerach firmy. Według informa- dzonymi przez administratorów. Niestety, uda-
trudne do wykonania przy użyciu baz cji, które znaleźć można na forum dyskusyj- ło im się uratować jedynie część danych. Zawar-
relacyjnych. Do takich zadań należy np. nym poświęconym produktom LXLabs, twór- tość niektórych kont została utracona na dobre.
integracja danych z wielu heterogenicz-
nych źródeł oraz możliwość pracy na cy oprogramowania wirtualizacyjnego wiedzie- Użytkownikom HyperVM, jak również pane-
dużych zbiorach danych. Fusion Tables li o exploicie od siedemnastu dni i... nic z tą wie- lu administracyjnego Kloxo/LXAdmin zaleco-
wykorzystuje mechanizm data-spaces dzą nie zrobili. Jak twierdzą użytkownicy fo- no natychmiastowe wyłączenie tych usług. Jed-
opracowany przez firmę Transformic, rum, firma LXLabs, notorycznie niedostępna nak dla wielu firm jest to bardzo trudne przed-
którą Google kupiło potem w 2005 dla prasy, traktuje kwestie bezpieczeństwa bar- sięwzięcie. HyperVM był często jednym z fila-
roku. Dzięki data-spaces ma zostać roz-
wiązany problem wielu typów i forma- dzo lekkomyślnie; potrafi nawet wydawać po- rów hostingowej infrastruktury: oprogramowa-
tów danych. Google Fusion Tables jest prawki, które niczego nie poprawiają. Według nie to pozwala na zarządzanie bazującymi na hi-
dostępne w Labs. Obecnie użytkownik Rusa Fostera, dyrektora VAserv, inne firmy, perwizorach Xen i OpenVZ wirtualnymi ser-
może ładować zbiory danych nie więk- które korzystały z oprogramowania HyperVM, werami prywatnymi (VPS).
sze, niż 100 MB, a łącznie nie więcej, niż również stały się ofiarami ataku i poważnie na http://webhosting.pl
250 MB. Dane mogą być udostępniane
innym użytkownikom. tym ucierpiały. Exploit umożliwił bowiem pe-
http://www.google.com/ łen dostęp do systemu plików serwera i urucha-

6 08/2009
Aktualności

Bing oficjalnie nową Microsoft patentuje ocenianie zdjęć


Microsoft chce opatentować ocenianie

wyszukiwarką Microsoftu
zdjęć osób, funkcję dostępną od dawna
w wielu portalach. W Amerykańskim
Biurze Patentowym Microsoft złożył
wniosek o patent dla funkcji Online Per-

T
ak jak planowano, Microsoft pod- sonal Appearance Advisor. Ma to być
czas konferencji D: All Things Di- wynalazek trzech pracowników Micro-
soft Research. W opisie można prze-
gital oficjalnie zaprezentował na- czytać, że użytkownik wykonuje kilka
stępcę Live Search: nową wyszukiwarkę o zdjęć siebie w różnych ubiorach i przy
nazwie Bing. Microsoft, mówiąc o Bing, użyciu różnych kosmetyków. Następnie
unika słowa wyszukiwarka; według gigan- wysyła zdjęcia do odpowiedniego ser-
ta z Redmond, Bing to mechanizm wspie- wisu, gdzie inni użytkownicy mogą gło-
sować na poszczególne fotografie. Po
rający decyzje pozwalający użytkownikom ko wróciło do normy. Bez złośliwości moż- otrzymaniu statystyk użytkownik może
wyjść poza tradycyjne wyszukiwanie. Bing na natomiast przyznać, że kilkudniowy wy- wysłać kolejne zdjęcia. Czyżby Micro-
dzięki semantycznemu wyszukiwaniu ma strzał popularności spowodowany był wy- soft chciał stworzyć własną wersję fot-
rozwiązać największy problem dzisiejszych łącznie chwilowym zainteresowaniem no- ka.pl?
wyszukiwarek: 42% początkowych zapytań wą wyszukiwarką. Najciekawsze jest jed- http://dobreprogramy.pl/
musi być doprecyzowana. Nowa wyszuki- nak to, że popularność Bing.com nadal spa- Bing przetłumaczy
warka Microsoftu będzie udostępniać do- da i... jest niższa, niż popularność Microsoft strony z wyników wyszukiwania
datkowe wyniki wyszukiwania dopasowane Live Search na miesiąc przed premierą Bin- Usługa wykrywa natywny język użytkow-
do początkowej frazy tak, że szukane infor- ga. Zamiast postępu mamy więc regresję. nika na podstawie języka przeglądar-
macje, przynajmniej teoretycznie, powin- Steve Ballmer zapowiadał, że razem z Bin- ki. W przypadku gdy strona wyświetlona
w wynikach wyszukiwania jest w innym
ny pojawiać się na górze bez konieczności giem ma zamiar zająć drugie miejsce w ran- języku, niż język użytkownika, pojawi się
zadawania kolejnych pytań wyszukiwarce. kingach popularności wyszukiwarek, tuż za odnośnik Przetłumacz tę stronę. Domyśl-
Oczywiście, razem z pojawieniem się nowej Google. Dał sobie na realizację tego planu nie w dwóch ramkach pojawia się odpo-
wyszukiwarki rozpoczęły się na nowo dys- pięć lat. Chyba zbyt piękne byłoby jednak, wiednio oryginalna oraz przetłumaczo-
kusje i spekulacje na temat przyszłości te- gdyby ten plan pięcioletni udało się wyko- na wersja strony. Możliwe jest ustawienie
trybu ujednoliconego, w którym orygi-
go sektora rynku IT. W kilka dni po hucz- nać w tydzień – bez inwestycji, bez prze- nalny tekst pojawia się w dymku, po naje-
nym uruchomieniu nowej wyszukiwarki jęć i tak naprawdę bez rewolucyjnych po- chaniu danego fragmentu tekstu. Opcja ta
Bing i pierwszych badaniach popularności mysłów. Jeśli ktoś choćby po cichu o tym działa również w drugą stronę: tłumacze-
dało się odnieść wrażenie, że następca Li- marzył, to raczej zbyt naiwnie podszedł do nie tekstu pojawia się w dymku po jego
ve Search odniósł ogromny sukces. Później całej sprawy. Dość ciekawe spostrzeżenia najechaniu.
http://poradnikwebmastera.blox.pl/
pojawiły się z kolei głosy, że nowa wyszu- w sprawie Bing przedstawił dziennik New
kiwarka Microsoftu to tylko ogromne roz- York Post. Chodzi generalnie o reakcję fir- Pakiet biurowy od Adobe
czarowanie. Atmosferę na rynku wyszuki- my Google na pojawienie się konkurencyj- Adobe udostępnił finalną wersję usługi
warek podgrzała firma StatCounter pro- nego produktu. W pierwszym odruchu Acrobat.com, przy okazji rozbudowując
ją o kolejne aplikacje. Równocześnie uru-
wadząca między innymi statystyki popular- przedstawiciele Google wyrażali się o pro-
chomiono komercyjną, bardziej rozbudo-
ności przeglądarek. Dane aktualizowane są jekcie dość lekceważąco, a do nazwy Bing waną biznesową wersję usługi. Pierwszym
tam co kilka godzin, więc na bieżąco można odnosili się wręcz prześmiewczo. Później składnikiem pakietu jest procesor tekstu
było śledzić popularność Binga na tle kon- jednak stała się rzecz niecodzienna: Sergey Buzzword, który prócz standardowych
kurentów. Kiedy na początku czerwca br. Brin, jeden z założycieli Google, powrócił funkcji (formatowanie tekstu, kopiowanie,
wypunktowanie, wyróżnianie, sprawdza-
StatCounter opublikował wiadomość, że do aktywnych obowiązków bieżącego kiero-
nie pisowni) daje możliwość eksportowa-
Bing przegonił Yahoo!, wszyscy, chyba z Mi- wania firmą, co według wewnętrznych źró- nia dokumentu do różnych formatów. Nie-
crosoftem włącznie, byli zszokowani. Istot- deł nie było ostatnio normą. Brin miał rze- dawno do pakietu dołączyły kolejne apli-
nie 4 czerwca udział Bing.com w rynku wy- komo wykazać bardzo duże zainteresowa- kacje, między innymi narzędzie do two-
szukiwarek w Stanach Zjednoczonych wy- nie nowymi algorytmami wspomagający- rzenia prezentacji. Aktualnie do dyspozy-
cji mamy ponadto rozbudowany arkusz
nosił ponad 15%, podczas gdy Yahoo! mo- mi podejmowanie decyzji, w jakie wyposa-
kalkulacyjny pozwalający na zarządzanie
gło pochwalić się wynikiem jedynie na po- żony został Bing. Brin powołał specjalny ze- listami zadań, kalendarzem i kontaktami.
ziomie 10%. Popularność Binga szokowa- spół czołowych inżynierów Google, którzy Koszt podstawowej wersji pakietu wynosi
ła zwłaszcza na wykresie – wystrzał był na- dostali jedno zadanie – opracowanie rewo- 15 USD. Subskrypcja pozwoli na prowa-
prawdę imponujący. Dane ogólnoświatowe lucyjnych i dających się szybko wdrożyć, za- dzenie internetowych spotkań maksymal-
nie z pięcioma osobami oraz konwersję do
były bardzo podobne, liczby były niższe, sadniczych nowych funkcjonalności wyszu-
10 dokumentów PDF w miesiącu. Druga,
ale przewaga Binga nad Yahoo! równie sil- kiwarki. Wygląda więc na to, iż nawet jeśli droższa wersja usługi, dostępna w cenie
na. Ku przerażeniu zwolenników nowej wy- Bing okaże się niewypałem, być może przy- około 40 USD, charakteryzuje się możliwo-
szukiwarki, sytuacja pogarszała się jednak z służy się do zmobilizowania osiadającego ścią prowadzenia konferencji z 20 osoba-
dnia na dzień i już po kilku dniach Bing no- ostatnio na laurach Google, w efekcie czego mi i nieograniczoną ilością konwersji PDF.
Oferta dotyczy mieszkańców Ameryki Pół-
tował udział w rynku wyszukiwarek w USA tak czy siak zyskają użytkownicy.
nocnej. Rozmowy pomiędzy 3 osobami
na poziomie niższym od Yahoo! Będąc zło- http://www.nypost.com/ pozostają darmowe.
śliwym, można by powiedzieć, że wszyst- http://dobreprogramy.pl/ http://www.theregister.com/

www.sdjournal.org 7
Aktualności

WWDC 2009: Apple


GlassFish v3 obsługuje Django
Na łamach bloga projektu pojawił się wpis

rzuca rękawicę Microsoftowi


Viveka Pandeya, szefa obsługi języków
skryptowych projektu Glassfish. Można w
nim przeczytać: Wersja Preview Glassfisha
3 jest już dostępna, a ja mam przyjemność

S
ogłosić, że obsługuje ona aplikacje zbudo- an Francisco jest niewątpliwie stolicą
wane w Django. Projekt GlassFish-Scripting świata w oczach wszystkich miłośni-
zapewnia serwerowi aplikacyjnemu odpo-
ków Apple'a. Podczas trwającej tam
wiednią implementację kontenera Jytho-
na. Stanowi ona łącznik z modułem OSGi Worldwide Developer Conference, firma z
i zapewnia mechanizm automatycznego Cupertino przedstawiła cały wachlarz no-
uruchamiania kodu w kontenerze Jytho- wości, które mają sprawić, że konkurencja
na w momencie wdrożenia aplikacji napisa- – przede wszystkim ta z Redmond – po-
nej w Pythonie. Dodatkowo kontener Jytho-
czuje się pod każdym względem zagrożo-
na przechwytuje na niskim poziomie zapyta-
nia i odpowiedzi HTTP poprzez implementa- na. Po pierwsze: Snow Leopard podgryza
cję GrizzlyAdaptera. Pozwala to na większą Windows 7. Microsoft próbuje przedsta-
wydajność środowiska uruchomieniowego wić swój Windows 7 jako prawdziwą rewo-
i łatwiejszą skalowalność za pomocą frame- lucję, chwaląc się nowym interfejsem użyt-
work'u NIO. Kontener Jythona zawiera także
kownika i niezwykłą szybkością systemu,
WSGI (Web Services Gateway Interface), stan-
dardowy mechanizm Pythona, za pomocą tymczasem wiceprezes Apple'a Bertrand
którego można podłączać go do webowych Serlet podsumował Siódemkę następująco: ternet Explorera 8 i czterokrotnie szybsza
framework'ów. Dzięki temu w przyszłości Ten cały Windows 7 to w zasadzie kolejna od Firefoksa 3. Microsoft w ostatnich cza-
obok Django, serwer GlassFish będzie obsłu- wersja systemu Windows Vista. Tymi wła- sach próbował przekonać, że szybkość en-
giwał takie frameworki jak Pylons czy Tur-
śnie słowami Serlet rozpoczął prezentację gine'ów skryptowych nie ma takiego zna-
boGears. Aby uruchomić nowe funkcjonal-
ności, należy skorzystać z narzędzia aktu- nowości, jakie Apple zamierza udostępnić czenia, że liczy się czas otwierania stron.
alizacyjnego Glassfisha 3. Autorzy projektu klientom w zbliżającej się najnowszej edy- Na to Safari 4 ma też swoją odpowiedź: ła-
chcą, aby stały się one częścią rdzennej funk- cji systemu Mac OS X, czyli Snow Leopard. duje strony nawet trzykrotnie szybciej niż
cjonalności projektu. Osoby zainteresowane I choć Apple nie ukrywa, że Snow Leopard IE8 i Firefox 3. W dodatku Safari 4 ma być
Rubym na pewno ucieszy też wiadomość, że
jest kolejną wersją Leoparda, którego kocha- niemal nie do zdarcia: Dzięki separacji pro-
GlassFish 3 w wersji Preview znacznie ulep-
sza obsługę aplikacji w tym języku. Ich wdra- my i z którego jesteśmy dumni, to jednocze- cesów wtyczek, wszelkie awarie związa-
żanie bazuje teraz na Rack, analogicznym do śnie podkreśla, że wprowadzone zmiany ne np. z Flashem czy Adobe Readerem nie
WSGI standardzie komunikacji framework'u nie są tylko kosmetyczne. Gdy Microsoft będą miały na nią wpływu. Wystarczy tyl-
Ruby'ego z serwerem webowym. Obecnie rozwodzi się nad paskiem zadań, Apple ko przeładować stronę, by ponownie uru-
Glassfish obsługuje standardowo framewor-
mówi o wykorzystaniu wielordzeniowych chomić wtyczkę. Nowe Safari to także peł-
ki Rails, Merb oraz Sinatra.
http://webhosting.pl 64-bitowych procesorów, wbudowaniu w na kompatybilność ze standardami siecio-
system obsługi OpenCL (dzięki czemu wymi – elementami HTML 5 (m.in. au-
Canonical i Hewlett-Packard wszystkie aplikacje będą miały dostęp do dio i wideo, oraz obsługą aplikacji webo-
zaoferują wspólnie serwery mocy obliczeniowej procesora graficzne- wych offline), CSS 3 czy transformacjami
Canonical – komercyjny sponsor projektu
go), natywnej obsłudze serwerów Exchan- SVG. To także test Acid 3 zdany w 100%,
Ubuntu Linux – poinformował, że ten system
operacyjny otrzyma certyfikaty zgodności z ge, rewolucyjnej przeglądarce Safari i udo- poprawki w interfejsie użytkownika i ulep-
serwerami Hewlett-Packarda, a obie firmy skonalonych mechanizmach obsługi wi- szona prywatność. Safari 4 pobrać można
zaoferują wkrótce wspólnie nową, wysoce deo, dostępnych w ramach nowej wersji ze strony www.apple.com/safari/. Bertrand
wydajną konfigurację sprzętu i oprogramo- QuickTime. Nie tylko jednak funkcjonal- Serlett przedstawił nowy odtwarzacz mul-
wania. Dzięki temu Canonical będzie mógł
nościami Apple licytuje się z Microsoftem. timedialny Apple'a. QuickTime 10 jest kil-
być instalowany w biznesowych warunkach
na siedemnastu modelach serwerów HP Pro- Wojna przenosi się także na grunt ceno- kukrotnie szybsze od swojego poprzedni-
Liant z linii G6. Według producenta, linia ta to wy. Okazuje się, że Snow Leopard będzie ka, oferuje strumieniowe przesyłanie wi-
obecnie jeden z najlepszych na rynku pro- kosztował posiadaczy Leoparda jedynie... deo po HTTP, wykorzystuje kodeki H.264
duktów – głównym kryterium oceny był tu 29 dolarów. Za takie pieniądze Gigant i AAC, dynamicznie skaluje jakość trans-
stosunek wydajności do oszczędności. Nada-
z Redmond na pewno nie będzie chciał misji do możliwości łącza i potrafi serwo-
nie tym maszynom certyfikatu Ubuntu 9.04
Server Edition jest owocem intensywnych sprzedawać Windows 7 posiadaczom Vi- wać swoje strumienie także przez aktywne
testów w laboratoriach Canonical. Dodat- sty. WWDC 2009 okazało się być również zapory sieciowe. Ciekawe, jaka będzie od-
kowo Hewlett-Packard zobowiązał się do świetną okazją na premierę nowej przeglą- powiedź Microsoftu na to wszystko... Jed-
wydania pakietu obsługi dla Ubuntu, który darki Apple'a. Safari 4 z nowym silnikiem no jest pewne: druga połowa roku zapowia-
będzie zawierał sterowniki i aplikacje narzę-
skryptowym Nitro to 64-bitowa aplikacja, da się emocjonująco w kontekście rywali-
dziowe. Dzięki temu zarządzanie systemem
operacyjnym na serwerach amerykańskiego która w pełni swoje możliwości rozwinie zacji dwóch okienkowych gigantów.
giganta stanie się łatwiejsze. Steve George z dopiero w Snow Leopardzie. Ale i tak uru- http://www.zdnet.co.uk/
Canonical stwierdził, że certyfikowanie ser- chomienie jej na Windows i w starszych http://webhosting.pl/
werów HP to naturalny, kolejny krok w roz- wersjach MacOS X-a poraża szybkością:
woju Ubuntu – klienci firmy coraz częściej
według testów SunSpidera, przeglądarka
korzystają bowiem z tych maszyn.
http://www.eweek.com Apple'a jest ośmiokrotnie szybsza od In-

8 08/2009
Aktualności

Microsoft stawia na interope-


Microsoft i stan
Missisipi zawierają ugodę

racyjność między .NET i Javą


Microsoft oraz przedstawiciele stanu Mis-
sisipi w USA wspólnie ogłosili zawarcie
ugody i tym samym zakończenie ciągnące-
go się procesu antymonopolowego. Ugoda

P
odczas swojego wystąpienia na konfe- jest podoba do tych zawieranych z innymi
rencji JavaOne, Steve Martin, starszy dy- stanami na przestrzeni ostatnich lat. Micro-
rektor platformy produktów dla dewe- soft zgodził się zapłacić łącznie blisko 100
milionów dolarów wszystkim tym, którzy
loperów w Microsofcie, potwierdził nieustan- pomiędzy 1 stycznia 1996 roku a 11 czerw-
ne zaangażowanie firmy z Redmond w prace na ca 2009 dokonali zakupu systemu ope-
rzecz interoperacyjności systemów informatycz- racyjnego bądź innej aplikacji produkcji
nych budowanych w .NET i Javie. Zapewnił ze- firmy z Redmond. Bony będą mogły zostać
branych, że Microsoft przybył na JavaOne w ce- wykorzystane do zakupu oprogramowania
lub sprzętu. Również instytucje rządowe,
lach pokojowych. Nie ma w tym nic dziwnego które zakupiły produkt w tych latach będą
– przedstawiciele Redmond od dawna byli za- stym, dostępnym i tak łatwym we wdrożeniu uprawnione do otrzymania bonów pienięż-
praszani na JavaOne, zaś rzekoma wrogość mię- jak to tylko możliwe. Częścią tego zaangażowa- nych. Systemy operacyjne objęte ugodą to
dzy Sunem i Microsoftem jest raczej wymysłem nia ze strony Redmond jest na pewno udostęp- MS-DOS oraz Windows 95/98/ME/2000/XP,
podmiotów nieprzychylnych obydwu firmom, nienie kodu StockTradera 2.0 do wolnego pro- włączając Windows for Workgroups oraz
Windows NT Workstation. Microsoft zapła-
niż rzeczywistość. Odkąd w 2004 roku obie fir- jektu Stonehenge Fundacji Apache. Demon- ci za każdą sprzedaną kopię Windows 95,
my porozumiały się w kwestiach Javy, a Micro- struje to zachowanie interoperacyjności pomię- Windows 98 lub Windows ME dwanaście
soft wypłacił prawie dwa miliardy dolarów za dzy wielością software'owych platform, dzięki dolarów pod warunkiem, że nabywcą był
naruszenie własności intelektualnej Suna, sto- wykorzystaniu przez nich standardowych pro- mieszkaniec stanu Missisipi i że produkt na
sunki między tymi producentami oprogramo- tokołów W3C i OASIS. Teraz okazuje się, że Sun terenie tego stanu był używany. Kwota za
pakiet Office, w tym jego poszczególne ele-
wania układają się bardzo dobrze. Jak stwier- również przyłącza się do projektu Stonehenge menty, takie jak Word lub Excel bądź pozo-
dził Martin, obie firmy zaczęły wówczas inten- – przedstawicielka Suna, pani Aisling MacRun- stałe systemy Windows, wyniesie pięć dola-
sywnie ze sobą współpracować na polu tech- nels, podczas wystąpienia dyrektora Microsoftu, rów. Microsoft jest zadowolony z osiągnię-
nologii. Obsługa Javy w Windows, certyfikaty poinformowała, że jej firma będzie również do- cia porozumienia z Państwem i Missisippi z
Windows dla serwerów Suna, otwarcie protoko- starczała swój kod do StockTradera. Współpraca naszymi klientami w Mississippi – powie-
dział Steve Aeschbacher, zajmujący stano-
łów oprogramowania Microsoftu, porozumie- między Sunem (czyli de facto już Oracle) a Mi- wisko radcy generalnego Microsoft. Pienią-
nia prawne i licencje na wykorzystanie elemen- crosoftem dotyczyć będzie też kwestii cloud com- dze te będą naprawdę pomocne w czasie
tów Javy i .NET to dowody na to, że od lat Sun puting. Martin stwierdził, że sukces w dziedzi- kryzysu - dodaje Jim Hood z władz stanu.
i Microsoft zaangażowały się w projekty mające nie chmur obliczeniowych wiąże się dla więk- http://www.cnet.com/
na celu poprawę interoperacyjności. W udzielo- szości przedsiębiorstw z możliwością wykorzy-
Pierwsza rozwojowa
nym później serwisowi eWeek wywiadzie, Mar- stania szerokiego spektrum różnorodnych za- wersja Chrome dla Maca i Linuksa
tin stwierdził, że 73% zawodowych programi- sobów obliczeniowych, które mogą się między Google wydało pierwszą wersję dewelo-
stów polega na wykorzystaniu .NET lub kom- sobą bardzo różnić pod względem wykorzysta- perską przeglądarki Chrome przeznaczo-
binacji .NET i Javy. W tym sensie zarówno Ja- nych technologii. Kluczem do powodzenia są za- ną dla użytkowników systemów Linux
va, jak i .NET wygrały na rynku biznesowym i tem protokoły interoperacyjności. oraz Mac OS – sam producent jednak
odradza póki co korzystanie z niej na
dlatego jest konieczne, aby zarówno Microsoft, http://www.zdnet.co.uk/ co dzień. Chrome dla Maca i Linuksa w
jak i Sun postarały się o to, by interoperacyjność http://webhosting.pl dużej mierze to nic innego jak projekt
między tymi platformami była czymś rzeczywi- Chromium, tyle że pod inną nazwą. Na
blogu twórcy przeglądarki wielkimi lite-
rami stanowczo odradzają jednak pobie-

Windows 7 zostanie ranie tej wersji - chyba że jest się progra-


mistą. To właśnie dla nich skierowana jest

wydany 22 października ta bardzo wczesna edycja deweloperska.


Jest tu sporo racji, codzienne korzystanie
z tej wersji Chrome już teraz faktycznie

B
ill Veghte, zajmujący w Microsofcie sta- Szczegóły jednak nadal nie są znane. Według jest raczej utrudnione – nie ma w niej na
przykład obsługi wtyczek (nawet Flasha),
nowisko senior vice president w dziale nieoficjalnych informacji chodzi o okres od 28 nie można zmienić ustawień ochrony pry-
Windows, zapowiedział, że Windows czerwca 2009 do 31 stycznia 2010 r. Wersja watności, wybrać domyślnej wyszukiwarki
7 będzie dostępny dla klientów 22 październi- RTM zostanie udostępniona partnerom Micro- czy nawet wydrukować strony. Chromium
ka br. Rację miał więc dyrektor marketingu Ace- softu w drugiej połowie lipca. Daty pojawienia w rozmaitych testach publikowanych w
ra, który wcześniej podał datę 23 października. się w sprzedaży Windows Server 2008 R2 oraz Internecie wypada całkiem nieźle, jeśli
chodzi o wydajność i responsywność. W
Windows 7 pojawi się prawie dokładnie 8 lat po wydania jego wersji RTM mają być zbliżone do kwestii funkcjonalności przed programi-
Windows XP, który został wydany 25 paździer- dat Windows 7. Oba te systemy powstają bo- stami Google jeszcze bardzo daleka droga
nika 2001 roku. Microsoft potwierdził także, że wiem jednocześnie. – dzisiaj mamy wersję deweloperską,
osoby, które kupią komputer z Vistą na krótko http://www.microsoft.com/poland teraz powstać musi wersja beta, a dopiero
przed lub po premierze Windows 7, będą mo- potem światło dzienne ujrzy wersja okre-
ślana jako stabilna.
gły otrzymać za darmo licencję na ten system. http://dobreprogramy.pl/

www.sdjournal.org 9
Aktualności

Pierwsza
Google: jesteśmy
za mali na monopolistę

stabilna wersja Clojure


The Washington Post donosi, że Google
przyjmuje nową taktykę w obronie przed
nasilającą się presją ze strony władz anty-
monopolowych USA – chce przekonać

4
amerykański rząd, że jako firma jest zbył maja 2009 roku bieżąca wersja Clojure
mała na monopolistę. Administracja prezy- – młodego, lecz dynamicznie rozwijają-
denta George'a Busha dość łagodnie pod- cego się języka programowania dla śro-
chodziła do spraw antymonopolowych.
dowiska Java, została uznana przez jego twórcę,
Niektórzy uważają, że to właśnie Republi-
kanie uratowali Microsoft przed podzie- Richa Hickeya, za stabilną i opatrzona numerem la na efektywne skoncentrowanie się na rozwią-
leniem na dwie firmy na początku tego 1.0. Clojure rozpowszechniany jest na zasadach zywanym problemie i skróceniu czasu tworze-
stulecia. Teraz jednak zmienił się Kongres, zgodnych z Eclipse Public License 1.0. Clojure nia oprogramowania. Dodatkowym atutem Clo-
zmienił się także prezydent, a z nim przy- jest dynamicznym, funkcyjnym językiem pro- jure jest możliwość pracy w trybie interaktyw-
szedł nowy rząd i nowa szefowa ds. anty-
gramowania kompilowanym do bajtkodu ma- nym oraz wykorzystywania go jako języka skryp-
monopolowych – Christine Varney. Uważa
ona, że nadszedł moment, by dokładnie szyny wirtualnej Javy. Ten pragmatyczny język towego, co znacznie ułatwia naukę programowa-
przyjrzeć się firmie Google, gdyż według ogólnego przeznaczenia łączy wysoką efektyw- nia oraz prototypowanie. Dzięki unikalnemu po-
niej osiągnęła ona pozycję monopolisty ność ze zwięzłością, elegancją i prostotą składni łączeniu wielu funkcjonalności oczekiwanych
na rynku reklam on-line. Google broni się, oraz interaktywnością właściwą większości języ- od nowoczesnego i pragmatycznego języka pro-
przedstawiając się jako malutką firmę, jeśli
ków skryptowych. Doskonale wspiera współbież- gramowania, społeczność skupiona wokół Clo-
chodzi o rynek reklamowy. Istotnie, gigant
wyszukiwarkowy ma jedynie 2,66% udziały ność i wielowątkowość. Ściśle integruje się ze śro- jure bardzo szybko rośnie w siłę. Opracowano
w rynku reklam – uwzględniając telewizję, dowiskiem Javy, korzystając w pełni i wprost (bez już wtyczki dla NetBeans, vim, emacs, powsta-
radio, gazety czy e-maile. Google ponadto pośrednictwa dodatkowej warstwy translacji) z je również wtyczka dla Eclipse. Pod koniec ma-
argumentuje, że robi wiele dla społeczno- bogactwa jej zasobów. Dzięki temu rozwiązaniu ja planowane jest wydanie pierwszego podręcz-
ści, a o wizerunek prawny firmy już wkrót-
programy napisane z jego wykorzystaniem osią- nika pt. Programming Clojure autorstwa Stuarta
ce zadba nie kto inny jak Dana Wagner,
była prawniczka ds. antymonopolowych gają tę samą prędkość działania co programy na- Hallowaya. Póki co, można korzystać z dostęp-
z Departamentu Sprawiedliwości. Jeśli pisane w Javie. Łączenie pisanych w Clojure i Java nych w sieci samouczków: Clojure Programming
jednak spojrzeć tylko na reklamy w Inter- części tworzonego projektu jest bezproblemowe. (http://en.wikibooks.org/wiki/Clojure_Program-
necie, faktycznie okazuje się, że Google Sam język zawiera stosunkowo niewielką liczbę ming), Learning Clojure (http://en.wikibooks.org/
jest niekwestionowanym liderem. Wąt-
pierwotnych funkcji (ang. special forms), a wszyst- wiki/Learning_Clojure), czy Clojure – Func-
pliwe więc, by rząd USA przychylił się do
holistycznej definicji rynku reklamowego kie biblioteki standardowe napisane są w Cloju- tional Programming for the JVM autorstwa
nakreślonej przez Google. Raczej władze re, co daje możliwość ich modyfikacji lub napisa- Marka Volkmanna (http://jnb.ociweb.com/jnb/
antymonopolowe skupią się na dominują- nia na nowo. Gramatyka i składnia Clojure dzie- jnbMar2009.html#FP). Dostępne są również na-
cej pozycji tylko w zakresie reklam on-line, dziczy większość unikalnych cech języka Lisp grania prezentacji Richa Hickeya: Clojure for Ja-
a w takim przypadku do nazwania firmy
(np. kod źródłowy jako struktura danych języka, va Programmers (http://blip.tv/file/982823) oraz
monopolistą już bardzo niedaleko. Kto
wie, jak będzie wyglądać przyszłość firmy makra), nie będąc jednocześnie obciążona jego Clojure for Lisp Programmers (http://blip.tv/file/
z Mountain View – inni gracze, chociaż- balastem historycznym. Wykorzystuje również 1313398). Przystępne wprowadzenie w tajniki
by Microsoft, po zakwalifikowaniu się do idee obecne w innych językach programowania, programowania w Clojure zawiera również pol-
grona monopolistów są teraz stale moni- np. ML i Haskell. Zaprojektowana pod kątem ski serwis clojure.pl (http://clojure.pl/).
torowani, borykają się z niekończącymi
jak największej prostoty i użyteczności, pozwa- http://osnews.pl
się dochodzeniami, procesami i wyroka-
mi. Być może właśnie taki los czeka rów-

Bety odstraszają
nież Google.
http://dobreprogramy.pl/

Żywność za Internet Explorer 8...


Microsoft uruchomił kampanię Browser
for the Better, w ramach której za każde
użytkowników?
W
ściągnięcie przeglądarki Internet Explo- iele wskazuje na to, że być może westycję w wykorzystywanie pewnych usług
rer 8 przekaże $1,15 organizacji Feeding już wkrótce usługi Google, któ- – bądź co bądź pozostających w fazie testo-
America. Organizacja ta poprzez sieć re przy nazwach posiadają dopi- wej. Przykładem takiej aplikacji może być
banków żywności zaopatruje w arty-
kuły spożywcze 25 milionów Ameryka- sek beta, przemianowane zostaną na wersje Google Apps, którego co prawda finalna, ko-
nów. Microsoft chce, aby pomogła ona finalne. Z tego powodu wiele instytucji wy- mercyjna wersja Premier Edition nie posiada
wyżywić dzieci, które w okresie wakacji chodzi z założenia, że owe produkty są w fa- oznaczenia Beta, jednak wiele aplikacji wcho-
są pozbawione darmowych posiłków w zie testów i odkłada się w czasie ich produk- dzących w jej skład już nie. Najlepiej widocz-
szkołach. Ściągnięcia Internet Explorera 8 cyjne wdrożenie. Do takich wniosków doszli nym tego przykładem mogą być Gmail i inne
mają być liczone od 8 czerwca do 8 sierp-
nia, oczywiście tylko na stronie kampanii. pracownicy Google podczas odbywającej się aplikacje składające się na Google Docs. Pomi-
Korporacja chce za nie przekazać do mak- w tym tygodniu Google I/O Conference. O mo że od ich premiery minęło kilka lat i fir-
symalnie 1 miliona dolarów. Ciekawe, czy ile w przypadku użytkowników domowych ma początkowo zapowiadała wydanie wkrót-
ktoś z polskich internautów zamiast klik- oznaczenie to faktycznie przy nazwach wie- ce wersji oznaczonych jako finalne, do tej po-
nąć w pajacyka zechce wspomóc głodu- lu usług nie rodzi obaw, o tyle problem poja- ry większość pozostaje w fazie bety.
jących w USA...
http://www.microsoft.com/poland wia się w przypadku firm, które rozważają in- http://arstechnica.com/

10 08/2009
Aktualności

Palm Pre: świeża


Microsoft proponuje
Windows bez Internet Explorera

krew w smartfonach
Niemożliwe? A jednak – w związku z pro-
wadzonym dochodzeniem antymonopo-
lowym Microsoft rozesłał do producen-
tów sprzętu informację, że planuje rozwią-

6
czerwca br. miała miejsce być może naj- zanie problemu poprzez wydanie specjal-
ważniejsza tegoroczna premiera na ryn- nej wersji systemu Windows 7 całkowicie
ku smartfonów. Amerykańska sieć pozbawionej przeglądarki Internet Explorer.
Jeśli plany zostaną wcielone w życie, nowa
Sprint rozpoczęła bowiem sprzedaż modelu Pre, wersja systemu nazwana zostanie Windows
którym firma Palm, bardzo zasłużona w segmen- 7 "E", i podobnie jak wersja "N" pozbawiona
cie PDA, zamierza podbić serca klientów. No- odtwarzacza Windows Media Player, również
we urządzenie wykorzystuje zupełnie nowy sys- i ta dostępna będzie jedynie na rynku euro-
tem operacyjny webOS i bywa nazywane zabój- pejskim. Jakiś czas temu pisaliśmy, że Inter-
net Explorer 8 można wyłączyć (częściowo
cą iPhone'a. Po telefon ustawiły się kolejki, a sto- odinstalować) w Windows 7, ale wersja "E"
sunkowo niewielka liczba egzemplarzy dostar- ma pójść o krok dalej – w ogóle nie będzie
czonych do sklepów (50-60 w każdym) spowo- biera mniej energii otrzymujące e-maile natych- zawierać przeglądarki. Najważniejsze jest
dowała, że już po dwóch godzinach sporo zain- miast (obsługuje bowiem technologię push), niż jednak to, że w przeciwieństwie do wersji
teresowanych osób nie mogło cieszyć się z zaku- sprawdzając skrzynkę co jakiś czas, choć jest to ra- "N", tym razem na rynku europejskim nie
będzie alternatywy, czyli pełnej wersji z
pu Palma Pre wraz z dwuletnią umową z opera- czej wbrew intuicji. Napotkano także na pewne przeglądarką. Integratorzy OEM i sprzedaw-
torem. W takiej sytuacji sprzedawcy zaczęli two- problemy z zarządzaniem energią, ale Palm obie- cy sprzętu będą mogli otrzymać specjalne
rzyć listy oczekujących na kolejną dostawę urzą- cał je usunąć. Intensywnie używany Pre wytrzy- pakiety instalacyjne, dzięki którym w miarę
dzeń. Sprint nie ujawnił jednak, w ilu miejscach mał bez ładowania dwa dni, co jest dość dobrym potrzeby możliwa będzie preinstalacja prze-
telefonów zabrakło. Szacunki co do liczby eg- rezultatem. Jeśli ktoś ma zbędne 70 dolarów, to glądarki na nowych komputerach. Sprawa
będzie nieco bardziej skomplikowana dla
zemplarzy, które zostaną sprzedane w czasie bie- akumulatory tego smartfona można uzupełniać użytkowników, którzy samodzielnie zakupią
żącego weekendu, są różne. Oscylują bowiem od za pomocą wygodnej ładowarki indukcyjnej; w system – Microsoft planuje dla nich przygo-
ponad 50 do prawie 200 tysięcy sztuk. Klientów końcu jeśli urządzenie ma być bezprzewodowe, tować wersje instalacyjne Internet Explorera
do Palma Pre przyciąga przede wszystkim no- to niech będzie takie do końca. Oczywiście w na serwerach FTP i dostępnych oddzielnie w
wy system operacyjny webOS, który jest lepszy urządzeniu nie zabrakło aparatu fotograficzne- sprzedaży płytach CD. Trudno przewidzieć,
jak zareaguje na te informacje Komisja Euro-
od obecnych już na rynku (Symbian, Windows go, który zbudowano na bazie matrycy z trzema pejska. Jeśli zastanowić się jednak nad tym
Mobile, iPhone OS, Android, BlackBerry). Auto- milionami punktów. Jego zaletą jest minimalne nieco dłużej, to można dojść do wniosku, że
rom oprogramowania Pre przyświecała idea, że- opóźnienie między momentem naciśnięcia spu- wbrew pozorom może to być spore utrud-
by poszczególne czynności dało się zrobić lepiej i stu migawki a wykonaniem zdjęcia. Wyposaże- nienie dla użytkowników, a brak jakiejkol-
wygodniej. Jako sztandarowy przykład wcielenia nie Pre dopełniają moduły Wi-Fi, GPS oraz akce- wiek przeglądarki w systemie niekoniecznie
może być tym, o co chodzi władzom anty-
jej w życie przywoływana jest możliwość przełą- lerometr. 199 dolarów – taką właśnie sumę wy- monopolowym Unii Europejskiej...
czania się między jednocześnie uruchomiony- kładają chętni na Palma Pre na dzień dobry. Na- http://www.cnet.com/
mi aplikacjami bez konieczności przechodze- stępnie muszą płacić miesięczny abonament nie
nia przez menu startowe. W telefonie jest wresz- niższy niż 69,99 dolarów, ale w zamian otrzymu- Klapa MSN w Polsce,
cie możliwe to, co na zwykłym komputerze jest ją nielimitowaną transmisję danych. Sprint ma wkrótce przejęcie przez Agorę
Jak donosi serwis Internet Standard, polska
oczywistością. Użytkownik jest też np. powiada- wyłączność na sprzedaż Pre do końca 2009 ro- wersja portalu MSN zostanie wkrótce prze-
miany o przychodzącej poczcie za pomocą okna ku i jego najważniejsi konkurenci – Verizon Wi- jęta przez Agorę i wcielona do rodziny ser-
typu pop-up i jeśli chce ją przeczytać, to może po reless i AT&T – muszą zaczekać. Co ciekawe, jak wisów Gazeta.pl. Premiera polskiej wersji
prostu to zrobić od razu. Integracja kontaktów wynika z informacji z jednego ze sklepów w San serwisu MSN w czerwcu ubiegłego roku
pochodzących z wielu miejsc to następna dobra Francisco, mniej więcej połowa klientów kupują- nie wywołała burzy, a sam serwis niewie-
le mógł zaoferować czytelnikowi. Pomimo
cecha systemu opracowanego przez Palma. Pocz- cych Pre ma już iPhone’a. Jak możemy się z ko- aspiracji do roli portalu horyzontalnego na
ta firmowa, prywatny e-mail czy serwis społecz- lei dowiedzieć z serwisu Rapid Repair, który na- równi z innymi tuzami polskiego Interne-
nościowy: każde z tych źródeł jest równie dobre, tychmiast rozłożył nowego Palma na czynniki tu, MSN.pl zgromadził jedynie milion użyt-
a nie powoduje powielania tych samych informa- pierwsze, wartość elementów użytych do skon- kowników według marcowej edycji bada-
cji przypisanych do jednej osoby. Na polu sprzę- struowania smartfonu wynosi ok. 170 dolarów nia Megapanel PBI/Gemius. Po roku funk-
cjonowania polskiej wersji trudno więc
towym Palm Pre nie wyróżnia się jakoś specjal- – urządzenie jest więc dotowane w niewielkim zaliczyć projekt do udanych. W związku z
nie na tle konkurencji. Modnie zaokrąglone rogi stopniu albo wcale. Przyszłość Pre rysuje się ra- tą sytuacją i brakiem pomysłu na dalszy
czarnej obudowy, wysuwana ku dołowi klawia- czej w dobrych barwach, ale nie można zapo- rozwój portal już wkrótce przejdzie do rąk
tura QWERTY, ekran o przekątnej 3,1 cala (dla mnieć o jego słabościach. Nie wiadomo, jak szyb- Agory, która jak dotąd razem z MTV i Sony
porównania: iPhone ma 3,5 cala) i rozdzielczości ko rozwinie się rynek aplikacji; na razie można BMG była głównym dostawcą treści w ser-
wisie Microsoftu. Będzie on dostępny pod
320x480 pikseli (24-bitowy kolor) oraz wbudo- wybierać spośród około 20 propozycji. Jeden z nazwą msn.gazeta.pl, a całość pracować
wana pamięć o pojemności ośmiu gigabajtów. Po- tych programów służy do uruchamiania tysię- będzie w oparciu o technologie Windows
niżej ekranu umieszczona jest też powierzchnia cy aplikacji napisanych dla starszych wersji sys- Live. Gazeta uzyska także wyłączność na
czuła na dotyk, która może służyć np. do cofnię- temów operacyjnych opracowanych wcześniej sprzedaż i rozwijanie oferty reklamowej
cia się o jeden poziom w menu za pomocą proste- przez Palma. polskich produktów internetowych Micro-
softu.
go ruchu palcem. Jak wykazały testy, telefon po- http://www.palm.com/ http://www.internetstandard.pl/

www.sdjournal.org 11
Aktualności

Nowy iPhone 3G S,
Obowiązkowa cenzura
Internetu w Chinach
The Wall Street Journal donosi, że rząd
w Chinach planuje od 1 lipca wprowa-
dzenie obowiązku dołączania opro-
gramowania do cenzury Internetu do
nowe możliwości
N
każdego sprzedawanego komputera. ajnowsze dziecko filmy Apple, no-
Narzędzie, które ma być preinstalowane wy iPhone 3G S trafił do sprzeda-
na każdym komputerze sprzedawanym ży 19 czerwca br. Litera S w na-
w Chinach lub przynajmniej dołącza-
zwie modelu oznacza szybkość (ang. speed),
ne na płycie nazywać się będzie Green
Dam-Youth Escort. Rząd i producent czyli główną cechę przypisywaną temu urzą-
oprogramowania zapewnia, że celem dzeniu. Premierę nowego modelu poprzedzi-
cenzury jest ochrona młodzieży przed ły spekulacje w Internecie i precyzyjna kam-
nieodpowiednimi treściami – głównie pania firmy Apple. Kontrolowane przecie-
pornografią. Narzędzie będzie działać
ki i niekończące się plotki podgrzewały at-
w połączeniu z centralną bazą zabloko-
wanych witryn, na bieżąco aktualizowa- mosferę wokół nowego smartfona. W końcy
ną – jeśli użytkownik zechce wyświetlić przyszedł czas na oficjalną premierę podczas
witrynę znajdującą się na liście, dostęp World Wide Developers Conference. Jaki jest
będzie zablokowany. Zagraniczni eks- nowy iPhone? Design najnowszego modelu
perci po zapoznaniu się z oprogramo-
tylko nieznacznie różni się od wcześniejsze-
waniem ujawnili, że narzędzie oprócz
cenzury może także wysyłać do pro- go iPhone’a 3G. Natomiast całkowicie zmie-
ducenta informacje osobiste, powodo- niono wnętrze urządzenia. Bezpośrednie po-
wać usterki w funkcjonowaniu kompu- równanie obu modeli wskazuje, że 3GS mo- otrzymał układ graficzny wspierający biblio-
tera lub uczynić go bardziej narażonym że być nawet dwukrotnie szybszy od swojego tekę OpenGL ES 2.0. Model G3 oferował za-
na ataki.
pierwowzoru. Główne cechy nowego iPhone- ledwie OpenGL ES w wersji 1.1. Za grafikę w
Nie wiadomo też, co dokładnie i na
jakich warunkach ma być blokowane. ’a to: wbudowany aparat 3MP, nagrywanie fil- iPhone 3G S odpowiedzialny jest układ Powe-
Tak czy inaczej, od 1 lipca sprzedawcy mów w trybie VGA z prędkością 30 klatek na rVR SGX. Cóż, wygląda na to, że Apple nie
sprzętu będą musieli zgłaszać rządowi, sekundę (filmy można przesyłać bezpośred- żartowało, mówiąc o iPhone jako o potencjal-
ile komputerów z cenzurującym opro- nio do serwisów wideo lub za pomocą MMS- nie najlepszej platformie dla mobilnych gier.
gramowaniem sprzedali. W ubiegłym
a), sterowanie głosem, wbudowany kompas, OpenGL ES 2.0 jest zupełnie nową, inną niż
roku w Chinach sprzedano 40 milionów
pecetów. wsparcie dla OpenGL|ES 2.0, wszystkie wspomniana wersja 1.1, wersją API, stąd no-
http://dobreprogramy.pl/ funkcje dostępne w iPhone 3.0. Nowy model we wyzwania przed programistami – aby wy-
może się pochwalić poprawioną wydajnością korzystać moc układu i bibliotek, trzeba bę-
Google Squared uruchomione baterii. Umożliwia ona 10 godzin oglądania dzie napisać zupełnie nowy kod (obie wer-
Zgodnie z zapowiedzią Google urucho-
miło nową wersję swojej wyszukiwarki, wideo, 30 godzin słuchania muzyki lub 5 go- sje GL nie są ze sobą kompatybilne). Szyb-
prezentującą wyniki w postaci tabeli. dzin rozmów przez 3G. Wstępne ceny mode- szy rendering, programowalny potok gra-
Google Squared zostało stworzone lu to 199 dolarów za wersję 16 GB i 299 do- ficzny pozwalający uzyskiwać zupełnie no-
z myślą o znajdowaniu informacji na larów za mocniejsze 32 GB. Premierę w skle- we efekty (np. zaawansowany postprocessing
temat nie konkretnej rzeczy, ale grupy
pach przewidziano na 19 czerwca. Smartfon w oparciu o programowalne shader'y), znacz-
elementów. Przykładem mogą być np.
dystrybucje Linuksa, wersje Windows trafi w pierwszej kolejności do USA, Kanady, nie bardziej zaawansowane tekstury i dużo,
czy też cyfrowe lustrzanki Canona. Jak Francji, Niemiec, Włoch, Hiszpanii, Szwaj- dużo więcej... Litery ES w nazwie biblioteki
widzimy, stosowane jest tutaj wyszuki- carii i Wielkiej Brytanii. Później przyjdzie oznaczają specjalną wersję OpenGL dostoso-
wanie semantyczne, ponieważ wyszu- czas na kolejne kraje. Wprowadzenie nowego waną do urządzeń ultramobilnych. Wygląda
kiwarka rozpoznaje, o jaką katego-
modelu oznacza obniżkę cen poprzedniego na to, że przy takich możliwościach pierwot-
rię pytamy i odpowiednio dostosowu-
je kolumny. Tak więc dla Windowsów iPhone'a 3G. Za wersje z 8GB trzeba będzie ne zastosowanie smartfona może zejść na bar-
jest kolumna z ceną, a dla Linuksów zapłacić 99 dolarów. Programistów, a szcze- dzo daleki plan.
kolumna z licencją. W przypadku posta- gólnie programistów gier, ucieszy zapew- http://www.newsweek.pl
ci historycznych znajdziemy kolum- ne najbardziej fakt, iż nowy smartfon Apple http://www.frazpc.pl
ny z datą urodzenia i śmierci. Z kolei
dla państw są takie kolumny jak stoli-
ca, liczba ludności czy religie. Można
też dodawać własne kolumny, wpisując
je lub wybierając spośród proponowa-
Netbeans 6.7 RC 1
F
nych. Nowa wyszukiwarka jest jeszcze irma Sun Microsystems udostępni- do kontroli buildów, zintegrowano środowi-
we wczesnej fazie rozwoju i nietrud-
ła wersję RC 1 otwartego środowi- sko z serwerem aplikacji GlassFish oraz na-
no zauważyć, że wyszukiwanie seman-
tyczne sprawia jej problemy. Wyników ska programistycznego NetBeans 6.7 rzędziem Hudson. Wprowadzono również
jest często zaskakująco mało, a dane Wersja ta zawiera wiele nowości i udogod- rozszerzenia w modułach języków Java, PHP,
z poszczególnych kolumn bywają nie- nień, m. in. została zintegrowana z platfor- Ruby, Groovy i C/C++, dodano też obsługę
prawdziwe. Należy jednak oczekiwać, mą Kenai umożliwiającą wygodną współpra- JavaScript 1.7.
że jakość wyników wkrótce ulegnie
cę wielu zespołów programistów nad projek- http://www.netbeans.org/
poprawie.
http://dobreprogramy.pl/ tem, wprowadzono obsługę narzędzia Maven

12 08/2009
Aktualności

Flex i Flash: unifikacja środowi- MySpace zwolniło


jedną trzecią pracowników

ska deweloperskiego Adobe Mimo nie najgorszej kondycji finansowej


i wciąż obserwowanego wzrostu, MySpa-
ce postanowiło zwolnić 30% swojej załogi.
Firma chce rzekomo powrócić do kultury

K
oniec z Flex Builderem: Adobe Sys- startupowej. Najprawdopodobniej szuka
tems zamierza zintegrować swoje na- jednak tylko dobrego uzasadnienia do
rzędzia do projektowania i progra- wprowadzenia radykalnych oszczędno-
ści. Z pierwszych, nieoficjalnych informacji
mowania. Wszystko po to, aby promować
wynikało, że MySpace może zwolnić nawet
świadomość marki, jaką jest Flash, i pozbyć połowę z 1,5 tysiąca zatrudnianych osób.
się zamieszania związanego z funkcjonowa- zdecydowano się połączyć całą rodzinę narzę- Ostatecznie z pracą pożegna się niemal
niem obok siebie produktów, których zakres dzi pod nazwą Flash. Ma to pomóc Adobe w pięćset. Cięcia będą dotyczyć w takim
wykorzystania nie był dla deweloperów oczy- walce z kolejną generacją Silverlight'a, której samym stopniu wszystkich amerykań-
skich oddziałów spółki. Nie jest do końca
wisty. Adobe ogłosiło dlatego wydanie narzę- wydanie zapowiadane jest już na lipiec bie-
jasne, czy redukcje obejmą zagraniczne
dzia do budowy zaawansowanych interfejsów żącego roku. A co nowego we Flash Builde- filie. Stosunkowo najbardziej prawdopo-
użytkownika Flash Catalyst (znanego wcze- rze 4? Przede wszystkim widać w nim efek- dobne jest to w Europie. Owen Van Natta,
śniej pod nazwą kodową Thermo). Wyda- ty współpracy pomiędzy Adobe a Zend Tech- dyrektor generalny MySpace, stwierdził, iż
niu temu towarzyszyć będzie Flash Builder nologies. Nowa wersja IDE zawiera wbudo- zdaje sobie sprawę z tego, że zapropono-
wane zmiany są bardzo bolesne, aczkol-
4 – nowa odsłona bazującego na Eclipse śro- wany silnik Zend, który ma ułatwić łączenie
wiek w jego opinii ruch ten jest nieodzow-
dowiska deweloperskiego Adobe, które znane flashowych front-end'ów aplikacji z back-en- ny po temu, aby odbudować innowacyjne
było niegdyś jako Flex Builder. Mihai Corlan, d'em tworzonym w PHP. Dostępne są także środowisko, które skoncentruje się na użyt-
ewangelista Adobe, tak wyjaśnił przyczyny tej nowe łączniki dla back-end'ów tworzonych w kowniku i produkcie. Van Natta pracował
zmiany nazwy: Kiedy pytam na konferencji lu- Javie i uruchamianych na serwerach ColdFu- wcześniej dla Facebook'a. Zastąpił w kwiet-
niu w MySpace Chrisa DeWolfe'a, którego
dzi – 'kto z Was jest programistą Flex'a? – wie- sion, a wszystko obsługiwane jest poprzez wy-
do dobrowolnej rezygnacji namówił nowy
lu ludzi nie jest pewnych, co odpowiedzieć. godny interfejs typu przeciągnij i upuść. Doda- supermenedżer do spraw Internetu w
Dlaczego tak jest? Bo niektórzy z Was używa- no także mechanizmy, dzięki którym możli- News Corp (właściciel MySpace), Jonathan
ją framework'a Flex do budowy aplikacji AIR we jest bezpośrednie przenoszenie obiektów Miller. Tej czystki spodziewano się zresz-
lub Flex, ale nie naszego IDE (Flex Buildera), pomiędzy Catalystem a Builderem; będą one tą już od roku. Z drugiej strony nieoficjal-
nie wiadomo, że ogłoszone przez Van Nattę
a niektórzy używają Flex Buildera, ale nie ko- synchronizowały poprawki wprowadzone w
cięcia nie będą dotyczyć kadry zarządzają-
rzystają z framework'a Flex (wykorzystują jednym z tych programów z kodem zawar- cej wysokiego szczebla. Jej celem będzie
ActionScript 3 do tworzenia aplikacji we Fla- tym w drugim. Ma to być możliwe dzięki no- utrzymanie przychodów, przede wszyst-
shu. Stąd ta niepewność). Ludzie do tej pory wemu formatowi wymiany danych, który fir- kim odnowienie na korzystnych warun-
myśleli często, że istnieje jakaś fundamental- ma nazwała FXG. Jedno jest pewne: Adobe kach umowy reklamowej z Google.
http://mashable.com/
na różnica pomiędzy Flex'em a Flashem – nie powiedziało ani słowa na temat możliwej
wyjaśnił Corlan. Jednak aplikacje Flex'a są po integracji swoich narzędzi z konkurencyjną DOSBox 0.73,
prostu kompilowane do pliku SWF i odtwa- platformą .NET. Osoby zainteresowane tech- nowy emulator starego DOSa
rzane za pomocą Flash Playera. Dzięki nowe- nologiami firmy Adobe mogą pobrać Flash Po około dwóch latach prac wydano kolej-
mu nazewnictwu możliwe będzie także za- Builder 4 beta ze strony http://labs.adobe.com/ ną wersję kultowego już emulatora syste-
mu operacyjnego DOS – DOSBox 0.73, za
kreślenie różnicy pomiędzy płatną wersją Fle- technologies/flashbuilder4/. Flash Catalyst jest pomocą którego można uruchomić starsze
x'a a opensource'owym framework'iem, udo- zaś dostępny na stronie http://labs.adobe.com/ programy i gry nie działające poprawnie lub
stępnianym przez firmę za darmo. Jako że zaś technologies/flashcatalyst/. nawet w ogóle nie uruchamiające się pod
spośród wszystkich produktów firmy najbar- http://webhosting.pl nowymi systemami Windows. Pomimo że
dziej rozpoznawalną markę ma Flash Player, http://www.adobe.com/ zmiana oznaczenia w stosunku do poprzed-
niej wersji nie wskazywałaby na olbrzymie
zmiany, to jednak nowa odsłona programu

USB 3.0 w Linuksie zawiera całkiem sporą ich listę. Nowościa-


mi w tym wydaniu są wsparcie dla systemu
operacyjnego Windows Vista oraz szereg

K
ilka miesięcy po tym, jak światło dzien- na dodanie w jądrze 2.6.31, którego premiera poprawek mających na celu poprawę sta-
bilności i szybkości pracy. Jako te najważniej-
ne ujrzała wersja robocza specyfikacji planowana jest we wrześniu. W tym samym cza- sze wymienić należy wprowadzenie wspar-
Super Speed USB (USB 3.0), NEC za- sie na rynku pojawić się mają pierwsze urządze- cia dla większej ilości trybów i kart graficz-
prezentował pierwszy gotowy kontroler zgodny z nia wykorzystujące USB 3.0. Wkrótce potem ste- nych, nowy rdzeń emulacji OPL, aktualiza-
najnowszą wersją specyfikacji. Jak się okazuje, nie rownik znajdzie się najprawdopodobniej w naj- cję modułów dźwiękowych dla systemu Mac
trzeba było długo czekać na pierwszy sterownik popularniejszych dystrybucjach Linuksa, mię- OS X, rekompilację rdzenia oraz mnóstwo
poprawek zgodności. Ponadto dodano pod-
do obsługi urządzeń wykorzystujących ten stan- dzy innymi Ubuntu. Linux będzie pierwszym stawową obsługę sterownika edev klawiatu-
dard pod Linuksem. Autorką sterownika jest Sa- systemem oferującym oficjalne wsparcie dla tego ry, łatki do obsługi pamięci (EMS/XMS) oraz
rah Sharp, pracująca w dziale Centrum Techno- standardu. Osoby zainteresowane obsługą USB zaimplementowano specjalne tryby pracy
logii Open Source w Intelu, który zaprezentował 3.0 mogą skompilować ręcznie sterownik, korzy- dla układów graficznych S3, Paradise i Tseng.
projekt specyfikacji USB 3.0. Sterownik dołączo- stając z odpowiednich repozytoriów. Szczegółową listę zmian znaleźć można na
oficjalnej stronie projektu.
ny został do kolejki sterowników oczekujących http://www.techit.pl/ http://www.dosbox.com/

www.sdjournal.org 13
Biblioteka miesiąca

Grails,
Groovy i rusztowania
Tworzymy aplikacje do blogowania
Grails jest prostym środowiskiem z ogromnymi możliwościami.
Czytając artykuł, dowiesz się, co ukrywa się w jego wnętrzu, jakiego
rodzaju rozwiązania są stosowane oraz jaką rolę w tym wszystkim ma
język Groovy. Krok po kroku dowiesz się, jak łatwo i przyjemnie można
napisać aplikację internetową, która w większości stworzy się sama.
• kontrolery zbudowane na bazie środowi-
Dowiesz się: Powinieneś wiedzieć: ska Spring MVC;
• Czym jest środowisko Grails; • Czym są języki dynamiczne; • język tworzenia widoków Groovy Server
• Do czego służą poszczególne typy klas i pli- • Co to jest ORM oraz Hibernate; Pages (GSP);
ków; • Czym jest wzorzec MVC; • wbudowany kontener servletów Jetty;
• Jak prosto stworzyć aplikację przy użyciu • Jaka jest zasada działania kontrolerów w • mechanizm wstrzykiwania zależno-
rusztowania. aplikacjach internetowych; ści oparty na środowisku Spring Frame-
• Czym jest JSP oraz JSTL. work;
• wbudowany mechanizm umiędzynara-
dawiania.
czy Django (dla języka PHP). Jest zbudo-
wany w oparciu o środowiska Hibernate Jednak ponad wszystko to właśnie wykorzy-
Poziom i Spring Framework przy wykorzystaniu stywanie języka dynamicznego Groovy jest
trudności języka dynamicznego Groovy. Dodatko- głównym atutem środowiska Grails i wy-
wo środowisko oparte jest na mechaniź- różnia je spośród szerokiej gamy środowisk
mie wtyczek, dzięki czemu dodatkowe świata Javy, tworząc intuicyjne rozwiązanie
funkcjonalności można dołączać do śro- zapatrzone w język, który wyglądem i dzia-

K
ażdy programista dąży do uprosz- dowiska wedle potrzeby (podobnie z ich łaniem przypomina to, do czego jesteśmy
czenia mechanizmów działających wyłączaniem). Środowisko Grails podob- już przyzwyczajeni.
w jego aplikacji. Zasada ta implikuje nie jak środowisko Ruby on Rails umożli-
tworzenie coraz większej liczby nowych śro- wia użycie zestawu przydatnych poleceń, Groovy
dowisk. Bardzo często wymagają one żmud- dzięki którym możemy stworzyć wiele, Groovy jest dynamicznym językiem obiek-
nej konfiguracji oraz ogromnej liczby biblio- nie używając żadnego IDE (ang. Integra- towym obiektowo działającym na maszynie
tek, które i tak nie są potem używane. Często ted Development Environment). Spis najpo- wirtualnej Java (JVM). Pierwsze wzmian-
te środowiska różnią się między sobą przyjętą pularniejszych poleceń widzimy w ram- ki o języku pojawiły się na blogu Jamesa
konwencją i nie przedstawiają spójnych me- ce. Polecenia wykonywane są przez narzę- Strachana w 2003 roku, zaś wersja 1.0 ję-
chanizmów. Na szczęście środowisko Gra- dzie Gant, które jest odmianą narzędzia zyka została opublikowana w 2007 roku.
ils nie należy do tej grupy, co więcej, bardzo Apache Ant. Różnica między tymi narzę- Groovy tworzy alternatywę dla klasyczne-
przyjemnie rozwiązuje przedstawione pro- dziami polega na tym, że Ant używa pli- go statycznie typowanego języka Java dzię-
blemy. ków XML do zdefiniowania logiki, zaś ki zaczerpnięciu cech takich języków jak:
Gant używa skryptów napisanych w ję- Ruby, Python, Perl, a nawet Smalltalk czy
Czym jest Grails zyku Groovy. Lisp. Przykładowe zestawienie składni ję-
Grails jest prostym środowiskiem tworze- Domyślna instalacja środowiska Grails zyków Ruby, Java oraz Groovy znajduje się
nia aplikacji internetowych. Jest odpowie- posiada szereg cech użytkowych, których w Listingach 1, 2 i 3. Mimo składni zbliżo-
dzią na ciężkie środowiska, których sto- istnienie w alternatywnych środowiskach nej do wielu języków dynamicznych, Gro-
sowanie sprowadza się do stwierdzenia: bardzo często leżało w gestii wdrożenia ich ovy potrafi z powodzeniem używać więk-
przerost formy nad treścią. Grails pozwa- przez samego programistę: szości elementów klasycznej składni języka
la znacznie przyspieszyć tworzenie apli- Java, a co za tym idzie ,umożliwia korzysta-
kacji internetowych dzięki koncepcjom za- • uproszczony mechanizm mapowania nie z istniejących bibliotek języka Java. Naj-
ciągniętym ze środowisk dynamicznych, obiektowo-relacyjnego (ORM) oparty istotniejszą cechą języka Groovy jest fakt,
takich jak Ruby on Rails (dla języka Ruby) na środowisku Hibernate; że jest to język dynamiczny. Kompilatoro-

14 08/2009
Grails, Groovy i rusztowania

wi przetwarza kod do standardowego ko- możliwość modyfikacji stworzonych elemen- aplikacja posiada implementację wszelkich
du bajtowego w trakcie wykonywania apli- tów lub nadpisania ich swoimi. Napisana w operacji niezbędnych do zarządzania zbio-
kacji. Czyni to z języka Groovy potężny ję- ten sposób aplikacja może zostać w pewnym rem książek w bazie danych.
zyk skryptowy posiadający dostęp do obiek- etapie pozbawiona rusztowania, gdy wszyst- Cała potęga mechanizmu rusztowania po-
tów działającej aplikacji. Ale uwaga, czyni kie wymagane funkcje będą oprogramowa- lega na szybkim wytwarzaniu prototypu, któ-
to język bardzo dynamicznym i w ten spo- ne przez nas. ry można potem dowolnie modelować, doda-
sób to, co nie istniało podczas fazy kompila- Przykładowo, załóżmy że chcemy stwo- jąc nowe lub modyfikując domyślne operacje.
cji (i byłoby tym samym nie do zaakcepto- rzyć prostą aplikację o wspomnianym typie W naszym przypadku operacje stworzone
wania przez kompilator języka Java), może CRUD. W środowisku Grails sprowadza się przez rusztowanie to: tworzenie książki, wy-
pojawić się później, już w trakcie działania to do stworzenia klasy domenowej, np. Samo- świetlanie danych o książce, wyświetlanie li-
programu w Groovy. chód, gdzie podane zostaną właściwości kla- sty książek, aktualizacja danych o książce i ka-
sy, np. kolor, data produkcji, marka. Następ- sowanie wybranej książki.
Programowanie nie należy wybrać tryb rusztowania, w środo-
w oparciu o rusztowanie wisku Grails do dyspozycji mamy rusztowa- Struktura aplikacji
Jednym z głównych atutów środowiska nie dynamiczne i statyczne. Wiemy już, czym jest środowisko Grails,
Grails jest programowanie w oparciu o Przy dynamicznym rusztowaniu genero- Groovy i Scaffolding. Czas więc zabrać się
rusztowanie (ang. Scaffolding). Funkcjo- wany kod reaguje na każdą zmianę w klasie za praktyczne wykorzystanie tej wiedzy
nalność rusztowania została zaimplemen- domenowej. Przykładowo, dodając właści- i stworzenie aplikacji. Rozpoczęcie pra-
towana w wielu współczesnych środowi- wość przebieg do naszej klasy Samochód, cy ze środowiskiem Grails zaczynamy od
skach takich jak Ruby on Rails, CakePHP, środowisko automatycznie uzupełni wido- tworzenia struktury projektu. Najprost-
Monorail, Gaia, i było niedostępne dla pro- ki o odpowiednie pole i umożliwi kontro- szym i zalecanym sposobem na stworze-
gramistów Java aż do teraz. Scaffolding jest lerowi edycję oraz sortowanie po tym po- nie struktury jest wywołanie polecenia gra-
metodą tworzenia aplikacji, wykorzystu- lu. Dynamiczne rusztowanie w środowi- ils create-app. Jako parametr należy podać
jąc gotowe elementy. Elementy te stanowią sku Grails ma dużą zaletę, którą jest moż- nazwę nowej aplikacji. W naszym przypad-
wsparcie początkowych etapów projekto- liwość nadpisywania elementów ruszto- ku będzie to nazwa programu do zarządza-
wania i implementacji aplikacji. W mia- wania. Przykładowo, jeśli nie podoba nam nia blogiem – GrailsBlog. Wynik działania
rę postępu przy tworzeniu własnych im- się sposób wyświetlania listy samochodów, polecenia przedstawiony jest na Rysunku
plementacji tych elementów , można bez można z powodzeniem stworzyć własny
problemu zdjąć wykorzystywane elemen- plik list.gps. Plik obsłuży wyświetlanie li- Listing 1. Przykładowa metoda w języku
ty, podobnie jak to się dzieje przy zdejmo- sty przy zachowaniu całej reszty rusztowa- Ruby
waniu rusztowania z budynku, gdy jest on nia bez zmian.
już zakończony. Statyczne podejście polega na generowaniu def myRailsMethod
Autor takiej aplikacji tworzy obiekty do- rzeczywistych klas i plików widoków ruszto- i = 10
menowe, na podstawie których środowisko wania. Statyczne rusztowanie możemy wyge- while i < 0
generuje dalszy kod aplikacji. Metoda pozwa- nerować, wykonując polecenie grails genera- @article = Article.new
la na tworzenie szybkich prototypów aplika- te-all lub używając narzędzia np. NetBeans @article.save
cji zgodnych z przyjętą konwencją. Przykłado- IDE. Spowoduje to, iż kod zostanie zapisa- i = i + 1
wo, dla aplikacji bazujących na obiektach do- ny w postaci źródeł na dysku i wszelkie zmia- end
menowych środowisko generuje funkcjonal- ny będą musiały być wprowadzone przez nas end
ność typu CRUD (ang. Create, Read, Upda- ręcznie. Jest to uciążliwe, gdy bardzo często
te, Delete). Funkcjonalność ta to nic innego zmieniamy klasy domenowe. Jednak pozwa- Listing 2. Przykładowa metoda w języku Java
jak zestaw mechanizmów umożliwiających: la to na modyfikację kodu używanego rusz-
tworzenie, czytanie, aktualizację oraz kaso- towania. public void myJavaMethod() {
wanie elementów w bazie danych z pozio- Niezależnie od wybranego trybu środo- int i = 10;
mu aplikacji. wisko wygeneruje odpowiednie metody dla while ( i < 0 ) {
W zależności od przyjętego sposobu uży- kontrolera do obsługi klasy Samochód, oraz Article article = new Article()
cia mechanizmu rusztowania posiadamy zestaw widoków. Stworzona w ten sposób article.save();
i = i + 1;
}
Najważniejsze polecenia środowiska Grails }
• grails clean – czyści katalog tymczasowy środowiska;
• grails create-app – tworzy strukturę aplikacji opartej na środowisku Grails; Listing 3. Przykładowa metoda w języku
• grails create-controller – generuje pustą klasę kontrolera; Groovy
• grails create-domain-class – generuje pustą klasę domenową;
• grails create-taglib – tworzy pusty znacznik dla widoku;
def myGroovyMethod = {
• grails generate-controller – generuje klasę kontrolera na podstawie klas domeno-
wych; def i = 10
• grails generate-views – generuje pliki *.gsp na podstawie klas domenowych; while ( i < 0 ) {
• grails generate-all – generuje kontrolery i widoki na podstawie klas domenowych; def article = new Article()
• grails run-app – uruchamia aplikacje, używając kontenera Jetty na porcie 8080; article.save()
• grails run-app [-https] – uruchamia aplikacje, używając protokołu https na porcie
i = i + 1
8443;
• grails test-app – uruchamia testy jednostkowe w aplikacji; }
• grails war – tworzy archiwum WAR dla kontenerów zgodnych z Java EE. }

www.sdjournal.org 15
Biblioteka miesiąca

1. Struktura aplikacji pisanej w środowisku snych znaczników używanych na stronach nie się konfiguracji środowiska. Dużym plu-
Grails oparta jest o konwencję. Oznacza to, GSP. Ostatecznie katalog i18n zawiera tzw. sem dla środowiska i jego autorów jest fakt,
że każdy z katalogów tej struktury ma zde- message bungles, czyli pliki zawierające tek- iż domyślna konfiguracja jest w stanie za-
finiowaną funkcję. sty aplikacji w różnych językach. Dla każ- spokoić wszystkie nasze początkowe potrze-
Najbardziej istotnym katalogiem aplika- dego, kto miał chociaż trochę wspólnego z by i specjalnie nie trzeba jej zmieniać. Ma to
cji jest katalog grails-app, w którym znajdu- projektami Java EE, dalsza struktura wyda- duży wpływ na odbiór środowiska przez pro-
ją się najważniejsze elementy funkcjonalne je się być logiczna i przejrzysta. Na uwagę gramistę, który, pisząc kod, od razu może ob-
naszej aplikacji. Zawiera on kilka istotnych zasługuje katalog test, gdzie gromadzone są serwować jego działanie, bez potrzeby analizy
podkatalogów, takich jak: conf, controllers, testy jednostkowe oraz integracyjne. Śro- dokumentacji.
domain, i18n, services, taglib, utils i views. dowisko posiada wbudowany mechanizm Konfiguracja środowiska Grails zosta-
W katalogach domain, controllers i views tworzenia testów. Dzięki temu testowanie ła tak rozwiązana, aby możliwe było pozby-
znajdują się odpowiednio klasy domenowe, jest przyjemne dla programisty. Nic tak nie cie się tzw. koszmaru XML. Po prostu nie
kontrolery oraz pliki widoków GSP. Kata- przemawia do programisty jak samogene- piszemy plików XML, tylko klasy lub skryp-
log conf zawiera pliki i katalogi niezbędne rujące się testy. ty w języku Groovy, dzięki czemu cała kon-
do konfiguracji środowiska. Katalog services figuracja jest intuicyjna, czytelna i ma po-
zawiera klasy usługowe, czyli niezależną lo- Konfiguracja stać kodu – do którego przecież programi-
gikę biznesową wywoływaną przez kontro- Przed rozpoczęciem pisania właściwej apli- ści są przyzwyczajeni. Nie uwzględniając do-
ler. Katalog taglib zawiera definicje wła- kacji rozsądnym podejściem jest przyjrze- datkowych wtyczek oraz integracji ze środo-
wiskiem Spring i Hibernate, całość konfigu-
Listing 4. Przykładowa konfiguracja źródła danych racji aplikacji można zawrzeć w czterech pli-
kach. Są to:
enviroment {
development { • Config.groovy;
dataSource { • DataSource.groovy;
dbCreate = „create-drop" • UrlMappings.groovy;
url = „jdbc:hsql:mem:blogDB" • BootStrap.groovy.
username = „sa"
} W pliku Config.groovy zawarta jest głów-
test { na konfiguracja aplikacji. Należy przez to
dataSource {
dbCreate = „update"
url = „jdbc:mysql://localhost/testBlogDB"
driverClassName = „com.mysql.jdbc.Driver"
username = „tester_no_23"
password = „sometestpassword"
}
}
production {
dataSource {
dbCreate = „update"
url = „jdbc:mysql://blogDBHost/blogDB"
driverClassName = „com.mysql.jdbc.Driver"
username = „root"
password = „somepassword"
}
}
}

Listing 5. Zmiana domyślnego mapowania


class User {
// ...
static mapping = {
table ‘uzytkownicy’
version false
id column: ‘id_uzytkownika’
columns {
name column: ‘pierwsze_imie’
// ...
}
}
} Rysunek 1. Struktura aplikacji działającej w
środowisku Grails

16 08/2009
Grails, Groovy i rusztowania

rozumieć, iż plik ten traktowany jest jako wisko będzie korzystać tylko z jednego seg- tadane o naszej klasie, takie jak na przy-
główne źródło stałych konfiguracji wyko- mentu, ułatwiając przy tym życie testerom kład: kolejność wyświetlania przy użyciu
rzystywanych przez aplikację. Domyślnie i programistom . rusztowania, listę możliwych stanów da-
konfiguracja główna składa się z definicji Plik UrlMappings.groovy zawiera konfi- nej zmiennej, podstawowe informacje po-
typów plików akceptowanych przez konte- gurację kontenera odpowiedzialną za od- trzebne przy kontroli poprawności. Dla kla-
ner, używanych kodowań oraz podstawo- wzorowanie adresów na odpowiednie akcje sy User możemy użyć, jeśli będziemy po-
wej konfiguracji mechanizmu logowania. kontrolerów. Konfiguracja ma postać zwy- siadać odpowiednie właściwości w tej kla-
Jednak nic nie stoi na przeszkodzie dla do- kłej klasy języka Groovy. Dzięki intuicyjnej sie, następujących elementów blogu static
dania własnych stałych, które następnie konstrukcji pozwala na proste modyfikacje constraints:
możemy używać w aplikacji. Przykładowo domyślnej metody mapowania, która wyglą-
załóżmy, że chcemy ustawić wyświetla- da następująco: /$controller/$action?/ • login(size: 5..40, blank: false,
ną wersję naszej aplikacji, stwórzmy więc $id?. Wpis oznacza, iż przykładowo wywo- unique: true)
wpis: blogApp.version=”Grooviest Blog łanie akcji list z kontrolera EntryController • password(blank:false, password:
Ever 1.0 google-like Beta”. Następnie odbywać się będzie, gdy klient zażąda odpo- true)
w dowolnym miejscu aplikacji za pomo- wiedzi z kontekstu /entry/list. Konfigu- • userType(inList: ["User","Admin"])
cą obiektu GrailsApplication pobieramy rację można zmieniać w dowolny rozsądny
tę wartość. Przykładowy odczyt zmiennej sposób, mechanizm daje nam duże pole do W ten sposób poinformujemy środowisko
wygląda następująco: def version = gr popisu. Dodatkowo ilość przykładów takiej Grails, że przy wykorzystanym mechaniź-
ailsApplication.config.blogApp.version konfiguracji zlokalizowanej w Internecie mie dynamicznego rusztowania:
. Istotną cechą konfiguracji w środowisku jest naprawdę duża.
Grails jest to, iż mamy możliwość tworze- Ostatnim omawianym plikiem związanym Listing 6. Klasa domenowa User
nia stałych w postaci wpisu do klasy języ- z konfiguracją środowiska Grails jest plik Bo-
ka Groovy. Tak więc nie musimy konwer- otStrap.groovy. Z praktycznego punktu wi- class User {
tować wszystkiego z typu String, ponie- dzenia zawiera on informacje o wykonywa- String login
waż tworzymy stałe od razu określonego nych podczas startu aplikacji. Przykładowo, String password
typu. Jeśli jednak wolimy klasyczną kon- jeśli pragniemy, aby nasza aplikacja posiadała String name
figurację w stylu plików typu properties jakieś dane po uruchomieniu, to piszemy od- String surname
lub pragniemy przenieść pewne elemen- powiedni kod w tym właśnie pliku. Na tym Boolean userType
ty konfiguracji do innych plików groovy, kończymy naszą przygodę z konfiguracją śro- static constraints = {
to również jest to możliwe. Wystarczy tyl- dowiska. Było prosto, szybko oraz bez ani jed- login(size: 1..40, blank:
ko dodać własny wpis na temat lokalizacji nej linii XML-a. Czas więc zabrać się za wła- false, unique:
zewnętrznej konfiguracji do właściwości ściwą aplikację. true)
grails.config.locations w głównym pliku password(blank:false,
konfiguracyjnym. Klasy dziedzinowe password:true)
Plik DataSource.groovy, jak sama nazwa Konstrukcja naszej aplikacji blogowej za- name()
mówi, zawiera informacje o konfiguracji cznie się od wyznaczania dziedziny, w któ- surname()
źródeł danych dla aplikacji. Silnik Hiberna- rej będzie pracować. Znaczy to nie więcej userType(inList:
te przetwarza pośrednio tę konfigurację do niż określenie, na jakich klasach/obiektach ["User","Admin"])
postaci obiektu javax.sql.DataSource, któ- domenowych będziemy opierać działanie }
ry następnie tworzy połączenia. Przewa- programu. Dla celów prezentacji działania }
gą tworzenia konfiguracji źródła danych w środowiska ograniczymy się do tworzenia
klasie aplikacji jest brak obowiązku tworze- trzech klas dziedzinowych. Powinny w zu- Listing 7. Klasa domenowa Entry
nia źródeł na każdej instancji serwera apli- pełności wystarczyć do stworzenia działają-
kacyjnego. Nie wspominając już o uwol- cego bloga. class Entry {
nieniu się od konfiguracji pliku XML. Do- Tymi klasami są: String title
myślna konfiguracja zawiera jedno źródło String body
danych wskazujące na bazę HSQLDB. Jed- • Entry – reprezentująca wpis w blogu; static hasMany = [comments:
nak nic nie stoi na przeszkodzie, aby zmie- • Comment – reprezentująca komentarz do Comment]
nić rodzaj bazy. Dostępne są wszystkie ba- wpisu; static constraints = {
zy wspierane przez środowisko Hibernate. • User – typowa encja pozwalająca na }
Każdy, kto kiedykolwiek miał do czynie- identyfikacje użytkownika. }
nia ze środowiskiem Hibernate, zauważy,
iż plik DataSource.groovy posiada identycz- Wszystkie trzy klasy domenowe można Listing 8. Klasa domenowa Comment
ne pola co klasyczna konfiguracja tego po- stworzyć ręcznie lub za pomocą polece-
pularnego środowiska. Dodatkowym atu- nia grails create-domain-class [Nazwa _ class Comment {
tem źródeł danych w środowisku Grails jest Klasy]. Polecenie wygeneruje plik o rozsze- String author
możliwość definiowania źródła w zależno- rzeniu groovy, np. User.groovy. Wygenerowa- String body
ści od trybu pracy. Na Listingu 4 widzi- ny przez nas plik jest pełnoprawną klasą ję- Entry entry
my przykładową konfigurację do tworzo- zyka Groovy. Plik będzie zlokalizowany w static belongsTo = [entry:Entry]
nej przez nas aplikacji. Konfiguracja źró- katalogu grails-app/domain. Wygenerowane static constraints = {
deł jest podzielona na trzy segmenty: de- w ten sposób trzy klasy nie będą miały żad- }
velopment, test i production. W zależno- nej implementacji z wyjątkiem bloku sta- }
ści od trybu uruchomienia aplikacji środo- tic constraints. Blok constraints zawiera me-

www.sdjournal.org 17
Biblioteka miesiąca

• kolejność wyświetlania właściwości kla- Pozostałe właściwości tej, oraz reszty klas tional Mapping). Jest to nakładka na środo-
sy User to login, password, userType; domenowych, znajdują się w Listingach 6, wisko Hibernate umożliwiające nam defi-
• właściwość login oraz password nie mo- 7 oraz 8. Przeglądając listingi, możemy na- niowanie modelu danych w klasach języ-
że być pusta; trafić na pola będące metadanymi, ale nie ka Groovy.
• właściwość login musi być unikalna leżącymi w bloku static constraints. Mechanizm GORM posiada jedną dodat-
oraz mieć długość od 5 do 40 znaków; Jak możemy się domyśleć, są to metadane kową funkcjonalność, o której warto wspo-
• właściwość password jest typu hasło; określające relacje klas domenowych. Ca- mnieć mimo faktu, iż nie będzie wykorzy-
• właściwość userType posiada tylko łość mechanizmu tworzenia modelu do- stywana w naszej aplikacji.Chodzi o funk-
dwa stany określone w parametrze menowego w środowisku Grails opiera się cjonalność o nazwie GORM DSL (ang. Gra-
inList. na tzn. GORM-ie (ang. Grails Object Rela- ils Object Relationa Mapping Domail Spe-
cific Language). Umożliwia ona korzysta-
Listing 9. Klasa kontrolera użytkownika nie z istniejących schematów baz danych i
zmiany domyślnej konfiguracji środowiska
class UserController { Hibernate. Dzięki niej możemy dostoso-
wać nasz model domenowy do istniejących
def scaffold = User już schematów. Przykładowe użycie języka
def login = { DSL możemy zobaczyć w Listingu 5. Użyte
} tam mapowanie pozwala na zdefiniowanie
klasy domenowej User, która tak naprawdę
def doLogin = { będzie tworzona na podstawie danych z ta-
def user = User.findWhere(login:params['login'],password: beli o zupełnie innej konstrukcji niż defi-
params['password']) nicja klasy.
if(user){ Łatwo się domyśleć, iż faktyczna aplikacja
session.user = user będzie miała znacznie bardzie skomplikowa-
redirect(controller:'entry', action:'list') ną warstwę danych niż ta, którą teraz imple-
}else{ mentujemy. Przedstawiony model jest bar-
redirect(controller:'user', action:'login') dzo uproszczony i ma za zadanie tylko przed-
} stawić istotę działania tego elementu środo-
} wiska. Widzimy jednak, iż wraz ze środowi-
skiem otrzymujemy potężny zestaw mecha-
def logout = { nizmów do definiowania modelu domeno-
session.user = null wego aplikacji nawet na podstawie istniejącej
redirect(controller:'entry', action:'list') już bazy danych.
}
} Kontrolery w blogu
Posiadając prawidłowy model domeno-
Listing 10. Klasa kontrolera wpisu wy naszej aplikacji, możemy się zabrać do
class EntryController { tworzenia kontrolerów. Kontrolery w śro-
dowisku Grails są typowymi klasami ję-
def scaffold = Entry zyka Groovy, których pliki kończą się cią-
giem znaków: Controller.groovy. Niech kon-
def beforeInterceptor = [action:this.&checkUser, except:['index','list']] troler zarządzający wpisami w blogu nazy-
wa się EntryController.groovy. Kontrole-
def checkUser = { ry są prototypowane (tworzone oddziel-
if(!session.user){ nie dla każdego żądania), dzięki czemu nie
redirect(controller:'user', action:'login') ma problemów z wieloma wątkami czy też
} kwestii spornych związanych z wzorcem
} singleton.
} Zasada działania jest prosta, każdy kontro-
ler posiada jedną lub więcej bloków przetwa-
Listing 11. Klasa kontrolera komentarza rzających zapytanie klienta. Bloki nazywane
class CommentController { są akcjami i domyślnie reprezentują wywo-
def scaffold = Comment łanie odpowiedniego adresu przez przeglą-
darkę (dzięki mapowaniu zdefiniowanemu
def beforeInterceptor = [action:this.&checkUser] w UrlMappings.groovy). Przykładowo, akcja
w kontrolerze EntryController o definicji:
def checkUser = {
if(!session.user){ def index = {
redirect(controller:'user', action:'login') render 'Boo!'
} }
}
} będzie wywoływana jako domyślna akcja i
po przetworzeniu żądania wypisze na stro-

18 08/2009
Grails, Groovy i rusztowania

nie wskazany ciąg znaków. Wywołanie tej żemy wykorzystać w kontrolerze. Przykła- dzie ona odpowiedzialna za wylogowanie
akcji może się odbyć zarówno z kontekstu dowe metody to: count, createCriteria, użytkownika z bloga. Odbywa się to przez
/entry/index, jak i z kontekstu /entry/. exists, find, get i list. Środowisko Gra- wyczyszczenie referencji do obiektu w sesji,
Aby stworzyć kontroler, wystarczy wy- ils posiada wiele takich niespodzianek. czyli zwykłym wywołaniem session.user
wołać polecenie grails create-controller Użyta metoda findWhere potrafi odszukać = null. Przedstawiony mechanizm daleko
[Nazwa_Kontrolera]. Zacznijmy od kon- wpis w bazie spełniający kryteria. W przy- odbiega od ideału, ale doskonale pokazuje
trolera dla klasy domenowej User. Kontro- padku gdy metoda znajdzie pasujący wpis, w skrócie możliwości kontrolerów. Jeśli jed-
ler zgodnie z konwencją będzie się nazywał akcja ustawia go w zakresie sesji. Wszyst- nak pragniemy napisać mechanizm autoryza-
UserController.groovy i będzie zlokalizo- ko dzięki prostemu i intuicyjnemu wpiso- cji z prawdziwego zdarzenia, to możemy sko-
wany w katalogu controllers. Ponieważ pra- wi session.user = user. Ostatecznie gdy rzystać z wtyczki AcegiSecurity. Udostępnia
gniemy mieć możliwość tworzenia, edy- akcja ustawi już obiekt w sesji, przekiero- ona mechanizm znany użytkownikom środo-
cji, przeglądania oraz kasowania użytkow- wuje zapytanie do następnej akcji metodą wiska Spring.
ników naszego bloga, to musimy albo za- redirect. Podobne przekierowanie odby- Posiadamy już mechanizm zarządzania
implementować każdą z akcji samodziel- wa się w przypadku, gdy użytkownikowi użytkownikami włącznie z logiką autory-
nie, albo użyć mechanizmu rusztowania. nie uda się zalogować. zacji. Trzeba teraz to wykorzystać i napi-
Wspomniany wcześniej mechanizm w tym Ostatnim napisanym przez nas blokiem sać kontrolery do klas domenowych Entry
przypadku jest nieoceniony. Wystarczy do- w kontrolerze User będzie akcja logout, bę- i Comment. Ponieważ każdy programista ma
dać do klasy kontrolera wpis: def scaffold
= User, aby środowisko w czasie wykony- Listing 12. Fragment strony logowania użytkownika
wania (dynamicznie) stworzyło wszystkie
akcje operujące na klasie domenowej User. <g:form action="doLogin" method="post">
W konsekwencji posiadamy klasę z całkiem <div class="dialog">
przyzwoitą implementacją takich akcji jak: <p>Enter your login details below:</p>
list, show, edit, delete, create, save oraz <table class="userForm">
update. <tr class='prop'>
Jednak zarządzanie klasą domenową to nie <td valign='top' style='text-align:left;' width='20%'>
wszystko. Użytkownik musi się przecież lo- <label for='login'>Login:</label>
gować, aby mieć możliwość zarządzania blo- </td>
giem. Nic więc nie stoi na przeszkodzie, aby <td valign='top' style='text-align:left;' width='80%'>
dodać akcje odpowiedzialne za logowanie do <input id="login" type='text' name='login' value='${user?.login}' />
systemu. Na Listingu 9 widzimy, że kontroler </td>
użytkownika posiada dodatkowe trzy akcje z </tr>
tym związane. <tr class='prop'>
Akcja login nie posiada implementacji, <td valign='top' style='text-align:left;' width='20%'>
ponieważ jej działanie ma na celu wyświetle- <label for='password'>Password:</label>
nie ekranu logowania. Zgodnie z konwencją </td>
kontener po przejściu przez akcję wyświetla <td valign='top' style='text-align:left;' width='80%'>
stronę widoku o nazwie odpowiadającej na- <input id="password" type='password' name='password'
zwie wykonanej akcji. W tym przypadku zo- value='${user?.password}' />
stanie wyświetlony plik login.gsp, o którym </td>
więcej dowiemy się w części artykułu poświę- </tr>
conej widokom. </table>
Akcja doLogin zawiera implementację </div>
logiki związanej z faktycznym logowaniem <div class="buttons">
się użytkownika. Akcja używa statycznej <span class="formButton">
metody findWhere klasy domenowej User <input type="submit" value="Login"></input>
do znalezienia w bazie wpisu pasującego </span>
do podanego hasła oraz identyfikatora. Za- </div>
uważyłeś pewnie Drogi Czytelniku fakt, iż </g:form>
nie pisaliśmy przecież w modelu domeno-
wym żadnego mechanizmu wyszukiwania. Listing 13. Wyświetlanie listy wpisów wraz z komentarzami
Zwłaszcza że napisanie tak generycznej me- <g:each in="${entryInstanceList}" status="i" var="entryInstance">
tody na pewno by zajmowało wiele linii ko- <g:link action="show" id="${entryInstance.id}">
du. W skrócie mówiąc, tworząc klasę dome- ${fieldValue(bean:entryInstance, field:'title')}
nową Grails (za pomocą Groovy), automa- </g:link>
tycznie wyposażona ona zostaje w zestaw ${fieldValue(bean:entryInstance, field:'body')}
przydatnych statycznych metod, które mo- Comments:
<g:each in="${entryInstance.comments}" status="j" var="commentInstnace">
Author: ${fieldValue(bean:commentInstnace, field:'author')}
W Sieci ${fieldValue(bean:commentInstnace, field:'body')}
• http://grails.org/ </g:each>
• http://groovy.codehaus.org </g:each>

www.sdjournal.org 19
Biblioteka miesiąca

w sobie coś z leniucha, to także i my ułatwi- nego Java Server Pages, więc każdy, nawet wizualną omawianego ekranu proponuję
my sobie trochę życie, korzystając z dostar- początkujący programista, powinien od ra- zająć się we własnym zakresie. Dlatego też
czanych przez Grails funkcjonalności. Uży- zu się odnaleźć w nowych znacznikach. Wi- w Listingu 13 widzimy znaczniki ze strony
jemy mechanizmu rusztowania także i w dok tworzy się przy użyciu zestawu dodat- list.gsp kontrolera entry pozbawione wszel-
tych dwóch kontrolerach. Jak widzimy w kowych znaczników, domyślnie zaczynają- kich wpisów klasycznego języka HTML.
Listingach 10 oraz 11, wpisy informują- cych się od przedrostka g, przykładowo g: Przedstawiona logika prezentacji strony
ce o używaniu rusztowania różnią się tyl- form, wymieszanych na przemian z trady- składa się z dwóch pętli. Pętla zewnętrzna
ko typem klasy domenowej używanej przez cyjnymi znacznikami języka HTML. Tech- operuje na wpisach, wypisując tytuł wpisu
kontroler. Dodatkowo w obydwu kontro- nologia dodatkowo GSP dostarcza znacznie oraz ciało wpisów. Druga wewnętrzna pę-
lerach zaimplementowana jest prosta ak- bardziej rozszerzony język wyrażeń (ang. tla iteruje po wszystkich komentarzach da-
cja sprawdzająca, czy w sesji istnieje już za- Expression Language) w porównaniu z kla- nego wpisu i wyświetla autora komentarza
logowany użytkownik. Jeśli nie, akcja prze- syczną biblioteką JSTL. oraz jego treść. W przedstawionym listingu
kierowuje do żądania do akcji logowania. O Na Listingu 12 widzimy prosty formu- całość kodu wygląda przyjemnie i przede
ile konstrukcja tej akcji jest dosyć prosta, o larz logowania, który będzie znajdować się wszystkim ładnie. Osoba znająca bibliote-
tyle jej wykorzystanie już jest bardziej inte- we wspomnianej już wcześniej stronie lo- kę JSTL powinna widzieć wyraźne podo-
resujące. gin.gsp. Zapewni nam on możliwość wywo- bieństwa i z łatwością powinna się oswoić
Zauważyłeś pewnie Drogi Czytelniku, iż łania akcji doLogin z poziomu ekranu logo- z nową technologią.
w każdym z omawianych kontrolerów ist- wania. W konsekwencji pozwoli nam on za- Działający kod wraz z odpowiednimi
nieje zmienna beforeInterceptor. Przypi- logować się do naszego bloga. Formularz za- znacznikami HTML i stylami przedstawio-
sana do niej akcja będzie wykonywana za- wiera tylko jeden znacznik wychodzący po- ny jest na Rysunku 2.
wsze przed wywołaniem akcji docelowej. za listę znaczników języka HTML. Tworząc
W konsekwencji, jeśli użytkownik będzie stronę w technologii GSP, nie musimy sto- Podsumowanie
chciał na przykład dodać wpis do bloga, a sować skomplikowanych znaczników zastę- Początkowo podszedłem do środowiska
nie będzie zalogowany, to zostanie od razu pujących znaczniki input, jak to ma miej- Grails bardzo sceptycznie. Można nawet
przekierowany do ekranu logowania. Do- sce w środowisku JSF. Możemy zauwa- powiedzieć, że z góry skazałem tę techno-
datkowo przy deklaracji zmiennej możemy żyć, iż przy polach tekstowych w atrybu- logię na przegraną. Moje opinia była opar-
użyć parametru except, zawierającego listę cie value zastosowana została konstrukcja ta na fakcie, iż z roku na rok wychodzi no-
akcji, przy których nie uwzględnia się wy- zawierająca znak ?. Znak ten jest operato- we środowisko lub nowa ładniejsza wersja
wołania akcji checkUser. Ostatnią rzeczą rem bezpiecznej dereferencji (ang. safe de- już istniejącego, oraz fakcie, iż przy tym
wartą wyjaśnienia przy tworzeniu kontro- reference operator). Dzięki niemu, w sytu- konkretnym środowisku trzeba się nauczyć
lerów jest sposób wywołania akcji przy uży- acji gdy z jakichkolwiek przyczyn w zakre- nowego języka. Jednak spróbowałem stwo-
ciu przedrostka &. Język Groovy pozwala sie strony brakować będzie obiektu user, rzyć prostą aplikację, aby zobaczyć chociaż,
na bezpośrednie oraz pośrednie odwoływa- to użytkownik nie otrzyma informacji o czym niektórzy programiści się zachwyca-
nie się do pól oraz metod. Aby wykorzystać wyjątku. W tym przypadku wyrażenie bę- ją. Zmieniłem moją negatywną opinię, gdy
sposób bezpośredni przy metodzie, należy dzie miało wartość null. W efekcie ozna- po 90 minutach udało mi się dodać oraz
użyć omawianego przedrostka. W ten spo- cza to, iż będzie ono traktowane jako pu- modyfikować elementy w bazie danych
sób interpreter języka odwoła się do meto- sty ciąg znaków. przez stworzoną aplikację. Muszę zazna-
dy (akcji) bez pośrednictwa innych niepo- Posiadamy już ekran logowania. Cała czyć, że przedtem nie wiedziałem praktycz-
trzebnych metod. reszta widoków w aplikacji w zasadzie wy- nie nic o środowisku, więc ilość czasu, któ-
generowana została automatycznie. Jedy- rą na to poświęciłem, naprawdę mnie za-
Widoki nie część wyświetlającą listę wpisów na blo- skoczył. Nie przekonuję Cię Drogi Czytel-
Środowisko Grails udostępnia własny me- gu musimy tak zmodyfikować, aby ładnie niku, abyś polubił to środowisko, ale propo-
chanizm tworzenia widoków w postaci pli- pokazywała treść bloga i komentarze. Przez nuję: spróbuj napisać chociaż jedną aplika-
ków o rozszerzeniu gsp (ang. Groovy Server określenie ładnie mam na myśli tylko i wy- cję, a na pewno wyrobisz sobie pozytywną
Pages).Jest on bardzo podobny do klasycz- łącznie piękno kodu źródłowego. Stroną opinię o tej technologii. Zwyczajnie spró-
buj pobić mój czas, po tej lekturze na pew-
no Ci się to uda.

MARIUSZ RÓG
Pracuje na stanowisku Solution Developer w fir-
mie Acxiom Polska. Specjalizuje się w tworzeniu
aplikacji wykorzystujących złożone zasoby da-
nych dla międzynarodowych klientów wielu sek-
torów przemysłu. Acxiom Polska jest częścią no-
towanej na giełdzie NASDAQ globalnej korpo-
racji Acxiom. Łącząc dane, unikalne know-how
oraz technologię, zapewnia kompleksowe roz-
wiązania w zakresie zarządzania zintegrowany-
mi informacjami o klientach.
Rysunek 2. Widok listy wpisów z uwzględnionymi znacznikami HTML Kontakt z autorem: mariusz.rog@gmail.com

20 08/2009
Opis CD

Redakcja Software Developer’s Journal specjalnie dla swoich


najwierniejszych czytelników przygotowała archiwum wszystkich wydań
SDJ i SDJ Extra z 2008 roku.
Nasi czytelnicy mogą mieć dostęp do wszystkich artykułów w formacie .pdf. Elektroniczna wersja wszystkich artykułów z 2008 ro-
ku to egzemplarz unikatowy i każdy powinien go mieć!

Redakcja nie udziela pomocy technicznej


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

Jeśli nie możesz


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

www.sdjournal.org 21
Klub techniczny Adobe

Bazy danych
w Adobe AIR
Adobe AIR i SQLite. Zapoznajemy się z wbudowaną w runtime AIR
obsługą bazy danych.

zostało na Listingu 1. Prezentowany kod


Dowiesz się: Powinieneś wiedzieć: ilustruje sposób połączenie z bazą danych
• Jak wykorzystać bazę danych w AIR • Podstawy technologii Flex i AIR przechowywaną w pliku artTest1.db. W
• Podstawy języka ActionScript 3 pierwszym kroku tworzymy obiekt odpo-
• Jak posługiwać się jezykiem SQL wiedzialny za połączenie z bazą. W oma-
wianym przykładzie, jeśli plik (baza) nie
istnieje, jest on tworzony w czasie wyko-
nania metody open klasy SQLConnection.
Wykonanie pojedynczego zapytania re-
bieranych plików, cookies czy też zapi- alizowane jest przez klasę SQLStatement.
sanych zakładek. Ponieważ pliki baz da- Wszelkie dane zwrócone w wyniku wy-
Poziom nych nie są szyfrowane możemy odczy- konania zapytania są przechowywane w
trudności tać je w naszej aplikacji AIR. W pierw- obiekcie klasy SQLResult. Dostęp do wy-
szej jednak kolejności zapoznajmy się z ników zapytania uzyskujemy poprzez me-
podstawową obsługą bazy danych w Ado- todę SQLStatement.getResult(). Pozy-
be AIR. skany obiekt zawiera dane wybrane za-

J
edną z ważnych cech Adobe AIR, nie pytaniem SELECT (SQLResult.data), id
poruszaną przez nas do tej pory, jest Połączenie z bazą danych dodanego wiersza dla zapytania INSERT
obsługa bazy danych. W aktualnej Zarządzanie bazą danych realizowane (SQLResult.lastInsertRowID) oraz in-
wersji AIR daje możliwość korzystania z jest poprzez klasy z pakietu flash.data.*, formacje o liczbie wierszy przetworzonych
wbudowanej obsługi bazy danych SQLi- pakiet ten jest dostępny jedynie dla apli- w ostatnim zapytaniu INSERT, UPDATE,
te. Dzięki temu możemy korzystać z pra- kacji AIR. Do połączenia z bazą danych DELETE (SQLResult.rowsAffected).
wie wszystkich cech języka SQL92. Krót- wykorzystujemy klasę flash.data.SQLC Adobe AIR dostarcza dwa możliwe ty-
ka lista nie obsługiwanych elementów stan- onnection. Przykładowe nawiązanie po- py połączenia – synchroniczne i asynchro-
dardu dostępna jest na stronie projektu łączenia z bazą danych przedstawione niczne. Połączenie synchroniczne przed-
SQLite. Warto tutaj wspomnieć, że SQLi-
te implementuje między innymi podzapy-
tania, triggery czy też widoki. Dodatko-
wo w przypadku SQLite nie mamy osobne-
go procesu RDBMS, cała baza danych prze-
chowywana jest w pojedynczym pliku. Po-
łączenie z bazą sprowadza się zatem do wy-
brania i otwarcia odpowiedniego pliku. Pli-
ki z bazą danych nie są standardowo kodo-
wane, dzięki czemu możemy bazą zarzą-
dzać korzystając z dostarczanej aplikacji
konsolowej.
SQLite jest bardzo popularnym syste-
mem zarządzana bazą danych. Jest między
innymi używany przez przeglądarkę Mo-
zilla Firefox. Baza danych została zastoso-
wana do przechowywania historii odwie-
dzanych stron internetowych, historii po- Rysunek 1. Struktura bazy (SQLSchema) dla bazy firefoxa

22 08/2009
Bazy danych w Adobe AIR

stawione zostało na Listingu 1. Połączenia


synchroniczne są łatwiejsze do zaprogra- Listing 1. Synchroniczne połączenie z bazą danych
mowania. Jednak, ponieważ wszystkie wy- // tworzymy obiekt odpowiedzialny za połączenie z bazą
wołania wykonywane są w głównym wątku, var sqlCon:SQLConnection = new SQLConnection();
możliwe jest chwilowe zawieszenie aplika- // wybieramy bazę z którą chcemy się połączyć
cji. Wykorzystanie połączenia asynchro- var dbFile:File = File.desktopDirectory.resolvePath('artText1.db');
nicznego powoduje, że wszystkie operacje var firstOpen:Boolean = dbFile.exists == false;
wykonywane są w trybie nie blokującym // nawiązujemy połączenie z bazą. Jeśli baza nie istnieje zostane uwtorzona
działania naszej aplikacji. Listing 2 przed- sqlCon.open( dbFile, SQLMode.CREATE );
stawia asynchroniczną wersję kodu zawar- // przy pierwszym otwarciu tworzymy przykładową tabele
tego w poprzednim przykładzie. if ( firstOpen )
Korzystając z asynchronicznego połącze- {
nia z bazą danych, możemy wybrać sposób var tblc:SQLStatement = new SQLStatement();
w jaki jesteśmy powiadamiani o zakończe- tblc.sqlConnection = sqlCon;
niu operacji. Na Listingu 2 wykorzystuje- tblc.text = "CREATE TABLE test_table ( date DATE, value float )";
my mechanizm responderów. tblc.execute();
Obiekt klasy Responder posiada jedynie };
dwie właściwości Responder.result oraz // wpisujemy dane do tabeli
Responder.status. var query:SQLStatement = new SQLStatement();
Właściwości te przechowują funkcje query.sqlConnection = sqlCon;
użytkownika, które zostaną wykonane w query.text = "INSERT INTO test_table ( date, value ) VALUES ( date('now'), @VALUE
zależnie od tego czy wywołanie metody, dla )";
której określony został responeder, zakoń- query.parameters["@VALUE"] = Math.random();
czy się sukcesem czy błędem. query.execute();
Obiekt klasy Responder może być prze- // zamykamy połączenie z bazą
kazany jako parametr do większości metod sqlCon.close();
klasy SQLConnection i SQLStatement. Dru-
gie podejście polega na nasłuchiwaniu od-
powiednich zdarzeń klasy SQLConnection.
Podejście to jednak wydaje się być jednak
trudniejszym do nadzorowania. Nie mo-
żemy jednak korzystać jednocześnie z obu
mechanizmów, zastosowanie responderów
powoduje zablokowanie rozgłaszania zda-
rzeń.
Na Listingu 2 zaprezentowana zosta-
ła także jeszcze jedna ważna funkcjonal-
ność dostępna w Adobe AIR, jaką są zapy-
tania z parametrami. Dzięki temu mecha-
nizmowi możemy wielokrotnie wykorzy-
stywać to samo zapytanie zmieniają jedy-
nie wartości parametrów wstawianych do
zapytania. Parametr w zapytaniu na postać
@nazwa_parametru, aby ustawić jego war- Rysunek 2. Cookies pobrane z bazy danych przeglądarki firefox
tość piszemy query.parameters[„@nazwa_
parametru”] = ‘moja wartosc’.
Oba poprzednio przedstawione przykła-
dy powodowały utworzenie na dysku nowej
bazy danych. Jeśli jednak w aplikacji mamy
potrzebę wykorzystania bazy danych, ale
nie chcemy jej zapisywać na dysku, może-
my utworzyć bazę w pamięci. Taka baza da-
nych ma funkcjonalność taką samą jak ba-
za danych przechowywana na dysku. Jed-
nak dane w niej zapisane zostaną utraco-
ne wraz z zamknięciem połączenia z taką
bazą. Wirtualne bazy danych tworzone są,
jeśli jako parametr określający źródło bazy
danych zamiast obiektu File przekazana
zostanie wartość null.
Wraz z pojawieniem się Adobe AIR 1.5
mamy także możliwość szyfrowania pliku
bazy danych. Standardowo bazy danych Rysunek 3. Przykładowa aplikacja inSync dostępna na stronach Adobe

www.sdjournal.org 23
Klub techniczny Adobe

SQLite nie są szyfrowane, przez co każdy


Listing 2. Asynchroniczna wersja połączenia z Listingu 1 może naszą bazę otworzyć i zapoznać się
// metoda inicjująca połączenie z bazą danych z jej zawartością. Szyfrowanie bazy odbywa
private function sqlconnect():void się na etapie jej tworzenia. Przykład two-
{ rzenia zaszyfrowanej bazy danych przedsta-
sqlCon = new SQLConnection(); wiony jest na Listingu 3.
var dbFile:File = File.desktopDirectory.resolvePath('artText1.db'); Hasło wykorzystane do szyfrowania mu-
firstOpen = dbFile.exists == false; si mieć długość dokładnie 16 znaków i mo-
// asynchroniczne połączenie z bazą. Jeśli wystąpi błąd wywołana zostanie metoda że być zmienione w dowolnej chwili z wy-
sqlError. korzystaniem metody reencrypt. Meto-
// Jeśli połączenie powiedzie się wywołana zostanie metoda connectSuccess da ta może być wykonana jedynie na ba-
sqlCon.openAsync( dbFile, SQLMode.CREATE, new Responder( connectSuccess, sqlError ) ); zie wcześniej zaszyfrowanej. Nie można w
}; ten sposób zaszyfrować bazy, która nie by-
// po otwarciu bazy danych zainicjujemy ją lub dodamy dane ła wcześniej zabezpieczona. Wykorzystu-
private function connectSuccess( data:Object ):void jąc szyfrowaną bazę danych oraz obszar
{ EncryptedLocalStore możemy być pewni,
if ( firstOpen ) że prywatne dane naszej aplikacji nie zosta-
{ ną przechwycone.
var tblc:SQLStatement = new SQLStatement();
tblc.sqlConnection = sqlCon; Pobieranie struktury bazy
tblc.text = "CREATE TABLE test_table ( date DATE, value float )"; Jak wspomniałem we wstępie, przeglądar-
// zapytanie wykonane zostanie asynchronicznie ka Firefox korzysta z bazy SQLite do prze-
tblc.execute( -1, new Responder( insertData, sqlError) ); chowywaniawielu ciekawych danych. Po-
} else insertData(); bierzmy je. Swoją uwagę skupimy na pli-
}; kach cookies.sqlite oraz places.sqlite. Pierw-
// wstawienie danych do bazy szy z nich przechowuje ciasteczka zapisa-
private function insertData( data:Object = null ):void ne podczas odwiedzania stron. W drugim
{ natomiast zapisana jest historia odwiedza-
var query:SQLStatement = new SQLStatement(); nych stron. Jak jednak możemy pobrać da-
query.sqlConnection = sqlCon; ne z bazy, której struktury nie znamy ? Z
query.text = "INSERT INTO test_table ( date, value ) VALUES ( date('now'), @VALUE pomocą przychodzi nam możliwość po-
)"; brania struktury danych (SQLSchema).
query.parameters["@VALUE"] = Math.random(); Mechanizm ten pozwala nam pobrać in-
// zapytanie wykonane zostanie asynchronicznie, po nim zamykamy bazę formację o – tabelach, indeksach, trigge-
query.execute( -1, new Responder( sqlclose, sqlError) ); rach oraz widokach zdefiniowanych w
}; otwartej bazie danych. Dzięki temu po-
// zamknięcie bazy danych znajemy także zapytania SQL tworzące
private function sqlclose( data:Object ):void poszczególne elementy, oraz szczegółową
{ charakterystykę wszystkich kolumn. Ry-
sqlCon.close(); sunek 1 przedstawia strukturę bazy prze-
}; chowującej historię odwiedzanych stron
// powiadomienie o błędzie z pliku places.sqlite. Kod realizujący to za-
private function sqlError( data:Object ):void dania przedstawiony został na Listingu 4.
{ Dzięki możliwości pobierania sktruktu-
trace( " @@ SQL ERROR @@ "); ry bazy możemy z łatwością czytać dowol-
}; ne bazy SQLite. Rozbudowując aplikację z
Rysunku 1 możemy także stworzyć uży-
teczny program do zarządzania bazami da-
Listing 3. Tworzenie zaszyfrowanej bazy danych nych, który może być alternatywą dla apli-
kacji konsolowej.
// klucz wykorzystany do zaszyfrowania bazy Kiedy już znamy strukturę bazy, może-
var encryptKey:ByteArray = new ByteArray(); my przejść do pobierania danych. Na Ry-
encryptKey.writeUTFBytes('superEncryptionP');
// tworzymy połączenie z nową bazą
var sqlCon:SQLConnection = new SQLConnection();
Kody źródłowe
Kody źródłowe przykładowych aplikacji
var dbFile:File = File.desktopDirectory.resolvePath('artText1.db'); do artykułów :
var firstOpen:Boolean = dbFile.exists == false;
// tworzymy nową bazę szyfrowaną podanym wczesniej hasłem • Wprowadzenie do Adobe AIR
sqlCon.open( dbFile, SQLMode.CREATE, false, 1024, encryptKey ); • Klient serwisu twitter.com
• Bazy danych w Adobe AIR
// Dalej jak na listingu 1
// …. dostępne są na stronie
http://segfaultlabs.com/docs

24 08/2009
Bazy danych w Adobe AIR

sunku 2 przedstawione zostały dane wycią- przeglądarki Firefox. W przykładzie tym namicznie na podstawie wcześniej pobra-
gnięte z bazy przechowującej ciasteczka dla tabela wyświetlająca dane tworzona jest dy- nego opisu bazy. Następnie wykonane zo-
stało zapytanie SELECT. Całość przedsta-
Listing 4. Pobranie struktury bazy wiona została na Listingu 5.

// otwieramy bazę przechowującą odwiedzone adresy url Przykład od Adobe


var placesDB:File = firefoxDirectory.resolvePath('places.sqlite'); Bardzo ciekawy przykład wykorzystania
sqlCon.openAsync( placesDB, SQLMode.UPDATE, new Responder( dbGetPlacesSchema, bazy danych znajduje się na stronach Ado-
sqlError ) ); be. Pod adresem http://www.adobe.com/
devnet/air/flex/articles/sqlite_db_api_in_
private function dbGetPlacesSchema( result:Object ):void air.html możemy znaleźć dyskusję opisu-
{ jacą trzy różne podejścia do używania baz
// pobierz kompletny opis głównej bazy danych (standardowo otwarta baza nosi danych w aplikacji AIR. Na przykładzie
nazę main) aplikacji do przechowywania kontaktów,
sqlCon.loadSchema( null, null, "main", true, new Responder( artykuł przedstawia nie opisywane tutaj
dbPlacesSchemaLoaded, sqlError ) ); podejścia object-relational mapping (ORM)
}; oraz Data Access Object (DAO). Aplikacja
private function dbPlacesSchemaLoaded( result:Object ):void ilustruje także jak można w kolumnie ty-
{ pu BLOB przechowywać obrazy pobrane
// wyświetl opis bazy z kamery.
placesSchema = SQLSchemaResult( result ); Działająca aplikacja została zaprezentowa-
displaySchema( placesSchema ); na na Rysunku 3.
};
Podsumowanie
Listing 5. Pobieranie danych z bazy Artykuł ten jest jedynie wprowadzeniem
private function getFirefoxCookies():void do tematyki obsługi baz danych w Ado-
{ be AIR. Wykorzystanie systemu zarządza-
var query:SQLStatement = new SQLStatement(); nia bazą danych SQLite daje wiele moż-
// ustawiamy uprzednio nawiązane połączenie z bazą liwości. Możemy przechowywać w ba-
query.sqlConnection = sqlCon; zie ustawienia aplikacji, hasła użytkowni-
query.text = "SELECT * FROM moz_cookies"; ków itp. Możliwość szyfrowania bazy daje
// pierwszy parametr oznacza, że chcemy pobrać wszystkie rekordy nam także gwarancję bezpieczeństwa. Pli-
query.execute( -1, new Responder( cookiesSuccess, sqlError ) ); ki bazy danych mogą być wykorzystywa-
}; ne do komunikowania się z innymi aplika-
private function cookiesSuccess( data:Object ):void cjami, serwerem czy nawet urządzeniami.
{ Osoby które miały już styczność z SQLite
// tworzymy kolumny DatarGrid w których zostaną wyświtlone dane szybko zauważą, że jest on w pełni wspie-
var cols:Array = []; rany w środowisku AIR. Dla osób nie ma-
var dataGridColumn:DataGridColumn; jących doświadczenia z tym systemem baz
// pobieramy opis tabeli w której przechowywane są ciasteczka danych, Adobe AIR wydaje się być odpo-
var tableSchema:SQLTableSchema = cookiesSchema.tables[0] as SQLTableSchema; wiednim miejscem aby rozpocząć przygo-
// klasa ta opisuje postać pojedynczej kolumny w tabeli dę z SQLite.
var colSchema:SQLColumnSchema;
for each ( colSchema in tableSchema.columns )
{
dataGridColumn = new DataGridColumn( colSchema.name );
dataGridColumn.dataField = colSchema.name; MATEUSZ MAŁCZAK
cols.push( dataGridColumn ); Autor jest programistą z bogatym doświadcze-
} niem w tworzeniu aplikacji desktopowych dla
// ustawiamy kolumny systemów Windows i Linux. Aktualnie bardzo
faviconsGrid.columns = cols; mocno związany z technologiami Flex/AIR. Two-
// ustawiamy pobrane dane rząc aplikacje dla serwisu http://komixo.com wy-
faviconsGrid.dataProvider = SQLResult(data).data; grał ogólnopolski konkurs na najlepszą aplikację
}; w tej technologii (http://www.flexchallenge.com/
pl). Kontakt z autorem: matuesz@malczak.info

W Sieci
• http://www.sqlite.org – strona domowo projektu SQLite
• http://livedocs.adobe.com/flex/gumbo/langref/localDatabaseSQLSupport.html – szczegółowy opis wsparcia Adobe AIR dla SQLite
• http://www.peterelst.com/blog/2008/12/11/flexcamp-2008-belgium/ – prezentacja oraz przykładowa aplikacja ilustrująca możliwości SQLite
• http://coenraets.org/blog/2008/02/sqlite-admin-for-air-10 – SQLite manager napisany w Adobe AIR

www.sdjournal.org 25
Języki programowania

Groovy
na pohybel Javie, z miłością do Javy
–wprowadzenie do języka

Groovy to nowoczesny, dynamiczny język, w pełni integrujący się


z platformą Java, pozwalając na bezpośrednie korzystanie z mnogości
istniejących bibliotek i szkieletów.

Java script (ale nie JavaScript)


Dowiesz się: Powinieneś wiedzieć: Kiedy powstał język Java, zachwycił on wie-
• Jak zacząć programowanie w języku Gro- • Jak programować w języku Java. lu programistów możliwością bardzo szyb-
ovy, jaka jest jego składnia i budowa; kiego wytwarzania aplikacji (zwłaszcza sie-
• Jak łączyć programy napisane w Groovim ciowych lub bazodanowych) w porówna-
z Javą i vice versa. niu do C++. Narzucona na poziomie kon-
cepcji języka konieczność zachowywania
pewnego porządku w kodzie, czytelność i
łatwość nauki spowodowały, że wybaczo-
efekcie można, w zależności od konkret- no Javie ułomność związaną z jej ówczesną
nego problemu, stosować odpowiednie wydajnością i zaczęto się nią poważnie in-
Poziom techniki lub łączyć ideologie. Z własnego teresować. Czy jednak kodowanie w Javie
trudności doświadczenia wiem, że koncepcja ta jest jest naprawdę takie szybkie? Wiele jej me-
ze wszech miar słuszna. Groovy jest bar- chanizmów i cech (np. mocna kontrola ty-
dzo ciekawym pomysłem na rozszerzenie pów) zostało stworzonych po to, by ustrzec
wiedzy o językach dynamicznych i funk- nas przed popełnianiem błędów, zwłaszcza

D
la wielu programistów, zwłasz- cyjnych (zakładam, że większość Czytel- tych niewygodnych do wykrycia. Dzięki ta-
cza tych, którzy przesiąkli pew- ników tego artykułu ma przede wszyst- kiej koncepcji osiągnęliśmy język, którego
nymi nawykami, nauka nowego kim doświadczenie obiektowe, z językami kod jesteśmy w stanie łatwo weryfikować
języka programowania (lub choćby okaza- mocno typowanymi). Groovy powstał ja- z użyciem narzędzi. Tym samym zarządza-
nie mu zainteresowania) jest porównywal- ko konglomerat różnych pomysłów, które nie wielkimi projektami, nad którymi pra-
na do zdrady partnera. Jest to niestety po- na przestrzeni czasów pojawiły się w war- cują tabuny programistów, jest zwyczajnie
dejście dość radykalne i leniwe, bowiem z tościowych językach programowania. Mo- możliwe, a przynajmniej – prostsze. Czy
każdego wartościowego języka (a postaram że przez to połączenie jest czasem nieco jednak składnia języka powinna brać pod
się udowodnić, że Groovy do takich należy) przesadzony, jednak jego poznanie może uwagę ludzką ułomność, narzucać coś, by
można nauczyć się wiele nowego, nawet je- znacząco ułatwić podróże w kierunku ję- człowiek nie popełnił błędu? Czy nie two-
śli finalnie pozostanie się przy swoim ulu- zyków odległych Javie. Siłą Grooviego (dla rzymy tym samym ideologii nie myśl – pro-
bionym rozwiązaniu. Koncepcja ta została programistów Javy) jest to, że ucząc się no- gramuj? Oczywiście celowo ubarwiam tę
doskonale opisana w artykule Petera Norvi- wej koncepcji, wciąż pozostajemy w świe- kwestię, zmierzam jednak tym samym do
ga pt. Poznaj sztukę programowania w dzie- cie dobrze nam znanym i używamy tych mniej kontrowersyjnego stwierdzenia, że
sięć lat (dostępnym na stronie internetowej samych bibliotek. Nie będzie to zatem na- języki dynamiczne, stojące niejako w opo-
http://norvig.com/21-days.html). Autor suge- uka od zera. zycji do Javy, dają programiście dużo więk-
ruje, by poznać kilka różnych koncepcyjnie Artykuł dedykowany jest dla osób, któ- szą swobodę wyrażania myśli. Uważam, że
języków (przynajmniej jeden funkcjonal- re o Groovim w ogóle nic nie wiedzą al- dobrze się dzieje, iż tego typu rozwiąza-
ny, jeden obiektowy i równoległy) do tego bo jedynie coś, gdzieś, kiedyś słyszeli. Je- nia zyskują coraz bardziej na popularno-
stopnia, by zacząć umieć myśleć w tych ję- śli masz już, drogi Czytelniku, pewne do- ści. Często języki dynamicznie typizowa-
zykach (a nie tylko poznać ich składnię, jed- świadczenie z Groovim i interesujesz się ne, o skryptowej naturze, pozwalają zako-
nak programować z użyciem dotychczaso- tworzeniem aplikacji internetowych, za- dować coś szybciej, wyrazić myśl w bardziej
wych nawyków). Rezultatem takiego do- chęcam do przeczytania artykułu Ma- naturalny sposób, a szablonowe fragmenty
świadczenia powinno być szersze spojrze- riusza Roga pt. Grails, Groovy i ruszto- kodu po prostu w locie wygenerować. Ry-
nie na programowanie jako sztukę tworze- wania na temat szkieletu Grails. Arty- gor utrzymywania jakości kodu pozostaje
nia kodu, z pominięciem ograniczeń narzu- kuł opublikowany jest w niniejszym wy- w tym wypadku po stronie programistów,
canych przez pojedyncze rozwiązanie. W daniu SDJ. co może być bolączką podczas pracy zespo-

26 08/2009
Groovy

łowej. Można by zatem rzec, iż skrypty nie mentów, które łatwiej jest opisać skrypto- namiczną, jak i silną typizacją. Mimo że jest
są dla idiotów. Chaos, jaki można stworzyć wo. Taki język.... to Groovy. Gdyby nazwa językiem kompilowanym, umożliwia znaczą-
skryptem choćby w średniej wielkości pro- JavaScript nie została już (zupełnie nieade- ce modyfikowanie prototypów klas oraz dy-
jekcie, może pozostać nie do ogarnięcia na- kwatnie) zarezerwowana, Groovy byłby naj- namiczne uruchamianie kodu. Do podsta-
wet dla programistycznego guru. Czy to pewniej określany w ten właśnie sposób. wowych różnic w stosunku do języka Java na-
jednak powinno bronić nas przed używa- Choć może to stwierdzenie nieco na wyrost leżą: domknięcia, możliwość przeładowywa-
niem mniej schematycznych (od Javy) ję- – Groovy jest w końcu językiem kompilowa- nia operatorów, wyrażenia regularne wbudo-
zyków programowania? Jedynie o Lispie i nym, zachowuje jednak wiele cech języków wane w składnię języka, koncepcja właściwo-
SQLu mówi się, iż programowanie w tych skryptowych. ści klas (ang. properties) oraz możliwość ewa-
językach składa się przede wszystkim z my- luacji wyrażeń.
ślenia, a zapisywanie kodu to jedynie trzy- Trochę faktów
dzieści procent czasu. Myślenie jednak nie Oficjalny manual Grooviego we wstępie wita Web is dead
boli, natomiast patrzenie na kod, który z ła- na pokładzie nowego języka, każe zapiąć pasy Web is dead, czyli nieco bardziej cyberpun-
twością można by wygenerować lub stwo- i wznieść się na wyżyny programowana. Lot- kowy Hello world. W końcu i tak chodzi tyl-
rzyć z użyciem techniki kopiuj-wklej, mo- nicze skojarzenie ma zapewne źródło w histo- ko o wygenerowanie jakiegokolwiek tekstu na
że co wrażliwszych programistów doprowa- rii (a może – legendzie) powstania języka. Je- ekranie. A ponieważ jest to offline'owy ekran
dzić do zapalenia spojówek. go twórca – James Strachan – wpadł na pier- konsoli systemowej, tekst będzie na miejscu.
Wystarczy już krytyki na temat Javy – ję- wotną ideę Grooviego, przeglądając na lotni- Niniejszym ogłaszam najkrótszy w historii
zyk ten ma wiele dobrych cech. Przez la- sku, w oczekiwaniu na samolot, artykuły na SDJ rozdział poświęcony temu zagadnieniu.
ta Java dorobiła się ogromnej ilości bi- temat Pythona. Jako zagorzały programista Oto rozwiązanie
bliotek, szkieletów, narzędzi programi- Javy, nie miał wielkiego doświadczenia z języ-
stycznych – stabilnych i pisanych na pro- kami bardziej dynamicznymi i doznał praw- groovy -e "print 'Web is dead'"
fesjonalnym poziomie, często przez uzna- dziwego olśnienia, widząc, jak wielkimi skró-
ne instytucje. Stworzył się standard. Java tami myślowymi można posługiwać się, pro- Ktoś chciał coś powiedzieć o statycznej me-
jest jedną z najczęściej rozważanych alter- gramując w Pythonie. Zaczął rozwijać kon- todzie main jakiejś tam klasy, przyjmującej w
natyw przy tworzeniu wielkich aplikacji cepcję języka, czerpiąc z istniejących rozwią- parametrze tablicę? Hmm...
korporacyjnych, integrujących różne śro- zań, starając się jednak zachować pełną zgod-
dowiska, trzon dla wielu rozwiązań webo- ność z Javą. Podstawową ideą było utworzenie Środowisko języka Groovy
wych. Żaden z języków wyższego poziomu języka, który bez żadnych dodatkowych me- Przedstawiony powyżej pierwszy program
nie otrzymał tak profesjonalnego wsparcia chanizmów będzie mógł korzystać z ogromu niewiele nam jeszcze mówi o samym języ-
i pewnie żaden nie wygenerował twórcom bibliotek Javy, jak również, który z poziomu ku i możliwości uruchamiania jego progra-
programów takich zysków, jak Java. Przy- języka Java będzie rozpoznawany jako spójny mów. Zajmijmy się najpierw tym drugiem.
kładowo Python, który jest językiem prze- fragment programu. Minęło prawie sześć lat Groovy pozwala kompilować kod do plików
estetycznym i wygodnym w pisaniu, bory- od tego czasu. Język Groovy, dzięki zapałowi .class, pozostając nieodróżnialnym od Ja-
ka się z nadmiarem niejednorodnych i nie- twórcy i jemu podobnych pasjonatów – po- vy dla maszyny wirtualnej tego języka. Mo-
kompletnych rozwiązań i bibliotek, często wstał i znalazł swoją pozycję. Ma coraz więk- że też, tak jak zrobiliśmy to w przypadku
pisanych amatorsko, na kolanie. Nawet je- sze grono zwolenników. Z drugiej strony, po pierwszej aplikacji, uruchomić kod bezpo-
śli na dobrym poziomie, to bez niezbędne- sześciu latach od powstania, wielu programi- średnio z wiersza poleceń – dzięki przełącz-
go wsparcia, zapewniającego profesjonalny stów Javy nie zna nawet podstawowych kon- nikowi -e polecenia groovy. Kolejną, bardzo
rozwój rozwiązań. Kolejny język nadający cepcji Grooviego, którego używanie nie musi wygodną w trakcie nauki opcją jest konsola
się do szybkiego pisania aplikacji i bardzo być wcale zdradą Javy, a jedynie jej praktycz- (uruchamiana poleceniem groovyConsole),
naturalnego sposobu wyrażania myśli – Ja- nym uzupełnieniem. Właśnie im dedykowa- w której szybko możemy pisać małe frag-
vaScript – praktycznie nie istnieje poza śro- ny jest ten artykuł. menty kodu i obserwować ich działanie.
dowiskiem przeglądarek. Powstałe rozwią- Groovy jako koncepcja języka powstał w
zania są wykorzystywane co najwyżej przez 2003 roku, jednak na pierwszą oficjalną i
pasjonatów niż twórców poważnych aplika- stabilną implementację (wersja 1.0) trzeba
cji, a sam język, ze względu na marginal- było czekać aż do 2007 roku. Jeszcze w tym
ną wiedzę na jego temat pośród większo- samym roku została wydana znacznie po-
ści programistów, często nie cieszy się do- prawiona wersja 1.1, która dla podkreślenia
brą opinią. zmian została szybko przemianowana na 1.5.
W takiej sytuacji niesamowitym kompro- W chwili pisania artykułu dostępna była wer-
misem byłby język, który pozwoliłby na sko- sja 1.6.3 z maja 2009 roku. Ostatnie dwa la-
rzystanie z ogromu rozwiązań powstałych ta to okres silnego zainteresowania językiem
dla języka Java, jednak z drugiej strony miał- oraz rozwoju dedykowanych szkieletów i na-
by naturę bardziej dynamiczną, pozostawia- rzędzi. Aktualnie trwają prace nad jego stan-
jącą programiście dużą dowolność. Taki ję- daryzacją zgodnie z Java Community Process
zyk doskonale nadawałby się do pisania mi- (JSR241).
kroprogramów lub małych narzędzi, jak i Język Groovy definiuje się jako dynamicz-
wielkich aplikacji. Taki język powinien, w ny (często także pada określenie – skrypto-
razie konieczności, pozwalać na implemen- wy) język obiektowy dedykowany platfor-
tację części funkcjonalności bezpośrednio w mie Java. Najczęściej porównuje się go do ta- Rysunek 1. Konsola języka Groovy pozwala
języku Java lub w aplikacjach Java być wyko- kich języków jak Python, Ruby, Perl i Small- w łatwy sposób testować małe programy, bez
rzystywanym do implementacji tych frag- talk. Groovy charakteryzuje się zarówno dy- konieczności jawnej kompilacji

www.sdjournal.org 27
Języki programowania

Wygląd konsoli języka zaprezentowano na kie niezbędne pliki są osadzone w jednym nej typizacji obiektów. Silna typizacja, będą-
Rysunku 1. pliku jar, zajmującym ponad 4MB. Uru- ca cechą języka Java, niejednokrotnie wymu-
Pracując z konsolą, bądź uruchamiając chomienie skompilowanej klasy Groovy sza konieczność częstego jawnego rzutowa-
programy z użyciem narzędzia groovy, mo- (Test.class) będzie zatem wyglądało nastę- nia. Groovy rozwiązuje ten problem w sytu-
żemy odnieść wrażenie, że Groovy jest języ- pująco: acjach, w których nie jest to potrzebne, w in-
kiem interpretowanym. Gdyby tak było, je- nych pozwala natomiast na zachowanie kon-
go integracja z Javą nie byłaby już taka pro- java -cp groovy-all-1.6.0.jar; Test troli typów. Oto przykład:
sta. W rzeczywistości Groovy zawsze tworzy
pliki class, choć czasem może to być ukryte Podstawowa składnia def a=1
dla programisty – kompilator może umiesz- Wiemy już, jak uruchamiać programy języka Integer b = 1
czać klasy w plikach tymczasowych lub bez- Groovy, skupmy się zatem na prostych przy- a = "test"
pośrednio w pamięci. Zazwyczaj jednak bę- kładach mających na celu zobrazowanie cech b = "test" //błąd
dziemy jawnie odwoływać się do standar- języka. Zachęcam do uruchamiania ich z po-
dowych plików .class. By je otrzymać – po- ziomu konsoli groovyConsole. Zakładam, że W języku Groovy nie musimy tworzyć kla-
trzebujemy kompilatora, a więc narzędzia Czytelnicy tego artykułu znają przynajmniej sy, by napisać prosty kod (kompilator utwo-
groovyc. Polecenie na podstawowym poziomie Javę, postaram rzy ją w takiej sytuacji domyślnie). Możemy
się więc położyć szczególny nacisk na wskaza- zatem bezpośrednio zająć się pisaniem kodu
groovyc *.groovy nie różnic między tym językiem a Groovym. lub zamiast klas korzystać wyłącznie z funk-
Przedstawiony wcześniej pierwszy, jed- cji. Deklaruje się je następująco:
utworzy pliki .class dla zadanego katalogu. nowersowy przykład (Web is dead) wska-
Od tego momentu będziemy mogli skorzy- zał już na kilka istotnych różnic (i skró- def poleKola(promien) {
stać z nich w jakimś projekcie języka Java tów) przyjętych przez język Groovy. Funk- Math.PI * promien**2
lub zwyczajnie uruchomić. Ciekawą opcją cja print została użyta bez nawiasów, za- }
kompilatora groovyc jest możliwość użycia brakło też końcowego średnika. Oba te ele-
narzędzia javac celem jednoczesnego skom- menty nie są wymagane, o ile jasno z kon- Powyższy kod ma kilka ciekawych cech. Po
pilowania plików .groovy i .java i rozwiąza- tekstu można zrozumieć intencje wyko- pierwsze – nie określamy typu zwracane-
nia zależności tkwiących między tymi plika- nania kodu. Średnik zwykle przyda się go, wiemy już zatem, że będzie on miał dy-
mi. Służy do tego przełącznik -j: w przypadku umieszczenia w jednej linii namiczny charakter. Po drugie – odwołu-
programu kilku niezależnych wywołań. jemy się tu do właściwości PI klasy Math –
groovyc -j Test.groovy Main.java Pomijanie nawiasów w wykonaniu funk- tej samej, której używa język Java. Po trze-
cji zwykle może zagmatwać czytelność, cie – użyliśmy nieobecnego w Javie opera-
Skompilowane pliki .groovy będziemy choć zwyczajowo opuszcza się je dla funk- tora potęgowania (**). Finalnie zaś – zwra-
uruchamiać tak jak każdy program Ja- cji print. Ponadto będzie to bardzo przy- camy wartość funkcji bez użycia słowa klu-
vy. Musimy tylko pamiętać o dodaniu do datne przy pracy z domknięciami, o czym czowego return. Użycie go jest opcjonal-
ścieżki niezbędnych bibliotek. Ponieważ w dalszej części artykułu. ne – w przypadku jego pominięcia zostanie
ich ilość jest niemała, możemy skorzy- Podstawową różnicą między Javą a Gro- wzięta pod uwagę wartość ostatniej linii ko-
stać z dystrybucji języka, w której wszyst- ovim jest możliwość używania dynamicz- du funkcji.

Niestandardowe operatory
Poniżej znajduje się opis operatorów języka Groovy, które nie mają swoich bezpośrednich odpowiedników w Javie lub które w Javie występu-
ją, lecz zyskały tutaj dodatkowe znaczenie.

• a ** b – potęgowanie; podnosi a do potęgi b.


• *lista – konwertuje listę do ciągu oddzielnych parametrów; w praktyce pozwala na przekazanie funkcjom parametrów w posta-
ci listy, np. "text".substring(*[1,2]); operator może też być użyteczny przy dodawaniu nowych elementów do listy lub mapy, np.:
[1,2,3,*[4,5,6]] utworzy sześcioelementową, płaską listę.
• a[b] – udostępnia obiekt pod wskazanym indeksem, działa zarówno z tablicami, jak również listami i mapami; umożliwia odczyt i zapis da-
nych.
• a << b – klasyczne przesunięcie bitowe w lewo, jednak dla niektórych typów posiada przeładowane znaczenie typu dodaj, uzupełnij o ele-
ment. W tej formie operuje na obiektach StringBuffer, klasach typu Writer, plikach, gniazdach, listach i metaobiektach.
• <=> – komparator, ze względu na wygląd nazywany statkiem kosmicznym (ang spaceship); służy do porównywania wartości obiektów.
• a as typ – tworzy wymuszenie rzutowania bądź alias dla jakiegoś typu. W tym pierwszym przypadku możemy użyć operatora np. do za-
inicjalizowania obiektu z użyciem listy: def obj = [1,2,3] as MyClass. Aliasowanie pozwala natomiast na uniknięcie konfliktów nazw,
poprzez ich import pod nową nazwą, np. import java.sql.Date as SQLDate
• a .@ b – bezpośredni dostęp (z pominięciem metody get) do składnika b obiektu a.
• a .& b – zwraca referencję do metody b obiektu a w postaci domknięcia; kontekst obiektu zostaje zachowany (odwołania z użyciem this);
operator może mieć zastosowanie np. przy przekazywaniu metody w postaci parametru do funkcji oczekujących na wejściu domknięcia
(np. lista.each(obiekt.&metoda))
• a .. b – operator zakresu, np (1..20); istnieje możliwość stworzenia przedziału prawostronnie otwartego, np. (100..<105).
• a *. b – odnosi się do właściwości lub metody b każdego obiektu zawartego w kolekcji a; przykładowo kod ["a","b","c"]*.toUpperCase
() zwróci w rezultacie listę ["A","B","C"].
• a ?. b – opcjonalny dostęp do elementu; b zostanie użyte, tylko jeśli a nie ma wartości null; pozwala uniknąć pisania dodatkowych wa-
runków i znacząco zmniejsza ryzyko wystąpienia w kodzie wyjątków typu Null pointer exception.
• ==~ – operator dopasowania w wyrażeniach regularnych.
• =~ – operator przeszukiwania w wyrażeniach regularnych.

28 08/2009
Groovy

GString dykowanych operatorów, celem odróżnienia Pierwszą dostrzegalną różnicą jest uży-
Operacje na łańcuchach znaków są często od zwykłych łańcuchów znaków: cie dynamicznego typu (def). Dzięki te-
niezwykle istotnym elementem programów, mu polu author będziemy mogli, w za-
a przy niewygodnych mechanizmach potra- def pattern = ~/a(.*)d/ leżności od potrzeby, przypisać np. prosty
fią znacząco utrudnić programistom życie. napis, obiekt klasy Person lub listę tych
Groovy wychodzi tu na pomoc z rozbudo- Możemy teraz spróbować porównać dowol- obiektów.
waną koncepcją obsługi tekstów i wbudo- ny napis ze zdefiniowanym wzorcem – słu- Nigdzie w przykładzie nie umieściliśmy
wanym w język wsparciem dla wyrażeń re- ży do tego operator ==~: operatora zakresu – w przypadku Groovie-
gularnych. Oprócz implementacji klasycz- go nie oznacza to jednak, że składowe klasy
nych obiektów java.lang.String, znaj- if( 'abc' ==~ pattern ) { … } przyjmą domyślnie zakres pakietu. Dla me-
dziemy tu rozszerzenie w postaci klasy tod domyślnym zakresem jest public , nato-
groovy.lang.GString, która umożliwia do- Chcąc otrzymać wszystkie odpowiadające miast dla pól – private.
stęp do zmiennych z poziomu łańcuchów wzorcowi dopasowania, należy skorzystać Ponieważ jak dotąd nie zdefiniowaliśmy w
znaków, jak ma to miejsce w wielu językach z kolejnego operatora, który w rezultacie klasie żadnego konstruktora, mamy, podob-
skryptowych: zwróci listę wyników: nie jak w Javie, do dyspozycji bezparametro-
wy konstruktor domyślny. Ponadto standar-
public class Person { def matches = 'abcd' =~ pattern dowo Groovy udostępnia jeszcze jeden kon-
def firstname, lastname struktor, dzięki któremu możemy w trakcie
String toString() { Dla naszego przykładu będzie to dwuele- inicjalizacji obiektu ustawić wartości pól za
"$firstname $lastname" mentowa lista ['abcd', 'bc'] pomocą mapy:
}}
Tworzenie klas – podstawy def pl = new ProgrammingLanguage(name:
Jak widzimy na tym prostym przykładzie, Definiowanie klas w języku Groovy w wersji "Perl", author: "Larry Wall")
łatwo możemy pozbyć się niewygodnej kon- podstawowej przypomina mocno Javę. Na wyż-
katenacji łańcuchów. Może mieć to zastoso- szym poziomie szczegółowości pojawia się tu Konstruktory te będą dostępne dopóty nie
wanie w wielu sytuacjach, np. w servletach, jednak wiele elementów rozbudowujących ba- zdefiniujemy własnych. Implementacja kon-
przy tworzeniu zapytań SQL itp. zową składnię. W niniejszym opisie stworzymy, struktora wygląda tak samo jak w Javie:
Rozróżnienie między klasycznym Stringiem krok po kroku, przykładową klasę, skupiając się
a GStringiem odbywa się po użytych znakach na istotnych cechach języka. Niech będzie to ProgrammingLanguage(String name) {
cytowania. Pojedynczy cudzysłów tworzy klasa opisująca języki programowania. Zacznij- this.name = name
obiekty klasy java.lang.String i w tej sy- my od kilku podstawowych pól: }
tuacji nie ma możliwości interpolacji zmien-
nych. Podwójne cudzysłowy umożliwiają sko- public class ProgrammingLanguage { Gdybyśmy konstruowali naszą przykłado-
rzystanie z zalet obiektów GString. String name wą klasę w Javie, z pewnością uzupełni-
Groovy wprowadza jeszcze jedno bardzo def author libyśmy ją o metody get i set dla poszcze-
ciekawe udogodnienie, umożliwiające ope- String helloWorldCode gólnych pól, zwłaszcza że są one prywat-
rowanie na długich, wielowersowych łańcu- } ne i nie powinniśmy mieć do nich bezpo-
chach znaków. Służą do tego pojedyncze lub
podwójne cudzysłowie (w zależności, czy Listing 1. Przykład użycia budowniczego SwingBuilder do szybkiego tworzenia interfejsu użytkownika
chcemy rozwijać wartości wyrażeń, czy nie),
użyte trzykrotnie: import groovy.swing.SwingBuilder

def txt = """Dzisiaj jest ${new Date()}. swing = new SwingBuilder()


Test długiego napisu w języku Groovy""" frame = swing.frame(title: 'Groovy Builder') {
menuBar {
Kolejnym rozszerzeniem jest możliwość menu('Help') {
używania operatorów << i <<= do konkate- menuItem 'Help'
nacji stringów. Jest to dość czytelne odróż- menuItem 'About'
nienie operacji łączenia napisów od doda- }
wania numerycznego (choć operatory + i }
+= również funkcjonują prawidłowo na tek- panel {
stach). Najbardziej przydatna jest tu możli- boxLayout(axis: javax.swing.BoxLayout.Y_AXIS)
wość użycia operatora << na obiektach kla- label 'Hello World'
sy StingBuffer zamiast metody append. button (
Pisząc o operacjach na tekstach, nie sposób text: 'Exit',
nie wspomnieć o wyrażeniach regularnych, actionPerformed: { event -> System.exit(0)}
które w Groovim mają pełne wsparcie bez- )
pośrednio z poziomu języka. Przyjrzyjmy się }
zupełnym podstawom, skupiając się przede }
wszystkim na składni (wyrażenie regularne
to osobny temat, wykraczający daleko poza frame.pack()
zakres tego artykułu). Definicja wzorca wy- frame.show()
rażenia regularnego odbywa się z użyciem de-

www.sdjournal.org 29
Języki programowania

średniego dostępu. Zróbmy eksperyment należy to zrobić jawnie, tak jak pokazano to dynamicznej typizacji, zatem obiekty umiesz-
w Groovim: na przykładzie dla właściwości author. czane na liście mogą być dowolnego typu.
Gdybyśmy w ogóle nie chcieli mieć metod W sposób zbliżony do list tworzyć bę-
def sch = new ProgrammingLanguage("Scheme") dla jakiegoś pola, wystarczy zadeklarować je dziemy mapy (a konkretnie obiekty klasy
sch.author = ["Guy L. Steele", "Gerald Jay jako private. Groovy generuje metody tylko LinkedHashMap):
Sussman"] dla właściwości o niezdefiniowanym zakre-
sie. Nic też nie stoi na przeszkodzie, by nadpi- def colors = [ white: "#FFFFFF", red:
Zadziwiająco – powyższy kod skompiluje sać metodę pobierającą wartość lub ją zwraca- "#FF0000" ];
się. Co więcej, również taki kod nie zwróci jącą. Będziemy musieli to zrobić dla sytuacji,
żadnego błędu: w których metoda będzie miała za zadanie Korzystając z powyżej notacji, łatwo możemy
wykonać dodatkowe czynności lub kiedy bę- utworzyć pustą listę ([]) oraz pustą mapę ([:]).
sch.setHelloWorldCode('(display "Hello dziemy chcieli ograniczyć jej widoczność (np. Definicja tablicy (jest to raczej rzadko uży-
World!")') do protected). Jeśli właściwość klasy zosta- wana w Groovim struktura danych) wymaga
nie zadeklarowana jako final, zostanie natu- określenia konkretnego typu tablicowego (ce-
Myślę, że osoby znające np. podstawy języ- ralnie utworzona jedynie metoda get. lem odróżnienia od listy), np.
ka C# mogą już wiedzieć, co się stało. Gro- Wiemy już, jak definiować klasy, ich po-
ovy chroni nas przed koniecznością pisania la, metody i specjalne pola – właściwości. int[] numbers = [1,2,3]
oczywistego kodu, którego apogeum stano- Podobnie jak w przypadku języka Java, kla-
wią wszechobecne metody get i set. Zaledwie sy mogą dziedziczyć po sobie z użyciem kon- Zwróćmy uwagę, że elementy tablicy są za-
w znikomej ilości przypadków metody te ro- strukcji extends NazwaNadklasy. Natomiast inicjalizowane tak jak lista – z użyciem kwa-
bią cokolwiek ponad ustawianie wartości mamy tu ograniczenia w postaci braku moż- dratowych nawiasów. W Javie użylibyśmy tu
pól prywatnych. Łatwo można je zatem ge- liwości używania klas wewnętrznych (mo- nawiasów klamrowych.
nerować, co jest cechą wielu środowisk pro- żemy zamiast nich skorzystać z domknięć). Specyficznym typem, który nie posiada
gramistycznych języka Java. W przypadku Również interfejsy wymagają specjalnego swojego bezpośredniego odpowiednika w Ja-
Grooviego – zrobi to za nas sam język! Upo- traktowania. Zostało to opisane w dalszej czę- vie, jest zakres (ang. range) definiujący ciąg
rządkujmy wiedzę – deklarując pole klasy ści artykułu. kolejnych elementów:
bez podania zakresu widoczności, tworzy-
my de facto właściwość (ang. property), któ- Tablice, listy, mapy i zakresy def zakr = 100..200
ra jest prywatna, automatycznie jednak zo- W Groovim znacznie częściej niż w Javie bę-
staną dla niej wygenerowane publiczne me- dziemy operować na tablicach i mapach dzię- Zakresy mogą mieć wiele praktycznych za-
tody get i set. Możemy odwoływać się do nich ki możliwości ich szybkiego, dynamicznego stosowań, jak np. iterowanie pętli po kolej-
przez nazwę, jednak również bezpośrednie tworzenia. Tego typu konstrukcje są zresztą nych elementach:
odwołanie do pola klasy uruchomi w rzeczy- domeną wielu języków dynamicznych – w
wistości metodę. Jedynie w obrębie samej Lispie praktycznie wszystko jest listą, w Ja- for( i in 1..10 ) { ... }
klasy będziemy korzystać bezpośrednio ze vaScripcie każdy obiekt będzie mapą (tabli-
zmiennych, a nie metod. Stwórzmy na przy- cą asocjacyjną) itp. lub wypełnianie list kolejnymi wartościami
kład metodę toString: Groovy umożliwia tworzenie kolekcji w (przykład tworzy listę elementów od 1 do 5
sposób identyczny jak w Javie, jednak częściej oraz od 20 do 25, czyli łączy ze sobą dwa za-
String toString() { korzystać będziemy ze znacznie szybszej no- kresy):
"$name, created by ${getAuthor()}" tacji operatorowej:
} list = [*(1..5), *(20..25)]
def lista = [1,2,3,"tekst", new Object()]
Ponieważ jest to metoda tej samej klasy, nie Operatory i ich przeładowywanie
mamy potrzeby korzystania z metody get. W Zapis powyżej tworzy kolekcję typu ArrayList Język Groovy wprowadza kilka ciekawych
razie konieczności możemy jej użyć, jednak i wypełnia ją pięcioma obiektami. Używamy tu operatorów. Część z nich opiszemy bar-

Iterowanie z Groovim
Groovy rozszerza klasę java.lang.Object o dodatkowe metody ułatwiające iterowanie po elementach z użyciem domknięć, co praktycznie
zwalnia programistę z konieczności używania pętli. Metody te można stosować dla wszelkiego rodzaju kolekcji, enumeracji, zakresów i łańcu-
chów znaków. Poniżej przedstawiono ich listę wraz z przykładami użycia. Każda z opisanych tu metod przyjmuje w parametrze domknięcie.

• any – zwraca wartość true, jeśli domknięcie zwróci taką wartość dla przynajmniej jednego z elementów. Przykładowo, kod [null, null,
1, null].any{ it != null } sprawdzi, czy lista zawiera niepuste elementy.
• collect – zwraca listę wartość zwróconych przez domknięcie dla każdego z elementów wejściowych. Przykładowo, "text".collect{
it.charAt(0) } zwróci listę znaków składających się na napis wejściowy.
• each – uruchamia przekazane domknięcie dla każdego elementu listy wejściowej. W rezultacie zwraca listę wejściową.
• eachWithIndex – podobnie jak each , ale domknięcie przyjmuje jeszcze drugi parametr, będący indeksem obiektu w kolekcji.
• every – działa podobnie jak any, jednak zwraca wartość true ,tylko jeśli dla wszystkich elementów wejściowych domknięcie zwróciło war-
tość true.
• find – przekaże w rezultacie pierwszy element z listy, dla którego domknięcie zwróci wartość true.
• findAll – jak wyżej, ale wygeneruje listę wszystkich wartości zgodnych z domknięciem wejściowym. Przykładowo, kod (1..50).findAll{
it % 2 == 0 } zwróci listę liczb parzystych w zadanym zakresie.
• findIndexOf – podobnie jak find, ale zwraca indeks zgodnego elementu.

30 08/2009
Groovy

dziej szczegółowo w dalszej części tekstu, W opisany tu sposób możemy przeładowy- sjach, przy czym wersja for...in ma tutaj
natomiast wszystkie niestandardowe ope- wać prawie wszystkie operatory, włączając te dużo większe możliwości. Groovy pozwala
ratory (w stosunku do Javy) przedstawio- specyficzne dla języka Groovy. Wyjątkiem są z użyciem tej instrukcji iterować praktycz-
no w osobnej ramce w postaci szybkiej ścią- ?:, ?., *., ., oraz jednoargumentowe operatory nie po wszystkich obiektach, które składa-
gi. Nowe operatory mają zwykle na celu * i &. Ciekawostką natomiast może być fakt, ją się z listy składowych elementów. Będą to
bardziej skrótowe zapisywanie często po- że wybór alternatyw z użyciem słów switch / zatem tablice, enumeracje, mapy, zakresy,
wtarzanych operacji. Przykładowo, dobrą case jest zdefiniowany w Groovym jako ope- a nawet łańcuchy znaków (w tym wypad-
praktyką w języku Java jest sprawdzanie, rator, który dodatkowo można przeładować ku każdy znak zostanie potraktowany ja-
czy obiekt, na którym operujemy (zwłasz- (z użyciem metody isCase). Więcej o samym ko kolejny element iteracji). Poniżej kilka
cza kiedy otrzymaliśmy go np. w postaci operatorze w kolejnym punkcie. przykładów:
parametru metody), nie ma czasem war-
tości null. W efekcie powoduje to pisanie Instrukcje sterujące for( x in 1..10) { println x }
dużej ilości operacji warunkowych. Gro- Podstawowe instrukcje sterujące będą zauwa- for( x in "abcdef" ) { println x }
ovy pozwala ten nadmiar kodowania upro- żalnie przypominały te znane z języka Java for( x in [ 1:"a", 2:"b", 3:"c" ] ) {
ścić z użyciem operatora ?., który umoż- (if, while, for), bez znaczących różnic. Jak println x.key }
liwia dostęp do znajdującego się po krop- wszędzie w Groovym, wprowadzono tu zapi-
ce elementu, tylko jeśli obiekt jest zdefi- sy skrótowe, wynikające choćby z nierestryk- Osobnego komentarza wymaga instrukcja
niowany: cyjnej kontroli typów. Przykładowo, możemy switch, która w Groovim została znacząco
sprawdzać zainicjalizowanie obiektów bez rozbudowana, pozostawiając jednak kompa-
String s = null konieczności porównywania ich do null, bo- tybilność wsteczną. Porównywanymi war-
print s?.toUperCase?.charAt(1) wiem wartość ta jest w porównaniach równa tościami (znajdującymi się przy słowie klu-
logicznej wartości false: czowym case) mogą tu być dowolne obiek-
Jak widzimy, możemy tego typu operatory ty, włączając napisy, tablice, zakresy, mapy
łączyć w obrębie jednego ciągu wyrażeń. Je- Object obj = null itp., np:
śli na którymkolwiek etapie otrzymamy w if( obj ) { ... }
rezultacie wartość null, operacja zostanie switch( v ) {
przerwana bez zwracania błędu. Pamiętajmy jednak, że również wartość zero case "text": //..
Kolejnym operatorem, który może mieć i pusty napis zwracają w porównaniach war- case 1..100: //..
częste zastosowanie, jest *. Jest to szybki do- tość false. case [1,2,3,4]: //..
stęp do pól lub metod wszystkich elementów Pętla for, podobnie jak w nowszych wer- default: //..
kolekcji. Rezultat jest zwracany w postaci li- sjach języka Java, występuje w dwóch wer- }
sty. Dzięki temu prostemu operatorowi mo-
żemy zaoszczędzić na pisaniu pętli przecho- Listing 2. Przykład użycia obiektu Eval, dynamicznego generowania metod oraz zastosowania
dzących przez wszystkie elementy kolekcji. domknięć. Program jest kalkulatorem pozwalającym rejestrować (w postaci nowych metod
Zobaczmy przykład: klasy) dodatkowe, nazwane funkcje

[10, 3.14, "text"]*.toString()*.reverse() public class DynCalc {


public static calculate(String expression) {
Efektem działania powyższego kodu będzie Eval.me(expression)
lista następujących wartości: ["01", "41.3", }
"txet”].
W językach obiektowych użycie ope- public static addFunction(name, fun, nr) {
ratora często jest jedynie zapisem skróto- String evs = (["me", "x", "xy", "xyz"])[nr]
wym dla metod implementujących określo- String pas = (["", "a", "a,b", "a,b,c"])[nr]
ną operację. Tak jest również w języku Gro- Closure ee = { expr, params -> Eval."${evs}"(*params, expr) }
ovy. Co więcej, programista ma tutaj możli- String clo = "{ ${pas} -> x(y,[${pas}]) }"
wość przeładowania operatorów, definiując DynCalc.metaClass."${name}" = Eval.xy(ee,fun,clo)
specyficzne zachowania dla własnych klas. }
Każda z funkcji operatorowych ma opisową }
nazwę, wskazującą na operator, np. plus,
minus, power, rightShift etc. W przypad- DynCalc.addFunction2("G", "6.67428", 0)
ku operatorów dwuargumentowych, lewą DynCalc.addFunction("distance","x*y+z*y**2*0.5", 3)
stronę reprezentować będzie obiekt klasy, DynCalc.addFunction("parabolic",'''
dla której implementujemy funkcję opera- def g=9.80665;
torową, a prawą stronę – parametr metody. [x*y*Math.cos(z), x*y*Math.sin(z)-0.5*g*y**2]
Operator sumowania obiektów hipotetycz- ''', 3);
nej klasy Money z wartościami liczbowymi
mógłby zatem wyglądać następująco (plus d=new DynCalc();
jest metodą klasy Money): println d.calculate( "1+8*2/33" )
println d.G()
Money plus(int val) { println d.distance(10,60,0.5)
new Money(this.amount+val, this.currency) println d.parabolic(3,30,45)
}

www.sdjournal.org 31
Języki programowania

Szczególnym przypadkiem jest możliwość zu widzi efekt działania programu. Zobacz- nak użycie domknięcia będzie przypomi-
umieszczenia w warunkach nazw klas, my przykład: nało funkcję:
co może nam pomóc zidentyfikować typ
zmiennej: def a = 5 x = square(5)
assert a << 5 == 20
switch(1) { Jak się można domyślić – w rezultacie otrzy-
case Number: print "to jesli liczba"; Nie każdy programista potrafi wyliczyć w mamy liczbę 25. it w definicji domknięcia
break głowie wynik przesunięcia bitowego. In- to domyślna nazwa parametru wejściowego
case String: print "to jest napis"; strukcja assert od razu wskazuje na ocze- (jeśli trzeba, możemy zdefiniować własny).
break kiwany wynik. Prawidłowym rezultatem Wartość wynikowa, tak jak w każdej meto-
} tak uruchomionego programu będzie za- dzie języka Groovy, jest domyślnie brana z
tem brak jakiegokolwiek wyniku na ekra- ostatniej linii kodu, można jednak wyraź-
Taka wersja operacji switch dokonuje po- nie. Jednak gdybyśmy popełnili gdzieś błąd, nie określić wynik poprzez słowo kluczowe
równań bezpośrednich, nie powinniśmy otrzymalibyśmy komunikat assertion error return. Moglibyśmy zatem zapisać to samo
używać jej zatem do sprawdzenia rzeczywi- wskazujący na konkretną instrukcję. Gdy- domknięcie w bardziej przegadany sposób
stego typu zmiennej polimorficznej. byśmy sami chcieli zdefiniować treść wy- (tylko po co?):
Pisząc o instrukcjach sterujących, należy pisanego w takiej sytuacji komunikatu, na-
jeszcze wspomnieć o możliwości obsługi sy- leży skorzystać z drugiego parametru in- square = { num -> return num*num }
tuacji wyjątkowych. Groovy, w identyczny strukcji assert (w odróżnieniu od Javy,
sposób jak Java, wprowadza bloki kodu ty- podaje się go po przecinku, a nie po dwu- Skoro domknięcie tak bardzo przypomi-
pu try – catch – finally. Możemy rzucić kropku): na funkcję, dlaczego w ogóle jest nam po-
wyjątek z użyciem słowa kluczowego throw trzebne? Wszystko zależy od sposobu stoso-
oraz wskazać w deklaracji metody na poten- assert 5**5==26, "błędny wynik potęgowania" wania. Mechanizm domknięć pozwala zna-
cjalnie rzucane przez nią wyjątki. Podstawo- cząco ułatwić życie za sprawą faktu, że mo-
wa różnica polega na braku konieczności ich żemy go traktować jako zmienną. Wyobraź-
przechwytywania. Wywołanie metody zwra- Domknięcia my sobie taką rzeczywistą funkcję:
cającej wyjątek z pomięciem bloku try jest (dla niewtajemniczonych)
w Groovim dozwolone. To programista de- Kto nie wie, czym są domknięcia (ang. clo- def fun(liczba, operacja) {
cyduje, jakie błędy i kiedy zamierza prze- sures), ten zapewne przespał zamknięty return operacja(liczba)
chwytywać. (domknięty?) w świecie Javy kilka lat (co }
nie znaczy, że przespał powstanie koncep-
Instrukcja assert cji domknięć, która zrodziła się już w 1960 Przyjmuje ona na wejściu dowolną liczbę i
Od wersji 1.4 języka Java dysponujemy in- roku). Domknięcia, wywodzące się pier- dowolne domknięcie. To w zależności od
strukcją assert, która, zazwyczaj w fazie wotnie z języków funkcyjnych, stają się co- niego funkcja będzie w stanie wykonać pew-
tworzenia oprogramowania, pozwala zwe- raz bardziej doceniane pośród programi- ną operację na liczbie – taką, o jaką ją popro-
ryfikować poprawność wartości wyrażeń w stów obiektowych i coraz więcej współcze- simy:
uruchamianym kodzie. Mechanizm ten jest snych języków zostaje uzupełnianych o ten
szeroko stosowany w Groovim i prawie nie mechanizm. Koncepcja ta pojawiła się na- fun( 5, square )
różni się składniowo od tego użytego w Ja- wet w planowanym nowym standardzie ję-
vie. Główną różnicę znajdziemy natomiast w zyka C++ (C++0x) – miejmy nadzieję, że W przykładzie powyżej przekazaliśmy do-
strategii używania. W języku Groovy nie dys- kiedyś zawita także do Javy (wciąż trwa mknięcie tak, jak zmienną – bez użycia na-
ponujemy możliwością wyłączenia asercji, co nierozwiązana debata, czy domknięcie po- wiasów. Gdybyśmy napisali square(), w
oznacza, że weryfikacja będzie odbywać się winny znaleźć się w Javie 7). rzeczywistości przekazalibyśmy wynik do-
również w aplikacjach produkcyjnych. Kon- Czas najwyższy wyjaśnić, czym są te ta- mknięcia, a to nie było naszym celem.
cepcja ta ma pewnie tyle samo wrogów, co jemnicze konstrukcje, najlepiej z pominię- Mam nadzieję, że powoli dochodzimy do
zwolenników. ciem zbytniej teorii i skupieniu się na ję- rozróżnienia między funkcją a domknię-
Instrukcja assert w programach Gro- zyku Groovy (mam nadzieję, że puryści ciem. Przydałby się jeszcze tylko bardziej
oviego jest regularnie wykorzystywana i wybaczą mi przyjęte uproszczenia). Naj- obrazowy przykład, niż abstrakcyjna ope-
spotkamy się z nią w większości progra- prościej rzecz ujmując – domknięcia to racja na liczbach przedstawiona wyżej. Ta-
mów przykładowych oraz w różnego rodza- fragmenty kodu (nazwane lub anonimo- ki przykład weźmiemy ze standardowej bi-
ju dokumentach poświęconych językowi we), które zachowują się jak funkcje (mo- blioteki języka. Dla obiektów reprezentują-
(począwszy od oficjalnej dokumentacji ję- gą mieć parametry wejściowe i zwracać cych listę w Groovim mamy do dyspozycji
zyka). Autorzy Grooviego postanowili uży- wartości), jednak też posiadają pewne ce- metodę collect, która jako parametr pobie-
wać w przykładach asercji zamiast funkcji chy obiektów – możemy je traktować tak ra domknięcie i wykonuje je dla każdego ele-
print – ta ostatnia wypisze co prawda wy- jak zmienne – przekazywać jako parame- mentu listy.
nik działania programu na ekran, ale przy try itp. Tyle teorii, bez przykładu się nie Jednym słowem, chcąc policzyć kwadra-
bardziej złożonych wyrażeniach nie bę- obędzie: ty dla zadanego ciągu liczb, zrobimy to na-
dziemy umieli sobie tak naprawdę uzmy- stępująco:
słowić wyniku bez uruchomienia progra- square = { it * it }
mu (autorzy aplikacji przykładowych w ta- [1,3,5,7].collect( square )
kich sytuacjach często podają oczekiwany Utworzyliśmy domknięcie, które potrafi li-
wynik w komentarzach). Dzięki zastoso- czyć kwadrat zadanej liczby. Definicja po- W rezultacie otrzymamy listę kwadra-
waniu instrukcji assert, Czytelnik od ra- wyżej wygląda jak deklaracja zmiennej, jed- tów liczb. Obyliśmy się bez pętli i mnó-

32 08/2009
Groovy

stwa zbędnego kodu! Parametrem meto- Nasza funkcja tworzy nowe domknięcie, W przykładzie próbujemy zainicjalizo-
dy collect jest domknięcie, możemy za- które będzie służyło do mnożenia liczb wać zmienną aktualnym czasem – o ile
tem dla każdego elementu listy wykonać przez określoną wartość: to możliwe, z użyciem jakiegoś zewnętrz-
dowolną operację, bowiem domknięcie nego serwisu, jeśli jednak komunikacja z
może zawierać dowolny kod. Jedynym ob- mulBy5 = createMultiplier(5) nim nie powiedzie się – z użyciem czasu
ciążeniem jest konieczność zadeklarowa- print mulBy5(10) systemowego. Jeśli tego typu funkcjonal-
nia samego domknięcia. Jednak.... wspo- ność występowałaby jednokrotnie w obrę-
minałem na początku, że domknięcia mo- Zwróćmy uwagę, że parametr val funk- bie programu, podane wyżej rozwiązanie,
gą być anonimowe. Co to znaczy? Wyja- cji createMultiplier jest zmienną widocz- jako przypadek szczególny, będzie lepsze
śnijmy to na prostych zmiennych. Może- ną tylko w ciele funkcji. Ponieważ definicja od tworzenia metody prywatnej. Zwróć-
my napisać tak: domknięcia znajduje się wewnątrz funkcji, my uwagę, że w przykładzie tym utwo-
wszystkie jej zmienne będą dla domknięcia wi- rzyliśmy anonimowe domknięcie, które
String a = "test" doczne. Ważne jest, że nawet kiedy domknię- natychmiastowo uruchomiliśmy (nawia-
print a cie znajdzie się poza ciałem funkcji (w tym wy- sy na końcu).
bądź tak padku zostanie przez nią zwrócone), wartości Skoro już tyle powiedzieliśmy o anoni-
print "test" wewnętrznych zmiennych będą przez nie da- mowości, warto wspomnieć o przypad-
lej pamiętane – oczywiście statycznie. ku szczególnym – anonimowe domknię-
W obu przypadkach utworzyliśmy obiekt Powrócę jeszcze na chwilę do idei anoni- cie, które chcielibyśmy wykonać rekuren-
typu String, jednak w tym drugim – anoni- mowych domknięć. Wiemy już, że między cyjnie. Wiele języków funkcyjnych nie
mowo, nie przypisując go do żadnej zmien- domknięciem a jego uruchomieniem róż- daje takiej możliwości. Znanymi mi wy-
nej. Skoro domknięcia mają cechy zmien- nica leży jedynie w nawiasach. Możemy za- jątkami są JavaScript (dzięki konstrukcji
nych, możemy je zatem tworzyć również tem natychmiastowo użyć domknięcia zwra- arguments.calle) oraz Groovy. W tym
anonimowo (użyta tu metoda each po pro- canego przez funkcję, bez przypisywania go ostatnim sytuacja jest szczególnie pro-
stu uruchamia przekazany kod dla każdego do zmiennej: sta. Wspominałem wcześniej, że wykona-
elementu kolekcji): nie domknięcia następuje dzięki składo-
print createMultiplier(10)(100) wej metodzie call – zatem wystarczy ją
[ "do", "re", "mi" ].each( { print it } ) wykonać z wnętrza kodu. Kończąc rozwa-
W niektórych sytuacjach czytelniej będzie żania o domknięciach (i zachęcając do eks-
Tym oto sposobem w naturalny sposób wy- zaznaczyć, że wymuszamy uruchomienie perymentowania z nimi), zobaczmy przy-
rażamy to, co chcemy zrobić dla każdego domknięcia. W tym celu Groovy definiuje kład anonimowego rekurencyjnego do-
(each) elementu listy. Groovy pozwala ten metodę call, będącą składową wszystkich mknięcia liczącego ciąg Fibonacciego (z
zapis jeszcze bardziej uprościć. Jeśli para- domknięć: pewnym ograniczeniem, by uniknąć prze-
metrem jakiejś funkcji jest domknięcie i pełnienia stosu):
chcemy je w locie zaimplementować (za- print createMultiplier(10).call(100)
miast przekazywać nazwę domknięcia), { a, b ->
możemy opuścić okrągłe nawiasy. Groovy W rzeczywistości notacja nawiasowa jest tyl- println a
zrozumie, że w tym miejscu implementuje- ko skrótową formą wykonania metody call. a<20 && call(b, a+b)
my anonimowe domknięcie: Jeśli kogoś dziwi fakt, że domknięcie ma }(1,1)
swoją metodę – przypominam, że fizycznie
[ "do", "re", "mi" ].each{ jest ono obiektem. Wykorzystać ale nie poślubić
it.reverse() Sama koncepcja domknięć nie jest może Żaden język programowania nie ma racji
print it zbyt skomplikowana, jednak pewnej praktyki bytu bez dedykowanych dla niego bibliotek
} wymaga, by zacząć myśleć i projektować kod z (no, chyba że SQL). W obecnych czasach tyl-
ich użyciem. Mogą się one okazać przydatne w ko nieliczni zajmują się wymyślaniem kloc-
To już nie wygląda jak zwykłe wywoła- wielu sytuacjach. Czasem tylko po to, by ład- ków – reszta buduje z nich swe aplikacje. Ję-
nie funkcji, to po prostu wygląda tak jak- nie ograniczyć kod lub ustrzec się przed pisa- zyk Groovy, ex definitione, klocków dostar-
byśmy funkcji each, która nie wie nic na niem prywatnych metod, które w całej klasie cza mało, w większości bowiem kradnie je Ja-
temat tego, co ma zrobić z elementami li- użyte są tylko raz. Wyobraźmy sobie, że ma- vie. Wspominaliśmy o tym nie raz, zobacz-
sty, przekazali kawałek kodu do wykona- my w metodzie jakąś zmienną lokalną, której my w końcu, jak to wygląda. Rozważmy ta-
nia. Specjalnie rozbiłem go na kilka linii, inicjalizacja wymaga pewnych dodatkowych ką klasę:
by było widać, że domknięcie nie musi być operacji. Dzięki domknięciom możemy napi-
jednoliniowe. sać coś na kształt lokalnej anonimowej fabryki, public class MyWindow {
Bardzo ważną cechą domknięć jest fakt, że która uratuje nas przed koniecznością zaśmie- private javax.swing.JFrame frame;
zapamiętują one wartości zmiennych, które cania ciała metody dodatkowymi zmiennymi private javax.swing.JLabel label;
w momencie ich tworzenia znajdowały się pomocniczymi (a tym bardziej – przed niepo- }
w ich zakresie widoczności. Brzmi skompli- trzebnymi metodami prywatnymi). Mogłoby
kowanie – zobaczmy przykład. Tym razem to wyglądać na przykład tak: Przedstawiony tu kod wygląda jak część apli-
utworzymy funkcję, która zwraca w rezulta- kacji Swing języka Java i z pewnością skom-
cie domknięcie. long time = { pilowałby się z użyciem kompilatora tego ję-
try { new TimeService().getTime() zyka. Jest to jednocześnie pełnoprawny kod
def createMultiplier(int val) { } catch (Exception e) { Grooviego! Nie musimy w jakiś tajemniczy
return { it * val } System.currentTimeMillis() } sposób importować obiektów Javy lub obu-
} }() dowywać je jakimiś abstrakcjami (jak mia-

www.sdjournal.org 33
Języki programowania

łoby to miejsce w przypadku niektórych ję- Implementacja zdarzenia została zaim- żemy napisać własnych budowniczych do
zyków skryptowych łączących się z Javą) – plementowana wprost, przy użyciu do- rozwiązywania konkretnych problemów
my po prostu używamy Javy. Nie zapomi- mknięcia. Jedynym dodatkowym elemen- – klasycznym przykładem może być tu na-
najmy, że na poziomie wykonania aplikacji tem jest konieczność określenia, jak dane rzędzie generujące zapytania SQL dla za-
(runtime) maszyna wirtualna nawet nie wie, domknięcie powinno zostać zinterpreto- danych tabel. Zainteresowanych tematem
że ma do czynienia z Groovim. Wszystko de wane – zrobimy to z użyciem operatora odsyłam do lektury na temat klasy groov
facto jest Javą. as, którym wymuszamy konkretny typ y.util.BuilderSupport, będącej bazą dla
Głównym zadaniem Grooviego jest uła- klasy bądź interfejsu. Można zatem po- wszystkich budowniczych. Wcześniej jed-
twianie pracy programistom. W tym celu wiedzieć, że domknięcie zostanie skon- nak zachęcam do poeksperymentowania
niektóre z klas standardowych języka Java wertowane do implementacji interfejsu z budowniczymi dystrybuowanymi wraz
zostały uzupełnione po stronie Grooviego ActionListener. z językiem. Mamy tu do wyboru następu-
o dodatkowe właściwości. Najwięcej przy- Tworzenie interfejsu użytkownika można jące narzędzia:
kładów możemy zobaczyć, operując na ko- jeszcze bardziej uprościć z użyciem budowni-
lekcjach danych. Pracując np. ze standar- czych. Tę technikę opisano w kolejnym punk- • NodeBuilder – tworzy drzewiastą struk-
dowymi obiektami typu ArrayList, ma- cie artykułu. turę obiektów, po których można nawigo-
my do dyspozycji kilka metod, które uła- wać z użyciem GPath – prostego języka
twiają przechodzenie po kolekcjach. Przy- Programowanie zapytań zbliżonego do Xpath;
kładem może tutaj być wspomniana wcze- z użyciem budowniczych • DOMBuilder – tworzy model dokumen-
śniej metoda each, wykonująca domknię- W poprzednich dwóch punktach dowie- tu;
cie dla każdego elementu listy. Co wię- dzieliśmy się, jak korzystać z obiektów Ja- • SAXBuilder – obsługa dokumentu XML
cej, metoda ta operuje poprawnie nie tyl- vy w Groovim oraz jak wykorzystywać do- w ujęciu zdarzeniowym;
ko na kolekcjach, ale także np. dla napi- mknięcia. Ta wiedza, poparta odpowiednią • MarkupBuilder – przydatny przy szyb-
sów, pobierając w każdej iteracji kolejny praktyką, powinna umożliwić programi- kiej budowie plików HTML i XML;
znak. Oznacza to, że fizycznie wspomnia- stom Javy sprawną przesiadkę do nowego • AntBuilder – wsparcie dla dostępu
ne rozszerzenia możliwości obiektów stan- języka. Często jednak wiele problemów bę- i uruchamiania zadań narzędzia Ant;
dardowych zostały wykonane na poziomie dziemy dalej rozwiązywać bez szczególne- • SwingBuilder – wsparcie dla budowy
klasy Object. Znajdziemy tu bardziej wy- go zysku w kwestii ilości czasu bądź kodu. interfejsu użytkownika.
rafinowane operacje, niż przykładowa me- Bierze się to ze specyfiki niektórych zagad-
toda each. Ich listę i opis przedstawiono w nień. Jednym z nich może być konstruowa- Obycie z budowniczymi wymaga początko-
osobnej ramce. nie interfejsu użytkownika. Czy to w Gro- wo odrobiny praktyki, z czasem staje się bar-
Kolejnym rozszerzeniem standardowych ovim, czy w Javie, będziemy musieli stwo- dzo intuicyjne.
klas języka Java jest dodanie dla niektórych rzyć ciąg obiektów odpowiadających po- Zachęcam do przeanalizowania nieco
z nich metod operatorowych. Przykładowo, szczególnym elementom okna, połączyć je większego przykładu z oficjalnej dokumen-
mapy i listy mają zdefiniowany operator [], w całość i zdefiniować zdarzenia. Zadanie tacji języka, w którym bezpośrednio z zapy-
dzięki któremu łatwo możemy odczytać lub nietrudne, lecz żmudne. Musimy bowiem tania wysłanego do bazy danych budowany
zapisać wartość elementu pod wskazanym in- zbudować strukturę o pewnej hierarchii, w jest plik XML.
deksem. Dodawanie nowych elementów do której poszczególne elementy będą zawie-
listy, obiektów typu StringBuffer czy kon- rały się w innych – podobnie jak na stro- Metaprogramowanie w Groovim
katenacja stringów odbędzie się z użyciem nach HTML. Groovy, ze względu na swo- Natura Grooviego pozwala na znacznie więk-
operatora << (dla niektórych z klas zdefinio- ją zgodność z Javą, pozwala przedstawione szą manipulację kodem w porównaniu do
wano podobnie działający operator <<=, do- tu zagadnienia rozwiązać w sposób klasycz- mechanizmu refleksji języka Java. Przede
konujący jednocześnie przypisania). ny, udostępnia też jednak znacznie szybszy wszystkim mamy tutaj możliwość dodawa-
Jedną z wielu praktycznych cech języka mechanizm w postaci budowniczych dedy- nia nowych elementów klas, a nie tylko ich
Java jest możliwość anonimowej implemen- kowanych konkretnym problemom. Nim dynamicznego uruchamiania. Współczesna
tacji interfejsów. Praktyka ta jest często sto- zagłębimy się w szczegóły, przyjrzyjmy się Java dorobiła się co prawda narzędzi mody-
sowana przez programistów aplikacji Swing. przykładowi, nawet jeśli początkowo nie fikujących w czasie rzeczywistym kod bajto-
Trzeba jednak przyznać, że przy implemen- wszystko będzie tam zrozumiałe – Listing wy klas (służy do tego np. opisywana w SDJ
tacji dużej ilości np. obsługi zdarzeń, może- 1 prezentuje program konstruujący okno biblioteka ASM, wykorzystywana nota bene
my łatwo wygenerować nieco rozdmucha- interfejsu użytkownika z informacją tek- wewnętrznie przez język Groovy), jednak w
ny kod, którego lwią część będą stanowiły stową i przyciskiem. przypadku Grooviego mamy do czynienia
deklaracje, a faktyczny kod wykonujący ja- To, co z pewnością zwraca na siebie uwa- z mechanizmem wbudowanym bezpośred-
kieś działania będzie się gdzieś gubił. Gro- gę w przykładzie, to oddanie kodem Gro- nio w język.
ovy pozbawiony jest abstrakcji interfejsów, oviego hierarchii interfejsu użytkowni-
pozwala jednak na ich implementację z uży- ka – bez pierwotnego tworzenia obiek- Dynamiczne wywoływanie metod
ciem domknięć. Tak zapisany kod skupia się tów, a później sklejania ich w całość (miej- Zacznijmy od małego przykładu ukazujące-
wyłącznie na swej funkcjonalności. Zobacz- scami może przypominać to nieco nota- go potęgę i prostotę dynamicznego wykony-
my przykład implementujący zdarzenie dla cję JSON). Mimo że kod wygląda dość nie- wania metod. Zaimplementujemy funkcję,
obiektu JButton standardowo, nie ma w nim żadnych nie- która dla zadanego obiektu uruchomi meto-
znanych nam do teraz elementów składnio- dę wskazaną za pomocą tekstu:
JButton button = new JButton(); wych. Wykorzystujemy tu dwie podstawo-
button.addActionListener( { event -> println we cechy języka Groovy – możliwość ini- def runm(obj, mth, params) {
event.getSource() } cjalizacji obiektów z użyciem map oraz obj."${mth}"(*params)
as ActionListener ) anonimowe domknięcia. Skoro tak, mo- }

34 08/2009
Groovy

Przykład użycia tej funkcji mógłby wyglądać W pokazanym przykładzie zmienna ograniczeniem. Typowym przykładem mo-
następująco: delegate wskazuje na obiekt String sam że być tutaj praca z bazami danych. Załóż-
w sobie. Nie możemy użyć tutaj warto- my, że chcemy pobrać z tabeli osób jedynie
runm("Hello world", "substring", [0,4]) ści this, gdyż ta wskazywałaby na po- imiona i nazwiska. Czy będziemy przecho-
ziom wyżej – klasę, z której uruchamia- wywać je w obiektach typu Person, z nieza-
Jak widzimy, Groovy pozwala nam posłu- my kod (np. ConsoleScript). Jest to typo- inicjalizowanymi pozostałymi polami, czy
żyć się dowolnym napisem w miejscu wy- wa cecha domknięć, a przecież dynamicz- też obciążymy aplikację, wczytując niepo-
wołania metody (lub odwołania do pola kla- ne metody implementujemy właśnie z ich trzebne pola? Możemy ewentualnie użyć
sy). Prościej nie można już było tego zaim- użyciem. mapy, ale tracimy w tym układzie obiekto-
plementować! W kwestii dynamicznego definiowania wą swobodę. Groovy wychodzi naprzeciw
Pewnego komentarza wymaga użyty metod, Groovy pozwala nam na duże leni- takim sytuacjom. Opisany wcześniej me-
w przykładzie sposób przekazywania pa- stwo. Jeśli metoda, którą chcemy zaimple- chanizm dynamicznego rozbudowywania
rametrów do funkcji. Wywołanie *params mentować, już istnieje, ale dla zupełnie innej prototypów klas nie będzie tu zbyt użytecz-
zamienia listę na ciąg parametrów wejścio- (niespokrewnionej) klasy – możemy ją sobie ny – w końcu nie chcemy modyfikować ist-
wych funkcji. Bez tej konwersji przekazali- zwyczajnie pożyczyć: niejących klas, a stworzyć nowe, zazwyczaj
byśmy metodzie substring tablicę, która jedynie tymczasowo i w możliwie najprost-
przecież nie jest akceptowanym typem wej- MyClass.metaClass.myMethod = obj.&method szy sposób. Do takich celów służą obiekty
ściowym. Mechanizm ten można porównać Expando.
do funkcji apply z języka JavaScript. Użyty tu operator .& jest wskaźnikiem Programiści znający JavaScript wiedzą, że
na metodę, który w rezultacie zwraca do- przypisanie obiektowi wartości (lub funkcji)
Sprawdzanie obecności pól i metod mknięcie. Należy zwrócić uwagę, iż poży- dla nieistniejącego pola nie wygeneruje błę-
W Javie każdy obiekt posiada atrybut class, czamy metodę konkretnego obiektu (wraz z du, tylko to pole utworzy. Możemy zatem za-
dzięki któremu możemy zidentyfikować je- jego kontekstem), a nie ogólną definicję me- cząć od stworzenia pustego obiektu (poprzez
go klasę. W języku Groovy mamy dodatko- tody z zadanej klasy. konstrukcję new Object() lub {}) ,a później,
wo do dyspozycji właściwość metaClass, któ- Metamodel języka Groovy umożliwia nam w zależności od potrzeby, dodawać nowe pola
ra umożliwia nam szybki dostęp do metamo- również definiowanie nowych konstrukto- lub metody. Dokładnie na tej samej zasadzie
delu obiektu. rów. Przykładowo, dla klasy Person zdefinio- działają obiekty Expando języka Groovy. Przy-
Kod poniżej sprawdzi, czy obiekt obj klasy wanej następująco: kład poniżej rozwiązuje nasz problem z baza-
MyClass posiada pole o nazwie age: mi danych - tworzy obiekt zawierający tylko
class Person { interesujące nas pola:
MyClass.metaClass.hasProperty(obj, "age") String name
} def john = new Expando()
Właściwość metaClass zawiera w sobie listy john.firstName = "John"
dostępnych pól (properties) i metod (me- utworzymy konstruktor przyjmujący jeden john.lastName = "Smith"
thods). Dzięki temu, poszukując konkret- parametr, mający na celu inicjalizację pola
nych elementów klasy, możemy posługiwać obiektu: Zwróćmy uwagę, że nie odwołujemy się tu-
się standardowymi operacjami na listach, taj do metamodelu klasy (metaClass), tylko
np. z użyciem domknięć: Person.metaClass.constructor = {String n tworzymy pola w locie. Odwołanie do dowol-
-> new Person(name: n) } nego elementu klasy jest zatem zawsze po-
MyClass.metaClass.methods.findAll{ it.name. prawne, nawet jeśli element ten nie istnie-
startsWith("get") } Zwróćmy uwagę, że wewnętrznie dokonu- je. W najgorszym wypadku otrzymamy w
jemy inicjalizacji obiektu z użyciem istnie- rezultacie wartość null, jak na przykładzie
Pokazany przykład zwróci listę wszystkich jącego konstruktora (w tym wypadku jest poniżej:
metod, których nazwy rozpoczynają się od to domyślny konstruktor operujący na ma-
słowa get. pie). Nie jest to obowiązkowe, jednak czę- print john.middleName
sto wygodne. Musimy jednak uważać, by
Modyfikacja prototypu klas nie odwołać się w takim kodzie ponownie Nic nie stoi na przeszkodzie, by w ten sam
Groovy nie tylko pozwala nam przeglądać do właśnie tworzonego konstruktora, uzy- sposób utworzyć metodę (oczywiście z uży-
metamodel klas, ale również umożliwia je- skamy bowiem w efekcie niechcianą reku- ciem domknięcia):
go modyfikację. Tym sposobem możemy roz- rencję.
budować możliwości klas już istniejących, W każdym z przedstawionych wyżej przy- john.getFullName = {"$firstName $lastName"}
bez konieczności implementacji klas po- kładów deklarowaliśmy nową metodę lub
chodnych. Zróbmy to dla standardowej kla- konstruktor, bądź nadpisywaliśmy istniejące. Należy jednak pamiętać, że obiekty Expando
sy String: Jeśli chcielibyśmy wykluczyć nadpisywanie, nie są typowymi obiektami w rozumieniu
powinniśmy zamiast operatora równości po- Javy. Po stronie tego języka są one reprezen-
String.metaClass.welcome = { służyć się operatorem przesunięcia bitowego towane nie jako klasyczne java beans, a jedy-
"Welcome ${delegate}!" w lewo (<<). W takiej sytuacji próba nadpisa- nie jako elementy mapy obudowanej obiek-
} nia istniejącej metody zakończyłaby się zgło- tem groovy.util.Expando.
szeniem wyjątku.
Od tego momentu możemy posługiwać się Eval
metodą welcome: Obiekty Expando Funkcja eval to poniekąd symbol większo-
W niektórych przypadkach statyczna ści języków dynamicznych od czasów po-
print "Mel".welcome() struktura klas może okazać się poważnym wstania Lispa. Efektem jej działania jest wy-

www.sdjournal.org 35
Języki programowania

konanie kodu, przekazanego funkcji w po- luacji), dobrze ukazuje jednak potęgę me- żemy sobie wyobrazić konieczność sytu-
staci napisu. Odpowiednik funkcji eval taprogramowania w Groovim. Zastanów- acji odwrotnej. Groovy z definicji ma uła-
znajdziemy również w Groovim, w posta- my się, co dokładnie nasza metoda powin- twiać pisanie kodu. Wielu programistów,
ci statycznej klasy Eval. Jej implementacja na robić? Chcąc zarejestrować nową funk- zwłaszcza pracujących od dawna nad jaki-
w kompilowanym języku dla maszyny wir- cję, musimy ją wygenerować w postaci do- miś aplikacjami, nie przepisze ich teraz na
tualnej Java jest prawdziwym osiągnięciem mknięcia, które będzie liczyło zadane wy- nowy język.
(choć nie pierwszym i nie jedynym – patrz rażenie. Napotykamy tu na pewne utrud- Mogą jednak pokusić się o napisanie frag-
np. BeanShell lub Clojure). Zobaczmy przy- nienie, polegające na zmiennej ilości pa- mentów kodu w Groovim i późniejsze uru-
kładowy kod: rametrów wejściowych. W efekcie musi- chomienie takich podprogramów z pozio-
my, w zależności od ich liczby, skorzystać mu Javy. Przyda się to zwłaszcza w sytu-
Eval.me('println "Hello dynamic world"') z różnych metod klasy Eval oraz wyge- acjach, w których Groovy pozwoli na znacz-
nerować różną ilość wejść dla wynikowe- ne oszczędzenie czasu. Operacje na bazach
Metoda me klasy Eval pobiera tekst w po- go domknięcia. W tym celu stworzyliśmy danych, plikach XML czy elementach in-
staci parametru i wykonuje go jako kod dwie listy (evs i pas), których elemen- terfejsu użytkownika mogą tu być dobrym
programu. Chcąc sparametryzować wej- ty posłużą nam do skonstruowania opisa- przykładem.
ściowy napis, tak, by w momencie wyko- nych elementów. Zacznijmy jednak od czegoś mniejszego
nania mógł operować na aktualnych war- W uproszczeniu moglibyśmy rozwią- – prostej klasy języka Groovy:
tościach jakichś zmiennych, należy użyć zać nasz problem za pomocą domknięcia
dedykowanych metod klasy Eval, takich przyjmującego dwa parametry – wyraże- class Test {
jak x, xy, xyz lub przeładowanej wersji me- nie i tablicę wartości wejściowych, które private String name
tody me. Trzy pierwsze metody wprowa- następnie zostaną (dzięki operatorowi *) public def value
dzają do ewaluowanego napisu zmienne skonwertowane do ciągu niezależnych pa- }
(odpowiednio x, y i z). Ich użycie wygląda rametrów. Takie domknięcie (stworzone
następująco: w celach pomocniczych) reprezentowane Jest to klasa specyficzna dla Grooviego, za-
jest przez zmienną ee na listingu (zwróć- wiera bowiem niezdefiniowany typ, mogący
Eval.xy(1, 2 ,'++x; x+y') my uwagę na sposób wywołania metody przyjmować dowolne wartości. Wspominali-
klasy Eval). Ostatnim krokiem będzie za- śmy już jednak, że maszyna wirtualna Javy
W pierwszej kolejności przekazujemy para- tem utworzenie wynikowego domknię- nie jest w stanie rozpoznać, że ma do czynie-
metry, a następnie napis z kodem. Przełado- cia, które przyjmie dokładnie zadaną licz- nia z innym językiem. Kompilując powyższy
wana metoda me działa podobnie, przyjmuje bę parametrów wejściowych, a wewnętrz- kod, otrzymamy zatem klasyczny plik .class.
jednak jako parametr obiekt, który w napisie nie użyje opisanego wyżej domknięcia po- A import naszej klasy do Javy będzie wyglą-
będzie rozpoznawany pod wskazaną przez mocniczego. Nie mamy innej możliwo- dał następująco:
nas nazwą. ści, jak zbudować to domknięcie w posta-
Łącząc tę technikę z obiektami Expan- ci łańcucha znaków (patrz zmienna clo Test test = new Test();
do, możemy przekazać wszystkie wartości, w przykładzie). Dzięki temu przyjmie ono
na których nam w danym momencie zale- na wejściu zadaną liczbę parametrów. Po- Mam nadzieję, że nikt już nie ma wątpli-
ży, np.: nadto we wnętrzu operuje na zmiennych wości, że Groovy to Java, a integracja języ-
x i y, których wartości przekażemy z uży- ków jest zupełnie przezroczysta. Właśnie
a = new Expando() ciem metody Eval.xy. x w tym wypad- to czyni ten język silnym w zestawieniu
a.num = 5 ku wskazuje na utworzone wcześniej do- z innymi dynamicznymi językami dedy-
Eval.me('obj', a, 'obj.num++') mknięcie pomocnicze (ee) a y – na wyra- kowanymi maszynie wirtualnej Javy. Mo-
żenie. Rezultatem wykonania Eval.xy bę- żemy w Groovim napisać całą bibliotekę
Czas na bardziej wyrafinowany przykład dzie dynamiczne utworzenie oczekiwane- i dostarczyć ją programistom Javy – dla
demonstrujący użycie klasy Eval (oraz go przez nas domknięcia, które finalnie zo- nich nie będzie żadnej różnicy, poza ko-
kilka innych cech języka). Listing 2 za- stanie przypisane dla klasy DynCalc w po- niecznością dołączenia dedykowanych ję-
wiera kod programu będącego rozbudo- staci nowej metody. zykowi plików jar.
wanym kalkulatorem, umożliwiającym Nie jest to łatwy do czytania przykład, jed- Zobaczmy teraz, jak zachowują się po
rejestrację własnych funkcji. Metoda nak pokazane dalej sposoby jego użycia po- stronie Javy rozwiązania specyficzne dla
calculate klasy DynCalc po prostu wy- winny jasno zobrazować finalny efekt i tym języka Groovy. Dla pełnego zrozumienia
licza przekazane wyrażenie matematycz- samym możliwości języka. Zwróćmy uwagę, obu światów musimy bowiem wiedzieć,
ne. Najbardziej interesujące rzeczy dzieją że tworzona funkcja parabolic, obliczająca jak poszczególne mechanizmy są mapowa-
się jednak w metodzie addFunction, któ- położenie obiektu po zadanym czasie w rzu- ne pomiędzy językami. W przykładzie po-
ra pozwala zarejestrować dowolne wyra- cie ukośnym, zawiera nie tylko operacje mate- wyżej nie określiliśmy dla zmiennej value
żenie w postaci składowej klasy DynCalc. matyczne, ale również deklaracje zmiennych typu i nie zainicjalizowaliśmy jej żadną
Metoda przyjmuje trzy parametry – na- wewnętrznych. Stworzyliśmy zatem w kilku- wartością, która mogłaby ten typ determi-
zwę funkcji (name), wyrażenie reprezen- nastu liniach kodu kalkulator o bardzo roz- nować. Rozwiązanie nie jest po stronie Ja-
tujące funkcję (fun) oraz liczbę parame- budowanych możliwościach. vy niczym tajemniczym – value jest okre-
trów wejściowych funkcji (parametr nr, ślane poprzez java.lang.Object. Gdyby
który może przyjmować wartości od 0 w klasie Test miała miejsce inicjalizacja
do 3). Metoda nie jest zbyt czytelna (ani Romans z Groovim (np. napisem lub liczbą), przypisalibyśmy
skrajnie optymalna – założyłem sobie bar- dla uwikłanych w Javę obiektowi wartość konkretnego typu, któ-
dziej możliwie najkrótszy zapis z maksy- Pisaliśmy wcześniej o używaniu klas Ja- ry przecież zawsze będzie dziedziczył po
malnym wykorzystaniem techniki ewa- vy z poziomu języka Groovy. Łatwo mo- klasie Object. Groovy zatem jedynie wy-

36 08/2009
Groovy

korzystał coś, co od zawsze było elemen- dzie poniżej pokazano, w jaki sposób w Ja- ki czemu książka nie jest przepełniona ba-
tem Javy. Różnica polega na braku moc- vie wykonać metodę takiego obiektu: nałami.
nej kontroli typów i konieczności rzuto-
wania. ((groovy.lang.Closure)((groovy.util.Expando) Podsumowanie
Przyjrzyjmy się teraz ogólnej konstruk- myExpando).getProperty("method")).ca Groovy jako język dedykowany maszynie
cji klas. Często pisząc małe przykładowe ll(); wirtualnej Java nie jest jedynym rozwią-
programy, zazwyczaj z użyciem konsoli zaniem. Spośród alternatyw warto wspo-
Groovy, nie deklarujemy żadnych klas, co Dalsza lektura mnieć na przykład o Clojure, języku stwo-
jest przecież niedopuszczalne w Javie. W Nie było technicznej możliwości, by w tak rzonym na bazie Lispa, kompilującym się
takiej sytuacji tworzymy niejawnie klasę krótkim artykule przedstawić wszystkie bezpośrednio do kodu binarnego Javy.
domyślną, która po skompilowaniu przyj- możliwości rozbudowanego języka pro- Nie należy też zapominać o przeniesieniu
mie nazwę pliku, w którym napisaliśmy gramowania. To temat na książkę. W arty- do Javy języków dobrze znanych i spraw-
nasz kod – zostanie on umieszczony we- kule zdołaliśmy zaledwie wyłożyć podsta- dzonych – jak choćby Ruby czy Python.
wnątrz metody main. Każda funkcja napi- wy języka – jego składnię i obszary możli- W tych ostatnich przypadkach integracja
sana bezpośrednio w pliku stanie się oczy- wych zastosowań, bez szczególnego zagłę- z istniejącymi klasami i bibliotekami Java
wiście metodą (niestatyczną) wygenerowa- biania się w wyjaśnienia, jak poszczegól- nie jest jednak już tak prosta i wbudowana
nej klasy. ne mechanizmy zostały zaimplementowa- w język jak w przypadku Grooviego. Gro-
Groovy pozwala na zadeklarowanie do- ne w Javie. ovy powstał jako szybsza (w zapisie) i bar-
wolnej ilości klas (również publicznych) w Pominęliśmy w całości standardową bi- dziej dynamiczna notacja dla Javy, pozosta-
obrębie jednego pliku. Wszystkie zostaną bliotekę Grooviego (GDK), której klasy w jąc z nią nierozerwalnie związanym. Moż-
skompilowane do standardowych klas Ja- pełni wykorzystują możliwości języka, po- liwość naprzemiennego pisania kodu w Ja-
va. Nie ma natomiast możliwości tworze- zwalając programować szybciej, niż z uży- vie lub Groovim i jego łatwa integracja z ca-
nia klas wewnętrznych – zarówno w ob- ciem standardowych klas Javy (zwłasz- łą pewnością należą do najmocniejszych
rębie klasy, jak i jej metod. Składnia języka cza dzięki budowniczym). Znajdziemy tu stron języka.
nie pozwala na takie konstrukcje i powinny przykładowo wsparcie dla obsługi baz da- Język Groovy początkowo potrafi za-
być one zastępowane domknięciami. Każ- nych, pracy z dokumentami XML czy ob- chwycić ilością konstrukcji i ułatwień, jed-
de domknięcie jest natomiast traktowa- sługi aplikacji okienkowych. Programistów nak przy pierwszej próbie napisania więk-
ne przez Javę jako klasa wewnętrzna, roz- aplikacji internetowych zachęcam do zain- szego programu możemy odnieść wraże-
szerzająca groovy.lang.Closure. Tym oto teresowania się, jak pisać servlety (a właści- nie pewnego braku spójności poszczegól-
sposobem te dziwne konstrukcje są osiągal- wie – groovlety) w języku Groovy oraz jak nych koncepcji. Język czerpie w zauważal-
ne z poziomu języka Java. By je uruchomić, wydajnie można połączyć aplikacje tego ję- ny sposób ze sprawdzonych rozwiązań ta-
skorzystamy z opisanej już wcześniej meto- zyka ze Springiem. kich jak Python, Perl, Ruby lub JavaScript,
dy call, występującej w trzech wersjach - Jeszcze ciekawszy może okazać się we- jednak połączenie tych światów, wraz z
bez parametrów, z jednym parametrem ty- bowy szkielet Grails, w całości dedykowa- koniecznością zachowywania całkowitej
pu Object lub listą parametrów tego typu. ny szybkiemu wytwarzaniu aplikacji inter- zgodności z Javą, powoduje, że programo-
Wynikiem działania metody jest zawsze netowych w języku Groovy. Temu temato- wanie w Groovim nie zawsze jest intuicyj-
obiekt typu Object. wi poświęciliśmy osobny artykuł w niniej- ne, przynajmniej w początkowej fazie pra-
Kolejnym specyficznym elementem ję- szym wydaniu SDJ, do którego lektury ser- cy z językiem. Na szczęście to tylko pierw-
zyka Groovy są obiekty Expando. Po stro- decznie zachęcam. sze wrażenie. Szybko można się oswoić z co
nie Javy reprezentowane one są poprzez Pobierając pakiet instalacyjny Groovie- dziwniejszymi konstrukcjami języka i za-
instancje klasy groovy.util.Expando, któ- go, otrzymujemy wraz z binariami kom- cząć bardziej sprawne programowanie. Du-
ra de facto jest prostym obudowaniem ma- pletny podręcznik języka. Poruszanie się ża dowolność Grooviego potrafi dać progra-
py. Każdy dynamicznie tworzony element po nim początkowo jest dość niewygod- miście sporo satysfakcji z tworzonego ko-
obiektu Expando zostanie zatem zapisany ne, a pierwsze rozdziały nie skupiają się du, a przede wszystkim umożliwia znacz-
w wewnętrznej mapie, pod podaną przez na łagodnym wprowadzeniu do języka. Z nie bardziej zwięzłe pisanie w porówna-
nas nazwą. Metody obiektów Expando re- czasem można jednak się przyzwyczaić niu z Javą. W przypadku małych lub śred-
prezentowane są przez domknięcia, za- do struktury książki i wiele się z niej na- nich projektów, warto rozważyć ich imple-
tem utworzone zostaną dla nich klasy we- uczyć. Zwolenników klasycznych podręcz- mentację w całości w Groovim. Dla dużych
wnętrzne. ników zachęcam do przeczytania świetnie aplikacji, przy zauważalnej rotacji progra-
Odwołanie się do elementów obiektów napisanej książki – Groovy in Action (red. mistów w zespole, podlegająca lepszej kon-
Expando nie może po stronie Javy zatem Dierk König). Jej lektura jest prawdziwą troli Java może być bezpieczniejszym roz-
odbywać się bezpośrednio poprzez nazwy, przyjemnością. wiązaniem. Tym niemniej warto delegować
a jedynie z użyciem dedykowanych metod: Autorzy zakładają, że czytelnik wie coś o do Grooviego pojedyncze zadania, z który-
setProperty i getProperty. Na przykła- programowaniu (zwłaszcza w Javie), dzię- mi ten język poradzi sobie w znacznie ła-
twiejszy sposób.
W Sieci
• http://groovy.codehaus.org – strona domowa języka; DAVID DE ROSIER
• http://grails.org – strona webowego szkieletu dla języka Groovy; Programista-podróżnik. Pasjonat WEB 2.0, este-
• http://jcp.org/en/jsr/detail?id=241 – strona poświęcona standaryzacji języka Groovy (JSR 241); tycznego kodowania i algorytmów szachowych.
• http://www.stelligent.com/content/view/44/71 – interesujący wywiad z Guillaumem Lafor- Zawodowo – szkoleniowiec i specjalista od apli-
ge, liderem prac nad rozwojem języka.
kacji JEE i MDA w sektorze finansowym.
Kontakt z autorem: ddrosier@gmail.com

www.sdjournal.org 37
Języki programowania

WS-BPEL
Instrumentacja procesów biznesowych

Web Services Business Process Execution Language (WS-BPEL) jest


językiem programowania, którego celem jest opisanie procesów
zachodzących między partnerami biznesowymi. W artykule zostanie
przedstawiona przykładowa procedura BPEL, korzystająca z jednego
z ogólnodostępnych w Internecie Web serwisów.
zycznego na zespół instrumentalny lub spo-
Dowiesz się: Powinieneś wiedzieć: rządzenie partytury. Porównanie do muzyki
• Jak działają synchroniczne procesy BPEL; • Znać w stopniu podstawowym NetBeans; jest celne, gdyż program BPEL opisuje inte-
• Jak używać następujących czynności: • Czym jest: rakcje między procesami biznesowymi, ope-
• Invoke; • EAI, racje na danych otrzymywanych od partne-
• Assign; • ESB, rów biznesowych oraz łączy wiele usług w
• ForEach; • SOA, jedną całość.
• If; • wsdl, Szczegóły dotyczące specyfikacji BPEL
• Scope; • xsd. można znaleźć na portalu OASIS.
• Czym jest PartnerLink;
• Jak zadeklarować i użyć tzw. 'predicate'; Niezbędne środowisko
• Jak testować i debugować proces BPEL. Aby kontynuować i móc w praktyce prze-
testować działanie przykładowej procedu-
ry BPEL, musimy spełnić następujące wy-
ga, dla zadanego kraju i miasta zwraca ak- magania:
tualna pogodę. Celem tego artykułu jest
Poziom zarysowanie możliwości procedur BPEL • niezbędne jest połączenie z Internetem;
trudności w środowisku NetBeans dlatego też przyj- • należy zainstalować najnowszą wersję Net-
muję, że czytelnik zna to środowisko oraz Beans z portalu http://www.netbeans.org/
jest zorientowany w technologiach związa- downloads/. Ważne jest, aby była to wer-
nych z architekturą zorientowaną na usłu- sja ALL (Rysunek 1), gdyż tylko ta wersja

Z
a pomocą języka BPEL możemy pi- gi (SOA). wspiera BPEL w wersji 2.0.
sać programy, które są Web serwi- W literaturze anglojęzycznej często spo- • Krok opcjonalny: pisząc ten artykuł, ko-
sami, i które korzystają z innych tyka się termin orchestration – odpowied- rzystałem z wersji 6.5.1 NetBeans, dla-
już istniejących Web serwisów, czyli po- nikiem w języku polskim jest instrumen- tego też musiałem wykonać upgrade bi-
zwalają na integrowanie różnych usług. Ję- tacja. Za słownikiem muzycznym PWM: blioteki http-binding, ponieważ ta, któ-
zyk ten pozwala między innymi na utwo- instrumentacja jest to układ utworu mu- ra była w w.w. instalacji zawierała błąd.
rzenie nowej usługi, która agreguje usłu-
gi już istniejące, lub pozwala na konwer- • BPEL – skrót od Web Services Business Process Execution Language (WS-BPEL), jest to
sję danych dostarczanych przez partnerów standard języka, który opisuje w krokach interakcje między usługami sieciowymi.
biznesowych lub tworzy nowy interfejs do • WSDL – skrót od Web Services Description Language, jest to język który opisuje Web Ser-
usług już istniejących. Zadeployowany pro- wisy – opisuje protokoły, operacje, formaty danych w usługach sieciowych.
ces BPEL jest widziany jako nowy Web Se- • SOA – skrót od service-oriented architecture. Jest to podejście architektoniczne, którego
główna ideą jest integracja procedur biznesowych, powtarzalnych zadań biznesowych.
rvice. Kod źródłowy programu napisanego • EAI – skrót od Enterprise Application Integration polega na integracji zestawu aplikacji
w języku BPEL ma postać XML'a, pozwa- komputerowych przy użyciu rozwiązań software'owych.
la to na używanie dowolnego edytora tek- • ESB – skrót od Enterprise Service Bus, jest to 'apparatus', którego implementacje, między
stowego do pisania procedur BPEL, jednak innymi, dostarczają narzędzi pozwalających na transformację danych, rutowanie komu-
praktycznie jest stosować edytory przysto- nikatów, zmniejszenie ilości połączeń point-to-point, itd.
• XSD – skrót od XML Schema Document. Jest to dokument zawierający metadane, opisuje
sowane do tego celu.
w sposób abstrakcyjny zasady, które musi spełniać dokument XML aby móc zostać uzna-
Dla zilustrowania procedury BPEL wy- ny z poprawny.
brałem usługę sieciową, która dostarcza • XPATH – skrót od XML Path Language. Jest to język zapytań służący do wybierania poje-
dwie operacje: pierwsza, dla zadanego kra- dynczych węzłów lub ich grup z danego dokumentu XML wg zadanego kryterium.
ju zwraca listę największych miast oraz dru-

38 08/2009
WS-BPEL

Procedura instalacji tej biblioteki jest na- Proces, który wykonamy dostarczy nam wszystkich tagów CITY i dla każdej znalezionej
stępująca: informację o aktualnej pogodzie w głów- wartości wywołanie operacji GetWeather łą-
• na wstępie należy ściągnąć plik httpbc.jar nych miastach zadanego kraju, np. dla cząc odpowiedzi ostatniej operacji w jedną ca-
(url znajduje się w części W sieci); Polski. łość i zwrócenie jej jako parametr wyjścia na-
• następnie należy uruchomić serwer Operacja, którą zaimplementujemy, bę- szej procedury BPEL.
Glassfish v2 i zalogować się na jego kon- dzie oczekiwała jednego parametru – na-
solę jako administrator; zwy kraju, i na tej podstawie wywoła operację Szybka ścieżka
• w końcu w lewym panelu wybrać JBI- GetCitiesByCountry, a następnie dla każdego Realizacja przykładu została podzielona na
>Components, zaznaczyć sun-http-binding miasta, w pętli wywoła operację GetWeather. dwanaście kroków.
i kliknąć Upgrade, i w następnym okien- Wynikiem działania naszego procesu będzie
ku wskazać ściągnięty plik. Kroki zobra- XML zawierający dane o aktualnej pogodzie • Krok 1 – Początek projektu.
zowano na Rysunkach 2, 3 i 4. dla największych miast np. w Polsce. Przykła- • Tworzymy nowy projekt w NetBeans
dowy fragment danych zwracanych przez ww • naciskamy [Ctrl+Shift+N];
Scenariusz operacje znajduje się na Listingu 1. Jak widać • wybieramy kategorię Samples/SOA,
W celu ilustracji podstawowych możliwości zadaniem procedury BPEL będzie, po wywo- typ projektu Synchronous BPEL
BPEL wykonamy prosty proces. W Interne- łaniu operacji GetCitiesByCountry, wybranie process (Rysunek 5);
cie można znaleźć wiele publicznie dostęp-
nych usług webowych. Jedną z nich jest Glo- Listing 1. Wyniki działania operacji GetCitiesByCountry oraz GetWeather
bal Weather.
Usługa ta dostarcza dwie operacje: <string>
<NewDataSet>
• GetCitiesByCountry – dostarcza listę <Table>
miast – wymaga jednego parametru: na- <Country>Poland</Country>
zwa kraju. <City>Warszawa-Okecie</City>
• GetWeather – dostarcza aktualną pogo- </Table>
dę – wymaga dwu parametrów: nazwę …..itp.....
kraju i nazwę miasta. zaś fragment odpowiedzi operacji GetWeather to:
<CurrentWeather>
<Location>Warszawa-Okecie, Poland (EPWA) 52-10N 020-58E 107M</Location>
<Time>Jun 15, 2009 - 03:30 AM EDT / 2009.06.15 0730 UTC</Time>
<Wind> from the W (270 degrees) at 10 MPH (9 KT) (direction variable):0</Wind>
<Visibility> greater than 7 mile(s):0</Visibility>
<Temperature> 68 F (20 C)</Temperature>
<DewPoint> 53 F (12 C)</DewPoint>
<RelativeHumidity> 59%</RelativeHumidity>
<Pressure> 29.97 in. Hg (1015 hPa)</Pressure>
<Status>Success</Status>
</CurrentWeather>

Listing 2. Deklaracje zmiennych


<variable name="GetCitiesByCountryOut"
Rysunek 1. Pobranie odpowiedniej wersji xmlns:tns="http://www.webserviceX.NET"
NetBeans. messageType="tns:GetCitiesByCountrySoapOut"/>
<variable name="GetCitiesByCountryIn"
xmlns:tns="http://www.webserviceX.NET"
messageType="tns:GetCitiesByCountrySoapIn"/>

Listing 3. Konwersja odpowiedzi partnera na listę miast


<assign name="Assign2">
<copy>
<from>
sxxf:doUnMarshal($GetCitiesByCountryOut.parameters/ns3:GetCitiesByCoun
tryResult)
</from>
<to>$miasta.resultType/ns2:paramA</to>
</copy>
<copy>
<from>$miasta.resultType/ns2:paramA//City</from>
<to>$miasta.resultType/ns2:paramA</to>
</copy>
</assign>
Rysunek 2. Upgrade biblioteki http-binding
część 1

www.sdjournal.org 39
Języki programowania

• wciskamy przycisk Next i wpisujemy Wynikiem tego kroku jest utworzenie dwu site Application jest projektem, który groma-
nazwę projektu, np. aktualnaPogoda, modułów, jeden zawierający proces BPEL, dzi jeden lub więcej innych modułów i który
i wciskamy przycisk Finish. drugi to tzw. Composite Application. Compo- zostanie deployowany na serwerze Java Busi-
ness Integration (JBI), w naszym przypadku
będzie to GlassFish v2.
Ponieważ korzystamy z przykładowe-
go projektu jako podstawę, którą rozbudu-
jemy, środowisko automatycznie utworzyło
plik WSDL dla naszej nowej usługi oraz plik
Rysunek 3. Upgrade biblioteki http-binding część 2
xsd. Automatycznie utworzone pliki WSDL
oraz XSD są bardzo ubogie lecz na potrzeby
tego artykułu w zupełności wystarczające.
Oczywiście w rzeczywistej aplikacji bizneso-
wej pliki te należy uzupełnić do własnych po-
trzeb lub utworzyć nowe własne.

• Krok 2 – Utworzenie lokalnej kopii do-


kumentu opisującego zewnętrznego
partnera biznesowego.

Należy na module BPEL z menu kon-


Rysunek 4. Upgrade biblioteki http-binding część 3 tekstowego wybrać pozycję new exter-
nal WSDL document. Wybieramy from
Listing 4. Warunek pomijający brak danych URL i wpisujemy adres WSDL, któ-
ry nas interesuje, w naszym przypad-
<if name="If1"> ku będzie to http://www.webservicex.net/
<condition>not(contains($GetWeatherOut.parameters/ns3:GetWeatherResult, globalweather.asmx?wsdl jak na Rysunku 6.
'Data Not Found')) Efektem tego kroku jest pojawienie się no-
</condition> wego pliku WSDL, jak na Rysunku 7. W
<assign name="Assign4"/> ten sposób, lokalnie posiadamy model opi-
</if> sujący usługę webową naszego partnera biz-
nesowego.
Listing 5. Konwersja odpowiedzi partnera biznesowego
• Krok 3 – przypisanie partnerów bizne-
<assign name="Assign4"> sowych w procedurze BPEL.
<copy>
<from> Otwieramy plik z rozszerzeniem .bpel w try-
sxxf:doUnMarshal($GetWeatherOut.parameters/ns3:GetWeatherResult) bie Design. W ten sposób uruchomiony zo-
</from> stanie graficzny edytor procedur BPEL. Me-
<to>$outputVar.resultType/ns2:paramA[$ForEach1Counter]</to> todą drag and drop przeciągamy nowy plik
</copy> WSDL na prawe pole dla Partner Link, jak
zaznaczono na czerwono na Rysunku 8. Po
Listing 6. Fragment powodujący błąd budowania aplikacji, który należy zakomentować bądź przeciągnięciu pliku WSDL, otworzy się
usunąć
okno Create new Partner Link – pozostawia-
my wartości domyślne. Czynności te moż-
<!--wsdl:port name="GlobalWeatherSoap12" binding="tns:GlobalWeatherSoap12"> na oczywiście wykonać ręcznie, dokonu-
<soap12:address location="http://www.webservicex.net/globalweather.asmx" /> jąc odpowiednich wpisów w pliku źródło-
</wsdl:port> wym procedury BPEL. W celach edukacyj-
<wsdl:port name="GlobalWeatherHttpGet" binding="tns:GlobalWeatherHttpGet"> nych dobrym pomysłem jest obserwowanie
<http:address location="http://www.webservicex.net/globalweather.asmx" /> zmian zachodzących w kodzie źródłowym
</wsdl:port> edytowanej procedury podczas edycji w try-
<wsdl:port name="GlobalWeatherHttpPost" binding="tns:GlobalWeatherHttpPost"> bie graficznym.
<http:address location="http://www.webservicex.net/globalweather.asmx" />
</wsdl:port-->

Listing 7. Deklaracja parametru WE dla testów procedury BPEL

<soapenv:Body>
<syn:typeA>
<syn:paramA>Poland</syn:paramA>
</syn:typeA>
</soapenv:Body>
Rysunek 5. Wybór nowego projektu

40 08/2009
WS-BPEL

W katalogu Process Files pojawi się nowy Assign1. Następnie przeciągamy czynności czynność Invoke1, naciskając przyciski
plik WSDL o nazwie globalweather.asmxW- Assign, ForEach, Scope, Assign, Invoke, If, Create utworzymy zmienne wejścia i wyj-
rapper. Jest to wrapper, w którym został zde- Assign. Na czynności Invoke1 znajduje się ścia. Analogicznie postępujemy z czynno-
finiowany partnerLinkType. PartnerLink- koperta, którą należy teraz przeciągnąć do ścią Invoke2 ( patrz Rysunek 11). Zmien-
Type jest kanałem komunikacji między stro- operacji GetCitiesByCountry. Kopertkę z ne te zawierać będą parametry wywołania
nami. Komunikacja ta może odbywać się w czynności Invoke2 przeciągamy do operacji oraz wartości zwrócone przez partnerów
dwie strony. Należy zauważyć, że wrapper GetWeather. Powinniśmy otrzymać proces biznesowych.
ten zawiera klauzule importującą WSDL, taki jak na Rysunku 10. Krótki opis czynno- Jeśli otworzymy kod źródłowy naszej
który został utworzony w kroku drugim. ści znajduje się w Ramce. procedury, w sekcji <variables> zoba-
PartnerLinkType reprezentuje interakcje Tym sposobem otrzymaliśmy zgrubny czymy deklarację tych zmiennych, będą
między naszym procesem a partnerem biz- szkic procedury BPEL. Nie należy się przej- to zmienne GetCitiesByCountryOut oraz
nesowym. mować komunikatami błędów gdyż te zosta- GetCitiesByCountryIn, których deklaracja
Patrząc na proces BPEL w trybie De- ną usunięte w następnych krokach. mają postać jak na Listingu 2 oraz zmien-
sign (Rysunek 9), widzimy z lewej strony ne GetWeatherOut i GetWeatherIn. Należy
PartnerLink, który reprezentuje klienta wy- • Krok 5 – tworzymy zmienne zwrócić uwagę na miejsce deklaracji tych
syłającego dane wejściowe – w naszym przy- zmiennych. Dwie ostanie zmienne są wi-
kładzie jest to nazwa kraju – i w odpowiedzi W tym kroku utworzymy zmienne: dwie docznie wyłącznie w Scope1 w przeciwień-
otrzymuje listę z aktualną pogodą. Z prawej o zasięgu globalnym i dwie o zasięgu Sco- stwie do dwu pierwszych, które mają zasięg
strony zaś mamy partnera dostarczającego li- pe1. W tym celu dwukrotnie klikamy na globalny.
stę miast dla zadanego kraju oraz aktualną
pogodę dla zadanego miasta. W części środ-
kowej jest nasz proces, który będzie odpo-
wiednio manipulował danymi.

• Krok 4 – edycja procedury BPEL.

Z palety czynności przeciągamy czynność


Invoke i wstawiamy ją poniżej czynności Rysunek 6. Pobranie WSDL partnera biznesowego

Listing 8. Fragment odpowiedzi od partnera biznesowego

<?xml version="1.0" encoding="UTF-8"?>


<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ns1:typeA xmlns:msgns="http://localhost/SynchronousSample/SynchronousSample"
xmlns:ns1="http://xml.netbeans.org/schema/SynchronousSample">
<ns1:paramA>
<Location xmlns="">Gdansk-Rebiechowo, Poland (EPGD) 54-23N 018-28E 138M</Location>
<Time xmlns="">May 25, 2009 - 11:30 AM EDT / 2009.05.25 1530 UTC</Time>
<Wind xmlns=""> from the E (090 degrees) at 10 MPH (9 KT):0</Wind>
<Visibility xmlns=""> greater than 7 mile(s):0</Visibility>
<Temperature xmlns=""> 60 F (16 C)</Temperature>
<DewPoint xmlns=""> 46 F (8 C)</DewPoint>
<RelativeHumidity xmlns=""> 58%</RelativeHumidity>
<Pressure xmlns=""> 30.09 in. Hg (1019 hPa)</Pressure>
<Status xmlns="">Success</Status>
</ns1:paramA>

Opis czynności
W literaturze anglojęzycznej używa się słowo Activity, wydaje się że odpowiednikiem w języku polskim najlepiej oddającym sens tego słowa jest
czynność.

• Czynność Invoke jest używana do wywoływania usług webowych oferowanych przez partnerów.
• Czynność Assign posiada jedną lub kilka operacji kopiowania między zmiennymi zadeklarowanymi w procedurze BPEL.
• Czynność ForEach iteruje sekwencyjnie N razy po szeregu zadeklarowanych czynności.
• Czynność Scope. Każda czynność ForEach musi zawierać czynność Scope, jest to wymagane przez specyfikację OASIS. Scope pozwala na
tworzenie struktury zagnieżdzonych hierarchii.
• Czynność If jest to struktura znana z większości języków programowania i pozwala na wybranie jednej gałęzi czynności na podstawie do-
starczonego warunku.

www.sdjournal.org 41
Języki programowania

• Krok 6 – zasilanie parametru wejścia To spowoduje, że predefiniowane funkcje moczynnie uzupełni się niezbędnym wpi-
partnera biznesowego XPath będą widoczne dla naszej procedu- sem.
ry BPEL-owej. W czynności Assign2 odpowiedź part-
Dwukrotnie klikamy na Assign1, otwiera- Bez tego wpisu funkcja doUnMarshal nera biznesowego zostanie skonwertowana
jąc edytor mapowania (Mapper). Usuwamy byłaby niewidoczna i procedura BPEL do XML-a, następnie przepisana do zmien-
strzałkę łączącą lewą kolumnę z prawą, na- nie kompilowałaby się. Dostępne funk- nej miasta, na koniec przy pomocy XPath
stępnie przeciągamy paramA (z lewej stro- cje Xpath są widoczne w zakładce Map- zostaną wybrane wyłącznie tagi o nazwie
ny edytora Mapper Variables/inputVar/ per edytora graficznego BPEL, jeśli meto- City.
inputType/paramA) na CountryName (z dą drag and drop przeciągniemy funkcję Teraz wciskamy [Alt+Shift+F9], co uru-
prawej strony edytora Mapper Variables/ BPEL/doUnMarshal, to tag <process> sa- chomi walidację pliku – do czynności
G etCit ie s B y C o u nt r yI n /p a r a m et e r s /
CountryName), tak jak na Rysunku 12.
Tym sposobem kopiujemy zawartość pa-
rametru wejściowy naszej procedury do pa-
rametru wejścia procedury GetCitiesByCo-
untry partnera biznesowego. Innymi słowy
wstawiamy nazwę kraju jako parametr ope-
racji GetCitiesByCountry.

• Krok 7 – utworzenie zmiennej tymcza-


sowej.

Teraz utworzymy zmienną, która będzie


przechowywała listę miast, którą otrzymamy
od naszego partnera biznesowego. W tym ce-
lu wklejamy

<variable name="miasta" messageType="ns1:


responseMessage"/>

do pierwszego bloku <variables> – są to


zmienne globalne. To samo możemy wy-
klikać w okienku Navigator procesu, w wi-
doku logicznym BPEL, w menu kontek-
stowym pozycji Variables wybrać add Va- Rysunek 8. Pusty proces BPEL
riable.
Następnie odszukujemy w kodzie źró-
dłowym czynność Assign2 i podmienia-
my tę czynność na tę przedstawioną na Li-
stingu 3. Czynność ta spowoduje wyeks-
trahowanie zawartości tagu <City> i sko-
piowanie jej do zmiennej miasta, otrzy-
mując wyłącznie listę miast bez zbędnych
danych.
Ponadto do deklaracji procesu (tag <process>)
wklejamy:

xmlns:sxxf="http://www.sun.com/wsbpel/2.0/
process/executable/SUNExtension/
XPathFunctions"

Rysunek 7. WSDL partnera biznesowego Rysunek 9. Dodany zewnętrzny PartnerLink

42 08/2009
WS-BPEL

Assign2 włącznie nie powinno być żad-


nych błędów.

• Krok 8 – inicjalizacja pętli

W tym kroku ustalimy ilość iteracji czyn-


ności ForEach. W widoku Design nasze-
go procesu BPEL w menu konteksto-
wym czynności ForEach1 wybieramy Pro-
perties. W pole Start Counter Value wpi-
sujemy 1 – wartość początkowa liczni-
ka. Mając zaznaczony ForEach1, wciska-
my przycisk Mapper. Zaznaczamy pozy-
cję Final Value, przeciągamy funkcję Co-
unt z grupy Node, łączymy paramA z Fi-
nal Value; funkcja Count zwraca ilość
węzłów, w naszym przypadku jest to
ilość miast w liście otrzymanej z opera-
cji GetCitiesByCountry, ponadto dołącza-
my stałą 1 do Start Value, uzyskując obraz
taki jak na Rysunku 13. Dla uproszczenia
przyjmujemy, że wywołana usługa zwró-
ci przynajmniej jedno miasto; pominiemy
walidację poprawności wpisanej nazwy
kraju. Spójrzmy w kod źródłowy deklara-
cji ForEach: <finalCounterValue>count(
$ miasta.resultTy pe/ns2:pogoda[.])</
finalCounterValue> w celu lepszego zro-
zumienia działania mappera edytora gra-
ficznego zwrócić uwagę w jaki sposób jest
wywoływana funkcja count.

• Krok 9 – ustanowienie Predicate

Predicate jest to warunek, który jest na-


kładany na węzeł xml'owy zawierający
wiele pozycji. Wynikiem jest podzbiór
zawierający tylko te węzły, które speł-
niają ten warunek. W naszym przykła-
dzie predicate użyjemy do pobierania ko-
lejno jednej pozycji z listy miast. Predica-
te można tez wykorzystać do dodawania
nowych węzłów w liście. W kroku tym Rysunek 10. Szkic procesu BPEL
utworzymy tzw. Predicate, który pozwo-
li nam na iterację po poszczególnych mia-
stach, jako licznik wykorzystamy zmien-
ną ForEach1Counter. Po pierwsze, dwu-
krotnie klikamy na Assign3, następnie
kilkamy na paramA w menu konteksto-
wym gdzie jedną z opcji jest Add Predica-
te. Po wybraniu tej opcji pojawi się nowe
okienko, w którym przeciągamy zmienną
na prawo do Predicate, tak jak widać na
Rysunku 14, i natychmiast przypisujemy
zmienne wejścia do partnera biznesowego
tak jak na Rysunku 15.

• Krok 10 – walidacja odpowiedzi partne-


ra biznesowego

Nasz partner biznesowy w sytuacji, gdy nie


znajdzie danych o pogodzie dla wskazanego
miasta, zwraca łańcuch Data Not Found. Z Rysunek 11. Zmienne Wejścia/Wyjścia dla partnera biznesowego

www.sdjournal.org 43
Języki programowania

tego względu, niezbędne jest dodanie klau-


zuli warunkowej, która pozwoli na pominię-
cie tych miast. W naszym przykładzie jest to
If1. Należy uzupełnić czynność IF o waru-
nek <condition>, uzyskując kod przedsta-
wiony na Listingu 4.
Podobny efekt jak na Listingu 4 można
uzyskać, korzystając z edytora graficznego.
Warunek ten sprawdza zawartość odpowie-
dzi operacji GetWeather. Jeśli w odpowiedzi
nie znajduje się łańcuch znaków 'Data Not
Found', zostanie wykonana czynność As-
sign4, w innym wypadku program rozpocz-
nie kolejną iterację.

Rysunek 12. Mapowanie • Krok 11 – tworzenie listy miast z aktu-


alną pogodą

W czynności Assign4 będziemy kopiowali


odpowiedź partnera do parametru wyjścia
naszej procedury. W każdej iteracji, do para-
metru Wyjścia zostanie dodana pogoda dla
danego miasta. Aby uzyskać ten efekt nale-
ży czynność Assign4 zmodyfikować o treść
z Listingu 5.
Również stworzyliśmy predicate (par
amA[$ForEach1Counter]) dla paramA, lecz
tym razem ręcznie. Odpowiedź partnera
biznesowego skonwertujemy do XML-a, a
Rysunek 13. Wartości początkowa i końcowa ForEach następnie skopiujemy do outputVar, któ-
ry jest parametrem wyjścia naszego pro-
cesu. W ten sposób w każdej iteracji bę-
dzie dodawana jedna pozycja do parame-
tru wyjścia.
W tym miejscu spotyka nas przykrość,
gdyż wersja NetBeans, z której korzysta-
łem, zawierała błąd w mechanizmie budo-
wania plików .casa. Aby obejść ten błąd, na-
leży usunąć bądź zakomentować cytowa-
ny na Listingu 6 fragment w pliku globalwe-
ather.asmx.wsdl.
Wprowadzając zmianę przedstawioną na
Listingu 6, usunęliśmy porty, z których nie
korzystamy i które powodują błędne budo-
wanie aplikacji. Prawdopodobnie w kolej-
nych wersjach NetBeans ten błąd zostanie
usunięty.
Teraz otwieramy plik .casa (Service Assem-
bly modułu AktulnaPogoda1Application),
czyścimy i budujemy (Clean and build) oba
moduły: AktualnaPogoda1 oraz AktulnaPo
Rysunek 14. Iteracja po Miastach goda1Application. W edytorze graficznym

W Sieci
• Specyfikacja WS-BPEL OASIS – http://www.oasis-open.org/;
• Tutorial WS-BPEL http://www.eclipse.org/tptp/platform/documents/design/choreography_html/tutorials/wsbpel_tut.htm;
• NetBeans – http://www.netbeans.org/downloads/;
• EAI – http://en.wikipedia.org/wiki/Enterprise_Integration_Patterns;
• Projekt open-ESB https://open-esb.dev.java.net/;
• biblioteki http-binding – http://download.java.net/jbi/binaries/open-jbi-components/main/nightly/latest/ojc/httpbc.jar;
• Globalweather web-service http://www.webservicex.net/globalweather.asmx?wsdl;
• Wyszukiwarka publicznie dostępnych usług webowych http://seekda.com/.

44 08/2009
WS-BPEL

plików casa otrzymujemy obraz identyczny niec w menu kontekstowym TestCase0 wy- ności i naciśnięcie [CTRL + F8]. Pozwala to
do tego z Rysunku 16. Na Rysunku 16 zobra- bieramy Run. Gdy NetBeans odpyta nas, na analizowanie przebiegu procedury oraz
zowano, jak działa nasza przykładowa proce- gdzie zadeployować aplikację, należy wska- obserwację zmiennych. Oczywiście przy-
dura, jak jest wywoływana i jakie usługi wy- zać serwer Glassfish v2. Po chwili powinien padek testowy należy uruchomić poprzez
wołuje. pojawić się nowy plik w folderze TestCase0 wybranie Debug w menu kontekstowym
o nazwie aktualna data z dopiskiem Failed i TestCase0. Możliwość debugowania proce-
• Krok 12 – uruchomienie procedury czerwoną kopertą. Otwieramy ten plik. Po- dur BPEL w środowisku NetBeans jest bar-
BPEL. winien on zawierać treść bardzo podobną dzo rozbudowana i ergonomiczna co zna-
do tej z Listingu 8. Listing 8 zawiera frag- komicie pomaga w pisaniu procedur.
W tym kroku przetestujemy naszą procedu- ment odpowiedzi otrzymanej od partnera Funkcjonalność SOA, dostarczona w śro-
rę. Przechodzimy do zakładki Services, wy- – w rzeczywistości plik ten jest długi, oczy- dowisku NetBeans, jest bardzo ergonomicz-
bieramy Servers/GlassFish v2 i w menu kon- wiście dane otrzymane będą się różnić od na i łatwa do opanowania. Narzędzie to moż-
tekstowym wybieramy Start. Gdy serwer tych z listingu, gdyż pogoda zmienną jest. na z powodzeniem wykorzystać też w sytu-
się uruchomi, otwieramy plik Input, znajdu- Pomimo że procedura BPEL-owa zadziałała acji gdy np. tworzymy aplikacje korporacyjną
jący się w zakładce Projects w module Aktu bezbłędnie, przy wyniku testu pojawiła się w postaci skomplikowanego interfejsu użyt-
alnaPogoda1Application w folderze Test/ adnotacja Failed; w tym przypadku jest to kownika, który zbiera duże ilości danych od
TestCase0, tak jak zilustrowano na Rysunku bez znaczenia, gdyż mechanizm testujący operatora a następnie ma za zadanie wysłać
17. W pliku tym wpisujemy Poland w miej- oczekuje, aby odpowiedź była identyczna z je do odległego Web service'u do którego nie
sce parametru paramA , tak jak widać na Li- zawartością pliku Output, co jest niemożli- mamy dostępu w czasie produkcji i posiada-
stingu 7. we, gdyż pogoda bezustannie się zmienia. my jedynie jego WSDL. W takiej sytuacji, na
Następnie w menu kontekstowym w mo- W dowolnym kroku procedury BPEL w potrzeby produkcji musimy utworzyć atra-
dule AktualnaPogoda1Application wybie- edytorze graficznym można dodać break- pę takiej usługi sieciowej; atrapę która będzie
ramy Clean and Build, dalej Deploy, a na ko- point poprzez wskazanie wybranej czyn- musiała umieć wykonać walidacje bizneso-
we, zwracać różne kody błędów, tak abyśmy
mogli testować naszą aplikację. W takiej sytu-
acji utworzenie zestawu procedur BPEL wy-
daje się optymalne, dużo bardziej praktycz-
ne niż pracowicie pisać Web serwisy np. bez-
pośrednio w javie co jest czasochłonne i może
prowadzić do sytuacji gdzie programiści cze-
kają jeden na drugiego. Używając BPEL w kil-
ka minut można tworzyć i modyfikować od-
powiednie procedury BPEL tak aby z łatwo-
ścią wykonywać scenariusze testujące wszyst-
kie przypadki użycia.

PIOTR ZERYNGER
Autor jest konsultantem JEE i zajmuje się języ-
kiem Java od momentu jego powstania, czyli od
1995 roku.
Kontakt z autorem: z_piotr@yahoo.com

Rysunek 15. Przypisanie aktualnego miasta do parametru WE partnera biznesowego

Rysunek 16. Moduły JBI Rysunek 17. Testowanie – parametr wejściowy

www.sdjournal.org 45
Języki programowania

Język skryptowy Lua


Charakterystyka i rola języka skryptowego
Lua w programowaniu gier (i nie tylko)
Lua jest jednym z najczęściej wykorzystywanych języków skryptowych
w programowaniu gier komputerowych. Skrypty często służą implementacji
algorytmów logiki gry, SI czy interface'u użytkownika, co ułatwia modyfikację
i rozbudowę aplikacji. Przyjrzymy się charakterystyce języka Lua oraz
integracji skryptów Lua w aplikacjach takich jak gry komputerowe.
rycznych lub znaku _, jednak nie mogą roz-
Dowiesz się: Powinieneś znać: poczynać się cyfrą. Istnieją również słowa za-
• Co to jest Lua; • Podstawy programowania w C/C++; strzeżone, tj. and, or, break, else itp., któ-
• Jak praktycznie korzystać z Lua. • Filozofię języków skryptowych. re nie mogą opisywać identyfikatorów. Lua
rozróżnia wielkość liter, zatem for oznacza
pętlę, natomiast For widziany jest jako iden-
Pascal) z bardziej złożonymi konstrukcjami tyfikator. Podwójny myślnik -- rozpoczyna
opisu danych opartych na tablicach asosja- komentarz i ignoruje na etapie kompilacji/
Poziom cyjnych, a także rozszerzalną semantyką. wykonywania wszystkie znaki występujące
trudności Lua jest projektem open-source'owym, za- po nim aż do końca linii. Istnieje również
implementowanym w C zgodnie ze stan- możliwość zakomentowania całego bloku
dardami ANSI C, którego głównym celem składającego się z kilku linii poprzez --[["

J
ęzyki skryptowe to języki programo- jest łatwość użycia, prostota, wydajność i i "]].
wania umożliwiające rozszerzanie przenośność kodu.
funkcjonalności aplikacji komputero- Niniejszy artykuł ma na celu przybliże- Typy i wyrażenia
wych bez konieczności zmiany kodu wyni- nie czytelnikowi, poprzez liczne przykłady, W Lua nie deklarujemy typów zmiennych
kowego. Są one również intensywnie wyko- charakterystyki języka Lua, oraz wskazanie – każda zmienna ma dynamiczny typ okre-
rzystywane przy automatyzacji działań ad- praktycznych aspektów wykorzystania ję- ślany przez jej wartość.
ministracyjnych systemu, np. w powłoce zyków skryptowych w aplikacjach kompu- Istnieje 8 podstawowych typów danych
systemu Unix. Głównym założeniem te- terowych. w Lua:
go typu języków jest możliwość ingeren- Na początku omówimy podstawowe
cji użytkownika w istniejący i działający elementy składni języka Lua, a następ- • nil – przyjmuje jedną wartość nil, któ-
system bez znajomości kodu źródłowego. nie przejdziemy do integracji skryptów z ra określa brak konkretnej wartości (czę-
Przykładami takich języków są Bash, Py- aplikacjami napisanymi w C/C++. Zapo- sto nil jest stosowany do określenia
thon, Perl, PHP, QuakeC, GameMonkey, znamy się również z wbudowanymi stan- zmienną niezainicjalizowaną);
UnrealScript oraz Lua. dardowymi bibliotekami Lua ułatwiają- • boolean – przyjmuje standardowe
Języki skryptowe często wykorzystywa- cymi pisanie bardziej skomplikowanych wartości boolowskie, czyli true lub
ne są w procesie tworzenia gier kompute- skryptów. false;
rowych w celu sterowania przebiegiem fa- • number – liczba reprezentująca war-
buły (np. misje, dialogi), podejmowania Opis języka – podstawy tości rzeczywiste (zmiennoprzecinko-
decyzji w algorytmach sztucznej inteligen- Jak przekonamy się w dalszej części tekstu, we); liczby możemy zapisywać na róż-
cji (np. sterowanie postaciami NPC, ang. składnia Lua jest zwięzła i intuicyjna dla ne sposoby, np.: 18, 3.141592, 1.23e12,
non-playable characters) czy też graficznej każdego, kto miał jakąkolwiek styczność z 4.18e-3;
obsługi interfejsu gry (GUI, ang. graphical językami programowania. • string – standardowy łańcuch znaków,
user interface). Jednym z najczęściej wybie- Najczęściej przygodę z nowym językiem np. "What is your name?";
ranych przez twórców gier języków skrypto- programowania rozpoczyna się od napi- • userdata – typ danych umożliwiający
wych jest język Lua, który został użyty w ty- sania najprostszego programu typu 'hello przetrzymywanie dowolnych danych z
tułach takich jak: Crysis, FarCry, Baldur's world'. Taki program w Lua przedstawio- języka C (np. wskaźników) w struktu-
Gate, S.T.A.L.K.E.R., Wiedźmin czy World no w Listingu 1. rach Lua;
of Warcraft. • function – funkcje zdefniniowane ja-
Lua jest lekkim językiem skryptowym łą- Konwencje leksykalne ko wykonywalny ciąg instrukcji; funk-
czącym ze sobą elementy prostego języka Identyfikatory w Lua mogą składać się z cje mogą być deklarowane wewnątrz
proceduralnego (składnia podobna do języka dowolnego łańcucha znaków alfanume- innych funcji, mogą być argumentami

46 08/2009
Język skryptowy Lua

innych funkcji, lub być zwracane z in- przez kolekcję par (klucz, wartość), gdzie tością nil. Elementami tablicy mogą być
nej funkcji; kluczem może być wszystko poza war- wszystkie wartości podstawowych typów
• thread – wątek w Lua – z uwagi na cha-
rakter niniejszego artykułu nie będzie- Listing 1. Program typu 'hello world' w Lua wraz z przykładem komentarzy
my omawiać wątków w Lua;
• table – tablica asosjacyjna będąca naj- -- first.lua
cięższym orężem Lua; dokładny opis ta- print("Hello from Lua!");
blic znajduje się w dalszej części. --[[
Przykład komentarza
W dowolnym miejscu skryptu możemy umieszczonego w kilku liniach
sprawdzić typ danej zmiennej poleceniem ]]
type (jak pokazano w Listingu 2).
Lua, jak przystało na porządny język pro- Listing 2. Sprawdzanie typu zmiennych w Lua
gramowania, oferuje również różnego rodza- print(type(a)) --> nil (zmienna 'a' nie została zainicjalizowana)
ju operatory do definiowania wyrażeń. Wy- a = 10
różniamy: print(type(a)) --> number
a = "string test"
• operatory arytmetyczne, czyli + (doda- print(type(a)) --> string
wanie), - (odejmowanie), * (mnożenie), a = print -- a staje się funkcją print
/ (dzielenie), % (modulo) i ^ (potęgowa- a(type(a)) --> function
nie);
• operatory porównania, czyli == (rów- Listing 3. Przykład pętli, funkcji i instrukcji warunkowych
ne), ~= (różne), < (mniejsze), > (większe), -- wyznaczanie wartości minimalnej i maksymalnej
<= (mniejsze lub równe), >= (większe lub min_max = function(a, b, c)
równe); local tab = {a, b, c};
• operatory logiczne, takie jak and (część local idx_min = 1;
wspólna), or (suma logiczna), not (negacja). local idx_max = 1;
for i=2,3 do
Instrukcje i funkcje if tab[i]<tab[idx_min] then idx_min = i; end;
Lua obsługuje standardowy zestaw instruk- if tab[i]>tab[idx_max] then idx_max = i; end;
cji podobnych do tych stosowanych w języku end;
Pascal czy C. Istnieje możliwość definiowa- return tab[idx_min], tab[idx_max];
nia bloków instrukcji objętych słowami klu- end;
czowymi do i end, które można kontrolować print(min_max(1,8,3)); --> 1 8
poprzez break czy return. Na listę pojedyn- -- rozwiązywanie równania kwadratowego
czych instrukcji składają się: quadratic_eq = function(a, b, c)
delta = b*b-4*a*c;
• instrukcje przypisania =; if delta>0 then
• instrukcje warunkowe, if/elseif/else / sqr_delta = math.sqrt(delta);
end; x0 = (-b-sqr_delta) / (2*a);
• pętle, for/do /end, while /do /end, repeat / x1 = (-b+sqr_delta) / (2*a);
until/; return x0, x1;
• wywołania funkcji; elseif delta==0 then
• lokalne deklaracje zmiennych. x = -b/(2*a);
return x, x;
Instrukcja przypisania może dotyczyć kil- else
ku zmiennych. Pojedyncze instrukcje mogą return nil, nil;
opcjonalnie kończyć się średnikiem. end;
Listing 3 ilustruje wykorzystanie funkcji, end;
zastosowanie pętli oraz instrukcji warunko- print(quadratic_eq(1, -1, -2)); --> -1 2
wych na przykładzie funkcji wyznaczającej
wartość minimalną i maksymalną z trzech Listing 4. Przykład funkcji rekurencyjnej w Lua
liczb, oraz funkcji obliczającej pierwiastki -- obliczenie n!
równania kwadratowego. function factorial (n)
Jak widzimy w przykładzie, funkcje mo- if n == 1 then
gą przyjmować i zwracać więcej niż jeden return 1;
parametr. Istnieje również możliwość de- else
klarowania funkcji rekurencyjnych (Li- return n * factorial(n-1);
sting 4). end
end
Tablice -- obliczenie 5!
Tablice są najistotniejszymi struktura- print(factorial(5)); --> 120
mi danych w Lua. Są one reprezentowane

www.sdjournal.org 47
Języki programowania

Lua, czyli także same tablice. Dzięki te- danych, które mogą być utożsamiane z ele- W tradycyjnych językach programowania
mu mechanizm tablicy umożliwia definio- mentami takimi jak: lista, wektor, kolejka, jakimi są C czy Pascal w większości przypad-
wanie użytkownikowi dowolnych struktur zestaw czy stos. ków złożone struktury danych reprezento-
wane są właśnie przez dynamiczne listy lub
Listing 5. Przykłady wykorzystania tablicy w Lua wektory prostych typów danych. Tablice w
Lua umożliwiają implementację o wiele bar-
-- prosty wektor liczb dziej złożonych i elastycznych struktur, stwo-
squares = {1, 4, 9, 16, 25, 36, 49, 64, 81} rzonych specjalnie na potrzeby rozwiązania
-- zbiór danych danego zagadnienia. Listing 5 pokazuje przy-
creature = { name = "Ghoul", health = 100 } kłady wykorzystania tablic w Lua realizując
print(creature["name"]); --> Ghoul proste zbiory danych, listę jednokierunko-
print(creature.name); --> Ghoul wą, czy strukturę zawierającą zarówno atry-
-- lista buty jak i metody.
list = nil;
list = {next = list, value = 2}; Integracja z C++
list = {next = list, value = "test"}; Po zapoznaniu się z podstawowymi ele-
list = {next = list, value = math.pi}; mentami języka skryptowego Lua przejdź-
ptr = list; my do jego praktycznego zastosowania w
while ptr do aplikacjach napisanych w C++. Listing 6
print(ptr.value); obrazuje kompletny kod programu w C++,
ptr = ptr.next; którego celem jest poprawne zainicjalizo-
end; --> 3.141592 test 2 wanie maszyny wirtualnej i wykonanie
-- struktura/klasa skryptu Lua.
Vec3 = {}; W pierwszym rzędzie należy dołączyć na-
Vec3.new = function(x, y, z) główki Lua (lua.h, lualib.h i lauxlib.h) oraz
return {x=x, y=y, z=z, length=function() return math.sqrt(x*x+y*y+z*z) end;} skompilowaną bibliotekę Lua (w przykła-
end; dzie jest to lua51.lib). Binarną wersję biblio-
v = Vec3.new(4, 2, 4); teki musimy sobie sami zbudować ze źró-
print(v:length()); --> 6 deł Lua, lub skorzystać z gotowej skompilo-
wanej wersji umieszczonej na stronie domo-
Listing 6. Inicjalizacja maszyny wirtualnej i wykonanie skryptu Lua wej projektu.
#include <iostream> Następnie poleceniem lua_open() two-
/// dołączenie nagłówków Lua rzymy maszynę wirtualną ( lua_State) i
extern "C" rejestrujemy standardowe biblioteki opi-
{ sane w dalszej części artykułu. Teraz mo-
#include "lua.h" żemy już wykonać skrypt poleceniem
#include "lualib.h" luaL_dofile() , sprawdzając jednocze-
#include "lauxlib.h" śnie, czy skrypt nie zawiera błędu (np.
} składniowego). Na zakończenie program
/// dołączenie biblioteki Lua zwalnia maszynę wirtualną poleceniem
#pragma comment (lib, "lua51.lib") lua_close() .
Wiemy już, jak wykonać skrypt na maszy-
/// program główny nie wirtualnej Lua z poziomu kodu aplika-
int main() cji w C++. W powyższym przykładzie bra-
{ kuje jednak symbiozy pomiędzy aplikacją a
/// stworzenie maszyny wirtualnej Lua skryptem – każdy z tych procesów wykonu-
lua_State* s = lua_open(); je się dla samego siebie. Musimy zatem stwo-
/// inicjalizacja standardowych bibliotek rzyć mechanizm komunikacji pomiędzy apli-
luaL_openlibs(s); kacją a skryptem.
/// wykonanie skryptu Lua Mechanizmem umożliwiającym sterowa-
if (luaL_dofile(s, "sdj.lua")) nie naszą aplikacją jest zarejestrowanie funk-
{ cji aplikacji w maszynie wirtualnej Lua, któ-
/// błąd ra jest punktem łączącym obydwa proce-
std::cout << "Error while running script: " << lua_tostring(s, -1) << std:: sy. Załóżmy, że chcemy udostępnić maszy-
endl; nie wirtualnej funkcję aplikacji, która przyj-
return 1; muje dwie liczby i łańcuch znaków jako pa-
} rametry wejściowe i dodatkowo zwraca wy-
/// zamknięcie maszyny wirtualnej nik. Funkcję w naszej aplikacji zamieściliśmy
lua_close(s); w Listingu 7.
W pierwszej fazie pobieramy argumenty
return 0; funkcji, odwołując się do elementów na sto-
} sie względem jego wierzchołka (wywołanie
funkcji w Lua powoduje wrzucenie wszyst-

48 08/2009
Język skryptowy Lua

kich argumentów na stos w kolejności zgod- ra wiąże się z odgrywaniem różnych dźwię- przykładzie na tę informację będą składały
nej z porządkiem parametrów funkcji). Za- ków, generowania efektów specjalnych czy się: nazwa typu klocka uderzonego przez
tem wywołanie funkcji postaci Foo(n0, n1, przyznawania punktów graczowi w zależ- piłeczkę i pozycja piłeczki na ekranie (Li-
op) spowoduje sytuację na stosie zobrazowa- ności od tego, w co uderzyła piłeczka. W sting 10).
ną na Rysunku 1. tym celu przy każdej kolizji piłeczki z kloc- Nasza gra sprawdza, czy nastąpiło zde-
Po pobraniu argumentów ze stosu wyko- kami na planszy będziemy wołać funkcję ze rzenie piłeczki z klockiem na planszy
nujemy przykładowe operacje (dodawanie skryptu Lua. (IsCollision()). Jeżeli tak, to wypełnia-
lub mnożenie) w zależności od trzeciego W pierwszej kolejności musimy przy- na jest odpowiednia struktura z informacją
parametru przekazanego do funkcji. Wy- gotować odpowiedni kod aplikacji, któ- o zderzeniu, a następnie wołana jest funk-
nik operacji wrzucamy na stos – w przy- ry obsługuje zderzenia piłeczki z innymi cja OnCollision() ze skryptu Lua. Nale-
padku nierozpoznanej operacji wrzucamy obiektami. Po wykryciu zderzenia będzie- ży oczywiście uprzednio przygotować ar-
wartość nil. Ostatnie polecenie return 1 my wołać funkcję skryptu Lua, który po- gumenty tej funkcji – w naszym przypad-
oznacza, iż zwracamy jedną wartość z na- dejmie odpowiednią akcję, bazując na in- ku będzie to tablica z elementami opisu-
szej funkcji. formacji o zderzeniu. W naszym prostym jącymi nazwę klocka i pozycję piłeczki na
Mając zdefiniowaną funkcję na pozio-
mie aplikacji, rejestrujemy ją poleceniem Listing 7. Przygotowanie funkcji aplikacji dla skryptu Lua
lua_register(s, "Foo", FooFunc) – oczy-
wiście przed wykonaniem skryptu. Parame- static int FooFunc(lua_State *s)
try lua_register oznaczają odpowiednio: {
stworzoną maszynę wirtualną Lua, odpo- /// pobierz pierwszy argument
wiednik nazwy funkcji w Lua oraz nazwę float n0 = (float)lua_tonumber(s, -3);
funkcji statycznej w C, którą rejestrujemy. /// pobierz drugi argument
Teraz już wszystko gotowe, aby odwołać się float n1 = (float)lua_tonumber(s, -2);
do naszej funkcji aplikacji z poziomu skryp- /// pobierz trzeci argument
tu – Listing 8. std::string op = lua_tostring(s, -1);
Znamy już sposób odwoływania się do
funkcji aplikacji z poziomu skryptu Lua – te- float res = 0.0f;
raz spróbujemy zrobić to samo w drugą stro-
nę. Wcześniej w przykładach pokazaliśmy if (op == "add")
funkcję factorial() do obliczania silni. Zo- res = n0 + n1;
baczmy, jak ponownie wykorzystać ideę sto- else if (op == "mul")
sowej maszyny wirtualnej i zawołać funk- res = n0 * n1;
cję skryptową z poziomu kodu aplikacji (Li- else
sting 9). {
Zaczynamy od wrzucenia na szczyt sto- lua_pushnil(s);
su funkcji factorial() z globalnej tablicy return 1;
Lua. Jeżeli operacja powiodła się (wartość }
na szczycie stosu jest różna od nil), wrzuca-
my kolejno argumenty funkcji (w naszym /// wrzuć wynik na szczyt stosu
przypadku jest to jedna liczba – w przykła- lua_pushnumber(s, res);
dzie jest to 4). /// 1 oznacza liczbę zwracanych wartości
W ten sposób mamy przygotowane wy- return 1;
wołanie funkcji, które wykonujemy polece- }
niem lua_call, podając liczbę parametrów
wołanej funkcji (jeden) i liczbę zwracanych Listing 8. Wywołanie funkcji aplikacji ze skryptu
wartości przez funkcję (również jeden). print(Foo(10, 14, "mul")); --> 140
Ostatnim krokiem jest pobranie ze szczy- print(Foo(10, 14, "add")); --> 24
tu stosu wyniku działania funkcji i wypisa- print(Foo(10, 14, "div")); --> nil
nia go na ekran.
Listing 9. Wywołanie funkcji skryptu z kodu aplikacji
Praktyczne zastosowanie Lua /// pobranie funkcji z globalnej tablicy skryptu
W poprzedniej części pokazaliśmy, w ja- lua_getglobal(s, "factorial");
ki sposób można zrealizować obustron- if (!lua_isnil(s, -1))
ną komunikację pomiędzy skryptem a ko- {
dem aplikacji. Spróbujmy teraz odnieść się /// wrzucenie na stos argumentu funkcji
do tych informacji poprzez praktyczne za- lua_pushnumber(s, 4);
stosowanie skryptu w konkretnym progra- /// zawołanie funkcji
mie. Załóżmy, że tworzymy prostą grę ty- lua_call(s, 1, 1);
pu arkanoid, gdzie zadaniem gracza jest /// wyświetlenie wartości zwróconej
odbijanie piłeczki paletką tak, aby zbija- std::cout << "Result from script function: " << lua_tonumber(s, -1) << std::
ła one konkretne klocki ułożone na plan- endl;
szy. Chcemy umożliwić (spoza kodu apli- }
kacji) pełną kontrolę zbijania klocków, któ-

www.sdjournal.org 49
Języki programowania

ekranie. Powyższy kod pokazuje, jak stwo- blicę postaci event= {block = "name", wiednimi wartościami). Przykładowa funk-
rzyć i przekazać do maszyny wirtualnej ta- x=0, y=0} (oczywiście wypełnioną odpo- cja OnCollision(event) po stronie skryp-
tu może wyglądać jak pokazano w Listin-
Listing 10. Obsługa kolizji w prostej grze typu arkanoid gu 11.
Funkcja sprawdza, z jakim typem kloc-
struct ScollInfo{ ka zderzyła się piłeczka i podejmuje odpo-
/// nazwa typu klocka wiednie czynności polegające na odgrywa-
std::string Block; niu odpowiedniego dźwięku, wyświetleniu
/// pozycja piłeczki w momencie zderzenia efektów specjalnych czy zwiększeniu punk-
float X, Y; tacji gracza. Oczywiście wszystkie funk-
}; cje aplikacji, czyli PlaySounds, AddScore,
AddParticles, EndLevel czy Log, mu-
SCollInfo ci; szą być wcześniej zarjestrowane tak, aby
Lua mogła je zawołać (tak jak opisaliśmy
if (IsCollision(&ci)) to wcześniej). I tak, kiedy piłeczka ude-
{ rzy w klocek typu block_death, odgrywa-
/// pobranie funkcji z globalnej tablicy skryptu my odpowiedni dźwięk, wyświetlamy od-
lua_getglobal(s, "OnCollision"); powiedni efekt w miejscu piłeczki i prze-
if (!lua_isnil(s, -1)) kazujemy do kodu aplikacji informację o
{ niepomyślnym zakończeniu planszy. Na-
/// stworzenie nowej tablicy na szczycie stosu tomiast w przypadku trafienia w klocek ty-
lua_newtable(s); pu block_normal losujemy jeden z trzech
/// zarejestrowanie table.block dźwięków, odgrywamy go i dodajemy gra-
lua_pushstring(s, ci.Block.c_str()); czowi 10 punktów.
lua_setfield(s, -2, "block"); Dzięki takiemu podejściu możemy doda-
/// zarejestrowanie table.x wać nowe typy klocków i kontrolować zacho-
lua_pushnumber(s, ci.X); wanie podczas kolizji z nimi bez zmiany ko-
lua_setfield(s, -2, "x"); du aplikacji.
/// zarejestrowanie table.y
lua_pushnumber(s, ci.Y); Standardowe biblioteki LUA
lua_setfield(s, -2, "y"); Lua posiada bogaty zestaw narzędzi wyższe-
/// wywołanie funkcji skryptu go poziomu zawartych we wbudowanych bi-
lua_call(s, 1, 0); bliotekach standardowych. Do tych biblio-
} tek należą:
}
• operacje na łańcuchach znaków – na-
Listing 11. Przykładowa funkcja w Lua obsługująca kolizje rzędzia umożliwiające zaawansowa-
OnCollision = function(event) ne operacje na łańcuchach znaków, tj.
wyszukiwanie, wyodrębnianie i za-
if event.block == "block_bonus" then miana podłańcuchów, dopasowywa-
PlaySound("bonus.wav"); nie do wzorca, formatowanie tekstów
AddScore(100); itp.;
elseif event.block == "block_death" then • operacje na tablicach – rozszerzenia
PlaySound("death.wav"); umożliwiające bardziej wyrafinowane
AddParticles(event.x, event.y, "explosion"); operacje na tablicach w Lua (np. sorto-
EndLevel(false);
elseif event.block == "block_target" then
PlaySound("fanfare.wav");
AddParticles(event.x, event.y, "fanfare");
AddScore(1000);
EndLevel(true); �� ��

elseif event.block == "block_normal" then


�� ��
local snd_table = {"hit_n1.wav", "hit_n2.wav", "hit_n3.wav"};
PlaySound(snd_table[math.random(3)]); �� ��
AddScore(10);
else
PlaySound("default.wav");
end;

Log(string.format("Collision with \"%s\" at (%f, %f)", event.block, event.x,


event.y));
end; Rysunek 1. Parametry funkcji na stosie oraz ich
indeksy w Lua

50 08/2009
Język skryptowy Lua

wanie elementów tablicy, konkatenacja Przykład zamieszczony w Listingu 12 de- podejście umożliwia sterowanie i wprowa-
tablic, wstawianie i usuwanie elemen- monstruje użycie wybranych funkcji biblio- dzanie zmian do gotowego programu oso-
tów); tek standardowych Lua (generowanie liczb bom niekoniecznie związanymi z progra-
• funkcje matematyczne – zbiór funkcji losowych, obliczenie sin(pi/2), sortowanie mowaniem.
matematycznych, w tym funkcji try- tablicy, formatowanie łańcucha znaków i pi- Niniejszy tekst wprowadza czytelnika
gonometrycznych, wykładniczych, wy- sanie do pliku tekstowego). w tematykę języka skryptowego Lua po-
znaczanie wartości bezwzględnej, mi- Dodatkowo Lua posiada wsparcie dla de- przez liczne przykłady praktycznego za-
nimalnej, maksymalnej, reszty z dzie- bugowania skryptów (debug library), two- stosowania.
lenia, a także generowanie liczb loso- rzenia i zarządzania nowymi modułami (mo- Nie wyczerpuje to jednak tematu za-
wych; dules) oraz dodatkowych narzędzi ogólnego awansowanych mechanizmów jakimi są
• funkcje wejścia/wyjścia – zbiór narzę- zastosowania, tj. iteratory tablic, konwerto- np. meta-tablice, będące specjalnymi atry-
dzi operujących na plikach binarnych wanie typów danych czy możliwość łączenia butami wszystkich typów danych w Lua.
i tekstowych (tworzenie, otwieranie, kodu napisanego w kilku plikach. W skrócie, meta-tablice są (analogicznie
zamykanie, czytanie z/pisanie do pli- do typów danych opisanych wcześniej) ta-
ku), Podsumowanie blicami asosjacyjnymi definiującymi zacho-
• funkcje systemowe – biblioteka umoż- W artykule zaprezentowaliśmy podsta- wanie poszczególnych zmiennych w sto-
liwiająca podstawową interakcję z syste- wy języka skryptowego Lua, a także spo- sunku do użytych operatorów arytmetycz-
mem operacyjnym (pobieranie daty, cza- sób wykorzystania skryptów Lua w apli- nych lub logicznych.
su, wykonywanie poleceń powłoki syste- kacjach komputerowych tworzonych w Taki mechanizm umożliwia nam wpro-
mu); C/C++. Lua dzięki swojej prostocie i przej- wadzanie elementów programowania obiek-
• obsługa wątków – biblioteka obsługująca rzystości umożliwia w łatwy sposób rozbu- towego poprzez możliwość przeciążania
tworzenie, usuwanie i kontrolę wątków dowę programów bez konieczności ponow- operatorów, a nawet korzystania z opera-
w Lua. nej kompilacji ich kodu wynikowego. Takie cji dziedziczenia, czy polimorfizmu. Temat
obiektowości w Lua ze względu na swoją ob-
szerność nie został poruszony w tym arty-
Listing 12. Przykład wykorzystania funkcji standardowych bibliotek Lua kule (zachęcam do odwiedzenia strony do-
mowej Lua w celu uzyskania informacji na
-- losowanie liczb ten temat).
math.randomseed(os.time()) Lua cieszy się dużym powodzeniem nie
print(math.random(10)); -- wyświetlenie liczby wylosowanej z przedziału [1,10] tylko w branży gier komputerowych. Język
ten zastosowano m.in. do opisania GUI w
-- obliczenie wartości sin(pi/2) programie Adobe Photoshop Lightroom czy
print(math.sin(math.pi*0.5)); --> 1 do elementów konfiguracji Apache HTTP se-
rver, a także do wielu innych zadań w komer-
-- sortowanie tablicy cyjnych i niekomercyjnych aplikacjach kom-
a = { 10, 40, 20} puterowych.
for i,n in ipairs(a) do print(n); end --> 10 40 20
table.sort(a);
for i,n in ipairs(a) do print(n); end --> 10 20 40

-- formatowanie łańcucha znaków


print(string.format("pi = %f", math.pi)); --> pi=3.141593 PAWEŁ ROHLEDER
Autor pracuje na stanowisku programisty/
-- zapis do pliku projektanta grafiki komputerowej 3D we wro-
f = assert(io.open("output.txt", "w")) cławskiej firmie Techland Sp. z o.o. Jest również
f:write("test"); słuchaczem ostatniego roku studiów dokto-
f:close(); ranckich na Politechnice Wrocławskiej.
Kontakt z autorem: prohleder@wp.pl

W Sieci
• strona domowa LUA – http://www.lua.org/;
• podręcznik LUA on-line – http://www.lua.org/manual/5.1/;
• zbiór artykułów, dodatków i przykładów LUA – http://lua-users.org/wiki/.
• programowanie w Lua – http://www.inf.puc-rio.br/~roberto/pil2/.

LuaC
Lua umożliwia kompilację (za pomocą kompilatora LuaC) skryptów do postaci pośredniego kodu binarnego, który jest wykonywany na maszy-
nie wirtualnej znacznie szybciej niż przebiegałaby jego interpretacja bezpośrednio z postaci tekstowej.

www.sdjournal.org 51
Warsztaty

SQL Server 2008


Data Mining
Każdego dnia do firmowych baz danych napływają niezliczone ilości
informacji. Dane składowane w tabelach zazwyczaj przekładają się na
statystyki zakupionych towarów lub usług przez klientów. Ale coraz
częściej posiadanie wiedzy, ilu konsumentów zostało obsłużonych
w danym czasie, nie wystarcza.
• Schemat oceny (Pattern Evaluation)
Dowiesz się: Powinieneś wiedzieć: – analiza otrzymanych wyników;
• W jaki sposób analizować dane za pomocą • Podstawy pracy z BIDS; • Prezentacja wiedzy (Knowledge Presenta-
Data Mining; • Podstawowe pojęcia statystyki matematycz- tion) – wykorzystanie dostępnych mecha-
• O dostępnych mechanizmach DM w SQL Se- nej i probabilistyki; nizmów prezentacji (histogramy, wykresy
rver 2008; • Znajomość środowiska SQL Server oraz Ana- kołowe, tabele) do zobrazowania danych.
• Jak wykonać prosty przykład analizy danych. lysis Services.
Szczegółowa architektura systemu opartego
o Knowledge Discovery in Databases została
wartości pośrednie, określające przyna- zaprezentowana na Rysunku 1.
leżność elementu do danego zbioru; Ponieważ proces wydobywania wiedzy
Poziom • Sieci neuronowe – przetwarzanie sygna- w systemach KDD jest niezwykle złożony, w
trudności łów przez sieć sztucznych neuronów, wy- niniejszym artykule pragnę skupić się jedynie
konujących określoną operację na wejściu; na częściach związanych z eksploracją danych
• Metody ewolucyjne – poszukiwanie naj- oraz schematami oceny wyników.

D
obry manager chce wiedzieć więcej lepszego rozwiązania z całej przestrze-
chociażby o profilu swoich nabyw- ni dostępnych rozwiązań; Algorytm naiwny
ców, aby móc zaprojektować skutecz- • Metody statyczne – wykonanie obli- Bayesa i drzewa decyzyjne
ną kampanię reklamową. Dlatego istnieje po- czeń z zakresu statystyki matematycz- Istnieją dwa sposoby analizy danych, które mo-
trzeba formowania tychże danych w użyteczne nej (np. średniej arytmetycznej, odchy- gą być wykorzystane do wyodrębniania mode-
informacje oraz w rezultacie – w wiedzę. lenia standardowego itp.) dla określo- li opisujących ważne informacje: klasyfikacja
Niniejszy artykuł poruszać będzie tematy- nej grupy reprezentacyjnej. (ang. classification) oraz predykcja (ang. predi-
kę wykorzystania zaawansowanych mechani- cation). Klasyfikacja polega na sposobie przy-
zmów Data Mining z Microsoft Business Intel- Większość analityków myli proces eksplo- dzielania atrybutów bazujących na obserwa-
ligence Development Studio oraz SQL Server racji danych z procesem odkrywania wie- cjach do zbioru predefiniowanych klas. Nato-
2008. Zostanie omówiony algorytm naiwny dzy z bazy (ang. Knowledge Discovery in miast predykcja jest mechanizmem przewi-
Bayesa oraz jego użycie w kontekście tworze- Databases (KDD)). Otóż na KDD składa dywania procesu kształtowania się zdarzeń w
nia idealnego profilu klienta firmy Adventu- się wiele czynników, z czego Data Mining przyszłości. Przykładowo, w kontekście bazy
reWorksDW (Data Warehouse). Zaprezentu- wykorzystuje się w piątym kroku, zgodnie AdventureWorksDW można wyodrębnić regu-
ję również technikę klastrowania (clustering) z poniższym schematem: ły klasyfikujące czynniki zakupu ilości rowerów
w procesie formowania obszarów (skupisk)po- (miejsce zamieszkania, stan cywilny, odległość
tencjalnych nabywców oraz ich profili. • Czyszczenie (Data Cleaning) – usuwa- od miejsca pracy), a następnie w odniesieniu
nie duplikatów i niespójności; do tej wiedzy przypisać klientów przedstawia-
Techniki eksploracji danych • Integracja (Data Integration) – łączenie jących się odpowiednimi cechami. W przeci-
Eksploracja danych (Data Mining) jest jed- danych z wielu źródeł; wieństwie do klasyfikacji, predykcja wspomoże
nym z mechanizmów wydobywania wiedzy • Wybór (Data Selection) – pobranie da- określić wpływ czynników wewnętrznych oraz
z bazy danych, wywodząca się głównie z ob- nych, które będą podlegały analizie; zewnętrznych na kształtowanie się trendu w za-
szarów badań nad sztuczną inteligencją. Me- • Transformacja (Data Transformation) kupie danej marki roweru w przyszłości.
chanizmy te można zgrupować w następują- – przekształcanie, wykonywanie skró- Przykładem statycznej klasyfikacji probabili-
cych zakresach: conej agregacji; stycznej jest Naiwny Klasyfikator Bayesa, oparty
• Eksploracja danych (Data Mining) na założeniu o niezależności predykatów. Meto-
• Logika rozmyta – uogólnienie logiki binar- – stosowanie inteligentnych metod da ta jest często wykorzystywana w sztucznej
nej – w obszarze między 0 a 1 znajdują się w celu wyodrębniania wzorców; inteligencji, gdyż wspomaga podejmowanie de-

52 08/2009
SQL Server 2008 Data Mining

cyzji na podstawie złożonej analizy warunkowe-


go prawdopodobieństwa wystąpienia zdarzeń
oraz uczenia maszynowego. Podstawowym wy-
nikiem klasyfikacji jest dodanie przypadku do
������������
jednej z kategorii decyzyjnych, wyliczonego ze
wzoru Twierdzenia Bayesa:

PAiB= PBAiP(Ai)j=1NPBAjP(Aj)

������������������
gdzie A1... An są zdarzeniami niezależnymi,
natomiast PA1…PAn prawdopodobieństwami
wystąpnienia zdarzeń. Algorytm Naiwny Bay- �����������
�����������
esa często jest wykorzystywany do wspomaga- ������
nia konstrukcji drzew decyzyjnych, czyli graficz- ���������
����
nej metody wspomagania procesu podejmowa-
�������������������
nia decyzji. Z punktu widzenia informatyki, De-
cision Tree jest grafem, którego korzeń tworzony
jest przez wybrany atrybut, natomiast poszcze-
��������������
gólne gałęzie stanowią prezentację jego wartości.

Przykład I
– profil idealnego klienta ����������������

Po krótkim wstępie teoretycznym chciałbym


zaprezentować czytelnikowi sposoby wykorzy-
stania algorytmów Data Mining w Business �������������
�������������
Intelligence Development Studio oraz SQL Se-
rver 2008. Jako przykład wybrałem utworzenie
profilu idealnego klienta na podstawie danych
zgromadzonych w bazie AdventureWorksDW.
W pierwszym kroku w Visual Studio (BIDS)na- �������� ��������
leży wybrać nowy projekt Business Intelligence
Projects -> Analysis Services Project. W rezultacie
zostanie utworzona solucja składająca się z na-
stępujących części: Rysunek 1. Architektura systemu Knowledge Discovery in Database

• Data Sources – definicja źródeł danych;


• Data Sources Views – widoki, tabele,
z których będą pobierane dane;
• Cubes – źródła danych pochodzących
z kostek OLAP;
• Dimensions – wymiarowość w kostkach
OLAP;
• Mining Structures – definicje struktur
Data Miningowych operujących na zbio-
rze danych;
• Roles – utworzenie ról i praw dostępu
– zarządzanie poziomem dostępności;
• Assemblies – referencje do komponen-
tów zewnętrznych;
• Miscellaneous – folder na pozostałe pliki,
dokumenty.

Bibliografia
• J. MacLennan, Data Mining with SQL
Server 2008, Wiley Publishing, 2008;
• C.L. Curotto, Implementing Data Mining
Algorithms in Microsoft SQL Server 2008,
WTI Press, 2005;
• B. Larson, Delivering Business Intelli-
gence with Microsoft SQL Server 2008,
McGraw-Hill Company, 2009.
Rysunek 2. Wybór widoku vDMPrep

www.sdjournal.org 53
Warsztaty

W kolejnym kroku należy zdefiniować źródło Views, klikając przycisk Add(Rysunek 2). Po będą składały się na klasyfikację, a jakie na pre-
danych. Aby to uczynić, wystarczy kliknąć pra- utworzeniu widoków przychodzi kolej na wy- dykcję. W niniejszym przykładzie, znając cechy
wym klawiszem myszy na folderze Data Sour- bór mechanizmów, które będą użyte do eksplo- klienta AdventureWorks, będziemy chcieli usta-
ces i wybrać New Data Sources. Po poprawnym racji danych. Podobnie jak w poprzednich kro- lić regułę przyszłego wnioskowania dla zakupu
określeniu serwera bazodanowego oraz samej kach, wystarczy z menu podręcznego na kata- roweru. Zatem tabelę tę należy wypełnić we-
bazy, z której będą pobierane informacje, trze- logu Mining Structures wybrać opcję New Mining dług następujących zaleceń (Rysunek 3):
ba zawęzić obszar eksploracji danych do tabel Structure. Ponieważ analiza danych będzie budo-
bądź widoków. Z menu podręcznego Data So- wana w oparciu o Algorytm Naiwny Bayesa, w • Key: Customer Key;
urces Views należy wybrać opcję New Data Sour- kroku Select the Data Mining Structures wartość • Input: Age, Amount, CalendarYear, Re-
ces Views. Spowoduje to uruchomienie kreato- Data Mining Technique powinna być ustawiona gion, FiscalYear, LineNumber, EnglishPro-
ra, który ułatwi proces selekcji odpowiednich na Microsoft Naive Bayes. Przechodząc do kolej- ductCategoryName;
tabel. Na potrzeby edukacji w bazie Adventure- nych etapów kreatora, chciałbym na chwilę za- • Predictable: Model.
WorksDW został utworzony widok vDMPrep, trzymać się w Specify The Training Data. Na tym
którego wybiera się w sekcji Select Tables and poziomie użytkownik decyduje, jakie wartości Zaznaczając wyłącznie wartość klucza główne-
go oraz predykcji, można skorzystać z opcji au-
tosugestii (przycisk Suggest – Rysunek 3). Spo-
woduje to utworzenie listy zalecanych war-
tości wejściowych dla danej reguły wniosko-
wania. Krok Create Testing Set jest nowością w
SQL Server 2008 i w przeciwieństwie do swo-
jego poprzednika pozwala na określenie mno-
gości zbioru danych przeznaczonych do prób
(testów). Można go ustalić procentowo bądź ja-
ko generalne ograniczenie. Domyślnie 30% da-
nych wykorzystuje się do testów i 70% do wła-
ściwej analizy, bez jednoznacznego typowania
maksymalnej liczby przypadków testowych.
Po zakończeniu pracy kreatora model jest
gotowy do utworzenia oraz wdrożenia w śro-
dowisku SQL Server. Aby to uczynić, należy
wybrać przycisk Create a related Mining Mo-
del, znajdujący się w Menu zakładki Mining
Structure. Algorytm operujący na przygoto-
wanej strukturze to Microsoft Decision Tree,
zatem taki powinien zostać wybrany z li-
sty dostępnych algorytmów. Ostatni krok to
wdrożenie projektu. Podobnie jak w przypad-
ku solucji .NET-owych z BIDS, należy wybrać
opcję Build->Deploy [Nazwa Projektu]. W tym
momencie przygotowana solucja została osa-
dzona w zasobach SQL Server 2008. Jej fi-
zyczną implementację można podglądnąć, łą-
Rysunek 3. Określenie wartości Key, Input, Predictable cząc się z serwerem Analysis Services np. po-
przez Management Studio. Struktura kata-
logów w Object Explorerze powinna się zga-

W Sieci
• Webcast-y prezentujące wprowadze-
nie do tematyki Data Mining w śro-
dowisku Microsoft SQL Server 2008:
http://www.microsoft.com/sql/2008/
datamining/index.html;
• Books Online: Analysis Services oraz
Business Intelligence Development
Studio: http://technet.microsoft.com/
en-us/library/ms173709.aspx;
• Obszerne wprowadzenie do tematyki Da-
ta Mining: http://www-users.cs.umn.edu/
~kumar/dmbook/index.php;
• Wprowadzenie do Business Intelli-
gence Development Studio: http:/
/msdn.microsoft.com/en-us/library/
ms173767.aspx .
Rysunek 4. Sieć zależności

54 08/2009
SQL Server 2008 Data Mining

dzać z przygotowaną w BIDS. Po popraw- zmienia, gdyż prawdopodobieństwo zakupu • wyodrębnienie grup tematycznych;
nym wdrożeniu projektu można przejść do tegoż modelu spada o 5 %. Okazuje się rów- • znalezienie przewodniej cechy wspólnej
zakładki MiningModel Viewer oraz korzystać nież, iż fakt zamieszkiwania Północnej Ame- dla każdej z grup;
z pełnego dobrodziejstwa analizy danych, ja- ryki ma istotny wpływ na wybór WaterBot- • przypisanie wszystkich pozycji do da-
ką dostarcza nam SQL Server 2008. Wybie- tle. Dla mieszkańca i obcokrajowca prawdopo- nych grup.
rając z listy rozwijanej Mining Model -> vDM- dobieństwo zakupu wynosi odpowiednio 17 i
Prep, otrzymamy sieć zależności poszczegól- 14%. Posiadając informacje o zarobkach klien- Zastosowanie algorytmu klastrowania można
nych wartości wejściowych od wyboru mode- ta wynoszących powyżej 2641.376 oraz oby- odnaleźć niemal wszędzie, np. w biologii: kla-
lu (Rysunek 4). Przesuwając suwak po lewej watelstwa amerykańskiego, może sugerować syfikacja roślin i zwierząt ze względu na funk-
stronie, można się zorientować, który z nich sprzedawcy, iż Road-150 będzie na pewno naj- cje, jakie pełnią, bądź w branży ubezpieczenio-
jest najistotniejszy. chętniej wybieranym (prawdopodobieństwo wej: identyfikacja kierowców i ich pojazdów z
Najbardziej interesujące będzie jednak ok. 98%) rowerem. Zatem oddział sklepu w wysoką średnią roszczeń polis ubezpieczenio-
przeglądanie drzewa decyzyjnego. Jego gra- dzielnicy, których profile klientów zbliżone są wych. W naszym przypadku chciałbym doko-
ficzną reprezentację można otrzymać, zmie- do wcześniej wymienionych danych, powinien nać klasyfikacji klientów według cech ustalo-
niając Mining Model z vDMPrep na nazwę zostać niezwłocznie wyposażony w sprzęt od- nych w poprzednim punkcie. Każda z grup po-
modelu, który został utworzony w poprzed- powiednich marek. może odpowiedzieć na pytanie, jaki rower jest
nim punkcie. W rezultacie wygenerowany najchętniej wybierany w danym środowisku.
zostanie graf, zgodnie z Rysunkiem 5. Przykład 2 – Clustering Narzędzia Business Intelligence posiadają
Przykładowa analiza do wygenerowane- W najprostszym tłumaczeniu Clustering pole- bardzo wygodną cechę – mianowicie do raz
go przypadku: Jeżeli klient zarabia mniej niż ga na efektywnym tworzeniu sensownych grup stworzonej struktury Data Miningowej moż-
440.392, szansa, że zakupi rower marki Wa- powiązanych tematycznie. Algorytm tworzenia na utworzyć wiele modeli. Aby tego dokonać,
terBottle to ok 21%. Dla linii < 3 sytuacja się skupisk składa się z następujących kroków: należy ponownie wybrać przycisk Create a re-
lated mining model, tym razem jednak jako Al-
gorithm name wybrać Microsoft Clustering. Po
poprawnym wdrożeniu projektu do środowi-
ska SQL Server można przeglądać analizę, po-
dobnie jak na Rysunku 6.
Analiza przykładowego skupiska: W obsza-
rze 1 (Cluster 1) zamieszkują ludzie wyłącznie
w wieku 39 – 47 lat. Są w głównej mierze Ame-
rykanami bądź Europejczykami. Ich zarobki
nie przekraczają 440.39215047. Rok kalenda-
rzowy w większości przypadków to 2003 oraz
2004. Modele rowerów, jakie kupują, są raczej
niestandardowe (poza katalogiem), ale odnoto-
wano również sprzedarz WaterBottle, Patch kit,
Mountain Tire T.

Podsumowanie
Data Mining obecnie przeżywa swój informa-
tyczny renesans. Przez wiele lat ta dziedzina
wiedzy była postrzegana raczej jako zawiła i nie
Rysunek 5. Drzewo decyzyjne – klient AdventureWorksDW
do końca rozumiana ciekawostka, pozbawio-
na praktycznego zastosowania. W dobie maso-
wych informacji, chaosu danych oraz przetwa-
rzania rozproszonego te, wbrew stereotypom,
relatywnie proste algorytmy znalazły zastoso-
wanie w takich dziedzinach życia publicznego
jak banki, giełdy papierów wartościowych, logi-
styka, sprzedarz – wspomagając symulację ana-
liz finansowych, operacji pieniężnych czy pro-
wadzenia zwyczajnej kampanii reklamowej.

PAWEŁ WILKOSZ
Paweł Wilkosz swoje zainteresowania koncentruje
wokół rozwiązań firmy Microsoft (SQL Server, .NET)
oraz Business Intelligence. Jest aktywnym człon-
kiem Polish SQL Server User Group w Krakowie,
uczestnicząc w spotkaniach jako członek oraz pre-
legent. Na codzień pracuje jako Software Quality
Engineer w polskim oddziale firmy Making Waves.
Rysunek 6. Sieć Microsoft Clustering Kontakt z autorem: pawel.wilkosz@gmail.com.

www.sdjournal.org 55
Narzędzia

Dogadajmy się
O komunikacji dla programistów

Im więcej osób pracuje nad projektem, tym bardziej powodzenie


przedsięwzięcia zależy od efektywnej komunikacji pomiędzy nimi.
Prace nad projektami IT dotyczą programistów, architektów, analityków.
Systemy są udoskonalane przez lata, a zaangażowane osoby zmieniają się.
W artykule przyglądamy się aspektom komunikacji w zespołach.
Podstawowym celem jest przekazywa-
Dowiesz się: Powinieneś wiedzieć: nie informacji w sposób zrozumiały dla od-
• Jak dbać o efektywną komunikację w trak- • Tylko to, co już wiesz. biorcy. Czasy, w których napisanie kodu
cie prac nad projektem; za pomocą jak najmniejszej ilości znaków,
• Jakie konkretne czynniki mogą polepszać wykorzystując przy tym niezliczoną ilość
lub pogarszać komunikację w zespole pro- efektów ubocznych, bezpowrotnie minęły.
jektowym. W chwili obecnej kod źródłowy jest częściej
czytany, niż pisany, a łatwość zrozumienia
i rozbudowywania przez programistę ist-
Kod źródłowy niejącego kodu znacząco wpływa na efek-
Zdecydowanie najwięcej informacji pro- tywność jego pracy. Z potrzeby czytelności
Poziom gramiści przekazują sobie poprzez kod wynikają koncepcje takie jak samodokumen-
trudności źródłowy. To za pomocą języków progra- tujący się kod czy czytaj kod jak książkę.
mowania wyrażają swoje myśli i wcielają
w życie pomysły na zaimplementowanie Dokumenty
nowych funkcjonalności systemu. Podob- Drugim aspektem komunikacji w zespole

P
otoczne rozumienie słowa komu- nie jak w języku naturalnym, funkcja ko- projektowym są różnego rodzaju dokumen-
nikacja nasuwa skojarzenia związa- munikacyjna języka programowania pole- ty formalne lub nieformalne dotyczące pro-
ne z pracą z klientem, z kompeten- ga na przekazaniu odbiorcy komunikatu jektu i opisujące poszczególne rozwiązania.
cjami w dziedzinie zarządzania czy z pracą zgodnego z intencją nadawcy. Odnosząc Niektóre z nich są ściśle określone przez
w grupie. Wszak handlowiec musi się spra- się do tej analogii, zastanówmy się, jakie są procedury, według których działa zespół.
wie komunikować ze swoim klientami, do- składowe efektywnej komunikacji pomię- Inne są inwencją twórczą samych progra-
bry menedżer również powinien dbać o ja- dzy programistami za pomocą języka pro- mistów. Najpopularniejszym narzędziem
kość komunikacji ze swoimi podwładny- gramowania. do przygotowywania dokumentacji pro-
mi. A co z programistami? Czy zdolność
komunikacji również wpływa na jakość ich
pracy? Czy należy na nowo zdefiniować Dbaj o kod źródłowy
pojęcie komunikacja w odniesieniu do pro- • stosuj standard kodowania;
gramistów zespołów programistycznych? • używaj opisowych nazw zmiennych, metod i klas;
• precyzyjnie rozdzielaj odpowiedzialność pomiędzy klasy, metody oraz zmienne;
• korzystaj z wzorców projektowych;
Artefakty • rozważania nad czytelnością kodu źródłowego znajdziesz w książkach K.Becka Imple-
Myśląc o komunikacji, zazwyczaj mamy na mentation Patterns oraz R.C.Martina Clean Code.
myśli komunikację międzyludzką. Tym-
czasem jest to tylko jeden aspekt komuni-
kacji pomiędzy osobami biorącymi udział
w projekcie. Bardzo wiele istotnych infor-
Dbaj o diagramy UML
• na diagramie przekazuj tylko jeden aspekt funkcjonowania systemu, unikaj dużej ilości
macji programiści przekazują sobie po-
nieistotnych szczegółów;
przez kod źródłowy oraz poprzez różnego • duże i złożone diagramy podziel na kilka mniejszych obejmujących węższe obszary dzia-
rodzaju dokumenty formalne i nieformal- łania aplikacji;
ne. Zapożyczając terminologię z metody- • najistotniejsze elementy umieszczaj w centrum diagramu;
ki RUP, ten sposób komunikacji nazwiemy • jeśli posługujesz się diagramami, to dbaj, aby zawsze odzwierciedlały aktualny stan kodu;
komunikacją poprzez artefakty. • utrzymuj porządek w swoich diagramach.

56 08/2009
Dogadajmy się

jektowej są diagramy UML. W założeniu nym. Oni cały czas drążyli szczegóły, jakby w czonym programistą i wiedział, że trzeba
ten Ujednolicony Język Modelowania (ang. ogóle nie interesowało ich, jak ten system ma jednoznacznie określić wymagania klien-
Unified Modeling Language) ma dostarczać działać. Zadawali mi mnóstwo pytań, na któ- ta, aby dostarczyć mu taki system, jakiego
medium komunikacji pomiędzy analityka- re nie potrafiłem odpowiedzieć. Przecież nie rzeczywiście chce. Ponieważ Jacek nie po-
mi, projektantami, architektami, programi- wiem, jak dokładnie to narzędzie ma wyglą- trafił odpowiedzieć na konkretne pytania,
stami, testerami. Obowiązująca specyfika- dać, bo jeszcze takiego nie ma na świecie. Po programista uznał, że użytkownik nie prze-
cja UML definiuje kilkanaście różnych dia- spotkaniu dostałem mailem podsumowanie myślał swoich oczekiwań.
gramów. Problem w tym, że choć sam język i zbladłem. Wydawało mi się, że rozmawiali- Programowanie to wyjątkowo złożo-
jest precyzyjnie określony, to pomysłów na śmy i ustaliliśmy zupełnie coś innego. ne zajęcie, wymaga dużego skupienia, do-
jego używanie w trakcie wytwarzania opro- kładności i panowania nad ogromną ilo-
gramowania jest bardzo wiele. Innymi sło- Z perspektywy programisty ścią szczegółów. Błędy mogą drogo kosz-
wy użytkownik UML staje przed dylemata- Tomek (l.27), Senior Java Developer: Wczo- tować. Dlatego, jako programiści, wypra-
mi: których diagramów powinien używać, raj zbieraliśmy wymagania do wersji 1.3. cowaliśmy sobie umiejętności, które po-
kiedy ich używać, czy istnieje minimalny Właściwie to nie wiem, po co odbyło się to spo- magają nam efektywnie wykonywać pracę.
podzbiór UML wystarczający dla danego tkanie. Jacek kompletnie nie miał pojęcia, cze- Wśród najbardziej cennych można wymie-
projektu, jak efektywnie korzystać z UML? go chce. Pytaliśmy, jak mają działać poszcze- nić umiejętności:
Postawione pytania sprowadzają się do za- gólne algorytmy, w jaki sposób wyobraża so-
sadniczego problemu: jak wygląda opty- bie prace z systemem, i nie mogliśmy nic z niego • skupienia się na szczegółach;
malny proces pracy z UML w moim projek- wydusić. Przytaczał mnóstwo ogólnych przy- • dekomponowania problemu na ele-
cie? W tym temacie powstało bardzo wiele kładów, ale nic konkretnego nie powiedział. mentarne składowe;
różnych pomysłów, najczęściej zdefiniowa- Gdy próbowaliśmy podsumować i sprecyzo- • odnajdywania różnic i podobieństw,
nych poprzez metodyki wytwarzania opro- wać jego oczekiwania, to odpowiadał „tak, co pozwala na szybkie lokalizowanie
gramowania lub sugerowane poprzez na- ale...”. Żeby dodać te funkcjonalności, potrze- błędów;
rzędzia wspomagające modelowanie. Tym- bujemy dobrze określonych reguł ich działa- • analizy i syntezy, dzięki którym pro-
czasem w wielu przypadkach programi- nia, a nie garści przypadków szczególnych. jektujemy algorytmy.
ści używają diagramów w razie potrzeby w I w dodatku on ciągle nazywa nas informaty-
sposób, który podpowiada im intuicja. Do- kami, a przecież programista i informatyk to Umiejętności te doskonale się sprawdzają
póki powstałe w ten sposób modele wyko- dwie kompletnie różne rzeczy. w pracy nad projektem, ale w innym śro-
rzystywane są jedynie przez programistów dowisku, np. podczas rozmowy z poten-
(w obrębie jednego zespołu), spełniają one Na zewnątrz zespołu cjalnym użytkownikiem, Product Manage-
swoją funkcję komunikacyjną. W momen- Jacek i Tomek mieli wspólny cel – dodać rem czy innym programistą, potrzeba od-
cie, gdy w cykl pracy wchodzą analitycy, ar- nowe funkcjonalności do narzędzia wyko- miennych umiejętności. Przede wszyst-
chitekci lub podwykonawcy czy partnerzy rzystywanego w ich firmie. To, czy uda im kim słuchania i rozumienia potrzeb. Du-
biznesowi, sprawy zaczynają się kompliko- się go osiągnąć, zależy przede wszystkim od ży krok w stronę rozwoju kompetencji
wać. Wtedy brak dobrze zdefiniowanego tego, na ile będą potrafili efektywnie ze so- komunikacyjnych poczyniły metodyki z
procesu z udziałem UML wprowadza bar- bą współpracować. nurtu Agile, postulując w swym manife-
dzo wiele komplikacji, a same diagramy za- Jacek wiedział, jaki efekt chce uzyskać. ście ludzie i interakcje ponad procesy i na-
miast ułatwiać komunikację, utrudniają ją. Koncentrował się na ostatecznej wizji sys- rzędzia oraz współpraca z klientem ponad
temu. Nie zastanawiał się nad tym, jak negocjowanie kontraktów. Przejawem tych
Tropem pewnego stereotypu stworzyć system, lecz co on ma robić i ja- paradygmatów jest praktyka planning ga-
Jeden z naszych przyjaciół powiedział kie- kie funkcjonalności dostarczać. W jego opi- me z metodyki eXtreme Programming.
dyś, że programista kojarzy mu się z kimś nii szczegółami technicznymi powinni za- Mimo tego, potrzeba rozwoju umiejętno-
mało komunikatywnym, kto cały czas spę- jąć się programiści. ści komunikacyjnych wciąż bardzo wol-
dza przed komputerem i wstaje sprzed nie- Tomek chciał napisać aplikację, o któ- no przedziera się do świadomości progra-
go tylko wtedy, gdy mu się podkoszulek rej mówił Jacek. W dodatku był doświad- mistów.
złuszczy... Nie było to zbyt przyjemne po-
równanie, ale oddawało część tego, w ja- Tabela 1. Podobieństwa pomiędzy językiem naturalnym a językiem programowania w odniesieniu do
ki sposób nieprogramiści nas postrzega- ich funkcji komunikacyjnej
ją. Przeanalizujmy poniższy przykład, aby Język naturalny Język programowania
zbadać źródło tego stereotypu. Wyrazy, zdania, wypowiedzi pisane Słowa kluczowe, procedury, klasy, metody,
zmienne, kod źródłowy
Z perspektywy nieprogramisty
Styl języka Standard kodowania
Jacek (l.31), psycholog: Dziwnie się czuję,
gdy wchodzę do pokoju informatyków. Nikt Frazeologia Wzorce projektowe
mnie tam nie zauważa. Wszyscy siedzą wpa- Jednoznaczność komunikatu, unikanie ge- Dbanie o jednoznaczne wydzielenie odpowie-
trzeni w monitory i coś tam piszą. Gdy zapy- neralizacji, koncentrowanie się na faktach dzialności dla zmiennych, metod, klas, pakietów
i modułów
tałem, kiedy CRM będzie działał, powiedzieli
mi: „w logach jest, że dżara nie można zdeplo-
jować”. Jakby to cokolwiek dla mnie znaczy- MICHAŁ BARTYZEL, MARIUSZ SIERACZKIEWICZ
ło...nowomowa jakaś. Ostatnio mieliśmy spo- Trenerzy i konsultanci w firmie BNS IT. Badają i rozwijają metody psychologii programowania, poma-
tkanie na temat nowej wersji naszego narzę- gające programistom lepiej wykonywać ich pracę. Na co dzień Autorzy zajmują się zwiększaniem efek-
dzia. Chciałem wytłumaczyć, jak to ma dzia- tywności programistów poprzez szkolenia, warsztaty oraz coaching i trening.
łać, nawet trochę rysowałem, żeby być dokład- Kontakt z autorami: m.bartyzel@bnsit.pl, m.sieraczkiewicz@bnsit.pl

www.sdjournal.org 57
Narzędzia

Analiza biznesowa
Wymagania – pozyskiwanie, dokumentowanie,
komunikowanie, weryfikacja.
Etap analizy biznesowej jest jednym z kluczowych momentów
w projekcie informatycznym. Jakość analizy i uzyskanych za jej
pomocą produktów w znacznym stopniu determinuje jakość
kolejnych etapów realizacji systemu. Niniejszy artykuł przedstawia
podstawowe elementy dobrego procesu analizy.
ści, by mogły one zostać poprawnie za-
Dowiesz się: Powinieneś wiedzieć: implementowane przez programistów.
• Jakie czynności wchodzą w skład analizy • Średnio zaawansowana wiedza ogólna z za- • Komunikowanie wymagań, czyli udo-
biznesowej; kresu analizy biznesowej i modelowania wy- stępniania dokumentacji analitycznej
• Jakie czynniki wpływają na jakość produk- magań; udziałowcom projektu. Obejmuje rów-
tów analizy. • Podstawowa wiedza dotycząca prowadze- nież informowanie o zmianach w zakre-
nia projektów informatycznych. sie wymagań, treści wymagań etc.
• Ocena i walidacja rozwiązania polega-
jąca na ocenie proponowanego rozwią-
ności oraz innych biznesowych aspektów zania oraz dostarczaniu wsparcia anali-
dotyczących systemu informatycznego. tycznego implementacji oraz testowania.
Poziom Zgodnie z wytycznymi BABOK w skład
trudności analizy biznesowej wchodzą następujące Analiza przedsiębiorstwa
elementy (Rysunek 1): Analiza przedsiębiorstwa – pierwszy krok w
poprawnej analizie biznesowej – jest elemen-
• Analiza przedsiębiorstwa, która polega tem dość często pomijanym – jako że pozor-

Z
adaniem analityka biznesowego jest, na identyfikacji i zrozumieniu potrzeb nie nie wnosi nic do procesu i nie daje wy-
najkrócej mówiąc, pozyskanie wyma- danego biznesu (branży). Jest to etap miernych produktów. Tymczasem w wielu
gań dotyczących oczekiwań klienta poprzedzający właściwe pozyskiwanie przypadkach poprawna identyfikacja wyma-
wobec planowanego systemu oraz takie zamo- wymagań, umożliwia zapoznanie się z gań klienta wymaga analizy procesów zacho-
delowanie i udokumentowanie owych wyma- celami oraz charakterystyką danej or- dzących w jego organizacji – czyli tak zwane-
gań, by umożliwiały sprawną i poprawną imple- ganizacji celem lepszego zorganizowa- go kontekstu biznesowego. Należy rozważyć:
mentację aplikacji. Analityk jest ponadto odpo- nia procesu analizy biznesowej.
wiedzialny za komunikowanie wymagań człon- • Pozyskiwanie wymagań – czyli proces • Czym zajmuje się organizacja?
kom zespołu i udzielanie wsparcia merytorycz- identyfikacji oczekiwań klienta, zarów- • Komu i w jakim celu ma służyć system?
nego wszędzie tam, gdzie jest ono potrzebne no tych bezpośrednio wyrażonych, jak • Jaki jest cel wdrożenia projektowane-
– podczas tworzenia kodu czy testowania. i wymagań ukrytych, czyli niekoniecz- go systemu? Co aplikacja ma robić, jakie
Nie da się przecenić roli analizy bizneso- nie związanych z bezpośrednim celem i procesy przedsiębiorstwa wspierać etc.
wej – szczególnie w przypadku, gdy two- przeznaczeniem aplikacji, a mimo to ko- • Jakie procesy w przedsiębiorstwie ma
rzone jest nowe rozwiązanie (całkowicie no- niecznych dla zapewnienia prawidłowe- obejmować system i z jakimi procesami
wy system). Samo spisanie wymagań nie wy- go funkcjonowania systemu. W tej czę- będzie się komunikował?
starcza – owszem, daje wgląd w przybliżony ści zostaną przedstawione sposoby oraz • Czy system będzie komunikował się z in-
zakres oczekiwań klienta i funkcje, jakie ma techniki pozyskiwania wymagań od nymi systemami wewnątrz i na zewnątrz
dostarczać dany system, ale nie obejmuje za- klienta i innych udziałowców projektu. organizacji klienta? Jeśli tak, to w jakim ce-
leżności pomiędzy poszczególnymi funkcjo- • Planowanie i zarządzanie wymagania- lu? Jakie informacje będą wymieniane?
nalnościami, modułami systemu, nie okre- mi obejmuje planowanie procesu do- • Elementy specyfiki branży – wymagania
śla możliwych interakcji z użytkownikiem, kumentowania wymagań wraz z okre- prawne i inne przepisy dotyczące obsza-
ewentualnych wyjątków etc. ślaniem priorytetów dla implementa- ru, w którym działa organizacja klienta.
cji poszczególnych wymagań oraz me-
Czym jest analiza biznesowa? chanizmami kontroli zmian. Informacje te pozwolą identyfikować wyma-
Najogólniej rzecz ujmując, analiza biznesowa • Dokumentowanie wymagań – opisuje, gania dotyczące kontekstu systemu i umożli-
jest procesem, którego celem jest zidentyfiko- w jaki sposób specyfikować wymaga- wią zaprojektowanie wstępnego modelu biz-
wanie potrzeb klienta w zakresie funkcjonal- nia i na jakim poziomie szczegółowo- nesowego na wysokim poziomie – jako defini-

58 08/2009
Analiza biznesowa

cje celów i potrzeb organizacji klienta, i opisu- nie i spójnie we wszystkich składnikach zostałych czynności projektowych. Prace po-
ją, dlaczego został podjęty projekt i co ma osią- dokumentacji dotyczącej wymagań. winny zachodzić równolegle do prac projek-
gnąć oraz jakie metryki będą służyć do pomia- towania wstępnej architektury oraz przygo-
ru postępu oraz powodzenia całości projektu. Identyfikacja udziałowców projektu jest kolejną towywania założeń do planu zapewnienia ja-
W ramach analizy przedsiębiorstwa wy- ważną czynnością – wszystkie osoby zaangażo- kości. Analityk powinien udostępniać wy-
konywane jest również planowanie strategicz- wane w pozyskiwanie, tworzenie lub innego ro- niki swoich prac na bieżąco innym człon-
ne. Podczas tego procesu rozważane są róż- dzaju przetwarzanie wymagań powinny zostać kom zespołu i zbierać od nich ewentual-
ne czynniki, okoliczności i potrzeby bizne- zidentyfikowane, a ich role oraz odpowiedzial- ne uwagi i komentarze – dzięki temu czę-
sowe – bieżące strategie związane z trendami ności określone i udokumentowane. Podział ról sto można znaleźć błąd w specyfikacji wy-
rynkowymi, identyfikacja aktualnych kwestii odbywa się na podstawie planu projektu oraz magań na wczesnym etapie i szybko wdro-
biznesowych czy czynników przesądzających innych dokumentów zarządczych dostępnych żyć poprawki.
o konkurencyjności, dochodowości oraz efek- dla danego projektu. Znając udziałowców, ana-
tywności organizacji. lityk może lepiej zrozumieć, komu i w jakim ce- Pozyskiwanie wymagań
Analiza charakterystyk strategicznych da- lu ma służyć produkt – np. wiedząc, że użyt- Kolejny element analizy biznesowej – w wie-
nego klienta umożliwia zrozumienie obsza- kownikami końcowymi są pracownicy oddzia- lu przypadkach najbardziej kluczowy i kry-
ru jego działalności, celów i dążeń – dzięki te- łów bankowych (czyli kasjerzy), może przeana- tyczny dla powodzenia projektu – to proces
mu projektowanie nowego systemu będzie ła- lizować czynności realizowane w środowisku pozyskiwania wymagań. Wymagania stano-
twiejsze. Analityk będzie też w stanie zapro- docelowym – czyli placówce banku – i zapro- wią podstawę do opracowania i stworzenia
ponować taką koncepcję rozwiązania, która jektować aplikację w taki sposób, by jak najle- rozwiązania IT zamówionego przez organi-
jak najlepiej dopasuje się do obecnej i plano- piej wspierała ich pracę i codzienne zadania. zację klienta, dlatego też muszą być komplet-
wanej strategii przedsiębiorstwa oraz istnieją- Planowanie i zarządzanie wymaganiami ne, jasne, jednoznaczne, poprawne oraz spój-
cej infrastruktury. nie może odbywać się w oderwaniu od po- ne. Co to oznacza w praktyce?

Planowanie
i zarządzanie wymaganiami
Kolejny etap analizy – planowanie i zarzą- ���������������������������������������������
dzanie wymaganiami – umożliwia określe-
nie zasobów oraz zadań związanych z czyn-
nościami planowania i zarządzania wymaga- ���������
������������������������ �������������������� �����������������
niami. Zadaniem analityka jest określenie, ja- ��������������
�����������
�������
kie czynności będą wykonywane w związku
z gromadzeniem, analizą, zarządzaniem wy-
maganiami oraz w jaki sposób będą one re-
�����������������������������������
alizowane. Analityk dostosowuje bieżące po-
trzeby projektowe do standardów swojej or-
ganizacji oraz przedsiębiorstwa klienta – pro-
ces planowania i zarządzania powinien być Rysunek 1. Czynności analizy biznesowej
dopasowany do procesów, procedur i zwycza-
jów już obowiązujących w danej organizacji.
Do zadań analityka należy opracowanie Analiza przedsiębiorstwa
metodyki planowania i zarządzania wymaga- Analiza przedsiębiorstwa obejmuje grupę czynności podejmowanych na początku projektu
niami, która w możliwie największym stop- polegających na określeniu danego biznesu w celu określenia kontekstu dla wymagań pro-
niu gwarantuje, iż: jektowych, projektu rozwiązania określonej inicjatywy oraz ustalenia planów długo- i krót-
koterminowych. W większych projektach lub w przypadku organizacji klienta charaktery-
• Zidentyfikowano wszystkich udziałow- zujących się dużym stopniem złożoności procesów zachodzących wewnątrz niej, czynności
związane z analizą przedsiębiorstwa stanowią oddzielny projekt.
ców niezbędnych w procesie gromadze-
nia wymagań oraz zostały im przydzie-
lone odpowiednie role, odpowiedzialno-
ści i zadania. Strategia to nie wszystko
• Zadania związane z gromadzeniem Oprócz ustalania strategii, czyli bieżącego i przyszłego kursu organizacji, na etapie analizy
wymagań są wykonywane efektywnie przedsiębiorstwa wykonywane są również inne czynności. Obejmują one:
i zgodnie z planem oraz skoordynowa-
• tworzenie i utrzymywanie architektury biznesowej (wprowadzanie zmian, aktualizacji,
ne z innymi pracami wykonywanymi
uszczegółowień);
w ramach projektu. • opracowanie studium wykonalności w celu określenia optymalnego rozwiązania bizne-
• Zespół odpowiedzialny za planowanie sowego;
i zarządzanie wymaganiami zna swo- • definiowanie zakresu projektu;
je role i rozumie zadania, za które jest • przygotowanie przypadków biznesowych;
odpowiedzialny. Każdy członek zespo- • wykonanie wstępnej analizy ryzyka;
• wsparcie podejmowania decyzji.
łu zna przydzielone sobie zadania i po-
rządek ich realizacji. Osobą odpowiedzialną za realizację tych zadań ze strony dostawcy jest analityk biznesowy
• Analitycy są w stanie monitorować i re- (przy czym niektóre zadania wykonywane są we współpracy z Project managerem, np. definio-
agować na wszelkiego typu zmiany w wy- wanie zakresu projektu).
maganiach. Zmiany wdrażane są popraw-

www.sdjournal.org 59
Narzędzia

• Kompletność – zidentyfikowane wymaga- noznaczności oznacza, iż treść musi być • Spójność – wymagania nie powinny się na-
nia pokrywają całość funkcjonalności pro- skonstruowana w taki sposób, by odbior- wzajem wykluczać ani traktować podob-
jektowanej aplikacji. Proces biznesowy jest ca interpretował ją zgodnie z zamierze- nych problemów w odmienny sposób. Je-
udokumentowany w szczegółach, wyjątki niem analityka – nie ma tu miejsca na śli przykładowo wymaganie klienta mówi,
są określone, struktura danych opisana na domyślanie się, i rozpatrywanie alterna- iż podgląd wydruku powinien być genero-
wystarczająco niskim poziomie. tyw, które mogą wynikać z mało precy- wany w postaci dokumentu PDF w forma-
• Przejrzystość – sposób prezentacji treści i zyjnego tekstu wymagania. cie A4, analityk nie może opisywać funk-
założeń wymagań jest prosty i zrozumiały • Poprawność – wymagania w żadnym cjonalności wydruku w innych wymaga-
dla odbiorców. Forma prezentacji umożli- wypadku nie powinny być błędne, czyli niach inaczej – czyli np. jako generowanie
wia szybkie zapoznanie się z treścią wyma- opisywać systemu niezgodnie z pożąda- edytowalnego dokumentu Word (chyba że
gania i określenie obszaru / funkcjonalno- nym stanem rzeczy. Błędy rzeczowe mo- rzeczywiście taka jest potrzeba klienta).
ści, którego dane wymaganie dotyczy. gą wynikać zarówno z pośpiechu w do-
• Jednoznaczność – opis wymagania jed- kumentacji wymagań, niedopatrzenia, Analityk biznesowy powinien zapewnić ta-
noznacznie określa sposób funkcjono- czy zwykłej pomyłki, jak i braku wiedzy kie środki i zastosować takie techniki, by za-
wania, rozwiązanie problemu, technikę, dziedzinowej czy nieznajomości przepi- pewnić jak największą efektywność procesu
którą należy zastosować etc. Wymóg jed- sów i innych związanych rozporządzeń. pozyskiwania wymagań oraz wysoką jakość
uzyskanych produktów. Pozyskiwanie wy-
magań nie jest zamkniętym, skończonym
Planowanie i zarządzanie etapem odizolowanym od pozostałych faz
Czynności planowania i zarządzania obejmują:
projektu – wymagania określone na etapie
• określenie kluczowych ról; początkowym (podczas analizy) mogą oka-
• wybór czynności i zadań oraz ich organizację (określenie priorytetów, kolejności, powią- zać się niekompletne na etapie projektowa-
zań i zależności); nia szczegółowego (dokumentowania specy-
• zarządzanie zakresem wymagań; fikacji funkcjonalnej) lub implementacji.
• komunikowanie bieżącego stanu procesu gromadzenia wymagań.
W procesie pozyskiwania wymagań należy
rozpocząć od zidentyfikowania wymagań głów-
nych, a następnie je stopniowo uszczegóławiać.
Udziałowcy projektu Podejście takie umożliwia stosunkowo szybkie
opracowanie modelu procesów biznesowych w
• Sponsor – odpowiedzialny za projekt na poziomie zarządczym: pozyskiwanie funduszy, po- aplikacji, który daje podgląd na ogólną budowę
dejmowanie decyzji go, no go, wspierający zarządzanie zasobami poprzez zapewnienie od- i funkcjonalność projektowanego systemu. Ist-
powiedniej liczby zasobów.
nieje również podejście odwrotne – od szcze-
• Analityk biznesowy – odpowiedzialny za pozyskiwanie, ewentualnie negocjowanie, analizę,
dokumentowanie i przeglądy kontrolne wymagań oraz za prezentowanie wymagań pozosta- gółu do ogółu – polegające na zidentyfikowa-
łym udziałowcom w celu uzyskania ich opinii i akceptacji. niu szczegółowych, elementarnych wymagań
• Project manager – zarządza projektem, dbając m.in. o to, by czynności związane z wymaga- w pierwszej kolejności, a następnie grupowanie
niami były wykonywane planowo, w przewidzianym budżecie oraz zgodnie z określonym za- ich w wymagania na wysokim poziomie. Ta me-
kresem. PM jest odpowiedzialny za upewnienie się, iż wymagania są zaakceptowane przez
toda nie sprawdzi się jednak w przypadku, gdy
wszystkich uprawnionych udziałowców przed przejściem do kolejnych prac projektowych.
• Deweloper – rola obejmująca technicznych członków zespołu, zarówno programistów, jak i klient ma wizję ogólnej funkcjonalności syste-
kierowników technicznych odpowiedzialnych za stworzenie projektu technicznego aplikacji. mu, bez szczegółowych wymagań dotyczących
Programista implementuje wymagania (tworzy kod), w razie potrzeby zasięgając konsultacji poszczególnych elementów (takich jak ekrany
analityka. aplikacji, reguły związane z walidacją danych,
• Specjalista QA – odpowiedzialny za opracowanie, wdrożenie i nadzór standardów dotyczą- dokładne algorytmy obliczeniowe).
cych zapewnienia jakości na różnych etapach projektu.
Skąd natomiast brać wymagania? Klient
• Architekt – opracowuje projekt wysokiego poziomu oraz opisuje podejście do budowania ar-
chitektury aplikacji. Architekt decyduje o tym, jaka architektura (projekt techniczny) najlepiej nie zawsze dostarcza kompletny katalog wy-
pasuje do danego projektu oraz spełni wymagania. magań, na podstawie którego można łatwo zi-
• Analityk bazy danych – odpowiedzialny za techniczne aspekty projektowania, tworzenia i za- dentyfikować główne wymagania i przejść do
rządzania bazą danych projektu. ich uszczegóławiania i precyzowania. Pozy-
• Analityk infrastruktury – projektuje całą infrastrukturę i środowisko sprzętowe i softwarowe
skiwanie wymagań odbywa się na podstawie:
wymagane dla spełnienia wymagań dotyczących tworzenia oraz funkcjonowania systemu.
• Analityk danych – odpowiedzialny za ocenę wymagań dotyczących danych i informacji w da-
nym systemie. Określa dane, które są wykorzystywane wielokrotnie, rozwiązuje problemy • Założeń oferty handlowej – główne funk-
modelowania danych. cje systemu powinny zostać wyspecyfi-
• Właściciel (Solution owner) – odpowiedzialny za zdefiniowanie i akceptację zakresu projektu i kowane w ofercie handlowej lub zapisach
upewnienie się, iż pasuje on do strategii biznesowej. Akceptuje zmiany w zakresie projektu umowy. Funkcje te są poddawane analizie,
oraz określa kryteria powodzenia projektu i sposoby ich pomiaru.
uszczegóławiane i rozbijane na poszczegól-
• Użytkownik końcowy – ogólna nazwa grupy osób, które będą używać wyprodukowanej apli-
kacji. Użytkownik końcowy może być zarówno osobą z wewnątrz organizacji klienta (pracow- ne funkcjonalności czy przypadki użycia.
nik), jak i spoza organizacji (klient bezpośredni). • Warsztatów analitycznych, które przepro-
• Ekspert dziedzinowy – osoba dostarczająca ekspertyz w określonej dziedzinie biznesu. Ekspert wadzane są przy udziale przedstawicieli
wspiera definiowanie oraz akceptację wymagań funkcjonalnych projektu, zwykle współpra- biznesu klienta. W trakcie warsztatów do-
cuje z analitykami biznesowymi w procesie identyfikacji i zarządzania wymaganiami. Eksper-
stawca przedstawia propozycje rozwiązań
ci często pochodzą z organizacji klienta lub są wynajmowani z firm konsultingowych – muszą
to być osoby o szerokiej i dogłębnej wiedzy w danej dziedzinie. W mniejszych projektach, lub – dotyczących bądź to określonych funk-
jeśli nie ma takiej konieczności (tj. wymagania i obszar dziedzinowy są jasne), ekspert dziedzi- cjonalności czy ich aspektów, bądź syste-
nowy nie musi pojawiać się w zespole projektowym. mu jako całości – klient natomiast je we-
ryfikuje i / lub uszczegóławia.

60 08/2009
Analiza biznesowa

• Informacji udzielonych przez uprawnio- dać pewne umiejętności – jako że nie każdy wanie wymagań polega na określeniu zależ-
nych do tego pracowników klienta w for- ma predyspozycje do pracy w takiej roli. Umie- ności pomiędzy wymaganiami, zaprojekto-
mie pisemnej lub potwierdzonych drogą jętności te to między innymi: zdolność zdoby- waniu struktury funkcjonalnej systemu oraz
pisemną. wania i oceny informacji pod kątem ich przy- opisaniu wymagań w formie ustrukturyzo-
• Analizy istniejących systemów klienta i datności w określonym aspekcie oraz obserwa- wanej, określonej zasadami tworzenia specy-
identyfikacji działających już w nich me- cji zdarzeń i faktów i wyciągania wniosków z fikacji i umożliwiającej efektywne wykorzy-
chanizmów i rozwiązań. Metoda ta jest informacji, myślenie abstrakcyjne i twórcze, stanie w procesie projektowania techniczne-
szczególnie korzystna i wydajna w przy- znajdowanie alternatyw dla rozwiązania dane- go i implementacji systemu. Celem dokumen-
padku, gdy klient pragnie, by wszystkie je- go problemu. Prócz wymienionych cech anali- tacji wymagań jest określenie i opisanie właści-
go systemy działały na podobnej zasadzie tyk musi być osobą, która potrafi rozwiązywać wości biznesowych rozwiązania w taki sposób,
(co oczywiście nie oznacza, iż mają być ta- konflikty i negocjować oraz posiadać doskona- by wszyscy członkowie zespołu wiedzieli, jak je
kie same) – np. stosowały te same mecha- łe umiejętności słuchania i komunikacji wer- zaprojektować i zaimplementować.
nizmy zapisywania, przeglądania informa- balnej. Człowiek posiadający szeroką wiedzę Jak już wspominano wcześniej, wymagania
cji czy prezentacji danych. Zdarzają się sy- na temat analizy biznesowej i modelowania dostarczone w formie listy czy katalogu wy-
tuacje, w których klient wręcz wymaga, by raczej nie nadaje się na analityka, jeżeli nie po- magań nie są wystarczającą podstawą do sfi-
nowy system pasował wizualnie i funkcjo- trafi dyskutować, słuchać, co mają mu do prze- nalizowania procesu analizy, a dalej do imple-
nalnie do już istniejących. W tej sytuacji kazania inni ludzie lub ma problemy z jasnym mentacji; nie mogą być również jedynym źró-
najlepszą metodą jest analiza dotychczaso- wyrażeniem swoich myśli. dłem dokumentacji testowej. Wymagania na-
wych rozwiązań, identyfikacja wspólnych Tabela 1 prezentuje kilka najczęściej stoso- leży opisać na odpowiednim poziomie szcze-
mechanizmów, które da się przenieść do wanych technik pozyskiwania wymagań – wy- gółowości tak, by dokumentacja analitycz-
projektowanego systemu i udokumento- bór odpowiedniej jest uzależniony od potrzeb i na dawała obraz całej funkcjonalności syste-
wanie ich w specyfikacji. możliwości danego projektu, jak również od do- mu oraz przekazywała idee procesów bizneso-
świadczenia i umiejętności analityka. wych, jakie będą zachodzić w danej aplikacji.
W pozyskiwaniu wymagań (i oddzielaniu wy- Jednym z podejść do dokumentowania syste-
magań od zbędnych informacji, które nie wno- Analiza mu jest podejście zstępujące, czyli rozpoczęcie
szą żadnej wartości do procesu analizy), anali- i dokumentowanie wymagań prac z modelem biznesowym na wysokim po-
tyk stosuje różne techniki – wywiady, spotka- Wymagania pozyskane należy poddać anali- ziomie (np. diagram BPMN), który w następ-
nia wyjaśniające, warsztaty etc (Tabela 1). Jed- zie i udokumentować w odpowiedniej, usta- nej kolejności jest rozbijany na poszczególne
nak oprócz techniki analityk powinien posia- lonej wcześniej formie. Analiza i dokumento- składniki i stopniowo uszczegóławiany..

Tabela 1. Techniki pozyskiwania wymagań


Technika Opis
Burza mózgów Technika polegająca na wspólnym tworzeniu i analizowaniu pomysłów podczas grupowego spotkania. Uczestnicy
dostarczają pomysłów na rozwiązanie postawionego problemu, pomysły owe spisuje się, analizuje, po czym wybie-
ra rozwiązanie akceptowane przez ogół.
Analiza dokumentacji Polega na przeglądaniu istniejącej w organizacji dokumentacji celem identyfikacji wymagań obecnych i potencjal-
nych. Technika stosowana w celu określenia istniejących zasad biznesowych, elementów i atrybutów, które należy
zawrzeć w nowym systemie lub które będą musiały być zmienione z powodu wdrażania nowego systemu. Metoda
może być również wykorzystywana w przypadku, gdy eksperci danej dziedziny biznesowej nie są dostępni dla kon-
sultacji analitycznych i analityk musi samodzielnie poznawać określone zagadnienie.
Analiza interfejsów Analiza zewnętrznych interfejsów – zarówno interfejsu użytkownika, jak i interfejsów do / z zewnętrznych systemów lub
urządzeń. Analiza taka pomaga określić granice systemu oraz stwierdzić, jakie dane i jakie funkcje przepływają pomiędzy
systemami. Analiza interfejsów powinna dać w wyniku dokument słownika danych, który gromadzi wszystkie dane wymie-
niane pomiędzy systemami w sposób spójny i umożliwiający ich kontrolowanie oraz utrzymywanie w aktualnym stanie.
Wywiad Technika polegająca na zadawaniu pytań dotyczących określonego obszaru działania danej osoby, procesu, proble-
mu. Wywiad przeprowadzany jest przez analityka, zaś osobą pytaną jest ekspert dziedzinowy lub użytkownik koń-
cowy projektowanego rozwiązania. Wywiad może być zarówno ustrukturyzowany – kiedy analityk posiada przygo-
towany wcześniej zestaw pytań; lub nie ustrukturyzowany – polegający na dyskusji dotyczącej oczekiwań wobec
projektowanego rozwiązania. Ustalenia i wnioski z wywiadu powinny być udokumentowane.
Obserwacja Technika ta polega na wyciąganiu wniosków na podstawie obserwacji pracy ludzi wykonujących swoje zadania. Umożli-
wia dokładne poznanie przebiegu określonego procesu, procedur, czynności, produktów oraz nieformalnych zwyczajów,
zwykle nie umieszczanych w dokumentacji przedsiębiorstwa a wpływających na przebieg pracy. Obserwacja może być
pasywna - kiedy analityk jedynie obserwuje osobę wykonującą swoja pracę, bez zadawania dodatkowych pytań; lub ak-
tywna – polegająca na obserwacji połączonej z dyskusją z pracownikiem i omawianiem bieżących czynności.
Prototypowanie Prototypowanie – zastosowane jako technika pozyskiwania wymagań – umożliwia wykrycie wymagań dotyczących UI
systemu jeszcze przed oficjalnym rozpoczęciem prac implementacyjnych. Prototypy aplikacji (tworzone np. jako makieta
HTML) pozwalają na wizualizację wstępnego projektu analityka i weryfikację rozwiązania przez klienta. Klient może spraw-
dzić, czy bieżący projekt spełnia jego oczekiwania, dodać nowe pomysły i rozwiązania itp. Zwykle w trakcie pracy z proto-
typem zostają odkryte nowe wymagania (np. dotyczące użyteczności, ergonomii), które zostają uszczegółowione bądź w
kolejnej wersji prototypu (prototypowanie ewolucyjne), bądź włączone bezpośrednio do specyfikacji analitycznej.
Warsztaty Warsztaty wymagań stanowią ustrukturyzowaną metodę pozyskiwania wymagań. warsztaty służą do określania za-
kresu, identyfikacji, szczegółowego definiowania i ustalania priorytetów wymagań projektowanego systemu. Do-
brze zorganizowany warsztat to jedna z najlepszych technik określania wymagań – ponieważ oznacza dobrą komu-
nikację i porozumienie pomiędzy udziałowcami projektu (decyzje podjęte podczas warsztatów są dyskutowane i
akceptowane przez wszystkich członków).

www.sdjournal.org 61
Narzędzia

Zwykle proces analizy i dokumentacji towane na kolejnych etapach. Po zakończeniu (po pozytywnej kontroli wewnętrznej) przez
dzieli się na kolejne iteracje, w których pro- iteracji, dotychczasowe rezultaty są weryfiko- przedstawicieli klienta.
dukty jednej iteracji stanowią wejście do ite- wane wewnętrznie (przez zespół analityków, W trakcie analizy i dokumentacji wyma-
racji kolejnej i są uszczegóławiane i komple- QA oraz programistów) oraz zewnętrznie gań analityk biznesowy rozwija dotychczas
określone wymagania, dodaje nowe (zgod-
nie z zakresem projektu) i opracowuje spójny,
Sesja warsztatowa – o czym należy pamiętać? kompletny model analityczny systemu.
• Ustal termin warsztatów odpowiednio wcześniej (z wyprzedzeniem co najmniej tygo- Ukończenie każdego etapu prac powin-
dniowym), by uczestnicy mogli przygotować się do sesji. no kończyć się walidacją produktów ze strony
• Upewnij się, że osoby, których obecność jest niezbędna podczas warsztatu, są dostępne udziałowców projektu i akceptacją rezultatów
w określonym terminie. W przeciwnym razie przesuń termin sesji lub zaproś osoby, któ- bądź przekazaniem wyników do poprawy / uzu-
rych kompetencje odpowiadają nieobecnym w sesji.
pełnienia. Szczególnie istotną kwestią jest pra-
• Zaproszenie na warsztaty powinno obejmować temat i ramowy przebieg sesji. W agen-
dzie warsztatu określ cel, tematy, jakie będą omówione na spotkaniu oraz planowany czas widłowa komunikacja w procesie oraz zapew-
spotkania i – w miarę możliwości - czasy przeznaczone na poszczególne składniki sesji. nienie, iż wszyscy członkowie zespołu projekto-
• Przekaż uczestnikom sesji listę problemów i zagadnień do omówienia przed ustalonym wego (zarówno ze strony dostawcy, jak i klien-
terminem warsztatów. Uczestnicy, a w szczególności przedstawiciele klienta, powinni ta) znają wyniki prac oraz są świadomi, czego od
mieć czas zapoznać się z owymi kwestiami, by podczas sesji przedstawić własne rozwią- nich oczekuje analityk. A analityk oczekuje:
zanie lub wyjaśnienie do pytań.
• Określ rolę prowadzącego warsztaty – osobę odpowiedzialną za notowanie ustaleń
z warsztatów (zarówno ustaleń dotyczących wymagań, jak i innych kwestii). Zwykle jest • Od programistów – weryfikacji możli-
to analityk biznesowy. wości implementacji rozwiązania, anali-
• Dokumentuj lub upewnij się, że taka odpowiedzialność została ustalona, wszystkie usta- zy specyfikacji funkcjonalnej pod kątem
lenia i decyzje podjęte podczas warsztatów. Dla każdego zagadnienia wymagającego ewentualnych braków szczegółów unie-
podjęcia odpowiednich akcji muszą być wyznaczone osoby odpowiedzialne za ich reali-
możliwiających poprawną implementa-
zację. Notatki ze spotkania przekaż wszystkim uczestnikom sesji oraz osobom, które po-
winny być poinformowane o ustaleniach i podjętych decyzjach. cję oraz możliwych problemów.
• Wspólnie z pozostałymi uczestnikami sesji określ terminy, w których należy wykonać • Od zespołu QA – weryfikacji produktów
ustalone zadania, ponadto ustal sposoby odbioru rezultatów zadań. analizy pod kątem błędów logicznych,
edytorskich, kontroli spójności, kom-
pletności i poprawności.
• Od przedstawicieli biznesu klienta – we-
Analiza wymagań – problemy ryfikacji produktów analizy pod kątem
Jednym z problemów pojawiających się w analizie i dokumentacji wymagań są luki w wyma-
ganiach dostarczonych przez udziałowców. Zadaniem analityka – oraz wspierających go człon- zgodności z oczekiwaniami i stopnia
ków zespołu – jest zidentyfikowanie jak największej liczby luk, niezgodności i wątpliwości, by w spełnienia określonych wymagań.
następnej kolejności ustalić ich rozwiązanie z innymi udziałowcami projektu i udokumentować
kompletne i spójne wymagania. Analityk powinien prowadzić listę braków, na której zapisuje Ilość iteracji zależy od rozmiaru aplikacji (licz-
wszelkie uwagi do obecnie dostępnych wymagań i w odpowiednim terminie omawiać treść listy by funkcjonalności, modułów itp.) i powin-
z przedstawicielem biznesu klienta celem znalezienia rozwiązania spełniającego wymogi i ocze-
kiwania klienta. na gwarantować uzyskanie rezultatów na od-
powiednim poziomie jakości – produkty każ-
dej iteracji powinny być poddane przeglądowi
i skorygowane przed dostarczeniem wersji fi-
Komunikowanie wymagań – problemy nalnych. Nie zaleca się zbyt dużej liczby iteracji
Doskonałe produkty i informacje wejściowe nie zawsze są gwarancją sukcesu projektu infor- – powoduje to wstrzymanie postępu projek-
matycznego. Tam, gdzie zawodzi komunikacja, zwykle nie da się zrealizować przedsięwzię- tu i częściowo blokuje np. proces implementa-
cia zgodnie z planem. W przypadku analizy biznesowej częstymi błędami w komunikacji są: cji. Z kolei niewystarczająca liczba iteracji mo-
• Brak informacji o nowych wersjach i zmianach w dokumentacji – co powoduje np., że że oznaczać brak czasu i możliwości szczegóło-
programiści implementują kod zgodnie z nieaktualną specyfikacją, testerzy weryfikują wego opisania wszystkich elementów systemu,
system wedle nieodpowiedniej dokumentacji i pojawia się ogólna konsternacja. wykonania wewnętrznej i zewnętrznej wery-
• Małe zaangażowanie analityków we wsparcie implementacji i testowania – jakże często fikacji oraz poprawy wszystkich znalezionych
zdarza się, że programista czy tester nie rozumiejąc do końca danej funkcjonalności, pro- i zakomunikowanych usterek.
si analityka o wyjaśnienie i odpowiedź na swojego maila otrzymuje po paru dniach czy
Do analizy wymagań można zastosować kil-
tygodniach... kiedy dawno minął już termin wykonania jego zadania.
• Informacje udzielane ustnie – to poważny problem, występujący, gdy dokumentacja anali- ka technik – graficzne, tekstowe czy oparte na
tyczna nie jest wystarczająco szczegółowa, by wyjaśniać wszystkie aspekty funkcjonalności. macierzach. Analityk powinien potrafić posłu-
Zdarza się, że dokumentacja podaje tylko podstawowy opis jakiejś funkcji, bez szczegółów giwać się więcej niż jedną – preferowaną przez
biznesowych etc. i aby poprawnie zaimplementować ową funkcję, programista musi dopy- siebie – techniką, co umożliwia efektywniej-
tywać o szczegóły. Jeśli wyjaśnienie nadchodzi drogą pisemną, jest znane innym zaintereso-
sze i pełniejsze modelowanie i dokumentowa-
wanym (np. testerom) i pozostawia dowód rzeczowy w postaci maila – pół biedy. Gorzej, jeśli
analityk wyjaśnia daną kwestię ustnie jedynie pytającemu – nie ma żadnej gwarancji, że py- nie wymagań, a także rozumienie zawartości
tający zrozumiał dokładnie, jak ma działać dana funkcja (a w przypadku błędnej implemen- produktów wytworzonych przez innych ana-
tacji nie udowodni, że stworzył kod zgodnie z wolą analityka), ponadto wyjaśnienie nie jest lityków (w ramach zespołu projektowego i po-
znane pozostałym członkom zespołu, na których pracę taka informacja może mieć wpływ. za nim – np. czytanie dokumentacji związanej
• Nieefektywna współpraca pomiędzy analitykami – jest też formą komunikacji: w przy- z danym biznesem, lecz nie odnoszącej się bez-
padku dużych zespołów analitycznych sprawna komunikacja i współdziałania to czyn-
pośrednio do projektu).
nik krytyczny. Analitycy muszą informować się na bieżąco o statusie wykonanych prac,
problemach, które wystąpiły, zmianach w wymaganiach, o których są poinformowani, Wybór odpowiedniej techniki leży zwy-
a które mogą mieć wpływ na przebieg lub zakres pracy innych analityków. kle w gestii analityka (choć zdarzają się sytu-
acje, kiedy klient narzuca stosowanie określo-

62 08/2009
Analiza biznesowa

nej techniki) i zależy od organizacji i standar- lityk, który dokonał zmiany lub – w więk- wanym w funkcjonalności projektowanego
dów firmy dostawcy, skali projektu oraz su- szych zespołach analitycznych – kierow- systemu członkiem zespołu. Jest zatem naj-
biektywnej (lecz popartej doświadczeniem) nik zespołu. W treści powiadomienia należy bardziej odpowiednią osobą do udzielania
opinii analityka. umieścić krótki opis zmiany, listę wymagań wyjaśnień odnośnie funkcji i możliwości apli-
lub funkcjonalności, których zmiana dotyczy kacji oraz weryfikacji produktów poszczegól-
Komunikowanie wymagań oraz miejsce przechowywania i nazwę aktu- nych etapów.
Prawidłowy proces analizy biznesowej wyma- alnej dokumentacji. Dobrą praktyką jest też Ponadto wsparcie analityczne obejmu-
ga sprawnej komunikacji. Komunikowanie wy- umieszczanie odnośnika do miejsca przecho- je podział prac projektowych wchodzących
magań to bardzo istotny element – bowiem wywania określonego dokumentu tak, by od- w skład danej fazy na mniejsze elementy – ła-
nawet najdoskonalsza dokumentacja anali- biorcy wiadomości mogli od razu zapoznać twiejsze do udokumentowania oraz później-
tyczna jest bez znaczenia, jeśli członkowie ze- się ze zmianami. Przykładowo: system Lo- szej implementacji, a także kontrolę produk-
społu nie wiedzą, jak do niej dotrzeć, nie zna- tus Notes umożliwia nie tylko tworzenie ca- tów analizy technicznej pod względem zgod-
ją aktualnych wersji i zmian. Komunikowa- łej struktury dokumentacji projektowej, ale ności z projektem funkcjonalnym.
nie wymagań odbywa się zwykle za pomocą i wysyłanie automatycznych powiadomień Jeśli projektowane oprogramowanie wyko-
repozytorium plików, najlepiej z możliwością do wszystkich członków zespołu w przypad- rzystuje gotowe komponenty lub zawiera go-
kontroli wersji (np. VSS). ku modyfikacji treści dokumentu. Takie po- towe moduły pochodzące z produktu, anali-
Wytworzone dokumenty należy umiesz- wiadomienie zawiera również link wiodący tyk bierze udział w pracach związanych z do-
czać w określonym miejscu bazy danych, do bezpośrednio do danego dokumentu. stosowaniem istniejącego systemu do wyma-
którego dostęp mają wszyscy członkowie ze- gań klienta oraz z identyfikacją i projektowa-
społu projektowego, przy czym poszczególne Walidacja rozwiązania niem wymagań dotyczących interfejsów.
składniki dokumentacji powinny znajdować Analityk biznesowy jest – ze strony produ- Podczas prac programistycznych analityk
się w odpowiednich katalogach jednoznacz- centa oprogramowania – najlepiej zoriento- powinien czynnie udzielać wsparcia mery-
nie określających np. typ i status dokumen-
tów, obszar funkcjonalny etc.
Gromadzenie i zarządzanie treścią wyma-
Walidacja rozwiązania – problemy
Niekiedy zdarza się, że prace analityczne są niemal całkowicie oddzielone od pozostałych
gań odbywa się zwykle za pomocą listy (ka- czynności projektowych – analitycy modelują wymagania, przygotowują dokumentację
talogu) wymagań umieszczonej oraz za po- użytkowników i na tym się kończy ich odpowiedzialność. Może to wynikać zarówno z bra-
mocą katalogu zawierającego poszczegól- ku czasu i możliwości, jeśli wsparcie analityczne nie zostało ujęte w harmonogramie prac im-
ne dokumenty wymagań (o wyższym stop- plementacyjnych i testowych, jak i w nieświadomości, jak duże znaczenie ma systematycz-
niu szczegółowości, niż w przypadku listy). ne wsparcie analityczne dla prawidłowego przebiegu projektu. Tymczasem brak wsparcia ze
strony BA może powodować następujące problemy:
W przypadku listy wymagań, każde wymaga-
nie powinno mieć zdefiniowany: • błędna interpretacja wymagań przez programistów i stworzenie kodu, który nie będzie
spełniał oczekiwań klienta;
• numer referencyjny (służący np. do wy- • przypadki testowe niepokrywające krytycznych funkcji aplikacji w odpowiednim stopniu;
kazania listy spełnionych wymagań • straty czasu wynikające z niewłaściwego wykonywania testów i raportowania ich wyni-
ków (m.in. konieczność analizy nieprawidłowych zgłoszeń błędów);
w określonej, szczegółowej specyfikacji
• niewłaściwe podejście do testowania przyjęte przez zespół klienta – wynikające z niezro-
funkcjonalnej); zumienia funkcjonalności i zakresu aplikacji oraz traktowania zmian jako błędów.
• treść;
• priorytet (MUST, SHOULD, COULD), który
umożliwia planowanie kolejności doku-
mentowania, a dalej implementacji wy-
Pojęcia
magań; • Architektura biznesowa – koncepcja rozwiązania systemu implementująca wszystkie za-
• opis spełnienia (w jaki sposób dostawca łożenia i aspekty biznesowe – np. przepływ procesów, interakcje z innymi systemami,
ma zamiar spełnić dane wymaganie). przepływ informacji biznesowej.
• BA – Business Analysis – analiza biznesowa; Business Analyst – analityk biznesowy.
• Modelowanie – reprezentacja biznesu lub danego systemu. Zwykle prezentowana w po-
Miejsce przechowywania i zarządzania doku-
staci graficznej uzupełnionej tekstem.
mentacją analityczną powinno być określa- • Ograniczenie – każde ograniczenie, biznesowe czy techniczne nałożone na system (np. li-
ne na etapie inicjacji projektu, opisane w pla- mit budżetowy dla projektu, ograniczenia związane z określoną architekturą systemu).
nie komunikacji i znane wszystkim członkom • Produkt – rozwiązanie problemu biznesowego, system będący wynikiem projektu infor-
zespołu projektowego. Jak najwcześniej należy matycznego.
upewnić się, że personel projektowy ma dostęp • Projekt – czasowe przedsięwzięcie mające na celu stworzenie unikalnego produktu, usłu-
gi lub innego rezultatu. Ograniczone jest budżetem, dostępnością zasobów (np. ludz-
do repozytorium i dokumentów, przy czym je- kich, sprzętowych) oraz kosztami.
dynie analitycy (twórcy dokumentacji) mają • Projekt funkcjonalny - zachowanie produktu (systemu) możliwe do obserwacji.
uprawnienia do modyfikacji treści dokumen- • QA – Quality Assurance – zapewnienie jakości; termin odnoszący się do ogólnego proce-
tów. Pozostali pracownicy powinni mieć pra- su planowania, realizacji odpowiednich działań zapobiegawczych i korygujących oraz
wa tylko do odczytu – a to dlatego, by uniknąć kontroli jakości zarówno w danym projekcie, jak i przedsiębiorstwie jako całości.
• Wymaganie – warunek lub właściwość systemu wymagane przez udziałowców dla roz-
przypadkowych modyfikacji treści dokumen-
wiązania danego problemu lub uzyskania celu.
tów przez osoby do tego nieuprawnione. • Wymaganie funkcjonalne – wymaganie, które opisuje zachowanie systemu oraz informa-
Każda istotna zmiana w wymaganiach czy cję przetwarzaną przez system.
dokumentacji analitycznej powinna być za- • Wymaganie niefunkcjonalne- wymaganie, które opisuje możliwości systemu niezwiązane
komunikowana członkom zespołu – najle- z funkcjonalnością – np. bezpieczeństwo, liczba użytkowników, którzy mogą równocze-
piej za pomocą poczty elektronicznej. Auto- śnie pracować z systemem, użyteczność etc.
rem informacji o zmianie powinien być ana-

www.sdjournal.org 63
Narzędzia

torycznego - co polega m.in. na udzielaniu gotowej do przeprowadzenia testów, analityk • Brak wkładu użytkowników: 12,8%;
wyczerpujących wyjaśnień wszędzie tam, biznesowy wspiera prace zespołu QA. Anali- • Niekompletne wymagania lub specyfi-
gdzie opis dokumentacyjny nie wystarcza, by tyk może wspierać planowanie i przygotowa- kacja: 12,3%;
w pełni zrozumieć wymagania i funkcjono- nie procesu testowego – określając wymaga- • Zmieniające się wymagania lub specyfi-
wanie systemu, lub gdy programista nie ma nia, jakie muszą być pokryte przypadkami kacja: 11,8%.
dużego doświadczenia w projektach określo- testowymi, czy też weryfikując produkty te-
nego typu. Plan projektu powinien uwzględ- stów – plany, przypadki i scenariusze testo- Dane te jednoznacznie wskazują, że czyn-
niać odpowiedni bufor czasowy na tego ty- we. Celem tej czynności jest upewnienie się, niki związane z produktami analizy bizne-
pu wsparcie – programista na każdym eta- iż projekt testów zapewnia maksymalne po- sowej stanowią główne wyznaczniki ryzyka
pie swoich prac powinien mieć możliwość krycie funkcjonalności przypadkami testo- projektowego i mogą przesądzić o sukcesie
zasięgnięcia opinii analityków odnośnie po- wymi i minimalizację ryzyka biznesowego lub upadku przedsięwzięcia. Celem projek-
prawności i kompletności implementacji. Ta- związanego z dostarczeniem nieprawidłowo tu jest dostarczenie oprogramowania zgod-
ka praktyka może znacznie usprawnić pra- działającego produktu. W trakcie wykony- nego z oczekiwaniami klienta – niemożli-
ce implementacyjne oraz podnieść jakość wania testów analitycy udzielają wyjaśnień we jest więc wykonanie zlecenia bez dogłęb-
produktu – należy bowiem mieć na wzglę- w kwestiach niejasnych oraz są odpowiedzial- nej znajomości owych oczekiwań i popraw-
dzie, że w dużych projektach informatycz- ni za rozwiązywanie problemów związanych nego przełożenia ich na możliwości systemu
nych oraz wszędzie tam, gdzie projektowa- z funkcjonalnością aplikacji – np. wynikają- informatycznego. Zadaniem tym zajmuje się
ny system dotyczy specyficznej branży (wy- cych z braków w dokumentacji analitycznej. właśnie analiza biznesowa. Dobrze zorgani-
magającej głębokiej wiedzy specjalistycznej), Niekiedy analityk biznesowy może być zowany i zrealizowany proces analizy umoż-
dokumentacja analityczna może nie być wy- na stałe przydzielony do prac testowych ja- liwia pozyskanie szczegółowych wymagań
starczająco szczegółowa dla poprawnej im- ko osoba odpowiedzialna za weryfikację co do sposobu funkcjonowania i możliwo-
plementacji. Analityk może dokumentować zgłoszeń błędów napływających od testerów ści projektowanej aplikacji – zarówno wy-
wymagania bez opisywania wszystkich deta- – zwłaszcza w przypadku, gdy testy wyko- magań uświadomionych (czyli takich, z któ-
li i reguł biznesowych, może też odwoływać nują pracownicy klienta, niezbyt dobrze zna- rych istnienia klient zdaje sobie sprawę),
się do dokumentacji zawierającej specyficzne jący funkcjonalność aplikacji. W takiej sytu- jak i pośrednich – pozornie niezwiązanych
informacje. Programista, nieorientujący się w acji zadaniem analityka będzie podejmowa- z głównym celem i przeznaczeniem syste-
całości dokumentacji, nie zawsze wie, gdzie nie nowych zgłoszeń, analiza zgłoszenia i we- mu, a mimo to wpływających na jego prawi-
może znaleźć informacje, których potrzebu- ryfikacja, czy opisuje ono błąd, żądanie zmia- dłowe i bezpieczne działanie.
je. W takich sytuacjach analityk służy wyja- ny lub nie jest zasadne w ogóle oraz przekaza- Niniejszy artykuł przedstawił zasady or-
śnieniami i precyzuje, w jaki sposób zaimple- nie zgłoszenia do naprawy – lub odrzucenie ganizacji procesu analizy w projekcie in-
mentować daną funkcjonalność. Dodatkową w uzasadnionych wypadkach. formatycznym oraz czynności wchodzą-
weryfikację należy przeprowadzić po ukoń- W późniejszej fazie projektu analitycy czę- ce w skład poszczególnych etapów. Czytel-
czeniu kodowania określonej funkcji czy mo- sto wspierają planowanie, przygotowanie nik dowiedział się, co należy wykonać w ra-
dułu systemu – wtedy zarówno analityk, jak i wykonanie testów akceptacyjnych (UAT) mach pozyskiwania i modelowania wyma-
i programista będą mieli niemal całkowitą oraz raportowanie błędów. Niemal normą gań systemowych, jak ulepszyć komunika-
pewność, że wymagania klienta zostały pra- jest, iż analityk biznesowy (zwykle Główny cję w projekcie oraz w jaki sposób zwięk-
widłowo spełnione. analityk) bierze aktywny udział (lub wręcz szyć szanse na sukces przedsięwzięcia za
Plan projektu nie zawsze pozwala na sta- samodzielnie) w planowaniu testów UAT, pomocą zaangażowania członków zespołu
łe konsultacje analityczne i systematyczne określaniu ich zakresu, kryteriów wejścia BA w prace programistyczne i testowe. Nie
wsparcie procesu kodowania – zwykle ana- i wyjścia oraz przygotowaniu zestawu scena- wszędzie można zastosować wszystkie opi-
litycy są obciążeni pracą w stopniu uniemoż- riuszy. Analityk – jako osoba projektująca da- sane w niniejszym tekście techniki analizy,
liwiającym poświęcenie czasu na takie czyn- ny system – ze strony dostawcy wie najwię- nie zawsze da się zaplanować proces analizy
ności. Warto jednak przynajmniej zastoso- cej o funkcjonalności rozwiązania oraz moż- tak, by objął wszystkie przedstawione czyn-
wać praktykę przeglądania produktów im- liwych sposobach weryfikacji jego działania, ności – w gestii czytelnika leży dobór odpo-
plementacji po zakończeniu każdego etapu dlatego też ma największe kompetencje, by wiednich mechanizmów i organizacja pro-
prac – dzięki takiemu podejściu, znacząco organizować lub wspierać organizację testów cesu analizy w sposób najbardziej pasujący
maleje ryzyko błędów wynikających z błęd- użytkowników. do danego typu przedsiębiorstwa oraz spe-
nej implementacji wymagań i kumulowania cyfiki projektu.
się defektów w fazie testowania. Podsumowanie
Ocena rozwiązania nie ogranicza się do Według badania Standish Group, trzy najważ-
weryfikacji produktu w trakcie implemen- niejsze powody; dla których upadają projekty KAROLINA ZMITROWICZ
tacji. Po stworzeniu stabilnej wersji systemu informatyczne, to: Pracuje na stanowisku Analityka biznesowego w fir-
mie Profi-Data. Karolina specjalizuje się obecnie w
modelowaniu wymagań biznesowych. Wcześniej
W Sieci pracowała jako Manager Quality Assurance w pro-
• http://www.erudis.pl/pl/artykuly – artykuły związane z modelowaniem w notacji UML; jektach informatycznych w sektorze finansowo –
• http://www.aion.com.pl/analiza_biznesowa.html – artykuły dotyczące modelowania wy- bankowym.
magań i dokumentowania procesów; Profi-Data to producent oprogramowania specjalizu-
• http://www.uml.com.pl/modules/articles/article.php?id=18 – artykuł o przejściu od analizy jący się w budowie dedykowanych rozwiązań infor-
biznesowej do analizy systemowej;
matycznych dla ubezpieczeń, bankowości i admini-
• www.theiiba.org – witryna M iędzynarodowego Instytutu Analizy Biznesowej. Wśród
wielu informacji dotyczących analizy biznesowej udostępnia również BABOK – czyli Bu- stracji publicznej. Firma posiada certyfikat jakości ISO
siness Analysis Body of Knowledge stanowiący analityczny odpowiednik PMBOK. 9001:2000 w zakresie produkcji oprogramowania.
Kontakt z autorem: karolina_zmitrowicz@wp.pl

64 08/2009
Narzędzia

Monitorowanie
oprogramowania
Lepiej zapobiegać, niż leczyć...
Coraz częściej instytucje zamawiające usługi informatyczne posiadają
własne departamenty IT i pragną w określonym zakresie uczestniczyć
w procesie wytwarzania oprogramowania. Niniejszy artykuł przedstawia
najczęściej spotykane z punktu widzenia klienta problemy związane z taką
współpracą oraz propozycje rozwiązania czy uniknięcia owych problemów.
ceptacyjnych), ale i wspólne opracowanie od-
Dowiesz się: Powinieneś wiedzieć: powiednich mechanizmów korygujących na
• Jak skonstruować kontrakt z dostawcą, by • Podstawowa wiedza z zakresu testowania wypadek pojawienia się problemów podczas
zagwarantować pożądaną jakość procesu i procedur odbioru oprogramowania; implementacji czy testowania.
wytwarzania oprogramowania. • Podstawowa wiedza z zakresu zarządzania Nie tylko wyniki testów mają znaczenie
projektem informatycznym. – często klient pragnie również zweryfikować
strategię realizacji testów wewnętrznych ce-
lem upewnienia się, że umożliwi weryfikację
Wgląd w testy wewnętrzne oprogramowania w wystarczającym stopniu.
Klienci często uskarżają się na to, że dostaw- Pracownicy klienta – jako osoby (z reguły) pra-
Poziom cy nie dają im wglądu w swoje testy – co cujące w danej branży i doskonale znające dany
trudności klient odbiera jako próby ukrycia rzeczy- biznes – są w stanie pomóc w ocenie, czy pro-
wistych wyników testów oraz postępu prac ponowane podejście i technika sprawdzą się do
(na przykład stopnia pokrycia funkcjonalno- weryfikacji określonych funkcji systemu.
ści testami). Dostawca tłumaczy się różnie Często klient oczekuje również wglądu w

D
o lamusa odchodzą czasy, w któ- – brakiem odpowiedniego zapisu w kontr- przypadki testowe zaprojektowane do testów
rych zamawiający oprogramowa- akcie z klientem, wewnętrznymi procedu- wewnętrznych – zazwyczaj systemowych.
nie nie miał pojęcia o jakości pro- rami bądź brakiem czasu na zorganizowa- Zdarza się, że dostawca IT odbiera to jako
cesu i produktu informatycznego i ślepo nie pracownikom klienta dostępu do środo- próbę kontroli i ingerencji w wewnętrzne
wierzył w zapewnienia deklarowane przez wiska testowego. Jednak z punktu widzenia procesy, lub wręcz dodatkową pracę dla swo-
dostawcę IT. Obecnie większość instytu- klienta utrudnianie wglądu w wyniki i prze- ich pracowników, którzy muszą dostosować
cjonalnych klientów posiada własne dzia- bieg testów wynika z próby ukrycia niskiej ja- treść i zakres dokumentacji testowej do moż-
ły IT, wykwalifikowany personel i świado- kości testowania – co wychodzi na jaw przy liwości i oczekiwań klienta. Tymczasem ce-
mość procesów towarzyszących wytwarza- oficjalnym odbiorze systemu czy przejściu lem klienta nie jest utrudnianie pracy innym,
niu oprogramowania. W wielu przypad- do etapu testów akceptacyjnych. a raczej usprawnienie testowania poprzez
kach klient wie dokładnie, czego może Tymczasem udostępnienie klientom upewnienie się, że aplikacja będzie testowa-
oczekiwać od dostawcy, i w jaki sposób we- środowiska testowego nie tylko pokazuje, na w odpowiedni sposób, oraz że wszystkie
ryfikować produkty projektu. Pracownicy że dostawca nie ma nic do ukrycia i rzetel- krytyczne obszary i funkcjonalności zostaną
klienta mają wiedzę i doświadczenie z za- nie wykonuje testy zewnętrzne, ale i może zweryfikowane. Podczas takiego klienckiego
kresu realizacji projektów IT, technik anali- wspomóc procesy QA poprzez wiedzę i do- przeglądu przypadków testowych można czę-
zy i testowania – zdarza się, iż równie duże świadczenie pracowników klienta. Z punk- sto wykryć braki w projekcie testów i uzupeł-
(a nawet większe), niż personel dostawcy tu widzenia klienta, wgląd w wewnętrzne nić je przed rozpoczęciem prac QA lub już w
oprogramowania. Jednak nie zawsze klient procesy testowe jest niezbędny dla upew- ich trakcie (lecz przed oddaniem aplikacji do
wie, w jaki sposób zapewnić sobie środki i nienia się, że jakość aplikacji będzie zgodna klienta). Inną korzyścią z przeglądu jest to, że
możliwości wglądu w proces produkcji sys- z deklaracjami i wszystkie krytyczne obsza- klient może sprawdzić, jakie testy wykonuje
temu, czy jak egzekwować swoje prawa. ry systemu zostaną zweryfikowane na od- dostawca, i wyłączyć owe testy z zakresu swo-
W następnej części artykułu czytelnik powiednim poziomie. Aktualna informa- ich prac – w zamian projektując inne, uzu-
zapozna się z najczęściej spotykanymi pro- cja o kondycji systemu umożliwia nie tyl- pełniające. Umożliwia to nie tylko wyelimi-
blemami we współpracy klienta z dostaw- ko lepsze planowanie dalszej pracy zespo- nowanie ryzyka dublowania pracy, ale i roz-
cą IT. łu klienta (tzn. przygotowanie do testów ak- szerza zakres i głębokość testów.

66 08/2009
Monitorowanie oprogramowania

Odbiór systemu cji, wprawiając testerów czy użytkowni- ności naprawionych funkcji czy modu-
Problemy pojawiają się również przy odbiorze ków w irytację i niwecząc dotychczasową łów przez przekazaniem ich klientowi.
systemu od dostawcy (przekazaniu do testów koncepcję pracy z systemem. W takiej sy-
klientowi). Zdarzają się braki zarówno w do- tuacji pracownicy klienta nie wiedzą, cze- Co zrobić,
kumentacji – specyfikacjach, raportach z te- go mogą się spodziewać po zachowaniu by uniknąć problemów?
stów – jak i w samym systemie – błędy w im- oprogramowania i przestają wierzyć za- Podstawą zapewnienia odpowiedniej jakości
plementacji, i to w funkcjonalnościach dekla- pewnieniom dostawcy. procesu wytwarzania systemu jest kontrakt
rowanych jako działające poprawnie. Klient • Dostawca nie wspiera testowania i dzia- zawierany z dostawcą IT i zawarte w nim za-
nierzadko ma wrażenie, że dostawca nie wy- łań serwisowych w oczekiwanym stop- pisy i wymagania. Zainteresowanie kwestia-
konywał testów rzetelnie i zgodnie z wyma- niu. Jeśli ustalenia zawarte w kontr- mi jakości procesu i produktów projektu do-
ganiami jakościowymi – czyli nie wywiązał się akcie z dostawcą nie są wystarczają- piero na etapie implementacji, testowania czy
z umowy dotyczącej jakości produkowanego co precyzyjne i nie określają jasno za- – jeszcze gorzej – wdrażania systemu na pro-
systemu. W takiej sytuacji klient nie wie, jakie kresu odpowiedzialności i prac serwi- dukcję, to stanowczo za późno. Na takim eta-
testy zostały rzeczywiście wykonane, jakie ob- sowych oraz wspierających inne pra- pie klient może mieć trudności przy wyegze-
szary zweryfikowane i w jakim stopniu oraz na ce, klient może spotkać się z proble- kwowaniu pewnych działań (korygujących
jakich testach powinien się skupić – czy też ra- mami w tym temacie. Dostawca może czy zapobiegających), szczególnie jeśli nie by-
czej sprawdzać wszystko od początku, polega- nie chcieć udostępniać swoich dotych- ły one przewidziane oraz udokumentowane
jąc na własnej ocenie jakości systemu. czasowych wyników testów, weryfiko- w kontrakcie w ramach zakresu prac realizo-
Jakie problemy mogą pojawić się przy – wać podejścia i strategii do testowania wanych przez dostawcę.
lub już po – odbiorze systemu? klienta czy też realizować zgłoszenia Jak wynika z informacji udzielanych przez
błędów pochodzące od zespołu klienta pracowników działów IT organizacji klientów,
• Dostawca nie przekazuje całości doku- bez należytej staranności. Ta ostatnia bardzo często zdarza się, że umowy konstru-
mentacji potrzebnej do prawidłowego kwestia może stanowić duży problem, owane są niemalże ad hoc, bez należytej staran-
użytkowania czy dalszych testów syste- a niestety zdarza się stosunkowo często ności we wszystkich istotnych kwestiach. Wyni-
mu (głównie specyfikacje i dokumentacje – dostawca nie przyjmuje zgłoszeń od- ka to najczęściej z braku wiedzy ludzi odpowie-
użytkownika oraz końcowe raporty z te- powiednio szybko, zwleka z naprawia- dzialnych za tworzenie umów – nie zawsze pra-
stów). Może to wynikać zarówno z niedo- niem błędów czy nie sprawdza popraw- cownicy klienta zdają sobie sprawę, jak dokład-
patrzenia, jak i braku takiej dokumentacji
u dostawcy. Jeżeli umowa o wykonanie
oprogramowania jasno określa elementy Czego oczekuje klient?
i produkty, które będą musiały zostać do- Zwykle klient nie ingeruje w wewnętrzny proces dostawcy i nie narzuca własnych rozwiązań.
Z reguły klient oczekuje jedynie:
starczone wraz z systemem, sytuacja taka
nie powinna w ogóle mieć miejsca, jako że • wglądu w dokumentację testową, a w szczególności:
jest to naruszenie postanowień kontraktu • w plan testów;
i niewywiązanie się z niego. • w specyfikacje przypadków użycia;
• Dostawca nie weryfikuje jakości opro- • w dane testowe.
gramowania po jego instalacji w środo- • udostępnienia wyników testów w określonym zakresie (np. dla testów krytycznych funk-
cjonalności);
wisku docelowym. Producent powi- • informacji o problemach pojawiających się podczas testowania (opóźnieniach wynikają-
nien upewnić się, iż aplikacja prawidło- cych z implementacji wielu zmian, niedostępności danych czy środowisk testowych itp.).
wo startuje i funkcjonuje po przeniesie-
niu ze środowiska deweloperskiego czy
testowego na środowisko klienta i do-
piero po tym oficjalnie przekazać sys-
Odbiór systemu
Co powinno być dostarczone przy przekazaniu systemu? Co najmniej następujące elementy:
tem. Dlaczego? Dlatego, iż zdarza się, że
z różnych powodów aplikacja działająca • Specyfikacja systemu (łącznie z dokumentacją użytkownika) – aktualna dokumentacja sys-
w środowisku testowym czy deweloper- temu jest konieczna, szczególnie w przypadku, gdy klient nie brał udziału w testach syste-
skim nie działa u klienta – czy to przez mowych i przystępuje od razu do testów akceptacyjnych. Mimo iż przypadki testowe do
UAT są zwykle projektowane na wczesnym etapie testów, aktualna dokumentacja systemu
różnice w konfiguracji środowisk, czy
służy jako podstawa ewentualnej aktualizacji testów (np. gdy zmienność aplikacji była sto-
też przez zwykłe błędy, które wystąpiły sunkowo duża) oraz dodatkowe źródło informacji o funkcjonalności oprogramowania.
podczas instalacji systemu. • Raporty końcowe z testów – dostarczają informacji o stopniu, w jakim aplikacja została prze-
• Jakość deklarowana przez dostawcę nie testowana, jakie pojawiały się błędy i ile ich było (co umożliwia określenie obszarów zwięk-
odpowiada faktycznemu stanowi rzeczy. szonego ryzyka). Zwykle raport końcowy z testów zawiera:
W trakcie testów klienta czy też użytko- • wstęp;
• streszczenie – omówienie i wyniki oraz obserwacje, ewentualnie zalecenia;
wania systemu na produkcji może okazać • środowisko i metodyka testowania;
się, że funkcjonalności deklarowane jako • wyniki testów;
przetestowane i działające w 100% zawie- • zgłoszone problemy.
rają błędy uniemożliwiające korzystanie z • Lista otwartych błędów – lista błędów, o których dostawca wie, jest niezbędnie wymaga-
aplikacji zgodnie z jej celem i przeznacze- na przy przekazaniu systemu do klienta. Dzięki temu klient zdaje sobie sprawę, że aplika-
cja zawiera określone błędy i może nie działać w pełni zgodnie ze specyfikacją; wie rów-
niem. Przypadki i scenariusze testowe, w
nież, że dostawca jest świadomy istnienia owych błędów i zamierza je naprawić. Jawna li-
raporcie z testów określone jako zrealizo- sta otwartych błędów eliminuje sporo problemów związanych z testowaniem, które bę-
wane z wynikiem pozytywnym, w uży- dzie realizował zespół klienta – wiadomo, co działa i co może być testowane, gdzie pojawi
ciu powodują mniej lub bardziej kry- się błąd oraz czy znaleziony w trakcie pracy defekt jest znany dostawcy, czy też nowy.
tyczne błędy i nie realizują swoich funk-

www.sdjournal.org 67
Narzędzia

nie przebiega proces wytwarzania oprogramo- dającej za opracowywanie kontraktów? Nie wsze zaangażować zewnętrznych konsultan-
wania i o co należy zadbać na etapie uzgodnień zawsze. Jeśli zlecenie wykonania usług IT tów, którzy będą prowadzić negocjacje z do-
warunków umowy. W efekcie w kontrakcie bra- jest jednorazowe, lub wszystko wskazuje na stawcą i zadbają o odpowiednią konstrukcję
kuje np. wyszczególnienia wszystkich prac, któ- to, iż dana organizacja nie będzie zbyt czę- umowy. Rola konsultanta może nie ograni-
re dostawca zobowiązuje się wykonać oraz okre- sto korzystać z usług zewnętrznych dostaw- czać się do nadzoru nad zapisami umowy;
ślenia, w jakiej postaci klient oczekuje dowodów ców IT, nie jest ani konieczne, ani opłacalne konsultanci często uczestniczą we wszyst-
realizacji owych prac. utrzymywanie takiego stanowiska. W przy- kich pracach projektowych, a ich zadaniem
Czy konieczne jest zatem zatrudnienie padku, gdy klient nie posiada personelu jest upewnienie się, że dostawca wypełnia
specjalisty na stanowisko osoby odpowia- o odpowiednich kompetencjach, może za- warunki umowy oraz wspieranie organizacji
klienta w obszarach, w których pracownicy
Tabela 1. Elementy zapewnienia jakości klienta nie mają wystarczających kompeten-
Faza Środek Lista zagadnień cji. Przykładowo – konsultanci mogą doko-
nywać przeglądów dokumentacji analitycz-
Start projektu Umowa Wykaz prac realizowanych przez dostawcę
nej, by zweryfikować jej poprawność i zgod-
Wykaz produktów poszczególnych faz i eta-
ność z wymaganiami, jak również np. zgod-
pów
ność ze standardami jakości wymaganymi
Kryteria akceptacji / odbioru produktów przez daną organizację. Dość często konsul-
Konsekwencje na wypadek nie spełnienia tanci z zewnętrznych instytucji zatrudniani
wymagań są w charakterze analityków biznesowych
Czasy reakcji na problemy albo managerów testów, wspierając klienta
Implementacja Plan testów Strategia i podejście do testów w pracach wymagających specyficznej wie-
i testowanie dzy i doświadczenia.
Harmonogram
Wracając do samej umowy o realizację
Środowisko testowe usług informatycznych – klient powinien
Narzędzia upewnić się, że treść umowy obejmuje nastę-
Punkty kontrolne pujące elementy:
Zakres prac: wyszczególnienie etapów pro-
Projekt testów Lista przypadków testowych
jektu IT wraz z wykazem głównych prac re-
Pokrycie wymagań testami alizowanych w ramach każdego etapu. Umo-
Raport z testów Wyniki testów wa powinna jasno określać główne fazy pro-
Liczba otwartych błędów jektu oraz najważniejsze czynności (przykład
Statystyki defektów (identyfikacja obsza-
w Tabeli 2).
rów o zwiększonym ryzyku) Produkty projektu: główne (czyli sam sys-
tem informatyczny wraz z dokumentacją sys-
Przekazanie Dokument odbioru systemu Jak plan testów i raport z testów
systemu temu) oraz pośrednie (dokumentacja anali-
Lista zmian tyczna, projektowa, testowa, wdrożeniowa).
Produkty powinny być określone już na eta-
Tabela 2. Wykaz czynności i produktów faz projektu pie kontraktu, aby od początku było jasne, co
Faza Czynność Produkt dostawca musi wykonać i kiedy.
Kryteria akceptacji produktów projek-
Analiza biznesowa Określenie szczegółowych wymagań Lista wymagań
tu – klient powinien określić warunki, jakie
biznesowych
muszą być spełnione, by dany produkt mógł
Określenie reguł dotyczących wyglą- Dokument Look & Feel
być zaakceptowany jako spełniający określo-
du aplikacji
ne kryteria jakościowe. W przypadku doku-
Udokumentowanie wymagań Specyfikacja funkcjonalna mentacji będzie to rzecz jasna przejrzystość,
(diagramy przypadków uży-
poprawność, kompletność, jak również zgod-
cia, modele procesów)
ność z wymaganiami systemu oraz standarda-
Projektowanie Określenie architektury systemu Dokument architektury
mi jakości (np. ze standardem)
Analiza integracji z systemami ze- Dokumentacja mapowania Wymagania dotyczące procesu produkcji
wnętrznymi, określenie mapowania oprogramowania (np. zgodność ze standar-
danych
dem ISO/IEC 12207, IEEE-Std-601). Klient
Stworzenie struktury danych Diagramy przepływu danych ma prawo wymagać od dostawcy realizowa-
Słownik danych nia projektu według określonej metodologii
Testowanie Opracowanie strategii testów Plan testów czy żądać, by proces był zgodny ze standarda-
Zaprojektowanie przypadków testo- Projekt testów (w tym szcze- mi – nie jest tak, że to dostawca narzuca swój
wych gółowe przypadki testowe) własny proces, według którego postępuje za-
Wykonanie testów Raporty błędów wsze. Oczywiście nie należy na siłę ustalać
danej metodologii (bo np. jest modna), lecz
Analiza wyników testów i opracowa- Raport końcowy
nie raportów końcowych z testów przeanalizować, jakie podejście najlepiej pa-
suje do projektu i daje największe szanse po-
Wdrożenie Instalacja systemu w środowisku do- Dokumentacja instalacji i
celowym wdrożenia
wodzenia (w tym momencie często przyda-
je się specjalista – konsultant z innej orga-
Szkolenie użytkowników systemu Podręcznik użytkownika
nizacji).

68 08/2009
Monitorowanie oprogramowania

Wymagania dotyczące zespołu produkcyj- ki – wgląd w wyniki testów czy nawet wspar- mów operacyjnych, wersji programów) i re-
nego – w niektórych przypadkach wskazane cie testowania to jedna z metod. Klient powi- komendacji.
jest określić dokładne wymagania związane nien wymagać od dostawcy przekazania co Przypadki i scenariusze testowe zwykle
z niezbędnymi kwalifikacjami czy doświad- najmniej następującej dokumentacji: nie są oficjalnie wymaganą dokumentacją
czeniem członków zespołu projektowego przy akceptacji testów czy też odbiorze syste-
– aby na wstępie wyeliminować ryzyko, iż • plan testów – przed rozpoczęciem testo- mu. Mogą one być oczywiście udostępniane
dostawca zaangażuje do prac projektowych wania – tak, by klient mógł odnieść się klientowi – o ile jest taki zapis w umowie lub
personel o zbyt niskich kompetencjach. Dla do podejścia proponowanego przez do- uzgodnienia pomiędzy stronami – na okre-
przykładu – w projekcie mającym na celu stawcę i ewentualnie wprowadzić swoje ślonym etapie testów lub jako dowód speł-
wyprodukowanie złożonego systemu ban- sugestie (przykładowo pomóc w określe- nienia wymagań systemu (zwłaszcza w po-
kowego powinny uczestniczyć osoby, które niu ryzyka); dejściu do testowania opartym na wymaga-
posiadają kilkuletnie doświadczenie w tego • raport z testów – po zakończeniu testów. niach). Jednak niezależnie od tego, czy klient
typu projektach – ponieważ realizacja takie- wymaga okazywania mu dokumentacji przy-
go projektu wiąże się z koniecznością posia- Dobrą praktyką jest zapewnienie sobie wglą- padków testowych na poszczególnych eta-
dania specjalistycznej wiedzy w danej dzie- du w przypadki i scenariusze testowe – pach testowania, czy też nie, dostawca po-
dzinie i znajomości branży. Z reguły sam do- przynajmniej dla testów systemowych lub winien takową dokumentację opracować
stawca dba o zapewnienie personelu o odpo- w ramach dostarczenia dowodów spełnienia i utrzymywać – chociażby dla kontroli postę-
wiednich kompetencjach, jako że powodze- wymagań systemowych. pu prac testowych i stopnia realizacji wyma-
nie projektu leży w jego interesie – warto Plan testów, oprócz harmonogramów i po- gań. W przypadku, gdy dostawca stanowczo
jednak również ze strony klienta upewnić działu prac, powinien opisywać również ogól- odmawia klientowi wglądu w projekt testów,
się, iż do zespołu nie trafią osoby nie spełnia- ne podejście (strategię) testowania – wybraną może to oznaczać, iż dokumentacji testowej
jące pewnych wymagań: w tym celu w umo- metodę wraz z jej uzasadnieniem, zidentyfi- po prostu nie ma, a prace QA wykonywane są
wie powinien znaleźć się odpowiedni zapis kowane poziomy testów, wyszczególnienie w sposób nieuporządkowany, bez planu i me-
(zwykle formułowany w postaci wymagania: cykli (iteracji), o ile jest to możliwe na etapie chanizmów nadzoru.
Dostawca zapewnia dostępność personelu … planowania, oraz kryteriów wejścia i wyjścia Kolejną metodą zapewnienia prawidło-
po czym następuje wyszczególnienie ról pro- dla poszczególnych poziomów. Zdarza się, iż wego wykonywania prac przez dostawcę jest
jektowych i skróconego opisu niezbędnych dostawca odmawia poinformowania klienta o tak zwany dokument odbioru systemu, wy-
kwalifikacji). realizowanej przez siebie strategii testowania magany od dostawcy przy przekazaniu sys-
Terminy wykonania prac, w tym również i metod wykorzystywanych do weryfikacji temu z testów wewnętrznych do zespołu
poprawek – często jest to pomijane lub nie oprogramowania na różnych etapach, tłuma- klienta, który kontynuuje testowanie zgod-
dość precyzyjne, np. klient nie określa ter- cząc się tym, że ta wiedza jest jego know-how nie z własnym podejściem i rozumieniem
minów, w jakich dostawca powinien na- – tajemnicą firmową, i nie udostępnia jej in- idei systemu.
prawiać błędy o określonym priorytecie... aczej, niż poprzez pełnopłatne, zorganizowa- Dokument odbioru systemu opisuje proces
i w efekcie jest tak, że otwarte błędy wiszą ty- ne szkolenia. testowy dostawcy – podejście do testowania,
godniami, ponieważ nie określono tak zwa- Raport z testów musi zawierać listę wyko-
nych czasów reakcji i naprawy defektów. nanych przypadków testowych wraz z ich re-
O ile nie ma to zbyt wielkiego znaczenia zultatami oraz statystyki defektów – znale-
Dokument odbioru systemu
1.Testy
w przypadku błędów kosmetycznych, o ty- zionych, naprawionych, zamkniętych w po- 2.Testowane produkty i komponenty
le jest krytyczne dla np. postępu prac testo- szczególnych sesjach testowych. Zwykle w ra- 2.1.Funkcjonalności podlegające testom
wych, jeśli błędy są poważne i blokują część porcie końcowym umieszcza się również wy- 2.2.Funkcjonalności nie podlegające te-
funkcjonalności. kaz otwartych (nie naprawionych w finalnej stom
2.3.Podejście do testów
Sam kontrakt nie zapewni, że dostawca pra- bądź bieżącej wersji systemu) błędów oraz
2.3.1.Typy testów
widłowo wywiąże się ze swoich zobowiązań. potencjalnych problemów (np. system nie 2.3.2.Techniki testowania
Klient powinien zapewnić sobie i inne środ- wspiera określonych modeli urządzeń, syste- 2.3.3.Narzędzia do zarządzania i wykony-
wania testów
2.3.4.Kryteria zakończenia testów
W czym może pomóc konsultant z zewnątrz? 2.4.Testy regresji
1.Harmonogram
• Negocjacje warunków umowy, zakresu projektu oraz wymagań. 2.Zespół testowy
• Zapewnienie prawidłowej konstrukcji umowy z dostawcą IT tak, by przejrzyście i wystar- 3.Środowisko testowe
czająco szczegółowo opisywała zakres poszczególnych prac, jakie dostawca zobowiązuje 5.1.Parametry środowiska testowego
się wykonać w ramach danego projektu oraz kryteria akceptacji/odbioru produktów pro- 5.2.Dane testowe
jektu. 1.Wyniki testów
• Zidentyfikowanie obszarów ryzyka i zapewnienie, by w kontrakcie znalazły się zapisy o 6.1.Stan przypadków testowych
konsekwencjach, jakie poniesie dostawca w razie niewywiązania się z warunków umowy. 6.1.1.Wersja x.x systemu
• Wsparcie w wyborze odpowiedniej dla danego projektu metody/podejścia do zarządza- 6.1.1.1.Pozytywne
nia, analizy, projektowania, testowania (szczególnie przydatne w przypadku, gdy klient 6.1.1.2.Negatywne
uczestniczy w wytwarzaniu produktu na każdym etapie projektowym)/ 6.1.1.3.Niewykonane
• Identyfikacja szczegółowych wymagań systemowych i przekazanie ich dostawcy w okre- 6.1.1.4.Zablokowane
ślonej formie. 6.2.Pokrycie wymagań testami
• Recenzowanie dokumentacji projektowej celem weryfikacji jej poprawności, zgodności ze 6.3.Otwarte defekty
standardami czy praktykami, stopnia spełnienia wymagań. 6.4.Statystyki defektów
• Wsparcie procesu testowego – zarządzanie testami ze strony klienta, nadzór/kontrola reali- 6.5.Lista zmian
zacji testów wykonywanych przez dostawcę, weryfikacja rezultatów testów, analiza pokry- 6.5.1.Zmiany zrealizowane
cia wymagań testami, identyfikacja danych testowych etc. 6.5.2.Zgłoszone zmiany

www.sdjournal.org 69
Narzędzia

założenia, wyniki testów, statystyki defektów stów klienta okaże się, że przedstawione dane błędnie, za to inne części systemu szwanku-
w poszczególnych cyklach testowych. Jaki jest nie odpowiadają prawdzie (np. jakaś funkcjo- ją, ponieważ zmiany wywołały nowe błędy,
cel tworzenia takiego dokumentu? nalność nie została przetestowana, co wynika a dostawca zapomniał przetestować system
Po pierwsze, wyjaśnienie, w jaki sposób do- z dużej liczby błędów odkrytych przez klien- pod tym kątem.
stawca realizował testy, w jakich warunkach ta), klient może pociągnąć dostawcę do odpo-
(np. konfiguracja środowiska) i jakie uzyskał wiedzialności. Należy tu jednak mieć na uwa- Podsumowanie
wyniki. Na podstawie tych danych klient mo- dze, że niektóre błędy pojawiają się dopie- Podpisując kontrakt o świadczenie usług IT,
że opracować plan testów, jaki sam będzie ro w środowisku klienta (co wynika z różnic dostawca zobowiązuje się wykonać określo-
wykonywał, uwzględniając w szczególności w konfiguracji, bazie danych etc.) i dostaw- ne prace w określonym terminie i otrzymu-
obszary niestabilne i o zwiększonym ryzy- ca nie miał możliwości, by je znaleźć. Dlate- jąc odpowiedni poziom jakości. Klient mo-
ku (czyli te, w których znajdowano najwię- go też elementem dokumentu odbioru syste- że wierzyć na słowo w deklaracje spełnienia
cej błędów). mu jest punkt środowisko testowe, który opi- owych wymagań (i załamywać ręce, kiedy
Po drugie, dostarczenie dowodów, że do- suje parametry środowiska testowego, w któ- okazuje się, że deklaracje mijają się z faktami)
stawca wypełnił wymagania umowy w za- rym dostawca wykonywał swoje prace. – może też zapewnić sobie pewne mechani-
kresie weryfikacji systemu (np. maksymalna Po trzecie, zapewnienie wykonania pew- zmy kontroli i nadzoru nad poprawnością
liczba otwartych błędów o wysokim prioryte- nych prac w ramach testów – na przykład wykonywanych prac i ich wynikami. Posta-
cie na zakończenie testów to 2, w tym żaden testów regresji po każdej zmianie jakiejś czę- wienie dostawcy określonych warunków nie
nie blokuje głównych funkcjonalności). Do- ści systemu lub naprawie błędu wpływają- jest niczym więcej niż tylko zapewnieniem,
kument odbioru systemu jest w pewnym sen- cego na wiele funkcjonalności. Mimo że te- iż w ramach wynagrodzenia za wykonanie
sie deklaracją jakości – dostawca stwierdza, iż sty regresji wydają się rzeczą oczywistą, nie usługi dostawca spełni oczekiwania klien-
wykonał takie a takie testy w określonym za- zawsze tak jest – określona funkcjonalność, ta i dostarczy produkt zgodny z wymagania-
kresie i uzyskał dane wyniki. Jeśli w trakcie te- która podlegała dużym zmianom działa bez- mi, w ustalonym terminie oraz o określonym
poziomie jakości. Jeśli zakup książki w skle-
pie internetowym pozwala klientowi wybrać
W Sieci dostawcę oferującego najkorzystniejszą cenę,
określić warunki dostawy i możliwość zwro-
• http://iir.nf.pl/ – strona firmy szkoleniowej, mającej w ofercie m.in. szkolenia dotyczące tu towaru w przypadku, gdy produkt nie od-
optymalnego konstruowania umów z dostawcami zewnętrznymi IT w sposób zapewnia-
jący spełnianie gwarancji zawartych w umowach SLA, poprawiający efektywność kosz- powiada oczekiwaniom – tym bardziej nale-
tową świadczonych usług i pozwalający na budowanie wysokiej relacji między dostawcą ży stosować podobne zasady w przypadku
a klientem; oprogramowania, którego zakup jest drogi
• www.outsourcing.com.pl/559,jak_podpisac_dobra_umowe_na_outsourcing.html – artykuł i związany z wysokim ryzykiem.
na temat konstruowania umów z dostawcami IT – sporo wskazówek i cennych informacji Niniejszy artykuł przybliżył podstawowe
na temat niezbędnych elementów umowy, w tym aspektów kontroli i ceny;
kwestie, o których powinien pamiętać klient,
• biznes.gazetaprawna.pl/artykuly/11516,dostawca_it_odpowiada_za_oprogramowa-
nie.html – artykuł z Gazety Prawnej, opisujący m.in. jakie praktyki dostawca może pokryć przystępując do współpracy z dostawcą IT
pod pojęciem klauzuli umownej; oraz przedstawił najprostsze sposoby zapew-
• mojafirma.infor.pl/poradniki/449,2542,5,.html – obszerny artykuł na temat prawnych nienia prawidłowego wytwarzania produk-
aspektów umów wdrożeniowych, oraz wiele wskazówek, jakie informacje powinny zna- tu. Opisane metody w większości nie wyma-
leźć się w treści umowy. gają szczególnego nakładu czasu i środków,
a mogą przynieść wymierne korzyści. Jasne
postawienie warunków współpracy na po-
Pojęcia czątku minimalizuje ryzyko nieporozumień
i konfliktów w przyszłości, a w dłuższym cza-
• Analiza pokrycia wymagań testami – analiza mająca na celu stwierdzenie, w jakim stopniu sie pozwala obu stronom czuć się bardziej
zaprojektowane przypadki testowe obejmują (pokrywają) określone wymagania (funk-
komfortowo – dostawcy, ponieważ wie do-
cjonalne i niefunkcjonalne);
• Czas reakcji – termin, w jakim dostawca IT zobowiązany jest podjąć działania w odpowie- kładnie, czego się od niego oczekuje, i kliento-
dzi na zgłoszony problem; wi – jako że otrzyma obiektywne dowody na
• Czas naprawy – termin, w jakim dostawca IT zobowiązany jest dostarczyć rozwiązanie to, że kontrahent wypełnił nałożone na niego
zgłoszonego problemy do użytkowników; obowiązki.
• Testy akceptacyjne (ang. acceptance testing) – celem jest sprawdzenie, czy oprogramowa-
nie jest gotowe i może być przekazane użytkownikowi końcowemu;
• Testy ALFA – wykonywane w środowisku wytwórczym przez wytwórców oraz klientów, KAROLINA ZMITROWICZ
aby sprawdzić, czy stworzony system jest akceptowalną implementacją wymagań; Pracuje na stanowisku Analityka biznesowego
• Testy BETA – wymagają dostarczenia systemu do pewnej liczby użytkowników końco- w firmie Profi-Data. Karolina specjalizuje się
wych, którzy zgodzili się wykorzystywać system i przekazywać pojawiające się problemy obecnie w modelowaniu wymagań biznesowych.
producentowi; Wcześniej pracowała jako Manager Quality Assu-
• Testy integracyjne (ang. integration testing) – wykonywane w celu sprawdzenia, czy kom-
rance w projektach informatycznych w sektorze
ponenty współpracują ze sobą poprawnie np. podczas realizacji przypadku użycia; służy
do wychwycenia niekompletności lub błędów w specyfikacjach interfejsów pakietów. finansowo – bankowym.
• Testowanie regresyjne (ang. regression testing) – wykonywane po wprowadzeniu zmian Profi-Data to producent oprogramowania spe-
do oprogramowania w celu zapewnienia, że nowe defekty nie zostały wprowadzone ja- cjalizujący się w budowie dedykowanych rozwią-
ko rezultat zmian; ten typ testów porównuje aktualną wersję systemu z poprzednią wer- zań informatycznych dla ubezpieczeń, bankowo-
sją i identyfikuje różnice jako potencjalne defekty (przy założeniu, że zachowanie nie po-
ści i administracji publicznej. Firma posiada cer-
winno ulec zmianie);
• Testy systemu (ang. system testing) – rozpoczynają się, gdy oprogramowanie jako całość tyfikat jakości ISO 9001:2000 w zakresie produk-
lub jego jasno określona część jest funkcjonalna (sprawna). cji oprogramowania.
Kontakt z autorem: karolina_zmitrowicz@wp.pl

70 08/2009
Akademia UML

Dziedziczenie
Tworzenie hierarchii klas
W poprzednim odcinku Akademii UML poznaliśmy sytuacje, w których
nie należy stosować dziedziczenia. Zobaczmy, kiedy powinniśmy
tworzyć wspólną nadklasę dla kilku klas, a kiedy taka hierarchia klas jest
zbędna.

no od plew, czyli umieścić w modelu aspek-


Dowiesz się: Powinieneś wiedzieć: ty istotne dla naszego zastosowania, pomi-
• Kiedy należy stosować dziedziczenie; • Znać notację diagramów klas języka UML; jając rzeczy nieistotne.
• Jak unikać nadmiernej hierarchii klas. • Znać podstawowe zasady analizy i projekto- W tę pułapkę szczególnie łatwo jest
wania obiektowego; wpaść, korzystając z dziedziczenia i two-
• Rozumieć mechanizm dziedziczenia. rząc hierarchię klas, która wykracza poza
zakres projektowanego systemu. Jeśli za-
łożymy, że nasza instytucja ubezpiecze-
biznesową. Pułapka ta polega na próbie niowa zajmuje się przede wszystkim ubez-
zamodelowania wszystkich możliwych pieczeniami samochodów osobowych, sa-
Poziom aspektów rzeczywistości, także tych, któ- mochodów ciężarowych oraz motocy-
trudności re są nieistotne z punktu widzenia pro- kli, to klasy takie jak PojazdWolnobieżny
jektowanego systemu. Tymczasem cała czy PojazdSzynowy są zbędne, ponie-
sztuka polega na tym, aby oddzielić ziar- waż wykraczają poza dziedzinę nasze-

W
yobraźmy sobie, że projek-
tujemy system dla instytu- ������
cji ubezpieczeniowej, obsłu-
gujący ubezpieczenia komunikacyjne po-
jazdów. Podczas analizy dowiadujemy się,
że system ten ma w szczególności działać
zgodnie z ustawą Prawo o ruchu drogowym. ��������������� ��������� �������������
Tworząc diagram klas dla naszego syste-
mu, musimy w nim oczywiście umieścić
klasy reprezentujące pojazdy, które będą
podlegały ubezpieczeniom. I tu przycho-
dzi nam z pomocą wspomniana ustawa,
w której znajdziemy precyzyjne definicje
����������������� ��������������� ����������������� ���������������
poszczególnych rodzajów pojazdów, np.:
Pojazd samochodowy – pojazd silnikowy,
którego konstrukcja umożliwia jazdę z prędko-
ścią przekraczającą 25 km/h; określenie to nie
obejmuje ciągnika rolniczego
Na podstawie takich definicji mogliby- ��������������� ����������������� �������� ������� ��������
śmy stworzyć hierarchię klas taką jak na Ry-
sunku 1.
Model ten jest najzupełniej poprawny
i nie można mu niczego zarzucić. Jest to
jednak znakomity przykład pułapki, w ja-
ką można wpaść, modelując rzeczywistość Rysunek 1. Hierarchia klas pojazdów

Object Constraint Language (OCL)


OCL jest językiem wyrażeń, umożliwiającym formułowanie ograniczeń (ang. constraints) dla modeli obiektowych i innych artefaktów powsta-
łych w czasie modelowania obiektowego. (J. Warmer, A. Kleppe, OCL – precyzyjne modelowanie w UML, WNT, 2003)
OCL jest częścią języka UML. Specyfikacja OCL została dodana do UML w wersji 1.1.

72 08/2009
Dziedziczenie

go systemu. Niepotrzebne są także kla- Zamiast pisać regułę biznesową, war- Na pierwszy rzut oka wydaje się, że kla-
sy PojazdSilnikowy i Pojazd, ponieważ to jednak pomyśleć o modyfikacji same- sy Działka i Zwierzę reprezentują zu-
nie mają żadnych atrybutów ani nie są go modelu. pełnie różne byty, nie mające ze sobą nic
powiązane z innymi klasami, a więc jedy-
nym ich zadaniem jest grupowanie pod-
klas. Umieszczanie w modelu takich klas
to zwykłe jego zaśmiecanie.
������
Nawet jeśli sporadycznie zdarza się na-
szej instytucji ubezpieczać np. pojazdy szy-
nowe czy specjalne, to zapewne wystarczy
wrzucić je do jednego worka, tworząc klasę
InnyPojazd i przyjmując, że obiekty tej kla-
sy będą ubezpieczane na zasadach niestan- ��������������� ����������������� �������� ����������
dardowych (w przeciwieństwie do np. sa-
mochodów osobowych, dla których obowią-
zuje pewna ustandaryzowana oferta). W ten
sposób otrzymamy model przedstawiony na
Rysunku 2 – bardziej zwięzły, niezaśmieco-
ny klasami nie należącymi do dziedziny sys- Rysunek 2. Uproszczona hierarchia klas pojazdów
temu.

Klasy (pozornie)
ze sobą niezwiązane
Nie zawsze jednak unikanie nadklas jest do- �������
brym rozwiązaniem. Czasami warto stwo- �������
rzyć wspólną nadklasę dla klas, które pozor- �����������������������
nie nie mają ze sobą nic wspólnego. ����

Wyobraźmy sobie system wspierający ������


���������������������������
naliczanie i wypłaty dopłat dla rolników.
Każdy rolnik objęty dopłatami posiada ���������������������������
zwierzęta oraz działki rolne (aby być rol-
nikiem, musi posiadać co najmniej jed-
�������
no zwierzę lub działkę rolną). Co roku za
każde posiadane zwierzę oraz każdą dział- ������� �������������������
kę rolną rolnikowi przysługuje dopłata. Za- ���������������
łóżmy dla uproszczenia, że kwota dopłaty ����

za zwierzę zależy od jego wagi, zaś kwo- ���������������������������


ta dopłaty za działkę – od jej powierzch-
ni. Aby system mógł naliczać dopłaty, mu-
simy w nim przechowywać dane wszyst-
kich rolników oraz posiadanych przez nich
zwierząt i działek. Moglibyśmy to robić Rysunek 3. Model systemu naliczania dopłat – bez użycia dziedziczenia
zgodnie z modelem przedstawionym na
Rysunku 3.
Model ten ma jedną wadę – dopuszcza
istnienie rolników, którzy nie posiadają
ani działek, ani zwierząt, co jest niezgod- �������
ne z podaną definicją rolnika. Tego ograni-
�����������������������
czenia nie da się niestety zapisać przy po-
mocy liczebności (1..* zamiast 0..*), bo
���������������������������
to oznaczałoby, że każdy rolnik musi po- ������ ����������������
siadać co najmniej jedno zwierzę i co naj- �������
mniej jedną działkę. W takiej sytuacji za- ��������������������������� ���������������������������
� ����
wsze możemy poradzić sobie, zapisując �������
(poza samym diagramem) dodatkową re-
gułę biznesową. Regułę taką zapisujemy ���������������
�������������������
najczęściej słownie (rolnik musi posiadać
co najmniej jedno zwierzę lub co najmniej jed-
ną działkę) lub w postaci wyrażenia (nie- ���������������������������
zmiennika – ang. invariant) w języku OCL
dla klasy Rolnik:

Działka->size + Zwierzę->size >= 1 Rysunek 4. Model systemu naliczania dopłat – z użyciem dziedziczenia

www.sdjournal.org 73
Akademia UML

wspólnego. Faktycznie, kawałek ziemi płata. I choćby z tego powodu warto stwo- na przykład za jakiś czas zostaną wprowa-
uprawnej rzadko kiedy przypomina zwie- rzyć dla nich wspólną nadklasę, taką jak na dzone dopłaty za budynki gospodarcze,
rzę hodowlane, więc trudno byłoby zna- Rysunku 4. wtedy wystarczy dodać kolejną podklasę
leźć dla nich wspólną nadklasę. Czy rze- Zauważmy, że model ten jest w 100% klasy PrzedmiotDopłaty. Podklasa ta bę-
czywiście? zgodny z przyjętą definicją rolnika, który dzie posiadała swoją implementację meto-
Pamiętajmy, że analiza nie polega na jak musi posiadać przynajmniej jeden przed- dy obliczDopłatę, która wyliczy wysokość
najwierniejszym odzwierciedleniu każde- miot dopłaty. Ponieważ mamy teraz jed- dopłaty np. w oparciu o powierzchnię użyt-
go detalu rzeczywistości, lecz na zamode- ną relację posiadania zamiast dwóch, mo- kową budynku.
lowaniu tych aspektów rzeczywistości, któ- żemy spokojnie użyć liczebności 1..*. Nie Taki rozszerzony model jest przedstawio-
re są istotne dla naszego zastosowania. A w jest nam więc już potrzebna dodatkowa re- ny na Rysunku 5.
kontekście naszego systemu obsługi dopłat, guła biznesowa. Zauważmy, że dodanie do naszego mo-
zwierzę i działka, mimo że tak od siebie Model ten ma jeszcze jedną istotną za- delu nowej podklasy nie wymaga jakichkol-
różne, mają jedną istotną cechę wspólną: letę: można go łatwo rozszerzyć o obsłu- wiek zmian w klasie Rolnik. Obiekt tej kla-
są przedmiotami, za które przysługuje do- gę kolejnych przedmiotów dopłaty. Jeśli sy, w celu obliczenia przysługującej dopła-
ty, po prostu sumuje dopłaty wyliczone dla
wszystkich swoich obiektów posiadania,
niezależnie od tego, czy są to działki, zwie-
rzęta, budynki, czy jeszcze inne, dodane
������� w przyszłości, obiekty.
W ten sposób, tworząc wspólną nadkla-
�����������������������
sę dla dwóch klas pozornie zupełnie ze so-
bą niezwiązanych, udało nam się stworzyć
���������������������������
model elegancki i rozszerzalny.

Reguły Coad’a
�������
Zasady dotyczące dziedziczenia, omówio-
ne w tym i w poprzednich odcinkach na-
������ ����������������
��������������� szego cyklu, powinny pomóc Czytelni-
������� �������������������
��������������������������� ��������������������������� kom uniknąć typowych błędów związa-
� ����
nych z dziedziczeniem. Stosując dziedzi-
��������������������������� czenie warto też sprawdzić zasadność je-
go użycia przy pomocy tzw. reguł Coad’a.
Jest to pięć podstawowych reguł sformu-
łowanych przez Petera Coad’a, jednego
z najbardziej znanych specjalistów zaj-
������������������
mujących się UML-em i projektowaniem
����������������������� obiektowym.
Reguła 1. i częściowo 5. dotyczy proble-
��������������������������� mu modelowania ról, przeanalizowanego
w SDJ 5 i 6/2009. W SDJ 5/2009 omówili-
śmy także regułę 2. Regułą 3. zajmiemy się
w kolejnym odcinku naszego cyklu. Regu-
ła 4. ma zaś charakter techniczny – doty-
Rysunek 5. Model systemu naliczania dopłat, rozszerzony o dodatkową podklasę czy klas pomocniczych wykorzystywanych
w implementacji (np. należących do biblio-
tek systemowych), więc na szczęście nie
Reguły Coad’a ma zastosowania przy tworzeniu modelu
Dziedziczenia należy używać tylko wówczas, gdy spełnione są wszystkie poniższe warunki: dziedziny biznesowej, w którym klasy po-
mocnicze zwyczajnie nie występują.
• Podklasa oznacza bycie rodzajem nadklasy, a nie bycie rolą graną przez nadklasę.
• Obiekt podklasy nigdy nie musi stać się obiektem innej klasy.
• Podklasa rozszerza odpowiedzialności nadklasy (a nie zmienia ich ani nie wyłącza).
• Podklasa nie rozszerza funkcjonalności klasy pomocniczej.
• W modelu dziedziny nadklasa reprezentuje rolę, transakcję lub urządzenie. SZYMON ZIOŁO
Główny konsultant w firmie RedPill, oferują-
(Na podstawie: Bob Tarr, Some Object-Oriented Design Principles, http://userpages.umbc.edu/
cej specjalistyczne szkolenia informatyczne
~tarr/dp/lectures/OOPrinciples.pdf)
oraz doradztwo w zakresie zarządzania pro-
jektami, modelowania procesów biznesowych
oraz analizy i projektowania systemów infor-
matycznych. Analityk biznesowy i systemowy,
W następnym odcinku specjalizujący się w analizie obiektowej, mo-
Za miesiąc poznamy polimorfizm – jeden z najważniejszych mechanizmów związanych z
dziedziczeniem. Zobaczymy, jakie pułapki związane z polimorfizmem czyhają na nas pod- delowaniu w języku UML oraz w XML-u i tech-
czas analizy. nologiach pokrewnych.
Kontakt z autorem: sziolo@redpill.com.pl

74 08/2009
W sprzedaży w salonach prasowych
w całej Polsce

więcej informacji na www.sdjournal.org


Prawo w IT

Prawo autorskie
dla programistów
Programista jako twórca dzieła w postaci programu
komputerowego
W przypadku, gdy programista tworzy program komputerowy, który
jest przejawem jego działalności twórczej, ma indywidualny charakter
i jest rezultatem jego pracy, wówczas taki program należy traktować jako
utwór w rozumieniu Prawa autorskiego. Sam programista powinien być
natomiast traktowany jako twórca.
• mającego indywidualny charakter (ory-
Dowiesz się: Powinieneś wiedzieć: ginalny, niepowtarzalny).
• Jakie cechy powinien posiadać program, • Twórcą może być tylko osoba fizyczna, na-
aby stanowić przedmiot prawa autorskiego; tomiast majątkowe prawa autorskie mogą Domniemywa się, że twórcą jest osoba, której
• Jakie znaczenie ma fakt wspólnego tworze- przysługiwać również osobie prawnej; nazwisko w tym charakterze uwidoczniono
nia programu komputerowego; • Zapisy umowy o pracę z programistą nie na egzemplarzach utworu lub której autorstwo
• Z czym wiąże się tworzenie programu kom- muszą być dla niego niekorzystne. podano do publicznej wiadomości w jakikol-
puterowego w ramach stosunku pracy. wiek inny sposób w związku z rozpowszech-
nianiem utworu. Celem takiego domniemania
jest jedynie ułatwienie ewentualnego ustalenia
możliwości zakwalifikowania maszyny jako osoby twórcy. Jak każde domniemanie prawne
twórcy czy też wyeliminowania programisty może być więc ono obalone. Dla takiego oba-
Poziom jako autora programu komputerowego, stano- lenia wystarczy udowodnienie, że osoba, któ-
trudności wi jedynie prawnicze science-fiction. rej nazwisko figuruje na egzemplarzu utwo-
Brak ustawowej definicji twórcy wyni- ru (np. na nośniku oprogramowania lub w in-
ka z faktu, iż to, czy dane dzieło ma cechy formacji zawartej w ramach interfejsu progra-
utworu, wynika nie z cech jego twórcy, ale mu), nie wniosła twórczego wkładu w tworze-

P
rzepisy ustawy z dnia 4 lutego 1994 r. z cech samego dzieła. Tworzenie przez usta- nie programu lub że wkład taki wniosła rów-
o prawie autorskim i prawach pokrew- wodawcę definicji twórcy mogłoby stano- nież inna osoba (w przypadku braku oznacze-
nych (tj. Dz. U. z 2006 r., Nr. 90, poz. wić o odwróceniu tej słusznej zasady. Zgod- nia faktu współautorstwa programu).
631 ze zm.), zwanej dalej Prawem autorskim, nie bowiem z art. 1 ust. 1 Prawa autorskie- Zgodnie z art. 8 ust. 1 ww. ustawy, prawo au-
nie wprowadzają wprost definicji twórcy, a tym go utworem jest każdy przejaw działalno- torskie przysługuje twórcy, o ile ustawa nie sta-
bardziej definicji programisty. Wydaje się, iż ści twórczej o indywidualnym charakte- nowi inaczej. Zasada ta dotyczy zarówno praw
z samej natury procesu twórczego wynika fakt, rze, ustalony w jakiejkolwiek postaci, nieza- majątkowych, jak i osobistych. Wyjątki od niej
iż twórcą może być wyłącznie osoba fizyczna. leżnie od wartości, przeznaczenia i sposobu mogą wynikać wyłącznie z ustawy, a nie z wo-
W kontekście jednakże specyfiki tworzenia pro- wyrażenia. Zgodnie z art. 1 ust. 2, w szcze- li stron. Jeden z takich wyjątków został uregu-
gramów komputerowych mogą jednak zaistnieć gólności przedmiotem prawa autorskiego są lowany w rozdziale 2 Prawa autorskiego i do-
na tym tle wątpliwości, związane z tym, iż nie utwory wyrażone słowem, symbolami ma- tyczy utworu zbiorowego, do którego autor-
da się ukryć, iż bez pomocy maszyny, jaką jest tematycznymi, znakami graficznymi (lite- skie prawa majątkowe przysługują producen-
komputer, powstanie tego typu dzieł nie było- rackie, publicystyczne, naukowe, kartogra- towi lub wydawcy (art. 11 Prawa autorskiego).
by ani możliwe, ani też celowe. Niemniej jed- ficzne oraz programy komputerowe). Drugi wyjątek, dotyczący właśnie autorskich
nak, aktualny stan prawny nie pozwala uznać Twórcą może być więc nazwany tylko ten praw majątkowych do programu komputero-
maszyny jako twórcy określonego dzieła (w tym programista, który jest autorem programu wego, zostanie omówiony w dalszej części ni-
programu komputerowego). Do czasu powsta- komputerowego: niejszego artykułu.
nia tzw. sztucznej inteligencji, mogącej w pełni Poza sytuacjami określonymi w Prawie autor-
zastąpić człowieka w zakresie procesu twórcze- • stanowiącego rezultat jego pracy; skim, inna osoba może stać się podmiotem pra-
go (do którego zaliczyć należy też sam pomysł, • stanowiącego przejaw działalności wa autorskiego poprzez nabycie tego prawa od
koncepcję, cele) i prawnego uregulowania sta- twórczej (rezultat działalności o cha- twórcy w drodze umowy o przeniesienie mająt-
tusu takich przedmioto-podmiotów, rozważanie rakterze kreacyjnym); kowych praw autorskich albo w drodze dziedzi-

76 08/2009
Prawo autorskie dla programistów

czenia. Takie nabycie prawa nie ma jednak cha- W kontekście uwag poczynionych w dalszej czę- że w umowie o pracę lub umowie cywilnopraw-
rakteru pierwotnego, nie dotyczy bowiem po- ści artykułu nie można też wykluczyć sytuacji, nej strony postanowiły inaczej. Taka teza może
wstania praw autorskich, tylko wynika z ich iż wspólne prawo majątkowe powstać może tak- jednak mieć uzasadnienie w przypadku, gdy
przeniesienia. że na rzecz różnych pracodawców zatrudniają- oprócz umowy o pracę, twórcę programu i je-
cych współautorów danego programu kompu- go pracodawcę łączyłby jeszcze inny stosunek
Współautorstwo programu terowego, jak również jednocześnie w odniesie- prawny poza pracowniczym.
Specyfika programów komputerowych powo- niu do jednego z współtwórców oraz osoby bę- Niezależnie od powyższego, należy stwier-
duje, że różne ich części (aplikacje, moduły itd.) dącej pracodawcą drugiego. dzić, iż jedynie odpowiednie zapisy umowy
mogą być tworzone, a czasem nawet wymagają Należy zauważyć, iż w zakresie współautor- o pracę lub innej umowy zawartej niejako „rów-
współpracy wielu osób. Zgodnie z art. 9 ust. 1 stwa istnieje wiele wątpliwości natury prawnej. nolegle” mogłyby wykluczyć nabycie przez pra-
Prawa autorskiego, współtwórcom przysługuje W szczególności zarówno doktryna prawa, jak codawcę majątkowych praw autorskich do pro-
prawo autorskie wspólnie. Domniemywa się, i orzecznictwo sądów nie dopracowały się jed- gramu utworzonego przez programistę w ra-
że wielkości udziałów (w tym prawie) są rów- nolitej koncepcji, czy aby doszło do współtwo- mach jego obowiązków pracowniczych. Nie ma
ne. Każdy ze współtwórców może żądać okre- rzenia dzieła, konieczne jest zawarcie pomię- więc przeszkód, aby na zasadzie swobody umów
ślenia wielkości udziałów przez sąd, na podsta- dzy twórcami porozumienia w tym zakresie. strony umowy ustaliły, iż część, a nawet całość
wie wkładów pracy twórczej. Ponadto, każdy W mojej ocenie takie porozumienie nie jest wy- majątkowych praw autorskich do programu
ze współtwórców może wykonywać prawo au- magane, jednakże za współautora nie można przysługuje twórcy, a nie pracodawcy. Jeżeli ist-
torskie do swojej części utworu mającej samo- uznać danej osoby wbrew jej woli. nieje więc taka potrzeba, programista powinien
dzielne znaczenie, bez uszczerbku dla praw po- O ile powyższy problem wydaje się być głów- dopilnować, aby tak istotne zapisy znalazły się w
zostałych współtwórców (w szczególności mo- nie teoretycznym, o tyle praktycznym (zwłasz- podpisywanej przez niego umowie. W praktyce
że mieć to znaczenie w przypadku tzw. progra- cza w odniesieniu do programów kompute- jednak zgoda pracodawcy na takie odstępstwo
mów wielomodułowych). Do wykonywania pra- rowych) może być problem zakwalifikowania związana być może z zakresem prowadzonej
wa autorskiego do całości utworu potrzebna osoby tworzącej poprawki do programu lub przez niego działalności. Wątpliwym więc wy-
jest zgoda wszystkich współtwórców. W przy- wprowadzającej do niego zmiany. O ile osoba daje się, aby zgodził się on na takie ukształtowa-
padku braku takiej zgody każdy ze współtwór- poprawiająca jedynie błędy w programie raczej nie wzajemnych praw i obowiązków np. w sytu-
ców może żądać rozstrzygnięcia przez sąd, któ- nie może, w mojej ocenie, pretendować do ro- acji, gdy dla celów prowadzonej przez niego dzia-
ry orzeka, uwzględniając interesy wszystkich li jego współtwórcy, o tyle postawienie takiej te- łalności elementarne znaczenie ma dysponowa-
współtwórców. zy w stosunku do osoby, która jest uprawniona nie pełnymi prawami majątkowymi do progra-
Natomiast każdy ze współtwórców może do dokonania zmiany w programie komputero- mów tworzonych przez jego pracowników. Nie
dochodzić roszczeń z tytułu naruszenia pra- wym, może być uzasadnione okolicznościami można jednak wykluczyć takiej sytuacji, gdy
wa autorskiego do całości utworu. Uzyskane faktycznymi. Zakres zmian może bowiem spo- pracodawca skłonny będzie do odstąpienia od
w drodze dochodzenia tych roszczeń świad- wodować, iż powstanie właściwie nowy utwór. przysługujących mu ustawowo uprawnień przy-
czenie przypada wszystkim współtwórcom, W takim przypadku trudno odmówić wprowa- najmniej w zakresie części majątkowych praw
stosownie do wielkości ich udziałów. dzającemu zmiany w programie cech pozwala- autorskich. Brak jest jednak przepisów, które
Zgodnie z art. 9 ust. 5 Prawa autorskiego, do jących na uznanie go jako współautora. wprowadzałyby po stronie pracodawcy obowią-
autorskich praw majątkowych przysługujących zek rezygnacji z tych uprawnień.
współtwórcom stosuje się odpowiednio przepi- Pracodawca jako podmiot Warto również zaznaczyć, iż art. 14 wpro-
sy Kodeksu cywilnego o współwłasności w czę- majątkowych praw autorskich wadza odmienne zasady nabywania majątko-
ściach ułamkowych. Takimi przepisami będą na Zgodnie z art. 74 ust. 3 Prawa autorskiego, pra- wych praw autorskich i korzystania z nich niż
przykład przepisy o zniesieniu współwłasności. wa majątkowe do programu komputerowego art. 74 ust. 3 Prawa autorskiego. Należy jed-
W odniesieniu do programów komputerowych stworzonego przez pracownika w wyniku wy- nak stwierdzić, iż w sytuacji, gdy program
zastosowanie może mieć zwłaszcza art. 212 ust. konywania obowiązków ze stosunku pracy przy- komputerowy stanowi jednocześnie utwór dy-
Kodeksu cywilnego, zgodnie z którym rzecz, sługują pracodawcy, o ile umowa nie stanowi in- daktyczny regulacje szczególne (art. 74 ust. 3)
która nie daje się podzielić, może być przyznana aczej. Przepis ten wprowadza zasadę pierwot- dotyczące programów komputerowych wyłą-
stosownie do okoliczności jednemu ze współ- nego nabycia majątkowych praw autorskich czają zastosowanie art. 14 Prawa autorskiego.
właścicieli z obowiązkiem spłaty pozostałych al- przez pracodawcę twórcy w tych przypadkach, Nie ma jednak przeszkód, aby również w ta-
bo sprzedana stosownie do przepisów Kodeksu gdy program został stworzony przez pracowni- kim przypadku umowa o pracę zawierała po-
postępowania cywilnego. ka przy wykonywaniu obowiązków ze stosun- stanowienia bardziej korzystne dla programi-
Należy zauważyć, iż ustalenie kręgu współ- ku pracy. sty – pracownika naukowego, w tym również
autorów programu komputerowego nie może Należy zauważyć, iż przepis ten ma zasto- analogiczne do regulacji zawartych w art. 14
być wynikiem ustaleń umownych (nie ograni- sowanie wyłącznie w przypadku istnienia sto- ustawy.
cza to jednak możliwości przeniesienia udzia- sunku pracowniczego pomiędzy twórcą pro-
łu w majątkowych prawach do programu). Je- gramu a innym podmiotem. Zgodnie z ogól- PIOTR PRZEGALIŃSKI
dynie stan faktyczny może być podstawą dla nie obowiązującą zasadą prawa, iż wyjątków nie Radca prawny, absolwent Wydziału Prawa, Pra-
wiarygodnego ustalenia kręgu współtwórców należy interpretować rozszerzająco, regulacja ta wa Kanonicznego i Administracji Katolickiego
programu. W szczególności ustalenie takie po- nie będzie miała odpowiedniego zastosowania Uniwersytetu Lubelskiego. Prowadzi indywidual-
winno obejmować zakres i rodzaj dokonanej do umów o charakterze zbliżonym do umowy ną Kancelarię Radcy Prawnego w Warszawie. Po-
przez potencjalnego współautora pracy o cha- o pracę (np. umowa o dzieło, umowa zlecenia). siada doświadczenie w obsłudze prawnej przed-
rakterze twórczym. Jednakże, zgodnie z wyrokiem Sądu Najwyż- siębiorców, w tym również oferujących zaawan-
W odniesieniu do programu współtworzo- szego z dnia 9 stycznia 2001 r. (sygn. akt I PKN sowane narzędzia i usługi informatyczne dla
nego przez wiele osób, z mocy ustawy, powstaje 493/00), właścicielem praw autorskich do progra- przedsiębiorstw.
więc na rzecz jego programistów w sposób pier- mu komputerowego wykonanego w ramach obo- Kontakt z autorem: piotrprzegalinski@krpp.pl,
wotny wspólne autorskie prawo majątkowe. wiązków pracowniczych jest pracodawca, chyba www.krpp.pl

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

Skontaktuj się z nami:


tel. +48 22 877 20 80
fax: +48 22 877 20 70
software@europress.pl

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ące
and operating systems. Our browser can deliver architektury ery post-J2EE/.NET, wykorzystujące
a faster, more stable and flexible Internet expe- MDD/MDA dla dziedzin – bankowość, telekomuni-
rience than its competitors. kacja, 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 technolo-
konsolowych oraz PC – szuka utalentowanych ko- giczna działająca na globalnym rynku oprogramo-
derów (bardzo dobra znajomość C/C++; Java, Del- wania. Jesteśmy zespołem wysokiej klasy specja-
phi, UML), doświadczonych grafików (2D, 3D) oraz listów posiadających wiedzę i doświadczenie nie-
zespołów developerskich. Oferujemy długotermi- zbędne do realizacji ambitnych projektów informa-
nową pracę nad poważnymi projektami. Nie prze- tycznych. Jeśli programowanie to Twoja pasja do-
gap tej okazji! łącz do nas! (możliwość pracy zdalnej).

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

Kei.pl WSISiZ w Warszawie


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

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

Playsoft
Playsoft jako lider portowania aplikacji na plat-
formy mobilne wciąż powiększa bazę swo-
ich klientów: EA Mobile, Sega, THQ, Kona-
mi. W ramach rozszerzania swojej działalno-
ści, poszukujemy doświadczonego programi-
sty, który byłby odpowiedzialny za tworzenie
aplikacji na platformy Iphone, Windows Mobi-
le, Android.
http:// www.playsoft.fr
KLUB PRO

INFOTEX SP.J
Śmietanowski i Wsp.
Dystrybutor XP Unlimited – Serwer Terminali dla
Windows XP i VISTA. Program umożliwia łącze-
nie się z dowolnego klienta Windows, Linux z wy-
korzystaniem protokołu RDP. Cena wersji Classic
dla 5 użytkowników - 165€, dla nieograniczonej
liczby - 235€. Ponadto oferujemy opiekę serwiso-
wą i aplikacje internetowe na zamówienie.

http://www.infotex.com.pl

StatConsulting TTS Company Sp. z o.o.


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

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

IT SOLUTIONS Softline rozwiązania mobilne


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

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

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


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

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

Systemy bankowe, ISOF


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

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

UWAGA!
naszych czytelników, prezentujemy zarówno najnowsze
rozwiązania, jaki starsze, sprawdzone technologie.

Zmiana danych
kontaktowych

Obsługa prenumeraty
1. Telefon 3. Adres
+48 22 877 20 80 EuroPress Polska Sp. z o.o.
2. Fax ul. Jana Kazimierza 46/54
+48 22 877 20 70
01-248 Warszawa
2. Online
software@europress.pl
Zamówienie prenumeraty

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


00 48 22 877 20 70
lub listownie na adres:
EuroPress Polska Sp. z o.o.
ul. Jana Kazimierza 46/54
01-248 Warszawa
Polska
E-Mail: software@europress.pl

Przyjmujemy też zamównienia telefoniczne:


00 48 22 877 20 80

Jeżeli chcesz się dowiedzieć o formach płatności, wejdź na stronę:


www.europress.pl lub napisz na e-mail: software@europress.pl

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

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

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

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

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

0
+48 22 877 20 8
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
l szybka dostawa Tytuł
Ilość
nume-
zama- numeru
wianych pisma Cena
l prezenty rów prenu- lub mie-
merat siąca
l bezpieczna płatność Software Developer’s
Journal (1 płyta CD) 12 250
on–line – dawniej Software 2.0 PLN
W NASTĘPNYM NUMERZE SOFTWARE DEVELOPER’S JOURNAL 9/2009 (177)

Kolejny numer SDJ poświęcimy Bazom danych


W numerze znajdą się między innymi artykuły:
• SQL Server Data Access Components
• Bazy danych – współpraca z popularnymi technologiami

Do współpracy zaprosiliśmy również firmy IBM I Oracle.

Ponadto w magazynie:
• Klub Techniczny Adobe
• Stałe elementy:
• Prawo w IT, W sprz
• Akademia UML, ed
po łow aży w drug
ie sier i
• Porady dla programistów. pnia ej

seria
Nowa w na CD
ide o Kursó h Javie
V
św i ę conyc
po

Redakcja zastrzega sobie prawo do zmiany zawartości magazynu

You might also like