You are on page 1of 84

03/2009

SPIS TREŚCI
06 Aktualności wykorzystać kartę graficzną do obliczeń niekoniecznie związanych
Rafał Kocisz z grafiką komputerową. Następnie użyjemy typowych rozwiązań
mających na celu znaczne przyspieszenie obliczeń.
35 Opis CD
Duży zbiór materiałów od firmy nsoftware
36 Facebook dla programistów
Włodzimierz Kozłowski
Facebook jest nie tylko klasycznym serwisem społecznościowym,
BIBLIOTEKA MIESIĄCA lecz także platformą umożliwiającą tworzenie własnych aplikacji.
12 Biblioteka Luabind W artykule pokażemy jak przygotować i opublikować przykładową
Rafał Kocisz aplikację dla Facebooka współpracującą z serwisem aukcyjnym Al-
Lua oraz C++ bardzo ładnie uzupełniają się jako języki programowa- legro.
nia; niestety – ich łączenie przy pomocy podstawowego API oparte-
go na czystym C jest delikatnie mówiąc – zniechęcające. Na pomoc
przybywa Luabind: nowoczesna biblioteka C++, dzięki której łącze-
nie Lua i C++ staje się proste i przyjemne. BEZPIECZEŃSTWO
42 Zabezpieczanie systemów IT
Aleksander Jachowicz
PROGRAMOWANIE JAVA Coraz więcej słyszymy o ochronie bezpieczeństwa systemów in-
20 Spring Java Configuration Project formatycznych. Wynika to z tego, że pojawia się coraz więcej do-
Henryk Konsek niesień prasowych o włamaniach na konta klientów banków lub
Twórcy projektu Spring Framework spróbowali zminimalizować o przypadkach wykradzenia dużej ilości danych osobowych. W ar-
ilość konfiguracji XML poprzez przeniesienie źródeł definicji kompo- tykule Aleksander Jachowicz omawia Adaptive Access Manager fir-
nentów do plików języka Java. Spring Java Configuration Project to my Oracle.
alternatywa dla klasycznego podejścia do zagadnienia konfiguracji
aplikacji internetowych, która równocześnie nie narusza wzorca In-
version Of Control oraz ogólnej elegancji architektury naszej apli-
kacji. TESTOWANIE OPROGRAMOWANIA
46 Praca z zespołem testerów klienta
Karolina Zmitrowcz
Karolina Zmitrowicz w artykule przedstawia studium przypadku do-
WARSZTATY tyczącego procesu testowania systemu bankowego w środowisku
28 CUDA się zdarzają, czyli programowanie GPGPU klienta. Zostaną przedstawione problemy wynikłe w trakcie organi-
Jacek Piekarski zacji testowania oraz czynności przedsięwzięte w celu ich elimina-
W artykule dowiemy się co nieco o CUDA z praktycznego punktu wi- cji i osiągnięcia satysfakcjonującego poziomu współpracy pomiędzy
dzenia. Na konkretnym przykładzie zobaczymy, jak w prosty sposób dostawcą oprogramowania a klientem.

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


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

4 03/2009
54 Jakość czy jakoś to będzie? nym wykonaniu jest zadaniem wyjątkowo kłopotliwym. Formalna
Zbigniew Zarzycki weryfikacja przez model jest jedną z metod mających na celu wyka-
Odpowiedź na pytanie czy tworzone oprogramowanie jest wystar- zanie poprawności oraz niezawodności takich systemów.
czająco dobre do uruchomienia produkcyjnego wymaga złożone-
go procesu decyzyjnego. IBM Rational Quality Manager jest rozwią-
zaniem, które może podjąć tę odpowiedzialną decyzję w oparciu
o wiarygodne dane, dostarczane w czasie rzeczywistym. FELIETON
74 Aby wielu mogło na raz...
Arkadiusz Merta
58 WebAii – testowanie aplikacji ASP .NET
Paweł Wilkosz
Przyszłość należy do serwisów internetowych. Ogólna powszech- 77 Najpierw cele
ność Internetu, świadczenie usług na odległość czy też rozwój urzą- Arkadiusz Merta
dzeń mobilnych są argumentami umacniającymi Pawła w przekona-
niu, iż to właśnie aplikacje webowe będą najbardziej kojarzone z in-
żynierią oprogramowania za parę lat.

TECHNOLOGIE INTERNETOWE
62 Zintegruj się z Internet Explorer 8
Bartłomiej Zass
Już niedługo premiera kolejnej wersji przeglądarki firmy Microsoft, któ-
ra otworzy przed programistami zupełnie nowe możliwości tworzenia
rozszerzeń. W artykule przedstawione zostały podstawy programowa-
nia tzw. akceleratorów, web slice’ów oraz search provider’ów, które po-
zwalają zintegrować nasze strony z przeglądarką Internet Explorer 8.

NARZĘDZIA
68 Weryfikacja przez model z narzędziem SPIN
Sławomir Maludziński
Współczesne programy wykorzystują więcej niż jeden wątek prze-
twarzania w celu zmniejszenia opóźnień bądź zwiększenia szybko-
ści działania. Niestety, zapewnienie o ich bezbłędnym oraz efektyw-

Rédacteur enpodczas
Uszkodzone chef : Marek Bettman
wysyłki marekb@software.com.pl
płyty wymienia redakcja.
Rédacteurs : Aneta Cejmańska anetta@software.com.pl
Ewa Dudzic
Wszystkie ewal@software.com.pl
znaki firmowe zawarte w piśmie są własności odpowiednich firm.
Préparation
Zostały użyteduwyłącznie
CD : Aurox Core Team
w celach informacyjnych.
Maquette : Anna Osiecka annao@software.com.pl
Couverture : Agnieszka
Redakcja używa systemuMarchocka
automatycznego składu
Traduction : Iwona Czarnota, Aneta Lasota, Marie-Laure Perrotey,
Grazynazainteresowane
Osoby Wełna współpracą prosimy o kontakt:
Bêta-testeurs : Thomas Bores, Tony Boucheau, Pascal Foulon, Pascal Miquet,
cooperation@software.com.pl
Romain Lévy, Augustin Pascual, Julien Poulalion, Alain Ribault
Druk: ArtDruk
Les personnes intéressées par la coopération sont priées de nous contacter :
cooperation@software.com.pl

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

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

www.sdjournal.org 5
Aktualności

Mniej telefonów z Windows Mobile


Microsoft przewiduje, że w przyszło- 25 najniebezpieczniejszych
błędów programistycznych
ści coraz mniej telefonów komórkowych
będzie wyposażonych w system operacyj-
ny Windows Mobile. W związku z rosnącą

P
konkurencją Microsoft chce przebudować onad 30 organizacji związanych z dostarczenie minimalnego zestawu wyma-
i ulepszyć swój system. Będzie się to wiąza- rynkiem IT połączyło siły, aby pod gań, jakie powinno spełniać oprogramowa-
ło z umieszczaniem WM na mniejszej licz-
bie telefonów po to, aby móc skupić wysił-
kierownictwem ekspertów z Agen- nie, zanim trafi w ręce użytkowników. Nie-
ki programistów i lepiej dostosować system cji Bezpieczeństwa Narodowego USA (U.S. którzy widzą w nim również kartę przetar-
do wymagań konkretnych urządzeń. Obec- National Security Agency), Departamentu gową, której można użyć przy negocjacjach
nie Windows Mobile można spotkać na 140 Bezpieczeństwa Krajowego Stanów Zjedno- między producentem oprogramowania a na-
modelach telefonów. System ten ma coraz czonych (Department of Homeland Securi- bywcą. Jest to też część większego zestawu
liczniejszą konkurencję. Oprócz Symbiana
ty), firm Microsoft i Symantec, opracować dokumentów, który być może będzie uży-
jest jeszcze Android. Nowy system opera-
cyjny przeznaczony do zastosowań mobil- dokument zawierający listę najbardziej nie- wany przez agencje stanowe do certyfikacji
nych, o nazwie WebOS, opracowuje rów- bezpiecznych błędów, jakie popełniają pro- oprogramowania. Niestety, na chwilę obec-
nież firma Palm. gramiści. Na liście znajdziemy takie błę- ną, perspektywy certyfikacji ograniczają się
http://www.nytimes.com/ dy jak: zostawianie „otwartych drzwi” dla do projektów wykonywanych na zamówie-
różnych ataków, wysyłanie kluczowych in- nie i prawdopodobnie oprogramowanie z
Microsoft-Yahoo!: reaktywacja?
Temat przejęcia Yahoo! przez Microsoft formacji w postaci łatwego do odczytania certyfikatem bezpieczeństwa będzie przy-
wydawał się być sprawą zamkniętą, a tym- czystego tekstu, zapisywanie haseł w ko- wilejem organizacji rządowych. Nie ma na
czasem okazuje się, że Microsoft poważ- dzie programu. Dwa z wymienionych błę- razie mowy o przyznawaniu takich certy-
nie myśli o dokończeniu transakcji, a przy- dów, zdaniem SANS Institute, spowodo- fikatów szeroko dostępnym produktom, na
najmniej o zakupie części firmy związanej wały, że ponad 1,5 miliona stron interneto- przykład systemom Microsoft Windows.
z wyszukiwaniem informacji w Internecie.
wych było wrażliwych na ataki. Celem, któ- http://www.sans.org/
Steve Ballmer powiedział w wywiadzie dla
Financial Times, że właśnie teraz jest najlep- ry przyświecał twórcom dokumentu, było
szy moment na sfinalizowanie tej sprawy.
Obie firmy są bowiem w fazie ważnych
zmian jeśli chodzi o kadrę zarządzającą. Qi
Lu, były szef działu wyszukiwania w Yahoo! Słabość MD5 poważnym
pracuje teraz jako dyrektor działań on-line
w firmie Microsoft. Yahoo! szuka również
nowego dyrektora zarządzającego; główne
zagrożeniem dla SSL
P
kandydatki to wywodząca się z Autodesk odczas odbywającej się w Niemczech gdy przeglądarki nie zwrócą uwagi na ten fakt,
Carol Barz oraz Susan Decker, aktualna pre- 25 edycji Chaos Communication Con- gdyż witryny te identyfikować się będą rze-
zydent Yahoo!. Wypowiedź Ballmera może gress, Alex Sotirov i Jacob Appelbaum komo prawdziwymi certyfikatami SSL. Zda-
dziwić, zwłaszcza biorąc pod uwagę fakt, że
zaprezentowali sposób na stworzenie fałszywe- niem Sotirova, urzędy certyfikacyjne muszą
jeszcze całkiem niedawno stanowczo odci-
nał się on od pomysłów wznawiania oferty go certyfikatu SSL wykorzystując słabość al- natychmiast zaprzestać wykorzystywać MD5
przejęcia Yahoo!. gorytmu kryptograficznego MD5. W tym ce- na rzecz SHA-1. Szczegóły ataku dostępne
http://vnunet.com/ lu wykorzystali moc klastra składającego się z są na stronie autorów (http://www.win.tue.nl/
200 konsol PlayStation 3. Pomyślne wykona- hashclash/rogue-ca/). Bardziej szczegółowe in-
Rok 2009 pod znakiem phishingu
nie ataku jest możliwe poprzez wykorzystanie formacje przesłane zostały producentom prze-
Jak zapowiada serwis ITPro powołując się na
raport firmy McAfee, w 2009 roku wzrośnie tak zwanej kolizji MD5, która pozwala na iden- glądarek internetowych. Również Microsoft
ilość botnetów zbierających dane wykorzy- tyfikowanie różnych danych przez tą samą su- w odpowiedzi na doniesienia o ataku opubli-
stywane do szantażowania lub sprzeda- mę kontrolną. Grupa była w stanie wygenero- kował biuletyn bezpieczeństwa. Póki co nie
ży na czarnym rynku. Z raportu wynika, że wać certyfikat imitujący jeden z tak zwanych odnotowano prób wykorzystania luki, nale-
coraz częściej celem ataku stawać się będą root CA - głównych urzędów certyfikacji, któ- ży mieć jednak na uwadze, że połączenie jej
przeglądarki jako element najsłabiej zabez-
pieczony. Praktyki takie jak kradzież wła-
rych certyfikaty służące do podpisywania in- ze wspomnianą luką w systemie DNS mo-
sności intelektualnej lub dostęp do danych nych certyfikatów znajdują się na listach za- że stworzyć bardzo realne i poważne zagroże-
klientów stają się celem włamywaczy, nie ufania wszystkich przeglądarek. Umożliwia nie. Na reakcje firm nie trzeba było długo cze-
tylko w firmach, ale także w gospodar- to wygenerowanie i podpisanie certyfikatu wi- kać. Dla przykładu, VeriSign, jeden z najwięk-
stwach domowych. Z tego powodu wiele tryny, który będzie nieodróżnialny od orygi- szych wystawców certyfikatów, ogłosił zaprze-
instytucji zmuszonych będzie do zmiany
nalnego. Po wejściu na tak spreparowaną stro- stanie korzystania z podważonego przez Soti-
polityk bezpieczeństwa wynikających z
naruszania poufnych danych, których kra- nę, przeglądarka automatycznie uzna ją za bez- rova i Appelbauma algorytmu hashującego w
dzieże zwykle bywają próbą zarobku albo pieczną - dane przesyłane będą poprzez połą- swoich certyfikatach na rzecz SHA-1. MD5
ataków. Raport przewiduje ponadto wzrost czenie szyfrowane (https), a na pasku stanu był jak dotąd wykorzystywany w certyfikatach
wyłudzeń wywołany wykorzystywaniem wyświetlana zostanie budząca zaufanie kłód- RapidSSL. Jak zapewnia VeriSign, były to jedy-
bezrobocia w postaci różnego rodzaju wia- ka potwierdzająca autentyczność certyfika- ne certyfikaty tej firmy podatne na atak. Wy-
domości z fałszywymi programami szkole-
tu. Według badaczy, połączenie kolizji MD5 stawca obiecuje dodatkowo, że certyfikaty wy-
niowymi i certyfikacyjnymi. Podobnie sytu-
acja ma się w przypadku ofert rekrutacji z z odkrytą parę miesięcy temu luką w systemie stawione z hashem MD5 zostaną wszystkim
prośbami o CV i dane osobowe, rzekomych nazw DNS może mieć poważne konsekwen- klientom RapidSSL nieodpłatnie wymienione
pożyczek czy pracy w domu. cje. Użytkownicy będą mogli być przekierowy- na nowe, wykorzystujące algorytm SHA-1.
http://www.itpro.co.uk/ wani na podrobione witryny banków, podczas http://www.techit.pl/

6 03/2009
Aktualności

Windows 7 i 2008 R2 Co drugi Polak korzysta z Internetu


Jak wskazują wyniki badań opubliko-

Beta dostępne publicznie


wanych przez NetTrack przeprowadzo-
nych przez MillwardBrown SMG/KRC, już
prawie połowa Polaków (47,1%) posia-

Z
godnie z zapowiedziami Micro- da dostęp do Internetu. Według badań
soft udostępnił publicznie do po- za okres wrzesień - listopad 2008, 71,9
proc. osób mających dostęp do Interne-
brania wersję beta systemu Win- tu korzysta z niego codziennie, 17,5 proc.
dows 7 oraz jego serwerowego odpowiedni- kilka razy w tygodniu, 5,2 proc. raz na
ka: Windows Server 2008 R2. Od 8 stycznia tydzień, a 3,4 proc. kilka razy w miesiącu.
2009 roku obie bety mogli pobierać posiada- Równy 1% badanych korzysta z Internetu
cze płatnych subskrypcji TechNet i MSDN raz na miesiąc lub rzadziej. Zdecydowa-
na większość badanych (88 proc.) korzy-
oraz zaproszeni przez Microsoft uczestni-
sta z Internetu w domu, jedna czwar-
cy technicznego programu beta. Aktualnie ta (23,7 proc.) w pracy, 9 proc. w szkole
Windows 7 i Windows Server 2008 R2 mo- lub na uczelni, 6 proc. u znajomych, a
gą pobrać wszyscy zainteresowani. Udostęp- 1 proc. w kawiarence internetowej lub
niona kompilacja oznaczona jest numerem w sklepie komputerowym. Najsilniejszą
7000.0.081212-1400. Warto więc zauwa- sprzętu na to, że wydanie nowego systemu grupę internautów stanowią niezmiennie
osoby w wieku pomiędzy 25 i 39 rokiem
żyć, że jest to identyczny build, który wy- może nastąpić nieco później. Podczas targów
życia (36 proc.). Ponad połowa użytkow-
ciekł jeszcze przed świętami do sieci torren- CES w Las Vegas Bill Veghte, jeden z mene- ników (51 proc.) to mężczyźni korzysta-
towych, skompilowany 12 grudnia. Plik ob- dżerów działu Windows w firmie Microsoft, jący z Internetu na ogół powyżej 5 lat
razu płyty ISO z systemem Windows 7 w mówił w wywiadzie dla CNET, że producen- poprzez stałe łącze. Najczęściej odwie-
wersji 32-bitowej zajmuje 2,43 GB, wersja ci sprzętu są przygotowywani na termin tego- dzana strona to Google. Ilość osób korzy-
64-bitowa jest nieco „cięższa” - waży 3,15 roczny i przyszłoroczny. Wydamy system do- stających z Internetu w badanym okresie
wzrosła o nieco ponad cztery punkty pro-
GB. Windows Server 2008 R2 występuje je- piero wtedy, gdy jego jakość będzie zadowalają- centowe w stosunku do początku 2008
dynie w wersji 64-bitowej, jego obraz w edy- ca - tłumaczył Veghte. Dał również do zrozu- roku, kiedy liczba ta oscylowała w okoli-
cji Standard zajmuje 2,78 GB, w edycji En- mienia, że na moment premiery może mieć cach 45%. Oznacza to, że dynamika wzro-
teprise 2,45 GB, zaś w edycji Web 2,66 GB. wpływ sytuacja ekonomiczna, a konkretnie stu popularności Internetu spadła, w
Klucze produktów do aktywacji wersji beta konieczność zaciskania pasa przez Microsoft ciągu 2007 roku wzrosła o ok. 10%.
http://www.millwardbrown.com/pl
udostępniono na stronie pobierania. Pozwa- i cięcia finansowe w marketingu. Co prawda,
lają one na użytkowanie systemu do 1 sierp- jak na razie są to tylko spekulacje i być mo- Jak bardzo Google
nia 2009. W tym miejscu należy podkreślić, że żadnych opóźnień nie będzie, aczkolwiek zanieczyszcza środowisko?
że jest to wczesna wersja beta z licznymi, czę- – jeśli takowe się pojawią, to mogą być fa- Do ciekawych wniosków doszli auto-
ściowo już znanymi, problemami. W rezulta- talne w skutkach dla Microsoftu; zwłaszcza rzy wydanego jakiś czas temu rapor-
tu, który dowodził, że Google uwalnia
cie nie jest zalecana jej instalacja na kompu- rozmowy z producentami sprzętu są w tym
do atmosfery taką samą ilość dwutlenku
terach wykorzystywanych do codziennej pra- przypadku krytyczne. To między innymi na węgla w dwóch wynikach wyszukiwania,
cy. Przy okazji wypuszczenia bety Windows skutek wielokrotnego przekładania premiery ile jest potrzebne do zagotowania czaj-
7 pojawiły się nowe informacje odnośnie pre- Visty producenci sprzętu nie zdążyli na czas nika wody. Jak wyjaśnia Google, zanie-
miery nowego systemu rodem z Redmont. z przygotowaniem wielu sterowników, co wy- czyszczenie środowiska wynika z rosną-
Microsoft jak dotąd stanowczo zapewniał, że wołało falę niezadowolenia ze strony pierw- cego zapotrzebowania na energię elek-
tryczną potrzebną do zasilenia centrów
premiera nowych Okienek odbędzie się jesz- szych użytkowników.
danych. Te są wymagane, aby odpowie-
cze w 2009 roku. Okazuje się jednak, że pro- http://www.microsoft.com/poland; dzi na zapytania użytkowników pojawiały
ducent po cichu przygotowuje producentów http://www.cnet.com/ się w możliwie jak najkrótszym czasie. W
ten sposób przez każdą sekundę połącze-
nia z Internetem produkowanych zosta-

Samsung będzie tworzył je 0,2 grama dwutlenku węgla. Typowe


wyszukiwanie trwa 0,2 sekundy, zapyta-

oprogramowanie w Warszawie nie jest wysyłane i przetwarzane przez


serwery w kilka tysięcznych sekundy.
Pojedyncze wyszukiwanie zużywa 1kJ

M
inisterstwo Gospodarki i Sam- mowaniu dla telefonów komórkowych typu (0,0003 kWh), średnia dzienna dla doro-
sung Electronics Polska infor- smartphone i featurephone - znajdzie ono słego człowieka to 8000 kJ. Dla przykła-
du, ilość dwutlenku węgla emitowana
mują o rozpoczęciu wieloletnie- zastosowanie na platformach Windows, Li-
przez samochód pokonujący trasę jed-
go programu inwestycyjnego w naszym kra- nux i Symbian. Budżet państwa dodatkowo nego kilometra - odpowiada tysiącowi
ju. Program zakłada powstanie w Warsza- udzieli wsparcia finansowego w wysokości zapytań. W 2008 roku Google zainwesto-
wie Telekomunikacyjnego Centrum Badań 3,7 mln złotych; Samsung łącznie wyda po- wało 45 milionów dolarów na technolo-
i Rozwoju. Centrum będzie największym i nad 42 mln złotych. Szacuje się, iż do koń- gie energetyczne, zaś rok wcześniej zaini-
głównym ośrodkiem rozwoju oprogramowa- ca 2016 roku dzięki realizacji tej inwesty- cjowała grupę Climate Savers Computing
Initiative zajmującą się cięciem kosztów
nia telekomunikacyjnego Samsung Group. cji do polskiego budżetu wpłynie około 23
energii. Na przyszły rok gigant z Mounta-
Firma zainwestuje w Polsce blisko 25 milio- mln złotych. in View planuje redukcję emisji CO2 o 54
nów złotych i zatrudni 250 osób. Prace pro- http://www.mg.gov.pl/ milionów ton rocznie.
wadzone będą głównie z myślą o oprogra- http://neowin.net/

www.sdjournal.org 7
Aktualności

Microsoft Tag zamieni


długie linki na obrazki
Podczas targów CES 2009 Microsoft ogło-
Plany Apple na 2009 rok
P
sił dostępność nowej usługi (na razie dzia- hil Schiller na konferencji MacWorld
łającej w fazie beta): Microsoft Tag. Usługa Expo wygłosił keynote, w którym na-
ta umożliwia dostęp do zawartości on-line kreślił plany Apple na rok 2009. Głów-
nie na podstawie tradycyjnych, długich ną nowością, o której głośno było w Interne-
linków, a specjalnych kodów graficznych.
cie, jest nowy, 17-calowy MacBook Pro. Nie
Kod (tag) to niewielki kwadrat z koloro-
wym wypełnieniem tworzącym unikalny będzie on co prawda posiadał wymienialne-
wzór. Sama technika nie jest nowa, a idea go akumulatora, ale jego wbudowana bateria
funkcjonowania tej technologii jest bardzo ma wystarczać na 8 godzin pracy, tudzież na
prosta - wystarczy uruchomić aplikację ska- 7 - jeśli wykorzystywany będzie układ graficz-
nującą w telefonie lub urządzeniu przeno- ny 9600GT zamiast 9400M. Niemożliwość
śnym wyposażonym w kamerę i skierować
obiektyw na kod. W odpowiedzi, po rozpo-
samodzielnej wymiany baterii będzie rekom- nych zdecydowano się też na elastyczne ce-
znaniu kodu przez aplikację, od razu uru- pensowana przez opcję wymiany przez ser- ny, najtańsze utwory będą dostępne już od
chamiana jest przeglądarka i strona przy- wis. Nowy MacBook ma posiadać dysk twar- 69 centów. Najnowsze utwory mają koszto-
pisana do zeskanowanego wzoru. Micro- dy o pojemności 320 GB, 4 GB RAM i proce- wać 1,29 dolara. Apple ogłosiło także betę ser-
soft Tag to jednak coś więcej niż tylko klon sor 2,66 GHz. Cenę urządzenia ustalono na wisu iWork.com, wzorowany na Google Docs.
już istniejących usług tego typu, na przy-
2799$. Dostępna jest także wersja z matową Będzie on dostępny w ramach pakietu iWork
kład czarno-białych kodów QR. Propo-
nowane przez Microsoft tagi korzystają z matrycą, ostatnimi czasy bardzo rzadko spoty- 2009 za opłatą, której wysokość zostanie usta-
kolorowych wzorów i opierają się o bar- kaną w notebookach, a dla wielu osób (szcze- lona później. Obecnie iWork 2009 dostępny
dziej nowoczesną technologię High Capa- gólnie dla programistów) wygodniejszą od jest w Apple Store za 79$ oraz w opcji „family
city Color Barcode, opracowaną notabene matrycy błyszczących. Kolejna ważna wiado- pack” za 99$, gdzie nabywa się 5 licencji jed-
przez badaczy z Microsoft Research. Dzięki mość to stopniowa rezygnacja z DRM w iTu- nocześnie. Pakiet można też kupić za promo-
zastosowaniu kolorów przestrzeń potrzeb-
nes. Obecnie już 8 milionów utworów jest do- cyjną cenę 49$ przy zakupie dowolnego kom-
na do przechowania tej samej informacji
jest mniejsza, więc tag można łatwiej zmie- stępnych bez tego zabezpieczenia, do końca putera Mac.
ścić na stronach gazet, plakatach czy nawet marca będzie to ponad 10 milionów. W od- http://www.apple.com/
koszulkach lub samochodach. Microsoft powiedzi na żądania koncernów fonograficz-
Tag może wypróbować każdy; aplikacja
na telefon dostępna jest do pobrania bez-
płatnie, na tej samej stronie można zna-
leźć również testowy wzór do zeskanowa- Renaissance – nowy
interfejs OpenOffice.org
nia. Możliwe jest również stworzenie wła-
snego tagu. W fazie beta komercyjne wyko-
rzystanie tagów jest dozwolone bez żad-

P
nych opłat. od koniec 2008 roku Frank Loeh- jednak trzeba będzie je doinstalować ręcz-
http://www.microsoft.com/poland
mann, lider projektu OOo User Expe- nie. Od momentu aktywacji dodatek zapisu-
ICANN podsumowuje rok 2008 rience, publicznie ogłosił zainicjo- je wszelkie interakcje użytkownika z progra-
Organizacja ICANN (Internet Corporation wanie projektu „Renaissance”, którego ce- mem, takie jak np. wywołania okien dialogo-
for Assigned Names and Numbers), zaj- lem jest przeprojektowanie interfejsu pakie- wych, opcji menu, a także stosowanie skrótów
mująca się między innymi przyznawa- tu OpenOffice.org. W rzeczywistości projekt klawiszowych. W drugim etapie drużyna Lo-
niem domen internetowych, opublikowa-
ten jest nieco starszy, gdyż jego początki sięga- ehmanna zajmie się modelowaniem struktury
ła raport na temat swojej działalności w
roku 2008. Przygotowany raport koncen- ją czasów OOoCon’u 2008, które miało miej- menu, tak by najczęściej używane opcje były
truje się na osiągnięciach i postępie orga- sce w Pekinie, we wrześniu. Do grupy OO.o bardziej dostępne. Loehmann przy okazji po-
nizacji w 2008 roku. Czołowe miejsce zaj- UX dołączyli pracownicy firmy RedFlag, ci sa- informował, iż projekt nie będzie ograniczać
muje proces uwalniania domen najwyższe- mi, którzy zaprojektowali interfejs RedOffice- się do możliwości technicznych obecnego to-
go poziomu (TLD) i umożliwienie ich reje- ’a 4.0. Renaissance jest projektem długotermi- olkitu, a że zajmą się stworzeniem listy z wy-
stracji. Na dalszych pozycjach uplasowa-
nowym i raczej niemożliwe jest, aby jakiekol- maganiami (technicznymi i użytkowników),
ły się: wprowadzenie międzynarodowych
nazw domen oraz prace nad zorganizowa- wiek zmiany zauważono w zbliżających się a drużyna odpowiedzialna za rozwój progra-
niem konsultacji w sprawie mechanizmów wydaniach. Projekt został podzielony na trzy mu od strony wewnętrznej weźmie się za na-
zaufania pomiędzy podmiotami. Pozosta- fazy: badania, projekt i ocena. Aktualnie prace pisanie nowego szkieletu, który powinien w
ła część przedstawia szczegóły biograficz- skupione są na pierwszym etapie. By móc le- pełni sprostać oczekiwaniom. Misją projektu
ne każdego zarządu spółki i najważniej-
piej zrozumieć potrzeby użytkowników, Ope- jest stworzenie takiego interfejsu użytkowni-
sze plany organizacji. Prócz tego, dołączo-
no raporty z działania departamentów kor- nOffice.org 3.1 będzie dostarczany wraz z ka, aby Openoffice.org stał się wyborem użyt-
poracji, zawarto też krótką historię orga- rozszerzeniem „User Feedback”, którego zada- kownika nie tylko z potrzeby, ale i z pożąda-
nizacji z podziałem na ponad trzydzieści niem jest zapisywanie danych na temat użyt- nia. Wszystkie informacje o postępach pro-
międzynarodowych publicznych spotkań, kowania aplikacji OO i przesyłanie ich w ano- jektu mają być udokumentowane na oficjal-
jako że ICANN obchodził w ubiegłym roku nimowej formie do zespołu projektowego. Na nym blogu (http://ux.openoffice.org/blog/). Oso-
dziesięciolecie istnienia. Pełna treść rapor-
razie użytkownicy mogą swoje opinie wyra- by niezadowolone z obecnego interfejsu Ope-
tu jest dostępna na stronach ICANN (http:
//icann.org/en/annualreport/annual-report- zić za pośrednictwem internetowej ankiety. nOffice.org zaproszone są do partycypowania
2008-en.pdf) i liczy 133 strony. Wspomniane rozszerzenie będzie dostępne w tym przedsięwzięciu.
http://www.icann.org/ również dla OpenOffice.org w wersji 3.0.1, http://linuxnews.pl/

8 03/2009
Aktualności

Ruby on Windows 7 wydajniejszy


niż Vista oraz XP

Rails 3 = RoR 2 + Merb


Mimo że licencja dostępnych obecnie
wersji beta Windows 7 zabrania wykony-
wania testów wydajności, pierwsze porów-

M
iły prezent przygotowali progra- ści z Merb zostaną przeniesione do Rails. Rails nania zaczynają się już pojawiać. Jedno z
mistom deweloperzy framewor- stanie się bardziej agnostyczne pod względem nich przygotował Adrian Kingsley-Hughes
z ZDNet. Na dwóch platformach sprzęto-
ków Ruby on Rails oraz Merb. Pro- wyboru (narzucania użytkownikowi) techno-
wych (AMD Phenom 9700 2.4GHz z kartą
jekty te połączą się w jeden twór, wraz z wy- logii. Aktualnie stosowane rozwiązania będą ATI Radeon 3850 i 4 GB RAM oraz Intel Dual
daniem RoR 3.0 w 2009 roku. Optymaliza- wykorzystywane domyślnie (np. Active Re- Core E2200 2.2GHz z kartą GeForce 8400
cje i rozszerzenia Merba zostaną przeporto- cord), ale łatwe będzie wymienienie ich na al- GS i 1 GB RAM) przeprowadził on dwa-
wane do Rails. Warto przypomnieć, iż frame- ternatywne odpowiedniki preferowane przez dzieścia trzy testy wydajności Windows XP,
work Merb został stworzony przez Ezrę Zyg- programistę (np. Sequel/Data do mapowa- Visty oraz najnowszego biulda Windows 7
o numerze kompilacji 7000. Testy obejmo-
muntowicza mniej więcej dwa lata temu, ja- nia obiektowo-relacyjnego, Mapper czy jQu- wały typowe scenariusze - od instalacji sys-
ko lekka alternatywa dla Rails. Z czasem pro- ery dla Ajaksa). Nastąpi też powrót do idei ry- temu, przez jego uruchomienie, zamknię-
jekt zaczął się rozrastać, a oba projekty zaczę- gorystycznego API. Zbyt wiele wtyczek prze- cie, przeniesienie różnej wielkości plików
ły dzielić ze sobą coraz więcej kodu. Dewelo- staje działać po aktualizacji, co jest wynikiem między dyskami oraz przez sieć, kompreso-
perzy obu szkieletów programistycznych do- słabego zaakcentowania, które części API Ra- wanie danych, instalację Office 2007, ope-
racje na dokumentach Word i Excel, wypa-
szli do wniosku, że razem zdziałają więcej niż ils są stabilne, a które mogą być w najbliższej
lanie płyt oraz otwieranie dużych doku-
osobno i że nie ma sensu powielać prac, gdy przyszłości modyfikowane. Samo Rails 3 nie mentów PDF. Wynik każdej operacji był
można działać razem. Istotą połączenia będzie będzie kompatybilne wstecz, aczkolwiek de- mierzony i zestawiany wynikami osiągnię-
przeniesienie części funkcji z Merba do Rails. weloperzy postarają się w miarę możliwości tymi na tej samej platformie sprzętowej
Nie będzie całkowitego przepisania kodu, a ra- (i rozsądku) ułatwić migrację projektów zbu- przez inne systemy. Rezultaty tych testów
czej spokojne wdrażanie zmian i ulepszanie te- dowanych na straszych wersjach RoR. Bardziej wypadły bardzo pomyślnie dla Siódem-
ki - niemal w każdej kategorii jej wydaj-
go, co w Rails nie jest idealne. Rdzeń Rails po- szczegółowe informacje na temat połączenia
ność była większa niż Visty oraz Windows
zostanie, jednak programiści połączonych pro- obydwu frameworków można znaleźć na de- XP. Należy pamiętać że jest to nadal kom-
jektów postarają się umożliwić uruchamianie dykowanej stronie pilacja testowa, której wydajność niemal
go w uszczuplonej wersji, bez zbędnej funk- http://rubyonrails.org/merb. zawsze (w przypadku produktów Micro-
cjonalności. Również optymalizacje wydajno- http://linuxnews.pl soft) jest gorsza od wydajności finalnego
produktu.
http://neowin.net/

Emotikona zastrzeżonym Microsoft Boku zmieniony na Kodu

znakiem towarowym
Pierwsze informacje o projekcie Boku firmy
Microsoft pojawiły się w zeszłym roku. Ten
język programowania wizualnego przy-

O
gotowywany przez giganta z Redmond
leg Teterin, rosyjski biznesmen i zmienia teraz oficjalnie nazwę na Kodu.
prezes firmy telekomunikacyjnej Jak ogłasza Microsoft, Kodu wystartuje
Superfone, zarejestrował w rosyj- na kanale Xbox LIVE Community Channel
skim urzędzie patentowym znak towarowy i (w skrócie) da zainteresowanym posiada-
w postaci... emotikony uśmiechu, czyli se- czom Xboksów 360 możliwość składania
z gotowych klocków (jest ich ponad 200)
kwencji znaków dwukropka, łącznika i za-
własnych gier, wszystko przy użyciu stan-
mykającego nawiasu: :-). Dlaczego Teteri- decyzji urzędu patentowego w tej sprawie dardowego kontrolera do konsoli. Projekt
nowi zależało na zastrzeżeniu emotikony? są bardzo szeroko podważane przez świa- zadebiutować ma na wiosnę bieżącego
Biznesmen zapewnia, iż nie zamierza ści- towych komentatorów. Faktycznie, trudno roku. Kodu określane jest jako gra o spo-
gać nadawców SMSów i e-maili, czy też użyt- uwierzyć, że wykorzystywana od lat przez rych możliwościach kreacyjnych. W minut
kowników komunikatorów. Będzie jednak miliony ludzi na całym świecie sekwencja kilka da się przy jego pomocy złożyć cał-
kiem zaawansowany, wyjątkowy świat,
zwracał uwagę, czy firmy nie wykorzystują znaków została teraz własnością jednej oso-
a to wszystko przy pomocy ikonkowego
jego zastrzeżonego znaku do celów komer- by. Niektórzy zwracają uwagę, że to niebez- interfejsu. Wszystko opiera się na zasa-
cyjnych. Aby móc posługiwać się emotiko- pieczny precedens, inni mówią po prostu: dzie akcji i reakcji. Dla bardziej leniwych
ną będzie trzeba zapłacić i nabyć od Teteri- absurd. Czas pokaże, czy Teterin będzie w użytkowników Kodu oferuje możliwość
na roczną licencję. Ile konkretnie będzie ta- stanie zarobić cokolwiek na swoim kontro- modyfikacji dostępnych poziomów. „Zro-
biliśmy wszystko, co możliwe, aby upew-
ka licencja kosztować - tej informacji nieste- wersyjnym pomyśle. Bez względu jednak na
nić się, że zabawa z Kodu jest nie tylko
ty biznesmen nie chce jeszcze zdradzić, jak to, czy znak emotikony faktycznie należy do łatwa, ale również daje masę frajdy i wcią-
mówi, kwota będzie liczona w dziesiątkach rosyjskiego biznesmena, czy nie - za pionie- gnie różnych odbiorców, w każdym wieku”
tysięcy dolarów. Warto nadmienić, że za- ra uśmieszków nadal uważa się Scotta Fahl- - powiedział Matt MacLaurin, w głównej
strzeżone są również znaki pochodne two- mana, amerykańskiego naukowca z Carnegie mierze odpowiedzialny za ten projekt. „Po-
rzone na podstawie oryginału, czyli takie jak Mellon University, który w 1982 roku po raz przez to, że interfejs Kodu jest tak intuicyj-
ny i zapobiega najczęstszym błędom pro-
na przykład :) czy ;). Jak nietrudno się domy- pierwszy użył znaku :-) w wysłanej przez sie-
gramistycznym, ułatwiamy wszystkim roz-
ślić, większość internautów na wiadomość o bie wiadomości. koszowanie się magią tworzenia gier.”
„przywłaszczeniu” przez Teterina emotiko- http://news.bbc.co.uk/ http://www.gamikaze.pl/
ny reaguje z oburzeniem. Podstawy prawne

www.sdjournal.org 9
Aktualności

Android na netbookach
Wygląda na to, że opracowany przez Google Microsoft zapłaci
1,5 mld USD za Vista Capable?
dla telefonów komórkowych system opera-
cyjny Android sprawdzi się także na netbo-
okach. Dwóch współpracowników serwisu

P
VentureBeat spędziło cztery godziny kom- ółtora miliarda dolarów, tyle może wy- przez zwiększenie popytu na słabsze konfigu-
pilując Androida na netbooka Asus EEEPC nosić kara, jaką zapłacić będzie musiał racje. O orientacyjne oszacowanie wysokości
1000H. Wynik ich eksperymentu był bardzo
dobry. Działały prawie wszystkie urządze-
Microsoft w wyniku głośnego procesu dochodów uzyskanych przez Microsoft wsku-
nia, w tym karta graficzna, dźwiękowa oraz dotyczącego kampanii marketingowej Win- tek wyniku sprzedaży Windows XP na kom-
WiFi. Było to możliwe dzięki temu, że Andro- dows Vista Capable. W skierowanym do sądu puterach z logiem Vista Capable zamiast Vi-
id jest oparty na Linuksie, który posiada ste- apelacyjnego wnioskowi przeciwko Microsoft, sta Premium poproszony został Leffler Ke-
rowniki do wielu urządzeń. Niedawno także konsumenci zarzucają, że w ramach rzekome- ith. Uznał, że zysk ten wyniósł 1,505 miliarda
Dima Zavin, programista z Google, ogłosił,
go wprowadzania w błąd klientów dzięki za- USD. Jeśli powodom uda się przekonać sąd, że
że udało mu się przeportować Androida na
urządzenie Asus EeePC 701. Doniesienia te niżaniu wymagań sprzętowych systemu certy- Microsoft faktycznie wyrządził szkodę w wy-
spowodowały, że zaczęto głośno mówić o fikowane były komputery, które raczej nie po- niku akcji, może podjąć decyzję o ocenie rze-
wejściu Androida na rynek nie tylko netbo- winny posiadać loga świadczącego o zgodności czywistej szkody współmiernie do wspomnia-
oków, ale także notebooków, a nawet desk- sprzętu z najnowszym systemem. Nie umożli- nej kwoty. Inny scenariusz przewiduje nałoże-
topów. Netbooki z Androidem mogłyby wiło to obsługi pozostałych edycji Visty z wy- nie na firmę kary w wysokości trzykrotności
się pojawić nawet w ciągu trzech miesię-
jątkiem Home Basic, między innymi graficz- ocenianej kwoty szkód.
cy. Przewiduje się jednak, że Android zyska
większą popularność dopiero w 2010 roku. nego interfejsu użytkownika Aero. To z ko- http://www.theinquirer.net/
Pomóc ma mu w tym przeglądarka Google lei Microsoftowi pozwoliło wzbogacić się po-
Chrome, mogąca stanowić platformę do
uruchamiania wielu aplikacji.
http://venturebeat.com/
Nokia wyda
Qt 4.5 na licencji LGPL
Microsoft planuje redukcję zatrudnienia
Wygląda na to, że plotki o tym, jakoby w
obliczu globalnego kryzysu Microsoft miał

N
zacząć redukować zatrudnienie, przestają okia podjęła decyzję o złagodzeniu otwartość. Nokia planuje wydanie Qt 4.5 na
być plotkami - serwis Fudzilla powołując się
licencjonowania biblioteki Qt. Naj- licencji LGPL, w celu zwiększenia zaintereso-
na wewnętrzne źródła w korporacji infor-
muje, że pracownicy Microsoftu zostali już bliższe wydanie oznaczone nume- wania tą biblioteką zarówno świata open sour-
poinformowani o planowanych na począt- rem 4.5 będzie dostępne między innymi na ce, jak i komercyjnego. Licencja LGPL umoż-
ku 2009 roku zwolnieniach na stosunkowo licencji LGPL. Rok temu, kiedy Nokia kupi- liwia używanie kodu do komercyjnych celów
dużą skalę. Obecnie Microsoft zatrudnia ła Trolltech, firmę rozwijającą Qt i czerpią- bez opłat licencyjnych (choć zastosowanie do-
mniej więcej 90 tys. ludzi na całym świecie cą zyski z jej wolno-komercyjnej licencji (Qt datkowo biblioteki na GPL wymusza stosowa-
i z tego co ustalił serwis Fudzilla, zwolnienia
dostępne było za darmo na GPL, ale tylko nie dla projektu licencji GPL). Krok taki wy-
mogą objąć aż 15 tys. stanowisk - to niemal
17% całego stanu zatrudnienia, więc zde- dla niekomercyjnych projektów udostępnio- nika z faktu, iż Nokia nie musi zarabiać na Qt
cydowanie niemało. Póki co nie wiadomo nych na tej samej licencji, firmy sprzedające tak, jak musiał robić to Trolltech. W jej inte-
jeszcze, które jednostki organizacyjne lub software musiały zakupić komercyjną licen- resie leży raczej zwiększenie popularności tej
regiony zostaną najmocniej dotknięte, nie- cję biblioteki), wszyscy zastanawiali się, w ja- platformy, a zmiana licencji na pewno otwo-
oficjalnie wskazuje się na dział MSN oraz kim kierunku nowy właściciel pokieruje roz- rzy dla Qt nowe segmenty rynku.
struktury regionu EMEA (Europe, Middle
wojem Qt. Teraz widać już, że ten kierunek to http://linuxnews.pl
East and Africa), w skład których wchodzi
także polski oddział.

Szwedzka Partia
http://neowin.net/

30 lat więzienia
dla ukraińskiego hakera
Turecki sąd skazał ukraińskiego hakera na 30
lat pozbawienia wolności i grzywnę w wyso-
Piratów w Europarlamencie?
K
kości ok. 23 tysięcy dolarów. Maksym Jastrem- iedy ponad trzy lata temu startowa- szwedzkim parlamencie. Bardzo dynamicz-
ski został skazany za dokonanie serii ataków ła Szwedzka Partia Piratów, więk- nie rośnie też zainteresowanie i poparcie dla
na dwanaście tureckich banków i liczne mal- szość ludzi traktowała ją jako żart jej działań, w czym kluczową rolę odgrywa
wersacje finansowe. Haker został aresztowa- w stylu Polskiej Partii Przyjaciół Piwa. Oka- naturalnie Internet. Jak twierdzi lider Partii
ny 17 miesięcy temu w Antalii, śródziemno-
zuje się jednak, że czasy się zmieniły - ostat- Piratów, Rick Falkvinge, miejsce w Europar-
morskiej prowincji Turcji. Wyrok jest surowy,
choć dotyczył wyłącznie czynów popełnio- nie badania opinii publicznej pokazują, że lamencie jest obecnie jak najbardziej w za-
nych na terenie Turcji. Jastremski jest jednak 21% Szwedów rozważa głosowanie na Par- sięgu - potrzeba do tego 100 tys. szwedzkich
dobrze znany nie tylko tamtejszym władzom. tię Piratów w nadchodzących wyborach do głosów. Czy się uda – okaże się w czerwcu
Stany Zjednoczone podejrzewają, że to wła- Parlamentu Europejskiego. Wśród młodych 2009 roku. Jeśli tak, będzie to wydarzenie
śnie on stał w 2007 roku za głośnymi atakami ludzi (18-29) wynik ten jest bezprecedenso- całkowicie bezprecedensowe - po raz pierw-
na TJX, operatora sieci sklepów w USA, które
doprowadziły do ujawnienia danych kart kre-
wy - aż 55%. Partia rośnie też w siłę - w cią- szy realna siła polityczna ukształtowałaby się
dytowych klientów. Śledztwo w tej sprawie gu ostatniego kwartału liczba jej członków w odpowiedzi na potrzeby społeczności in-
nadal trwa. wzrosła o 50% i przekroczyła liczebność Par- ternetowej.
http://www.cnet.com/ tii Zielonych, która ma obecnie 19 miejsc w http://torrentfreak.com/

10 03/2009
Aktualności

Internet lepszym Porządki w licencjonowaniu


dla organizacji non-profit

źródłem aktualności niż prasa


Koniec roku, czas więc na podsumowania i
porządki - również w firmie Microsoft, która
przeprowadza audyt wykorzystania licencji

A
merykańska organizacja The Pew Re- ludzi, telewizja znacznie traci już na swoim grupowych w obniżonej cenie dla organiza-
search Center for the People & the znaczeniu i jako źródło pozyskiwania infor- cji non-profit, czyli w ramach programu Aca-
demic Volume. O skali tych porządków bole-
Press przeprowadzając ostatnie ba- macji pozycjonowana jest już na równi z Inter-
śnie przekonały się... domy spokojnej sta-
dania dotyczące czytelnictwa odkryła, że po netem. Warto zauważyć, że niektóre komen- rości w Australii. Microsoft zakwestionował
raz pierwszy Internet wyprzedził prasę dru- tarze do tych badań ostrzegają, że nie ma z cze- prawo do korzystania z programów licen-
kowaną jeśli chodzi o źródła pozyskiwania ak- go się cieszyć. O ile bowiem w oczach wielu cjonowania Academic przez 1300 instytu-
tualności. Badania przeprowadzono między 3 ludzi Internet jest idealnym medium szybko cji prowadzących 2900 placówek w Austra-
a 7 grudnia 2008 roku na grupie 1489 doro- i sprawnie identyfikującym najważniejsze wy- lii. Korporacja twierdzi, że tego typu insty-
tucje nie mieszczą się w definicji organiza-
słych Amerykanów. Większość pytań dotyczy- darzenia, o tyle mało które witryny webowe cji uprawnionych do korzystania z progra-
ła reakcji na najważniejsze wydarzenia roku, mają zasoby niezbędne do przeprowadzania mu. Sprawa jest o tyle poważna, że instytu-
część jednak sprawdzała, skąd respondenci do- wnikliwych dziennikarskich analiz i śledztw, cje te z rozwiązań Microsoftu korzystają od
wiedzieli się o nich. Okazało się, że 40% ludzi jakie wykonywanie są codziennie przez do- lat, nic dziwnego więc, że cała infrastruktu-
aktualności krajowe i światowe czerpała z In- świadczonych redaktorów dużych gazet - to, ra zbudowana jest w oparciu o takie produk-
ty jak Office, SharePoint i SQL Server. Teraz,
ternetu - to znaczny skok względem analogicz- że treści internetowe są za darmo, odbija się
by dalej z nich korzystać, trzeba zapłacić za
nego badania w roku 2007, kiedy podobnie niestety na ich jakości. Bez wątpienia jednak licencje komercyjne - cztery razy więcej, niż
odpowiedziało jedynie 24% badanych. Nie- media internetowe bardzo szybko uczą się i dotychczas. Jest również dobra wiadomość
kwestionowanym liderem okazała się nadal te- dzięki rosnącemu znaczeniu jako atrakcyjny - Microsoft przygotowuje specjalny program
lewizja, jednak i dla niej zapaliło się już ostrze- nośnik reklamy zyskują odpowiednie środki, licencjonowania dla organizacji charytatyw-
gawcze światło - w badaniu ograniczającym by tą jakość poprawiać. nych i non-profit, więc jeśli firma stanie na
wysokości zadania i upora się szybko z
grupę respondentów wyłącznie do młodych http://people-press.org/
przygotowaniami, być może w przypadku
australijskich domów spokojnej starości i

Apple, Google i Microsoft


innych tego typu instytucji skończy się tylko
na dyskusjach. Poza programami licencjono-
wania grupowego Microsoft systematycznie

pozwani za naruszanie patentu przekazuje podmiotom non-profit opro-


gramowanie również w formie zwyczajnej
darowizny - w mijającym roku jego wartość

T
rzej giganci rynku IT, Apple, Google tycznego, sprawdza jednak możliwe narusza- wyniosła ponad 22 miliony dolarów.
i Microsoft zostali podani do sądu za nie patentu w produktach innych firm i roz- http://www.australianit.news.com.au/
złamanie patentu firmy Cygnus Sys- waża skierowanie pozwu także przeciwko
tems. Chroniona patentem technologia znaj- nim. Sporny patent został pierwotnie zgło- 22 korporacje
pozwane o naruszenie patentu
duje się w produktach takich jak: Windows szony w 2001 roku, ale dopiero teraz Ame-
22 korporacje, głównie wydawcy opro-
Vista, Internet Explorer 8, Google Chrome, rykańskie Biuro Patentowe przyznało go fir- gramowania chroniącego przed wirusa-
Mac OS X czy iPhone. Firma Cygnus Systems mie. Jeśli sprawa zostanie rozstrzygnięta ne- mi i złośliwym oprogramowaniem, zosta-
uważa, że wspomniane systemy i aplikacje gatywnie dla Apple, Google i Microsoft, zo- ły pozwane przez Information Protection
używają chronionej funkcji podglądu plików, bowiązani będą zapłacić odszkodowanie i and Authentication of Texas (IPAT). Według
która pozwala użytkownikowi na podgląd za- opłaty licencyjne. IPAT, produkty pozwanych firm naruszają
patenty, których jest właścicielem. Wśród
wartości dokumentu bez otwierania go. Spół- http://www.edibleapple.com/
pozwanych znaleźli się tacy giganci jak:
ka obrała sobie za cel liderów rynku informa- Microsoft, Symantec, CA, Kaspersky, Novell,
AVG czy Trend Micro. Konkretnie chodzi o

Rok 2009 rokiem


dwa patenty: 5311591 zarejestrowany w
maju 1994 oraz 5412717 zarejestrowany
w maju 1995, oba zgłoszone przez Addi-

Linuksa na biurkach? sona M. Fischera i następnie kupione przez


IPAT. Pierwszy z wymienionych patentów
to innowacja dająca użytkownikowi kon-

J
ak donosi serwis Bankier.pl, rok 2009 roku, które mówią o sprzedaży do 8 milionów trolę nad zachowaniem aplikacji przy neu-
może się stać rokiem Linuksa. Ktoś mo- sztuk a w roku 2012 ma być sprzedanych po- tralizowaniu działania złośliwych progra-
że zapytać – a co dziennikarze takiego nad 50 milionów netbooków. Sprzedaż netbo- mów (malicious software). Drugi dotyczy
zastosowania unikalnych identyfikatorów
serwisu jak Bankier.pl mogą wiedzieć o tech- oków niewątpliwie przyczyni się do populary-
numerycznych (hash) do upewniania się, że
nologii? Na technologii być może się nie zna- zacji Linuksa, ale czy użytkownicy będą chcie- działanie aplikacji (na przykład tarczy anty-
ją, ale liczyć potrafią bardzo dobrze. Przyczy- li go używać, i czy będą z niego zadowoleni? wirusowej) nie zostało zablokowane. Jak na
ną sukcesu Linuksa w 2009 roku mają być Z danych udostępnionych niedawno przez razie żadna z pozwanych firm nie odpowie-
netbooki – te małe, nieużyteczne i niedoce- firmę MSI wynika, że ma ona czterokrotnie działa na oskarżenia. Nie wiadomo też, czy
niane komputerki sprzedawane w milionach więcej zwrotów netbooków z Linuksem niż IPAT domaga się, poza prawnym nakazem
zakończenia działań naruszających patent,
egzemplarzy, na których producenci bardzo z Windows.
odszkodowania lub rekompensaty.
często instalują Linuksa. Bankier.pl powołuje http://www.bankier.pl http://www.arstechnica.com/
się na prognozy sprzedaży netbooków w 2009

www.sdjournal.org 11
Biblioteka miesiąca

Biblioteka Luabind
Wygodne łączenie języków Lua i C++

Lua oraz C++ bardzo dobrze uzupełniają się jako języki programowania;
niestety – ich łączenie przy pomocy podstawowego API opartego na
czystym C jest delikatnie mówiąc – zniechęcające. Na pomoc przybywa
Luabind: nowoczesna biblioteka C++, dzięki której łączenie Lua i C++ staje
się proste i przyjemne.
tu Lua, który z kolei uruchomimy z programu na-
Dowiesz się: Powinieneś wiedzieć: pisanego w C++.
• W jaki sposób odbywa się łączenie języków • Jak programować w języku C++. Pierwszą czynnością, którą należy wykonać, to
Lua i C++ na bazie podstawowego API oparte- konfiguracja środowiska pracy. Osoby korzysta-
go na czystym C; jące z pakietu Visual Studio C++ zapraszam do
• W jaki sposób można usprawnić ten proces przestudiowania zawartości ramki Szybki Start:
przy pomocy biblioteki Luabind; Lua. Użytkownicy alternatywnych środowisk de-
• W jaki sposób języka Lua może stanowić do- weloperskich w ramce W sieci znajdą odnośniki do
pełnienie języka C++. stron, na których można znaleźć odpowiednie in-
strukcje postępowania odnośnie konfiguracji.
Gdy środowisko pracy jest już gotowe, należy
pisane w zewnętrznych plikach, a także generować wpisać i skompilować program przedstawiony na
i wykonywać skrypty zapisane w pamięci. Co wię- Listingu 1.
Poziom trudności cej, w przypadku Lua istnieje możliwość ekspono- Rozważmy krok po kroku, co się dzieje we
wania konstrukcji (np. zmiennych, funkcji, czy wspomnianym programie. Na początek, dołącza-
klas) opisanych w C++ i odwoływanie się do nich my odpowiednie nagłówki. Z punktu widzenia in-
z poziomu skryptów. Ogólny zarys tego jakie moż- tegracji naszego programu ze skryptami Lua, uwa-

J
ęzyk C++ jest to niewątpliwie potężny język liwości i zarazem, jakie zagrożenia wiążą się z wy- gę należy zwrócić na nagłówek lua.hpp. Kolejna,
programowania, aczkolwiek – posiada pew- korzystaniem skryptów przedstawiłem w ramce interesująca nas instrukcja znajduje się wewnątrz
ne ograniczenia. Przekonał się o tym zapew- Skrypty: zastosowania. funkcji main():
ne niejeden programista C++, któremu przyszło Struktura niniejszego artykułu jest następują-
popracować z bardziej dynamicznymi językami ca: na początku zaprezentuję podstawowe mecha- lua_State* pL = lua_open();
programowania (np. Perl, Python czy Ruby). C++, nizmy integracji obydwu języków (uruchamianie
który oferuje niezwykle bogaty wachlarz mechani- skryptów, eksponowanie konstrukcji) w oparciu W powyższym wywołaniu tworzony jest obiekt
zmów abstrakcji operujących na etapie kompilacji o podstawowe API udostępnione w czystym C. reprezentujący kontekst wywołania naszego
(chociażby potężny mechanizm szablonów), po- W dalszej kolejności zaprezentuję możliwości bi- skryptu (bądź skryptów), będziemy ją przeka-
zostawia swoim użytkownikom wyraźny niedo- blioteki Luabind. Podejście takie zastosowałem z zywać do wszystkich funkcji wywoływanych z
syt w zakresie bardziej zaawansowanych mechani- dwóch powodów: po pierwsze – przedstawienie
zmów działających w czasie wykonania programu. możliwości Luabind na tle mechanizmów pod- �����������������
Brakuje chociażby mechanizmu refleksji czy moż- stawowych pozwala wyraźnie wyeksponować si-
liwości wygenerowania i wykonania w locie frag- łę tej biblioteki, a po drugie – daje ono pełniejszy
� ��� ��
mentu kodu. Trudno powiedzieć, że są to wady obraz tematu, szczególnie dla Czytelników nie-
C++. Taki stan rzeczy wynika z filozofii języka, a w obeznanych z tym zagadnieniem. Osoby, które
� ��� ��
zamian użytkownicy C++ otrzymują inne, potęż- dobrze znają podstawowe mechanizmy integracji
ne możliwości. Na szczęście, siła języka C++ pole- Lua i C++, a chciałyby zapoznać się z możliwościa-
ga również na tym, iż brak niektórych jego właści- mi prezentowanej biblioteki, mogą rozpocząć lek- � ��� ��

wości można sobie zrekompensować korzystając z turę niniejszego artykułu od podpunktu Luabind
dedykowanych rozwiązań bibliotecznych. nadciąga z odsieczą! � ��� ��
W niniejszym artykule przedstawię w jaki spo-
sób można łączyć C++ ze skryptowym językiem Pierwszy skrypt � ��� ��
Lua wykorzystując bibliotekę Luabind. Dzięki ta- Zgodnie z tradycją, nasze rozważania rozpocznie-
kiemu zabiegowi przed programistą C++ otwie- my klasycznym przykładem typu Witaj Świecie!
ra się ocean nowych możliwości: może on na eta- Tym razem postaramy się jednak, aby powitalny Rysunek 1. Koncepcja indeksowania wirtualnego
pie wykonania programu uruchamiać skrypty za- komunikat został wyświetlony z poziomu skryp- stosu biblioteki Lua

12 03/2009
Biblioteka Luabind

biblioteki Lua. W kolejnych pięciu instrukcjach my funkcję luaL_dofile(), przekazując do niej różna od zera, to oznacza, że uruchomienie skryp-
(luaopen _ *) aktywujemy dostęp do standardo- dwa parametry: kontekst oraz nazwę pliku, w tu z jakiegoś powodu nie powidło się; w takim
wych bibliotek języka Lua. Sercem omawianego którym zapisany jest skrypt do uruchomienia. Je- przypadku nasz program wypisuje odpowiedni
przykładu jest instrukcja if, w której wywołuje- śli wartość zwrócona ze wspomnianej funkcji jest komunikat o błędzie.
To czego jeszcze nam brakuje to zawartość
skryptu hello.lua., która wygląda następująco:
Skrypty: zastosowania
Skryptowanie (ang. scripting) jest dość modnym tematem wśród programistów C++; szczególnie często
print( "Hello from Lua!" )
słyszy się o nim w kontekście produkcji gier. Czytelnicy, którzy mieli okazję grać w takie tytuły jak Far Cry,
Crysis, Grim Fandango, Escape from Monkey Island, Heroes of Might and Magic V, World of Warcraft czy Wit-
cher – chcąc nie chcąc mieli do czynienia ze skryptami Lua. Lista gier wykorzystujących ten, bądź alterna- Po uruchomieniu opisanego wyżej przykładu,
tywne języki skryptowe jest bardzo długa. Ze skryptów korzysta też wiele aplikacji użytkowych (np. Ado- program powita nas przyjaznym komunikatem:
be Photoshop Lightroom, Celestia, Monotone). W tym miejscu postaram się odpowiedzieć w skrócie na py- Hello from Lua!
tanie: dlaczego warto rozważyć wykorzystywanie skryptów w programach – szczególnie w tych, któ- W tym miejscu należałoby opisać nieco szerzej
re powstają na bazie kompilowanych języków programowania (takich jak C++)? Kluczem do odnalezie-
nia odpowiedzi na przedstawione wyżej pytanie może być hasło data driven developemnt. Idea tworzenia
możliwości języka Lua. Dogłębne przedstawianie
programowania sterowanego danymi zakłada, iż oprogramowanie powinno być tworzone w taki spo- tego tematu wykracza poza ramy niniejszego arty-
sób, aby jego konfiguracja odbywała się możliwie jak najczęściej na bazie danych zapisanych w zewnętrz- kułu. Żądnych wiedzy Czytelników zapraszam do
nych, łatwo dostępnych repozytoriach (np. w plikach tekstowych). W myśl tej zasady, wszelkie stałe kon- przestudiowania treści ramki Lua: przegląd możli-
trolujące zachowanie programu oraz wybrane elementy logiki powinny być zdefiniowane poza progra- wości języka (tutaj można znaleźć podstawowe in-
mem, w taki sposób aby było je można łatwo modyfikować. Podstawowe zalety takiego podejścia to:
formacje o składni i konstrukcjach stosowanych w
• Oszczędność czasu (łatwiej jest modyfikować zachowanie programu; nie trzeba za każdym razem Lua), oraz W sieci – gdzie umieściłem odnośniki
przebudowywać źródeł), do bardziej szczegółowych materiałów edukacyj-
• Zwiększenie wydajności pracy, nych w tym temacie.
• Obniżenie kosztów pracy (wyeksponowane aspekty działania programu mogą być dostrajane Gorąco zachęcam Czytelników do poekspery-
przez mniej wykwalifikowanych pracowników, np. testerów),
mentowania z językiem Lua; można do tego wy-
• Zwiększenie kreatywności (łatwiej i szybciej możne wdrażać i testować nowe pomysły),
• Zwiększenie rozszerzalności i elastyczności tworzonego oprogramowania, korzystać lekko zmodyfikowaną wersję programu
z Listingu 1. Zamiast oryginalnej instrukcji if, na-
Języki skryptowe pokroju Lua nadają się bardzo dobrze do opisanych wyżej celów; można je w relatywnie leży wpisać:
prosty sposób łączyć z językami kompilowanymi, są stosunkowo nietrudne do nauki (np. Lua można bez
problemu użyć do tworzenia prostych plików konfiguracyjnych), a jednocześnie – gdy zachodzi taka po- if ( int error = luaL_dofile( pL, argv[ 1 ] )
trzeba – oferują pełną moc języka programowania. Kluczowe jest również tworzenie dwustronnych wią-
!= 0 )
zań pomiędzy językami. Chodzi o to, aby mieć zarówno możliwość wywoływania funkcji zdefiniowanych
w skrypcie z poziomu języka kompilowanego, jak i odwrotnie. Np. częstą praktyką przy tworzeniu gier jest
eksponowania interfejsów wybranych modułów, tak aby zachowanie rozgrywki można było łatwo kon- Pozwoli to wczytywać dowolne skrypty przez
trolować z zewnątrz. Jak wszystkie narzędzia, również mechanizm skryptowania może być nadużywa- podawanie odpowiednich ścieżek w postaci argu-
ny. Przy projektowaniu systemu korzystającego ze skryptów trzeba bardzo dokładnie przemyśleć, któ- mentów wiersza poleceń przy kolejnych wywoła-
ra część logiki zostanie wyeksponowana. Niestety, często zdarzają się przypadki, kiedy rozentuzjazmo-
niach programu.
wani programiści idą na przysłowiową całość i w rezultacie prawie cała aplikacja tworzona jest w języ-
ku skryptowym. To z kolei może odbić się negatywnie na wydajności; skrypty też w większości przypad-
ków o wiele trudniej jest debugować (chociażby w porównaniu do programu pisanego w C++). Listing 1. Uruchomienie zewnętrznego
skryptu Lua z programu C++

#include <iostream>
Szybki start: Lua #include <lua.hpp>
Aby rozpocząć pracę z biblioteką Lua należy wykonać następujące czynności (uwaga: poniższa
instrukcja odnosi się do użytkowników pakietu Visual Studio w wersji 7 oraz wyższych): using namespace std;
int main()
• Pobrać binarną dystrybucję biblioteki Lua (patrz: ramka W Sieci) i rozpakować ją do wybra- {
nego katalogu (LUA_ROOT), lua_State* pL = lua_open();
• Stworzyć w Visual Studio nowy projekt C++
luaopen_base( pL );
• W ustawieniach projektu (C/C++ -> General) ustawić dodatkowy katalog do wyszukiwania
luaopen_string( pL );
plików nagłówkowych: LUA_ROOT/include,
• W ustawieniach projektu (Linker -> General) ustawić dodatkowy katalog do wyszukiwania bi- luaopen_table( pL );
bliotek: LUA_ROOT. luaopen_math( pL );
• W ustawieniach projektu (Linker -> Input) dodać bibliotekę lua5.1.lib, luaopen_io( pL );
• Skopiować plik LUA_ROOT/lua5.1.dll w miejsce rozpoznawane przez aplikację (np. C:\ if ( int error = luaL_dofile( pL,
Windows\System32).
"hello.lua" )
!= 0 )
{
Szybki start: Luabind cout << "\n[C++]: ERROR("
Aby rozpocząć pracę z biblioteką Luabind należy wykonać następujące czynności (uwaga: po- << error
niższa instrukcja odnosi się do użytkowników pakietu Visual Studio w wersji 7 oraz wyższych): << "): Problem with lua
script file!\n\n"
• Wykonać kroki opisane w ramce Szybki start: Lua, << endl;
• Pobrać dystrybucję biblioteki (patrz: ramka W Sieci) i rozpakować ją do wybranego katalogu return 0;
(LUABIND_ROOT),
}
• W ustawieniach projektu (C/C++ -> General) ustawić dodatkowy katalog do wyszukiwania
plików nagłówkowych: LUABIND_ROOT, return 1;
• Dodać pliki źródłowe z katalogu LUABIND_ROOT/src do projektu. }

www.sdjournal.org 13
Biblioteka miesiąca

Wirtualny stos, wprowadzili dodatkowy poziom abstrakcji w po- momencie po stronie Lua ze stosu zdejmowane
czyli rozmowy kontrolowane staci wirtualnego stosu, który służy do komunika- są parametry i obiekt reprezentujący funkcję, po
Lua i C++ jako języki programowania są diametral- cji pomiędzy obydwoma językami. Koncepcja ko- czym następuje wywołanie. Opisany tu pokrótce
nie różne, zarówno na poziomie konstrukcji jak i munikacji jest bardzo prosta. Dla przykładu – je- proces będzie opisany bardziej szczegółowo w ko-
wykorzystywanych typów danych (patrz: ram- śli z poziomu języka C++ chcielibyśmy wywołać lejnych podpunktach niniejszego tekstu.
ki Lua: przegląd możliwości języka). W tej sytuacji funkcję Lua, to na stos powędruje najpierw obiekt Wirtualny stos Lua ma dość ciekawą właści-
oczywiste jest, że trudno byłoby zrealizować bezpo- tę funkcję reprezentujący, a później – argumenty. wość. Oprócz standardowych operacji (włożenie
średni mechanizm komunikacji pomiędzy nimi. W dalszej kolejności program C++ daje sygnał do nowego elementu na wierzchołek i zdjęcie ele-
Aby rozwiązać ten problem autorzy biblioteki Lua biblioteki, że chciałby wywołać funkcję. W tym mentu z wierzchołka) użytkownik ma możliwość
odwoływania się do konkretnych elementów stosu
Listing 2. Dostęp do zmiennych Lua z poziomu programu C++ przy pomocy indeksów. Co więcej – oprócz zwy-
czajnego indeksowania liczbami dodatnimi, do
#include <cassert> elementów stosu można odwoływać się przy po-
#include <iostream> mocy liczb ujemnych (np. liczba -1 reprezentuje
#include <string> wierzchołek stosu). Koncepcja ta jest przedstawio-
#include <lua.hpp> na w sposób wizualny na Rysunku 1.
using namespace std;
int run_lua_script( lua_State* pL, const char* name ); Dostęp do zmiennych
int main() Lua z poziomu programu C++
{ Na początek przeanalizujmy najprostszy z moż-
lua_State* pL = lua_open(); liwych scenariuszy: dostęp do globalnych zmien-
luaL_openlibs( pL ); nych skryptu Lua z poziomu programu napisa-
if ( run_lua_script( pL, "vars.lua" ) ) nego w języku C++. Rozważmy następujący, pro-
{ sty skrypt:
return 1;
} url = "http://www.sdjournal.org/"
lua_settop( pL, 0 ); id = 17
lua_getglobal( pL, "url" );
lua_getglobal( pL, "id" ); Na Listingu 2 pokazany jest przykładowy pro-
if ( !lua_isstring( pL, 1 ) ) gram, który pobiera wartości zmiennych zdefi-
{ niowanych w powyższym skrypcie. Na początek
cout << "[C++]: ERROR: Invalid type! (number expected)\n"; warto zwrócić uwagę na deklarację funkcji:
return 1;
} int run_lua_script( lua_State* pL, const
string url = lua_tostring( pL, 1 ); char* name )
cout << url << endl;
if ( !lua_isnumber( pL, 2 ) ) Funkcja ta opakowuje kod odpowiedzialny za
{ uruchomienie skryptu Lua i wyświetlenie komu-
cout << "[C++]: ERROR: Invalid type! (number expected)\n"; nikatu o błędzie; będziemy ją jeszcze wielokrot-
return 1; nie wykorzystywać w kolejnych przykładach. De-
} finicję funkcji umieściłem na Listingu 3.
int id = ( int )lua_tonumber( pL, 2 ); Rozważmy teraz po kolei co dzieje się w funkcji
cout << id << endl; main() przedstawionej na Listingu 2. Na początku
return 0; tworzony jest kontekst Lua, dalej – wczytywane są
} biblioteki (tym razem robimy to przy pomocy po-
jedynczej funkcji luaL_openlibs()). Następnie
wykorzystujemy funkcję run_lua_script() w
celu uruchomienia skryptu. Warto w tym miej-
Lua: przegląd możliwości jezyka scu zauważyć, iż tym razem działanie skryptu jest
Język Lua dość diametralnie różni się do C++. Przede wszystkim jest on dynamicznie typowany. Dzięki niewidoczne – dzieje się tak, ponieważ rozważany
temu w skrypcie Lua możemy zapisać następującą sekwencję instrukcji: skrypt nie zawiera żadnych operacji wyjścia; w za-
name = "Ola" mian za to, w obiekcie reprezentującym stan poja-
x = 44 wiają się dwie zmienne globalne, te do których po-
x = name staramy się uzyskać dostęp.
Aby odwołać się do wspomnianych zmien-
Lua oferuje 8 typów podstawowych: Nil (oznacza, że dana zmienna nie ma żadnego typu), Number nych z poziomu języka C++, musimy załadować
(liczba; warto zauważyć, iż wszystkie wartości liczbowe w Lua reprezentowane są jako wartości zmien-
noprzecinkowe), String (napis), Boolean (typ logiczny), Function (w Lua funkcja traktowana jest jako peł-
je na wirtualny stos. Służy do tego funkcja lua_
noprawny typ; np. można ją przypisać do zmiennej i przekazać ją do innej funkcji), Table (tablica), User- getglobal(). Zanim to jednak uczynimy, stos
Data (pomocnicy typ wspomagający integrację Lua z językami C/C++) oraz Thread (wątek). Oprócz te- powinien być wyczyszczony za pomocą operacji
go Lua oferuje podstawowe operatory oraz instrukcje sterujące. Język ten pozwala również definio- lua_settop( pL, 0 ); dopiero po tym lądują na
wać klasy. Przykładowe, proste skrypty Lua można znaleźć w dołączonych Listingach, aczkolwiek peł- nim po kolei zmienne: url oraz id.
ne przedstawienie możliwości tego języka zdecydowanie wykracza poza ramy niniejszego artykułu.
Zanim pobierzemy wartości zmiennych ze sto-
Czytelników, którzy chcieliby nauczyć się języka Lua zapraszam do zapoznania się z dokumentacją
oraz samouczkami wskazanymi w ramce W Sieci. su, warto upewnić się, czy mają one rzeczywiście
taki typ, którego się spodziewamy. Służy to tego

14 03/2009
Biblioteka Luabind

specjalny zestaw operacji (patrz Listing 4). Ope- pomocy znajomej funkcji lua _ tostring() – Dostęp do funkcji C++
racje te odpowiadają poszczególnym typom języ- pobrać interesującą nas wartość. z poziomu programu Lua
ka Lua. Na Listingu pokazane jest w jaki sposób W niniejszym podpunkcie opiszemy przypa-
można jest wykorzystać w celu weryfikacji ty- Dostęp do funkcji Lua dek odwrotny do tego, który omówiony został
pu obiektów umieszczonych na stosie. Wreszcie, z poziomu programu C++ wcześniej: rozważymy eksponowanie funkcji
przy pomocy funkcji z rodziny lua_to* (patrz Idąc o krok dalej – sprawdzimy teraz w jaki sposób zapisanych w języku C++ dla skryptów Lua.
Listing 5) można pobrać interesującą nas wartość można wywołać funkcję zdefioniowaną w skryp- Aby uzyskać tego rodzaju efekt, programista
ze stosu i zachować w zmiennej zdefiniowanej w cie Lua z poziomu programu C++. Na początek zmuszony jest dostosować eksponowaną funk-
programie C++. W rozpatrywanym przykładzie zdefiniujmy sobie prostą funkcję w Lua, która su- cję do następującego interfejsu:
wykorzystujemy funkcje lua_tostring() oraz muje wartości z przedziału <a, b> (Listing 7).
lua_tonumber(). W przypadku tej ostatniej ko- Program C++ wywołujący tę funkcję przedsta- int (lua_CFunction*) (lua_State*)
nieczne jest dodatkowe rzutowanie na interesują- wiony jest na Listingu 8.
cy nas typ; w Lua wszystkie wartości numeryczne Początek rozważanego przykładu jest identycz- Najprostszą techniką pozwalającą uzyskać
reprezentowane są przy pomocy zmiennych typu ny w stosunku do swoich poprzedników, do mo- tego rodzaju efekt jest opakowywanie (ang.
double (reprezentację tę można zmienić, w tym mentu kiedy umieszczamy na stosie obiekt glo- wrapping). Przykład udostępnienia funk-
celu należy przebudować bibliotekę). balny, reprezentujący interesującą nas funkcję. W cji C++ dla skryptu Lua pokazany jest na Li-
dalszej kolejności musimy umieścić na stosie argu- stingu 9.
Dostęp do tablicy Lua menty funkcji: Funkcja, którą eksponujemy w tym przykładzie
z poziomu programu C++ ma następującą sygnaturę:
Jako kolejny przykład interakcji pomiędzy Lua i lua_pushnumber( pL, 1 );
C++ rozważymy proces uzyskania dostępu do ta- lua_pushnumber( pL, 100 ); void print_ntimes( const string& str, int n )
blicy Lua z poziomu programu C++. Na począ-
tek zapraszam Czytelników do zapoznania się z Kluczowym elementem w tym przykładzie jest Jej zadanie jest banalne: n razy wyświetla zadany
Listingiem 6. W tym przypadku sprawa jest odro- wywołanie funkcji lua _ call(). Funkcja ta napis. Aby zrealizować postawione zadanie, defi-
binę bardziej skomplikowana. Kłopot w tym, że ta- przyjmuje trzy argumenty: stan, ilość argumen- niujemy funkcję opakowującą o następującej sy-
blice Lua są w rzeczywistości kontenerami asocja- tów wywoływanej funkcji oraz ilość zwracanych gnaturze:
cyjnymi (patrz: ramka Lua: przegląd możliwości ję- przez nią elementów. Po jej wywołaniu na wierz-
zyka) i aby dostać się do określonego elementu chołku stosu pojawiają się wspomniane elementy. int print_ntimes( lua_State* pL )
musimy podać właściwy klucz. Na dodatek wspo-
mniany klucz może być dowolnego typu. Na po- Listing 3. Definicja funkcji run_lua_script()
trzeby rozważanego przykładu, zakładamy iż za-
wartość skryptu table.lua jest następująca: int run_lua_script( lua_State* pL, const char* name )
{
user_data = { name="Monika", age=4 } if ( int error = luaL_dofile( pL, name ) != 0 )
{
Zadaniem programu przedstawionego na Listin- cout << "\n[C++]: ERROR( "
gu 6 jest odczytanie zawartości komórki tabli- << error
cy identyfikowanej przez klucz name. W tym ce- << " ): Problem with lua script file!"
lu najpierw należy umieścić wspomnianą tabli- << endl;
cę na stosie: return 1;
}
lua_getglobal( pL, "user_data" ); return 0;
}
Po upewnieniu się iż mamy rzeczywiście do czy-
nienia z tablicą, wrzucamy na stos nazwę intere- Listing 4. Funkcje sprawdzające typ wartości przechowywanej w określonej komórce stosu
sującego nas klucza przy pomocy funkcji lua _ int lua_type( lua_State *pL, int index );
pushstring(). Warto zauważyć, iż tym razem int lua_isnil( lua_State *pL, int index );
stos został wykorzystany jako kanał komunika- int lua_isboolean( lua_State *pL, int index );
cyjny w drugą stronę: dane zostały wysyłane z int lua_isnumber( lua_State *pL, int index );
programu C++ do skryptu Lua. Dalej mamy na- int lua_isstring( lua_State *pL, int index );
stępujące wywołanie: int lua_istable( lua_State *pL, int index );
int lua_isfunction( lua_State *pL, int index );
lua_gettable( pL, -2 ); int lua_iscfunction( lua_State *pL, int index );
int lua_isuserdata( lua_State *pL, int index );
W tym miejscu dzieje się dość sporo interesują-
cych rzeczy. Wewnątrz funkcji z wierzchołka Listing 5. Funkcje sprawdzające typ wartości przechowywanej w określonej komórce stosu
stosu zdejmowana jest komórka reprezentują- int lua_toboolean( lua_State *pL, int index );
ca klucz, a następnie z tablicy określonej indek- lua_Number lua_tonumber( lua_State *pL, int index );
sem przekazanym jako drugi argument funkcji const char* lua_tostring( lua_State *pL, int index );
(w naszym przypadku: -2) pobierana jest wartość lua_CFunction lua_tocfunction( lua_State *pL, int index );
dla wspomnianego klucza i po czym ląduje ona void* lua_touserdata( lua_State *pL, int index );
na wierzchołku stosu. Po wywołaniu tej funkcji lua_State* lua_tothread( lua_State *pL, int index );
warto sprawdzić czy typ pobranego obiektu od- void* lua_topointer( lua_State *pL, int index );
powiada naszym oczekiwaniom, po czym – przy

www.sdjournal.org 15
Biblioteka miesiąca

Proces definiowania tej funkcji można opisać pro- stawowe mechanizmy integracji języków C++
Listing 6. Dostęp do tablicy Lua z poziomu stym algorytmem: oraz... skutecznie zniechęcić Czytelników do ich
programu C++
wykorzystywania. Trzeba powiedzieć to wprost:
#include <cassert> • Na początku pobieramy rozmiar stosu przy stosowanie wspomnianych mechanizmów zmu-
#include <iostream> pomocy funkcji lua _ gettop() i sprawdza- szają programistę to wykonywania żmudnej, po-
my, czy zgadza się ona z wymaganą liczbą ar- wtarzalnej i podatnej na błędy pracy. Na dodatek
#include <string> gumentów eksponowanej funkcji. większość z potencjalnych błędów manifestuje się
#include <lua.hpp> • Następnie sprawdzamy czy typy poszczegól- dopiero na etapie działania programu, co dodatko-
nych elementów umieszczonych na stosie wo utrudnia odpluskwianie programów. Tutaj na
using namespace std; zgadzają się z typami argumentów funkcji. pomoc przychodzi nam biblioteka Luabind, która
• Pobieramy argumenty ze stosu i wywołuje- – wydawało by się – w magiczny sposób rozwiązu-
int run_lua_script( lua_State* pL, my właściwą funkcję. je wymienione wyżej problemy. Na początek roz-
const char* name • Jeśli funkcja zwraca jakąś wartość, bądź mo- ważmy podobne przypadki, do tych, które zostały
); dyfikuje swoje argumenty to wyniki tako- przedstawione w pierwszej części artykułu – tyle,
int main() wych działań należy umieścić na stosie. że tym razem - z wykorzystaniem Luabind.
{ Funkcja opakowująca powinna zwracać war-
lua_State* pL = lua_open(); tość całkowitą określającą ilość elementów Luabind: zaczynamy pracę
luaL_openlibs( pL ); zwróconych z funkcji. W niniejszym punkcie rozważymy w jaki sposób
można rozpocząć pracę z biblioteką Luabind. Je-
if ( run_lua_script( pL, W funkcji main() pokazane jest w jaki sposób śli chodzi o konfigurację biblioteki, to zapraszam
"table.lua" ) ) można zarejestrować funkcję opakowującą w Czytelników do zapoznania się z treścią ramki Lu-
{ kontekście Lua co w rezultacie czyni ją widocz- abind: szybki start. W tym miejscu zakładam, że bi-
return 1; ną dla wszystkich skryptów uruchamianych w blioteka jest pomyślnie zainstalowana oraz skonfi-
} tym kontekście: gurowana i możemy skupić się na programowa-
lua_settop( pL, 0 ); niu. Na Listingu 10 przedstawiłem krótki pro-
lua_getglobal( pL, "user_data" ); lua_register( pL, "cxx_print_ntimes", print_ gram, który pokazuje jak niewiele pracy potrzeba
if ( !lua_istable( pL, 1 ) ) ntimes ); aby rozpocząć korzystanie z Luabind.
{ Na początek należy dołączyć dwa nagłów-
cout << "\n[C++]: ERROR: Drugi argument przekazywany do funkcji lua _ ki: lua.hpp oraz luabind.hpp. Dalej, tworzymy
Invalid register() określa symbol reprezentujący za- kontekst Lua przy pomocy znajomej nam lua_
type! (table rejestrowaną funkcję w skrypcie. W kontekście open(), po czym przekazujemy utworzony obiekt
expected)\n"; rozpatrywanego przykładu skrypt cxx.lua mógł- do funkcji luabind::open(). I na tym w zasadzie
return 1; by wyglądać następująco: kończy się inicjacja biblioteki. W miejscu zazna-
} czonym komentarzem z trzema kropkami moż-
lua_pushstring( pL, "name" ); print("Hello from Lua"); na już wstawić kod korzystający z dobrodziejstw
lua_gettable( pL, -2 ); cxx_print_ntimes("Hello from C++", 3); Luabind. Rozważmy pierwszy scenariusz wyko-
if ( !lua_isstring( pL, -1 ) ) print("Hello from Lua again"); rzystania biblioteki.
{
cout << "\n[C++]: ERROR: Wyniki działania przykładu zaprezentowanego Luabind: Dostęp do funkcji
invalid na Listingu 9 byłyby następujące: Lua z poziomu programu C++
type! (string Do przeanalizowania tego przypadku wykorzysta-
expected)\n"; Hello from Lua my zdefiniowaną wcześniej funkcję sum_range()
return 1; Hello from C++ (patrz: Listing 7). Na Listingu 11 pokazane jest,
} Hello from C++ w jaki sposób można uzyskać dostęp do tej funk-
string name = lua_tostring( pL, Hello from C++ cji z poziomu programu C++, przy wykorzysta-
-1 ); Hello from Lua again niu Luabind.
cout << "[C++]: name = " << name << Zanim przejdziemy do szczegółowej analizy
endl; Dostęp do klas C++ z poziomu Lua wspomnianego Listingu, warto porównać go z za-
lua_pop( pL, 1 ); Przedstawione powyżej przykłady pokazały, że łą- wartością Listingu 8, w ramach którego realizowa-
return 0; czenie języków Lua i C++ nie jest trudne, aczkol- liśmy podobne zadanie – tyle, że z wykorzysta-
} wiek wiąże się ze sporym nakładem pracy, która niem podstawowego API do integracji Lua i C++.
w dużej mierze ma charakter powtarzalny. O ile Z miejsca rzuca się w oczy fakt, iż w przypadku ko-
Listing 7. Prosta funkcja zdefiniowana w w przypadku prostych typów danych (zmiennych, rzystania z Luabind programista nie musi borykać
języku Lua tablic czy funkcji) proces ten jest jeszcze znośny, o się z takimi niskopoziomowymi szczegółami jak
function sum_range(a, b) tyle w przypadku typów złożonych (klas) manual- obsługa wirtualnego stosu Lua. Cała procedura
sum = 0 ne ich eksponowanie może być prawdziwą kator- wywołania funkcji zdefiniowanej w skrypcie spro-
gą dla programisty. W tym miejscu nie będę nawet wadza się do jednej linijki kodu:
for i = a, b, 1 do pokazywał przykładu takiego procesu – w zamian
sum = sum + i za to przedstawię rozwiązanie, które znacznie uła- luabind::call_function< int >( pL, "sum_
twi nam pracę w tym zakresie. Uwaga, uwaga... range", 1, 100 )
end
return sum Luabind nadciąga z odsieczą! Konstrukcja call _ function< int > jest in-
end; Mam nadzieję, że w pierwszej części artykułu uda- stancją funkcji szablonowej; wywołując ja musi-
ło mi się w klarowny sposób zaprezentować pod- my przekazać parametr szablonu określający typ

16 03/2009
Biblioteka Luabind

zwracany z funkcji wywoływanej ze skryptu Lua Listing 8. Dostęp do funkcji Lua z poziomu języka C++
(w naszym przypadku jest to int). Pierwszy pa-
rametr przekazywany do call _ function() to #include <cassert>
stan Lua, drugi to nazwa docelowej funkcji, na- #include <iostream>
stępnie – argumenty tej funkcji. W naszym przy- #include <string>
padku wywołujemy funkcję sum _ range() z pa- #include <lua.hpp>
rametrami 1 i 100; w wyniku otrzymujemy ko- using namespace std;
munikat: sum_range( 1, 100 ) = 5050 int run_lua_script( lua_State* pL, const char* name );
przy czym wartość 5050 została obliczona i int main()
zwrócona z funkcji zdefiniowanej w skryp- {
cie Lua. W sytuacji gdyby wywołanie funk- lua_State* pL = lua_open();
cji nie powiodło się z jakiegoś powodu, call_ luaL_openlibs( pL );
function() zgłosiłoby wyjątek luabind:: if ( run_lua_script( pL, "func.lua" ) )
error. {
return 1;
Luabind: Dostęp do funkcji }
C++ z poziomu programu Lua lua_getglobal( pL, "sum_range" );
Rozważmy teraz przypadek, w którym chcieliby- if ( !lua_isfunction( pL, -1 ) )
śmy udostępnić zadaną funkcję zdefiniowaną w {
programie C++ do skryptu Lua. Jako przykład wy- cout << "\n[C++]: ERROR: Invalid type! (function expected)\n";
korzystajmy ponownie funkcję print_ntimes(), return 1;
zdefiniowaną na Listingu 9. Listing 12 zawiera }
program realizujący to zadanie przy pomocy Lu- lua_pushnumber( pL, 1 );
abind. lua_pushnumber( pL, 100 );
W tym przypadku przewaga Luabind nad ma- lua_call( pL, 2, 1 );
nualnym mechanizmem eksponowania funk- int result = static_cast< int >( lua_tonumber( pL, -1 ) );
cji C++ do Lua jest wręcz porażająca. Wierzę, iż cout << "[C++]: sum_range( 1, 100 ) = " << result << endl;
pierwsza myśl pojawiająca się w głowie niejed- lua_pop( pL, 1 );
nego Czytelnika brzmi: jak to działa? Magia Lu- return 0;
abind opiera się na ciekawym paradygmacie pro- }
gramistycznym, tzw. metaprogramowaniu na ba-
zie szablonów języka C++ (ang. template metapro- Listing 9a. Eksponowanie funkcji C++ dla skryptu Lua
gramming). Mówiąc w dużym uproszczeniu – kod #include <iostream>
podobny do tego, który tworzony jest manualnie #include <string>
w przypadku budowania funkcji opakowującej #include <lua.hpp>
(patrz: Listing 9) – w przypadku Luabind genero- using namespace std;
wany jest w trakcie kompilacji przy pomocy dedy-
kowanego mechanizmu opartego na szablonach void print_ntimes( const string& str, int n )
C++. Wszystko to dzieje się w linii: {
while ( n-- )
luabind::module( pL )[ luabind::def( "print_ {
ntimes", print_ntimes cout << str << endl;
) ]; }
}
W tym miejscu, w globalnej przestrzeni nazw int print_ntimes( lua_State* pL )
umieszczona jest funkcja print _ ntimes(), {
przy czym jest ona związana (ang. bind) z funk- int argc = lua_gettop( pL );
cją o takiej samej nazwie – zdefiniowanej w na- if ( argc != 2 )
szym przykładowym programie. Voila! Zanim {
przejdziemy do kolejnego podpunktu, warto cout << "[C++]: print_ntimes: wrong number of parameters\n";
zwrócić uwagę, iż tym razem – dla odmiany – return 0;
do uruchomienia testowego skryptu wykorzy- }
stałem funkcję luaL _ dostring(). Funkcja ta if ( !lua_isstring( pL, 1 ) && !lua_isnumber( pL, 2 ) )
interpretuje skrypt zapisany w pamięci progra- {
mu (w naszym przypadku jest to zwyczajna sta- cout << "[C++]: print_ntimes: invalid types passed\n";
ła tekstowa). return 0;
}
Luabind: Eksponowanie string str = lua_tostring( pL, 1 );
klas C++ dla skryptów Lua int n = static_cast< int >( lua_tonumber( pL, 2 ) );
Widząc jak łatwo przy pomocy Luabind można print_ntimes( str, n );
zrealizować podstawowe zadania związane z łącze- return 0;
niem języków Lua i C++, większość Czytelników }
domyśla się zapewne, iż wiązanie klas będzie rów- int run_lua_script( lua_State* pL, const char* name );
nie proste. I tak właśnie jest w rzeczywistości.

www.sdjournal.org 17
Biblioteka miesiąca

Listing 9b. Eksponowanie funkcji C++ dla skryptu Lua


Na Listingu 13 przedstawiona jest przykładowa
klasa (point2d) reprezentująca punkt.
int main() Z kolei na Listingu 14 pokazane jest jak można
{ uczynić tę klasę widoczną dla skryptów Lua. Roz-
lua_State* pL = lua_open(); ważmy zawartość tych dwóch Listingów.
luaL_openlibs( pL ); Szkielet programu przedstawionego na wspo-
lua_register( pL, "cxx_print_ntimes", print_ntimes ); mnianym Listingu jest bardzo podobny do te-
if ( run_lua_script( pL, "cxx.lua" ) ) go, który zastosowaliśmy w przykładzie wiązania
{ funkcji. Podstawową różnicą jest zastosowanie sza-
return 1; blonu luabind::class_, który służy do ekspono-
} wania klas. W kolejnych liniach zawarte są instruk-
return 0; cje odpowiedzialne za generowanie kodu ekspo-
} nującego dla poszczególnych składników klasy:
na początku dwa konstruktory, następnie funkcja
Listing 10. Rozpoczynamy pracę z Luabind print oraz składowe. Przy tych ostatnich warto się
#include <lua.hpp> na moment zatrzymać. Dla przykładu, linia
#include <luabind/luabind.hpp>
int main() .property( "x", &point2d::get_x, &point2d::
{ set_x )
lua_State *pL = lua_open();
luabind::open( pL ); definiuje tzw. właściwość klasy (ang. property)
// ... z możliwością jego odczytu za pomocą funkcji
return 0; składowej get_x() oraz zapisu – przy pomoc set_
} x(). Dzięki temu w kodzie skryptu możemy napi-
sać następującą instrukcję:
Listing 11. Dostęp do funkcji Lua z poziomu języka C++, zrealizowany przy pomocy Luabind
#include <lua.hpp> p2.x = p1.y
#include <luabind/luabind.hpp>
#include <iostream> Na wyjściu przykładowego programu przedsta-
wionego na Listingu 14 otrzymamy następuja-
using namespace std; cy wynik:
int run_lua_script( lua_State* pL, const char* name );
int main() [2,4]
{ [3,3]
lua_State *pL = lua_open(); [4,10]
luabind::open( pL );
if ( run_lua_script( pL, "func.lua" ) == 1 ) Zaawansowane
{ możliwości Luabind
return 1; Przedstawione wyżej przykłady pokazują moc
} prostoty i elegancji drzemiącą w bibliotece Lu-
cout << "sum_range( 1, 100 ) = " abind, aczkolwiek stanowią one jedynie zalą-
<< luabind::call_function< int >( pL, "sum_range", 1, 100 ) żek możliwości tej biblioteki. Języki C++ i Lua
<< endl; różnią się mocno od siebie i przy łączeniu ich
return 0; razem pojawia się wiele wyzwań (podejrze-
} wam, że co bardziej uważni i dociekliwi Czy-
telnicy sami zauważyli niektóre z nich, ana-
Listing 12. Dostęp do funkcji C++ z poziomu języka Lua, zrealizowany przy pomocy Luabind lizując zawartość prezentowanych wyżej Li-
#include <lua.hpp> stingów). Luabind dokłada starań aby zaofe-
#include <luabind/luabind.hpp> rować wygodne mechanizmy wspomagające
#include <iostream> tę niełatwą integrację. Przedstawione powy-
using namespace std; żej udogodnienia będą zapewne wystarczają-
void print_ntimes( const string& str, int n ) { /* ... */ } ce dla większości standardowych zastosowań,
int main() aczkolwiek prędzej czy później przyjdzie nam
{ sięgnąć do arsenału bardziej zaawansowanych
lua_State *pL = lua_open(); możliwości Luabind. Poniżej zaprezentowana
luabind::open( pL ); jest pełna lista możliwości tej biblioteki:
luabind::module( pL )
[ • Wiązanie wolnych funkcji (włącznie z prze-
luabind::def( "print_ntimes", print_ntimes ) ciążaniem)
]; • Eksponowanie klas C++ dla skryptów Lua,
luaL_dostring( pL, "print_ntimes( \"Hello from Lua!\", 5 )\n" ); • Eksponowanie składowych klas dla skryp-
return 0; tów Lua,
} • Eksponowanie właściwości (ang. properties)
klas C++ dla skryptów Lua,

18 03/2009
Biblioteka Luabind

• Eksponowanie enumeracji C++ dla skryp- • Eksponowanie klas Lua dla programów C++, • Przeciążanie funkcji wirtualnych z klas C++
tów Lua, • Dziedziczenie klas (mechanizm ten dzia- w skryptach Lua,
• Eksponowanie funkcji Lua dla programów ła zarówno z Lua do C++ jak i z C++ do • Rozdzielne rejestrowanie modułów
C++, Lua), • Polityki wartości zwracanych i parametrów
• Obsługa błędów
• Obsługa wątków Lua
Listing 13. Przykładowa, prosta klasa reprezentująca punkt

class point2d Istota działania większość z wymienionych wy-


{ żej mechanizmów jest dość oczywista; w przy-
public: padku niektórych warto by pokusić się o dodat-
point2d( int x, int y ) : x_( x ), y_( y ) {} kowy opis – niestety, ze względu na ogranicze-
point2d( int x ) : x_( x ), y_( x ) {} nie długości niniejszego artykułu zmuszony by-
int get_x() const { return x_; } łem pominąć wspomniane opisy. W zamian za
void set_x( int x ) { x_ = x; } to – zapraszam zainteresowanych Czytelników
int get_y() const { return y_; } do lektury materiałów odnoszących się do tych
void set_y( int y ) { y_ = y; } tematów, a dostępnych bezpłatnie w Internecie
void print() (patrz: ramka W sieci).
{
cout << '[' << x_ << ',' << y_ << ']' << endl; Luabind: ograniczenia
} Nie ma róży bez kolców: Luabind również posiada
private: pewne ograniczenia. Choć jest to nieco paradok-
int x_; salne, podstawową wadą biblioteki jest jednocze-
int y_; śnie to co stanowi o jej olbrzymiej mocy i użytecz-
}; ności – mowa tu oczywiście o mechanizmie meta-
programowania bazującego na szablonach. Korzy-
Listing 14. Eksponowanie klasy C++ dla skryptu Lua przy pomocy Luabind stanie z Luabind powoduje znaczący wzrost czasu
#include <lua.hpp> kompilacji – zwłaszcza w przypadku projektów, w
#include <luabind/luabind.hpp> których rejestracja modułów odbywa się w wielu
int main() plikach źródłowych. Sami autorzy biblioteki zale-
{ cają zresztą aby (w miarę możliwości) wspomnia-
lua_State *pL = lua_open(); na rejestracja odbywała się w ograniczonej liczbie
luabind::open( pL ); plików (najlepiej w jednym). Niestety – problem
luabind::module( pL ) ten dotyka praktycznie wszystkich bibliotek, które
[ intensywnie korzystają z mechanizmów metapro-
luabind::class_< point2d >( "point2d" ) gramowania opartego na szablonach języka C++.
.def( luabind::constructor< int, int >() )
.def( luabind::constructor< int >() ) Podsumowanie
.def( "print", &point2d::print ) W powyższym artykule przedstawiłem mecha-
.property( "x", &point2d::get_x, &point2d::set_x ) nizm integrowania języków Lua i C++ na bazie
.property( "y", &point2d::get_y, &point2d::set_y ) prostego API opartego na czystym C, pokazałem
]; wady i ograniczenia takiego podejścia oraz za-
luaL_dostring( pL, proponowałem alternatywę w postaci bibliote-
"p1 = point2d( 2, 4 )\n" ki Luabind. Rozważając kolejne przykłady poka-
"p1:print()\n" załem jak wspomniane rozwiązanie pozwala ła-
"p2 = point2d( 3 )\n" two i wygodnie łączyć dwa pięknie dopełniają-
"p2:print()\n" ce się języki programowania. Gorąco zachęcam
"p2.x = p1.y\n" Czytelników do wypróbowania tego koktajlu
"p2.y = 10\n" – dzięki Luabind jest on zdecydowanie łatwiej-
"p2:print()" ); szy do przełknięcia.
return 0;
} RAFAŁ KOCISZ
Pracuje na stanowisku Dyrektora Technicznego w
firmie Gamelion, wchodzącej w skład Grupy BLStre-
am. Rafał specjalizuje się w technologiach zwią-
W Sieci zanych z produkcją oprogramowania na platfor-
my mobilne, ze szczególnym naciskiem na tworze-
• http://www.lua.org/ – strona domowa języka Lua;
• http://luabinaries.luaforge.net/ – stąd można pobrać binarną dystrybucję interpretera i bi- nie gier. Grupa BLStream powstała, by efektywniej
blioteka języka Lua; wykorzystywać potencjał dwóch szybko rozwijają-
• http://en.wikipedia.org/wiki/Lua_(programming_language) – podstawowe informacje na te- cych się producentów oprogramowania – BLStre-
mat języka Lua; am i Gamelion. Firmy wchodzące w skład grupy
• http://lua-users.org/wiki/TutorialDirectory – samouczki poświęcone językowi Lua; specjalizują się w wytwarzaniu oprogramowania
• http://www.rasterbar.com/products/luabind.html – strona domowa biblioteki Luabind
dla klientów korporacyjnych, w rozwiązaniach mo-
• http://www.rasterbar.com/products/luabind/docs.html – rozbudowany opis możliwości biblio-
teki Luabind. bilnych oraz produkcji i testowaniu gier.
Kontakt z autorem: rafal.kocisz@game-lion.com

www.sdjournal.org 19
Programowanie Java

Spring Java
Configuration Project
Alternatywa dla tradycyjnej konfiguracji XML
Twórcy projektu Spring Framework spróbowali zminimalizować ilość
konfiguracji XML poprzez przeniesienie źródeł definicji komponentów do
plików języka Java. Spring Java Configuration Project to alternatywa dla
klasycznego podejścia do zagadnienia konfiguracji aplikacji internetowych,
która równocześnie nie narusza wzorca Inversion Of Control oraz ogólnej
elegancji architektury naszej aplikacji.
miar części konfiguracji charakterystycznej dla
Dowiesz się: Powinieneś wiedzieć: naszego projektu.
• Jak można konfigurować kontener IOC (Inver- • Podstawowa znajomość języka Java oraz kon- Załóżmy, że kiedy powyższe techniki nie dają
sion Of Control) Springa za pomocą klas języka figuracji kontenera Inversion Of Control dla nam satysfakcjonującego poziomu zredukowania
Java; Spring Framework 2.x za pomocą plików XML. konfiguracji, decydujemy się na użycie adnotacji.
• Dlaczego warto posiąść taką umiejętność; Dla przykładu, zastępujemy konfigurację transak-
• Jak połączyć klasyczną konfigurację XML z in- cji dokonywaną za pomocą przestrzeni nazw tx,
nowacyjnym podejściem do tematu oferowa- na adnotacje @Transactional. I to właśnie jest klu-
nym przez Java Configuration Project. czowy moment w naszej opowieści – coś w nas
pękło. Po raz pierwszy przełamaliśmy tabu kon-
figuracji XML i przenieśliśmy część tej odpowie-
kacji internetowych jest XML. Co za tym idzie, dzialności do kodu aplikacji. Co prawda są to tyl-
wśród projektów opartych na Spring Framework ko metadane, bo adnotacje to w końcu żaden kod.
Poziom trudności funkcjonują w zasadzie tylko konteksty aplikacji Załóżmy, że adnotacje nie kłócą się z naszym poj-
analizujące dokumenty w tym formacie. Czytając mowaniem wzorca Inversion Of Control. Nieste-
dokumentację Springa lub artykuły na jego temat ty dalsze przenoszenie odpowiedzialności za kon-
można wręcz odnieść wrażenie, że nie ma innego figurację z XML-a do kodu jakiejkolwiek warstwy

T
rudno znaleźć użytkownika szkieletu sposobu na konfigurację aplikacji napisanych z je- aplikacji spowoduje powolną regresję do stanu,
aplikacyjnego Spring Framework, który go użyciem. któremu Spring wraz ze swoim kontenerem IoC
nie wiedziałby, czym jest XML. Sądzę właśnie zapobiegają.
również, że żaden z takowych nie uniknął w swo- Motywacja Może zatem wypracujemy jakiś kompromis
jej karierze edycji dokumentu XML rozpoczyna- XML jest bardzo wygodnym formatem konfi- pomiędzy unikaniem XML-a a przenoszeniem
jącego się elementem <beans>. Oczywiście twór- guracji – z tym stwierdzeniem zapewne zgo- konfiguracji do kodu? A gdybyśmy tak np. stwo-
cy Springa udostępnili nam na tyle ogólny mecha- dzi się większość z nas. Niemniej jednak wraz rzyli osobny plik języka Java, który pozwoliłby
nizm programowej obsługi kontenera IoC (Inver- ze wzrostem złożoności projektu nietrudno po- nam na przeniesienie części konfiguracji z do-
sion Of Control), że bez większych problemów czuć subtelne uczucie przytłoczenia rozmiarem kumentu XML? Taki plik logicznie znajdowałby
możemy dodawać do niego definicje ziaren sprin- dokumentu applicationContext.xml, który na po- się poza wszystkimi warstwami aplikacji (zatem
gowych (znanych również jako beany) zbudowa- czątku wydawał się nam tak zgrabny, minimali- nie mieszamy logiki aplikacji z logiką konfigura-
nych w języku Java lub zawartych w plikach pro- styczny i czytelny. Postanawiamy zatem go od- cji), a jedyną częścią systemu, która byłaby zależ-
perties. Mało tego, możemy nawet przy nadmia- chudzić. Zaczynamy wydzielać wspólne części na od niego, to kontener IoC (zatem i ten wzo-
rze wolnego czasu napisać samodzielnie imple- konfiguracji i tworzymy abstrakcyjne definicje rzec pozostanie nienaruszony). Wspominałem
mentację interfejsu org.springframework.beans.fac- beanów. Decydujemy się na rezygnację z pełnej wcześniej, że twórcy Springa pozwolili nam na
tory.BeanFactory, który będzie odczytywać defi- kontroli nad zależnościami na rzecz automatycz- eleganckie rozszerzanie mechanizmu rozpozna-
nicje naszych komponentów z najbardziej nawet nego wiązania (autowiring). Dzielimy plik konfi- wania źródeł definicji komponentów. Kuszącą
niecodziennych źródeł (bazy danych, dokumen- guracyjny na logiczne moduły, które następnie perspektywą wydaję się więc odczytywanie de-
tów w formacie JSON, hierarchii systemu pli- umieszczamy w osobnych plikach i importuje- finicji beanów z odpowiednio napisanej, prostej
ków, etc.). Niezależnie od chwały należnej auto- my do głównej konfiguracji. Wreszcie, zdespe- klasy języka Java. Taką skompilowaną klasę mo-
rom Springa za elegancję jego architektury, fak- rowani, piszemy własny schemat XML i za po- glibyśmy analizować za pomocą mechanizmu
tem jest, że de facto standardem konfiguracji apli- mocą własnej przestrzeni nazw redukujemy roz- refleksji oraz poprzez rozpoznawanie określo-

20 03/2009
Spring Java Configuration Project

nych adnotacji naniesionych na nią lub na jej me- mość możliwości analizowania odpowiednich guracją swojego kontenera IoC. Nasz kontener
tody. Fizycznie plik języka Java stanowiłby źró- klas języka Java) oraz post processor służący do mógłby zawierać jeden komponent springowy
dło konfiguracji, ale z punktu widzenia architek- zintegrowania istniejących konfiguracji XML z – niech to będzie zwykły string. Kod potrzeb-
tury byłby on logicznie tożsamy z plikiem XML nową konfiguracja JavaConfig. ny do uruchomienia tej przykładowej aplikacji
(Rysunek 1.). O możliwościach rozwoju tego projektu znajduje się na Listingu 1.
Wizja ciekawa, ale ktoś już nas uprzedził. może świadczyć osobiste zaangażowanie Ro- W stosunku do konfiguracji kontenera IoC
Twórcy Springa już w 2005 roku rozpoczęli da Johnsona (głównego architekta Springa) w za pomocą XML-a pojawiły się trzy nowości:
pracę nad projektem Java Configuration (w rozwój oraz promowanie Java Configuration
skrócie JavaConfig) realizującym ten pomysł. Project. Jeżeli uznamy intuicję Pana Johnsona • oznaczenie klasy, zawierającej konfigura-
za wyznacznik pewnych trendów w programo- cję adnotacją @Configuration,
Konfiguracyjny flamewar waniu, to możemy spodziewać się wzrostu zna- • oznaczenie adnotacją @Bean metody, któ-
Zanim przejdziemy dalej, pragnąłbym zwrócić czenia tej nowej techniki konfiguracji w aplika- rej wynik ma zostać zarejestrowany w
uwagę na fakt, że zarówno podejście lansowa- cjach internetowych. kontenerze jako bean,
ne przez np. Google Guice, Spring Java Confi- • użycie kontekstu aplikacji świadomego
guration Project, jak i jakiekolwiek inne odej- Hello World, Bye XML klas zgodnych z Java Configuration.
ście od XML-a na rzecz konfigurowania aplika- Chcielibyśmy móc z czystym sumieniem powie-
cji poprzez chociażby adnotacje lub XDoclety (a dzieć, że kiedyś napisaliśmy coś w Java Configura- Hello World z wiązaniem
już w szczególności kod języka Java, analizowany tion. Skonfigurujemy zatem kontener IoC Springa Od kontenera IoC oczekujemy najczęściej, że bę-
na poziomie wykonywania programu) mają pra- bez jednej linijki XML-a, wyłącznie w czystej Javie. dzie w stanie wstrzykiwać zależności. Aby udo-
wo budzić kontrowersje. Kierunek redukowania Załóżmy, że chcemy napisać aplikację kon- wodnić, że i Java Configuration nie jest pozbawio-
tzw. XML hell na rzecz czegokolwiek bliższego solową, której klasa jest równocześnie konfi- ny tej funkcjonalności, spróbujmy rozszerzyć nasz
językowi aplikacji nie jest standardem w świecie
aplikacji zdominowanych przez XML. Dla wielu Listing 1. Najprostszy przykład użycia JavaConfig
podejście reprezentowane przez Java Configura-
tion jest nie do zaakceptowania i w ich opinii na- package pl.hekonsek;
rusza realizację wzorca IoC.
Celem tego artykułu nie jest stwierdzenie, import org.springframework.config.java.annotation.Bean;
że przedstawiona w nim technika konfiguracji import org.springframework.config.java.annotation.Configuration;
jest lepsza lub gorsza od jakiejkolwiek innej. import org.springframework.config.java.context.JavaConfigApplicationContext;
Unikałbym zbędnego wartościowania konfi- import org.springframework.context.ApplicationContext;
guracji XML oraz nowszych technik, używa-
nych do jej redukcji. JavaConfiguration to po // To jest konfiguracja Java Configuration
prostu alternatywa. A już do architekta kon- @Configuration
kretnego projektu należy decyzja (i związana public class Application {
z nią odpowiedzialność), czy taka opcja wyj-
dzie na lepsze. /** Tożsame z...
* <bean id="myBean" class="java.lang.String">
JavaConfig * <constructor-arg value="foo"/>
Spring Java Configuration Project (w skrócie na- * </bean>
zywany po prostu Spring JavaConfig) to jeden z */
podprojektów Springa. Dostarcza on nowe źró- @Bean
dło konfiguracji dla kontenera IoC, zatem wśród public String myBean() {
jego zależności możemy znaleźć głównie powią- return "foo";
zania ze Spring Core. Java Configuration oferu- }
je m.in.: zbiór adnotacji (używanych do ozna-
czania klas i ich poszczególnych elementów ja- public static void main(String[] args) {
ko konfiguracji kontenera), nowe implementa- // Stwórz kontekst świadomy analizy plików Java Configuration
cje kontekstu aplikacji (rozbudowane o świado- // i dodaj do niego klasę zawierającą taką konfigurację.
ApplicationContext ac = new JavaConfigApplicationContext(
Application.class);
��������� System.out.println(ac.getBean("myBean"));
}
�����������
}
��������
����������
Listing 2. Najprostsze wiązanie w XML
����� ����� <bean id="wireSth" class"java.lang.String">
<constructor-arg ref="wireMe" />
�������������������� ���������� </bean>
�������� ������������

<bean id="wireMe" class"java.lang.String">

Rysunek 1. Uproszczony schemat zależności <constructor-arg value="foo />


między aplikacją, kontenerem IoC Springa oraz </bean>
źródłami jego konfiguracji

www.sdjournal.org 21
Programowanie Java

przykład o najprostsze wiązanie. Chcielibyśmy za Szczegółowe dą funkcjonalność konfiguracji XML? Czy


pomocą JavaConfig uzyskać konfigurację XML, przykłady konfiguracji nie jest to tylko zabawka oferująca najprost-
analogiczną do tej z Listingu 2. Odpowiedni wy- szy podzbiór możliwości kontenera konfigu-
cinek w Java Configuration widać na Listingu 3. A czy w Java Configuration tak mogę? rowanego za pomocą XML-a? Otóż nie, nie
– wiązanie odbywa się po prostu przez wywoła- Zapewne niektórzy z was zadają sobie już py- jest to tylko zabawka, ale w pełni funkcjo-
nie metody oznaczonej adnotacją @Bean. tanie, czy w JavaConfig można uzyskać każ- nalna alternatywa dla tradycyjnej konfigura-
cji. Na poparcie tych słów pozwolę sobie na
Listing 3. Najprostsze wiązanie w Java Configuration rozwianie typowych wątpliwości, pojawiają-
cych się na początku przygody z Java Confi-
package pl.hekonsek; guration.

import org.springframework.config.java.annotation.Bean; Cykl życia ziarna


import org.springframework.config.java.annotation.Configuration; springowego w kontenerze
import org.springframework.config.java.context.JavaConfigApplicationContext; Spring oferuje pokaźną listę możliwych wywo-
import org.springframework.context.ApplicationContext; łań zwrotnych, które pozwalają nam na wstrze-
@Configuration lenie się z naszym kodem w różne momenty ży-
public class Application { cia naszej instancji, np. poprzez interfejsy z se-
rii *aware (np. BeanNameAware) lub Initiali-
@Bean zingBean (Listing 4.). Mam dobra wiadomość
public String wireMe() { – wszystkie one są obsługiwane przez JavaCon-
return "foo"; fig. Wynika to z faktu, że implementacje inter-
} face'u ApplicationContext, dostarczane przez
Java Configuration, rozszerzają bazowe wersje,
@Bean istniejące w Spring Core, tak więc mechanika
public String wireSth() { związana z analizą cyklu życia jest realizowana
// wywołanie metody oznaczonej jako @Bean przez oryginalny kod Springa.
return new String( wireMe() );
} Cykl życia
– przekazywanie nazwy metody
public static void main(String[] args) { A co, gdy chcemy użyć odpowiedników metod
ApplicationContext ac = new JavaConfigApplicationContext( wskazanych przez atrybuty init-method lub
Application.class); destroy-method z konfiguracji XML (Listing
System.out.println(ac.getBean("wireSth")); 5.)? W końcu musimy wpisać je w pliku XML.
} Oczywiście i tutaj Java Configuration pozwa-
la nam na podanie odpowiedniej nazwy meto-
} dy, tyle że nie w XML-u. Java Configuration
pozwala nam na podanie odpowiedniej nazwy
Listing 4. Przykład klasy świadomej swojego cyklu życia w kontenerze metody w ramach atrybutu initMethodName
package pl.hekonsek; lub destroyMethodName adnotacji @Bean (Li-
sting 6.).
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean; Cykl życia – BeanPostProcessors
Co z implementacjami interface'u BeanPost-
public class LifeCycleBean implements InitializingBean, BeanNameAware { Processor? Oczywiście spełniają swoją funk-
cję, jak powinny – ponownie kod, rozszerza-
@Override ny przez implementacje interface'u Appli-
public void afterPropertiesSet() throws Exception { cationContext deleguje sterowanie do kodu
} Spring Core odpowiedzialnego za tą funkcjo-
nalność. Zatem PostProcessory zostaną odpa-
@Override lone na zawartości kontenera, nie wnikając w
public void setBeanName(String name) { to, czy źródłem zawartych w nim instancji
} jest plik XML, czy klasa zgodna z Java Con-
figuration.
}
Zasięg instancji
Listing 5. Deklaracja metod init-method oraz destroy-method w XML-u Domyślnie instancje, zarejestrowane za po-
<bean class="com.Foo" init-method="start" destroy-method="close"/> mocą Java Configuration, mają (podobnie
jak w konfiguracji XML) zasięg singleton.
Listing 6. Deklaracja metod init oraz destroy w JavaConfig Aby wybrać inny zasięg, należy podać go ja-
@Bean(initMethodName="start",destroyMethodName="close") ko parametr adnotacji. Parametr scope jest
public Foo foo() { typu string, tak więc możemy podawać rów-
return new Foo(); nież własne zasięgi, o ile zarejestrujemy tako-
} we w kontenerze. Przykłady znajdują się na
Listingu 7.

22 03/2009
Spring Java Configuration Project

Wstrzykiwanie nietypowych wana przez nas metoda @Bean będzie miała wi- na definicja beana będzie umieszczona w po-
zasięgów przez Scoped Proxy doczność domyślną lub chronioną (w starszych mocniczym kontekście-potomku i będzie nie-
Jeżeli w konfiguracji XML chcemy wstrzyknąć wersjach JavaConfig również prywatną), to da- widoczna dla innych kontekstów w hierarchii
do beana typu singleton zależność o zasięgu ty-
pu np. session lub request, to musimy od- Listing 7. Przykłady zmiany domyślnego zasięgu instancji w kontenerze
powiadającą jej definicję oznaczyć jako <aop:
scoped-proxy/>. @Bean(scope = DefaultScopes.SINGLETON)
Wynika to z węższego zakresu działania public String wireMe() {
singletona w porównaniu z przekazywanymi return "foo";
(wstrzykiwanymi) obiektami. A ponieważ se- }
sje oraz żądania HTTP zwykły żyć krócej niż
aplikacja (wraz ze swoimi singletonami), tak @Bean(scope = DefaultScopes.PROTOTYPE)
więc naprawdę Spring musi wstrzyknąć do public String wireMe() {
takiego singletona pośrednika, który będzie return "foo";
żył tak długo, jak obiekt, do którego wstrzy- }
kuje się zależność (i przekierowywało żąda-
nia do odpowiedniej instancji o krótszym za- @Bean(scope = "myCustomScope")
sięgu życia). public String wireMe() {
Oczywiście Java Configuration również udo- return "foo";
stępnia taką funkcjonalność. Wystarczy spoj- }
rzeć na porównanie Listingów 8 oraz 9.
Listing 8. Scoped Proxy w XML-u
Zmiana domyślnych <bean id="cart" class="pl.hekonsek.Cart" scope="session">
polityk rejestracji instancji <aop:scoped-proxy/>
Konfiguracja XML pozwala nam na globalne </bean>
określenie polityki tworzenia instancji zdefi- <bean id="cartVerifier" class="pl.hekonsek.CartVerifier">
niowanych w pliku XML (patrz Listing 10.). <property name="cart" ref="cart"/>
Podobny efekt możemy osiągnąć za pomocą </bean>
parametryzowania adnotacji @Configuration
(patrz Listing 11.). Listing 9. Scoped Proxy w Java Configuration
@Bean(scope = DefaultScopes.SESSION)
Method injection @ScopedProxy
Poza najbardziej popularnymi sposobami public Cart cart() {
wstrzykiwania zależności tzn. wstrzykiwa- return new Cart();
niu przez metodę ustawiającą (setter injection) }
oraz konstruktor (constructor injection) Spring
oferuje tzw. metodę wstrzykującą (method in- @Bean
jection). Technika ta jest przydatna zwłaszcza public CartVerifier cartVerifier() {
w scenariuszu, w którym potrzebujemy, aby CartVerifier cv = new CartVerifier();
bean typu singleton mógł uzyskać nowy eg- cv.setCart(cart());
zemplarz beana o zasięgu prototype, zarządza- return cv;
nego przez kontener IoC, za każdym razem, }
kiedy ów singleton odwołuje się do swojej za-
leżności. Tradycyjne wstrzyknięcie zależno- Listing 10. Konfigurowanie domyślnej polityki tworzenia i wiązania instancji w XML
ści przez konstruktor lub metodę ustawiają- <beans default-autowire="byName" default-lazy-init="false" ... ></beans>
cą będzie tutaj niewystarczające, gdyż proto-
typy są tworzone i wstrzykiwane do singleto- Listing 11. Konfigurowanie domyślnej polityki tworzenia i wiązania instancji w Java Configuration
nów tylko w momencie ustawiania zależności package pl.hekonsek;
tych drugich.
Metoda wstrzykująca jest dostępna w Java import org.springframework.beans.factory.annotation.Autowire;
Configuration w bardzo intuicyjny sposób import org.springframework.config.java.annotation.Bean;
– poprzez implementację lub nadpisanie żą- import org.springframework.config.java.annotation.Configuration;
danej metody w klasie wewnętrznej (najczę- import org.springframework.config.java.annotation.Lazy;
ściej anonimowej) i odwołanie się do meto-
dy tworzącej prototyp. Style użycia metody @Configuration(defaultAutowire=Autowire.BY_NAME,defaultLazy=Lazy.FALSE)
wstrzykującej klasy z Listingu 12. w XML-u public class Application {
oraz Java Configuration porównują Listingi
13 oraz 14. @Bean(autowire=Autowire.BY_TYPE)
public String wireMe() {
Ukrywanie definicji beanów return "foo";
Nieco mniej oczywistą, a bardzo ciekawą opcją, }
oferowaną przez Java Configuration, jest moż-
liwość ukrywania swoich instancji przed inny- }
mi kontekstami w hierarchii. Jeżeli zdefinio-

www.sdjournal.org 23
Programowanie Java

niż ten, który ją definiuje. Możemy dzięki temu cji XML. Możemy np. dodać do naszej apli- Tą metodą możemy cieszyć się możliwościa-
tworzyć pomocnicze instancje, które nie będą kacji skonfigurowanej w XML PostProcessor mi JavaConfig tylko dla wybranych przez nas
widoczne dla innych poziomów aplikacji. org.springframework.config.java.process.Con- fragmentów konfiguracji, podczas gdy więk-
figurationPostProcessor. Następnie należy do- szość definicji dalej będziemy trzymać w for-
Integracja dać definicje naszych klas konfiguracyjnych macie XML. Co ważne, ConfigurationPostPro-
konfiguracji XML oraz JavaConfig do kontenera (Listing 15.). Wspomniany cessor pozwala nam na płynną migrację konfi-
przez nas PostProcessor wykryje, że są one guracji z XML-a do JavaConfig. Dzięki temu
Dodatek do XML-a oznaczone adnotacją @Configuration i do- nie jesteśmy stawiani przed wyborem, którego
Oczywiście Java Configuration nie wymu- da znajdujące się w nich definicje do kon- konsekwencją może być poważna zmiana w ar-
sza od nas całkowitej rezygnacji z konfigura- tenera. chitekturze konfiguracji naszej aplikacji.

Listing 12. Klasy służące do demonstracji metody wstrzykującej Nadpisywanie definicji


Ciekawą opcją oferowaną przez JavaConfig (a
package pl.hekonsek; przydatną zwłaszcza w kontekście integracji
z XML-em) jest możliwość oznaczenia defini-
public abstract class StringHolder { cji beana parametrem allowOverriding. Dzię-
ki temu zarejestrowanie w konfiguracji XML
public abstract String getString(); instancji o tej samej nazwie przesłoni tą zdefi-
niowaną w JavaConfig. Jest to funkcjonalność
} przydatna zwłaszcza wtedy, gdy JavaConfig
planujemy używać do bardziej ogólnych (a za-
package pl.hekonsek; razem domyślnych) fragmentów konfiguracji,
podczas gdy XML-owi pozostawiamy rolę kon-
import java.util.Date; figuracji szczegółowej. Przykład takiego podej-
ścia demonstrują Listingi 16 oraz 17.
class DateString {
JavaConfig w aplikacjach internetowych
public Date date = new Date(); Jedną technikę integracji Java Configuration z
aplikacjami webowymi już poznaliśmy. Jest to
} dodanie do pliku XML naszej konfiguracji Post-
Processora org.springframework.config.java.pro-
Listing 13. Metoda wstrzykująca w XML-u cess.ConfigurationPostProcessor. Niezależnie od
<bean id="prototype" class="pl.hekonsek.DateString"/> tej możliwości możemy użyć kontekstu apli-
kacji dedykowanego JavaConfig i aplikacjom
<bean id="holder" class="pl.hekonsek.StringHolder> internetowym. Implementacja org.springfra-
<lookup-method name="getString" bean="prototype"/> mework.config.java.JavaConfigWebApplication-
</bean> Context w zasadzie niewiele różni się od np. tra-
dycyjnego org.springframework.web.context.sup-
Listing 14. Metoda wstrzykująca w Java Configuration port.XmlWebApplicationContext. O ile ten dru-
@Bean(scope = DefaultScopes.PROTOTYPE) gi jako wartość contextConfigLocation pobiera li-
public DateString prototype() { stę lokalizacji plików XML, to pierwszy wczy-
return new DateString(); tuje listę klas języka Java. Przykład użycia kon-
} tekstu aplikacji oferowanego przez Java Confi-
guration znajduje się na Listingu 18.
@Bean
public StringHolder holder() { Modularyzacja konfiguracji
return new StringHolder() {
Wszystko można zapchać
@Override Oczywiście konfiguracja w klasach JavaConfig
public String getString() { może być po pewnym czasie, wraz z rozrostem
return prototype().date.getTime() + ""; aplikacji, równie uciążliwa w utrzymaniu i
} kontroli, co monolityczny plik XML. Java Con-
}; figuration oferuje na szczęście szereg mechani-
} zmów służących do podziału klas konfiguracyj-
nych na mniejsze elementy.
Listing 15. Integracja konfiguracji XML i JavaConfig
<beans ... > Dostęp do instancji z innych klas i źródeł
<!-- Dodaj konfigurację do kontenera --> Podstawowym zagadnieniem pojawiającym
<bean class="pl.hekonsek.MyConfigurationClass"/> się podczas modularyzacji klas JavaConfig jest
<!-- Lub dodaj do kontenera wszystkie konfiguracje oznaczone jako @Component --> dostęp do metod definiujących instancje z in-
<context:component-scan base-package="pl.hekonsek.*"/> nych klas lub źródeł danych. Jeżeli np. inte-
<bean class="org.springframework.config.java.process.ConfigurationPostProcessor"/> grujemy Java Configuration z aplikacją zarzą-
</beans> dzaną za pomocą XML-a (poprzez Configura-
tionPostProcessor) to tracimy możliwość od-

24 03/2009
Spring Java Configuration Project

wołania się z poziomu klasy oznaczonej adno-


tacją @Configuration do instancji zdefiniowa- Listing 16. Definicja domyślna komponentu w JavaConfig
nej w pliku XML. Dzieje się tak z prozaiczne- package pl.hekonsek;
go powodu – Java jest językiem statycznie ty-
powanym i nie pozwoli nam na wywoływanie import org.springframework.config.java.annotation.Bean;
w ramach klasy metody o arbitralnej nazwie. import org.springframework.config.java.annotation.Configuration;
Logicznie wiemy, że np. definicja beana o na-
zwie notDefinedHere znajduje się w kontene- @Configuration
rze, ale składnia języka Java nie pozwoli nam na public class Application {
odwołanie się do metody o takiej nazwie (a jak
wiadomo, jest to sposób na odnoszenie się in- @Bean(allowOverriding = true)
nych obiektów w kontenerze za pomocą Java- public String username() {
Config). Problem ten obrazuje Listing 19. Mu- return "root";
simy zatem zdefiniować metodę pomocniczą, }
która pozwoli nam na odwołanie się do instan-
cji zdefiniowanej poza daną klasą. Metoda ta- }
ka może być abstrakcyjna (notabene stąd wnio-
sek, że i klasy JavaConfig mogą być abstrakcyj- Listing 17. Nadpisywanie domyślnej wartości za pomocą XML-a
ne, oraz że są one proxowane za pomocą biblio- <beans ... >
teki służącej do dynamicznej generacji kodu) <!-- Dodaj konfigurację do kontenera -->
lub konkretna (zostanie ona nadpisana przez <bean class="pl.hekonsek.Application"/>
JavaConfig) oraz musi być oznaczona adnota- <!-- Nadpisz instancję reprezentującą domyślną nazwę użytkownika -->
cją @ExternalBean. Rozwiązanie problemu z <bean id="username" class="java.lang.String">
Listingu 19. za pomocą takiej właśnie metody <constructor-arg value="hekonsek"/>
demonstruje listing 20. </bean>
Analogiczny problem wystąpi podczas roz- <bean class="org.springframework.config.java.process.ConfigurationPostProcessor"/>
dzielania klasy konfiguracyjnej na mniejsze, ale </beans>
bardziej spójne logicznie. Ponownie z pomocą
przybywa adnotacja @ExternalBean. Listing 18. Konfiguracja internetowego kontekstu aplikacji świadomego javaConfig
<web-app>
Rozbijanie konfiguracji na wiele klas <!-- Główny kontekst aplikacji. -->
Najprostszą techniką rozbijania konfigura- <listener>
cji jest przeniesienie części metod z klasy kon- <listener-class>org.springframework.web.context.ContextLoaderListener</
figuracyjnej do drugiej klasy i dodanie oby- listener-class>
dwu do kontekstu. Listing 21. pokazuje przy- </listener>
kład podziału klasy na dwie mniejsze z zacho- <context-param>
waniem wzajemnych referencji za pomocą <param-name>contextClass</param-name>
@ExternalBean. <param-value>org.springframework.config.java.JavaConfigWebApplicationContext</
param-value>
Adnotacja @Import </context-param>
Podobnie jak w przypadku XML-a i jego ele- <!-- Lokalizacje klas zamiast plików XML -->
mentu <import/>, konfiguracja JavaConfig <context-param>
również może importować inne klasy oznaczo- <param-name>contextConfigLocation</param-name>
ne adnotacją @Configuration. Aby tego doko- <param-value>pl.hekonsek.ApplicationContext</param-value>
nać, wystarczy oznaczyć klasę konfiguracyjną </context-param>
adnotacją @Import({foo.Config1.class,foo <!-- Główny servlet aplikacji... -->
.Config2.class}). <!-- ...konfigurowany tak samo, jak kontekst powyżej. -->
<servlet>
Wewnętrzne klasy konfiguracyjne <servlet-name>app</servlet-name>
oraz zasięg widoczności obiektu <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-
Zastosowanie klasy wewnętrznej w JavaCon- class>
fig spowoduje utworzenie dla niej osobnego <init-param>
kontekstu aplikacji, będącego potomkiem kla- <param-name>contextClass</param-name>
sy zewnętrznej. Konteksty te podlegają oczywi- <param-value>org.springframework.config.java.JavaConfigWebApplicationContex
ście zasadom hierarchii kontenerów IoC Sprin- t</param-value>
ga (co demonstruje Listing 22.). </init-param>
<init-param>
Specjalnie nie piszę o... <param-name>contextConfigLocation</param-name>
<param-value>pl.hekonsek.AppServletConf,pl.hekonsek.AppServletDaoConf</
Wsparciu w Spring IDE param-value>
Spring IDE to znakomity plugin do Eclipse IDE, </init-param>
wspomagający pracę ze Springiem. Ma już opcjo- </servlet>
nalne wsparcie dla JavaConfig. Szczegóły jego </web-app>
użycia są poza zasięgiem tematycznym tego ar-

www.sdjournal.org 25
Programowanie Java

tykułu (jakkolwiek jest ono na tyle intuicyjne, że duje się wciąż w fazie rozwojowej, pewne funk- @ResourceBundles oraz @ExternalValue
nikt nie powinien mieć z nim problemów). cjonalności oferowane przez projekt mogą ulec @ResourceBundles oraz @ExternalValue to pa-
gruntownej zmianie. Takie newralgiczne frag- ra adnotacji pozwalających na uzyskanie funkcjo-
Kwestii stabilności menty API zostały przeze mnie umyślnie po- nalności podobnej do tej oferowanej przez Pro-
Aktualna wersja JavaConfig to 1.0.0.m3. Ze mięte, jakkolwiek myślę, że warto o nich wspo- pertyPlaceholderConfigurer. Pierwsza z nich ła-
względu na fakt, że Java Configuration znaj- mnieć w dużym skrócie. duje pliki z właściwościami, druga zaś pozwala

Listing 19. Problem z kompilacją klasy JavaConfig odnoszącej się do zewnętrznej definicji

package pl.hekonsek; public StringHolder referencer() {


// Wstrzyknij referencję do beana 'notDefinedHere'
import org.springframework.config.java.annotation.Bean; // Compilation error:
import org.springframework.config.java.annotation.Configuration; // The method notDefinedHere() is undefined for the type
Application
@Configuration return new StringHolder(notDefinedHere());
public class Application { }

@Bean }

Listing 20. Rozwiązanie problemu z kompilacją klasy JavaConfig odnoszącej się do zewnętrznej definicji
package pl.hekonsek; not be executed.");
}
import org.springframework.config.java.annotation.Bean;
import org.springframework.config.java.annotation.Configuration; @Bean
import org.springframework.config.java.annotation.ExternalBean; public StringHolder referencer() {
// Wstrzyknij referencję do beana 'notDefinedHere'
@Configuration return new StringHolder(notDefinedHere());
public class Application { }

@ExternalBean }
public String notDefinedHere() {
throw new RuntimeException("Assertion - this line must

Listing 21. Rozbicie dużej konfiguracji na dwie mniejsze klasy

Większa klasa public String foo() {


package pl.hekonsek; throw new RuntimeException("This line should never be
import org.springframework.config.java.annotation.Bean; executed.");
import org.springframework.config.java.annotation.Configuration; }
@Configuration @Bean
public class BigConf { public StringHolder fooHolder() {
return new StringHolder(foo());
@Bean }
public String foo() {
return "foo"; }
} Mniejsza klasa nr 2
package pl.hekonsek;
@Bean import org.springframework.config.java.annotation.Bean;
public StringHolder fooHolder() { import org.springframework.config.java.annotation.Configuration;
return new StringHolder(foo()); @Configuration
} class SmallConf2 {

} @Bean
Mniejsza klasa nr 1 public String foo() {
package pl.hekonsek; return "foo";
import org.springframework.config.java.annotation.Bean; }
import org.springframework.config.java.annotation.Configuration;
import org.springframework.config.java.annotation.ExternalBean; }
Przykład uruchomienia kontekstu mniejszych klas
@Configuration new JavaConfigApplicationContext(SmallConf1.class,
public class SmallConf1 { SmallConf2.class);
@ExternalBean

26 03/2009
Spring Java Configuration Project

na oznaczenie metody na podobnej zasadzie, co Springa starają się balansować pomiędzy za- ny do spokojnego zastanowienia się co mo-
@ExternalBean (tyle że wartość zostanie odczyta- chowaniem spójności wzorca Inversion Of że uzyskać projekt po ewentualnej relaksacji
na z pliku właściwości). Control i równocześnie pozwalają nam na bar- klasycznego podejścia do konfiguracji XML.
dziej intuicyjny (przynajmniej dla programi- Wykorzystanie drzemiących w Java Configu-
Konfiguracjach aspektowych stów języka Java) format konfiguracji. Jak na ration możliwości jest szczególnie wygodne
JavaConfig oferuje możliwość oznaczenia klasy razie starania zespołu Roda Johnsona dają bar- ze względu na możliwość drobnoziarnistej i
konfiguracyjnej jako aspektu AOP (ang. Aspect- dzo satysfakcjonujące rezultaty – JavaConfig płynnej migracji definicji zwartych XML na
Oriented Programming) oraz jej konstrukcję może być z powodzeniem stosowany nie tylko rzecz klas konfiguracyjnych.
umożliwiającą zastosowanie go do określonych in- jako wsparcie dla konfiguracji XML, ale rów-
stancji w kontenerze. Dzięki temu możemy np. nież jako samodzielna metoda konfiguracji
przechwytywać za pomocą metody zdefiniowa- kontenera IoC.
nej w pliku konfiguracyjnym określony wyjątek dla Jak wspominałem wcześniej, łatwo jest po- HENRYK KONSEK
wszystkich instancji naszej aplikacji (lub dla wybra- paść w pułapkę klasyfikowania tego typu roz- Autor pracuje na stanowisku projektanta JEE w
nych obiektów i metod - jest to jedynie kwestia od- wiązań binarnie – jako lepszych lub gorszych warszawskiej firmie Artegence. Udziela się rów-
powiedniego zadeklarowania punktu przecięcia). od konfiguracji poprzez XML. Sądzę jednak, nież jako administrator serwisu javablackbelt.com.
że każdy rozsądny architekt nie będzie sta- W wolnym czasie interesuje się swoją Anią oraz
Podsumowanie rał się forsować na siłę jednej techniki kon- m.in. psychiatrią oraz dobrymi technologiami.
Java Configuration oferuje nam nowatorskie figuracyjnej do wszystkich nadzorowanych Kontakt z autorem: http://www.hekonsek.pl lub he-
podejście do konfiguracji aplikacji. Twórcy przez siebie aplikacji i raczej będzie skłon- konsek@gmail.com.

Referencje
• Strona projektu Spring Framework – http://springframework.org/javaconfig
• Strona projektu JavaConfig – http://springframework.org/javaconfig
• Inne projekty poboczne Springa – http://springframework.org/projects
• Artykuł Martina Fowlera nt. IoC – http://martinfowler.com/articles/injection.html
• JavaConfig Reference Documentation – http://static.springframework.org/spring-javaconfig/docs/1.0.0.m3/reference/html
• JavaConfig API – http://static.springframework.org/spring-javaconfig/docs/1.0.0.m3/apidocs/
• Artykuł Roda Johnsona nt. JavaConfig – http://blog.springsource.com/2006/11/28/a-java-configuration-option-for-spring/
• Klasyczna konfiguracja XML Springa – http://static.springframework.org/spring/docs/2.5.x/reference/beans.html

Listing 22. Konfiguracje wewnętrzne oraz zależności rodzic-dziecko między nimi

package pl.hekonsek; @Bean


import org.springframework.beans.factory.NoSuchBeanDefinitionE public String fromChild() {
xception; return "from child";
import org.springframework.config.java.annotation.Bean; }
import org.springframework.config.java.annotation.Configuration;
import org.springframework.config.java.context.JavaConfigApplica }
tionContext;
import org.springframework.context.ApplicationContext; public static void main(String[] args) {
@Configuration ApplicationContext ac = new JavaConfigApplicationContex
public class Parent { t(Child.class);
// Pobierz obiekt z kontekstu dziecka
@Bean System.out.println(ac.getBean("foo"));
public String foo() { // Mamy dostęp do obiektów rodzica i potomka
return "parent"; System.out.println(ac.getBean("fromParent"));
} System.out.println(ac.getBean("fromChild"));
ac = new JavaConfigApplicationContext(Parent.class);
@Bean // Pobierz obiekt z kontekstu rodzica
public String fromParent() { System.out.println(ac.getBean("foo"));
return "from parent"; // Mamy dostęp do obiektów rodzica
} System.out.println(ac.getBean("fromParent"));
try {
@Configuration System.out.println(ac.getBean("fromChild"));
public static class Child { assert false;
} catch (NoSuchBeanDefinitionException e) {
@Bean assert true;
public String foo() { // Nie mamy dostępu do obiektów potomka
return "child"; }
} }
}

www.sdjournal.org 27
Warsztaty

CUDA się zdarzają, czyli


programowanie GPGPU
Wprowadzenie do programowania przy użyciu technologii CUDA

W artykule dowiemy się co nieco o CUDA z praktycznego punktu widzenia.


Na konkretnym przykładzie zobaczymy, jak w prosty sposób wykorzystać
kartę graficzną do obliczeń niekoniecznie związanych z grafiką komputerową.
Następnie użyjemy typowych rozwiązań mających na celu znaczne
przyspieszenie obliczeń.
Na Listingu 1. widzimy implementację te-
Dowiesz się: Powinieneś wiedzieć: go dość prostego problemu w języku C. W kon-
• Jak napisać i wykonać obliczenia na GPU; • Średnio zaawansowana wiedza ogólna z za- wencji nazewnictwa CUDA Host odnosi się za-
• Jak wykorzystać pamięć współdzieloną i nie- kresu programowania w języku C; wsze do kodu wykonywanego po stronie CPU,
stronicowaną a także asynchroniczne API. • Podstawowa wiedza z zakresu programowa- stąd też nazwa naszej funkcji. Znaczenie para-
nia równoległego. metrów in, out , oraz data_size jest oczywiste,
natomiast den pochodzi od denominator, czyli
mianownik 1/h.
mając na myśli pamięć RAM komputera dostęp- Rysunek 3. przedstawia zależność danych
ną bezpośrednio dla części kodu wykonywanej na wyjściowych od wejściowych
Poziom trudności CPU oraz pamięć RAM karty graficznej.
Zarządzanie pamięcią
Opis przykładu numerycznego Zanim zaczniemy obliczenia, po stronie GPU mu-
Na wstępie dobierzemy sobie przykładowy pro- simy w pierwszej kolejności zaalokować oraz sko-

O
statnio coraz częściej mówi się o GPG- blem do eksperymentów, by na jego bazie eta- piować pamięć na naszą kartę graficzną. Alokacja
PU, czyli o obliczeniach dowolnego za- powo poznawać kolejne techniki programowa- oraz dealokacja są analogiczne do klasycznych mal-
stosowania przy użyciu kart graficz- nia przy użyciu CUDA. Idealne do tego wyda- loców w C (Listing 2.) , przy czym używamy do te-
nych. Temat stał się jeszcze bardziej popularny je się być różniczkowanie numeryczne z formu- go oczywiście funkcji z API CUDA.
po pojawieniu się CUDA (ang. Compute Unified łą pięciopunktową: mając na wejściu funkcję (sy- W Listingu 2., jak i w dalszej części artyku-
Device Architecture) – rozwiązania w znacznym gnał), daną jako tablicę N liczb rzeczywistych roz- łu, została przyjęta konwencja dodawania przed-
stopniu ułatwiającego tego typu obliczenia. Ni- mieszczonych ze stałym krokiem h, w celu obli- rostka h_ dla wskaźników do pamięci dostęp-
niejszy artykuł jest czysto praktycznym wprowa- czenia przybliżonej pochodnej tej funkcji stosuje- nej z poziomu CPU (host) oraz przedrostka d_
dzeniem do tej technologii. Czytelników, którzy my wzór przedstawiony na Rysunku 1. Wzory z dla pamięci GPU (device). Kopiowanie pamię-
chcieliby dowiedzieć się troszkę więcej o GPGPU Rysunku 2. stosujemy dla dwóch pierwszych oraz ci odbywa się również podobnie jak w języku C
oraz CUDA, zapraszamy do lektury Ramek Kilka dwóch ostatnich punktów z tablicy. (patrz: Listing 3.)
słów o GPGPU , Co to właściwie jest CUDA oraz
do materiałów poleconych w Ramce W Sieci. Ja-
ko że zawsze dobrze tłumaczy się na przykładzie, Szybki start
to na początku dobierzemy sobie problem nume- Oczywiście na początek musimy ściągnąć ze strony Nvidii SDK toolkit oraz drivery dla CUDA.
ryczny najlepiej nadający się do takiego wprowa- Wszystko znajdziemy np. tu: http://www.nvidia.pl/object/cuda_get_pl.html Rekomendowanym
środowiskiem dla programowania CUDA pod Windowsem jest MS Visual C++ 2005. Głównie
dzenia: na tyle prosty, żeby nie zaciemniał szcze- chodzi o dostarczany w tym pakiecie kompilator. Fragmenty kodu dla części GPU są kompilowa-
gółów, ale zarazem na tyle wredny ( a więc typowy ne przez Nvidiowe narzędzie, zaś część dla CPU przez zewnętrzny kompilator i niestety nowsza
), żeby pozwolił poruszyć najistotniejsze aspekty wersja Microsoftowego kompilatora nie jest kompatybilna z Nvidiową.
programowania w CUDA. W katalogu, w którym zainstalowaliśmy CUDA SDK, w podkatalogu \doc\syntax_highlighting
Wszystkie obliczenia były wykonane na GeFor- znajdziemy mały plik readme opisujący, jak włączyć kolorowanie w Visualu dla plików .cu. Takie
właśnie rozszerzenie mają pliki z kodem dla CUDA.
ce GTX280 oraz na jednym rdzeniu QuadCora
Pozostaje jeszcze jedna niezbędna rzecz, a mianowicie CUDA Visual Wizard, czyli plugin dla MS
taktowanego zegarem 2.66 Ghz. Często niefor- Visuala pozwalający nam na łatwą obsługę projektów CUDA. Pakiet instalacyjny znajduje się na
malnie będziemy używać zwrotów w stylu: ko- http://sourceforge.net/projects/cudavswizard.
piowanie pamięci ze strony CPU na stronę GPU,

28 03/2009
CUDA się zdarzają, czyli programowanie GPGPU

Argumentami funckji cudaMemcpy są kolej- WIDTH to 256 (w przypadku karty Nvidia Ge- wet gdyby miało być nieznacznie więcej wąt-
no: wskaźnik pamięci docelowej, wskaźnik pa- Force GTX280). Ponieważ wielkość bloku ków ogółem.
mięci źródłowej, wielkość kopiowanej pamię- i tak jest dość mocno ograniczona ( w przy- Wróćmy teraz do sposobu indeksowania
ci oraz kierunek kopiowania. W tym ostatnim padku tej karty to 512), bloki te grupuje- wątków w kodzie jądra:
mamy dostępne jeszcze dodatkowo dwie opcje: my jeszcze w siatkę ( tutaj maksymalny roz- int idx = blockIdx.x*blockDim.x +
cudaMemcpyHostToHost oraz cudaMemcpyDevic miar wynosi już 65535). Mamy zatem skon- threadIdx.x;W momencie wykonania ko-
eToDevice. Ich znaczenie wynika z samych nazw. figurowane uruchomienie jądra na dokładnie du jądra mamy dostęp do wartości określa-
numBlocks * numThreadsPerBlock wątkach. jących:
Pierwszy kernel Nietrudno wyliczyć, że występuje tu pewien
Nadszedł moment na zaimplementowanie nadmiar w stosunku do DATA_SIZE, wynikają- • rozmiar bloku – blockDim – jest to
funkcji wykonywanej po stronie GPU (tzw. ją- cy oczywiście ze sposobu wyliczenia ilości blo- zmienna typu dim3 i jak już wcześniej
dra, ang. kernel). Na Listingu 4. przedstawia- ków numBlocks. Istotniejszym jednak parame- wspomnieliśmy, w naszym przykła-
my pierwszą wersję, bez użycia pamięci współ- trem, z punktu widzenia szybkości, jest tu- dzie interesuje nas blockDim.x . War-
dzielonej. Jest to dość prosta modyfikacja funk- taj wielkość bloku numThreadsPerBlock, na- tość ta jest równa dokładnie skonfigu-
cji dla CPU.
Pierwsze rzuca się w oczy słowo kluczowe Listing 1. Implementacja przykładu numerycznego
__global__. Funkcje nim poprzedzone będą
skompilowane i wykonywane na GPU wielowąt- void HostFunction(float* in, float* out, float den, int data_size){
kowo, a dokładniej każdy wątek raz wykona taką
funkcję. Fakt ten tłumaczy nieobecność pętli w int idx;
kodzie jądra, w porównaniu z kodem
przeznaczonym do wykonywania na CPU. for(idx = 0; idx<2; idx++);
Taki właśnie był nasz cel: zamiast robić obli- out[idx] = ( in[idx+1] - in[idx] ) * den;
czenia sekwencyjnie w pętli, chcieliśmy wyko-
nać je wszystkie jednocześnie w sposób równo- for(idx=2; idx<data_size-2; idx++){
legły. Index idx identyfikuje wątek, a do zna- out[idx] = ( in[idx-2] - 8*in[idx-1] + 8*in[idx+1]
czenia parametrów blockIdx.x, blockDim.x, -in[idx+2] )*den*0.083333333f; //1/12h;
threadIdx.x zaraz wrócimy. Zwróćmy uwa- }
gę, że wątki o indeksie większym niż liczba da-
nych nie będą wykonywać obliczeń: if(idx >= for(idx = data_size - 2; idx< data_size; idx++)
data_size) return;, zaś wątki o dwóch naj- out[idx] = ( in[idx] - in[idx-1] ) * den;
mniejszych i dwóch największych indeksach }
wykonają obliczenia na podstawie formuły
dwupunktowej.
Rozważmy teraz sposób wywołania takiej
funkcji (patrz: Listing 5.).
Kilka słów o GPGPU
GPGPU (ang. General-purpose computing on graphics processing units) to po prostu wyko-
Dość ciekawie wygląda składnia: . Tutaj są nywanie obliczeń przy użyciu karty graficznej, zamiast procesora komputera. Początkowo
podawane parametry dla konfiguracji wywoła- technika ta była wykorzystywana głównie do wspierania procesu tworzenia grafiki kompu-
nia jądra: rozmiar siatki bloków (grid) oraz roz- terowej, jak np. proste obliczenia fizyczne. Z czasem karty graficzne zaczęto wyposażać w
miar każdego bloku. Następnie jest miejsce na coraz to większą liczbę coraz szybszych procesorów (obecnie niektóre urządzenia mają ich
grubo ponad 100). Dodatkowo rozmiar pamięci zainstalowanej na karcie graficznej zaczął
podanie argumentów funkcji. Zwróćmy uwa-
dorównywać rozmiarom standardowego RAMU. W naturalny więc sposób GPGPU wykro-
gę na użycie typu dim3. Jest to struktura trzech czyło poza ramy grafiki komputerowej i znajduje olbrzymią liczbę zastosowań w zasadzie
liczb całkowitych ( x, y, z ), używana do określa- wszędzie tam, gdzie do tej pory CPU było bezkonkurencyjne. W przypadku masowych ob-
nia rozmiarów. Nasz przykład jest jednowymia- liczeń równoległych można nawet śmiało powiedzieć, że obliczenia na CPU już zwyczjanie
rowy, więc nie definiowaliśmy pozostałych pól. się nie opłacają, gdyż na GPGPU możemy uzyskać czasem nawet kilkusetkrotne przyspiesze-
W tym przypadku zostały one automatycznie nie. Użytkownicy domowi na pewną będą odczuwać coraz więcej korzyści z rozwoju techno-
logii GPGPU. Nawet bardzo tanie karty graficzne już są w stanie wspierać np. obróbkę zdjęć,
zainicjalizowane jako 1.
kodeki audio/wideo, itd. Natomiast wymagający naukowcy mogą sobie zafundować syste-
Z eksperymentów wynikło, że najlepsza my oparte na kilku mega wydajnych kartach uzyskując superkomputer za stosunkowo nie-
ze względu na wydajność wartość dla BLOCK_ wielkie pieniądze.

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


���������
���
Rysunek 1. Formuła pięciopunktowa dla
Co to właściwie jest CUDA?
CUDA (ang. Compute Unified Device Architecture) jest stworzoną przez firmę NVidia architek-
przybliżonej pochodnej funkcji
turą dla obliczeń równoległych z wykorzystaniem karty graficznej. Dzięki API CUDA technika
GPGPU jest jeszcze prostsza, nie musimy bowiem odwoływać się do API typowo graficzne-
go, jak np. Shading Language. Dostępne są także gotowe biblioteki dla algebry liniowej, czy
� ������������� �����
��������� transformaty Fouriera. Jako nowość pojawia się szybka pamięć współdzielona, co jeszcze
� bardziej uatrakcyjnia GPGPU z CUDA. Językiem programowania dla CUDA jest język C, ale ist-
nieją także nakładki dla Fortrana, Pythona czy Javy. Oczywiście technologia ta jest dostęp-
na tylko dla urządzeń wyporodukowanych przez NVidię, a pełną ich listę znajdziemy w lin-
� ������ � ���������
��������� ku podanym w ramce W Sieci. Konkurencja też nie śpi i np. AMD rozwija alternatywną tech-
� nologię o nazwie FireStream. Niedawno powstał nowy standard OpenCL, który jest niezależ-
nym od urządzenia sposobem pisania programów dla obliczeń równoległych, podobnie jak
Rysunek 2. Formuły dwupunktowe dla OpenGL dla grafiki 3D.
przybliżonej pochodnej funkcji

www.sdjournal.org 29
Warsztaty

rowanej przez nas uprzednio wartości


Listing 2. Alokacja i zwalnianie pamięci poprzez funkcje C oraz CUDA numThreadsPerBlock;
size_t mem_size = DATA_SIZE * sizeof(float); • indeks bloku dla aktualnego wątku –
blockIdx.x;
//host memory allocation • indeks aktualnego wątku w obrębie bloku,
float* h_in; do którego przynależy – threadIdx.x .
h_in = (float *) malloc (mem_size);
W naszym przykładzie threadIdx.x przyjmu-
//device memory allocation je wartości od 0 do 256 maksymalnie i jest of-
float* d_in; fsetem, podszas gdy blockIdx.x*blockDim.x
cudaMalloc( (void **) &d_in, mem_size ); jest segmentem.
Z punktu widzenia CPU jądro jest wykony-
… wane asynchronicznie. Chcąc na nie poczekać
użyliśmy cudaThreadSynchronize();
free(h_in);
cudaFree(d_in); Debuggowanie i emulacja
W trybie Debug mamy możliwość debugowania
Listing 3. Kopiowanie pamięci w CUDA tylko części kodu dla CPU. Niestety nie jest moż-
liwe śledzenie kodu bezpośrednio wykonywane-
cudaMemcpy(d_in, h_in, mem_size, cudaMemcpyHostToDevice); go w GPU. Na szczęście istnieją tryby emulacji,
… w których kod napisany dla GPU wykonuje się na
cudaMemcpy(h_out, d_out, mem_size, cudaMemcpyDeviceToHost); CPU, dając nam możliwość pełnego debuggowa-
nia (tryb EmuDebug). Przeważnie chcemy w ten
Listing 4. Implementacja funkcji uruchamianej na GPU sposób sprawdzić poprawność zaimplementowa-
__global__ void CudaKernel(float* d_in, nego przez nas algorytmu, zwłaszcza gdy stosuje-
float* d_out, my kolejne optymalizacje. W trybie emulacji wąt-
float den, int ki (a w tym wypadku raczej pojedyncze urucho-
data_size){ mienia kodu jądra ) wykonają się sekwencyjnie,
jednak w losowej kolejności. Należy pamiętać,
int idx = blockIdx.x*blockDim.x + threadIdx.x; że w tym trybie kod może się wykonywać o wiele
dłużej, dlatego na potrzeby takiego debuggowania
if(idx >= data_size) return; warto czasem zmniejszyć znacznie rozmiar da-
nych, wielkość bloku czy też siatki bloków. Nawet
if( idx < 2 ){ jeśli mamy tablice o milionowych rozmiarach do
d_out[idx] = ( d_in[idx+1] - d_in[idx] ) * den; przetworzenia, często warto najpierw uzyskać po-
return; prawny algorytm w trybie emulacji nawet na ta-
} blicach kilkunasto elementowych.

if( idx >= (data_size – 2)){ Obsługa błędów


d_out[idx] = ( d_in[idx] - d_in[idx-1] ) * den; i specyfikacja urządzenia
return; Oczywiście błędy były, są i będą, więc CUDA
} również dostarcza nam mechanizm ich obsłu-
gi. Prosty sposób jego wykorzystania przedsta-
d_out[idx] = ( d_in[idx-2]-8*d_in[idx-1]; wiony jest na Listingu 6.
+ 8*d_in[idx+1] - d_in[idx+2] ); Wspomnieliśmy wcześniej, że w przypadku
*den*0.083333333f; // 1/12h; karty GTX280 maksymalna wartość dla roz-
} miaru bloku to 512. W niektórych modelach
nawet 256 może być nieosiągalne. Aby nasz
Listing 5. Konfiguracja i uruchomienie jądra kod był bardziej przenośny (z punktu widze-
#define BLOCK_WIDTH 256 nia karty graficznej obsługującej CUDA), po-
#define DATA_SIZE 10000000 winniśmy parametr BLOCK_WIDTH uzależnić
#define DATA_STEP 0.0001f od urządzenia. Na Listingu 7. pokazujemy spo-
… sób odczytania maksymalnej wartości rozmia-
int numBlocks = DATA_SIZE/BLOCK_WIDTH + 1; ru bloku (zakładamy tutaj, że jeśli w ogóle, to
int numThreadsPerBlock = BLOCK_WIDTH; zainstalowana jest tylko jedna karta graficzna
dim3 dimGrid(numBlocks); z CUDA).
dim3 dimBlock(numThreadsPerBlock); Nazwy użytych tutaj funkcji są dość opiso-
float denominator = 1.0/DATA_STEP; we, więc nie będziemy wchodzić w szczegóły.
Dostępny jest też cały szereg innych informa-
CudaKernel<<< dimGrid, dimBlock >>> cji o naszym urządzeniu, jak. np. rozmiar pa-
(d_in, d_out, denominator, DATA_SIZE); mięci globalnej czy współdzielonej, maksy-
cudaThreadSynchronize(); malne rozmiary dla siatki bloków itd.; wszyst-
kie te wartości można uzyskać w analogicz-
ny sposób.

30 03/2009
CUDA się zdarzają, czyli programowanie GPGPU

Optymalizacja jądra poprzez nej na każdy blok. Wyjaśnia się teraz znacze- blicy shared[] w pamięci współdzielonej jest
użycie pamięci współdzielonej nie pierwszej linii w kodzie jądra: rozmiar ta- ustalany w momencie uruchamiania jądra, co
Pomimo że już na tym etapie uzyskaliśmy nie-
złą prędkość obliczeń, to nadal istnieje możli- Listing 6. Obsługa błędów w CUDA
wość zwiększenia wydajności jądra. Każde od-
wołanie do tablicy d_in kosztuje od 400 do 600 cudaError_t error = cudaGetLastError();
cykli, gdyż tablica ta jest ulokowana w pamię- if( cudaSuccess != error)
ci globalnej GPU, a pamięć ta nie jest w żaden {
sposób buforowana. Co więcej, łatwo zauwa- fprintf(stderr, "Cuda error: %s.\n",
żyć, że kilka wątków będzie czytać naraz z tej cudaGetErrorString( error ) );
samej lokalizacji. Jest to konsekwencją natury exit(-1);
naszego zadania numerycznego: dla wykonania }
obliczeń dla bieżącego indeksu odczytujemy
dwie poprzednie i dwie następne wartości w ta- Listing 7. Przykład odczytania specyfikacji karty graficznej
blicy. Idealna sytuacja występuje, gdy mamy do int maxThreadsPerBlock;
czynienia z odczytem jednorodnym (ang. coale- int deviceCount;
sced ), kiedy to na jeden wątek przypada jeden
i dokładnie jeden adres tablicy. Niestety nie za- if ( deviceCount > 0 )
wsze możemy zmodyfikować nasz algorytm, {
aby spełniał ten warunek. Możemy wtedy użyć cudaDeviceProp deviceProp;
pamięci współdzielonej, z której to odczyt wy- cudaGetDeviceProperties(&deviceProp, 0);
nosi tylko 4 cykle. Pamięć ta jest wspólna w ob- maxThreadsPerBlock = deviceProp.maxThreadsPerBlock;
rębie jednego bloku, więc jeśli każdy wątek z }
bloku wczyta jedną wartość z pamięci global-
nej do pamięci współdzielonej, to potem war- Listing 8. Implementacja funkcji uruchamianej na GPU z użyciem pamięci współdzielonej
tości te będą dostępne dla wszystkich wątków __global__ void CudaKernel_sharedmem( float* d_in,
w bloku już z poziomu pamięci współdzielo- float* d_out, float den, int data_size)
nej. Zaimplementujmy jeszcze raz nasze jądro {
(patrz Listing 8.). extern __shared__ float shared[];
Znaczenie pierwszej linijki kodu jądra za- int idx = blockIdx.x * blockDim.x + threadIdx.x;
raz omówimy. Zwróćmy uwagę, że teraz ją-
dro jest podzielone na dwie sekcje. W pierw- if(idx >= (data_size))
szej odbywa się kopiowanie pamięci z global- return;
nej do współdzielonej. Zanim jednak przejdzie-
my do obliczeń, a tym samym do odczytu war- if( (threadIdx.x < 2) && (idx >= 2) ) {
tości, musimy mieć pewność, że wszystkie wąt- shared[threadIdx.x] = d_in[idx – 2];
ki zakończyły już to kopiowanie. Właśnie do tej }
synchronizacji służy __syncthreads(). W dru-
giej sekcji wykonywane są obliczenia tak jak w if( (threadIdx.x>=(blockDim.x-2))&&(idx<(data_size-2))){
pierwszej wersji jądra, z tym, że odczytujemy shared[threadIdx.x + 4] =d_in[idx + 2];
wartości już z tablicy shared[]. Tablica z dany- }
mi wejściowymi jest teraz rozdzielona między
fragmenty (Rysunek 4.). shared[threadIdx.x + 2] = d_in[idx];
Każdemu fragmentowi odpowiada blok wąt-
ków, a więc i każdy taki fragment jest wczytywa- __syncthreads();
ny do odpowiadającej pamięci współdzielonej.
Ponieważ jednak nasz wzór numeryczny wy- if(idx<2){
maga dwóch poprzednich oraz dwóch następ- d_out[idx] =(shared[threadIdx.x+3]
nych punktów w stosunku do aktualnego, to do
tablicy shared[] wczytujemy również dwa po- return;
przedzające fragment danych punkty, jak i dwa }
następujące po fragmencie (patrz Rysunek 5.). else if( idx >= (data_size – 2)){
Punkty poprzedzające są wczytywane przez dwa d_out[idx] =(shared[threadIdx.x+2]
pierwsze wątki w bloku, pod warunkiem, że nie - shared[threadIdx.x+1] )*den;
są pierwszymi globalnie. Analogicznie punk- return;
ty następujące są wczytywane przez dwa ostat- }
nie wątki w bloku, pod warunkiem też, że nie są
ostatnimi globalnie. Wpłynęło to też na przesu- d_out[idx] =(shared[threadIdx.x]
nięcie indeksów w sekcji obliczeniowej w porów- - 8*shared[threadIdx.x+1]
naniu z pierwszą wersją jądra. + 8*shared[threadIdx.x+3]
Na Listingu 9. widzimy, jak zmieni się nie- - shared[threadIdx.x+4])
znacznie sposób wywołania takiego jądra. *den*0.083333333f;
Pojawił się trzeci parametr konfiguracji i }
oznacza on wielkość pamięci współdzielo-

www.sdjournal.org 31
Warsztaty

uzyskujemy poprzez użycie słowa kluczowego


Listing 9. Konfiguracja uruchomienia jądra z pamięcia współdzieloną extern. Oczywiście, można też ręcznie usta-
int sharedMemSize = (numThreadsPerBlock+4)*sizeof(float);; lić wielkość tablicy w pamięci współdzielo-
CudaKernel_sharedmem<<< dimGrid, dimBlock, sharedMemSize>>>; nej, należy jednak pamiętać o ograniczeniach
(d_in_1, d_out_1, den, DATA_SIZE); jej wielkości.

Listing 10. Treść pliku cuda_profile.log Profilowanie


method,gputime,cputime,occupancy; i porównanie czasów wykonania
method=[ memcopy ] gputime=[ 11782.849 ] ; Chcielibyśmy teraz zobaczyć różnicę między
method=[ __globfunc__Z10CudaKernelPfS_fi ] gputime=[ 2552.960 ] cputime=[ 6.681 ]; dwiema wersjami naszego jądra ze względu
occupancy=[ 1.000 ]; na prędkość wykonania, najlepiej przy uży-
method=[ memcopy ] gputime=[ 12483.425 ] ; ciu jakiegoś profilera. Na stronie Nvidii do-
method=[ memcopy ] gputime=[ 11782.017 ] ; stępny jest CUDA Visual Profiler, posiadający
method=[ __globfunc__Z20CudaKernel_sharedmemPfS_fi ] gputime=[ 1292.928 ]; cputime=[ proste GUI, którego nie będziemy tu jednak-
6.459 ] occupancy=[ 1.000 ]; że opisywać. Jego działanie jest podobne do
method=[ memcopy ] gputime=[ 11780.385 ] metody, którą użyjemy bezpośrednio. Mia-
nowicie, po pierwsze musimy włączyć pro-
Listing 11. Alokacja i dealokacja w pamięci niestronicowanej filowanie.
//host memory allocation Otwieramy w tym celu właściwości projek-
cudaMallocHost( (void**) &h_in, mem_size); tu w MS Visualu i w sekcji Debugging w po-
lu Environment wpisujemy CUDA_PROFILE=1;.
cudaFreeHost(h_in); Dzięki temu, po uruchomieniu naszego pro-
gramu, powinien pojawić się plik cuda_pro-
Listing 12. W funkcji HostFunction dodajemy pętlę aby zasymulować więcej obliczeń file.log o treści przypominającej tę z Listin-
for(idx=2; idx<data_size-2; idx++); gu 10.
for(int i=0; i<200; i++); W nawiasach kwadratowych podane są cza-
out[idx] =(in[idx-2]-8*in[idx-1]; sy w mikrosekundach. Łatwo zauważyć (para-
+8*in[idx+1]–in[idx+2]; metr gputime), iż rzeczywiście zoptymalizo-
wane jądro wykonuje się mniej więcej dwa ra-
zy szybciej. Widać również, że raczej wąskim
gardłem jest tutaj kopiowanie pamięci do i z
GPU (gputime dla metod memcopy). Profiler
����� ����� ����� ����� ����� ��� posiada cały szereg dodatkowych opcji i para-
metrów. Zainteresowanych odsyłamy do do-
kumentacji CUDA, do pliku CUDA_Profi-
ler_2.0.txt.
Podobne wnioski można wyciągnąć, gdy
ręcznie zmierzymy w naszym programie
������ ������ ������ ��� czasy wykonania. I tak, czas wykonania al-
gorytmu na CPU wyniósł 0.15160 sekun-
dy, pierwsza wersja jądra: 0.04360, zaś wer-
��� ������� ������� ����� ������� ������� ���� sja zoptymalizowana: 0.04062, przy czym
w dwóch ostatnich przypadkach jest sumo-
wany czas skopiowania danych na GPU, wy-
konanie kodu jądra oraz ponowne skopio-
wanie danych wynikowych na stronę CPU.
Pomiary te są bliższe stanu faktycznego,
gdyż wynik profilera nie uwzględnił czasu
��� �������� ������ �������� ���
CPU poświęconego kopiowaniu danych. W
obu przypadkach ustawiliśmy DATA_SIZE =
10000000.
Rysunek 3. Zależność danych wyjściowych od wejściowych

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

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

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

Rysunek 4. Fragment danych. Odczyt może być spoza fragmentu

32 03/2009
CUDA się zdarzają, czyli programowanie GPGPU

Nasz problem numeryczny nie był zbyt Na bazie naszego przykładu zrealizujemy po- Najpierw tworzymy identyfikatory dla
skomplikowany obliczeniowo w tym sensie, że wyższy scenariusz i wykonamy kolejne ekspery- dwóch strumieni. Strumień jest ciągiem se-
jeden wątek (jedno przekręcenie pętli) nie wy- menty, porównując z czasem wykonania na CPU. kwencyjncyh operacji, ale dwa strumienie są
konywał zbyt wielu operacji. Z otrzymanych Aby zasymulować większą złożoność obliczenio- wobec siebie asynchroniczne. Do utworzenia
tutaj wyników można wysnuć śmiało wnio- wą, formuły wynikowe powtórzymy, powiedzmy, i zamknięcia strumienia służą odpowiednio:
sek, iż wysiłek włożony w optymalizację ją- ze 200 razy w HostFunction (patrz Listing 12.). cudaStreamCreate oraz cudaStreamDestroy,
dra może nie zawsze się opłacać. Oczywiście i analogicznie w kodzie jądra CudaKernel_ zaś funkcja cudaStreamSynchronize wstrzy-
o wiele łatwiej jest napisać kod jądra nie uży- sharedmem. Na Listingu 13. widzimy kod, jaki muje program, aż wszystkie operacje w stru-
wając pamięci współdzielonej i może to czasa- wykonamy po stronie CPU, zaś na Listingu 14. mieniu się nie zakończą. Aby kopiowanie
mi być wystarczające. Nietrudno jednak wy- odpowiadającą mu adaptację dla GPU z uży- danych było asynchroniczne, musimy po
obrazić sobie sytuację, gdy obliczenia są o wie- ciem asynchronicznego API. pierwsze użyć funkcji cudaMemcpyAsync za-
le bardziej skomplikowane lub gdy kod jądra
jest intensywnie wykonywany bez kopiowania Listing 13. Dziesięciokrotne wywokonanie HostFunction dla dwóch tablic
danych (np. generacja tekstury, złożone symu-
lacje w pętli). for(int i=0;i<10;i++){;
if(i%2 == 0);
Pamięć niestronicowana HostFunction(h_in_1,h_out_1,den,DATA_SIZE);;
CUDA posiada bardzo ciekawy mechanizm else;
pozwalający na użycie pamięci niestronico- HostFunction(h_in_2,h_out_2,den,DATA_SIZE);;
wanej (ang. page-locked). Z grubsza wystar- }
czy nam tutaj takie rozróżnienie, że pamięć
zaalokowana w pamięci stronicowanej, czy-
li przy użyciu standardowego malloc'a, w
pierwszej kolejnośći jest kopiowana do pa-
mięci niestronicowanej, a dopiero w drugiej ����������������������������
kolejności poprzez DMA, do pamięci GPU.
W przypadku pamięci niestronicowanej ma-
my do czynienia tylko z tym drugim etapem. � � � � � � ��� ��� ���
Aby zastosować tę dogodność, zmodyfiku-
jemy część kodu z Listingu 2. do kodu z Li- ������� ������� ����� ������� ������� ������ ��������� ��������� ������� ���������
stingu 11.
Po tej modyfikacji mierzymy ponownie cza-
sy wykonania i otrzymujemy odpowiednio dla
obu wersji jądra: 0.02628 oraz 0.02526 sekun-
� � � ��� ���
dy. Zatem wąskie gardło dało się trochę rozsze-
rzyć. Trzeba jednak pamiętać, że pula pamięci ������
niestronicowanej jest o wiele mniejsza niż stro-
����� ����� ����� ����� �����
nicowanej i nie należy przesadzać z tego typu
alokacjami.
������ �������������
Obliczenia asynchroniczne
Wspomnieliśmy wcześniej, że jądro jest wyko-
nywane asynchronicznie z punktu widzenia
CPU. Dodatkowo kopiowanie z pamięci nie-
stronicowanej nie obciąża CPU. CUDA korzy- ������������������������������
sta z tych faktów udostępniając asynchronicz-
ne API, dzięki któremu da się wykonać nastę-
� � � � � � ��� ��� ���
pujący scenariusz:
������
• dane są kopiowane do pamięci GPU; ��������� ��������� ������� ��������� ���������
• następnie na tych danych jest wykonywa-
ny kod jądra, a w tym samym czasie trwa
kopiowanie kolejnych danych;
• dane wynikowe z 1. są kopiowane z � � � ��� ���

GPU, a w tym czasie na drugich danych ������


wykonuje się kod (być może innego) ją-
����� ����� ����� ����� �����
dra;
• powrót do kroku 1.
�������� �������������
Co więcej, w tym samym czasie da się jesz-
cze czasami wcisnąć jakieś obliczenia na CPU,
gdyż operacje na CPU, GPU oraz kopiowanie
pomiędzy nimi wykonywane są niezależnie
względem siebie. Rysunek 5. Schemat bloków wątków i odpowiadających im pamięci współdzielonych

www.sdjournal.org 33
Warsztaty

miast cudaMemcpy, podając dodatkowo jako dej operacji przy użyciu API CUDA spraw- tyfikatory strumieni pojawiają się także jako
ostatni argument identyfikator strumienia, dzić ostatni błąd. Jest to dość żmudne i ra- ostatni parametr konfiguracji jądra.
a po drugie pamięć po stronie CPU musi być czej psuje czytelność kodu, dlatego też we
zaalokowana w pamięci niestronicowanej. wszystkich listingach pomijaliśmy obsłu- Podsumowanie
Jeśli o tym zapomnimy, to niestety kompila- gę błędów. W podsumowaniu podajemy rezultaty cza-
tor tego nie wykryje i błąd pojawi się dopie- Za to w tym momencie dajemy przykład na sowe ostatniego eksperymentu: dla CPU
ro w trakcie wykonania programu – i to za- to, że lekceważenie tego problemu może spra- było to 62.86327 sekund, zaś dla GPU
kładając, że sami przechwytujemy te błędy. wić przykre niespodzianki. Wracając do Li- 1.29735. Można by rzec, że wyniki mówią
Czyli najbezpieczniej jest po prostu po każ- stingu 13. zwracamy jeszcze uwagę, że iden- same za siebie. Czy są imponujące, pozosta-
wiamy do subiektywnej oceny. Panuje opi-
Listing 14. Adaptacja do wersji CUDA kodu z Listingu 13 nia, że GPU liczy coś tam, coś tam setki ra-
zy szybciej niż CPU. W niektórych zastoso-
cudaStream_t stream_one, stream_two; waniach, a zwłaszcza w takich, gdzie nie ma-
cudaStreamCreate(&stream_one); my do czynienia z kopiowaniem dużej ilości
cudaStreamCreate(&stream_two); danych pomiędzy CPU i GPU, takie wyniki
są jak najbardziej osiągalne. Jeśli jednak mó-
for(int i=0;i<10;i++) wimy o GPGPU w pełni tego słowa znacze-
{ niu, to nie możemy zapominać o wąskim
if(i%2 == 0){ gardle. Co więcej, operacje dzielenia i mno-
żenia na liczbach całkowitych jak na razie są
cudaMemcpyHostToDevice,stream_one); beznadziejnie wolne w porównaniu z ich od-
CudaKernel_sharedmem<<< dimGrid, dimBlock, powiednikami dla liczb zmiennoprzecinko-
sharedMemSize, stream_one >>> wych, a te z kolei kosztem szybkości są po-
(d_in_1, d_out_1, den, DATA_SIZE); zbawione czasami należytej dokładności. No
cudaMemcpyAsync(h_out_1,d_out_1,mem_size, cóż, w końcu karty graficzne zostały stwo-
cudaMemcpyDeviceToHost,stream_one); rzone do grafiki. Na pewno jednak GPU
} wraz z CUDA jest świetnym poszerzeniem
else{ możliwości obliczeniowych oferowanych
cudaMemcpyAsync(d_in_2,h_in_2,mem_size, przez CPU. Najlepiej jednak wykorzystywać
cudaMemcpyHostToDevice,stream_two); oba równocześnie, gdyż nie zawsze CUDA
CudaKernel_sharedmem<<< dimGrid, dimBlock, będzie w stanie czynić cuda.
sharedMemSize, stream_two >>>
(d_in_2, d_out_2, den, DATA_SIZE);
cudaMemcpyAsync(h_out_2,d_out_2,mem_size,
cudaMemcpyDeviceToHost,stream_two); JACEK PIEKARSKI
} Pracuje na stanowisku programisty w firmie BLStre-
} am wchodzącej w skład Grupy BLStream. Grupa
BLStream powstała, by efektywniej wykorzystywać
cudaStreamSynchronize(stream_one); potencjał dwóch, szybko rozwijających się produ-
cudaStreamSynchronize(stream_two); centów oprogramowania – BLStream i Gamelion.
Firmy wchodzące w skład grupy specjalizują się w
cudaStreamDestroy(stream_one); wytwarzaniu oprogramowania dla klientów kor-
cudaStreamDestroy(stream_two); poracyjnych, w rozwiązaniach mobilnych oraz pro-
dukcji i testowaniu gier.
Kontakt z autorem: jacek.piekarski@blstream.com

Bibliografia
W zasadzie literatura papierowa do CUDA jeszcze nie istnieje, ale zachęcamy do lektury następujących:

• NVIDIA_CUDA_Programming_Guide_1.1.pdf – po zainstalowaniu CUDA dokument dostępny w katalogu docs/;


• http://sites.google.com/site/cudaiap2009/materials-1/cuda-textbook – panowie David Kirk oraz Prof. Wen-mei Hwu udostępnili nam fragmenty
książki, którą przygotowują.

W Sieci
• http://www.nvidia.pl/object/cuda_what_is_pl.html – strona firmowa CUDA;
• http://www.nvidia.pl/object/cuda_learn_products_pl.html – lista urządzeń wspierających CUDA;
• http://sarathc.wordpress.com/2008/09/26/how-to-integrate-cuda-with-visual-c/ – alternatywny sposób integracji CUDA z Visualem C++;
• http://en.wikipedia.org/wiki/CUDA – ogólnie o CUDA;
• http://www.ddj.com/architect/207200659 – cykl świetnych artykułów wprowadzających do programowania z CUDA;
• http://heim.ifi.uio.no/~knutm/geilo2008/seland.pdf – wprowadzenie do CUDA w formie prezentacji;
• http://www.gpgpu.org/ - strona poświęcona GPGPU nie tylko z CUDA.

34 03/2009
Opis CD

UIQ 3.3 Beta SDK cji. IP*Works! Secure SNMP wspiera pełny zakres możliwo-
UIQ SDK to zestaw narzędzi UIQ, Symbiana i innych. SDK to ze- ści zarządzania siecią, łącznie z rozszerzonymi właściwościa-
staw narzędzi kontrolowanych przez skrypty Perl. Nowości w in- mi bezpieczeństwa SNMPv3, opracowanie pułapek, i kompi-
terfejsie to: pełne wykorzystanie możliwości Opery Mobile 9 (szyb- lację ASN-1 MIB.
kie ładowanie stron, usprawnienie Zoomu), wprowadzenie obsłu-
gi usługi Widget za pomocą specjalnie przygotowanego pulpitu, IP*Works! Zip
usprawnienie obsługi Opery za pomocą szybko dostępnych funkcji, Zestaw łatwych, szybkich i efektywnych komponentów, któ-
ujednolicony system wiadomości oraz obsługa Java JSR 248 MSA. ry daje informatykom możliwość dodawania funkcji kompresji
do swoich aplikacji. IP*Works! Zip umożlwia szybka integrację
IP*Works! SSL funkcji kompresji i rozpakowywania do aplikacji, wykorzystując
Do IP*Works! dodano bezpieczeństwo SSL i zarządzanie certy- do tego standardy kompresji Zip, Tar, Gzip lub Jar.
fikatami cyfrowymi. IP*Works! SSL – to wszechstronny zestaw
komponentów ze wsparciem SSL w celu zapewnienia bezpiecznej Inne
pracy wszystkich protokołów internetowych. Trialowe wersje kilkunastu produktów firmy nsoftware

IP*Works! Secure SNMP


IP*Works! Secure SNMP to wszechstronne narzędzie do two-
rzenia bezpiecznych agentów SNMP i menadżerów aplika-
Redakcja nie udziela pomocy technicznej
w instalowaniu i użytkowaniu programów
zamieszczonych na płytach CD-ROM
dostarczonych razem z pismem.

Jeśli nie możesz


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

www.sdjournal.org 35
Warsztaty

Facebook
dla programistów
Przygotuj własną aplikację
dla użytkowników serwisu Facebook

Facebook jest nie tylko klasycznym serwisem społecznościowym, lecz


także platformą umożliwiającą tworzenie własnych aplikacji. W artykule
pokażemy jak przygotować i opublikować przykładową aplikację dla
Facebooka współpracującą z serwisem aukcyjnym Allegro.
Rozpoczynamy pracę
Dowiesz się: Powinieneś wiedzieć: Tworzenie każdej aplikacji dla platformy Face-
• jak stworzyć i opublikować aplikację dla plat- • znać podstawy tworzenia aplikacji webowych book należy rozpocząć od jej zarejestrowania i
formy Facebook, (PHP, HTML, CSS), wygenerowania kluczy. Służy do tego dostępna
• w jaki sposób wykorzystać Facebook API, • znać podstawy programowania obiektowego, dla każdego zarejestrowanego w serwisie użyt-
FBML i FQL, • znać podstawy języka SQL, kownika aplikacja o nazwie Twórca aplikacji
• jak wykorzystać metody Allegro WebAPI. • wiedzieć czym jest WebService i protokół SOAP. (ang. Developer). Po wybraniu przycisku Set Up
New Application zostaniemy przeniesieni do
okna tworzenia nowej aplikacji.
udostępnij efekty swojej pracy innym człon- Mimo iż jedynymi wymaganymi polami są
kom społeczności. Katalog aplikacji podzie- nazwa aplikacji (ang. Application Name) oraz po-
Poziom trudności lony jest na kilkadziesiąt kategorii, w któ- twierdzenie zapoznania się z regulaminem usłu-
rych można znaleźć zarówno eksperymen- gi, warto w tym miejscu od razu skonfigurować
talną aplikację do weryfikacji teorii o sze- pola Callback URL oraz Canvas Page URL, które
ściu stopniach separacji – Six Degrees, jak i umożliwią nam szybkie uruchomienie testowej

F
acebook (www.facebook.com) jest ser- aplikację umożliwiającą komponowanie no- aplikacji. Pierwsze z nich jest adresem, pod któ-
wisem społecznościowym, dzięki któ- wych potraw i ocenę ich smaku przez wła- rym fizycznie będzie dostępna nasza aplikacja
remu, jak piszą o nim jego autorzy, mi- snych znajomych. (np. http://www.kozlowscy.org/facebook/
liony użytkowników na całym świecie każ- allegro), drugi parametr określa unikalną na-
dego dnia mogą odszukiwać swoich znajo- Jak działają aplikacje Facebooka zwę, która posłuży do konstrukcji adresu, pod
mych, przesyłać nieograniczoną liczbę zdjęć, Schemat działania każdej zewnętrznej apli- którym będzie widoczna nasza aplikacja (np.
udostępniać linki i pliki wideo i dowiadywać kacji Facebooka przedstawiony jest na Rysun- http://apps.facebook.com/allegro). Oczy-
się coraz więcej o poznanych tam ludziach, a ku 1. wiście wszystkie ustawienia aplikacji możemy
wszystko po to, żeby świat był coraz bardziej Za każdym razem, kiedy użytkownik do- później edytować. Do pierwszego uruchomie-
otwarty i połączony. Projekt został urucho- konuje interakcji z naszą aplikacją (1) je- nia naszej aplikacji pozostało nam tylko kilka
miony 4 lutego 2004 roku przez studenta go żądanie poprzez jeden z serwerów ser- kroków.
Uniwersytetu Harvard – Marka Zuckerber- wisu społecznościowego przekazywane jest Po pierwsze do katalogu aplikacji na naszym
ga i obecnie posiada ponad 120 mln aktyw- do serwera, na którym hostowana jest na- serwerze musimy skopiować pliki oficjalnego
nych użytkowników na całym świecie. We- sza aplikacja (2). W odpowiedzi na to żąda- klienta Facebooka (ang. official PHP Client Li-
dług rankingu Forbes Magazine z 2008 ro- nie aplikacja przygotowuje odpowiedź w for- brary) oraz plik index.php, który możemy wyge-
ku Zuckerberg został najmłodszym miliar- macie FBML, którą przekazuje do serwera nerować automatycznie, korzystając z linka Get
derem świata. Facebooka (5). Jednym z kroków przygoto- started quickly with some example code! Jeśli wy-
Z punktu widzenia programisty Facebook wania takiej odpowiedzi może być dodatko- wołamy teraz naszą aplikację, powinniśmy uj-
jest tym bardziej interesujący, że umożliwia wa komunikacja z serwerami platformy po- rzeć listę naszych znajomych w serwisie (do-
tworzenie i publikowanie własnych aplikacji przez wywołanie jednej z metod API lub za- kładniej listę ich identyfikatorów).
dla tej platformy. pytanie FQL. Nasza aplikacja nie musi być oczywiście
Dzięki temu możemy zrealizować zasa- W kolejnym kroku nasza odpowiedź FBML tworzona z wykorzystaniem wyżej wspo-
dę: jeśli brakuje Ci funkcjonalności dostar- tłumaczona jest do HTML i w takiej posta- mnianej biblioteki i języka PHP. Facebook
czonej przez twórców serwisu, rozbuduj go ci przesyłana jest do przeglądarki użytkowni- API jest interfejsem opartym o wywołania
o to, co potrzebujesz i jeśli masz taką ochotę, ka (6). REST zwracającym wyniki w formacie XML

36 03/2009
Facebook dla programistów

lub JSON, a wynikiem wywołania naszej apli- Wykorzystane Facebook Markup Language (FBML)
kacji zwracanym do serwerów Facebook jest technologie i narzędzia FBML jest zbiorem znaczników umożliwiają-
kod FBML. Możemy więc wykorzystać bi- cym integrację aplikację z platformą Facebooka.
blioteki dostępne dla innych języków (choć- Facebook API Składa się z podzbioru znaczników HTML oraz
by facebook-java-api http://code.google.com/p/ Facebook API jest sieciową usługą opartą o znaczników specyficznych dla Facebooka, np.
facebook-java-api/) lub zdać się na własną im- REST udostępniającą kilkadziesiąt metod w kil- fb:photo czy fb:dialog. Zwróćmy uwagę, że w
plementację. ku grupach tematycznych. zbiorze znaczników FBML nie ma np. znacznika
body. Próba jego użycia w naszej aplikacji spowo-

Listing 1. Przykładowy szkielet naszej aplikacji wygenerowany automatycznie z Twórcy aplikacji duje wystąpienie błędu ładowania strony i wy-
świetlenie komunikatu w rodzaju:
<?php
// Copyright 2007 Facebook Corp. All Rights Reserved. Wystąpiły błędy podczas ładowania strony
// aplikacji
// Application: test Błędy składniowe:
// File: 'index.php' FBML Error (line 184): illegal tag "body"
// This is a sample skeleton for your application. under "fb:canvas".
//
require_once 'facebook.php'; Komunikat taki pojawi się tylko w przypad-
$appapikey = '0f88cc125f2c08e351541ae2ecabc985'; ku używania aplikacji przez jej programistów,
$appsecret = 'e7ada359998797e35f9422b2b960a2da'; dla pozostałych użytkowników niedozwolone
$facebook = new Facebook($appapikey, $appsecret); znaczniki zostaną po prostu zignorowane. Pod-
$user_id = $facebook->require_login(); glądając źródła stron prezentowanych w przeglą-
// Greet the currently logged-in user! darce przez naszą aplikację, możemy zobaczyć,
echo "<p>Hello, <fb:name uid=\"$user_id\" useyou=\"false\" />!</p>"; w jaki sposób tłumaczone są strony FBML do
// Print out at most 25 of the logged-in user's friends, HTML. Jeśli jesteś programistą używanej aplika-
// using the friends.get API method cji, w komentarzach możesz także zobaczyć źró-
echo "<p>Friends:"; dłowy FBML, który może okazać się przydatny
$friends = $facebook->api_client->friends_get(); w procesie debugowania.
$friends = array_slice($friends, 0, 25);
foreach ($friends as $friend) { Facebook Query Language (FQL)
echo "<br>$friend"; FQL umożliwia dostęp do tych samych danych,
} które możemy uzyskać za pomocą wywołań me-
echo "</p>"; tod API, ale w stylu podobnym do zapytań języ-
?> ka SQL. Tak naprawdę użycie sporej części metod
API sprowadza się do wykonania określonych za-

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

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

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

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

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

Rysunek 1. Schemat działania aplikacji Facebooka Rysunek 2. Struktura i lista plików aplikacji

www.sdjournal.org 37
Warsztaty

pytań FQL. Wykorzystując zapytania FQL, może- mi wywołań metod API i zwracanymi formata- go w zależności od wartości parametru menu do-
my zarówno ograniczyć liczbę niezbędnych żą- mi danych, zapytań FQL i poprawnością wyko- łączane są funkcją include odpowiednie skrypty.
dań w porównaniu z wykorzystaniem tradycyj- rzystania znaczników FBML w poszczególnych Struktura i lista wszystkich plików pokazana jest
nego API, jak i stosować złożone kryteria wyszu- elementach aplikacji. na Rysunku 2.
kiwania. Poniżej przykładowe zapytanie zwraca-
jące nam identyfikator, nazwę oraz datę urodzin Allegro WebAPI Kilka słów o bezpieczeństwie
wszystkich naszych znajomych. Jak piszą sami autorzy, Allegro WebAPI to usłu- Musimy pamiętać, że zgodnie z architektu-
ga umożliwiająca wymianę informacji między ze- rą przedstawioną na Rysunku 1. skrypty apli-
SELECT uid, name, birthday FROM user WHERE wnętrznymi aplikacjami a serwisem. Dzięki niej moż- kacji wykonywane są na naszym serwerze, i to
uid IN (SELECT uid2 FROM friend WHERE na tworzyć programy ułatwiające m.in. zarządzanie na nas spoczywa zapewnienie jej bezpieczeń-
uid1 = $fb_uid). transakcjami. Aby rozpocząć pracę z usługą, nale- stwa. Z tego też względu wprowadzona jest
ży być użytkownikiem Allegro i wystąpić o klucz kontrola wartości parametru menu, żeby zapo-
Typowe wywołanie zapytania FQL będzie wy- aktywacji WebAPI-Key. Obecnie korzystanie z biec próbie nieuprawnionego dostępu lub wy-
glądać następująco: pakietu podstawowego, który zawiera około 70 konania plików spoza naszej aplikacji, dodatko-
metod jest bezpłatne, nie są także naliczane żad- wo w katalogu include umieściliśmy plik .htac-
$query = "..."; ne opłaty za poszczególne wywołania. Szczegóło- cess z wpisem
$result = $facebook->api_client->fql_ wy opis usługi udostępniany jest za pomocą pli-
query($query); ku WSDL (ang. Web Services Description Language) <FILES ~ ".php$">
dzięki czemu możemy ją wykorzystać w każdym Deny from all
Narzędzia dla programistów języku wspierającym obsługę protokołu SOAP. </FILES>
Strona dla programistów Facebooka udostęp-
nia między innymi narzędzia API Test Console i Budujemy naszą aplikację dzięki czemu próba bezpośredniego wywoła-
FBML Test Console. Z ich wykorzystaniem może- Głównym plikiem aplikacji jest index.php, przez nia dowolnego pliku PHP z tego katalogu za-
my przeprowadzać eksperymenty z parametra- który przechodzą wszystkie wywołania i do które- kończy się błędem.

Listing 2. Główny plik aplikacji index.php

<?php array('auction', 'Aukcja', false),


// plik konfiguracyjny array('watch', 'Dodaj do obserwowanych', false),
require_once 'config.php'; array('test', '@Test', false)
// klient Facebooka );
require_once 'facebook.php'; for($i = 0; $i < count($items); $i++) {
// klasa Allegro if($items[$i][2]) {
require_once 'allegro.php'; $selected = ($menu == $items[$i][0]);
// zestaw funkcji pomocniczych echo "<fb:action href=\"?menu={$items[$i][0]}\
require_once 'functions.php'; ">{$items[$i][1]}</fb:action>";
}
// utworzenie instancji klienta Facebooka }
$facebook = new Facebook($config['facebook']['api-key'], ?>
$config['facebook']['secret']); <fb:create-button href="?menu=friends">Powiadom znajomych</
// korzystanie z naszej aplikacji wymaga wcześniejszego fb:create-button>
zalogowania </fb:dashboard>
$fb_uid = $facebook->require_login();
// utworzenie instancji pomocniczej klasy obsługi serwisu <!-- include -->
Allegro <div>
$allegro = new Allegro($config); <?php
?> $step = nvl($_REQUEST['step'], 1);
<style> foreach($items as $item)
<?php echo htmlentities(file_get_contents('css/styles.css', $pages[] = $item[0];
true)); ?> /*
</style> * kontrola czy wartość parametru
* jest jedną z dopuszczalnych
<!-- dashboard --> */
<fb:dashboard> if(!in_array($menu, $pages))
<?php die('Próba wywołania niepoprawnej opcji!');
$menu = nvl($_REQUEST['menu'], 'my_auctions'); try {
$items = array( include('./include/' . basename($menu) . '.php');
array('my_auctions', 'Moje aukcje', true), } catch(Exception $e) {
array('friends_auctions', 'Aukcje znajomych', true), echo '<fb:error><fb:message>Błąd</fb:message>' . $e-
array('search', 'Szukaj', true), >getMessage() . '</fb:error>';
array('friends', 'Znajomi', true), }
array('login', 'Zaloguj', true), ?>
array('about', 'Informacja', true), </div>

38 03/2009
Facebook dla programistów

Konsumowanie usługi Allegro kownika Facebook fb _ uid ,identyfikator użyt- Opcja Moje aukcje (my_auctions.php) odpo-
Użycie zdecydowanej większości metod Allegro kownika Allegro a _ uid , dzięki czemu będzie- wiada części funkcjonalności dostępnej w pa-
WebAPI wymaga wcześniejszego zalogowania my mogli zrealizować funkcjonalność prezenta- nelu użytkownika serwisu Allegro w opcji Mo-
się do serwisu. Służą do tego metody doLogin cji wystawionych aukcji naszych znajomych. je Allegro>Aukcje. Do realizacji zakładek wyko-
lub doLoginEnc. W naszej aplikacji wybraliśmy rzystaliśmy znacznik fb:tab-item.
tę drugą ze względu na sposób przesyłania hasła Funkcjonalność naszej aplikacji Aukcje znajomych (friends_auctions.php) to li-
użytkownika. Porównanie danych przesyłanych Przykładowy widok naszej aplikacji w działa- sta sprzedawanych przedmiotów w serwisie au-
do serwera w wyniku wywołania metody logo- niu wraz z jej menu głównym pokazany jest na kcyjnym przez naszych znajomych z serwisu
wania dla użytkownika pwgdrk, który podał ha- Rysunku 3. społecznościowego. W pierwszym kroku zapy-
sło ngtrx znajduje się na Listingu 5.
Oprócz oczywistych parametrów, jakimi są
nazwa user-login i hasło użytkownika user-
password metody wymagają podania kodu kra-
ju użytkownika country-code (1 – dla Polski),
wartości klucza WebAPI webapi-key oraz ak-
tualnego numeru wersji komponentów local-
version. Numer ten zmienia się wraz ze zmia-
nami dokonywanymi w udostępnianej przez
Allegro usłudze i może być wykorzystywany do
weryfikacji zgodności wersji aplikacji klienckiej
z interfejsem WebAPI.
Jeśli podana przez nas wartość tego parame-
tru będzie różnić się od aktualnej wersji serwisu,
to próba logowania zakończy się błędem i zwró-
ceniem komunikatu Niepoprawna wersja katego-
rii lub pól sprzedaży. Proszę sprawdzić lokalne wer-
sje i uaktualnić oprogramowanie! Aktualną wartość
tego parametru możemy uzyskać, wykorzystując
panel użytkownika serwisu Allegro (opcja Alle-
gro> Moje Allegro>Ustawienia>WebAPI>Informa-
cje) lub wywołując metodę doQuerySysStatus, Rysunek 3. Przykładowy widok naszej aplikacji prezentujący informacje o wybranej aukcji
doQueryAllSysStatus lub doGetSitesInfo. Do
komunikacji z usługą wykorzystamy w naszej
aplikacji pomocniczą klasę Allegro pokazaną na
Listingu 3. Klasa zawiera pole api będące instan-
cją klasy SoapClient, za pomocą którego będzie-
my odwoływać się poszczególnych metod API.
W wyniku poprawnego zalogowania do serwi-
su zwracany jest uchwyt (identyfikator) sesji, któ-
ry jest parametrem wejściowym do wszystkich me-
tod wymagających wcześniejszego zalogowania.
Każdy użytkownik może mieć równocześnie
otwartych do pięciu sesji, a ważność trwania se-
sji wynosi 3 godziny. Dla celów demonstracyj-
nych wartość tego identyfikatora zapisujemy w
cookies z wykorzystaniem metody Facebook API
data.setCookie:

$facebook->api_client->data_setCookie($fb_
uid,
'AllegroSession', $session, (time() + 3
* HOUR), null);

a kontrolę aktualności logowania wykorzystu-


jąc zapytanie FQL:
Rysunek 4. Wyślij zaproszenie do znajomych jako przykład wykorzystania znaczników FBML

$cookies = $facebook->api_client->fql_query
("SELECT name, value, expires FROM cookies
WHERE uid = $fb_uid AND name =
'AllegroSession' AND expires > " .
time());.

Każde pomyślne logowanie skutkuje także zapi-


saniem w bazie danych pary identyfikator użyt- Rysunek 5. Przykładowy efekt wykorzystania funkcjonalności Udostępnij

www.sdjournal.org 39
Warsztaty

Listing 3. Klasa Allegro

<?php $this->config['allegro']['webapi-key'],
class Allegro{ $doGetSitesInfoResponse['ver-key']);
private $config; // identyfikator (uchwyt) sesji
/* $session = $doLoginEncResponse['session-handle-part'];
* pole będące instancją klienta SOAP, return $session;
* które umożliwia nam dostęp do metod interfejsu Allegro }
WebAPI
* (http://webapi.allegro.pl) /*
*/ * metoda kodowania hasła
public $api; */
private function enc($password) {
function __construct($config) { return base64_encode(hash('sha256',$password,true));
$this->config = $config; }
// utworzenie instancji klienta SOAP
$this->api = new SoapClient("http://webapi.allegro.pl/ /*
uploader.php?wsdl"); * zapisuje powiązanie między kontami Facebook i Allegro
} * (identyfikatory użytkowników w obu serwisach)
*/
/* public function doSaveUser($fb_uid, $a_uid) {
* nawiązanie połączenia z bazą danych $this->connect();
*/ $query = "REPLACE INTO fba_users SET fb_uid = $fb_uid,
private function connect() { a_uid = $a_uid";
mysql_connect($this->config['database']['host'], mysql_query($query)
$this->config['database']['user'], or die(mysql_error());
$this->config['database']['password']); }
mysql_select_db($this->config['database']['name']);
} public function doGetUsers($fb_uids){
$query = 'SELECT * FROM fba_users WHERE fb_uid in (' .
/* implode(',', $fb_uids) . ')';
* zalogowanie do serwisu Allegro $this->connect();
*/ $result = mysql_query($query);
public function doLogin($login, $password) { while($row = mysql_fetch_assoc($result)) {
// pobranie aktualnej wartości local-version $users[] = $row;
$doGetSitesInfoResponse = $this->api->doGetSitesInfo(1, }
$this->config['allegro']['webapi-key']); return $users;
// szyfrowane logowanie }
$doLoginEncResponse = $this->api->doLoginEnc( }
$login, $this->enc($password), 1, ?>

Świat jest mały


W 1967 r. Stanley Milgram – amerykański socjolog z uniwersytetu Yale przeprowadził ciekawy eksperyment. Poprosił losowo wybrane osoby z Nebra-
ski o przesłanie listu do pewnego maklera giełdowego w Bostonie. Oczywiście jego adres pocztowy nie został ujawniony, a uczestnicy doświadcze-
nia musieli dotrzeć do adresata, wykorzystując jedynie sieć swoich znajomych. Część listów dotarła i okazało się, że średnia liczba ogniw w łańcuchu
drogi listu wyniosła sześć. Stąd wzięła się nazwa paradygmatu o sześciu stopniach separacji (and. six degrees of separation) i teorii tzw. małych świa-
tów (ang. small world). Okazuje się, że własność tę posiadają także modele innych sieci rzeczywistych. Powstające serwisy społecznościowe stały się
naturalnym polem do ponownej weryfikacji wspomnianej teorii.

Metody Allegro WebAPI


Przykładowe metody usługi Allegro WebAPI wykorzystane w naszej aplikacji:

• doShowItemInfo – pozwala uzyskać informacje o aukcji o określonym identyfikatorze,


• doGetBidItem2 – pozwala uzyskać informacje o ofertach kupna złożonych w danej aukcji,
• doGetUserID – pozwala uzyskać unikalny identyfikator użytkownika na podstawie jego nazwy (login) lub adresu email,
• doMyAccount2 – pozwala uzyskać informacje o aukcjach użytkownika (Licytuję, Sprzedaję, Wygrałem itp.),
• doSearch – pozwala na wyszukiwanie aukcji o zadanych parametrach,
• doAddWatchList – pozwala dodać określoną aukcję do listy aukcji obserwowanych,
• doGetSitesInfo – pozwala uzyskać podstawowe informacje o dostępnych serwisach aukcyjnych,
• doLoginEnc – metoda szyfrowanego logowania do serwisu.

40 03/2009
Facebook dla programistów

taniem FQL pobieramy listę znajomych, którzy W opcji Znajomi (friends.php) wykorzystu- nio oglądanej przez nas aukcji w widoku Pola
już dodali naszą aplikację: jąc znaczniki fb:request-form i fb:multi- naszego profilu.
friend-selector możemy wysłać zaprosze-
SELECT uid FROM user WHERE is_app_user = nie do znajomych, którzy nie używają jeszcze Katalog aplikacji
1 AND uid IN (SELECT uid2 FROM friend naszej aplikacji. Kiedy uznamy, że nasza aplikacja jest już goto-
WHERE uid1 = $fb_uid) Nasza aplikacja nie musi ograniczać się je- wa i posiada co najmniej pięciu użytkowników,
dynie do swojego głównego okna (ang. Ca- możemy wysłać ją do Katalogu aplikacji wyko-
a następnie z wykorzystaniem metody nvas Page). W widoku aukcji (auction.php) rzystując opcję w Twórcy aplikacji.
doGetUsers klasy Allegro pobieramy po- zastosowaliśmy znacznik fb:share-button, Cały proces sprowadza się do wypełnienia
wiązanie pomiędzy kontami użytkownika który umożliwia nam współdzielenie zaso- krótkiego formularza. Aby nasza aplikacja nie
w obu serwisach. Mając te dane, możemy bów z innymi użytkownikami poprzez wy- została odrzucona, musimy pamiętać o tym, że
już uzyskać listę aukcji każdego użytkow- słanie do nich wiadomości lub publikację in- jej nazwa nie może zawierać słów fb i face (np.
nika. Zamiast jego nazwy wykorzystaliśmy formacji na stronie naszego profilu. Przykła- nasza przykładowa aplikacja otrzymała nazwę
znacznik fb:profile-pic wyświetlający jego dowy efekt wykorzystania znacznika pokaza- Yaama jako akronim od słów Yet Another Alle-
profilowe zdjęcie. ny jest na Rysunku 5. Dodatkowo wykorzy- gro Manager), a opis musi być w języku angiel-
Szukaj (search.php) to prosta wyszukiwarka z staliśmy metodę API profile.setFBML, za skim. Po pozytywnym przejściu weryfikacji na-
formularzem opartym na znaczniku fb:editor. pomocą której ustawiamy informację o ostat- sza aplikacja stanie się łatwo dostępna dla mi-
lionów użytkowników serwisu.

Podsumowanie
Pokazaliśmy w jaki sposób utworzyć przykła-
dową aplikację działającą na platformie Facebo-
ok. Oczywiście wykorzystaliśmy tylko wycinek
możliwości zarówno mechanizmów oferowa-
nych przez tę platformę, jak i interfejsu serwi-
su aukcyjnego. Mamy jednak nadzieję, że spoj-
rzenie na serwis społecznościowy nie od strony
użytkownika, lecz od strony programisty, uczy-
ni go atrakcyjnym polem eksperymentów dla
tych drugich.

WŁODZIMIERZ KOZŁOWSKI
Absolwent Wydziału Elektrycznego Politechniki Po-
Rysunek 6. Przykładowy widok aplikacji w zakładce Pola naszego profilu znańskiej, obecnie doktorant na Wydziale Matema-
tyki i Informatyki Uniwersytetu im. Adama Mickie-
wicza. Pracuje jako projektant i programista w fir-
W Sieci mie ABG S.A. (Grupa Asseco). Jest laureatem Truveo
Developers Challenge 2008 (za aplikację 3Styler for
• Strona dla programistów Facebooka http://developers.facebook.com/ Facebook) oraz konkursu na przygotowanie doku-
• Dokumentacja usługi Allegro WebAPI http://webapi.allegro.pl/
mentacji z przykładami dla usługi Allegro WebAPI.
Kontakt z autorem: wlodzimierz@kozlowscy.org

Listing 4. Skrypt tworzący tabelę przechowującą powiązanie kont użytkowników Facebooka i Allegro

CREATE TABLE IF NOT EXISTS `fba_users` (


`fb_uid` bigint(20) NOT NULL COMMENT 'identyfikator użytkownika Facebook',
`a_uid` bigint(20) NOT NULL COMMENT 'identyfikator użytkownika Allegro.pl',
PRIMARY KEY (`fb_uid`)
);

Listing 5. Porównanie przesyłanych danych dla obu metod logowania


<!-- fragment koperty SOAP dla wywołania metody doLogin -->
<ns1:doLogin soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:AllegroWebApi">
<user-login xsi:type="xsd:string">pwgdrk</user-login>
<user-password xsi:type="xsd:string">ngtrx</user-password>
...
</ns1:doLogin>
<!-- oraz analogiczny fragment dla tych samych danych użytkownika przesyłanych w wyniku wywołania metody doLoginEnc -->
<ns1:doLoginEnc soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:AllegroWebApi">
<user-login xsi:type="xsd:string">pwgdrk</user-login>
<user-hash-password xsi:type="xsd:string">tKa+M+Ur0WT4ggDq5cOUQfmqt3+Wo+7eGDTQL2/LR0Y=</user-hash-password>
...
</ns1:doLoginEnc>

www.sdjournal.org 41
Bezpieczeństwo

Zabezpieczanie
systemów IT
Adaptive Access Manager firmy Oracle
Coraz więcej słyszymy o ochronie bezpieczeństwa systemów
informatycznych. Wynika to z tego, że pojawia się coraz więcej doniesień
prasowych o włamaniach na konta klientów banków lub o przypadkach
wykradzenia dużej ilości danych osobowych.
transakcji. To zabezpiecza użytkownika i znacznie
Dowiesz się: Powinieneś wiedzieć: utrudnia utratę przez niego danych pozwalających
• Jak można zabezpieczyć aplikację WWW; • Jak działa protokół HTTP; na zalogowanie się niepowołanej osobie i dokona-
• Jak można chronić użytkownika przed „phi- • Wskazana znajomość działania JavaScript. nie nieautoryzowanych transakcji.
shingiem”. A co, jeśli jednak dojdzie do takiej utraty da-
nych? System musi rozpoznać, że osoba zalogo-
wana do aplikacji i wykonująca pewne akcje nie
zowe i tokeny, a skończywszy na certyfikatach i jest prawdziwym użytkownikiem, ale włamy-
smartkartach. Nieco gorzej wygląda sytuacja je- waczem. To zadanie jest podstawową funkcją
Poziom trudności śli chodzi o zapewnienie użytkownika, że stro- systemu OAAM. Jak jest ona realizowana?
ny, które wyświetlają się w jego przeglądarce, Przede wszystkim realizowany jest tak zwany
pochodzą rzeczywiście z tych źródeł, z których device fingerprinting gdzie przez device rozumie
sądzi on, że powinny pochodzić. Fakt uwierzy- się urządzenie, z którego loguje się użytkownik.

N
ie są to jednak w większości przypad- telnienia sprowadza się w tym przypadku do Chodzi tu jednak nie tylko o komputer w sen-
ków takie włamania, jakie znamy z hi- zmiany małej ikonki w dolnym rogu ekranu (w sie dosłownym, ale także o daną instancję prze-
storii o hakerach, gdzie wykorzysty- nowszych wersjach przeglądarek jest to już do- glądarki. OAAM korzysta z wielu dostępnych
wane są luki, czy może techniczne niedocią- syć wyraźnie wyszczególnione). atrybutów w celu tworzenia odcisku urządzenia
gnięcia systemów IT. Obecnie największym za- Doświadczona i świadoma zagrożenia osoba – są to między innymi dedykowane pojedyncze
grożeniem są ataki typu phishing czy pharming. zauważy próbę wyłudzenia danych (phishing), cookies, obiekty flash oraz zaawansowane tech-
Niepowołane osoby nie łamią zabezpieczeń sys- ale przeciętny Kowalski może zostać łatwo oszu- niki samo-uczenia się.
temu, one po prostu zdobywają w nielegalny kany, co widać zresztą w treści publikacji praso-
sposób informacje potrzebne do prawidłowego wych. Dużym krokiem w kierunku zwiększenia Zbieranie odcisku urządzenia
logowania i je wykorzystują. Większość insty- bezpieczeństwa jest w tym przypadku personali- Tzw. fingerprinting odbywa się przy pierwszym
tucji posiada już zabezpieczenia typu firewall, zacja. OAAM rozdziela stronę wpisywania iden- kontakcie użytkownika z systemem, zanim
które chronią systemy IT przed niepowołanym tyfikatora użytkownika i hasła. Najpierw zosta- jeszcze przeprowadzane są jakiekolwiek działa-
dostępem, ale takie zabezpieczenia w dzisiej- niemy poproszeni o podanie naszego identyfika- nia autoryzacyjne. Dzięki temu informacje ze-
szych czasach nie wystarczają. tora. Hasło wpisujemy na kolejnej stronie, która brane w ten sposób są dostępne do określenia
Jak w takim razie radzić sobie z nowym rodza- będzie już spersonalizowana przez system, bo on ryzyka w dowolnym momencie – np.: przed
jem przestępczości komputerowej? Odpowiedzią już wie, kto się loguje. Personalizacja polega na autoryzacją, po autoryzacji, czy w trakcie sesji
na to jest nowa generacja systemów ochrony. Jed- wybraniu przez użytkownika dedykowanego dla przed wykonaniem transakcji.
nym z wiodących produktów w tej kategorii jest niego obrazka, który zawsze będzie tłem modu- Pierwsza strona do logowania zawiera kil-
Oracle Adaptive Access Manager (OAAM). W ar- łu wpisywania danych typu hasło, czy odpowie- ka linijek statycznego html’a. Ten kod zawie-
tykule opiszemy zasadę działania tego rozwiąza- dzi na pytania kontrolne. ra obiekt flash’owy i tag <IMG>, które służą do
nia. Trzeba zwrócić uwagę na dwa aspekty korzy- Takiego wyboru użytkownik dokonuje w trak- zbierania szczegółowych danych o urządzeniu.
stania przez użytkownika z aplikacji webowych: cie rejestracji. Jednocześnie, dla ochrony przez key- Kod flash’owy odwołuje się do serwera aplika-
uwierzytelnienie użytkownika w aplikacji, ale też loggerami, użytkownik może wybrać bezpiecz- cyjnego wysyłając do niego zebrane dane.
uwierzytelnienie systemu IT u użytkownika, a niejszy moduł wpisywania danych, za pomocą któ- OAAM generuje unikalne szyfrowane ciastecz-
także zachowanie użytkownika w systemie. rego dane wprowadzane są nie z klawiatury, ale za ka (cookies) dla każdej sesji i sprawdza, czy kon-
pomocą myszki, a więc nie mogą zostać przechwy- kretny cookie istnieje przy kolejnym logowaniu
Uwierzytelnianie cone. Również w trakcie rejestracji użytkownik użytkownika z tego urządzenia. Oczywiście, ten
Uwierzytelnianie użytkownika w systemie IT podaje odpowiedzi na kilka pytań kontrolnych. cookie jest ważny tylko podczas danej sesji z da-
jest obecnie całkiem dobrze rozwinięte – po- Taka dodatkowa weryfikacja może zostać użyta nego urządzenia. Cookies są pobierane od użyt-
cząwszy od konta i hasła, przez hasła jednora- przez system w momencie zwiększonego ryzyka kownika za pośrednictwem różnych metod:

42 03/2009
Zabezpieczanie systemów IT

• Tag <IMG> – specjalny tag jest umieszcza- ją już jakieś z sesji poprzedniej. W czasie takie- Modele
ny na stronie i przeglądarka wysyła żąda- go przetwarzania zbierane są również inne do- Posiadając już odpowiednią ilość informacji, mo-
nie w celu jego pobrania. W trakcie tego stępne dane: żemy zacząć je przetwarzać. Głównym zadaniem
zadania plik cookie jest przesyłany do sys- systemu jest wygenerowanie liczby (risk score)
temu. Takie tagi mogą być również wyko- • System operacyjny wraz z wersją i wgrany- określającej ryzyko związane z aktualnie wyko-
rzystane do badania przepustowości sieci mi patchami; nywaną przez użytkownika akcją. Takie oblicze-
urządzenia oraz prędkości działania same- • Przeglądarka z jej wersją; nia odbywają się oczywiście on-line w wybranych
go urządzenia. Te informacje również mo- • Możliwość uruchamiania JavaScript. w trakcie instalacji miejscach w chronionej aplika-
gą być użyte do tworzenia odcisku; cji (np. przed wygenerowaniem zlecenia przele-
• Request HTTP – w przypadku blokady W trakcie zbierania informacji przez obiekty wu). Na podstawie wartości risk score mogą zostać
znaczników <IMG>, OAAM może pobrać flashowe można uzyskać dalsze dane o środo- wykonane akcje (blokada konta, email do admini-
cookie z pierwszego żądania o stronę do wisku użytkownika: stratora, dodatkowa weryfikacja klienta pytania-
logowania. Stosowanie różnych technik mi kontrolnymi) lub wartość ta może być przeka-
ma na celu zapewnienie zebrania jak naj- • Rozdzielczość ekranu; zana do chronionej aplikacji, aby ona sama podję-
większej ilości danych w różnych konfigu- • Dane o kolorach; ła dalsze kroki.
racjach urządzenia użytkownika. • Czy jest zainstalowana karta dźwiękowa; Generowanie risk score odbywa się na pod-
• Czy jest zainstalowana drukarka; stawie reguł zebranych w modele, które z ko-
Biblioteki, które przetwarzają te dane, są udo- • Czy jest mikrofon; lei zgrupowane są w polityki. Standardowo sys-
stępniane z kodem źródłowym, więc istnieje • Czy są jakieś kodeki audio i video; tem posiada ponad 200 szablonów reguł. Poli-
możliwość ich modyfikacji w trakcie wdrożenia. • Czy jest wsparcie dla MP3. tyki podzielone są ze względu na zastosowanie:

Dane dla cookies Informacje o IP • Polityka bezpieczeństwa – używa standar-


Jak wspomniałem, pliki cookie są generowane Kolejną grupą informacji, jaki zbiera OAAM, są dów do wykrywania fraudowego zacho-
dla każdej sesji i system sprawdza, czy istnie- dane związane z IP i protokołem. To wszystko wania. Typowe reguły bezpieczeństwa to:
ma na celu uniemożliwienie podszycia się pod blokowanie użytkowników z listy zabro-
użytkownika. Dane zbierane na temat protoko- nionych urządzeń, blokowanie użytkow-
łu IP o użytkowniku to: nika działającego z różnych krajów w usta-
lonej jednostce czasu, blokowanie dostę-
• Sam adres IP; pu z urządzenia, z którego nastąpiło kil-
• Lokalizacja geograficzna wyliczona na ka błędnych logowań, blokowanie dostę-
podstawie danych geolokacyjnych (dane o pu z urządzenia, z którego nastąpił dostęp
mapowaniu IP na lokalizacje geograficzne ustalonej liczby użytkowników w tym sa-
kupuje się od firm zewnętrznych); mym czasie, blokowanie logowania użyt-
• Typ i prędkość połączenia; kownika, który zalogował się z miejsc od-
• Typ routingu IP; ległych geograficznie w czasie krótkiego
• Flaga ISP; czasu, itd.
• ASN; • Polityki transakcji – zawierają reguły bazu-
• Nazwa ISP; jące na parametrach biznesowych, używa-
• Nazwy domen poszczególnych poziomów; ne do zmniejszenia ryzyka operacji. Uży-
• Lista proxy anonimizujących; wane do monitorowania działań w trakcie
• Rutery i nazwy maszyn. sesji.

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

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

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

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

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

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

Rysunek 1. Moduły wpisywania danych Rysunek 2. „Odcisk palca” urządzenia

www.sdjournal.org 43
Bezpieczeństwo

• Polityki workflow – używają znanych wzor- • Dane zewnętrzne – Możliwa jest także in- szczególne modele, skonfigurowane do działania
ców zachowania użytkownika do wykrywa- tegracja z danymi dostarczanymi przez dla danej transakcji. Każda z reguł zwróci risk
nia transakcji, w których to zachowanie jest systemy zewnętrzne. score (przykładowo, jeśli użytkownik łączy się ze
inne niż zapamiętane. Wykorzystują metody znanego urządzenia, wówczas wynikiem jest 0 -,
analizy behawioralnej, wykrywania wzorców, Generowanie risk score jest stosunkowo proste. w przeciwnym przypadku 100). Dla modelu wy-
analizy temporalnej i danych historycznych. Kiedy pojawia się żądanie, system uruchamia po- licza się wynik biorąc pod uwagę wagi. Następnie
taki sam algorytm stosuje się na poziomie wyżej
aż do osiągnięcia wartości końcowej.
����������������
Na podstawie tak wygenerowanego wyni-
����������������������� ku można podejmować już pewne konkretne
���������������������������� działania biznesowe, jak np. wydanie pozwo-
���������������������������� �����������������
���������������������������� lenia na przelew lub nie. Zaletą OAAM jest
możliwość zastosowania dodatkowej weryfika-
���������������������������������������������� ������������������������ cji użytkownika za pomocą pytań kontrolnych.
������������������������� ���������������������������� Logika rozmyta stosowana przy ewaluacji od-
�������������������������� ���������������������������� �����������������
���������������������������� powiedzi może być tematem na oddzielny ar-
tykuł i pozwala na zaawansowaną autoryzację
przy jednoczesnym niewielkim obciążeniu sa-
�����������������������
���������������������������� ����������������� �����������������
mego użytkownika. Nie musi on dokładnie pa-
����������������������������
miętać odpowiedzi na pytania kontrolne. Sto-
pień dokładności zależy od nas samych.
Na zakończenie prezentuję całościowy przy-
kład działania systemu OAAM: (Rysunek 4)

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


ALEKSANDER JACHOWICZ
Enterprise Solution Architect w obszarze Identity
Rysunek 3. Obliczanie „Risk Score” Management, Oracle Polska

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


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

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

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

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

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

Rysunek 4. Działanie pakietu Adaptive Access Manager

44 03/2009
Testowanie oprogramowania

Praca z zespołem
testerów klienta
Zwiększanie efektywności
testów przeprowadzanych przez klienta
Niniejszy artykuł przedstawia studium przypadku dotyczącego procesu
testowaniasystemubankowegowśrodowiskuklienta.Zostanąprzedstawione
problemy wynikłe w trakcie organizacji testowania oraz czynności
przedsięwzięte w celu ich eliminacji i osiągnięcia satysfakcjonującego
poziomu współpracy pomiędzy dostawcą oprogramowania a klientem.
być albo nie być – kontynuować projekt, czy go
Dowiesz się: Powinieneś wiedzieć: zawiesić ze względu na mniejsze niż zakłada-
• Jakich reguł przestrzegać, aby testowanie nie • Podstawowa wiedza z zakresu testowania no postępy prac.
doprowadziło do katastrofy; funkcjonalnego; Niniejszy artykuł przedstawia przykładowy
• Jak poprawić proces testowy, gdy jest już w trak- • Podstawowa wiedza z zakresu zarządzania proces testowania przez klienta oraz pokazuje
cie realizacji a rezultaty są dalekie od ideału. projektem informatycznym. trudności, które można napotkać wspomaga-
jąc taki proces. Z drugiej strony zostaną uka-
zane korzyści takiego podejścia i jego możli-
Podejmując się realizacji usługi wytwo- wy pozytywny wpływ na powodzenie przed-
rzenia systemu informatycznego, dostawca sięwzięcia IT.
Poziom trudności IT zobowiązuje się do wypełnienia pewnych
określonych czynności. Nie tylko musi do- Z punktu widzenia
starczyć gotowy produkt w założonym ter- dostawcy oprogramowania…
minie i w ramach określonego budżetu, za- Nierzadko pierwszą reakcją wytwórcy opro-

P
ierwsza część artykułu opisuje podsta- gwarantować niezbędne wsparcie przy wdro- gramowania na prośbę umożliwienia testo-
wowe rodzaje testów zwykle przepro- żeniu systemu i przeszkoleniu użytkowni- wania aplikacji przez testerów klienta jest
wadzanych przez klienta. W następnej ków, ale i powinien przedstawić gwarancję gwałtowny sprzeciw i wynajdywanie mnó-
kolejności zostaną przedstawione zalety i wa- niezawodności i poprawnego działania sys- stwa przeciwwskazań. Wynika to głównie z
dy udostępnienia aplikacji zespołowi klien- temu. Warunkami spełnienia takiej gwaran- obawy przed ujawnieniem przed przyszłym
ta z punktu widzenia dostawcy oprogramo- cji są na ogół kryteria wejścia / wyjścia sto- nabywcą oprogramowania błędów i usterek
wania. Trzeci rozdział artykułu jest subiek- sowane dla poszczególnych etapów testowa- systemu. Często też pragnie się ukryć mniej-
tywną próbą stworzenia pewnego ogólnego nia wytwarzanej aplikacji. Dla każdego eta- szy niż zakładano postęp w pracach dewelo-
schematu postępowania podczas organizacji pu testowania powinny zostać spełnione nie- perskich lub testowych. Producent oprogra-
testowania w środowisku klienta – przedsta- co inne kryteria. Zapewniają one, iż pewien mowania wychodzi z założenia, iż dopie-
wia pewne zasady, które powinny być prze- etap implementacji systemu został ukończo- ro w pełni zaimplementowany i gruntow-
strzegane zarówno przez dostawcę, jak i ny, a jego rezultat zweryfikowany z pozytyw- nie przetestowany system może zostać pod-
klienta, aby uniknąć w przyszłości potencjal- nymi wynikami. dany testom klienta. Udostępnienie nie w
nych problemów. Mimo obaw i sprzeciwów, związanych z pełni zaimplementowanego i nieprzetesto-
Ostatnia część artykułu to studium przy- ujawnieniem kondycji aplikacji przed cza- wanego przez zespół wewnętrzny systemu
padku opisujące, w jaki sposób zorganizowa- sem jej oddania do oficjalnych testów akcep- może w oczach dostawcy wpłynąć negatyw-
no proces testowy w projekcie realizowanym tacyjnych, wytwórcy oprogramowania coraz nie na opinię klienta o postępach w pracach
dla zagranicznej instytucji bankowej. częściej godzą się na przeprowadzanie testów projektowych.
Po zapoznaniu się z treścią artykułu, czy- aplikacji przez zespół klienta. Zwykle dzieje Takie podejście ma często realne uzasadnie-
telnicy zdobędą wiedzę, w jaki sposób moż- się tak na życzenie klienta, który pragnie mieć nie. Klient, zobaczywszy część systemu, jest
na czerpać korzyści z udostępnienia systemu stały wgląd w postęp prac deweloperskich i rozczarowany słabymi w jego pojęciu postępa-
klientowi oraz zwiększyć efektywność testo- stan ukończenia systemu. Informacja taka uła- mi i niespokojny o możliwość ukończenia ca-
wania, a także zaufanie klienta zarówno do twia planowanie i podejmowanie decyzji doty- łej aplikacji w zakładanym czasie. Pojawia się
produktu, jak i samego producenta oprogra- czących np. budżetu, daty oddania systemu na napięcie i naciski ze strony udziałowców pro-
mowania. produkcję itd. Czasem rozstrzyga też o kwestii jektu – bądź to, aby położyć większy nacisk

46 03/2009
Praca z zespołem testerów klienta

na testowanie systemu, bądź by przyspieszyć wsparcie ze strony zespołu klienta może być czas, gdy system został zaprojektowany tak,
prace deweloperskie. Często bywa też tak, iż szczególnie istotne dla dalszych prac progra- by być nieskomplikowany w użytku i jak naj-
testerzy klienta nie są wystarczająco zaznajo- mistycznych. Często podczas testów funk- bardziej intuicyjny.
mieni z funkcjonowaniem aplikacji by dać po- cjonalnych przeprowadzanych przez klienta Podczas testów użyteczności użytkowni-
prawne wyobrażenie o jakości działania syste- wynajdywane są braki lub nieścisłości w pro- cy weryfikują, czy projekt aplikacji odpowia-
mu. Wprowadza to nieporozumienia i kon- jekcie aplikacji – takie jak błędne lub pomi- da ich potrzebom, preferencjom i nawykom
flikt – ponieważ dostawca pewny jest swoich nięte wymagania biznesowe. oraz czy system sprawdzi się podczas pracy
racji, a klient swoich. W takiej sytuacji łatwo Jako przykład niech służy projekt przed- na produkcji. Testy użyteczności – jeśli prze-
może dojść do pogorszenia stosunków pomię- sięwzięty na zlecenie instytucji bankowej, w prowadzane są odpowiednio – mogą pomóc
dzy udziałowcami projektu ze strony dostaw- którym testerzy klienta (pracownicy banku) ulepszyć aplikację skłaniając do modyfikacji
cy i klienta. przeprowadzali testy funkcjonalne równo- UI zgodnie z sugestiami użytkowników, co
Są jednak – i to wcale nierzadko – pozy- legle z testami wewnętrznymi. Podczas pra- z kolei zwiększa komfort pracy z systemem
tywne aspekty oddania systemu do testowa- cy z systemem testerzy wykryli wiele błędów i satysfakcję odbiorcy oprogramowania. Po-
nia klientowi. Najistotniejszym z nich jest wynikających z niekompletnej analizy bizne- nadto, przyjazny i intuicyjny interfejs użyt-
fakt, iż testerzy klienta – zwykle pracowni- sowej – np. dokumentacja analityczna nie kownika umożliwia minimalizację nakła-
cy danej instytucji tymczasowo oddelego- przewidywała i nie opisała scenariusza inte- dów przeznaczonych na zapewnienie szkoleń
wani do prac testerskich – najlepiej wiedzą, rakcji użytkownika (kasjera w banku) z kasą i usług help desk, ponieważ system jest prosty
jak powinien działać system, aby w pełni re- w przypadku używania monet. Udokumen- w obsłudze i nauka nie wymaga szczególne-
alizował swoją rolę i usprawniał pracę ludzi. towane i zaprojektowane było jedynie opero- go treningu.
Testerzy ci mogą bardzo pomóc programi- wanie na banknotach. W rezultacie system
stom i analitykom dostarczając wskazówek błędnie przetwarzał operacje finansowe do- Testy akceptacyjne
i sugestii pozwalających usprawnić funk- konywane w małych kwotach (poniżej war- Testy akceptacyjne przeprowadza się w celu
cjonowanie aplikacji. Mogą też, co równie tości najmniejszego nominału banknotu) ostatecznej weryfikacji funkcjonalności sys-
ważne, sprawdzić, czy zaprojektowany sys- lub kwotach obejmujących część ‘groszową’. temu przed wdrożeniem na produkcję. Te-
tem sprawdza się w kategoriach użyteczno- Transakcje takie były poprawnie zapisywane sty te z reguły wykonuje wybrana grupa użyt-
ści – czy praca z nim jest wystarczająco intu- w systemie, lecz nie w rejestrze kasy – urzą- kowników końcowych na podstawie opraco-
icyjna, jak szybko zwykły użytkownik może dzenia bankowego połączonego z aplikacją. wanych scenariuszy end to end. Celem jest
nauczyć się jego obsługi itp. Informacje tego Urządzenie takie nie operuje na monetach, stwierdzenie, czy dany system działa w po-
typu, uzyskane jeszcze w fazie implementa- więc transakcje monetarne były obsługiwane żądany sposób oraz czy poprawnie i bez uste-
cji mogą być bardzo przydatne – ponieważ niepoprawnie – np. w przypadku wypłaty go- rek współpracuje z zależnymi systemami lub
w razie konieczności można jeszcze dokonać tówkowej na kwotę 20,50 zł urządzenie wy- urządzeniami. Często w testach akceptacyj-
pewnych zmian w projekcie i zaimplemento- płacało 20 zł, po czym system wyświetlał ko- nych uczestniczą również specjaliści z bran-
wać je znacznie mniejszym kosztem i przy munikat o błędzie – ponieważ nie ‘wiedział’ ży danego biznesu (np. analitycy biznesowi)
mniejszym ryzyku niż jakby to miało miej- jak interpretować 0,50 zł. – celem ostatecznego potwierdzenia popraw-
sce w fazie np. wdrożenia lub końcowych te- ności systemu. W związku z powyższym, te-
stów akceptacyjnych. Testy użyteczności stowanie akceptacyjne często rozdziela się na
Inną zaletą testowania przez zespół klien- Testy użyteczności pozwalają ocenić stopień dwa rodzaje – FAT (ang. Functional Acceptan-
ta jest możliwość wykrycia błędów pominię- zadowolenia użytkownika końcowego z pra- ce Testing) i BAT (ang. Business Acceptance Te-
tych przy testowaniu wewnętrznym – po- cy z aplikacją. Na użyteczność składa się pro- sting). Testy FAT przeprowadzane są zazwy-
nieważ takie testowanie jest bliższe rzeczy- stota nauki obsługi systemu, wygoda i szyb- czaj przez wybraną reprezentację użytkowni-
wistemu użytkowaniu systemu i realnych in- kość użytkowania, wydajność. Zwykle te- ków końcowych (lub testerów klienta wypo-
terakcjach z użytkownikiem. stowana jest ergonomia układu strony, roz- sażonych w specjalnie opracowane scenariu-
mieszczenie pól, sekcji, przycisków, intuicyj- sze testowe); testy BAT wykonywane są przez
Rodzaje testów ność położenia elementów na stronie oraz przedstawicieli biznesu – analityków, specja-
przeprowadzanych przez klienta szybkość i efektywność przepływu procesu listów branżowych.
W zależności od przyjętego podejścia i wy- biznesowego. Użytkownik pragnie, aby apli- Testy akceptacyjne muszą być przeprowa-
magań projektu klient wykonuje testy na kil- kacja umożliwiała mu jak najprostsze i naj- dzane w oficjalny sposób – zgodnie z założe-
ku poziomach. Zazwyczaj testowanie takie bardziej wydajne przeprowadzanie operacji. niami i planem. Konieczne jest sporządzenie
obejmuje testy funkcjonalne, użyteczności Nie ma tu miejsca na czasochłonne szkolenia raportu końcowego, który jest podstawą do
i testy akceptacyjne. i naukę obsługi systemu – aplikacja powinna podjęcia decyzji o wdrożeniu oprogramowa-
dać się poznać w najkrótszym możliwym cza- nia na produkcję.
Testy funkcjonalne sie. Optymistyczny wariant zakłada, iż krót-
Zwykle aplikacja oddawana jest klientowi do ka demonstracja oraz niezbyt rozbudowany Zalety i wady
testów funkcjonalnych po zaimplementowa- podręcznik użytkownika powinien wystar- testowania przez zespół klienta
niu i wstępnym przetestowaniu przez we- czyć do zapoznania się z działaniem i założe- Wyobraźmy sobie, że jesteśmy producentem
wnętrzny zespół testerów pewnego modułu niami aplikacji. Możliwe jest to tylko wów- oprogramowania. Otrzymujemy zlecenie wy-
lub zbioru funkcjonalności. Testy takie ma-
ją na celu sprawdzenie czy aplikacja spełnia
założone wymagania – innymi słowy, czy
umożliwia poprawne wykonanie wszystkich
pożądanych i ujętych w ramach kontraktu
operacji i funkcji. Testy takie mogą się od-
bywać równocześnie z dalszym rozwijaniem
aplikacji przez zespół deweloperski – wtedy Rysunek 1. Struktura testów wewnętrznych

www.sdjournal.org 47
Testowanie oprogramowania

tworzenia aplikacji dla instytucji bankowej nia, mocno akcentując, że czyni to ze szko- to potrzebę zmiany planu, aby dostosować się
zajmującej się obsługą klienta indywidualne- dą dla planowanego przebiegu projektu. do preferencji klienta (np. kolejność imple-
go i firm (transakcje, kredyty itp.). Załóżmy, mentacji modułów itp.)
że nasza firma zajmuje się nie tylko usługa- • Większe wymagania odnośnie zasobów
mi programistycznymi, ale i oferuje komplek- ludzkich • Dodatkowe szkolenia
sowe usługi Quality Assurance. Jak w takim
przypadku odnieść się do życzenia klienta, Organizacja i zarządzanie testami klienta Zgoda na przeprowadzenie testów przez ze-
który żąda umożliwienia mu wglądu w stan wymaga zapewnienia dostępności dodatko- spół klienta oznacza dodatkową pracę nie-
aplikacji i możliwości przeprowadzenia swo- wych zasobów ludzkich wspierających in- zbędną dla przeszkolenia testerów klienta w
ich własnych testów po każdej fazie imple- stalację i konfigurację systemu, testowanie zakresie funkcjonalności systemu oraz pro-
mentacji? Jakie korzyści możemy z tego uzy- i wykonywanie poprawek błędów w środo- cedur i narzędzi służących do wykonywania
skać, a jakie straty ponieść? wisku klienta. i zarządzania testami. Odpowiedzialność ta
W pierwszej kolejności rozpatrzmy wady i Instalacja testowego systemu, konfigura- zwykle spada na dostawcę oprogramowania
niedogodności takiego podejścia. cja jego ustawień, sprawdzenia, czy system – niezbyt często zdarza się, aby zespół klien-
startuje itp. zwykle wymaga poświęcenia jej ta potrafił w odpowiedni sposób przygotować
Wady trochę czasu. W dodatku, środowisko klien- się do przeprowadzania testów, raportowa-
ta często różni się od środowiska testów we- nia ich wyników oraz zarządzania zgłoszony-
• Dodatkowa infrastruktura testów wnętrznych, co również powoduje nieco mi defektami. Nie wynika to ze złej woli, ale
komplikacji i potrzebę uprzedniego pozna- raczej z braku profesjonalnego przygotowania
Planując testy klienta często pojawia się ko- nia środowiska. i kwalifikacji testerskich. Wyjątkiem są sytu-
nieczność stworzenia odpowiedniej infra- Zainstalowaną aplikację należy poddać te- acje, w których klient zleca całość testowania
struktury dla potrzeb testów klienta. Nale- stom dymnym, aby upewnić się, że dalsze te- zewnętrznemu zespołowi, wynajętemu od pro-
ży zorganizować środowisko testowe, odpo- stowanie jest możliwe i system odpowiednio fesjonalnej firmy IT. Jednak nawet i w takim
wiednie oprogramowanie wspierające testo- stabilny. To również oznacza konieczność alo- przypadku może zaistnieć konieczność prze-
wanie i raportowanie. Zwykle środowisko kacji pewnej liczby zasobów ludzkich (o ile do szkolenia testerów z zakresu funkcjonalności
testowe dla testów klienta jest organizowa- testów dymnych nie stosuje się narzędzi auto- systemu oraz obsługi specyficznych narzędzi
ne w jego siedzibie – i zazwyczaj to dostaw- matycznych, co jednak nie należy do częstych wspierających testowanie.
ca oprogramowania proszony jest o przygo- praktyk).
towanie i skonfigurowanie sprzętu, integra- • Różna specyfika pracy i kultura
cji itp. Czynności te wymagają zaplanowa- • Zmiany w planowaniu
nia i zaalokowania odpowiedniej ilości zaso- Dość często jedną z najważniejszych prze-
bów – ludzkich, czasowych, czasem sprzę- Zachodzą zmiany w planie projektu. Harmo- szkód dla testowania klienta jest perspekty-
towych. Dostawca systemu czasem traktu- nogram dewelopmentu i testowania należy wa problemów wynikających z różnej specyfi-
je to jako niepotrzebną stratę czasu i pienię- przeanalizować pod kątem wymagań zwią- ki i kultury pracy – np. odmienny sposób roz-
dzy i z niechęcią pomaga w realizacji zada- zanych z testami klienta – czasem oznacza wiązywania problemów czy informowania o
wynikach pracy, inne podejście do organiza-
cji pracy. Częstym przypadkiem jest zgłasza-
nie przez testerów klienta rzeczywistych lub
�������
�������� 'urojonych' problemów bezpośrednio kierow-
nictwu projektu i podnoszenie stosunkowo
������
����
drobnych kwestii jako wysokie ryzyko projek-
����������������
towe – co w efekcie powoduje konflikty i nie-
porozumienia. Innym przykładem jest organi-
���������������
������ zacja pracy – problem szczególnie widoczny
������ ����
w przypadku projektów międzynarodowych
– np. przeprowadzanie testów przez tydzień
czy dwa, notowanie defektów niezależnie od
������ ������ ������ systemu śledzenia błędów, po czym zgłasza-
������ nie ich dopiero po ukończeniu cyklu testów.
W praktyce oznacza to, że:
������
• programiści przez tydzień są bezczyn-
ni, nie mając żadnych defektów do na-
prawy;
������ ������������������ • czas przeznaczony na poprawki dra-
���� ����������� stycznie się zmniejsza – ponieważ
��������������� �����������������������������
obejmuje tylko czas od zakończenia
������� cyklu testów do wydania następnej
��������
��������� wersji systemu, a nie np. od momentu
znalezienia pierwszych defektów – co
z kolei budzi frustrację i sprzeciwy ze-
społu deweloperskiego;
• często zgłaszane są defekty niepraw-
Rysunek 2. Środowiska testowe i podział zadań testowych i odpowiedzialności dziwe lub nieodtwarzalne – znalezio-

48 03/2009
Praca z zespołem testerów klienta

ne tuż po instalacji nowego systemu, tywności testowania oraz możliwość ulep- starczyć wskazówek co do sposobu rozwiąza-
kiedy aplikacja bądź środowisko nie są szenia systemu na stosunkowo wczesnym nia danej kwestii.
jeszcze w pełni stabilne. etapie.
Testowanie jest bardziej efektywne – po- • Lepszy poziom komunikacji
• Niskie kwalifikacje zespołu klienta. dzielenie pracy na dwa zespoły pozwala na
lepszy podział zadań czy też testowanych Klient, informowany na bieżąco o postępie
Dość częstym problemem w testowaniu przez aspektów (np. zespół wewnętrzny wykonu- prac – lub ewentualnym opóźnieniu – jest
zespół klienta jest brak wymaganych kwalifi- je testy integracyjne i ogólne testy dymne, ze- w stanie odpowiednio szybko reagować na
kacji i umiejętności testerskich. Sytuacja ta- spół klienta koncentruje się na testach funk- zaistniałą sytuacje i adaptować swoje plany
ka ma miejsce zwłaszcza wtedy, kiedy testerzy cjonalności, logiki biznesowej i użyteczno- zgodnie z bieżącym stanem rzeczy. Przej-
są po prostu pracownikami danej instytucji, ści). Dobrze zorganizowana współpraca po- rzystość ta pozwala zwiększyć komfort pra-
tymczasowo alokowanymi do wykonywania między oboma zespołami może przełożyć cy, efektywność planowania i podejmowa-
testów. Rodzi to nieporozumienia wynikające się na o wiele lepsze pokrycie i głębokość te- nia decyzji biznesowych. Minimalizuje też
z braku profesjonalnego przygotowania teste- stów niż w przypadku wykonywania prac te- ryzyko konfliktów, które mogłyby się poja-
rów – niewłaściwego podejścia do testowania, stowych tylko przez testerów dostawcy opro- wić w momencie, kiedy klient – przekona-
zgłaszania nieprawdziwych defektów – co wy- gramowania. ny o dobrym postępie prac – nagle dowia-
nika z niezrozumienia funkcjonowania apli- Pracownicy klienta – testerzy i analitycy duje się o opóźnieniu.
kacji, braku wystarczającego opisu problemu – mogą dostarczyć cennych wskazówek od-
(zbyt ogólne opisywanie błędów, brak wszyst- nośnie wytwarzanego oprogramowania. Ja- Zasady współpracy
kich danych koniecznych do reprodukcji i na- ko że znają oni specyfikę danej organizacji, z zespołem klienta
prawy problemu) etc. wymogi biznesowe jakie muszą być spełnio- Godząc się na udostępnienie systemu zespo-
Innego rodzaju czynnikiem powodującym ne przez system, nawyki i przyzwyczajenia łowi klienta, należy uzgodnić plan i organi-
niechęć do testów klienta jest ujawnienie docelowych użytkowników systemu najle- zację procesu testowego. W szczególności
przed klientem kondycji aplikacji przed ukoń- piej ocenią funkcjonalność aplikacji. Ich te- dotyczy to harmonogramowania oraz zakre-
czeniem jej rozwijania. sty są pod pewnym względem korzystniejsze su zadań testowych – ponieważ inne podej-
Czasami dostawca oprogramowania nie od testów wewnętrznych, ponieważ symulu- ście należy przyjąć, gdy testy klienta odby-
chce pokazywać klientowi aplikacji, która nie ją pracę z systemem w docelowym środowi- wają się sporadycznie, a inne, kiedy regular-
jest jeszcze w pełni ukończona i przetestowa- sku i z docelowymi odbiorcami. Zespół we- nie. Zespół klienta może przystąpić do pracy
na obawiając się paniki w przypadku odkrycia wnętrzny nie zawsze jest w stanie opracować równocześnie z testerami producenta opro-
krytycznych błędów i wzbudzenia niepokoju o i zrealizować wszystkie tego typu scenariu- gramowania lub też dopiero po ukończeniu
utrzymanie zakładanych terminów sze testowe. pewnego etapu testów wewnętrznych.
Dobrą praktyką jest jednoznaczne określe-
Zalety • Ulepszanie aplikacji nie następujących kwestii:
Udostępnienie aplikacji testerom klienta to
nie tylko problemy i dodatkowa praca. Ko- Udostępnienie aplikacji klientowi daje możli- • Kto jest osobą odpowiedzialną za testo-
rzyści są następujące: wość dokonywania zmian w projekcie aplika- wanie w środowisku klienta – pracownik
cji na stosunkowo wczesnym etapie wytwa- klienta, członek zespołu projektowego do-
• Większe pokrycie testów rzania systemu, jeśli służy to poprawie uży- stawcy oprogramowania czy też osoba z
teczności, co wiąże się ze znacznie niższymi całkowicie niezależnej organizacji. Osoba
Aplikacja poddana testowaniu przez więcej niż kosztami niż gdyby to miało miejsce np. na taka będzie stanowić tzw. punkt kontaktu
jeden zespół jest przetestowana głębiej i staran- etapie testów akceptacyjnych (przed wdro- dla wszelkiego typu kwestii związanych z
niej, wykonanych jest więcej scenariuszy i przy- żeniem na produkcję). Również modyfika- testowaniem klienta – organizacji procesu
padków testowych – aplikację testuje zespół we- cje wymagań wynikające ze zmian w bizne- testowego, planowania i alokacji zasobów,
wnętrzny oraz zewnętrzny (testerzy klienta), co sie (np. zmiana przepisów prawnych) mogą realizacji i raportowania zadań;
minimalizuje ryzyko pominięcia błędów. Można być zaplanowane i wdrożone wcześnie, jako • Rodzaj narzędzia stosowanego do rapor-
tu stosować dwa podejścia: że zarówno testerzy, jak i analitycy bizneso- towania wyników testów (system śledze-
wi klienta, mają wgląd w aplikację i mogą do- nia defektów) – ważne jest ustalenie, czy
• testerzy dzielą się pracą i zakresem
funkcjonalności, skupiając się na mak-
symalnie dokładnym przetestowaniu
swojej części aplikacji;
• obie grupy testerów pracują równole-
gle – celem takiego podejścia jest do-
kładne sprawdzenie aplikacji przez
dwie grupy testerów, częściowo nie-
zależnych od siebie i stosujących róż-
ne metody pracy, tak by błędy były
znalezione nawet jeśli jedna grupa je
pominie.

• Wyższa efektywność testów

Niezaprzeczalną zaletą udostępnienia apli-


kacji testom klienta jest zwiększenie efek- Rysunek 3. Organizacja testów

www.sdjournal.org 49
Testowanie oprogramowania

testerzy klienta będą używać tego same- ne zgłaszanie błędu znacznie skraca czas zakres funkcjonalności umożliwiał włączenie
go narzędzia, co zespół dostawcy opro- analizy problemu i naprawy usterki – po- do testów zespołu klienta – organizacja proce-
gramowania, czy też defekty raporto- nieważ deweloper rozumie opis defektu i su testowego została zmieniona. Testy wykony-
wane będą we własnym systemie klien- wie, jak go zreprodukować. wały równocześnie dwa zespoły – wewnętrzny
ta. Raportowanie defektów w systemie (wewnętrzne środowisko testowe / SIT) i klien-
klienta będzie się wiązać z koniecznością Studium przypadku ta (SIT / UAT). Testowanie dotyczyło już tylko
eksportu znalezionych problemów do Przykład procesu organizacji procesu testo- wersji Release aplikacji – przy czym wersja sys-
wewnętrznego narzędzia dostawcy opro- wego, w którym uczestniczy zespół klien- temu, którą testował zespół wewnętrzny była
gramowania, a następnie z zarządzaniem ta, prześledzimy na podstawie międzynaro- nowszą o 2 wersje od wersji oddanej do testów
owymi defektami – kontrolowaniem, dowego projektu IT, mającego na celu wy- pracownikom klienta. Takie podejście umożli-
które zostały odrzucone, które przeka- produkowanie oprogramowania na potrze- wiało zarówno znalezienie poważniejszych błę-
zane do naprawy oraz naprawione. Infor- by bankowości. System miał zastąpić do- dów i ich poprawienie zanim system zostanie
macje te będą musiały z kolei zostać prze- tychczas używany w oddziałach banku sys- przekazany do testowania klientowi, jak i za-
kazane zespołowi klienta. Wszystkie te tem, zintegrowany z kilkoma innymi apli- gwarantowanie, że testerzy klienta będą praco-
czynności wymagają dodatkowych zaso- kacjami i bazami danych oraz urządzenia- wać na aplikacji wolnej od poważnych błędów i
bów, co należy uwzględnić w planowaniu mi bankowymi. skupią się na testowaniu funkcjonalności, logi-
testów; Bezwzględnym wymogiem klienta (ban- ki biznesowej i użyteczności.
• Harmonogram testów – należy określić, ku) było dopuszczenie jego zespołu do prze-
kiedy zespół klienta może rozpocząć te- prowadzania testów – i to jeszcze przed roz- Środowiska testowe
stowanie, czy będzie się ono odbywać poczęciem testów akceptacyjnych, po ukoń- Zależnie od etapu i celu testów, testowanie
równocześnie z testami wewnętrzny- czeniu pewnego etapu rozwijania aplikacji przeprowadzano w innych środowiskach. Testy
mi, czy też w osobnych fazach. Inne po- i zbudowaniu wybranych modułów i funk- wewnętrzne odbywały się w udostępnionym
dejście stosuje się w przypadku, gdy te- cjonalności. testerom środowisku dostawcy oprogramowa-
stowanie ma odbywać się regularnie w Testowanie wewnętrzne, przeprowadzane nia, ubogim w dane testowe i pozbawionym in-
dłuższym okresie czasu, a inne, kiedy przez zespół testerów dostawcy oprogramo- tegracji z zależnymi systemami zewnętrznymi i
zespół testowy pracuje jedynie od cza- wania, odbywało się od momentu stworze- urządzeniami. Ich celem było znalezienie błę-
su do czasu, wyrywkowo sprawdzając nia pierwszych stabilnych wersji modułów dów powstałych w trakcie wytwarzania opro-
działanie aplikacji. Testowanie regular- aplikacji. Testy podzielono na etapy: gramowania i przygotowanie aplikacji do ko-
ne oznacza konieczność synchronizacji lejnego poziomu testów – integracyjnych i ak-
prac testowych zespołu testerów klienta • Stream – testy polegały na testowa- ceptacyjnych. W trakcie testów wewnętrznych
i dostawcy oprogramowania, tak aby sta- niu pojedynczych funkcjonalności, bez wszystkie punkty integracji zastąpiono zaślep-
rać się nie duplikować wykonywanej pra- sprawdzania integracji i poprawności kami i sztucznymi danymi testowymi, współ-
cy i nie wprowadzać chaosu organiza- biznesowej przebiegu procesu; praca z urządzeniami była natomiast symulo-
cyjnego. Dobrym rozwiązaniem jest po- • Build – testowanie obejmowało kilka wana przez oprogramowanie.
dział zadań lub skupienie się na innych funkcjonalności zintegrowanych w sta- Laboratoria SIT oraz UAT były stworzone
aspektach testowania. Harmonogram bilną paczkę. Częściowo testowano inte- w siedzibie klienta - i połączone z odpowied-
testów powinien uwzględniać również grację – na tyle, na ile pozwalał zakres nimi testowymi bazami danych, systemami
prace deweloperskie niezbędne do na- dostarczonej paczki; zewnętrznymi i urządzeniami typu drukar-
prawienia błędów znalezionych przez te- • Release – testowanie Release obejmowa- ki, czytniki kart, kasy. W pierwszej kolejno-
sterów – ponieważ dopiero po zakończe- ło większą część aplikacji – kilkanaście ści przygotowano środowisko SIT (System In-
niu jednego cyklu testowania i naprawie modułów i funkcjonalności zintegrowa- tegration Testing) – którego celem było prze-
błędów można rozpocząć kolejny cykl nych w aplikację, która mogła już speł- testowanie działania systemu zintegrowane-
testów; niać wybrane funkcje biznesowe. Testy go z systemami i urządzeniami zewnętrzny-
• Zakres testów – planując testowanie w obejmowały zarówno poprawność funk- mi, przy użyciu testowych danych, kart ban-
środowisku klienta należy zdefiniować, cjonalną, jak i integrację pomiędzy mo- kowych, czeków itp. Za tą weryfikację odpo-
co będzie przedmiotem testowania, a co dułami aplikacji. wiedzialny był zespół testerów klienta, przy
nie. Pozwoli to uniknąć nieporozumień wymaganym wsparciu testerów wewnętrz-
i niepotrzebnych konfliktów – np. jeśli Strukturę testów w ramach jednej ‘iteracji’ nych. Po uzyskaniu odpowiedniego stop-
testy dotyczyć będą użyteczności czy przedstawia Rysunek 1. nia jakości aplikacji (ocenianej jako ilość
logiki biznesowej, testerzy nie powinni W ramach jednego podejścia testów Stream otwartych błędów o określonej krytyczno-
zgłaszać defektów związanych z wydaj- oddawano kolejno trzy pakiety funkcjonalno- ści), system zainstalowano w środowisku
nością systemu; ści (‘Streamy’ po kilka funkcji), głównie do pod- UAT I. UAT (User Acceptance Testing) było
• Zasady raportowania defektów. Ważne stawowych testów funkcjonalności i Look & feel. oficjalnym testem akceptacyjnym, wykony-
jest przyjęcie pewnych wspólnych wy- Po zakończeniu tego etapu testów były tworzone wanym przez testerów klienta. Dwa miesią-
tycznych i zasad zgłaszania błędów. W or- paczki funkcjonalności, dostarczane jako Build. ce przed planowanym terminem wdrożenia
ganizacji klienta mogą istnieć wewnętrz- Obejmowały one zintegrowane funkcje, dotąd systemu na produkcję, aplikację poddano
ne standardy raportowania, nie odpowia- przetestowane w ramach poprzednich testów. testom UAT II – wykonywanym przez pra-
dające potrzebom i przyzwyczajeniom Testom poddawano kolejno trzy takie paczki. cowników placówek banku. Mieli oni spraw-
zespołu deweloperskiego dostawcy opro- Końcowym produktem jednej iteracji była wer- dzić, czy gotowy system wypełnia wszyst-
gramowania. Z drugiej strony mogą nie sja Release aplikacji, obejmująca wszystkie do- kie pożądane funkcje i jest gotowy by zastą-
istnieć żadne standardy – w przypadku, tychczas przetestowane funkcje i moduły zinte- pić dotychczas używaną w oddziałach ban-
gdy np. odbiorca systemu nie utrzymu- growane w jedną, stabilną aplikację. ku aplikację.
je własnego działu testów lub korzysta z Testowanie wewnętrzne obejmowało 3 ite- Schemat organizacji środowisk testowych
zewnętrznych usług testerskich. Popraw- racje. Następnie – gdy kondycja aplikacji oraz przedstawia Rysunek 2.

50 03/2009
Praca z zespołem testerów klienta

W organizacji i konfiguracji środowiska testów wadzenia testu dymnego oraz reproduk- tem przydatności i poprawności w działa-
wewnętrznych przyjęto następujące założenia: cji zgłoszonych defektów – oraz testerzy niu operacyjnym oraz ergonomii. Środowi-
klienta – dla wykonywania regularnych ska UAT charakteryzowały się następujący-
• Dostęp do środowiska ma jedynie ze- testów w fazie poprzedzającej testy UAT mi cechami:
spół testerów dostawcy oprogramowa- oraz dla przeprowadzania testów dym-
nia; nych w fazie testowania UAT; • Dostęp mają jedynie zespoły klienta;
• Test dymny (Smoke test) jest pierwszą • Test dymny (Smoke test) jest pierwszą • Defekty znalezione podczas testo-
czynnością po udostępnieniu nowej wer- czynnością po udostępnieniu nowej wania zgłaszane są w wewnętrznym
sji aplikacji. Test ten musi zostać wyko- wersji aplikacji. Test ten musi zostać systemie klienta. Manager QA po
nany z pozytywnymi rezultatami za- wykonany z pozytywnymi rezultatami stronie dostawcy oprogramowania
nim rozpocznie się jakiekolwiek testowa- zanim rozpocznie się jakiekolwiek te- ma dostęp do tego systemu i jest od-
nie. Dopuszczalne jest przyjęcie aplikacji stowanie. Podobnie jak w przypadku te- powiedzialny za przetransferowanie
do dalszych, regularnych testów, jedynie stów wewnętrznych, dopuszczalne jest defektów dotyczących aplikacji do
gdy: przyjęcie aplikacji do dalszych, regular- wewnętrznej bazy defektów produ-
• nie ma defektów krytycznych i blo- nych testów, jedynie gdy nie ma defek- centa oprogramowania;
kujących dalsze testowanie; tów krytycznych i blokujących lub jeśli • Zakończenie cyklu testów UAT
• istnieją defekty krytyczne, lecz mo- istnieje co najwyżej jeden defekt kry- kończy się sporządzeniem rapor-
gą zostać szybko naprawione za po- tyczny, ale może zostać naprawiony w tu przedstawiającego stan aplikacji
mocą hotfixu lub innego rodzaju szyb- przeciągu 1 dnia za pomocą hotfixu lub – do wglądu Komitetu Sterującego.
kiej poprawki. W tym przypadku wa- re-instalacji systemu; Pozytywne wyniki testów i subiek-
runkiem koniecznym po zastosowa- • Defekty znalezione w testach SIT są zgła- tywna ocena udziałowców projek-
niu hotfixu jest rozpoczęcie testów szane w oddzielnym, udostępnionym tu są podstawą do podjęcia decyzji o
od sprawdzenia, czy poprawka dzia- klientowi systemie śledzenia błędów (‘ze- wdrożeniu na produkcję.
ła i umożliwia dalsze testowanie apli- wnętrzna’ baza danych błędów). Dostęp
kacji. Hotfix może dotyczyć zarówno do tej bazy danych mają wybrane osoby Organizacja pracy zespołów testerskich
błędów w samej aplikacji, jak i defek- z zespołu klienta (Test Leader) oraz anali- W trakcie dewelopmentu i początkowych eta-
tów środowiska – konfiguracji sprzę- tycy biznesowi i Test Leader zespołu do- pów testowania, testy wykonywał tylko zespół
tu, baz danych itp; stawcy oprogramowania; wewnętrzny. W tym czasie testerzy klienta za-
• Defekty znalezione w testach we- • Końcową czynnością testów jest spo- poznawali się z funkcjonalnością systemu na
wnętrznych są zgłaszane w osobnej (we- rządzenie raportu zawierającego liczbę podstawie dokumentacji projektowej oraz or-
wnętrznej) bazie danych i nie są udo- i określenie krytyczności znalezionych ganizowali środowisko pracy.
stępniane klientowi ani jego testerom; defektów oraz liczbę poprawek, zwery- Po zakończeniu pierwszego etapu testów i
• Końcową czynnością testów jest spo- fikowanych i potwierdzonych jako dzia- upewnieniu się, że dana wersja systemu jest
rządzenie raportu opisującego kondycję łające w pożądany sposób; gotowa do testów integracyjnych i udostęp-
aplikacji, liczbę i ważność znalezionych • Zakończeniem testowania SIT jest nienia go zespołowi klienta, aplikację zainsta-
defektów oraz poprawek, zweryfikowa- upewnienie się, że aplikacja jest stabil- lowano w środowisku SIT. SIT było początko-
nych i potwierdzonych jako działające na, działa poprawnie i jest gotowa do wo środowiskiem dostępnym jedynie zespo-
w pożądany sposób; testowania UAT – w środowisku bar- łowi klienta, testerzy wewnętrzni nie mie-
• Zakończeniem testowania wewnętrzne- dziej zbliżonym do produkcyjnego pod li do niego dostępu. Podczas gdy zespół we-
go jest upewnienie się, że aplikacja jest względem danych testowych. Testy wnętrzny kontynuował swoje testy i wery-
stabilna, działa poprawnie i jest gotowa UAT wykonują testerzy oraz analitycy fikował kolejne wersje aplikacji, pracownicy
do testowania zewnętrznego – przez klienta. Decyzja ta jest podjęta na pod- klienta otrzymali pierwszą – już przetestowa-
zespół klienta. Decyzja ta jest podjęta stawie raportu z testowania oraz dysku- ną wewnętrznie – wersję systemu do testowa-
na podstawie raportu z testowania oraz sji kierowników zespołów testowych i nia. Swoje pierwsze testy przeprowadzali bez
dyskusji kierowników zespołów testo- kierownictwa projektu. jakiegokolwiek wsparcia ze strony dostawcy
wych i kierownictwa projektu. oprogramowania, opierając się na własnym
Środowiska UAT służyły do oficjalnych te- rozumieniu systemu i dostępnej dokumen-
Organizacja środowiska SIT przedstawiała stów akceptacyjnych. Zorganizowano dwa tacji projektowej. Testy odbywały się w cyklu
się następująco: laboratoria UAT – jedno dla zespołu tester- tygodniowym, przy czym zgłaszanie znalezio-
skiego klienta, drugie dla zespołu pracowni- nych defektów następowało dopiero po zakoń-
• Dostęp do środowiska mają testerzy do- ków banku z różnych oddziałów, mających czeniu cyklu. Komunikacja z zespołem produ-
stawcy oprogramowania – w celu przepro- sprawdzić funkcjonowanie systemu pod ką- centa oprogramowania ograniczała się do roz-

Pojęcia
• UAT (User Acceptance Testing) – Testy akceptacji użytkowników mające na celu sprawdzenie, czy aplikacja spełnia wymagania użytkowników pod
względem funkcjonalności oraz użyteczności.
• SIT (System Integration Testing) – Testowanie integracji systemu weryfikujące poprawność działania wszystkich modułów systemu zintegrowa-
nych w całość i połączonych z zależnymi systemami zewnętrznymi.
• Smoke test (Sanity test) – Test dymny – podstawowy test wykonywany po instalacji nowej wersji systemu mający na celu stwierdzenie, czy aplika-
cja działa i może być poddana dalszym, głębszym testom
• Back end – Aplikacja pośrednio wspierająca pracę systemu frony end – np. przez komunikowanie się w celu pobrania informacji / danych wyko-
rzystywanych bezpośrednio przez użytkownika aplikacji front-end
• Front end – Aplikacja, z którą użytkownik pracuje bezpośrednio

www.sdjournal.org 51
Testowanie oprogramowania

mów telefonicznych lub e-konferencji (raz w konywał je najpierw zespół dostawcy • Równocześnie z rozpoczęciem cyklu te-
tygodniu) dotyczącej rezultatów testów i ogól- oprogramowania w środowisku SIT. W stowania przez zespół klienta, progra-
nego postępu prac. razie pozytywnych wyników testu, apli- miści przystępowali do naprawy błę-
Takie podejście od początku doprowadzi- kację instalowano w środowisku UAT i dów:
ło do problemów i sytuacji konfliktowych. oddawano testerom klienta; • zgłoszonych w trakcie testów wyko-
Po pierwsze, brak odpowiedniej komunika- • Test dymny wykonywany przez klien- nywanych przez testerów dostawcy
cji i wsparcia spowodował, iż zespół testowy ta miał na celu stwierdzić, czy aplika- oprogramowania;
skazany był na siebie. Problemy z konfiguracją cja jest gotowa do dalszych, głębszych • zgłoszonych przez testerów klienta
systemu, integracją z systemami zewnętrzny- testów. Wszystkie krytyczne przypadki po ukończeniu ich cyklu testów.
mi lub urządzeniami itp. wstrzymywały testo- testowe musiały być zakończone z ocze-
wanie i powodowały nieprawdziwe wyniki te- kiwanym wynikiem; Plusem takiej organizacji pracy było zwięk-
stów, ale nie były identyfikowane i komuniko- • W czasie, gdy zespół klienta zajmował szenie interakcji i komunikacji pomiędzy
wane odpowiednim osobom. I tak na przykład się testem dymnym, testerzy wewnętrz- zespołami, co w widoczny sposób polep-
awaria połączenia z zewnętrznym systemem, ni wykonywali testy regresji. Pozwala- szyło efektywność testowania i zmniejszyło
która uniemożliwiała wykonanie transakcji ło to zweryfikować dokonane poprawki ilość popełnianych przez testerów pomyłek.
bankowych, została zgłoszona jako krytycz- błędów i znaleźć ewentualne nowe błę- Ponadto testy przeprowadzane podwójnie –
ny błąd w aplikacji, bez upewnienia się, że in- dy jeszcze przed rozpoczęciem kolejne- przez oba zespoły – pozwalały znaleźć wię-
tegracja z back endem działa. Dalsze testowa- go etapu testów klienta. Tym sposobem cej błędów i zminimalizować ryzyko pomi-
nie wstrzymano odrzucając wersję systemu ja- programiści otrzymywali szybką infor- nięcia istotnych błędów.
ko niestabilną, mimo że – jak się okazało póź- mację zwrotną i mogli skupić się na ko- Poprawiła się także efektywność poprawia-
niej – przywrócenie połączenia z back endem lejnych pracach; nia błędów, ponieważ nowe błędy zgłaszane
zajęło 0.5 godziny. • Po zakończeniu testów dymnych zespół były z wystarczającym opisem i już zweryfi-
Powtarzające się problemy i konflikty do- klienta rozpoczynał testy regresji, aby kowane jako prawdziwe błędy – programiści
prowadziły w końcu do zmiany podejścia do stwierdzić, czy poprawki dla uprzednio nie musieli więc tracić czasu na analizowa-
testowania – do siedziby klienta wysłano te- zgłoszonych przez nich błędów działa- nie i weryfikację poprawności.
sterów dostawcy oprogramowania oraz pro- ją w odpowiedni sposób i nie wywołują Udostępnienie środowiska UAT oznacza-
gramistów, którzy mieli wspierać testowanie dalszych błędów; ło jeszcze większe zwiększenie efektywności
aplikacji i naprawę błędów bezpośrednio ko- • Zespół dostawcy rozpoczynał testowa- testowania z racji tego, że zawierało więcej
rzystając ze środowiska docelowego. Począt- nie regularne jeszcze w trakcie testów danych i urządzeń testowych i było bardziej
kowo zespół wewnętrzny korzystał ze środo- regresji – przypadki testowe zostały za- niż SIT zbliżone do środowiska docelowego.
wiska SIT jedynie w celu przeprowadzania projektowane w taki sposób, aby umoż- Z tego powodu testy umożliwiały symulację
testów dymnych oraz reprodukcji defektów, liwiać jednoczesną weryfikację popra- pracy w środowisku docelowym.
które nie były reprodukowane w wewnętrz- wek i przeprowadzanie normalnych te- Kolejnym etapem było udostępnienie apli-
nym środowisku testowym. W rzeczywistości stów. Wyniki testów – błędy – były ra- kacji pracownikom oddziałów banku w ce-
oznaczało to, że programiści i testerzy dostaw- portowane na bieżąco w wewnętrznym lu ostatecznej weryfikacji funkcjonalności
cy oprogramowania byli zmuszeni czekać, aż systemie obsługi błędów dostawcy opro- i użyteczności aplikacji. System testowy za-
zespół klienta zakończy prace, aby mieć do- gramowania; instalowano w osobnym środowisku UAT II
stęp do SIT i móc rozpocząć analizę zgłoszo- • Zespół klienta rozpoczynał regularne będącym niemal dokładną kopią środowi-
nych błędów. testy po wykonaniu testów regresji, ana- ska produkcyjnego. Pracownicy banku re-
Aby wyeliminować to ograniczenie i umoż- lizie ich wyników oraz przygotowaniu alizowali testy posługując się własnymi me-
liwić bezproblemową pracę obu zespołów, zadań do zrealizowania podczas testo- todami i procedurami, które obowiązywały
klient zorganizował drugie środowisko testo- wania. Testy klienta wykonywane były w oddziałach banku. Operacje wykonywane
we – UAT. Testerom dostawcy udostępnio- według procedury obowiązującej w ban- przez nich symulowały rzeczywiste procesy
no środowisko SIT, natomiast testerzy klien- ku, pod nadzorem i przy wsparciu ze- biznesowe i czynności w banku. Pracę teste-
ta rozpoczęli prace w środowisku UAT, przy społu dostawcy, który udzielał niezbęd- rów z oddziałów banku nadzorowali anality-
czym wstępny test dymny realizował zespół nych wyjaśnień co do wdrożonych po- cy biznesowi klienta oraz Kierownik Testów
dostawcy. prawek oraz zakresu zmian dokonanych ze strony dostawcy oprogramowania. Służyli
Harmonogram i organizacja testów SIT w funkcjonalności systemu; oni wyjaśnieniami w przypadku pytań i nie-
odbywała się według wspólnego schematu • Po ukończeniu cyklu testów zespół jasności dotyczących funkcjonalności sys-
(Rysunek 3.). klienta opracowywał wyniki testów temu oraz weryfikowali ewentualne błędy
Procedura testów przedstawiała się nastę- (tworzył raporty błędów) i przekazywał (które następnie zgłaszano do systemu ob-
pująco: je do swojego Kierownika Testów, który sługi błędów projektu).
po dyskusji z Kierownikiem Testów ze Wszelkie uwagi i wnioski pracowników ban-
• Po instalacji nowa wersja systemu zosta- strony dostawcy zgłaszał znalezione błę- ku były notowane i rozpatrywane na cotygo-
wała poddawana testom dymnym. Wy- dy do systemu obsługi błędów; dniowych zebraniach kierownictwa projektu,

W Sieci
• http://articles.techrepublic.com.com/5100-10878_11-1044625.html – Krótkie wprowadzenie do pojęcia testów akceptacyjnych;
• www.xpuniverse.com/2001/pdfs/Testing05.pdf – Artykuł dotyczący wymagań i przeprowadzania testów akceptacyjnych;
• http://www.usability.gov/refine/learnusa.html – Wprowadzenie do testów użyteczności – cele, metody i koszty testów;
• www.webcredible.co.uk/user-friendly-resources/web-usability/usabilty.testing.shtml – Osiem wskazówek dotyczących planowania, realizacji i analizy
wyników testów akceptacyjnych.

52 03/2009
Praca z zespołem testerów klienta

które następnie decydowało, jakie uwagi i suge- • lepsza komunikacja w projekcie, szybsze rozwiązywania problemów, jeśli ma wgląd w
stie rzeczywiście mogą usprawnić działanie apli- i efektywniejsze rozwiązywanie proble- bieżący stan aplikacji. Niewątpliwym plu-
kacji i będą wdrażane jako Żądania Zmian. mów; sem jest możliwość maksymalizacji efektyw-
Analizowano również błędy wykryte pod- • wzrost zaufania klienta do dostawcy ności prac testowych – wykrycie jak najwięk-
czas testów UAT II – stosunkowo często błę- oprogramowania. szej liczby błędów w jak najkrótszym czasie
dy te pojawiały się tylko w środowisku UAT oraz możliwość sprawdzenia działania syste-
II, nie występowały w UAT i SIT. W takich Oraz oczywiście – sprawdzenie funkcjo- mu podczas działania z użytkownikami zbli-
przypadkach naprawa błędów wymagała do- nowania systemu w środowisku docelo- żonymi do użytkowników końcowych sys-
stępu do UAT II – błąd reprodukowano oraz wym (UAT II) i w użytkowaniu przez użyt- temu. Dlatego też warto rozważyć większe
brano odpowiednie logi systemu, aby następ- kowników końcowych. Dodatkowo połą- zaangażowanie klienta w prace projektowe
nie przystąpić do poprawiania błędu na ma- czenie sił i wspólna praca nad systemem – obie strony – i dostawca, i klient – mogą na
szynie programisty. umożliwiła zespołowi klienta dogłębne po- tym wiele skorzystać.
Zatrudnienie pracowników banku do testo- znanie funkcjonalności tworzonego syste-
wania systemu przed wdrożeniem na produk- mu, jak również powiązań z systemami ze-
cję umożliwiło wykrycie i poprawę istotnych wnętrznymi, co usprawniło pracę organiza-
dla poprawnego funkcjonowania systemu błę- cji klienta. KAROLINA ZMITROWICZ
dów oraz wdrożenie kilku zmian ułatwiających Pracuje na stanowisku Analityka biznesowego w
sprawną i szybką pracę z aplikacją. Podsumowanie firmie BLStream, wchodzącej w skład Grupy BLStre-
Praca z testerami klienta nie zawsze jest pro- am. Karolina specjalizuje się obecnie w modelowa-
Wyniki sta i przyjemna. Czasami wymaga poświęce- niu wymagań biznesowych. Wcześniej pracowała
Dzięki usprawnionej współpracy z zespoła- nia stosunkowo dużych nakładów czasu na jako Manager Quality Assurance w projektach in-
mi klienta i kooperacji w prowadzeniu prac przeszkolenie zespołu klienta i zorganizo- formatycznych w sektorze finansowo – bankowym.
testowych osiągnięto wymierne korzyści: wania dodatkowego środowiska testowego Grupa BLStream powstała by efektywniej wykorzy-
oraz reorganizacji planu i założeń projektu. stywać potencjał dwóch, szybko rozwijających się
• większa liczba błędów wykrytych i na- Współpraca z klientem wymaga dobrej or- producentów oprogramowania – BLStream i Ga-
prawionych przed wdrożeniem systemu ganizacji pracy i chęci współdziałania, ale re- melion. Firmy wchodzące w skład grupy specjali-
na produkcję; zultaty mogą być bardzo dobre i mieć zasad- zują się w wytwarzaniu oprogramowania dla klien-
• większe pokrycie testów dzięki wyko- niczy wpływ na sukces projektu. Klient na- tów korporacyjnych, w rozwiązaniach mobilnych
nywaniu testów przez dwa zespoły, uzu- biera zaufania do dostawcy oprogramowania oraz produkcji i testowaniu gier.
pełniające się nawzajem; i z większym zaangażowaniem podchodzi do Kontakt z autorem: karolina_zmitrowicz@wp.pl

R E K L A M A

www.sdjournal.org 53
Testowanie oprogramowania

Jakość
czy jakoś to będzie?
Czyli jak Rational Quality Manager może
wesprzeć profesjonalne zarządzanie procesem testów
Odpowiedź na pytanie czy tworzone oprogramowanie jest wystaczająco
dobre do uruchomienia produkcyjnego wymaga złożonego procesu
decyzjnego. IBM Rational® Quality Manager jest rozwiązaniem, które może
pomóc podjąć tą odpowiedzialną decyzję w oparciu o wiarygodne dane
dostarczane w czasie rzeczywistym.
Tworzenie nowego użytkownika
Dowiesz się: Powinieneś wiedzieć: Utworzenie konta dla nowego użytkownika wy-
• Jak oprogramowanie wspiera proces zarzą- • Jak wygląda proces testów w Twoich projek- maga następujących czynności:
dzania testami; tach.
• Jak rozpocząć prace z Rational Quality Manager . • Zalogowanie do systemu w roli administra-
tora (domyślne konto to user name: AD-
MIN; password: ADMIN).
gane. Praktyka jednak mówi inaczej. Np. współ- • Następnie z menu aplikacji wybieramy Ad-
dzielenie informacji w zespole. Przecież informa- min i Jazz User Administration (Rysunek 1.)
Poziom trudności cje w każdym projekcie są rozsyłane do wszystkich • Na ekranie User Management wybieramy
zainteresowanych! Czy na pewno tak jest? polecenie Create User.
Przestrzeganie wszystkich tych zadań może się
wiązać z koniecznością wykonania dodatkowych Niezbędne dane do wprowadzenia to name (na-

J
ego zadaniem jest maksymalizacja efektów prac niż konkretne zadania projektowe, a w efek- zwa użytkownika), user ID (login użytkownika
pracy zespołów projektowych, zmniejsze- cie czasem doprowadzamy do drobnych zanie- i adres e-mail oraz konieczne jest wybranie wła-
nie liczby defektów oraz skrócenie czasu dbań, które mają tendencje do przekształcania się ściwych uprawnień licencyjnych, przykład na
dostarczania produktów. w poważne problemy projektowe. Np. brak infor- Rysunku 2. Następnie przycisk Save zakończy
To ludzie, a nie organizacje, tworzą dobre opro- macji o wykorzystaniu laboratorium testowego operację, która będzie potwierdzona komunika-
gramowanie. Aby proces produkcji oprogramowa- może spowodować spiętrzenie się testów wyma- tem (tak jak na Rysunku 3.)
nia był ściśle związany z zapewnieniem jakości, ze- gających specyficznych zasobów w pewnych okre- Uwaga: Nowy użytkownik ma nadawane
społy muszą współpracować, wykorzystywać au- sach czasu (zwykle tuż przed końcem projektu), a hasło takie same jak nazwa konta (User Id) Po
tomatyzację, która przyspiesza realizację prac, wy- bezproduktywne utrzymywanie go w innych. Ta- pierwszym zalogowaniu użytkownik powinien
mieniać informacje oraz widzieć wskaźniki postę- kie przykłady można mnożyć. Zwykle wytłuma- ustalić sobie inne hasło.
pu testów umożliwiające lepsze zarządzanie pro- czeniem jest brak czasu na zadania niezwiązane
jektami. Proces produkcji oprogramowania stero- ściśle z projektem, takie jak raportowanie czy uzu- Planowanie testów
wany jakością rozszerza definicję jakości poza tra- pełnianie dokumentacji. Plan testów to jedna z tych cznności, które są klu-
dycyjne testowanie. Obejmuje kluczowe aspek- Ważne jest więc zapewnienie automatyzacji jak czowo ważne dla sprawnego procesu testów, ale
ty produkcji oprogramowania — od definiowania największej ilości czynności, aby postulaty takie bardzo często prowadzona jest tylko na ogólnym
wymagań i zarządzania projektem, po zarządza- jak wgląd w stan realizacji projektu w czasie rze- poziomie, a typowym wytłumaczeniem jest, że
nie defektami. czywistym mogły być spełnione. Jak więc wygląda planowanie zabiera dużo czasu, który może być
praca z Rational Quality Manager i jak rzeczywi- wykorzystany na bardziej konkretną pracę.
Jakie zadania może Rational Qu- ście wypełnia on postawione przed nim zadania?
ality Manager wykonać za Ciebie? Ze strony http://www.ibm.com/developerworks/
Lista funkcji realizowanych przez Rational Quality downloads/r/rqm/ można ściągnąć 60 dniową
Manager jest długa. Nie było w ofercie IBM Ratio- wersję próbną Rational Quality Manager, aby we
nal podobnego produktu do tej pory. Oto krótkie własnym środowisku przekonać się o możliwo-
podsumowanie kluczowych cech: Postulaty te są ściach tego narzędzia. Aby ułatwić pierwsze kro-
jasne i w każdym projekcie powinny być przestrze- ki, kilka przykładów działania użytkowników. Rysunek 1. Menu administratora

54 03/2009
Jakość czy jakoś to będzie?

Dzięki Rational Quality Manager plan te- • Tworzenie i zarządzanie przypadkami te- wych i śledzenie stanu w rozbiciu na istotne
stów może być stworzony szybko, może wy- stowymi w powiązaniu z zakresem zdefi- cechy konfiguracji;
korzystywać sprawdzone wcześniej procedu- niowanym w planie; • Określenie potrzebnych zasobów, czasu i
ry i być aktualizowany na bieżąco, zgodnie ze • Importowanie i wiązanie wymagań projek- innych wysiłków do zrealizowania właści-
zmieniającymi się potrzebami projektu. W Ra- tu z przypadkami testowymi czy bezpo- wych testów na każdym z etapów projektu;
tional Quality Manager plan testów obejmu- średnio z planem dla zapewnienia właści- • Zdefiniowane i komunikowanie w całym ze-
je co najmniej cel i zakres testów, poszczegól- wego pokrycia testami; spole celów biznesowych, przedmiotów te-
nych etapów testów oraz kryteria zakończenia. • Planowanie i wiązanie z przypadkami i ele- stów, kryteriów jakości i innych artefaktów.
Pozwala to na: mentami planu środowisk do przeprowa-
dzania testów (np. przeglądarki, bazy da- Plan składa się zwykle z kilku szablonów, dosto-
• Śledzenie przeglądów, akceptacji i bieżące- nych, systemy operacyjne), co ułatwia przy- sowywanych do własnych potrzeb organizacji. Je-
go statusu planu; gotowanie właściwych konfiguracji testo- śli w standardowych szablonach są elementy nie-
przydatne do Twojego procesu, można je usunąć,
jeśli jakiś brakuje, można je utworzyć. Tak utwo-
rzony szablon może być podstawą w następnym
projekcie, pozwalając tym samym na przeniesie-
nie sprawdzonych praktyk i przyspieszenie pracy.
Kluczowe kroki przy tworzeniu nowego pla-
nu testów ze standardowego szablonu:

• Zaloguj się do Rational Quality Manager ja-


ko użytkownik.
• W lewym panelu nawigacyjnym wybierz
ikonę Plannig i polecenie Create Test Plan
• Następnie podaj nazwę planu testów, a w po-
lu Template wybierz Default Test Plan Template
Rysunek 2. Tworzenie nowego użytkownika • Przycisk Save utworzy Twój plan testów,
efekt powinien być analogiczny do widocz-
nego na Rysunku 4.

Domyślny plan testów składa się z trzech głów-


nych sekcji:
Rysunek 3. Potwierdzenie utworzenia nowego konta
• * Nagłówek (pokazy na Rysunku 4.);
• * Spis treści (czyli elementy planu);
• * Sekcja opisu elementu.

Domyślnie sekcje znajdujące się w szablonie nie


są utworzone, tak więc w każdą potrzebną w
Rysunek 4. Zapisany plan testów projekcie należy zainicjować poprzez naciśnię-
cie przycisku Work Item Create i wypełnienie
Tabela1. Podsumowanie kluczowych cech Rational Quality Manager danych niezbędnych danej sekcji,
Np. w sekcji Summary musimy wybrać właści-
Współdziele- Wsparcie współpracy w rozproszonych zespołach dzięki interfejsowi Web 2.0;
nie informacji Centralne repozytorium przechowuje wersje zasobów testowych i szablonów do
ciela (Owned By) i planowaną datę zakończenia
w zespole wielokrotnego wykorzystania; (Due), tak jak to pokazane jest na Rysunku 5.
Obsługa zespołów małych, średnich i dużych (do 250 osób). Jako że zadaniem testów jest sprawdzenie speł-
Zarządzanie Elastyczne środowisko definiowania procesów pozwalające na włączenie spraw- nienia wymagań, najczęściej kolejnym krokiem
w cyklu życia dzonych praktyk w miarę ich nabywania; jest dołączenie opisów wymagań do przetestowa-
projektu Plan testów dla wszystkich etapów projektu określający role uczestników, proces, nia. Jeśli wymagania są zgromadzone w systemie
odpowiedzialnych za efekty i automatyzujący przepływ zasobów i informacji; zarządzania wymaganiami takim jak RequistePro
Współdzielony dostęp i śledzenie stanu zasobów w całym cyklu życia. możemy je powiązać do Rational Quality Mana-
Zarządzanie Opisywanie kroków testowych z formatowaniem RichText, obrazami i zestawami ger. Wymagania zapisane w dokumentach może-
testami ręcz- danych testowych zapewniające precyzję opisu i wykonania; my zaimportować przez format XML, a dla na-
nymi Proceduralizacja tworzonych testów zapewnia przyspieszenie pracy, wielokrotne
szego ćwiczenia utworzymy wymaganie wprost
wykorzystanie tworzonych elementów oraz dostęp dla wszystkich zainteresowa-
nych w zespole. w Rational Quality Manager.
Wybieramy z panelu sterowania ikonę Requ-
Automatyza- Terminarze wykonania testów zapewniają możliwość optymalnego wykorzystania
irements i polecanie Create Requirement.
cja skracają- środowisk testowych;
ca czas pro- Zarządzanie laboratoriami testowymi pomaga użytkownikom śledzić zapotrzebo-
jektu wanie i maksymalizować wykorzystanie posiadanych zasobów zarówno tych do-
stępnych fizycznie, jak i tworzonych wirtualnie.
Metryki pro- Automatyczne zbieranie danych;
jektu ułatwia- Wizualizacja aktualnego statusu projektu dzięki personalnym widokom wskaźni-
jące podejmo- ków;
wanie decyzji Stała aktualizacja danych.
Rysunek 5. Tworzenie sekcji Summary

www.sdjournal.org 55
Testowanie oprogramowania

W oknie dialogowym, które się pokazuje, wpi- wybranego przypadku testowego. Na koniec tego cisk OK tworzy skrypt, następnie naciskamy Save i
sujemy tytuł (pole summary) i możemy określić in- artykułu stworzymy i uruchomimy test. klikamy nazwę skryptu, co otwiera nową kartę, w
ne parametry (tylko waga jest obowiązkowa, ale której możemy wprowadzić kroki skryptu.
ma wartość domyślną, więc też możemy pozosta- Tworzenie i wykonywanie Każdy tworzony krok testu jest domyślnie ak-
wić bez zmiany). Obowiązkowe jest naciśnięcie przypadków testowych cją do wykonania. W liście wyboru po lewej stro-
Save aby wysłać dane do bazy. Przykładowo wypeł- Kluczowym elementem przypadku testowego nie opisu kroku można zmienić rodzaj z akcji na
nione wymaganie jest pokazane na Rysunku 6. jest opis testu. Znajduje się on w sekcji skryptów punkt weryfikacji bądź punkt raportowania.
Kolejne dane wprowadzamy do opisu przypad- (Test Scripts). Sekcja pozwala na stworzenie listy Opisując kroki testu można tekst formatować
ku testowego. Wybieramy sekcję przypadków te- skryptów związanych z przypadkiem testowym. zgodnie z formatem RFT, dodawać obrazy i listy
stowych (Table of Contents->Test Cases) i z panelu Skrypty mogą być wpisane do ręcznego wyko- danych do wykorzystania w trakcie danego kroku.
nad tabelą operację Add New Test Case nania w Rational Quality Manager albo też po- Przycisk Save kończy edycję i nasz skrypt jest
Przy użyciu domyślnego szablonu (Default Test wiązane z narzędziami automatyzujące pracę ta- gotowy do wykonania.
Case Template) wszystkie pola poza nazwą i wagą kimi jak:
są opcjonalne. Ich wypełnienie pozwala łatwo wy- Wykonanie skryptu
szukiwać potrzebne elementy i zestawy elemen- • IBM® Rational® Functional Tester, W prawym górnym rogu przypadku testowe-
tów. Warto jest zwrócić uwagę na pole waga (We- • IBM® Rational® Manual Tester, go, niezależnie od wybranej sekcji, jest przycisk
ight). Teoretycznie wszystkie przypadki testowe są • IBM® Rational® Performance Tester, uruchomienia skryptu Run Test Case. Po wybra-
równie ważne, ale jak wiadomo, niektóre są waż- • IBM® Rational® Service Tester for SOA niu wypełniamy metrykę testu (kto, kiedy, jaki
niejsze. Dobra skala oceny pozwala w krytycznych Quality, skrypt, jakie środowisko itp.), i otwiera się okno
sytuacjach wybrać kluczowo ważne. Zatwierdze- • IBM® Rational® Appscan i innymi. wykonania takie jak na Rysunku 11.
nie danych przyciskiem OK tworzy szablon i wra- Następnie wykonujemy pokazane kroki te-
camy do listy przypadków testowych, podobnej do Interfejs komunikacji jest w pełni udokumento- stu raportując kolejno ich wykonanie oraz spraw-
tej z Rysunku 8. wany, więc w razie potrzeby można zbudować po- dzając punkty testowe i określając wynik. Przej-
Kliknięcie na elemencie listy przypadków te- łączenie do innych rozwiązań wspierających pracę ście przez ostatni punkt bądź wybranie negatyw-
stowych otworzy nową kartę z szablonem możli- testera. W ramach tego artykułu stworzymy naj- nego zakończenia testu (Fail) powoduje wyświe-
wych do wprowadzenia danych. W odpowiednich prostszy kilkukrokowy skrypt do testów ręcznych. tlenie statusu realizacji takie jak na Rysunku 12.
sekcjach możemy utworzyć link do wymagań in- Wybieramy sekcję Test Scripts i ikonę dodaj no- Na tym ekranie mamy do dyspozycji przycisk Sa-
nych przypadków testowych czy dołączyć dowol- wy skrypt (Add New Test Script). Podajemy nazwę ve – zapisanie wyników testu lub też zgłoszenie
ne dokumenty, które powinny być związane z tym skryptu i wypełniamy inne opcjonalne pola (pole
przypadkiem testowym. Wszystkie te informacje Type nie może być zmienione, jeśli nie są zainstalo-
pomogą nam określić,jak wykonać test na rzecz wane interfejsy do narzędzi automatyzacji). Przy-

Rysunek 7. Opisany przypadek testowy

Rysunek 8. Lista przypadków testowych

Rysunek 9. New Test Script dialog

Rysunek 6. Wypełnione wymaganie Rysunek 10. Kroki skryptu

56 03/2009
Jakość czy jakoś to będzie?

błędu. Nie da się ukryć, że tester czuje się usats-


fakcjonowany, jeśli błąd znajduje, co w jakimś stop-
niu może opóźnić dostarczenie produktu, ale ta-
ka jest natura ludzka. Następny krok staje się więc
bardzo ważny – zakomunikowanie faktu, że apli-
kacja nie jest taka dobra jak się wydawało do tej po-
ry w zespole. Nie darmo powstały określenie kryty-
ka i krytyka konstruktywna. Ta druga forma wska-
zania błędów zakłada, że nie tylko podamy infor-
mację, że jest źle, ale również podpowiemy, co trze-
ba zrobić/osiągnąć, aby stan uległ poprawie. Dzię-
ki Rational Quality Manager wraz z werdyktem te-
stu przesyłane są w czasie rzeczywistym wszystkie
inne dostępne informacje:

• skrypt testu pokazujący kroki, jakie zostały


wykonane;
• dane testowe, które doprowadziły do błędu;
• czas wykonania;
• opis konfiguracji serwera i klienta;
• wymagania, które zostały niespełnione.

Mając takie informacje znacznie łatwiej jest


znaleźć i usunąć przyczynę błędu niż tylko na
podstawie informacji, że jest źle.
Zebrane w jednym centralnym serwerze
wszystkie informacje o testach znacznie ułatwia-
Rysunek 11. Wykonanie testu ją wielokrotne wykorzystanie tych samych skryp-
tów, danych, czy osób, co zapewnia krótszy czas i
większą precyzję pracy.
Przy tym dzięki temu, że Rational Quality Ma-
nager jest zbudowany w Javie przy użyciu techno-
logii Web 2.0, dotarcie i wykorzystanie informacji
nie jest trudniejsze niż użycie przeglądarki WWW.
Rational Quality Manager jest środowiskiem
zarówno dla testerów, jak i dla osób podejmują-
cych decyzje projektowe. Wszystkie dane, jakie
wprowadziliśmy w trakcie tworzenia i wykonania
testu, mogą posłużyć powzięciu właściwej decyzji
czy to o skierowaniu produktu do rzeczywistego
działania, czy o dalszych pracach rozwojowych.
Ekran główny (Home) pokazuje (być może
trzeba nacisnąć przycisk Refresh) wyniki wła-
śnie wykonanych testów, w formie graficznej
czy tekstowej. Podejmowanie trafnych decyzji na
podstawie twardych danych staje się znacznie ła-
twiejsze. Wygląd ekranu głównego i dostępne ra-
porty mogą być dowolnie zmieniane i rozszerza-
ne o potrzebne organizacji wskaźniki, zestawie-
nia czy inne formy raportu. Przykładowy raport
można zobaczyć na Rysunku 13.
Rysunek 12. Podsumowanie wykonania skryptu Zapraszam na stronę ibm.com/developerworks/
rational, gdzie w sekcji Rational Quality Manager
znajdziesz artykuły na temat tworzenia własnych
raportów, wskaźników, integracji z narzędziami
automatyzacji. Artykuły są publikowane zarówno
w formie tekstów, jak i filmów. Można dołączyć się
do forum użytkowników wymieniających infor-
macje na temat Rational Quality Manager i innych
produktów rodziny Rational poświęconych jako-
ści oprogramowania.

ZBIGNIEW ZARZYCKI
Rysunek 13. Przykładowy wykres automatycznie generowany przez Rational Quality Manager IBM Rational Technical Consultant

www.sdjournal.org 57
Testowanie oprogramowania

WebAii
Testowanie aplikacji ASP .NET

Przyszłość należy do serwisów internetowych – tego typu sformułowanie


słyszałem już niejednokrotnie i być może jakiś gram prawdy w nim jest.
Ogólnodostępność, interaktywność czy też współdzielenie zasobów są
argumentami umacniającymi mnie w przekonaniu, iż to właśnie aplikacje
webowe będą najbardziej kojarzone z inżynierią oprogramowania za parę lat.

miejscu chciałbym się zatrzymać nad meto-


Dowiesz się: Powinieneś wiedzieć: dą MyTestInitialize . W niniejszym przy-
• Czym jest WebAii i jaka jest jego rola w proce- • Czym są testy jednostkowe; kładzie wykorzystywane są ustawienia do-
sie testowania stron ASP .NET; • Posiadać podstawową wiedzę z zakresu biblio- myślne – czyli weryfikacja poprawności oce-
• Jak krok po kroku stworzyć szablon testów. teki NUnit. niania będzie w środowisku Internet Explo-
rer. Aby zmienić przeglądarkę na Firefox, wy-
starczy jako parametr wywołania metody
stów. Istnieje możliwość uruchomienia pro- LaunchNewBrowser podać typ przeglądarki,
gramu testowego na dwa sposoby: w środo- zgodnie z Listingiem 1.
Poziom trudności wisku NUnit bądź we własnej aplikacji typu
standalone (błędy wykonania można rapor- Pierwszy test
tować w pliku zewnętrznym, obsługiwanym Załóżmy, iż przedmiotem naszej weryfikacji
przez obiekt Log). Swoje rozważania chciał- będzie prosta strona ASP.NET, która zawiera

J
ak twierdzi Stephen H. Kan: jakość opro- bym skupić na pierwszym sposobie. formularz logowania użytkownika do systemu
gramowania przestała być zaletą syste- Po dodaniu referencji do bibliotek zewnętrz- (Rysunek 1.).
mów informatycznych. Stała się warun- nych, możemy rozpocząć pracę z implementa- W pierwszym teście będziemy chcieli
kiem koniecznym dla firm poważnie myślą- cją pierwszego testu. Na początku zdefiniujmy sprawdzić, czy wszystkie elementy, które zo-
cych o zakończeniu projektów sukcesem. Dla- nową klasę. W tym celu w Visual Studio z me- stały określone w specyfikacji, znajdują się na
tego wychodząc naprzeciw tym problemom, nu Project>Add New Item wybieramy WebAii- podstawowym widoku. Znając ich numery ID
chciałbym zaprezentować czytelnikowi arty- NUnitTest (Shared Manager). W tym momen- metodę testującą można zakodować w nastę-
kuł na temat technik testowania systemów cie utworzyliśmy gotowy szablon składający się pujący sposób (Listing 2.).
webowych opartych na silniku ASP.NET z następujących standardowych metod: Ponadto framework WebAii pozwala na wy-
oraz frameworku WebAii. szukiwanie elementów na stronie po dowol-
• TestClassInitialize – utworzenie in- nym parametrze, według którego będzie w sta-
WebAii – wprowadzenie stancji obiektu Manager, wykorzystywa- nie odróżnić kontrolki. Wśród nich do bardziej
WebAii jest darmowym zestawem biblio- nego podczas testów. Jeżeli nie istnieje użytecznych można zaliczyć:
tek wspierającym tworzenie testów auto- obiekt konfiguracyjny (Settings) bądź zo-
matycznych, uruchamianych dla podstawo- stał zniszczony, tworzona jest jego nowa • Find.ByName – wyszukiwanie po nazwie
wych przeglądarek internetowych (Micro- instancja. Wszystkie pola ustawiane są na pontrolki.
soft Internet Explorer, Mozilla Firefox). Ni- wartości domyślne. • Find.ByContent /Find.AllByContent –
niejszy framework dostarcza rozbudowa- • MyTestInitialize – określenie wartości wyszukiwanie kontrolki/zbioru kontrolek
nego zestawu narzędzi do tworzenia aser- początkowych, wykonywanych przed każ- wg zawartości np.
cji dla stron WWW związanych ze spraw- dym testem. • Manager.ActiveBrowser.Find.ByCon
dzaniem dostępności i widoczności kontro- • TestClassTearDown (CleanUp) – tzw. me- tent("<div id=RegionId>"); Opcja
lek HTML/ASP.NET, śledzenia renderin- toda sprzątająca, kończy pracę obiektu ta akceptuje również wyrażenia regu-
gu elementów strony, wsparciem dla testów Manager oraz zamyka uruchomioną przy larne.
struktury DOM oraz JavaScript czy też wido- starcie przeglądarkę interetową. • Find.ByAttributes /Find.AllByAttributes
ków zależnych od kaskadowego arkusza sty- – jako parametr wywołania metoda przyj-
lów (CSS). Sercem środowiska WebAii jest W dalszych krokach jedyne co musimy zro- muje tablicę znaków interpretowaną jako pa-
obiekt Manager, który odpowiedzialny jest bić to zakodować poszczególne metody, któ- rę [name, value], np. Manager.ActiveBrow
m.in. za uruchomienie przeglądarki, połącze- re będą odpowiedzialne za weryfikację po- ser.Find.ByAttributes(new string[] {
nie z klientem oraz sterowanie procesem te- prawności naszej aplikacji webowej. W tym "class", "TextArea _ Class" });.

58 03/2009
WebAii –Testowanie aplikacji ASP .NET

• Find.ByXPath/Find.AllByXPath – zwraca W następnym kroku odnajdujemy i klikamy sząc się chociażby do naszej przykładowej apli-
kontrolkę/zbiór kontrolek dopasowanych do przycisk Log In: kacji, jednym ze sposobów przenoszenia nazwy
wyrażenia XPath, np. pobranie wszystkich ele- użytkownika pomiędzy stronami, jest umiesz-
mentów div ze strony: HtmlInputSubmit button = Manager.ActiveBro czenie wartości login właśnie w takim pliku.
IList<Element> allDivs = wser.Find.ById<HtmlIn WebAii dostarcza pełnego wsparcia w dziedzi-
Find.AllByXPath("/descendant:: putSubmit>("Button"); nie obsługi plików cookie. Dostęp do niego od-
node()[starts-with(@id,'div')]");. button.Click(); bywa się poprzez obiekt CookieManager. Do
podstawowych funkcji malipulacji na obiekcie
Drugi test – ustawianie wartości Na koniec sprawdzamy, czy zostaliśmy prze- tego typu można zaliczyć:
dla poszczególnych kontrolek kierowani do prawidłowej strony z wymaga-
W kolejnym etapie testowania naszego for- nymi elementami: • DeleteCookie – usunięcie wszystkich
mularza spróbujemy sprawdzić zachowa- ciasteczek – opcja szczególnie przydatna,
nie systemu podczas autoryzacji użytkowni- string url = Manager.ActiveBrowser.Url; gdy podczas testowania aplikacji w środo-
ka. Załóżmy, iż w przypadku udanej próby HtmlSpan label = wisku produkcyjnym chcemy się uchro-
klient zostanie przekierowany do strony http: Manager.ActiveBrowser.Find.ById<HtmlSpan nić przed cache'owaniem niektórych war-
//localhost/WebAiiTest/StartPage.aspx, na któ- >("Hello_Label_id"); tości.
rej będzie znajdowała się tylko jedna etykieta string labelValue = label.InnerText; • GetCookies – pobranie zbioru plików Co-
z wartością Hello [login użytkownika]. Na okie spod podanego adresu URL.
początek spróbujmy wypełnić wartości login Pełny zapis metody prezentuje Listing 3. • SetCookie – utworzenie nowego cia-
i hasło poprawnymi danymi: steczka.
Pliki cookie
loginTxt.Text = "admin"; Programowanie WWW nierozerwalnie wiąże Wywoływanie funkcji JavaScript
passwdTxt.Text = "admin"; się z obsługą plików cookie (ciasteczek). Odno- W ostatnim etapie testowania naszego przy-
kładowego formularza odniesiemy się do
Listing 1. Ustawienie domyślnej przeglądarki na Mozilla Firefox procesu integracji strony ze skryptami Ja-
vaScript. Za pomocą metody InvokeScript
[SetUp] możemy wywołać dowolną funkcję JS, prze-
public void MyTestInitialize() kazując jej nazwę jako parametr. Załóżmy, iż
{ formularz nie zostanie wysłany do serwera,
if (Manager.Browsers.Count == 0) dopóki użytkownik nie wprowadzi wartości
{ w pola wymagane (w naszym przypadku logi-
Manager.LaunchNewBrowser(BrowserType.FireFox); nu oraz hasła). Błąd zostanie zasygnalizowa-
} ny w formie etykiety zawierającej napis kolo-
} ru czerwonego Fill all required fields.

Listing 2. Metoda testująca dostępność elementów wymaganych na formularzu


[Test]
public void ControlVisibility()
{
// Nawigacja do strony podlegającej weryfikacji
Manager.ActiveBrowser.NavigateTo(
"http://localhost/WebAiiTest/Default.aspx");

// Element ogólny
Rysunek 1. Przykładowy formularz logowania
Element loginLabel = Manager.ActiveBrowser.Find.ById("Login_Label");
Element passwordLabel = Manager.ActiveBrowser.Find.ById("Password_Label");

// Korzystając już z konkretnego typu Html Input


HtmlInputText loginTxt = Manager.ActiveBrowser.Find.ById<HtmlInputText>("Logi
n_TextBox");

HtmlInputPassword passwdTxt = Manager.ActiveBrowser.Find.ById<HtmlInputPassword>("


Passwd_TextBox"); Rysunek 2. Widok po poprawnej autoryzacji

HtmlInputSubmit button = Manager.ActiveBrowser.Find.ById<HtmlInputSubmit>("Button


");

Assert.IsNotNull(loginLabel);
Assert.IsNotNull(passwordLabel);
Assert.IsNotNull(loginTxt);
Assert.IsNotNull(passwdTxt);
Assert.IsNotNull(button);
}
Rysunek 3. Walidacja z wykorzystaniem
JavaScript

www.sdjournal.org 59
Testowanie oprogramowania

Proces walidacji przeprowadzimy w następu- Listing 4. prezentuje propozycję przeprowadze- • oznaczanie fragmentów stałych zmian w
jących krokach: nia testów integracji JavaScript z naszą aplikacją. kodzie podlegających szczególnej analizie,
• luźne połączenie testów z kodem produktu
• Przed kliknięciem: etykieta validate po- Test Regions • w przypadku pracy z praktyką Test Dri-
siada styl display:none – nie jest widocz- Strona www zazwyczaj składa się z wielu czę- ven Development – ostrzeganie programi-
na na stronie. Deklaracja: ści np. nagłówka, stopki, wydzielonych bloków, stów o potencjalnym złamaniu zasad auto-
• <span id="validate" style= paska nawigacyjnego itp. Framework WebAii matyzacji testów.
"display:none">Fill all required umożliwia grupowanie elementów wchodzą-
fields</span> cych w skład danego segmentu strony i prze- WebAii oferuje pełną elastyczność w przy-
• Po kliknięciu przycisku Log In, etykieta prowadzenia procesu weryfikacji poprawności padku tworzenia oznaczeń dla regionów.
validate zmieni kolor na czerwony oraz dla jej fragmentu. Korzyści płynące z tego za- Można zapisać je za pomocą dowolnego ję-
styl na display:inline . biegu to m.in.: zyka znaczników (html, xml, xhtm) za-
• Deklaracja: <span id="validate" wierającym tag testregion oraz numer id
style="display:inline">Fill all • zmniejszenie kosztów i złożoności testów po- (np. dla widoku ASP .NET: <testregion
required fields</span> przez ich ukierunkowanie na dany obszar, id=”regionid”> region content </
testregion>). W kodzie metody testującej
Listing 3. Testowanie procesu uwierzytelniania użytkownika odwołanie do wyznaczonego fragmentu uzy-
skujemy za pomocą metody Region obiek-
[Test] tu ActiveBrowser (np. TestRegion reg =
public void ValidFormLogIn() Manager.ActiveBrowser.Regions[„region
{ id”];)
HtmlInputText loginTxt = Manager.ActiveBrowser.Find.ById<HtmlInputText>(
"Login_TextBox"); Podsumowanie
Prezentowane w artykule techniki testo-
HtmlInputPassword passwdTxt = Manager.ActiveBrowser.Find.ById<HtmlInputPassword>( wania dynamicznych stron WWW są jedy-
"Password_TextBox"); nie kroplą w morzu możliwości framewor-
ka WebAii. Pozostałe rozszerzenia odno-
loginTxt.Text = "admin"; szą się również do testowania m.in. aplika-
passwdTxt.Text = "admin"; cji Microsoft Silverlight, Ajax, ASP.NET lo-
cal server, .NET Page DOM czy też popu-
HtmlInputSubmit button = Manager.ActiveBrowser.Find.ById<HtmlInputSubmit>("But larnego w systemach WEB 2.0 wsparcia dla
ton"); dynamicznych elementów typu Drag And
Drop. Testowanie części FrontEndowej stro-
button.Click(); ny jest dość problematyczne, natomiast za-
równo rynek komercyjny, jak i opensource-
string url = Manager.ActiveBrowser.Url; 'owy nadal pozostaje ubogi w kwestii dobo-
ru narzędzi tworzenia testów automatycz-
HtmlSpan label = nych dla witryn internetowych. Dlatego,
Manager.ActiveBrowser.Find.ById<HtmlSpan>("Hello_Label_id"); wg mnie, warto zapoznać się z framewor-
kiem WebAii.
string labelValue = label.InnerText;

Assert.AreEqual(url, “http://localhost/WebAiiTest/StartPage.aspx/”);
Bibliografia
Assert.IsNotNull(label); • Stephen H. Kan, Metryki i modele w inży-
Assert.AreEqual(labelValue, "Hello admin"); nierii jakości oprogramowania, Wydaw-
} nictwo Naukowe PWN, 2006
• J. Newkirk, Test Driven Development In
Listing 4. Testowanie elementów zależnych od CSS i JavaScript .NET, Microsoft Professional 2004
• A. Hunt, D. Thomas, Pragmatic Unit te-
[Test] sting in C# with NUnit, O’Reilly 2007
public void RequiredFields() • Dokumentacja techniczna framewor-
{ ka WebAii dostępna pod adresem: http:
Manager.ActiveBrowser.NavigateTo( //www.artoftest.com/Resources/WebAii/
"http://localhost:1293/WebAiiAsp/Default.aspx");
Documentation/topicsindex.aspx

HtmlSpan span = Manager.ActiveBrowser.Find.ById<HtmlSpan>("validate");


Assert.AreEqual("none", span.Styles[0]);
PAWEŁ WILKOSZ
// Wywołanie metody JavaScript CheckForm() Pracuje na stanowisku Software Quality Engineer w
Manager.ActiveBrowser.Actions.InvokeScript("CheckForm(this)"); firmie Making Waves Polska. Ma również doświad-
czenie w tworzeniu aplikacji .NET oraz SQL Server.
Assert.AreEqual(Color.Red, span.GetComputedStyle("color").ToColor()); Jest aktywnym członkiem Polish SQL Server User
Assert.AreEqual("inline", span.Styles[0]); Group w Krakowie. Prywatnie pasjonat muzyki al-
} ternatywnej z lat ’60 – ’90 oraz squasha.
Kontakt z autorem: pawel.wilkosz@gmail.com

60 03/2009
Soware Development GigaCon
– budowanie aplikacji biznesowych
23 - 24 marca 2009
Warszawa, Hotel Novotel Airport

Tematyka konferencji:
WST
ĘP B
Blok zarządzanie projektami: EZP
Ł A TNY
- zarządzanie portfelem projektów
- zarządzanie wymaganiami
- zarządzanie zmianą
- outsourcing projektów IT
- nowoczesne metodyki projektowania systemów informatycznych
- metodyki „lekkie” (agile, xp) w konstrukcji systemów informatycznych
- problematyka analizy wymagań w projektach wdrożeniowych

Blok technologiczny:
- cloud computing – NOWOŚĆ!
- bazy danych
- Java
- zarządzanie treścią w internecie (narzędzia do tworzenia aplikacji web,
oprogramowania portalowe)
- RIA - rich internet application
- środowiska programistyczne -- pakiety Case i Rad
- rozwiązania oparte na technologiach XML i Web Services
- platformy integracyjne
- budowanie aplikacji mobilnych
- budowanie aplikacji BPM
- budowanie aplikacji SOA
- narzędzia do testowania oprogramowania
- narzędzia wspomagające prowadzenie projektów programistycznych

Blok jakości i testowania


- jakość systemów informatycznych.
- planowanie jakości
- zapewnianie jakości
- kontrola jakości
- normy i standardy dotyczące jakości oprogramowania
- jakość w różnych fazach procesu budowy oprogramowania: jakość
w wymaganiach, analizie, projektowaniu itp.
- konstrukcja i testowanie oprogramowania

Więcej informacji:
http://sdevelopment.gigacon.org

Kontakt:
Marta Paprowicz Główny sponsor konferencji:
Specjalista ds.organizacji konferencji i szkoleń
mail: marta.paprowicz@software.com.pl
tel: +48 22/ 427 36 75
Technologie internetowe

Zintegruj się
z Internet Explorer 8
Czyli jak stworzyć Akcelerator, Web Slice i Search Provider

Już niedługo premiera kolejnej wersji przeglądarki firmy Microsoft, która


otworzy przed programistami zupełnie nowe możliwości tworzenia rozszerzeń.
W niniejszym artykule przedstawione zostały podstawy programowania
tzw. akceleratorów, web slice’ów oraz search provider’ów, które pozwalają
zintegrować nasze strony z przeglądarką Internet Explorer 8.
nika do wyszukiwarki. Na przykładzie z Listin-
Dowiesz się: Powinieneś wiedzieć: gu 1., po wysłaniu słowa test do tak zdefiniowa-
• Jakie nowe możliwości rozszerzeń będą do- • Znajomość podstawowych pojęć z zakresu nej wyszukiwarki użytkownik trafi na stronę
stępne w Internet Explorer 8; HTML, CSS, RSS, Javascript; http://example.com/?query=test.
• Jak zintegrować Twoją stronę z przeglądarką; • Podstawowe informacje na temat protokołu Nieco więcej pracy wymagać będzie od nas
• Jak stworzyć search provider, akcelerator i web HTTP. dodanie do wyszukiwarki funkcjonalności pod-
slice. powiedzi dla wprowadzanych słów kluczowych.
Aby były one wspierane, musimy stworzyć stro-
nie zapytania do wybranej wyszukiwarki inter- nę (np. http://suggestions.example.com/?q=slowo_
netowej. W dolnej części okna rozwijającego się kluczowe), która będzie wysyłała odpowiednio
Poziom trudności po wpisaniu słów kluczowych możemy wybrać sformatowane odpowiedzi w formacie XML lub
silnik, który ma zostać w danym momencie wy- JSON (Javascript Object Notation). Będą one w
korzystany. Praktycznie każda strona z zaimple- rzeczywistości interpretowanymi przez przeglą-
mentowanymi mechanizmami wyszukiwania darkę podpowiedziami do przekazanego w para-

W
raz z rosnącą popularnością Inter- może zintegrować się w ten sposób z przeglą- metrze slowo_kluczowe zapytania. W zależno-
netu rosną również oczekiwania darką. Na rynku dostępne są już wyszukiwarki ści od tego czy serwer zwraca odpowiedzi w for-
użytkowników w stosunku do moż- integrujące się np. z Wikipedią, serwisem Ama- macie JSON, czy XML, do sekcji OpenSearch-
liwości oferowanych przez przeglądarki interne- zon czy wyszukiwarkami Windows Live oraz Description musimy dodać jedną z dwóch lini-
towe. Internet Explorer 8 (w chwili pisania arty- Google. W Polsce warto zwrócić uwagę m.in. na jek prezentowanych na Listingu 2.
kułu wchodzący w fazę RC1) będzie oferował rozwiązanie stworzone przez serwis GoldenLi- Przykład podpowiedzi w formacie JSON, ja-
3 nowe typy rozszerzeń: zintegrowaną wyszu- ne (patrz Rysunek 1.) z uwagi na fakt, iż wyko- ką mógłby zwracać serwer po wpisaniu przez
kiwarkę (o bogatszych możliwościach niż w In- rzystuje ono najnowsze mechanizmy zintegro- użytkownika zapytania XBOX, prezentuje Li-
ternet Explorer 7), tzw. Akceleratory (przyspie- wanej wyszukiwarki – automatycznie pojawia- sting 3.
szające odnajdowanie informacji w sieci) oraz jące się sugestie ze zdjęciami i opisami. Jak widzieliśmy na Rysunku 1., podpowie-
Web Slice’y (do monitorowania często zmienia- Od strony technicznej każdy search provider dzi mogą również zawierać obrazy oraz opisy.
jących się treści stron). Wszystkie mechanizmy reprezentowany jest przez niewielki plik XML Listing 4. prezentuje przykładową odpowiedź
bazują na standardach XML oraz HTML – mo- będący zgodny z tzw. specyfikacją OpenSearch. serwera w formacie XML, która spowoduje wy-
żemy odetchnąć z ulgą, tym razem zintegrowa- Została ona zaprojektowana przez firmy Ama- świetlenie tych elementów.
nie strony z przeglądarką Microsoftu będzie na- zon.com oraz A9 i wprowadzona na rynek w Opisy zamieszczamy w elementach
prawdę prostym zadaniem. A kiedy już coś zro- roku 2005. Obecnie OpenSearch wykorzystu- Description, adresy obrazów w sekcjach
bimy, warto się tym podzielić z innymi użytkow- ją zarówno Firefox 2+, jak i Internet Explorer Image. Podpowiedzi mogą być również od-
nikami – każdy może zgłosić swoje rozszerzenie 7+. Najprostszy provider zgodny z tą specyfika- dzielone od siebie separatorami definiowany-
do publicznej galerii polskich dodatków do IE 8 cją prezentuje Listing 1. mi przez elementy Separator. Na podstawie
(http://ieaddons.com/pl/). Wystarczy w znaczniku ShortName okre- otrzymanej od serwera odpowiedzi z Listin-
ślić nazwę wyszukiwarki, w znaczniku Image gu 4., przeglądarka wyświetliłaby jeden sepa-
Zintegrowana wyszukiwarka adres reprezentującej ją ikony oraz w elemen- rator o nazwie My Visual Suggestions na samej
Zarówno przeglądarka Internet Explorer od cie Url szablon adresu, pod który przeglądarka górze okna.
wersji 7, jak i Firefox od wersji 2 w prawym gór- ma wysyłać zapytania. Najistotniejszy w sekcji Po stworzeniu pliku XML definiującego wy-
nym rogu udostępniają niewielkie pole tekstowe Url jest parametr {searchTerms} – reprezentu- szukiwarkę nie pozostaje nam nic innego, jak
umożliwiające użytkownikom szybkie przesła- je on słowo kluczowe wpisane przez użytkow- dodanie mechanizmów umożliwiających zain-

62 03/2009
Zintegruj się z Internet Explorer 8

stalowanie jej przez użytkowników portalu. Ma- które spowodują automatyczne wykrycie wy- re robimy w Internecie – wyeliminować ko-
my tu do dyspozycji dwie możliwości. Pierwszą szukiwarki. Po wejściu na stronę zawierającą nieczność nieustannego kopiowania i wkle-
z nich jest zamieszczenie na stronie specjalnego takie znaczniki, Internet Explorer 8 wyświe- jania, ręcznego przenoszenia interesujących
linku, który odpowiednim wywołaniem funkcji tli żółtą strzałkę obok pola wyszukiwarki. nas słów kluczowych ze strony do strony. Są
JavaScript spowoduje zainstalowanie wyszuki- Umożliwi ona instalację search provider’a. To one dodatkowymi opcjami pojawiającymi się
warki. Przykładem może być link: wszystko, co musieliśmy zrobić, aby użytkow- w menu kontekstowym po zaznaczeniu tek-
nicy mogli cieszyć się zintegrowanym z prze- stu i kliknięciu go prawym przyciskiem my-
<a href="#" glądarką mechanizmem wyszukiwania treści szy (lub wybraniu specjalnej ikony akcelera-
onclick="window.external.AddSearch na naszym portalu. tora). Przykładowymi akceleratorami mo-
Provider('http: gą być np.: wyślij zaznaczony tekst mailem,
//www.example.com/ Tworzenie akceleratorów znajdź zaznaczony tekst, przetłumacz wybra-
provider.xml')"> Czy nie zdarzyło Ci się nigdy kopiowanie ny tekst, znajdź zaznaczone słowo kluczowe w
Add Search Provider Example</a> adresu pocztowego do portalu nawigacyjne- portal.pl, itp. Interesującym przykładem mo-
go? A ile razy znajdowałeś na stronie inte- że być korzystający z serwisu Live Maps ak-
który zainstaluje wyszukiwarkę zdefiniowaną resujący zwrot, który kopiowałeś do schow- celerator, prezentujący mapę zaznaczonego
w pliku provider.xml. Drugim sposobem jest ka, by wkleić go za chwilę w oknie wyszu- adresu pocztowego – bez konieczności ręcz-
dodanie do strony specjalnych nagłówków np.: kiwarki internetowej? Akceleratory mają nego wklejania go na stronach portalu (Ry-
na celu przyspieszyć niektóre operacje, któ- sunek 2.).
<link title="My Provider" rel="search"
type="application/opensearchdescription
+xml"
href="http://www.example.com/
provider.xml">

Rysunek 1. Zintegrowana wyszukiwarka


udostępniana przez serwis GoldenLine Rysunek 2. Przykładowy akcelerator – mapa z Live Maps

Listing 1. Najprostszy Search Provider


<?xml version="1.0" encoding="UTF-8"?>;
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">;
<ShortName>My Custom Search</ShortName>;
<Url type="text/html" template="http://example.com/?query={searchTerms}&amp;source=IE"/>;
<Image height="16" width="16" type="image/icon">http://example.com/mycustom.ico</Image>;
</OpenSearchDescription>

Listing 2. Definiowanie adresu zwracającego podpowiedzi


<Url type="application/x-suggestions+json"; template="http://suggestions.example.com/?query={searchTerms}"/>;

<Url type="application/x-suggestions+xml"; template="http://suggestions.example.com/?query={searchTerms}"/>

Listing 3. Przykładowa odpowiedź serwera w formacie JSON


["xbox",;
["Xbox 360", "Xbox cheats", "Xbox 360 games"]]

www.sdjournal.org 63
Technologie internetowe

Jak widać, akcelerator po podświetleniu • homePageUrl – określa domenę, w ramach definiowanych: Add , Blog, Define , Map,
myszką potrafi wyświetlić niewielkie okno której ma działać akcelerator; Translate lub stworzyć własną;
podglądu – możemy w nim znaleźć np. wyni- • display – definiuje wygląd akceleratora • Typ treści, dla której działa (context) –
ki wyszukiwania, tłumaczenie zaznaczonego (nazwa, ikona); może być to cała strona (jeśli wywołujemy
zwrotu, definicję z wikipedii, itp. • activity – określa funkcjonalności. akcelerator z menu Page), zaznaczenie (se-
Z technicznego punktu widzenia akcelerator lection) lub hiperłącze;
jest po prostu plikiem XML (tzw. OpenService Dodatkowymi parametrami, które możemy • Szablon adresu strony, do której przekazy-
Description Format), podobnie jak search provi- zdefiniować są: wane są dane kontekstu (execute);
der. Do zrobienia najprostszych akceleratorów • Informacja o kodowaniu znaków.
(tzw. Codeless Accelerators) wystarczy dosłownie • Kategoria (category) – kategoria, w któ-
kilka linijek kodu (patrz Listing 5.). Najważniej- rej akcelerator wyświetlać się będzie Listing 5. prezentuje niektóre z tych parame-
szymi elementami formatu OpenService są: użytkownikowi. Można skorzystać z pre- trów w praktyce. Jednym z bardziej istotnych
elementów akceleratora jest sekcja execute .
Określa ona szablon strony, do której zosta-
Listing 4. Przykładowa odpowiedź serwera w formacie XML niemy przekierowani po kliknięciu opcji re-
<?xml version=”1.0”?>; prezentującej dany akcelerator. Może on za-
<SearchSuggestion>; wierać określone zmienne – np. na przykła-
<Query>xbox</Query>; dzie z Listingu 5. wykorzystujemy parametr
<Section>; {selection}, który definiuje zaznaczony
<Separator title="My Visual Suggestions" />; przez użytkownika tekst.
<Item>; Tabela 1. prezentuje inne parametry, które
<Text>Xbox 360 Game Consoles</Text>; możemy wykorzystać w naszych szablonach
<Description>Game console systems and packages at a great deal.</Description>; adresów.
<Image source="http://www.example.com/xboxconsole.jpg" alt="Xbox 360 Consoles" Parametr możemy również oznaczyć ja-
width="75"; height="75"/>; ko opcjonalny, poprzez dodanie znaku za-
<Url>http://www.example.com/</Url>; pytania po identyfikatorze zmiennej (np.
</Item>; {documentUrl?}). W odróżnieniu od zaprezen-
<Item>; towanego na Listingu 5. przekazywania para-
<Text>Xbox 360 Wireless Controller</Text>; metrów metodą GET, można je również prze-
<Image source="http://www.example.com/xboxcontroller.jpg" alt="Xbox 360 Wireless kazywać metodą POST. Listing 6. prezentuje
Controller" width="75" height="75"/>; przykład tego drugiego podejścia.
</Item>; Omawiane dotychczas akceleratory nie ofe-
<Item>; rowały jednak bardzo wygodnej funkcjonalno-
<Text>Xbox 360 Live Games</Text>; ści, jaką jest podgląd wyników (wyświetlany po
<Image source="http://www.example.com/live.jpg" alt="Xbox 360 Live Games" podświetleniu akceleratora). W praktyce jest to
width="75"; height="75"/>; najzwyklejsza strona HTML, osadzona w nie-
<Url>http://www.example.com/games.aspx?q="Xbox 360"</Url>; wielkim okienku podglądu. Musimy zatem ją
</Item>; stworzyć. Listing 7. prezentuje kod akcelerato-
</Section>; ra zaprojektowanego przez serwis Ebay. Dzięki
</SearchSuggestion> elementowi preview w sekcji activity, po pod-
świetleniu akceleratora myszką wyświetli on
Listing 5. Przykładowa implementacja prostego akceleratora podgląd (kod HTML zwracany ze strony http:
<?xml version="1.0" encoding="UTF-8"?>; //ie8.ebay.com/activities/preview/index.php). Pod-
<openServiceDescription; gląd może zawierać kod Javascript (ograniczo-
xmlns="http://www.microsoft.com/schemas/openservicedescription/1.0">; ny do domeny akceleratora) oraz kontrolki Ac-
<homepageUrl>http://www.portal.pl</homepageUrl>; tiveX – o ile zostały przez użytkownika zaak-
<display>; ceptowane dla danej domeny. Okno podglą-
<name>Wyszukaj w Portal.pl</name>; du ma stały rozmiar 320 x 240, wszystko po-
<icon>http://www.portal.pl/ikonka-act.ico</icon>; za nim jest ucinane. Nie zaleca się stosowania w
</display>; nich pasków przewijania.
<activity category="find">; Kiedy nasz akcelerator jest już goto-
<activityAction context="selection">; wy, wystarczy dodać do strony mecha-
<execute action="http://www.portal.pl/search.aspx?string={selection}" nizm umożliwiający użytkownikom za-
method="get"/>; instalowanie go. Podobnie jak w przypad-
</activityAction>; ku search provider’ów dokonujemy tego z
</activity>; poziomu kodu Javascript, np.: <button onc
</openServiceDescription> lick=”window.external.AddService(‘htt
p://maps.live.com/GetMap.xml’)”>Dodaj
Listing 6. Przekazywanie parametrów metodą POST przez akcelerator akcelerator</button>. Dodajmy, że moż-
<execute method=”post” action=”http://www.portal.pl/search.aspx“>; liwe jest również programowe sprawdzenie,
<parameter name=”selection” value=”{documentUrl}” />; czy dany akcelerator nie został wcześniej za-
<parameter name=”title” value=”{documentTitle}” />; instalowany – kod analogiczny do: window
</execute> .external.isServiceInstalled(http://
maps.live.com/GetMap.xml, „map”);.

64 03/2009
Zintegruj się z Internet Explorer 8

Na koniec warto wspomnieć, iż akcelerato- użytkownikom na monitorowanie jego zawar- • Atrybut id – dla tego samego elemetu, do
ry mogą również integrować się z aplikacjami tości poprzez Web Slice. którego przypisana jest klasa hslice. Musi
działającymi na komputerze poprzez COM Aby Web Slice był wykrywany na stronie, być unikalny w obrębie całej strony;
(tzw. Code-based Accelerators), ale nie są one musimy jej fragment oznakować specjalnymi • Klasa entry-title – określa tytuł Web
przedmiotem tego artykułu. znacznikami: Slice’u. Jeśli zostanie przypisana do kilku
elementów (np. div oraz span), tytuł po-
Web Slice’y • Klasa hslice . Przypisanie klasy hslice nie wstanie ze złączenia ich. Element można
Web Slice’y są budzącą wśród użytkowników wyklucza wykorzystania również innych ukryć stosując np. style=”visibility:
wiele entuzjazmu nową koncepcją, która po- klas CSS; hidden;”.
zwala zasubskrybować kawałek strony inter-
netowej i monitorować jej zawartość. Można Listing 7. Akcelerator oferujący podgląd aukcji Ebay
je porównać do wizualnych, HTML-owych in-
formacji RSS, do których dostęp mamy zawsze <?xml version="1.0" encoding="UTF-8" ?>;
w przeglądarce, pod paskiem adresu. Przykła- <openServiceDescription xmlns="http://www.microsoft.com/schemas/
dy zastosowań znajdziemy wszędzie tam, gdzie openservicedescription/1.0">
często szukamy aktualizacji – nowe wiadomo- <homepageUrl>http://ie8.ebay.com</homepageUrl>;
ści e-mail w internetowej skrzynce odbiorczej, <display>;
najnowsze informacje ze świata, aktualne kur- <name>Find with eBay Search</name>;
sy walut, zmiany statusów znajomych na por- <icon>http://ie8.ebay.com/resources/images/favicon.ico</icon>;
talu społecznościowym, itp. Rysunek 3. pre- </display>;
zentuje Web Slice do monitorowania skrzynki <activity category="Find"> <activityAction context="selection">;
odbiorczej dostępny dla użytkowników porta- <preview action="http://ie8.ebay.com/activities/preview/index.php?query={select
lu GoldenLine. ion}" />;
Aby sprawdzić czy mamy nowe wiadomo- <execute method="get" action="http://ie8.ebay.com/index.php?query={selection}"
ści, nie musimy za każdym razem wchodzić />;
na stronę – wystarczy rozwinąć Web Slice. Ten </activityAction>;
nowy mechanizm wspiera wszystkie popularne </activity>;
typy zabezpieczeń (w tym SSL, Cookies, Basic </openServiceDescription>
Authentication). Użytkownicy po zalogowaniu
do portalu i zaznaczeniu opcji zapamiętaj (zo- Listing 8. Najprostszy Web Slice
stawiającej ciasteczko z ticketem uwierzytel- <div class="hslice" id="1">;
niającym) będą mogli monitorować stan swo- <div class="entry-title">Slice Title</div>;
jej skrzynki z poziomu Web Slice’u – korzysta- <div class="entry-content">Content</div>;
ją one z tych samych, zapisanych już na dysku, </div>
ciasteczek.
Ogromną zaletą Web Slice’ów jest informo- Listing 9. Strona Basic.htm (dodawanie Web Slice’u)
wanie o wszelkich zmianach w monitorowanej <div class="hslice" id="auction">;
części portalu. Kiedy tylko zmieni się część za- <span class="entry-title">Web Slice Test</span>;
subskrybowanej przez nas zawartości, przeglą- <a rel="feedurl" href="update.htm#slice-test" style="display:none;"></a>;
darka poinformuje nas o tym wizualnie. Nie </div>
bez znaczenia są tu skojarzenia z RSS. Wszyst-
kie aktualizacje Web Slice’ów kontroluje Win- Listing 10. Strona Update.htm (aktualizowanie Web Slice’u)
dows RSS Platform. Ponadto zasubskrybowa- <div class="hslice" id="slice-test">;
nie Web Slice’u skutkuje również dodaniem <h2 class="entry-title">Web Slice Test</h2>;
go do wszystkich czytników RSS wykorzystu- <div class="entry-content">Web Slice content</div> ;
jących tę platformę. Przyjrzyjmy się, jakim mo- </div>
dyfikacjom należy poddać portal, aby pozwalał

Tabela 1. Parametry wykorzystywane w akceleratorach


Parametr Kontekst Opis
{documentUrl} Dowolny Adres dokumentu
{documentTitle} Dowolny Tytuł dokumentu
{documentDomain} Dowolny Domena dokumentu
{documentHost} Dowolny W pełni kwalifikowana nazwa hosta
{selection} selection Aktualnie zaznaczony tekst
{link} link href zaznaczonego linku
{linkText} link Inner Text zaznaczonego linku
{linkRel} link Rel zaznaczonego linku
{linkType} link Typ zaznaczonego linku (jeśli dostępny)
{linkDomain} link Domena wybranego linku
{linkHost} link W pełni kwalifikowana nazwa hosta linku

www.sdjournal.org 65
Technologie internetowe

Wszystkie powyższe znaczniki możemy w przypadku klasy entry-title). Wielkość alizowany i zostanie specjalnie oznaczony
przypisać do dowolnych elementów HTML Web Slice’u określa rozmiar tego elemen- przez przeglądarkę.
(np. div, span , tabela). Listing 8. prezen- tu;
tuje fragment strony, który zostanie rozpo- • rel=”feedurl” – adres strony, z której ak- Bardzo często dochodzi do sytuacji, w której
znany jako Web Slice. Przeglądarka umożli- tualizowana będzie zawartość Web Sli- chcielibyśmy po dodaniu Web Slice’u aktuali-
wi zasubskrybowanie go poprzez specjalną ce’u. Może to być feed RSS lub inna stro- zować go z innych źródeł niż strona, na któ-
opcję w menu (patrz Rysunek 4.) lub ikonę na zawierająca znaczniki hslice (w takim rej został wykryty. Jest to korzystne, jeśli za-
pojawiającą się po najechaniu myszką na tak wypadku na końcu adresu powinniśmy leży nam np. na odciążeniu strony głównej
oznaczony element div. Web Slice będzie au- dodać znak hash oraz identyfikator Web portalu od zapytań wysyłanych automatycz-
tomatycznie aktualizowany przez Windows Slice’u – np. http://test.com/slice- nie przez przeglądarkę. Aby to zrobić, określa-
RSS Platform. Kiedy tylko zmieni się jego update.htm#Slice1); my tzw. Alternative Update Source, wykorzy-
zawartość, użytkownik zostanie o tym po- • Klasa ttl – pozwala określić, jak często (w stując konstrukcję rel=”feedurl” (Listing 9.).
wiadomiony. minutach) Internet Explorer 8 ma odświe- Listing 10. prezentuje stronę, która będzie wy-
Opcjonalnymi elementami istotnymi dla żać zawartość Web Slice’u. Może on być korzystywana do pobierania aktualizacji.
tworzenia Web Slice’ów są: przypisany do dowolnego elementu strony Do projektowania zawartości Web Slice-
(np. <span class=”ttl”>5</span> ; ’ów można wykorzystywać style CSS (zarów-
• Klasa entry-content – oznacza zawartość • Klasa endtime – data ważności Web Slice- no zagnieżdżone w kodzie, jak i zawarte w
Web Slice’u. Może być łączona z kilkoma ’u. Po jej upływie Web Slice będzie uzna- zewnętrznych plikach). Istnieje także moż-
innymi tak oznaczonymi elementami (jak wany za nieaktywny. Przestanie być aktu- liwość korzystania z kodu JavaScript, Flash
czy Silverlight – takie Web Slice’y muszą być
jednak odpowiednio zaprojektowane (z wy-
korzystaniem tzw. Alternative Display So-
urce). Strona zawierająca interaktywne ele-
menty powinna zostać wydzielona ze stron
odpowiedzialnych za aktualizowanie zawar-
tości Web Slice’u i wskazana konstrukcją <a
rel="entry-content" href="Display.htm"
style="display:none;"></a>, zamiast trady-
cyjnego elementu entry-content.
Na koniec warto dodać, że Web Slice-
’y mogą być również dodawane z poziomu
kodu JavaScript. Konstrukcja analogiczna
do: <button onclick="javascript:windo
w.external.addToFavoritesBar('http:/
/auction.microsoft.com/item#1', 'Item
Rysunek 3. Web Slice prezentujący aktualny stan skrzynki odbiorczej GoldenLine
- $66.00', 'slice')">Add WebSlice</
button> spowoduje zasubskrybowanie ele-
mentu.

Podsumowanie
Przeglądarka Internet Explorer nigdy dotąd
nie umożliwiała tak prostego pisania rozsze-
rzeń integrujących ją ze stronami internetowy-
mi. O ich przydatności może świadczyć fakt, iż
przenikają stopniowo także do innych przeglą-
darek. Najnowszy Firefox wspiera już nie tylko
standard OpenSearch, ale również Web Slice’y
(na razie w postaci add-inu). Nie pozostaje nic
innego, jak tylko stworzyć własne rozszerze-
nie – a kiedy już to zrobimy, zgłośmy je do pol-
skiej galerii dodatków Internet Explorer 8 (http:
//www.ieaddons.com/pl/), aby inni użytkownicy
mogli je zobaczyć!

Rysunek 4. Dodawanie wykrytego Web Slice’u BARTŁOMIEJ ZASS


Bartłomiej Zass pracuje w dziale Developer & Plat-
form Group polskiego oddziału Microsoft. Zajmu-
W Sieci
je się współpracą z producentami oprogramowa-
• Polska galeria dodatków do Internet Explorer 8 http://ieaddons.com/pl/; nia w zakresie najnowszych technologii dla progra-
• Specyfikacje OpenSearch http://www.opensearch.org; mistów. Szczególnie interesuje się technologiami
• Szczegóły specyfikacji OpenService Accelerators http://msdn.microsoft.com/en-us/library/ internetowymi, programowaniem urządzeń mo-
cc287851(VS.85).aspx;
bilnych oraz zagadnieniami konstrukcji interfejsu
• Dokumentacja Web Slice’ów http://msdn.microsoft.com/en-us/library/cc196992(VS.85).aspx#_
preview użytkownika.
Kontakt z autorem: bzass@microsoft.com

66 03/2009
Narzędzia

Weryfikacja przez
model z narzędziem SPIN
Wprowadzenie do języka PROMELA oraz narzędzia SPIN
Współczesne programy wykorzystują więcej niż jeden wątek przetwarzania
w celu zmniejszenia opóźnień bądź zwiększenia szybkości działania. Niestety,
zapewnienie o ich bezbłędnym oraz efektywnym wykonaniu jest zadaniem
wyjątkowo kłopotliwym. Formalna weryfikacja przez model jest jedną
z metod mających na celu wykazanie poprawności oraz niezawodności
takich systemów.
my w specjalnym procesie init, wykonywa-
Dowiesz się: Powinieneś wiedzieć: nym zawsze na początku działania systemu.
• Czym jest weryfikacja przez model; • Co to jest wątek; Wspomniane procesy dokonują odpowied-
• W jaki sposób modelować systemy w języku • Jakie problemy występują podczas przetwa- nio zwiększenia oraz zmniejszenia warto-
PROMELA; rzania współbieżnego. ści zmiennej określającej wysokość środków
• Jak specyfikować własności poprawności; na pewnym koncie bankowym. Czynności
• Jak przeprowadzić weryfikację oraz interpre- te realizowane są z użyciem zmiennej tym-
tować otrzymane wyniki; czasowej temp. Powoduje to, że w przypadku
• Jakie są zalety oraz wady przedstawionej metody. przeplotu instrukcji może dojść do sytuacji,
gdzie po zakończeniu wspomnianych proce-
sów stan konta nie będzie odpowiadał wy-
pretującego język PROMELA. Jego w pełni sokości zdeponowanych oraz wypłaconych
automatyczne działanie oraz zwiększające się środków. Zapewnienie o ich poprawnej wy-
Poziom trudności zastosowania tej metody weryfikacji sprawia- sokości realizujemy przez instrukcję assert.
ją, iż warto przyjrzeć im się bliżej. Ze względu na współbieżne działanie proce-
su init wraz z procesami credit oraz debit,
Wzajemne wykluczenie koniecznie jest poczekanie na ich zakończe-

W
ytwarzanie programów współ- Wykonanie nawet najprostszego programu nie. Stąd w specyfikacji systemu wprowa-
bieżnych jest zadaniem wyjątko- współbieżnego może prowadzić do powsta- dzamy dodatkową zmienną pc. Po przyjęciu
wo trudnym. Co więcej, zauwa- nia nietrywialnych, trudnych do wykrycia przez nią wartości 0, proces init wykona in-
żenie możliwych błędów w projekcie lub błędów. W tym celu przedstawiamy pro- strukcję assert.
implementacji jest niejednokrotnie czynno- sty problem pokazujący, w jaki sposób mo- Na podstawie utworzonego modelu wery-
ścią bardzo pracochłonną i wymagającą wie- że dojść do błędnego zachowania. Przez ów fikator SPIN generuje program, który podda-
le uwagi. Formalna weryfikacja przez mo- przykład wprowadzamy Czytelnika w pod- je analizie wszystkie możliwe wykonania sys-
del jest techniką, która umożliwia zbada- stawy języka PROMELA służącego do opi- temu. Aby uzyskać taki weryfikator, wywołu-
nie wszystkich wykonań systemu współbież- su modelu systemów współbieżnych oraz jemy program SPIN z odpowiednimi opcjami
nego. W przypadku wykrycia sekwencji in- własności poprawności, jakie mają być speł- oraz kompilujemy otrzymany kod. W następ-
strukcji, które prowadzą do niepoprawne- nione. nym kroku uruchamiamy weryfikator i po za-
go stanu, pozwala na wygenerowanie kontr- Model ten jest następnie poddawany weryfi- uważeniu komunikatu o złamaniu assercji, do-
przykładu świadczącego o takiej sytuacji. kacji przy użyciu narzędzia SPIN, które może konujemy analizy kontrprzykładu. Komendy,
Dodatkowo możliwe jest badanie systemów, pokazać, w jaki sposób dana własność popraw- które służą do wykonania tych czynności, znaj-
których wykonanie nigdy się nie kończy. Ję- ności zostaje złamana. W poniższym przykła- dują się poniżej.
zyk PROMELA pozwala na specyfikację sys- dzie przedstawiono dwa procesy dokonujące
temów, w których dochodzi do komunikacji współbieżnej modyfikacji zmiennej dzielonej. spin -a bankaccount.pml
kilku wątków wykonania programu współ- Ich równoczesne działanie prowadzi do niepo- gcc -w -DSAFETY -o pan pan.c
bieżnego. Komunikację możemy przedsta- prawnego stanu systemu. ./pan
wiać przy pomocy wymiany wiadomości oraz Na Listingu 1. prezentujemy przykład sys- spin -t -p bankaccount.pml
zmiennych dzielonych, a przez to badać wła- temu, w którym dostęp do zmiennej dzielo-
sności takich programów. Informację tą uzy- nej total jest realizowany przez dwa procesy Na Listingu 2. możemy prześledzić typowy
skuje się przy pomocy narzędzia SPIN inter- credit oraz debit. Ich inicjalizacji dokonuje- wynik działania weryfikatora. Najważniej-

68 03/2009
Weryfikacja przez model z narzędziem SPIN

szą informacją jest ta o złamaniu własności Weryfikacja przez model dzanie zakończenia wykonywania procesów,
poprawności, którą specyfikowaliśmy przy Wykorzystanie możliwości współczesnych możliwość odpowiedzi na nadchodzącą wia-
pomocy instrukcji assert . Pozostałe linie procesorów w programach komputerowych domość oraz brak nieskończonych pętli in-
informują nas o wersji programu, zastoso- odbywa się poprzez wprowadzenie kilku strukcji, które prowadzą do niepoprawnego
wanych optymalizacjach, rodzajach spraw- wątków wykonania. Dzięki ich współbieżne- zachowania. Specyfikacji tych własności doko-
dzanych własności poprawności oraz o wiel- mu działaniu możliwe jest osiągnięcie trzech nuje się przy pomocy instrukcji assert, odpo-
kości przestrzeni stanów, jaka została rozpa- podstawowych celów. Pierwszym z nich jest wiednich etykiet oraz formuł logicznych. Na-
trzona. zredukowanie opóźnień podczas przetwarza- rzędzia do weryfikacji przez model analizują
Przyjrzyjmy się teraz Listingowi 3., przedsta- nia, dzięki zwiększeniu szybkości wykonania wszystkie możliwe wykonania systemu współ-
wiającemu wygenerowany kontrprzykład. In- pewnych obliczeń. Drugim celem jest ukry- bieżnego. W przypadku zauważenia sekwen-
formuje nas o sekwencji instrukcji, które do- cie samego faktu wykonywania długotrwa- cji zdarzeń, które prowadzą do złamania wła-
prowadziły do błędu. Jego uważne prześledze- łych obliczeń poprzez pozwolenie na konty- sności poprawności, generowany jest kontr-
nie wskazuje, iż problem ten pojawia się w przy- nuację pracy całego systemu. Wreszcie ostat- przykład. Umożliwia on prześledzenie, w ja-
padku dokonania jednoczesnych obliczeń przy nim jest podwyższenie przepustowości syste- ki sposób dochodzi do jej złamania.
pomocy zmiennej tymczasowej temp przez oba mu przez zwiększenie ilości obliczeń, które W kolejnym przykładzie prezentujemy moż-
procesy (linie 3-4 oraz 5-6). Przypisanie wyni- mogą być wykonanie w jednostce czasu. Nie- liwości specyfikacji oraz badania klasyczne-
ku obliczeń (linie 7 i 10) do zmiennej dzielo- stety pozytywne efekty, jakie przynosi wpro- go problemu czytelników i pisarzy. Posłuży
nej powoduje, iż tak obliczona wartość jest nie- wadzenie kilku wątków przetwarzania, oku- nam on do dokładniejszego zapoznania się z
poprawna. pione są większym stopniem skomplikowa- elementami języka PROMELA oraz sposobu
Aby uniknąć tego błędu, należy wykonać nia takich programów. W ogólności poja- sprawdzania poprawności rozwiązania. Przed-
obliczenia niepodzielnie przez obydwa pro- wiają się problemy związane z dostępem do stawiona jest również weryfikacja własności
cesy. Język PROMELA dostarcza takie roz- wspólnych zasobów. Musi następować od- bezpieczeństwa oraz żywotności.
wiązanie. Na Listingu 1. została zakomento- powiednie ograniczenie kolejności wykona-
wana instrukcja atomic. Lista instrukcji we- nia wątków podczas ich odczytu oraz zapi- Czytelnicy i pisarze
wnątrz bloku opatrzonego tym słowem klu- su. Kolejnymi jest nadwyrężenie zasobów w W problemie czytelników i pisarzy dwie grupy
czowym zostanie wykonana niepodzielnie, trakcie pracy kilku wątków. Wynika stąd ko- procesów (wątków) posiadają dostęp do wspól-
bez przeplotu z innymi procesami. W ten nieczność przypisania odpowiednich priory-
sposób unikniemy przedstawionego proble- tetów wątkom oraz zapewnienie ich uszere- Listing 1. Przeplot instrukcji prowadzący do
mu. Po usunięciu komentarzy i powtórnym gowania w dostępie do procesora. Wreszcie błędu
wykonaniu komend, nie zostanie wygenero- okazuje się, iż sekwencyjne algorytmy, które
wana informacja o błędzie. Oznacza to, iż dla dobrze działają z jednym wątkiem wykona- int total = 1500; /* stan rachunku */
wszystkich możliwych wykonań procesów nia, są bardzo trudne do stworzenia dla kil- byte pc = 2; /* bariera */
assercja będzie spełniona. ku wątków. Często nie uzyskuje się oczekiwa- proctype credit(int amount) {
Przedstawiony przykład prezentuje kilka nych rezultatów związanych z przyspiesze- int temp;
elementów potrzebnych do weryfikacji sys- niem działania. //atomic {
temów. Po pierwsze, sam model systemu Weryfikacja przez model jest w pełni auto- temp = total;
podlegającego weryfikacji. Jest on uprosz- matyczną metodą, pozwalającą na stwierdze- temp = temp + amount;
czeniem i abstrakcją prawdziwego systemu nie poprawności wykonania systemów współ- total = temp;
– pominięto w nim wszystkie zbędne ele- bieżnych. Wykorzystuje się ją do weryfika- //}
menty. Składa się on jednak z najważniej- cji urządzeń elektronicznych, protokołów, a pc = pc – 1
szych procesów oraz akcji w weryfikowa- ostatnio nawet programów komputerowych. }
nym systemie. Jej głównym zadaniem jest udzielenie odpo- proctype debit(int amount) {
Następnym składnikiem jest specyfikacja wiedzi na temat bezpieczeństwa oraz żywot- int temp;
własności poprawności, jakie mają zacho- ności takich systemów. Są to dwie duże kla- // atomic {
dzić. W tym przypadku własność taka zosta- sy własności poprawności, których spełnie- temp = total;
ła określona przez słowo kluczowe assert. nie świadczy o poprawnym działaniu. W ra- temp = temp - amount;
Kolejnymi czynnościami jest weryfikacja mach własności bezpieczeństwa weryfiku- total = temp;
systemu oraz analiza otrzymanych rezulta- je się zachodzenie niezmienników, brak za- // }
tów, zaś w przypadku wykrycia błędu – je- kleszczeń oraz występowanie sekwencji in- pc = pc – 1
go usunięcie oraz powtórne sprawdzenie po- strukcji prowadzących do niepoprawnego za- }
prawności. chowania. Żywotność z kolei oznacza spraw- init {
run credit(1000);
run debit (1000);
Semafor /* czekamy na zakonczenie procesow
Semafor jest nieujemną zmienną naturalną, dla której określono dwie operacje: P oraz V. Dla da-
*/
nego semafora s, operacja P(s) jest blokowana aż s > 0, a następnie zostaje wykonane s = s
do
– 1. Sprawdzenie wartości zmiennej s oraz jej zmniejszenie jest wykonywane niepodzielnie. Z
kolei V(s) wykonuje s = s + 1 jako niepodzielną instrukcję. :: pc > 0 -> skip;
Pojęcie semafora zostało przedstawione przez Holendra Edsgera Dijkstrę. Stąd też wzięły się na- :: pc == 0 -> break;
zwy operacji P i V. P jest pierwszą literą słowa passeren, które oznacza mijać, przechodzić. V po- od;
chodzi od słowa vrygeven oznaczającego zwolnienie lub uwolnienie. W toku dalszych badań assert (total == 1500);
uświadomiono sobie, iż lepszym określeniem dla P będzie prolagen, powstałe z połączenia słów
printf ("bank account total %d\n",
roberen (próbować) oraz verlagen (zmniejszać). Uznano również, że bardziej odpowiednim sło-
wem dla V, jest verhogen oznaczające zwiększanie. W literaturze angielskojęzycznej operacja P total);
oznaczana jest przez słowo wait, a operacja V – przez signal. }

www.sdjournal.org 69
Narzędzia

nego zasobu. Zasobem tym może być baza da- maforów. Oprócz realizacji odpowiedniego do- W rozpatrywanym przykładzie zostały
nych, plik, zmienna lub też czytelnia w biblio- stępu czytelników i pisarzy, zapewnia ono wy- zdefiniowane dwie stałe wait oraz signal.
tece. Czytelnicy oraz pisarze wykonują różne kluczenie czytelników, gdy pisarz próbuje uzy- Posłużą one do realizacji semafora binarne-
czynności względem zasobu. W ogólności w skać dostęp do czytelni. W następnych paragra- go poprzez kanały komunikacyjne mutex,
tym samym czasie dostęp do niego może posia- fach postaramy się w kolejnych krokach przed- roomEmpty oraz turnstile . Kanały te, za-
dać wielu czytelników. W przypadku zaś pisa- stawić zastosowane podejście jak i sam język deklarowane w kolejnych liniach, mają ze-
rzy, dostęp do zasobu może mieć tylko jeden z specyfikacji. rową pojemność. Oznacza to, iż może po-
nich. Problem ten można rozszerzać o kolejne Specyfikacja w języku PROMELA składa się przez nie dochodzić do synchronizacji pro-
założenia dotyczące działania tych procesów, z kilku elementów: deklaracji stałych, zmien- cesu wysyłającego oraz odbierającego wiado-
na przykład wykluczenia czytelników, gdy pi- nych dzielonych, kanałów komunikacyjnych mość. Proces wysyłający jest wstrzymywany
sarz zechce modyfikować zasób. oraz procesów. Dodatkowo określane są za- do czasu odbioru wiadomości i na odwrót
Na Listingu 4. znajduje się kompleksowe roz- strzeżenia stanowiące o poprawności takiego - proces odbierający wiadomość jest zatrzy-
wiązanie omawianego problemu z użyciem se- modelu. mywany do czasu nadania komunikatu. W
ten sposób określa się spotkanie procesów
Listing 2. Działanie weryfikatora (rendez-vous).
W prezentowanym przykładzie proces
pan: assertion violated (total==1500) (at depth 13) semaphor będzie kolejno oczekiwał na wia-
pan: wrote bankaccount.pml.trail domości zawierające stałą wait lub signal.
(Spin Version 4.3.0 -- 22 June 2007) W ten sposób procesy wysyłające wiado-
Warning: Search not completed mości wait i signal będą miały wyłącz-
+ Partial Order Reduction ny dostęp do fragmentów kodu. Po wysła-
niu komunikatu wait, inne procesy zosta-
Full statespace search for: ną wstrzymane do czasu nadania wiadomo-
never claim - (none specified) ści signal. W ten sposób specyfikuje się se-
assertion violations + mafor binarny. Posłuży on nam w kolejnych
cycle checks - (disabled by -DSAFETY) liniach modelu.
invalid end states + Procesy deklarowane są przy pomocy sło-
wa kluczowego proctype. Uruchomienie in-
State-vector 40 byte, depth reached 16, errors: 1 stancji procesu następuje przy pomocy sło-
48 states, stored wa kluczowego run. W obrębie danego pro-
27 states, matched cesu mogą zostać zadeklarowane zmienne lo-
75 transitions (= stored+matched) kalne lub kanały komunikacyjne. W naszym
0 atomic steps przykładzie interesujące są procesy reader
hash conflicts: 0 (resolved) oraz writer. Poprzez odpowiednie użycie se-
maforów następuje ograniczenie dostępu do
2.622 memory usage (Mbyte) sekcji krytycznych. Jak zostało powiedziane
wcześniej, w sekcji krytycznej może znajdo-
Listing 3. Kontrprzykład wać się tylko jeden pisarz bądź dowolna licz-
Starting :init: with pid 0 ba czytelników. Sekcje te zostały oznaczone
Starting credit with pid 1 przez etykietę cs. Posłuży ona do sformuło-
1: proc 0 (:init:) line 29 state 1) [(run credit(1000))] wania własności poprawności dotyczącej te-
Starting debit with pid 2 go obostrzenia.
2: proc 0 (:init:) line 30 (state 2) [(run debit(1000))] Ograniczenie dotyczące wykonania całe-
3: proc 2 (debit) line 20 (state 1) [temp = total] go systemu jest zdefiniowane przez słowo
4: proc 2 (debit) line 21 (state 2) [temp = (temp-amount)] kluczowe never. W przypadku jego speł-
5: proc 1 (credit) line 9 (state 1) [temp = total] nienia, zostanie wygenerowane odpowied-
6: proc 1 (credit) line 10 (state 2) [temp = (temp+amount)] nie ostrzeżenie oraz przedstawiony kontr-
7: proc 2 (debit) line 22 (state 3) [total = temp] przykład. Jego spełnienie następuje w chwi-
8: proc 2 (debit) line 24 (state 4) [pc = (pc-1)] li, gdy zostanie osiągnięty nawias zamy-
9: proc 2 terminates kający deklarację. W danym modelu mo-
10: proc 1 (credit) line 11 (state 3) [total = temp] że się znajdować tylko jedna jego deklara-
11: proc 1 (credit) line 13 (state 4) [pc = (pc-1)] cja, stąd na listingu 4. pierwsze z nich zo-
12: proc 1 terminates stało zakomentowane. Obostrzenie to jest
13: proc 0 (:init:) line 35 (state 5) [((pc==0))] warunkiem bezpieczeństwa i dotyczy wza-
spin: line 38 "bankaccount.pml", Error: assertion violated jemnego wykluczenia czytelników oraz pi-
spin: text of failed assertion: assert((total==1500)) sarzy. Jego zajście byłoby widoczne po pra-
14: proc 0 (:init:) line 38 (state 10) [assert((total==1500))] wie całkowitym usunięciu linii specyfikacji
spin: trail ends after 14 steps odnoszących się do semaforów w procesach
#processes: 1 reader lub writer . Dodatkowego wytłu-
total = 2500 maczenia wymaga linia reader[3]@cs &&
pc = 0 writer[5]@cs -> break; . Oznacza ona, iż
14: proc 0 (:init:) line 40 "bankaccount.pml" (state 11) jeśli instancje procesów reader o numerze
3 processes created 3 oraz writer o numerze 5 znajdą się w sek-
cji krytycznej, ma zostać przerwana pętla, a

70 03/2009
Weryfikacja przez model z narzędziem SPIN

co za tym idzie – wygenerowane ostrzeże- Formuła [](en -> <>cs) mówi nam, iż za- tatów musi odbyć się z innymi parametrami
nie o błędzie. wsze [] jeśli -> proces znajdzie się przy wej- weryfikatora.
Powróćmy na chwilę do problemu czytel- ściu do sekcji krytycznej en, w końcu uzyska
ników i pisarzy. W szczególnym przypadku do niej dostęp <>cs. Jej weryfikacja będzie spin -a readerswriters-nostarve.pml
może dojść do sytuacji, gdy czytelnicy do- odbywała się przy pomocy deklaracji never gcc -w -o pan pan.c
konają aktu sabotażu na pisarzach. Zaraz po (nigdy). Ponieważ jednak ma ona być zawsze ./pan -a -n
wyjściu z czytelni (sekcji krytycznej) będą spełniona, więc musimy ją zanegować. Odpo- spin -t -p bankaccount.pml
do niej powracać. W ten sposób żaden z pi- wiedni kod uzyskuje się automatycznie przez
sarzy nie uzyska dostępu do czytelni. W kon- polecenie spin -f '!([](en -> <>cs))'. Aby uczynić opis języka PROMELA komplet-
sekwencji dojdzie do ich zagłodzenia. Aby za- Wygenerowanie weryfikatora oraz jego uru- nym, należy wspomnieć o samych instruk-
pobiec takiemu zdarzeniu, należy odpowied- chomienie doprowadzi do pokazania pętli, cjach. W przeciwieństwie do innych języków
nio sformułować własność poprawności oraz w której czytelnicy nieustannie wchodzą do programowania, takich jak C czy Pascal, są one
ją zbadać. sekcji krytycznej. przedzielane, a nie kończone, znakami średni-
Drugi z warunków poprawności zawiera Rozwiązaniem, które usuwa ten problem, ka oraz strzałki w prawo. Ze względu na czy-
kod, który służy temu zadaniu. Może on zo- jest zastosowanie dodatkowego semafora telność specyfikacji, średnika używa się do od-
stać sklasyfikowany jako warunek żywotno- turnstile. dzielenia dwóch instrukcji. Zwyczajowo po
ści, gdyż dotyczy poszukiwania nieskończo- Miejsca jego użycia są pokazane przy po- prawej stronie strzałki umieszcza się instruk-
nych pętli akcji, prowadzących do niepopraw- mocy komentarza /* 2 */. Po jego zasto- cję, która ma zostać wykonana, gdy warunek
nego zachowania. sowaniu nie będzie dochodziło do błędne- znajdujący się po lewej stronie zostanie speł-
Warunek poprawności został wygenerowa- go działania systemu, spowodowanego za- niony. Jednak nie jest to niezbędne. Oznacza
ny przy pomocy formuły logiki temporalnej. głodzeniem pisarzy. Otrzymanie tych rezul- to, iż na przykład instrukcja (a && b) zosta-

Listing 4. Czytelnicy i pisarze

mtype = { wait, signal }; do


:: skip;
byte readers = 0; turnstile!wait; /* 2 */
chan mutex = [0] of { mtype }; en: roomEmpty!wait;
chan roomEmpty = [0] of { mtype };
chan turnstile = [0] of { mtype }; /* 2 */ /* sekcja krytyczna pisarzy */
cs: skip;
proctype semaphore(chan sem) { printf("%d writes\n", _pid);
do turnstile!signal; /* 2 */
:: sem?wait -> sem?signal roomEmpty!signal;
od skip;
} od
proctype reader() { }
do /* never {
:: skip; do
turnstile!wait; /* 2 */ :: reader[3]@cs && writer[5]@cs -> break;
turnstile!signal; /* 2 */ :: else -> skip
mutex!wait; od
readers = readers + 1; } */
if never { /* !([](en -> <>cs)) */
:: (readers == 1) -> roomEmpty!wait; T0_init:
:: else if
fi; :: (1) -> goto T0_init
mutex!signal; :: (!writer@cs && writer@en) -> goto accept_S4
fi;
/* sekcja krytyczna czytelnikow */ accept_S4:
cs: skip; if
printf("%d reads\n", _pid); :: (!writer@cs) -> goto accept_S4
fi;
mutex!wait; }
readers = readers - 1; init {
if run semaphore(mutex);
:: (readers == 0) -> roomEmpty!signal; run semaphore(roomEmpty);
:: else run semaphore(turnstile);
fi; run reader();
mutex!signal; run reader();
od run writer();
} }
proctype writer() {

www.sdjournal.org 71
Narzędzia

nie wstrzymana aż do spełnienia warunku. jednak uniknąć blokady, wprowadzono sło- występujące po stronie nadającej i odbiera-
Czasami konieczne jest wykonanie instruk- wo kluczowe else. Instrukcje występujące jącej. Możliwe jest również zmienianie kolej-
cji pustej, dlatego też stosuje się słowo kluczo- po nim są wykonywane, gdy żadna inna se- ności wiadomości w kanale komunikacyjnym
we skip. kwencja instrukcji nie może być wykonana. oraz ich odczyt, bez usunięcia ich z kanału.
Instrukcje do oraz if również posiadają od- Oczywiście instrukcja if kończy się po wy- Dodatkowo udostępnione są funkcje umożli-
mienne znaczenie. Składają się z jednej lub konaniu jednej z sekwencji. W przypadku in- wiające na sprawdzenie, czy kanał komunika-
kilku sekwencji instrukcji zaczynających się strukcji do, jej działanie wraca od początku. cyjny jest pusty lub pełny. W języku PROME-
od znaku ::. Pierwsza z instrukcji znajdują- Pętlę tą można przerwać przez użycie słowa LA istnieje możliwość specyfikacji kanałów
cych się za dwukropkiem pełni funkcję war- kluczowego break. komunikacyjnych o zadanej pojemności. W
ty (guard), czy też warunku wykonania ta- Ostatnimi instrukcjami jest wysłanie oraz takim przypadku nadanie i odbiór wiadomo-
kiej sekwencji. W przypadku spełnienia jed- odbiór wiadomości. Wysłanie wiadomości ści zależy od ilości komunikatów w kanale.
nej z nich, zostają wykonane następujące po następuje poprzez wyszczególnienie kana- W przypadku odpowiedniej ilości dostępne-
nim instrukcje. łu oraz jej treści. Do wysłania stosuje się wy- go miejsca bądź istnienia wiadomości w ka-
Gdy spełnionych jest równocześnie kilka krzyknik. Odbiór następuje poprzez ozna- nale, procesy odpowiednio kontynuują bądź
warunków, wybór sekwencji instrukcji nastę- czenie kanału oraz znak zapytania. Poszcze- wstrzymują działanie.
puje niedeterministycznie. gólne pola wiadomości mogą być oddzielo-
W przypadku zaś niespełnienia żadnego, ne przecinkami. Do przesłania komunika- Podsumowanie
cała instrukcja do lub if jest blokowana. Aby tu dochodzi, gdy dopasowane zostaną stałe Dzięki weryfikacji przez model możliwe jest
badanie zachowania systemów współbież-
Listing 5. Pętla prowadząca do zagłodzenia procesów pisarzy nych, których wykonanie nigdy się nie koń-
czy. Uzyskane w ten sposób rezultaty mo-
289: proc 5 (writer) line 56 (state 6)[(1)] gą służyć do zapewnienia poprawności ich
291: proc 4 (reader) line 39 (state 19)[mutex!signal] działania bądź usunięcia zauważonych błę-
292: proc 1 (semaphore) line 11 (state 2) [sem?signal] dów. Weryfikacja przez model nie gwaran-
294: proc 5 (writer) line 46 (state 1)[(1)] tuje a priori poprawności, zwiększa jednak
Never claim moves to line 64 [((!((writer._p==cs))&&(writer._p==en)))] rozumienie funkcjonowania systemów po-
296: proc 4 (reader) line 18 (state 1)[(1)] przez odkrywanie niespójności, niejedno-
Never claim moves to line 68 [(!((writer._p==cs)))] znaczności i niekompletności, które w in-
298: proc 3 (reader) line 18 (state 1)[(1)] nym przypadku mogłyby pozostać nie za-
uważone. Znaczącym ograniczeniem sto-
<<<<<START OF CYCLE>>>>> sowania tej metody jest wykładniczo rosną-
cy rozmiar systemu, jaki musi zostać zbada-
300: proc 4 (reader) line 21 (state 2)[mutex!wait] ny, wraz ze zwiększającą się liczbą procesów.
301: proc 1 (semaphore) line 11 (state 1) [sem?wait] Dzięki rozwojowi tej metody w ostatnim cza-
303: proc 4 (reader) line 22 (state 3)[readers = (readers+1)] sie, uzyskuje ona jednak coraz większe zasto-
305: proc 4 (reader) line 24 (state 4)[((readers==1))] sowanie w praktyce.
307: proc 4 (reader) line 24 (state 5)[roomEmpty!wait] Poniższy artykuł miał za zadanie zaznajo-
308: proc 2 (semaphore) line 11 (state 1) [sem?wait] mienie Czytelnika z weryfikacją przez model,
a w szczególności z językiem PROMELA oraz
310: proc 4 (reader) line 27 (state 9)[mutex!signal] narzędziem SPIN. Omawia on tylko najważ-
311: proc 1 (semaphore) line 11 (state 2) [sem?signal] niejsze elementy tych rozwiązań poprzez po-
313: proc 4 (reader) line 30 (state 10)[(1)] kazanie prostych przykładów. Intencją autora
4 reads było jedynie zasygnalizowanie dostępności tej
313: proc 4 (reader) line 31 (state 11)[printf('%d reads\\n',_pid)] metody weryfikacji oraz zachęcenie do samo-
315: proc 4 (reader) line 33 (state 12)[mutex!wait] dzielnego studiowania.
316: proc 1 (semaphore) line 11 (state 1) [sem?wait]
318: proc 4 (reader) line 34 (state 13)[readers = (readers-1)]

320: proc 4 (reader) line 36 (state 14)[((readers==0))] W Sieci


322: proc 4 (reader) line 36 (state 15)[roomEmpty!signal]
• http://spinroot.com/spin/whatispin.html,
323: proc 2 (semaphore) line 11 (state 2) [sem?signal] • http://www.spinroot.com/spin/Man/
promela.html,
325: proc 4 (reader) line 39 (state 19)[mutex!signal] • http://bcook.cs.georgiasouthern.edu/
326: proc 1 (semaphore) line 11 (state 2) [sem?signal] promela.htm.
328: proc 4 (reader) line 18 (state 1)[(1)]
spin: trail ends after 328 steps
SŁAWOMIR MALUDZIŃSKI
Jest doktorantem informatyki AGH. Specjalizuje się
w metodach formalnych oraz systemach agento-
Procesy oraz wątki wych. Posiada kilkuletnie doświadczenie zawodo-
W teorii metod formalnych nazwa proces ma inne znaczenie niż to znane z systemów opera-
cyjnych. W ten sposób oznacza się pojęcie mogące realizować pewne akcje i posiadać dostęp we w czołowych placówkach naukowych oraz fir-
do zmiennych dzielonych oraz kanałów komunikacyjnych. Proces odpowiada więc wątkowi mach softwarowych.
wykonania programu, znanego z języków programowania. Kontakt z autorem: slawomir.maludzinski@gma-
il.com

72 03/2009
Felieton

Aby wielu
mogło na raz...
Cloud computing przedstawiane jest jako cudowny lek na kryzys w IT. Czy
za tym terminem kryje się rzeczywisty sposób na stawienie czoła recesji?
A może jest to jedynie sprytna sztuczka na sprzedanie starych idei w nowym,
marketingowym opakowaniu?

L
udowe porzekadło przekonuje, że mała rewolucja od czasu do booki, smartphony itp.), oznacza przesunięcie środka ciężkości prze-
czasu jeszcze nikomu nie zaszkodziła. Podobnie jest w warun- twarzania w stronę większych centrów obliczeniowych (również tych
kach wolnego rynku – krótkotrwałe wstrząsy mogą przynieść oferowanych przez zewnętrznych partnerów). Tendencje te potwier-
wiele dobrego. Powodują wahania równowagi konkurencyjnej two- dza Gartner, umieszczając wirtualizację oraz cloud computing na czo-
rząc możliwości pojawienia się na rynku nowych graczy czy produk- łowych miejscach listy technologii strategicznych w 2009 ([4]).
tów. Jeżeli jednak zamieszanie będzie za duże, a jego konsekwencje Termin cloud computing (pol. chmura obliczeniowa) odwołuje się do
zbyt rozległe, to powstałe deregulacje przyniosą jedynie pozorne ko- dostarczania usług realizowanych przez wirtualne zasoby za pomocą
rzyści. W dłuższym okresie czasu doprowadzą do zjawisk bardziej nie- standaryzowanych protokołów. Wirtualizacja jest tu rodzajem silnika or-
bezpiecznych, niż sam kryzys (por. [1]). ganizującego i napędzającego oferowane zasoby. Sedno tej idei polega
Nikt już nie wątpi, że dzisiejsza gospodarka znalazła się na takim na przeniesieniu odpowiedzialności na barki wyspecjalizowanych do-
właśnie zakręcie. A już na pewno nikogo nie zaskoczy, gdy IT na tym stawców odpowiednich usług w zakresie: tworzenia i utrzymywania in-
ucierpi. Przedsmak tego odnajdujemy w prognozach na 2009 rok (da- frastruktury (komputerów, sieci), aspektów jej działania (np. współdzie-
ne IDC, Gartnera, Forrestera oraz ISuppli, [2]): lenia zasobów, kontroli dostępu, tworzenia kopii zapasowych, zarządza-
nia awariami) i funkcjonalności (aplikacji). Biznes może się wtedy skon-
• Sprzedaż komputerów stacjonarnych ma wzrosnąć jedynie o 4% centrować na procesach będących bezpośrednio jego przedmiotem, na
(zamiast wcześniej prognozowanych przez ISuppli prawie 12%, akcie tworzenia, dostarczania i konkurowania – a nie na działaniach je-
według IDC odpowiednio 2.4%, zamiast 6%), ale za to laptopów dynie to umożliwiających. Wynika z tego, że cloud computing nie jest
– aż o 15%; żadną konkretną technologią, a pewnym wielowarstwowym modelem.
• Wzrost wydatków na IT na świecie ma wynieść jedynie 2,6%, za- Poszczególne warstwy tego modelu odzwierciedlają poziomy specjali-
miast spodziewanych wcześniej 5,9%; zacji oferowanych usług. Na najniższym poziomie oferuje się czystą in-
• Rynek serwerów fizycznych będzie rósł średnio o 4% rocznie, ale frastrukturę. Najwyższy poziom stanowią wyspecjalizowane aplikacje.
za to serwerów wirtualnych przybywać będzie już 55% rocznie W szczególności wyróżnia się następujące warstwy ([5]):
(zob. [3]);
• Najbardziej dynamicznie rozwija się rynek serwerów wieloproce- • dSaaS (ang. data-Storage-as-a-Service), która oferuje usługi prze-
sorowych (bazujących na x86), sprzedaż maszyn jednoproceso- chowywania danych (np. Amazon/S3, Microsoft Live Workspace);
rowych odnotowuje znaczące spadki; • IaaS (ang. Infrastructure-as-a-Service), która oferuje wirtualne ser-
• Rynek outsourcingu IT ma rosnąć o około 5% w latach 2009-2010. wery (Amazon/EC2, IBM Blue Grid, Sun Grid);
• PaaS (ang. Platform-as-a-Service), oferuje środowisko do tworze-
Z powyższych danych wyłania się obraz wyzwań, jakie staną przed nia i wykonywania aplikacji (system operacyjny, zestaw wymaga-
IT. Przyszłe miesiące to przede wszystkim konieczność ograniczenia nego oprogramowania, dedykowane bazy danych, np. Google
tempa wydatków, rozwijanie systemów w oparciu o słabsze, ale bar- App Engine);
dziej mobilne stacje klienckie oraz tańsze, ale wieloprocesorowe ser- • SaaS (ang. Software-as-a-Service), oferuje konkretne aplikacje (np.
wery. Ograniczenia finansowe szybciej wymuszą optymalizację wy- Google Docs, Salesforce CRM).
korzystania istniejącej infrastruktury, niż jej rozszerzanie. Pojawi się
potrzeba rozwiązań bardziej wydajnych oraz lepiej skalowalnych za- W takim modelu do zakresu obowiązków pracowników pionu IT na-
równo w górę (obsługa pików przetwarzania), jak i w dół (przestoje). leży poszukiwanie partnerów, którzy dostarczą usługi odpowiada-
Taka elastyczność umożliwi szybkie tworzenie otoczenia dla imple- jące potrzebom firmy. Za to partnerzy – dostawcy pobierać będą
mentacji i wdrażania produktów. Powinno to wspomagać koniecz- opłaty. Z drugiej strony IT rozlicza dostawców z jakości oferowanych
ność skrócenia tych etapów, co jest wymagane w obliczu zaostrzo- usług, dotrzymywania uzgodnionych parametrów użytkowych oraz
nej konkurencji. Wreszcie, zastępowanie stacji roboczych laptopa- zapewnionego poziomu bezpieczeństwa. W tym zakresie dostawcy
mi i innymi urządzeniami mobilnymi (tablety internetowe, PDA, net- będą konkurować ze sobą.

74 03/2009
Felieton

Należy tu zauważyć, że w obrębie wymienionych warstw wyko- przedsiębiorstw z branży e-commerce wykorzystywane są jedynie w
rzystuje się znane i sprawdzone technologie, takie jak wirtualizacja, 85%. Patrząc na lata 2004-2007 w 25 krajach EU, liczba dostępnych łą-
Web 2.0, interpretery języków (np. Python dla Google Apps). Rów- czy typu broadband zwiększyła się z około 10 do prawie 90 milionów.
nież idea wykorzystania Internetu jako medium dostępu do usług W tym samym czasie liczba gospodarstw domowych z szerokopasmo-
także nie jest specjalnie nowa (por. ang. Web services). Z drugiej stro- wym dostępem do Internetu wzrosła jedynie o około 28 milionów (da-
ny, w prawie każdej publikacji na temat przyszłości IT wspomina się o ne szacowane na podstawie Eurostat). Cloud computing obiecuje moż-
cloud computing (przynajmniej pośrednio). Co stało się powodem ta- liwość zyskownego zagospodarowania takich rezerw.
kiej eksplozji popularności tego modelu? Kryzys to również skłonność do poszukiwania tańszych alterna-
Myślę, że podstawowym katalizatorem jest kryzys finansowy. tyw. Dla przykładu, już dziś w Polsce więcej osób korzysta z przeglą-
Nawet jeżeli jego korzenie nie wiążą się bezpośrednio z rynkiem darek innych niż Internet Explorer (głównie Firefox). Kompleksowość
IT (jak to było przy krachu dotComów w 2001 roku), to firmy na- usług dostarczanych przez model chmury obliczeniowej może się oka-
uczone bolesnym doświadczeniem, od razu zaczęły rozglądać się zać zaletą.
za potencjalnymi oszczędnościami. Możliwość obniżenia kosz- Według mnie, ostatecznym katalizatorem jest szerzące się na świe-
tów budowania i obsługi infrastruktury oferowana przez chmu- cie piractwo. To zjawisko osiągnęło taką skalę, że walka z nim jest bar-
rę wydaje się bardzo na czasie. Zwłaszcza gdy nie odbywa się to dzo trudna. Co więcej – część beneficjentów praw autorskich przed-
kosztem istniejących wdrożeń. Można uniknąćw ten sposób np. kłada agresywne sposoby dochodzenia swoich roszczeń (na sali sądo-
kosztownych problemów z zachowaniem kompatybilności. Kry- wej) nad elastyczność. Przynosi to mizerne zyski finansowe i powodu-
zys to kurczenie się rynków zbytu. Szacuje się, że moce obliczeniowe je wiele negatywnych emocji. Decydując się na przeniesienie swoich

Tabela 1. Wybrani gracze na rynku cloud computing (zob. [16], [17])

Firma/Produkt Model biznesowy Przykładowe ceny Ilość użytkowników


Amazon/ Amazon Udostępnianie przestrzeni dyskowej 15 centów/1 GB powierzchni/ 370 tyś.
Web Services (Simple Storage Service - S3:dSaaS), serwe- miesiąc
ry wirtualne (Elastic Compute Cloud - EC2: 10-80 centów/godzinę pracy ser-
IaaS), kolejki wiadomości oraz baza da- wera
nych (SimpleDB)
Google/ Google Hosting aplikacji napisanych w Pythonie 15 - 18 centów/1 GB powierzchni/ n/a
App Engine (rów- (PaaS: dostęp do przestrzeni dyskowej, miesiąc (do 0.5 GB za darmo)
nież Android) serwerów ale również środowisko pro- 10-12 centów/godzinę pracy ser-
gramistów). wera
Google/ Google SaaS: procesor tekstu, arkusz kalkulacyj- Za darmo lub 50$ rocznie za Nawet 6 milionów (docs+spreadsheets) użytkow-
Apps (również ny, tworzenie prezentacji, klient poczto- usługi premium ników, ale jedynie 4 (docs) - 6 minut (spreadsheet)
Gmail/Postini) wy, kalendarz (plus przestrzeń dyskowa) spędzanych on-line (dane: www.compete.com)
Google/ SaaS: On-line CRM $10/miesiąc n/a
Salesforce: Sales-
force CRM
Salesforce: For- PaaS: platforma aplikacji Web; Relacyjna n/a 1.1 miliona
ce.com baza danych, interfejs użytkownika, logika
biznesowa, środowisko programistyczne,
udostępnianie aplikacji (AppExchange)

Microsoft: Office PaaS: Oprogramowanie plus usługi (np. n/a Około 0.5 milina unikalnych użytkowników witryny
Online, Live Work- MS Word do tworzenia dokumentów i officelive.com (dane: www.compete.com)
space, Hotmail (w MS Live Workspace do zapisywania ich
przygotowaniu: on-line).
Azure)
Ulteo Desktop PaaS: wirtualny desktop linuxa Darmowy (community edition) Około 6 tysięcy unikalnych użytkowników miesięcz-
lub płatne wsparcie nie (dane: www.compete.com), ponad 140 tyś. sesji w
ciągu ostatnich kilku miesięcy (w/g Ulteo)

Spektakularne wycieki danych w latach 2007-2008


• Niemcy: wyciekły dane 21 milionów kont bankowych. Źródłem przecieku były najprawdopodobniej zewnętrzne firmy dostarczające usługi księ-
gowe i finansowe. Kilka miesięcy wcześniej ujawniono wyciek danych 17 milionów klientów operatora T-Mobile, o czym opinia publiczna dowie-
działa się dopiero ponad 1.5 roku po fakcie ([7], [8]);
• Wielka Brytania: na laptopie zakupionym na eBay znaleziono dane kilku milionów klientów Royal Bank of Scotland, Natwest oraz American
Express ([9]); Rok wcześniej wyciekło nawet 90 milionów numerów kart kredytowych klientów sieci T.J. Maxx ([12]);
• Polska: dane osobowe (w tym numery kont bankowych) chętnych na zakup biletów na Euro2008 były dostępne przez kilka godzin. PZPN twierdzi,
że jedyną odpowiedzialność ponosi prywatny operator [10];
• Polska: wyciekły życiorysy 3 tysięcy osób kandydatów do pracy w Pekao SA. Według ekspertów powodem były nieodpowiednie zabezpieczenia
zastosowane przez firmę, której Pekao zleciło wykonanie strony ([11]);
• USA: podczas przewożenia taśmy z back-up'em skradziono dane 12,5 miliona klientów New York Mellon Bank, GE Money stracił w podobny spo-
sób dane 650 tyś. klientów; Szpital Uniwersytecki Utah: 2.2 mln danych medycznych pacjentów zostało skradzionych z samochodu serwisanta
systemów archiwizacji, podczas gdy ten był u innego klienta; Countrywide Financial: 2 mln danych kredytobiorców zostało ukradzionych i sprze-
danych przez pracownika firmy, który łączył się zdalnie do sieci korporacyjnej ([12]);

www.sdjournal.org 75
Felieton

produktów do chmury, producenci uzyskują całkowitą kontrolę nad dą uzależnione od wartości opłacanego abonamentu (np. wysokość
tym kto, jak często i w jakim zakresie ich używa. Problem piractwa odszkodowania za straty wynikłe z utraty lub upublicznienia danych,
przestaje istnieć. przestojów systemu).
O ile jestem zdecydowanym przeciwnikiem piractwa (w końcu sam Kolejną kwestią wartą rozważenia jest niekompatybilność chmur.
korzystam z tantiem za swoją pracę), to podobny stopień kontroli jest Oczywiście, wielu z dostawców zaproponuje własne standardy dostę-
dla mnie problematyczny. pu (protokoły, interfejsy). Istnieją więc duże szanse, że znowu będzie-
Dyskomfort wiąże się przede wszystkim z koniecznością zaufania ze- my świadkami scysji podobnej do tej między ODF i OOXML (zob. [13]).
wnętrznemu dostawcy. Łatwiej o takie zaufanie, kiedy mówimy o skle- Brak porozumienia doprowadzi do typowego vendor lock-in: przeniesie-
pie mięsnym za rogiem. Wiem, że pracującej tam pani Basi zależy na nie danych między dostawcami stanie się na tyle trudne, że nie zrekom-
klientach. Zbyt wiele podobnych sklepików jest w okolicy, aby mogła pensuje potencjalnych zysków tytułem niższych opłat u innego dostaw-
pozwolić sobie na sprzedanie mi nieświeżego towaru. Czy tak samo cy. To ograniczy presję konkurencyjną. Przydatność chmury do wymiany
będzie zależeć na mnie (mojej firmie) korporacji, która obsługuje milio- informacji między klientami różnych dostawców może być ograniczona.
ny podobnych klientów? Powtarzając za Greenspanem tłumaczącym Przecież nie chodzi o to, żeby załączyć dokumenty do e-maila.
przyczyny kryzysu finansowego: uwierzyłem, że banki są w stanie wy- Z drugiej strony może się okazać, że takich dostawców nie będzie
konać właściwe posunięcia by zabezpieczyć interesy ich akcjonariuszy znowu aż tak wielu. Nawet jeśli sami stworzą rozwiązania odpowied-
i klientów. Myliłem się. nio funkcjonalne i skalowalne, ilu z nich zostanie obdarzonych odpo-
Wydaje się, że to poziom bezpieczeństwa będzie warunkował po- wiednim kredytem zaufania? Którym zdecydujemy się powierzyć ta-
pularność usług cloud computing. Jak dotychczas usługi świadczo- jemnice niejednokrotnie warunkujące istnienie naszego biznesu? Pro-
ne za pomocą Internetu trudno było uznać za bezpieczne. Przypad- giem wejścia na taki rynek jest nie tylko infrastruktura, know-how, ale
ki ujawnienia danych niepowołanym osobom zdarzają się niemal na aspekty czysto emocjonalne, jak np. zaufanie do marki.
porządku dziennym (zob. Ramka Spektakularne wycieki danych w la- Wątpliwości dotyczą również firm powiązanych z klientami za po-
tach 2007-2008). mocą produktów. Czy będą one w stanie przestawić się na model do-
Ponieważ zaufanie będzie kluczową kwestią, można spodziewać się, stawca-usługobiorca (zob. [14])?
że dostawcy nie będą zinteresowani nagłaśnianiem swoich wpadek. Czynniki te mogą sprawić, że powstanie monopol kilku-, kilkunastu
Dodatkowo, dowiedzenie ewentualnej winy dostawcy stanie się bar- dostawców, czy korporacji o międzynarodowym zasięgu i renomie.
dziej skomplikowane, niż w przypadku systemów lokalnych – również Ograniczy to wpływ problemów z przenośnością, ale czy rzeczywiście
ze względu na trudności w określeniu zasięgu chmury. tak powinien funkcjonować wolny rynek?
Biorąc pod uwagę ryzyko, jakie przejmują na siebie dostawcy, po- Bańkę spekulacyjną nadmuchała chciwość. Zagrożenie, jakie się
ziom bezpieczeństwa nie będzie traktowany jako parametr usługi (np. wiąże z udzieleniem kolejnego kredytu subprime, było nieistotne.
usługi składowania danych), ale jako kolejna osobno płatna usługa Większą wagę miała ilość zawartych umów, bo od tego zależała mie-
(podobnie transfer, szybkość operacji, itd.). Udzielane gwarancje bę- sięczna premia. Jaka jest pewność, że podobna sytuacja się nie powtó-
rzy? Niektóre z oferowanych usług będą przecież bardziej popularne
niż inne. Dostawcy chętniej zainwestują w ich rozwój, bo to one przy-
Bibliografia ciągną klientów i przyniosą największe zyski. Może to doprowadzić do
sytuacji, w której pakiety usług staną się zunifikowane i przykrojone do
• [1] Doktryna Szoku, Naomi Klein, Muza, październik 2008; najczęstszych potrzeb. Presja konkurencji przestanie się liczyć, ponie-
• [2] Branża technologiczna nie poległa... Na razie, NetWord Online, li-
stopad 2008;
waż zysk będzie pochodną ilości, a nie specyficzności. Oczywiście na
• [3] Wirtualizacja 2.0 – trend czy standard? Prognozy rynku rozwoju usługach niszowych dostawca będzie mógł zarobić wielokrotnie wię-
technologii, Jarek Smulski, IDC Polska, 2007; cej. Tylko czy małe i średnie firmy, do których cloud computing jest w
• [4] Dziesięć strategicznych technologii 2009 roku, IDG.pl, padziernik pierwszym rzędzie adresowany, będzie na to stać? Raczej dostosują
2008; się do oferowanych usług, co przyniesie efekt dokładnie odwrotny do
• [5] Cloud computing with Linux, M.Tim. Jones, wrzesień 2008;
obiecywanego przez marketing. Czy właśnie to ma na myśli Sun pod
• [6] Dane Dow Jones: Google Finance; dane wyszukiwań: Google
Trends; dane odwiedzin domeny docs.google.com: Compete; eufemistycznym określeniem important tradeoffs (zob. [15])?
wszystkie znormalizowane do % maksymalnej wartości w okresie Chmura to chwytliwy i bardzo obrazowy slogan. Dobrze współbrzmi
październik 2007 – listopad 2008; z Internetem, którego clue to decentralizacja. Z drugiej strony – chmu-
• [7] Niemcy: 21 milionów kont bankowych do kupienia, Dziennik In- ra jest synonimem pewnej nieokreśloności, rozmytości, a istotą chmu-
ternautów,6 grudnia 2008; ry obliczeniowej jest konsolidacja i centralizacja zasobów. Podobnie
• [8] Niemcy: Wyciekly dane 17 milionów klientów, Dziennik Internau-
tów, 5 październik 2008;
niejednoznaczne są moje odczucia. Z jednej strony nęci mnie obiet-
• [9] Wyciek danych – nowa specjalnosc Brytyjczyków?, Dziennik Inter- nica uzyskania pewnego komfortu psychicznego (zrzucenia na kogoś
nautów, sierpień 2008; choćby części odpowiedzialności związanej z infrastrukturą), możliwo-
• [10] Wyciek danych polskich kibiców, Dziennik Internautów, luty ści kształtowania infrastruktury według potrzeb, przebierania w usłu-
2008; gach (zamiast ich mozolnego tworzenia we własnym zakresie). Z dru-
• [11] Wyciek danych z Pekao to nie atak hakerów, Dziennik Internau-
giej strony jednak studzi mnie brak przejrzystości reguł i długofalo-
tów, lipiec 2008;
• [12] Banking's Data Security Crisis, Andy Greenberg, Forbes, listo- wych skutków. Ciekawy jestem co wygra?
pad 2008; Artykuł wyraża prywatne poglądy autora, które niekoniecznie od-
• [13] Zagadnienia procesu normalizacji OOXML opisywane były w zwierciedlają stanowisko Silicon & Software Systems Ltd. (S3)
SDJ numer 6/2008, 8/2008 oraz SDJ Extra! Numer 25;
• [14]The Risks and Rewards of Cloud Computing, Gartner Voice, lipiec
2008;
• [15] Demystifying Cloud Computing, Sun Inner Circle – Newsletter,
listopad/grudzień 2008; ARKADIUSZ MERTA
• [16] Demystyfying the Cloud, Information Week Research & Reports, Autor od 10 lat zajmuje się zagadnieniami projektowania i realizacji oprogra-
June 2008; mowania. Aktualnie jest pracownikiem Silicon & Software Systems Polska za-
• [17] Handicapping cloud computing, Larry Dignan, grudzień 2008; trudnionym na stanowisku menadżera projektów.
Kontakt z autorem: arkadiusz.merta@s3group.com

76 03/2009
Felieton

Najpierw cele
C
el nie powinien byc postrzegany jako punkt. Kazda decyzja sytuacji. Okazana krótkowzroczność prowadziła do niechybnej zguby.
podejmowana w projekcie moze do niego przyblizac lub od- Postrzeganie jest inspiracją dla działania (zob. [3]). Jeżeli będzie zakłóco-
dalac. Dlatego cele nalezy rozpatrywac w kategoriach daze- ne, fałszywe, podyktowane nieobiektywnymi czy doraźnymi przesłanka-
nia w wybranym kierunku. mi – podjęte na jego podstawie akcje mogą przynieść więcej szkody niż
Pamiętam jedno opowiadanie Lema z serii Dzienników Gwiazdowych korzyści. Powstaje zatem pytanie, czy jesteśmy w stanie poprawnie po-
[1]. Jego bohater Ijon Tichy, nie mogąc w pojedynkę poradzić sobie z strzegać (a więc i definiować) cele?
naprawą statku kosmicznego, postanowił zapętlić czas, tak aby zwielo- Powtarzając za Druckerem: to, co klient uważa za wartość, jest
krotnić samego siebie. Uzyskane w ten sposób dodatkowe ręce do pra- tak skomplikowane, że na pytanie o nią tylko on sam może odpowie-
cy, miały pomóc w wyjściu z opresji. Niestety już po pierwszym rozmno- dzieć. Zarząd firmy nie powinien nigdy nawet próbować tego zgady-
żeniu okazało się, że brakuje zapasowego skafandra. Po kilku powtórze- wać. Powinien zawsze i systematycznie szukać odpowiedzi u klienta [4].
niach procesu, gdy liczba klonów bohatera gwałtownie wzrosła (zamie- Firma funkcjonuje tak długo, jak długo potrafi zarabiać pieniądze. Aby za-
rzenie lub jako efekt uboczny), chaos pogłębiał się a rakieta dryfowała co- pewnić stały dopływ środków, musi dotrzymywać swoich zobowiązań.
raz dalej w nieznane. Realizacja zadanych celów to podstawowe zadanie. Rolą liderów jest za-
Na pierwszy rzut oka może się wydawać, że problemy Ijona są tak wy- pewnienie tego. Trzeba jednak dokładnie rozumieć na czym polega biz-
dumane, że nadają się jedynie na niedzielne czytadło. Spróbujmy jednak nes. Czy chodzi o dostawę, czy raczej spełnienie oczekiwań (potrzeb)
pomyśleć o podróży bohatera jako o pewnym projekcie. Przeszkody, któ- klienta? Czy chodzi o sztukę, czy o produkt? Czy chodzi o tysiące linii ko-
re pojawiły się w czasie jego realizacji (uszkodzenia statku), okazują się na du, czy o postęp?
tyle trudne, że powodzenie misji staje pod znakiem zapytania. Należy również zdać sobie sprawę z faktu, że cele (potrzeby) klien-
Mamy tu do czynienia z poważnie zagrożonym projektem i despe- ta nie są stałe w czasie. Gdy dostarczamy np. proof-of-concept (dowód,
racką próbą uratowania go. Nasz bohater decyduje się rozwiązać pro- że projekt jest wykonalny), klienta będą interesować jak najniższe kosz-
blem poprzez zwiększenie ilości zasobów. Metoda taka (jak i jej wynik) ty i najkrótszy czas wykonania (tzn. minimalna strata w przypadku nie-
jest dokładną ilustracją prawa Brooksa (sformułowanego jakieś 10 lat możności realizacji). Z drugiej strony zadaniem podobnego prototypu
po wydaniu wspomnianego opowiadania – przypadek?). Prawo to mó- jest przedstawienie, wizualizacja koncepcji przyszłego produktu, tak aby
wi, że dodawanie kolejnych zasobów do spóźnionego projektu, czy- klient zdecydował się na realizację. Dostarczenie podobnej projekcji po-
ni go jeszcze bardziej spóźnionym. Problem polega na tym, że im więk- zostawia pole do kompromisu w zakresie kompletności i jakości. Oczywi-
szy jest zespół, tym więcej czasu trzeba poświęcić na wewnętrzną ko- ście w miarę postępu prac nad projektem, pole manewru ulegnie znacz-
munikację. Im później ludzie dołączają do projektu, tym więcej cza- nemu ograniczeniu. Nadal jednak świadome i odpowiedzialne balanso-
su potrzebują na wdrożenie (tzn. tym później będą w stanie efektyw- wanie czasem, kosztami i zakresem może umożliwić osiągnięcie sukcesu
nie wspomagać projekt, zob. [2]). Boleśnie tego doświadczył Ijon, kie- – nawet w przypadku zagrożonych projektów.
dy próbował ustalić, który klon jest kim, po co się pojawił i jaki ma spo- Sztuczka polega na tym, aby cel postrzegać w kategorii dążenia, co-
sób na rozwiązanie sytuacji. Zamiast pracować nad osiągnięciem ce- dziennego kursu i jego korekt, a nie tylko pojedynczego punktu w cza-
lu, uwikłał się w męczące spory, dyskusje i rozważania. A czas uciekał... sie. Wszystkie doraźne działania należy ważyć w kategorii zysków i strat,
Podobne historie przydarzyły się już wielu projektom. Goniące terminy, które będą przybliżać lub oddalać sukces. Brak długofalowej analizy wy-
nieprzewidziane wydarzenia kradnące czas i zasoby, niedoszacowane za- ników takich działań (nawet tych pozornie błahych) może skutkować dry-
dania – to wszystko sprawia, że zaczynamy panikować. Ściągamy dodat- fem, a nie podążaniem w określonym kierunku. Refleksja na temat poten-
kowe zasoby, nerwowo żonglując zadaniami między nimi – zgodnie ze cjalnych efektów nie może być rozpatrywana jedynie w kontekście ce-
wskazaniami ścieżki krytycznej. Zarywamy weekendy (o nadgodzinach lu postawionego przed projektem. Konieczne jest uwzględnienie wszel-
nie wspominając). W zespole zaczyna robić się gęsto od nerwów. Niektó- kich dodatkowych faktów, które mogą zaistnieć w wyniku podejmowa-
rzy nie wytrzymują tempa i awantura gotowa. nych decyzji. Przykładowo, planowe dostarczenie projektu było okupio-
Nie myślcie, że nie nachodziły mnie takie pomysły. Jednak mój szef ne wzmożonym wysiłkiem zespołu. W dłuższym okresie może to prowa-
produktu, na prośbę przydzielenia dodatkowych ludzi w celu dopięcia dzić do spadku zaangażowania i kreatywności – a więc i wydajności.
terminów, odmówił. Uzasadnił to krótko: bo chcę, żeby Ci się udało. Czy Cele należy osiągać – to podstawa egzystencji firmy – ale trzeba być
chodziło mu jedynie o prawo Brooksa? świadomym drogi, która prowadzi do ich realizacji. Wszystkie decyzje po-
Źródłem problemów Ijona była jego ślepa koncentracja na celu. Tak bar- dejmowane w tym czasie trzeba rozpatrywać względem szerszego ho-
dzo nastawił się na jego osiągnięcie, że przysłoniło mu to wszystkie inne, ryzontu późniejszych skutków. Zaniedbanie przewidywania może się
w jego pojęciu poboczne, aspekty – jak np. ilość skafandrów, miejsce czy wkrótce zemścić, i to w całkowicie nieprzewidziany sposób.
zapasy pożywienia dla rosnącej załogi. Postrzegał problem w ograniczony PS. Nie zdradzę zakończenia opowiadania – zachęcam do lektury. Po-
sposób i źle ukierunkował działania. Osiągnięte rezultaty nie poprawiały wiem jedynie, że rozwiązanie leżało nie tyle w ilości, ile w składzie zespołu
i jego odpowiednim zaangażowaniu w rozwiązanie problemu.
Artykuł wyraża prywatne poglądy autora, które niekoniecznie odzwiercie-
Bibliografia dlają stanowisko Silicon & Software Systems Ltd. (S3).
• [1] Dzienniki Gwiazdowe: Podróż siódma, Stanisław Lem, Wydawnic-
two Literackie, 1966
• [2] The Mythical Man-Month, Essays on Software Engineering, Peter
F. Brooks, Addison-Wesley, 1995 ARKADIUSZ MERTA
• [3] Mądre życie, A. Roger Merrill, Rebecca Merril, Bertlsmann Me- Autor od 10 lat zajmuje się zagadnieniami projektowania i realizacji oprogra-
dia, Warszawa 2004 mowania. Aktualnie jest pracownikiem Silicon & Software Systems Polska za-
• [4] Praktyka zarządzania, Peter F. Drucker, MT Biznes, 2008 trudnionym na stanowisku menadżera projektów.
Kontakt z autorem: arkadiusz.merta@s3group.com

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

Skontaktuj się z nami:


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

Opera Software Architektury systemów IT


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

FRONTLINE STUDIOS Future Processing


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

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

Kei.pl WSISiZ w Warszawie


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

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

StatConsulting TTS Company Sp. z o.o.


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

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

Transition Technologies S.A. EPRO


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

IT SOLUTIONS Softline rozwiązania mobilne


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

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

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


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

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

Systemy bankowe, ISOF


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

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

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ść zama- numeru
nume- wianych pisma Cena
l prezenty rów prenume- lub mie-
rat siąca
l bezpieczna płatność Software Develope-
r’s Journal (1 płyta CD) 12 250
on–line – dawniej Software 2.0 PLN
W NASTĘPNYM NUMERZE SOFTWARE DEVELOPER’S JOURNAL 4/2009 (172)

Numer będzie poświęcony


Rich Internet Application
W magazynie:

• JavaFX

• Silverlight

• Adobe Flex

A także wiele innych interesujących artykułów z dziedziny programowania


urządzeń mobilnych, testowania oprogramowania, języków programowania itp.

W sprz
eda
po łow ży w drugie
ie mar
ca j

Redakcja zastrzega sobie możliwość zmiany zawartości pisma.

You might also like