You are on page 1of 84

01/2009 (169)

SPIS TREŚCI
06 AKTUALNOŚCI torów i metod statycznych. Celem tego artykułu jest przedstawie-
Rafał Kocisz nie różnorodnych technik, pomocnych w pisaniu testów dla kodu,
w którym takie konstrukcje występują.

19 OPIS CD
34 Adobe Flash
BIBLIOTEKA MIESIĄCA Bill Graham i Paul N. Leroux
Według Adobe Systems, już ponad 300 milionów mobilnych urzą-
14 FreeMarker – system szablonów w praktyce dzeń wyposażonych jest w interfejsy graficzne (GUI), wykorzystują-
Piotr Wierzba, Piotr Gawle ce technologię Adobe Flash – a przewiduje się, że liczba ta przekro-
Autorzy opisują bibliotekę FreeMarker, za pomocą której jesteśmy w czy do 2010 roku miliard. Z prostego powodu firmy projektujące sys-
stanie oddzielić zadania programistów od zadań projektantów, pracu- temy wbudowane na potrzeby przemysłu, branży medycznej i mo-
jących nad poszczególnymi warstwami aplikacji. Dzięki wykorzysta- toryzacyjnej również zaczynają stosować Flash.
niu silnika szablonów, w postaci biblioteki FreeMarker, znacznie uła-
twimy wprowadzanie zmian graficznych w warstwie prezentacji apli-
kacji. Tym samym osiągnięcie wysokiej jakości oprogramowania i jego
utrzymanie w późniejszych etapach realizacji będzie łatwiejsze. HURTOWNIE DANYCH
38 Informacja w służbie organów bezpieczeństwa
Andrzej Machnacz
W treści artykułu autor przedstawia syntetyczne omówienie syste-
BAZY DANYCH mu analitycznego wykorzystującego mechanizmy hurtowni danych
20 Oracle Data Access Components jako skutecznego narzędzia organów bezpieczeństwa publicznego
Artur Mościcki działających na rzecz poprawy bezpieczeństwa obywateli. W opisie
Firma Core Lab Software Development specjalizuje się w tworzeniu wykorzystano doświadczenia z wdrożenia systemu analitycznego w
technologii dostępu do baz danych z poziomu Delphi i C++ dedyko- polskiej Policji.
wanych jednemu systemowi zarządzania bazami danych oraz mo-
dyfikacji istniejących mechanizmów dostępu takich jak ADO.NET,
BDP.NET, dbExpress.
JĘZYKI PROGRAMOWANIA
44 Biblioteka senseGUI – czyli GUI z automatu
Mariusz Trzaska
TESTOWANIE OPROGRAMOWANIA Większość programistów zetknęła się z potrzebą stworzenia Graficz-
28 Testy jednostkowe trudnego kodu w Javie nego Interfejsu Użytkownika (ang. GUI). Zwykle do tego celu stosu-
Tomasz Kaczanowski je się popularne biblioteki (np. Swing ) lub dedykowane edytory, co
Istnieje szereg konstrukcji w kodzie Javy, które skutecznie utrudniają jest dość pracochłonne. W tym artykule Mariusz Trzaska omawia in-
pisanie testów jednostkowych. Należą do nich wywołania konstruk- ne rozwiązanie, bazujące ba podejściu deklaratywnym.

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


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

4 01/2009
APLIKACJE BIZNESOWE 68 Pozycjonowanie stron
48 SQL Server 2005 i SQL Server 2008 Wojciech Kłodziński
Artur Mościcki Pozycjonowanie stron internetowych to wyprowadzenie serwi-
W artykule tym Artur omówia nieco mniej znane i rzadziej wykorzy- su internetowego na pierwsze pozycje w wyszukiwarkach (przede
stywane obiekty baz danych – tabele tymczasowe i zmienne tablico- wszystkim Google, z uwagi na bezkonkurencyjny udział w rynku
we. Odpowiednie wykorzystanie tych obiektów może przynieść wy- polskim ok. 92%). Autor w przystępny sposób podpowiada nam jak
mierne korzyści w aplikacjach biznesowych. wypromować własny serwis.

NARZĘDZIA PROGRAMISTYCZNE PROGRAMOWANIE


52 GNU Linear Programming Kit URZĄDZEŃ MOBILNYCH
Sławomir Maludziński
Zagadnienie programowania liniowego oraz metoda simplex umoż- 72 Programowanie gier dla Symbian OS
liwiająca jego rozwiązanie, były tajnym orężem podczas drugiej woj- – efekty specjalne
ny światowej. Pozwalały na maksymalizację zysków lub minimaliza- Rafał Kocisz
cję strat przy zadanych ograniczeniach. W poniższym artykule Sła- Niniejszy, ostatni artykuł z cyklu opisującego zagadnienia związa-
womir wprowadza czytelnika w arkana programowania liniowego ne z programowaniem gier dla Symbian OS, pokazuje jak zaimple-
oraz narzędzie GLPK. mentować takie efekty specjalne jak wielokanałowy dźwięk oraz wi-
brację.

WARSZTATY
58 Media streaming FELIETON
– wykorzystanie Adobe Flex i Red5 71 Najpierw zespół
Roman Swoszowski W bieżącym numerze SDJ Arkadiusz rozpoczyna serię felietonów,
Aplikacje RIA bardzo często wykorzystują technologię strumienio- w ciekawy sposób traktujący o szeroko rozumianej branży IT.
wania mediów (media streaming). Może ona być podstawową funk-
cjonalnością danej aplikacji (lub jedną z podstawowych) w przypad-
ku komunikatorów czy też odtwarzaczy plików audio i video.

62 Świat 3D w Javie
Dariusz Wawer
Java jest jednym z najczęściej wykorzystywanych języków progra-
mowania, który w połączeniu z wirtualną maszyną Javy daje apli-
kacjom w niej napisanym dużą przenośność. Java 3D, darmowe API
do Javy, pozwala wykorzystać podstawowe zalety języka i platfor-
my do renderowania obiektów 3D w bardzo elastyczny i logiczny
sposób.

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

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


cooperation@software.com.pl

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

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

www.sdjournal.org 5
Aktualności

Nowy komitet OASIS


dla popularyzacji OpenDocument
Organizacja OASIS utworzyła nowy komi-
Windows 7 na święta 2009?
P
tet, którego działalność będzie miała na celu odczas konferencji WinHEC Doug
dalszą popularyzację formatu OpenDocu- Howe, jeden z menedżerów Micro-
ment (ODF). Nowy komitet Oasis Interoperabi- softu w swoim wystąpieniu wygło-
lity and Conformance Committe (OIC) będzie sił najpoważniejsze jak do tej pory oświad-
przede wszystkim pracował nad poszerzeniem
czenie co do daty premiery Windows 7. Z
listy aplikacji, które obsługują format ODF. OIC
będzie przygotowywał materiały przydatne prezentacji nieco tajemniczego jak na ra-
producentom oprogramowania do testów zie projektu Velocity i tego, co Howe mó-
zgodności aplikacji, a także będzie dla nich wił wynikało dość jednoznacznie, że Mi-
prowadzić demonstracje i seminaria. Wśród crosoft planuje wydać nową wersję syste-
członków OIC można wymienić takie firmy jak mu Windows w trzecim kwartale przyszłe-
IBM, Oracle, Sun Microsystems, Google, Novell,
Red Hat, a także Departament Obrony USA
go roku. Wszystko tak, by zdążyć przed sza-
i ministerstwo nauki Republiki Południowej łem zakupów związanym ze Świętami Boże-
Afryki. Nowy komitet będzie ściśle współpra- go Narodzenia.
cował z już istniejącą grupą do spraw technicz- Po sesji w rozmowie z Iną Fried z serwi-
nych oraz adopcji formatu ODF. OASIS zachęca su CNET Howe potwierdził: zdecydowanie
także inne firmy do zaangażowania się w dzia-
skoncentrujemy się na terminie przedświątecz- mu okno, którego miniaturkę wskazano sta-
łania propagujące OpenDocument.
http://vnunet.com/ nym. W przeciwieństwie do Windows Vi- nie się widoczne nawet jeśli jest pod inny-
sta (w trakcie tworzenia znanego jako Lon- mi. Dotyczy to też pulpitu. Gadżety nie mu-
Google przeszukuje ghorn), tym razem Microsoft bardzo nie- szą już działać na sidebarze, mogą być uru-
skanowane dokumenty chętnie mówi o planowanej dacie wydania chomione także na pulpicie. Zmiany doty-
W wyszukiwarce Google dodano możliwość
nowego systemu – żadne prawdziwie ofi- czą także zasobnika systemowego. Domyśl-
przeszukiwania plików PDF, które zawiera-
ją skany papierowych dokumentów. Wyko- cjalne oświadczenie jeszcze nie padło. Ma nie nowe ikonki są niewidoczne i użytkow-
rzystywana jest do tego otwarta technologia to jednak sens - doświadczenie pokazuje nik sam musi zadecydować czy mają być wi-
OCRopus bazująca na oprogramowaniu Tes- bowiem, że późniejsze przesuwanie termi- doczne.
seract, opracowanym przez HP. Google próbo- nu źle wpływa na wizerunek firmy i opi- Zmieniono także funkcjonalność niektó-
wało wykorzystać tę technologię już rok temu, nię o samym produkcie... Jak ta sprawa po- rych z nich aby ułatwić niektóre zadania,
jednak wynikły przy tym problemy technicz-
toczy się w rzeczywistości – pokaże czas. Na np. przełączanie się pomiędzy sieciami Wi-
ne, do których rozwiązania trzeba było zatrud-
nić dodatkowych inżynierów. To jak obecnie ten moment warto przytoczyć kilka szczegó- Fi. W eksploratorze pojawiły się tzw. biblio-
działa nowa funkcjonalność można się prze- łów odnośnie tego, cóż Microsoft może nam teki – echo dosyć rewolucyjnego w założe-
konać szukając w przeglądarce Google takich zaserwować w prezencie na kolejną Gwiazd- niach systemu plików WinFS, który miał
fraz jak repairing aluminum wiring czy spin lock kę. Dużą zmianę czeka pasek zadań. Przyci- być jednym z filarów Visty a okazał się nie-
performance. Wybierając podgląd jako HTML ski nie będę miały już etykiet tekstowych, wypałem. Dzięki bibliotekom użytkownicy
można przekonać się, że faktycznie skany
zostaną same ikonki, które teraz będą dużo będą mogli tworzyć wirtualne katalogi za-
zostały rozpoznane jako tekst, który da się
zaznaczyć czy skopiować. Minusem rozwiąza- większe. Nareszcie będzie można zmieniać wierające pliki znajdujące się w rzeczywisto-
nia jest to, że gubione są rysunki; zachowywa- ich kolejność. ści w różnych fizycznych lokalizacjach. Poja-
ny jest jednak tekst w nich umieszczony. Trochę inaczej działa grupowanie. Po klik- wiło się także nowe zintegrowane narzędzie
http://www.google.com/ nięciu ikonki programu pojawiają się minia- do zarządzania urządzeniami przenośnymi.
Okrągłe menu kontekstowe Mozilli? turki poszczególnych jej okien. Ponadto przy System Windows 7 prezentowano na kom-
Standardowy model menu kontekstowe- kliknięciu prawym przyciskiem myszy poja- puterze z procesorem 1 GHz i 1 GB RAM.
go, w którym dostępne opcje umiejscowio- wia się tzw. Jump List, zawierająca różne ak- Zamierzeniem korporacji jest takie zapro-
ne są jedna pod drugą, towarzyszy nam od cje związane z daną aplikacją. Na przykład jektowanie systemu, aby mógł on działać
lat i z pewnością wielu użytkownikom tego dla Windows Media Playera będą to m.in. na wielu różnych rodzajach komputerów
typu rozwiązanie wydaje się jedynym moż-
ostatnio oraz najczęściej odtwarzane utwory. PC. W przeciwieństwie do Visty, Windows
liwym. Innego zdania są projektanci inter-
fejsów, którzy nieustannie szukają nowych, Podobnie swoje dodatkowe menu zyskają po- 7 nie jest projektowany tylko dla droższego
bardziej użytecznych rozwiązań. Jednym z zycje w panelu startowym. Programiści będą sprzętu, który przy odrobinie szczęścia sta-
takich właśnie projektantów jest Jono DiCar- mogli dostosowywać Jump Listy za pomocą nieje do czasu premiery. Ma też działać wy-
lo pracujący dla Fundacji Mozilla. Zapropo- odpowiedniego API. Pojawiły się też ciekawe dajne na tańszych i prostszych systemach, w
nował on zmiany w prezentacji zawartości zmiany w zarządzaniu oknami. Przeciągnię- tym zyskujących ostatnio coraz większą po-
menu kontekstowego, które mogłyby wpły-
cie okna do górnej krawędzi ekranu powodu- pularność małych urządzeniach typu netbo-
nąć na wygodę obsługi aplikacji przez użyt-
kownika. Jego zdaniem godnym uwagi roz- je maksymalizację a do krawędzi bocznej ta- ok, np. Asus Eee PC, które zazwyczaj takto-
wiązaniem jest menu kontekstowe oparte o ką zmianę wymiarów i położenia, żeby okno wane są zegarem około 1 GHz i oraz dyskiem
model okręgu, w którym każda z dostępnych zajmowało odpowiednio lewą lub prawą po- SSD o pojemności 16 GB. Według Microso-
opcji jest usadowiona w tej samej odległości łowę ekranu. Ciekawą funkcją jest też moż- ftu Windows 7 może działać na takim kom-
od punktu początkowego. Dla użytkowni- liwość zerkania na okno bez potrzeby prze- puterze całkiem wydajnie i to ze sporym za-
ków Firefoksa 3 DiCarlo przygotował prostą
demonstrację swojego pomysłu; dostępna
łączania się na nie. Jeśli wskażemy na minia- pasem.
jest ona na jego stronie internetowej (http:// turkę okna wywołaną z paska zadań wówczas http://www.cnet.com/
people.mozilla.com/~jdicarlo/piemenus.html). wszystkie pozostałe okna zrobią się przezro-
http://www.webmonkey.com/ czyste zostawiając tylko krawędź. Dzięki te-

6 01/2009
Aktualności

Ubuntu 8.10 Microsoft Boku: zrób sobie grę


Boku to język programowania wizualne-
go przygotowywany przez firmę Microsoft

F
irma Canonical udostępniła na swoich mAV oraz SpamAssassin. Wychodząc na prze- do tworzenia gier. Całość ma być niezwykle
serwerach Ubuntu w wersji 8.10 o na- ciw użytkownikom systemów firmy RedHat prosta w obsłudze i jest pomyślana głównie
zwie kodowej Intrepid Ibex. W obecnej umożliwiono zarządzanie usługami w systemie pod najmłodszych programistów. Środowi-
wersji zawarto środowisko graficzne Gnome poprzez polecenie service (podobnie jak to jest sko aplikacji działa obecnie na konsoli Xbox
360 i pozwala na wprowadzanie wszelkich
2.24; Pojawił się w nim Nautilus, który został w RHEL). Administratorzy większej ilości ser- zmian przy użyciu standardowego kontro-
wzbogacony o możliwość przeglądania folderów werów opartych o Ubuntu będą mogli skorzy- lera, bez pomocy klawiatury. Podstawą jest
z zakładkach. Dodatkowo File Roller został roz- stać z usługi Landscape, autorskiego projektu tutaj starannie przemyślany interfejs, bowiem
budowany o obsługę formatów archiwów: ALZ, firmy Canonical, który pozwala na zarządzanie język programowania oparty został w całości
RZIP, CAB, TAR.7Z. X.Org 7.4, który został za- serwerami z poziomu strony internetowej. Ser- na ikonkach. Dany program składa się odpo-
wiednio ze stron, te podzielone są na zasady
warty w wydaniu wnosi wiele poprawek w ob- werowa edycja systemu będzie wspierana przez
i dalej na warunki oraz akcje. Warunki rozpa-
słudze tabletów, klawiatur i myszy. Wyelimi- 18 miesięcy. Wraz z premierą Ubuntu pojawiły trywane są równocześnie. Boku to próba upo-
nowano błąd znany z wersji Ubuntu 8.10 RC się jego zmodyfikowane wersje, oparte o alterna- wszechnienia łatwego, intuicyjnego kodowa-
związany z binarnymi sterownikami firmy nVi- tywne środowiska graficzne. Kubuntu 8.10 zo- nia gier. Oprogramowanie zapewnia interak-
dia, uniemożliwiający uruchomienie sterowni- stanie domyślnie oparte o środowisko graficzne tywne środowisko, które nawet najmłodszym
ka pod zawartym w dystrybucji X.Org 7.4. No- KDE w wersji 4.1.2. Wersja trzecia popularnego powinno umożliwić szybkie stworzenie pro-
stego programu do zabawy. Dostają oni do
wością jest tryb przywracania ustawień w przy- środowiska przestanie być oficjalnie dostępna.
dyspozycji między innymi: edytor terenu, 20
padku błędnej konfiguracji pliku xorg.conf. Ca- Ponadto zaktualizowano graficznego menadże- różnorakich postaci z odmiennymi umiejęt-
nonical zdecydowało się na dołączenie prostego ra pakietów Adept do wersji 3.0, port Network nościami, mogą również dzielić się swoimi
narzędzia do obrazu instalacji systemu na dys- Managera dla środowiska KDE oraz poprawio- kreacjami z innymi.
kach przenośnych, które może zostać wykorzy- no menadżera powiadomień o aktualizacjach. Z http://www.gamikaze.pl/
stane do uruchomienia Ubuntu w trybie Li- kolei w Xubuntu 8.10 dostarczone zostało śro-
XNA Game Studio 3.0
ve, jaki i dysku instalacyjnego. Użytkownik zy- dowisko graficzne Xfce w wersji 4.4.2. Ponadto Microsoft udostępnił pakiet XNA Game Studio
skał możliwość zaszyfrowania swojego katalo- aktualizacji został poddany popularny procesor 3.0. Jest to zestaw narzędzi umożliwiający
gu przy pomocy narzędzi ecryptfs-utils. Rozbu- tekstu Abiword, który umożliwia osadzanie ar- tworzenie gier wideo działających pod sys-
dowano applet szybkiego przełączania użytkow- kuszy kalkulacyjnych Gnumeric wewnątrz do- temem Windows, na odtwarzaczu Zune czy
na konsoli Xbox 360. Ponadto pakiet ten jest
ników o możliwość zalogowania na komputerze kumentu, ułatwia pracę w czasie rzeczywistym
wymagany, aby przedstawiać swoje produk-
na konto gościa; taki użytkownik nie ma praw do kilku osób nad tym samym dokumentem oraz cje na Xbox LIVE Community Games. Publi-
przeglądania folderów domowych. Applet prze- umożliwia otwieranie dokumentów wprost z za- kowane są tam gry stworzone nie przez profe-
łączania użytkowników został ponadto zintegro- sobów sieciowych (poprzez samba, ftp lub ssh). sjonalne studia, lecz przez amatorów, a twórcy
wany z komunikatorem internetowym Pidgin ( Wydaniu Ubuntu towarzyszyło kilka zgrzytów. mają szansę pokazania swojego wirtualnego
inne programy w przyszłości będą mogły zostać Wśród oficjalnych pakietów zabrakło wydane- świata posiadaczom Xboxa LIVE. Jak podaje
producent, nowe XNA posiada zoptymalizo-
zintegrowane z nim przez ich autorów ). Odtwa- go niedawno OpenOffice 3.0, który wprowadza
wane biblioteki cross-platformowe oparte
rzacz multimedialny Totem został zintegrowany między innymi możliwość odczytywania doku- na technologii NET.Framework, co może
poprzez plugin z serwisem podcastów BBC. Jest mentów z pakietu Microsoft Office 2007. Ope- być małą rekompensatą tego, że pakiet ten
to już drugie rozszerzenie tego typu – w prze- nOffice 3.0.1 wedle zapowiedzi powinien poja- współpracuje obecnie tylko z Visual C# 2008.
szłości użytkownicy programu Totem otrzyma- wić się w repozytoriach jako backport. W ostat- Microsoft podtrzymuje swoje stanowisko
li możliwość oglądania filmów z serwisu YouTu- niej chwili wycofano klienta VoIP Ekiga 3.0, w i z nowego XNA można korzystać całkowicie
bezpłatnie. Wspomniane oprogramowanie
be. W Ubuntu pojawił się pakiet NetworkMana- którym wykryto błąd uniemożliwiający umiesz-
można pobrać ze strony Microsoftu pod adre-
ger w wersji 0.7, który został wydany w lipcu. czenie programu w standardowej instalacji. Po- sem http://www.microsoft.com/downloads/
Umożliwia on konfigurację połączeń z sieciami prawioną wersję będzie można pobrać z repozy- details.aspx?FamilyId=7D70D6ED-1EDD-4852-
3G (GSM/CDMA), pracę z kilkoma urządzenia- toriów dystrybucji. Domyślny motyw graficzny 9883-9A33C0AD8FEE&displaylang=en.
mi sieciowymi na raz. Pojawiła się również Sam- pomimo niezadowolenia wielu użytkowników http://www.microsoft.com/poland
ba w wersji 3.2. Umożliwia ona współpracę w nie został znacząco zmodyfikowany. Mark Shut- Bill Gates zakłada think tank
klastrach serwerów oraz w sieciach opartych o tleworth zakłada, że przy kolejnej wersji Ubun- Bill Gates po odejściu z Microsoftu nie próż-
IPv6. Canonical przygotował również wersję ser- tu, której nazwa kodowa to Jaunty Jackalope, zo- nuje. Powołał do życia nowe przedsięwzię-
werową swojego systemu. Różni się ona przede stanie położony nacisk na optymalizację i ulep- cie: think tank o nazwie bgC3 LLC. Litera C
wszystkim metodą kompilacji jądra, które zosta- szenie obecnych już w systemie opcji, jak rów- pochodzi od słowa catalyst a liczba 3 mówi,
że jest to trzecie przedsięwzięcie po Micro-
ło dostosowane do pracy pod wirtualnymi ma- nież startu samego systemu. Wersji stabilnej
sofcie i Fundacji Billa i Melindy Gates. Jest
szynami. Ubuntu Server Edition może również Jaunty Jackalope należy się spodziewać w kwiet- to niekomercyjny projekt, który ma pomóc
służyć jako host dla maszyn wirtualnych. Zażą- niu 2009 roku. Canonical podało również mini- Gatesowi w koordynacji działań na polu
dzanie hiperwizorami Xen i KVM ułatwi nowe malne i zalecane wymagania systemowe dla sys- technologii, filantropii oraz zagadnień spo-
narzędzie - VM-Builder, potrafiący dynamicznie temu. Aby uruchomić nowe Ubuntu wymaga- łecznych. Zajmować się będzie analiza-
przydzielać rdzenie oraz zmieniać ilość pamię- ny jest komputer z procesorem 300 Mhz, 64 MB mi i badaniami rynku IT, a także projekto-
waniem i tworzeniem oprogramowania i
ci w zależności od potrzeb konkretnej maszyny pamięci RAM oraz 4GB wolnego miejsca na dys-
urządzeń. bgC3 ma swoją siedzibę w Kir-
wirtualnej. Rozpoczęto wsparcie dla technolo- ku. Zalecana jest natomiast następująca konfigu- kland, niedaleko domu Gatesa nad jezio-
gii związanych z Javą: Apache Tomcat 6.0 oraz racja: procesor 700 Mhz, 384 MB pamięci RAM rem Washington. Ma tam pracować około
OpenJDK oraz dla pakietów odpowiedzialnych oraz 8 GB wolnego miejsca na dysku. 40-60 osób.
za bezpieczeństwo danych na serwerze: Cla- http://www.ubuntu.com/ http://dobreprogramy.pl/

www.sdjournal.org 7
Aktualności

WorldWide Telescope 2.2:


wirtualny wszechświat od Microsoftu
WorldWide Telescope to darmowe opro-
Webowy Office oficjalnie
P
gramowanie przeznaczone do wizualiza- odczas konferencji PDC Microsoft ogło- rzy zakupią wersję desktopową. Przewidywa-
cji wszechświata przygotowane przez firmę sił oficjalnie to, o czym mówiło się od na jest również wersja wyświetlająca reklamy.
Microsoft. Aplikacja jest swego rodzaju wirtual- dawna: powstaną webowe wersje Wor- Jak można było oczekiwać, wersja webowa bę-
nym teleskopem skupiającym trójwymiarowe da, Excela, PowerPointa i OneNote. Biurowe dzie dużo uboższa od desktopowej. Nadal jed-
wizualizacje wszechświata oraz zdjęcia zebra-
narzędzia webowe, takie jak Google Docs, two- nak posiadać będzie wiele użytecznych funkcji.
ne przez kosmiczne teleskopy. Dzięki WorldWi-
de Telescope każdy fan astronomii czy ogląda- rzone są z myślą o współdzieleniu dokumen- Dzięki użyciu technologii Silverlight webowy
nia nieba może odbyć fantastyczną podróż, w tów oraz ich jednoczesnej edycji przez wie- Office będzie mógł np. wyświetlać dokumen-
której może zobaczyć m. in. jak pył w Drodze lu użytkowników. Na PDC Microsoft pokazał ty korzystające z rzadkich czcionek, nieobec-
Mlecznej skrapla się do gwiazd i planet czy w dwóch użytkowników pracujących nad doku- nych na komputerze na którym działa aplika-
jaki sposób kształtowała się galaktyka miliardy mentem OneNote 14. Jeden z nich korzystał z cja. Wykorzystanie Silverlight ma też zapewnić
lat temu. Większość elementów dostępnych
w wirtualnym kosmosie oferowanym przez
desktopowej wersji OneNote, zaś drugi z webo- poprawne działanie pakietu w IE8, Firefoksie
WorldWide Telescope można dowolnie przy- wej. Synchronizacja może więc następować nie- i Safari. Pod adresem http://www.eweek.com/c/
bliżać i oddalać. Ta funkcjonalność sprawia, zależnie czy wykorzystywana jest desktopowa a/Cloud-Computing/Images-of-Microsoft-Offi-
że każdy może bez żadnych przeszkód spoj- czy webowa wersja programu. Webowy Office, ce-Web-Applications/?kc=rss dostępne są zrzuty
rzeć na planety, księżyce, gwiazdy właściwe z choć potencjalnie mógłby działać samodziel- ekranowe z wersji testowej prezentowanej pod-
dowolnego miejsca w galaktyce. WorldWide
nie, ma być dodatkiem do tradycyjnego pakie- czas konferencji.
Telescope poza wizualizacjami galaktyk oferu-
je również wiele przydatnych artykułów tema- tu Office i będzie dostępny dla klientów, któ- http://dobreprogramy.pl
tycznych pochodzących z różnych źródeł oraz
wiele terabajtów zdjęć pozwalających poznać
wszechświat z bliska.
http://www.worldwidetelescope.org Komunikator weblin
Cisco przejęło firmę Jabber Inc.
Cisco, największe amerykańskie przedsię-
w świątecznej odsłonie
W
biorstwo teleinformatyczne, dokonało prze- eblin to platforma społeczna W związku ze zbliżającymi się Świętami Bo-
jęcia firmy Jabber Inc. zajmującej się tworze- umożliwiająca komunikację w in- żego Narodzenia weblin oferuje swoim użyt-
niem własnej implementacji protokołu XMPP. ternecie. Dzięki weblin możliwe kownikom specjalne świąteczne funkcje. Już od
Na początku swojej działalności Cisco zajmo-
jest zobaczenie osób serfujących w tym samym 6 grudnia mogą bowiem weblini poczuć wyjąt-
wało się wyłącznie produkcją urządzeń prze-
znaczonych do trasowania, jednak z czasem czasie na tej samej stronie. Logując się w weblin kową atmosferę świąt. Wtedy to można będzie
ofertę firmy rozszerzono o zapory siecio- każdy wybiera swój osobisty awatar, pod którym nabyć np. specjalny 12-częściowy zestaw upo-
we, oprogramowanie wspomagające zarzą- jest się widocznym dla innych uczestników. Oso- minkowy w sklepie weblina. Można wybierać
dzanie sieciami komputerowymi, przełączni- by oglądające tą samą stronę są dla siebie od razu także świąteczne awatary, pod którymi będzie
ki oraz wiele innych produktów i usług zwią-
widoczne, mogą nawiązać kontakt i czatować na się widocznym na każdej stronie internetowej.
zanych z teleinformatyką. Teraz, po przejęciu
firmy Jabber, przedsiębiorstwo Cisco rozsze- wspólne tematy, np. związane z treściami publi- Są to np. Święty Mikołaj, bałwanek, anioł, re-
rzy zasięg swoich aktualnych usług o moż- kowanymi na danej stronie. Na początku wrze- nifer, kominiarz itd. a cztery dodatkowe awa-
liwości jakie niesie ze sobą wykorzystanie śnia 2008 została osiągnięta liczba pierwszego tary dostępne będą po aktywacji specjalnego al-
protokołu XMPP. Finalizacja zakupu zostanie miliona użytkowników. Weblin cieszy się coraz bumu kolekcyjnego. Poraz kolejny organizowa-
dokonana w pierwszej połowie roku podat- większą popularnością na całym świecie: Niem- ny jest specjalny quiz a najlepsi spośród uczest-
kowego 2009. Warunki finansowe przejęcia
cy, Wielka Brytania, Francja, Hiszpania, USA a ników konkursu otrzymają drobne upominki.
Jabber Inc. nie zostały ujawnione. Pracownicy
Jabber staną się częścią niedawno utworzonej także Chiny, Japonia, Indie, Ameryka Południo- Hitem dla szczęśliwych znalazców jest szansa na
grupy Software Group, w skład której wcho- wa, Europa Wschodnia i Środkowa. zgarnięcie prezentów ukrytych na różnych stro-
dzą osoby odpowiedzialne m. in. za tworzenie Również w Polsce zyskuje weblin coraz większą nach internetowych. Weblini, którzy często ser-
sieciowego systemu operacyjnego IOS, zarzą- sympatię wśród internautów. Jako jedyni w Euro- fują po sieci z awatarymi, będą w ten sposób wy-
dzania sieciami i usługami, rozwiązań Unified pie Wschodniej i Środkowej mogą korzystać pol- nagrodzeni za swoją dostrzegawczość. Także lo-
Communications i SaaS.
scy użytkownicy z poskiej wersji strony głównej. go weblina zostanie opracowane aby jeszcze bar-
http://www.cisco.com/
Liczba polskich uczestników osiągnęła już pię- dziej podkreślić niepowtarzalną atmosferę Świąt
Jądro Linuksa ma już ciocyfrową wartość. W ostatnim czasie rozwija i przenieść ją na strony internetu.
10 milionów linii kodu się ona w niebywałym tempie: na wrzesień 2008
Analiza najnowszej wersji jądra Linuksa poka- oczekiwany jest po raz pierwszy wzrost liczby no-
zuje, iż suma linii ze wszystkich plików znajdu-
wych użytkowinków o pięciocyfrową wartość.
jących się w drzewie kodu źródłowego prze-
kroczyła 10 milionów. Dotyczy to wszystkich Polscy weblini to bardzo aktywni czaterzy. Naj-
linii, także pustych, komentarzy i plików tek- częściej odwiedzane przez nich strony to na przy-
stowych, które nie zawierają kodu. Dzięki kład nasza-klasa.pl albo allegro.pl.
narzędziu SLOCCount można policzyć fak- Ważnym aspektem komunikatora jest fakt,
tyczną ilość linii czystego kodu. Wynosi ona iż zarówno usługi podstawowe np. czat i usta-
obecnie 6399191, z czego 96,4% jest w języku
C a 3,3% w asemblerze. Inne języki to margi-
wienia profilu, jak też dodatkowe serwisy np.
nes, np. skrypty perla pomocne przy budowa- wysyłanie wirtualnych prezentów dla znajo-
niu jądra stanowią 0,1%. mych, gromadzenie wirtualnych punktów itd.
http://www.slashdot.org/ - są w pełni darmowe.

8 01/2009
Aktualności

Ranking Tiobe: Creative udostępnia


sterowniki na wolnej licencji

zamknięcie roku 2008


Creative Technology Ltd. poinformowa-
ła o wydaniu sterowników kart dźwięko-
wych dla systemu Linux w postaci źródeł

Z
godnie z coroczną tradycją zamieszcza- to niewątpliwie kosztem jego największych kon- na licencji GPLv2. Sterowniki współpra-
my podsumowanie roku dla rankingu kurentów: Perla i Rubiego, które z kolei odnotowa- cują z modelami: Sound Blaster X-Fi Tita-
nium Fatal1ty Champion Series, Sound
prowadzonego przez Tiobe. Ranking ten ły wysoki spadek zainteresowania (spadek o odpo-
Blaster X-Fi Titanium Fatal1ty Professio-
bada popularność języków programowania. Re- wiednio 3 i 2 miejsca w dół). W społeczności Py- nal, Sound Blaster X-Fi Titanium Profes-
guły tworzenia rankingu opisane są pod adresem thon'a rzeczywiście w tym roku dużo się dzia- sional Audio, Sound Blaster X-Fi Tita-
http://www.tiobe.com/content/paperinfo/tpci/tpci_de- ło – świadczy o tym chociażby dostępna aktual- nium, Sound Blaster X-Fi Elite Pro, Sound
finition.htm. W przedstawionej tabeli wyszczegól- nie druga wersja Release Candidate Python 3.0. Blaster X-Fi Platinum, Sound Blaster X-Fi
nić można sześć kolumn. Pierwsza z nich okre- Tymczasem użytkownicy Perla nie mogą nadal Fatal1ty, Sound Blaster X-Fi XtremeGa-
mer oraz Sound Blaster X-Fi XtremeMu-
śla aktualną pozycję danego języka w rankingu doczekać się na 6 odsłonę tego popularnego języ- sic. Dostępne są one zarówno dla platfor-
(przedstawione tam dane odnoszą się do listopada ka skryptowego. Ruby oraz Ruby on Rails zyskują my 32 bitowej, jaki i 64 bitowej. Wprowa-
2008 roku). Druga kolumna zawiera listę pozycji z kolei coraz większą konkurencję w postaci alter- dzono w nich obsługę długo oczekiwa-
sprzed dwunastu miesięcy (listopad 2007). Trze- natywnych rozwiązań opartych między innymi nego ALSA PCM Playback, jak również
cia kolumna przedstawia nazwy języków, czwar- na... Pythonie (np. Django czy Pylons). Ciekawe ALSA Record oraz ALSA Mixer. W komu-
nikacie zaznaczono, że oprogramowanie
ta – offset pozycji danego języka w skali roku. Pią- jak współzawodnictwo między tymi trzema języ-
dostarczone z płytą CD nie będzie dzia-
ta i szósta kolumna zawierają statystyki procento- kami potoczy się w roku 2009. Innym ciekawym łało poprawnie z tymi sterownikami. Ste-
we. Przeglądając poniższą tabelę trudno nie poku- faktem, który da się wyczytać z rankingu to znacz- rowniki wraz z instrukcją instalacji w sys-
sić się o małe podsumowanie. Czy rok 2008 przy- ny wzrost zainteresowania Pascalem i Delphi (oby- temie można pobrać na stronie produ-
nisó nam rewolucję w dziedzinie języków progra- dwa z nich odnotowały w tym roku skok o 3 punk- centa. Udostępnienie sterowników na
mowania? Krótka odpowiedź brzmi: nie. Na po- ty). Największy skok w pierwszej dwudziestce od- wolnej licencji umożliwi zapewne twór-
com dystrybucji na dostarczenie ich wraz
czątku listy do kilku lat niezmiennie utrzymują notował ActionScript (aż 7 punktów do przodu)
ze swoimi produktami. Tak było w przy-
się znajome „twarze”: Java, C, C++, PHP czy Vi- – jak widać zabiegi Adobe nie poszły na marne. In- padku innych producentów sprzętu: HP
sual Basic. Java i C utrzymują się na pierwszych teresujące jest w jaki sposób rynek zareaguje na ję- oraz Brother.
dwóch miejscach już od kilku dobrych lat. W tym zyk JavaFX firmy Sun. Niewątpliwie będzie to du- http://arstechnica.com/
roku do góry podskoczyło C++ osiągając wysoką, ży konkurent ActionScriptu... Największym prze-
Microsoft ucina
trzecią pozycję. W górę sukcesywnie pną się Py- granym w pierwszej dwudziestce jest Lua (spadek
spekulacje co do zakupu Yahoo!
thon i C#. Ten pierwszy język bardzo ładnie wy- o 4 punkty). Prezes Microsoftu, Steve Ballmer, uciął
bił się w tym roku, lądując na 6 miejscu. Stało się http://www.tiobe.com ostro narastające po raz kolejny speku-
lacje co do możliwego porozumienia
Tabela 1. Zestawienie najpopularniejszych języków programowania (listopad 2008) pomiędzy Microsoftem a Yahoo!, po tym
jak pojawiły się niepotwierdzone infor-
Najpopularniejsze języki programowania (za http://www.tiobe.com)
macje, że Microsoft i Yahoo! prowadzą
Pozy- Pozycja Nazwa języka Zmiana Udział procentowy Zmiana od 11/2007 zaawansowane rozmowy i są bliskie fina-
cja 11/ 11/2007 pozycji 11/2008 lizacji transakcji. Atmosferę podgrzewał
2008 sam prezes Yahoo!, Jerry Yang, który w
1. 1. Java 0 20.299% -0.24% wywiadzie stwierdził, że nadal uważa
porozumienie z Microsoftem za najlep-
2. 2. C 0 15.276% +1.31%
szą drogę rozwoju dla swojej firmy. Bal-
3. 4. C++ +1 10.357% +1.61% lmer wylał jednak na rozgrzane głowy
4. 3. (Visual) Basic -1 9.270% -0.96% spekulantów kubeł zimnej wody twier-
dząc wprost, że jego firma firma ma
5. 5. PHP 0 8.940% +0.25% już następne plany, a do tamtej sprawy
6. 7. Python +1 5.140% +0.91% wracać nie zamierza. Przypomnijmy, że
7. 8. C# +1 4.026% +0.11% Microsoft zaproponował w lutym 2008
roku firmie Yahoo! przejęcie za ponad
8. 11. Delphi +3 4.006% +1.55% 44,6 miliardów dolarów, czyli 31 dola-
9. 6. Perl -3 3.876% -0.86% rów za akcję. Ówczesny zarząd Yahoo!
nie chciał jednak zgodzić się na taką, w
10. 10. JavaScript 0 2.925% 0.00%
jego ocenie niską cenę. W rezultacie po
11. 9. Ruby -2 2.870% -0.21% kilku miesiącach nieudanych negocja-
12. 12. D 0 1.442% -0.26% cji, mimo podniesienia ceny, Microsoft
ofertę wycofał. Cała operacja sporo kosz-
13. 13. PL/SQL 0 0.939% -0.24%
towała Microsoft, zaś Yahoo! po szyb-
14. 14. SAS 0 0.729% -0.40% kim giełdowym wzlocie również straciło.
15. 18. ABAP +3 0.570% -0.08% Aktualnie akcje Yahoo! wyceniane są na
giełdzie na niecałe 14 dolarów.
16. 19. Pascal +3 0.511% -0.13% http://www.itnews.com.au/
17. 17. COBOL 0 0.510% -0.20%
18. 25. ActionScript +7 0.506% +0.04%
19. 23. Logo +4 0.489% -0.04%
20. 16. Lua -4 0.473% -0.27%

www.sdjournal.org 9
Aktualności

Microsoft błaga
producentów: twórzcie sterowniki
Podczas konferencji WinHEC Microsoft ape-
IntelliJ Idea 8
F
lował do producentów sprzętu, by ci poważ- irma JetBrains wydała ósmą wersję popu-
nie potraktowali kwestię tworzenia sterow- larnego środowiska programistycznego
ników do swoich urządzeń dla Windows 7 IntelliJ Idea. Środowisko to przeznaczone
i szybko wzięli się do pracy. Microsoft liczy jest do tworzenia aplikacji w oparciu o język Java. ne na UML oraz obsługę silnika JBoss Seam. Po-
na odbudowanie zaufania użytkowników
W nowej wersji dodano obsługę języka SQL. Moż- jawił się wbudowany debugger dla JavaScript i
Visty, którzy w chwili premiery byli praktycz-
nie pozbawieni sterowników do większości liwa jest teraz edycja procedur i wykonywanie za- Adobe Flex. Ulepszono obsługę Mavena dodając
podstawowych urządzeń. Wina leży jednak pytań bezpośrednio z IDE. Dostępne są też różne przeglądarkę repozytorium oraz obsługę archety-
także po stronie Microsoftu: to nie produ- dodatki dostosowane do specyfiki różnych dialek- pów. Dodano obsługę języków szablonowych Fre-
cenci sprzętu wielokrotnie przekładali datę tów języka SQL. Ulepszono również wsparcie dla eMarker i Velocity. Rozszerzono wsparcie dla silni-
premiery systemu, przez co firmy nie mogły samej Javy. Dodano 7 nowych mechanizmów re- ków Spring, w tym Spring 2.5, Spring Web Flow,
zaplanować z dostatecznie dużym wyprze-
dzeniem prac nad sterownikami i w efekcie
faktoryzacji, nowe inspekcje kodu, nowe narzędzia Spring MVC oraz Spring Dynamic Modules. Do-
w momencie faktycznej premiery większość do testów jednostkowych, a także wiele innych no- dano też wsparcie dla Struts 2, Google Web Tool-
nie była jeszcze gotowa. Teraz Microsoft wych funkcji. Usprawniono również silnik inte- kit 1.5 i REST (Representational State Transfer).
zapowiada, że tworzenie sterowników do ligentnego uzupełniania kodu. Firmie JetBrains Twórcy IntelliJ Idea 8 planują, iż narzędzie to w
Windows 7 powinno być procesem znacz- udało się znacznie przyspieszyć pracę środowiska. przyszłości posłuży jako baza do tworzenia dwóch
nie łatwiejszym: o ile w Viście model obsługi
Szybciej się ono uruchamia, szybciej budowane są nowych IDE: dla Rubiego i Pythona.
sprzętu zmienił się znacznie w porównaniu
do Windows XP, tak teraz korporacja obie- projekty, a także szybciej działa obsługa CVS. Do- http://www.eweek.com/
cuje, że to co działało w Windows Vista prak- datkowo wprowadzono diagramy klas wzorowa-
tycznie powinno działać także w najnowszej
edycji systemu. Potrzebne będą więc jedy-
nie niewielkie zmiany. Dodatkowym uła-
twieniem dla producentów ma być szeroki, Nowości
w Windows Server 2008 R2
publiczny program beta – Microsoft planuje
uruchomić go na początku 2009 roku.
http://apcmag.com/

Z
mian planowanych na Windows Se-
Microsoft daje rver 2008 R2, a ogłoszonych podczas
oprogramowanie start-up'om!
Professional Developers Conference
Microsoft uruchomił w ramach inicjatywy
Startup Zone nowy program nazwany Biz- jest niespodziewanie dużo. Te najbardziej zna-
Spark, w ramach którego tzw. start-up'y ne i najszerzej komentowane to brak 32-bito-
– małe, rozwijające się firmy z branży IT – wej edycji, dodanie Live Migration do Hyper-V
mogą otrzymać (prawie) za darmo imponu- oraz dołączenie nowej wersji PowerShella (2.0).
jący pakiet oprogramowania i usług Micro-
Warto w tym miejscu wspomnieć o kilku in-
soft. Mimo, że inicjatywa ogłoszona zosta-
ła podczas konferencji Web 2.0 w odle- nych, może mniej popularnych, ale również
głym San Francisco, jej zasięg jest globalny ciekawych nowościach. Przykładowo IIS prze-
i otwarta jest ona także dla polskich przed- szedł tak dużą metamorfozę, że zespół produk-
siębiorców. Kryteria kwalifikacji są proste towy zastanawia się, czy nie podnieść mu nu- padku awarii jednego połączenia klienci będą
- firma musi być prywatna, musi tworzyć meru wersji: są nowe wbudowane rozszerzenia, automatycznie komunikować się ze zdalną lo-
oprogramowanie, działać nie dłużej niż
integracja z nową usługą FTP i providerem Po- kalizacją przy pomocy alternatywnej ścieżki.
trzy lata i nie przekraczać 1 mln USD rocz-
nego przychodu (500 tys USD w przypadku werShella oraz obsługa ASP.NET na Server Co- Z ciekawszych nowości warto wymienić jesz-
Polski) oraz stworzyć przy pomocy wspar- re. Zmiany pojawiły się także w tak prostych cze rozbudowanego BitLockera, który teraz bę-
cia działającą w sieci usługę w modelu usługach jak serwer DHCP; wreszcie dodano dzie pozwalał zaszyfrować dyski wymienne, ta-
software as service. Co można otrzymać? Za przejrzystą i łatwą w konfiguracji opcję klastro- kie jak np. klucze USB, co było dotychczas bar-
symboliczną opłatą 100 USD (wymaganą wania, gdzie dwa serwery obsługują ten sam za- dzo pożądaną, ale niestety niewykonalną czyn-
dopiero w momencie zakończenia uczest-
kres i synchronizują się. Częściowo zapomnia- nością. Oczywiście całość będzie możliwa do
nictwa w programie) firmy spełniające
powyższe kryteria mogą otrzymać między na konsola Server Manager zyska wyczekiwaną zarządzania z poziomu GPO. Kiedy Windows
innymi subskrypcję MSDN, narzędzia Visual od dawna, wydawałoby się naturalną funkcjo- Server 2008 R2 będzie dostępny? Premiera
Studio, bazy SQL Server, systemy Win- nalność podłączania do zdalnych serwerów. Są planowana jest aktualnie na pierwszy kwartał
dows (Server), serwery SharePoint, Exchan- również drobnostki, które mimo wszystko po- 2010 roku, czyli kilka miesięcy po Windows 7.
ge, narzędzia z rodziny System Center czy
trafią bardzo ucieszyć: na przykład nowy kon- Wcześniej z pewnością pojawią się jednak wer-
rozwiązania z platformy Windows Azure.
Pełna lista jest naprawdę imponująca, zna- tener Kosz dla usuniętych obiektów domeno- sje beta, także publiczne. Póki co tych, którzy
leźć można ją w dokumencie PDF szczegó- wych... Interesująco zapowiada się także funk- mają ochotę na więcej informacji odsyłamy do
łowo opisującym całą inicjatywę. Przy tej cjonalność Branch Cache, która będzie umożli- 74-stronicowego dokumentu Windows Server
okazji warto wspomnieć także o ogłoszo- wiać cachowanie na serwerze w lokalizacji zdal- 2008 R2 Reviewers Guide (BETA), dostępne-
nych przez Microsoft planach rozszerzenia nej (np. w oddziale firmy) ruchu HTTP i SMB. go pod adresem http://download.microsoft.com/
innego programu DreamSpark skierowane-
Życie administratorów oddziałów będzie do- download/F/2/1/F2146213-4AC0-4C50-B69A-
go dotąd dla studentów, także dla uczniów
szkół średnich. datkowo ułatwione dzięki funkcji Agile VPN, 12428FF0B077/Windows_Server_2008_R2_
http://dobreprogramy.pl która pozwoli utrzymywać kilka ścieżek sie- Reviewers_Guide_(BETA).doc.
ciowych równocześnie, dzięki czemu w przy- http://www.techit.pl/

10 01/2009
Aktualności

Boost 1.37.0 Firefox ma już


20% udziału w rynku przeglądarek
Mozilla ogłosiła, że już co piąty inter-

O
d początku listopada 2008 roku nauta na świecie korzysta z przeglądar-
programiści C++ mogą cieszyć się ki Mozilla Firefox. Dane pochodzą z ser-
nową odsłoną Boost: zestawu nowo- wisu Net Applications, który śledzi użycie
czesnych i przenośnych bibliotek dla tego języ- przeglądarek na całym świecie. Z wykre-
su widać, że próg 20% został przekroczo-
ka. Boost uważany jest w wielu kręgach za roz-
ny cztery razy. Po wyciągnięciu średniej
szerzenie biblioteki standardowej C++. Opi- nia o Boost warto też wspomnieć o firmie Bo- dla poszczególnych tygodni okazuje się,
nie te nie są bynajmniej bezpodstawne – wiele ostPro Computing. Firma ta złożona jest z au- że w pierwszym tygodniu udział Firefok-
składników pakietu Boost zaakceptowano ja- torów kluczowych bibliotek wchodzących w sa w rynku wyniósł dokładnie 20,00%, w
ko elementy biblioteki standardowej opraco- skład pakietu, oferuje przede wszystkim usłu- kolejnych dwóch spadł do odpowiednio
wywanej w ramach nadchodzącego, nowego gi konsultingowo-szkoleniowe z zakresu two- 19,90% i 19,89% a następnie znów wzrósł
osiągając poziom 20,06%. Co prawda
standardu języka C++. Nowa odsłona Boost to rzenia oprogramowania przy pomocy nowo- średnia dla miesiąca wynosi 19,9%, więc
przede wszystkim uaktualnienie istniejących czesnych idiomów języka C++ ze szczegól- trochę za mało, ale Mozilla już uznała, że
bibliotek: Asio, Circular Buffer, Dynamic Bit- nym naciskiem na wykorzystanie bibliotek to wystarczy i można mówić o osiągnię-
set, Exception, Hash, Interprocess, Intrusi- wchodzących w skład Boost. To co może zain- ciu 20%. Tym bardziej, iż można spo-
ve, Math.Special Functions, Type Traits oraz teresować naszych Czytelników to fakt, iż fir- dziewać się, że popularność Firefoksa w
najbliższym czasie nie będzie maleć. W
Unordered. Jedyną nową, aczkolwiek bardzo ma ta udostępnia od jakiegoś czasu darmowe
Europie Firefox cieszy się uznaniem 30%
interesującą biblioteką dołączoną w aktualnej narzędzie BoostPro Binary Installer for Visu- użytkowników. W Polsce, według Ran-
odsłonie pakietu jest Proto, autorstwa Eric- al C++, który pobiera z sieci i instaluje pakiet king.pl, z przeglądarki tej korzysta obec-
ka Nieblera. Proto to framework pozwalają- Boost włącznie z prekompilowanymi kompo- nie aż 40% użytkowników.
cy implementować w C++ wbudowane języ- nentami binarnymi. Narzędzie to użytecz- http://www.mozilla.org/
ki specyficzne dla danej dziedziny (ang. Do- ne będzie dla posiadaczy kompilatorów Vi-
Nowy Gmail
main Specific Embedded Languages, DSEL) w sual C++ 7.1 (Visual Studio 2003), 8.0 (Vi- dla urządzeń mobilnych
opraciu o technikę tzw. szablonów wyrażeń sual Studio 2005), oraz 9.0 (Visual Studio Od przeszło dwóch lat, Google udostępnia
(ang. Expression Templates). Więcej informa- 2008). Można je pobrać pod adresem http: specjalną aplikację Java, oferującą dostęp
cji na temat tej ciekawej biblioteki można zna- //www.boostpro.com/products/free. do poczty Gmail za pomocą urządzeń
leźć pod adresem http://www.boost.org/doc/libs/ http://www.boost.org mobilnych (komórek i PDA). Teraz, korpo-
racja opublikowała kolejną, drugą, mobil-
1_37_0/doc/html/proto.html. Przy okazji pisa- http://www.boostpro.com/
ną odsłonę serwisu. Nowa wersja Gmaila
zawiera zarówno szereg nowych funkcji
i zestaw drobnych udogodnień. Przebu-
WebKit w IE? dowano w niej mechanizm przetwarza-
nia danych, poprawiono buforowanie po

D
laczego Microsoft przeznacza tyle przywołał jako przykład Apple. Koncern ten ko- stronie klienta, również przewijanie stron
powinno odbywać się płynniej, poprzez co
środków na rozwój silnika renderują- rzysta z silnika renderującego WebKit rozwijając
nowy interfejs działa zdecydowanie szyb-
cego dla swojej przeglądarki interneto- przeglądarkę Safari (warto dodać, że również w ciej i niezawodnie. Pojawiła się możliwość
wej, skoro istnieją rozwiązania open source, do- oparciu o tę technologię Google stworzył prze- tworzenia wersji roboczych. Usprawniono
stępne za darmo i szybciej nadążające za zmie- glądarkę Chrome). WebKit ceniony jest za zgod- też posługiwanie się skrótami klawiszowy-
niającymi się standardami sieciowymi? Takie py- ność ze standardami World Wide Web Consor- mi, szczególnie w przypadku urządzeń z
klawiaturami typu QWERTY. Oprócz tego
tanie usłyszał prezes koncernu z Redmond w tium oraz wysoką wydajność. Ballmer podkre-
nowy Gmail, umożliwia zarządzanie kon-
trakcie konferencji Power to Developers, mającej ślił jednak, że nawet jeśli Microsoft w istocie za- tami wielu usług jednocześnie i pozwa-
miejsce w Sydney. Jak donosi strona internetowa interesuje się implementacją rozwiązań open so- la na szybkie przełączanie się pomię-
australijskiego wydania magazynu TechWorld urce we własnym produkcie, na potrzeby Inter- dzy nimi. Wspiera także w podstawowym
(http://www.techworld.com.au) Steve Ballmer net Explorera 8 będzie rozwijał własne. To nie zakresie tryb offline, przydatny w przy-
przyznał, że pytanie to było bezczelne, ale jed- jedyne ciekawostki, jakimi podzielił się Ballmer padku chwilowej utraty sygnału. Wszyst-
kie wiadomości wychodzące są wówczas
nocześnie interesujące. Swoją odpowiedź roz- z zebranymi na konferencji słuchaczami. Jego
zapisywane w przeznaczonym do tego
począł od zapewnień, że koncern będzie musiał zdaniem – najbliższe 10 lat wiązać się będzie z katalogu, po czym automatycznie wysyła-
przeanalizować, w jakim kierunku rozwija się gwałtownym rozwojem oprogramowania. Ball- ne, wraz z momentem ponownego nawią-
rynek przeglądarek. W sytuacji, gdy wprowadza- mer uważa, że za 10 lat ludzie, patrząc wstecz i zania połączenia. Aby pobrać komórkowe-
nie w takich programach kolejnych innowacji wspominając np. rok 2008, będą z uśmieszkiem go klienta poczty GMail należy w telefonie
będzie coraz trudniejsze – co zdaniem Ballmera politowania mówić, jak prymitywne wiedli ży- wskazać adres m.google.com/mail. Aplika-
cja do prawidłowej pracy wymaga obsługi
jest prawdopodobne – koncern może nadal po- cie. Będziemy rozmawiać z komputerami, a one
środowiska JME.
trzebować własnej aplikacji (z uwagi na należące będą odpowiadać. Wszystko, czego dotkniemy, bę- http://www.google.com/
do firmy rozszerzenia poprawiające funkcjonal- dzie posiadać elektroniczną powierzchnię, połączo-
ność programu). Przypomnijmy, że za rendering ną z Internetem. Wszystko będzie automatycznie
stron internetowych w przeglądarce Microsoftu przesyłane. Na pewno jest jeszcze dużo oprogramo-
odpowiada silnik Trident, którego historia sięga wania do napisania na tym świecie – konkludo-
1997 r. i czwartego wydania Internet Explorera. wał Ballmer.
Szef giganta z Redmond przyznał jednak, że roz- http://www.appleinsider.com/
wiązania open source również są interesujące i http://www.idg.pl

www.sdjournal.org 11
Aktualności

Niebezpieczne klawiatury
Szwajcarscy studenci zaprezentowali Windows Azure: podstawa
SaaS w ofercie Microsoftu
nową możliwość przeprowadzania cybe-
rataku, który został przez nich nazwa-
ny jako keyboard sniffing. Doktoran-

R
ci Vuagnoux i Sylvain Pasini z Laborato- ozpoczęciu tegorocznej konferencji
rów Zabezpieczeń i Kryptografii w Swiss Professional Developers Conferen-
Ecole Polytechnique Federale de Lau-
sanne ujawnili, że impulsy elektroma-
ce towarzyszyła oficjalna premiera
gnetyczne generowane przez klawiatu- nowego systemu operacyjnego firmy Micro-
rę podczas wciskania poszczególnych soft – Windows Azure. System znany dotych-
klawiszy mogą być podsłuchane przez czas pod nazwą kodową Project Red Dog ma
cyberprzestępców. Naukowcy twierdzą, stać się podstawą platformy przeznaczonej do
że są w stanie przechwycić za pomocą
tworzenia i oferowania oprogramowania w Najprawdopodobniej aplikacje uruchamiane
odpowiedniej anteny, a następnie prze-
analizować sygnały wygenerowane przez formie usług. Nowy system jest przeznaczo- lokalnie na serwerach Microsoftu będą dzia-
klawiaturę i na tej podstawie odtwo- ny przede wszystkim dla dostawców usług z łały w środowisku zwirtualizowanym. Z kolei
rzyć wpisywaną treść. Okazuje się więc, zakresu cloud computing, dużych firm oraz oprogramowanie dedykowane dla środowiska
że klawiatury nie mogą być uważane za programistów zajmujących się tworzeniem Azure będzie mogło być tworzone m.in. przy
sprzęt bezpiecznie przesyłający dane do aplikacji sieciowych funkcjonujących w mo- pomocy narzędzi wchodzących w skład plat-
komputera.
delu SaaS. Windows Azure ma być podstawą formy .NET. Można spodziewać się więc, że
Podczas swoich badań przetestowa-
no 11 klawiatur łączących się z pecetem platformy Azure Services, czyli kompletnego nowa platforma będzie przynajmniej częścio-
zarówno przez port USB, jak i gniazdo PS/2 środowiska operacyjnego opartego na usłu- wo kompatybilna z klasycznymi aplikacjami
– w obydwu przypadkach w przynajmniej gach. Wedle zapowiedzi Azure Services ma dla systemów Windows. Nowy system ma
jednej na cztery klawiatury udało się odczy- być w pełni skalowalną i elastyczną platformą obsługiwać większość popularnych standar-
tać wpisywany tekst. W przypadku jednego programistyczną, na bazie której programi- dów i protokołów, w tym m.in. SOAP, REST i
z modeli atak udał się nawet z odległości
20 metrów.
ści będą mogli tworzyć natywne oprogramo- XML. Według wcześniejszych doniesień pod-
http://hacking.pl/ wanie dostarczane w formie usług. Poza sys- stawą nowej platformy jest system Windows
temem operacyjnym w jej skład wejdą m.in. Server 2008. Trzeba podkreślić, że Microsoft
20 lat wirusa Morrisa usługi narzędziowe Microsoft SQL Services i zapowiada udostępnienie przeznaczonych
2 listopada 2008 roku minęło 20 lat od
Microsoft .NET Services, mechanizmy Live dla Windows Azure narzędzi programistycz-
chwili, gdy wirus napisany przez Rober-
ta Tappana Morrisa, studenta na Cornell Services wykorzystywane m.in. do synchroni- nych (m.in. kompilatorów i bibliotek) dla ję-
University, unieruchomił 10% wszyst- zacji danych pomiędzy urządzeniami klienc- zyków i środowisk niezależnych firm. Poza
kich komputerów w Internecie, których kimi oraz dedykowane dla biznesu funkcjo- tym koncern ma zapewniać pełne wsparcie
było wówczas niewiele ponad 60 tysię- nalności Microsoft SharePoint i Microsoft hostowanego środowiska. Oprogramowanie
cy. Morris pisząc swojego robaka wyko- Dynamics CRM. Azure Services Platform ma udostępniane za pośrednictwem Internetu
rzystał znaną lukę w serwerze poczto-
stać się podstawą usługowej strategii Microso- będzie pracowało na komputerach znajdują-
wym sendmail oraz w narzędziu finger,
wykorzystywał też konta chronione sła- ftu i połączeniem usług z zakresu przetwarza- cych się w centrach danych Microsoftu. Uzu-
bymi hasłami. Wirus był w stanie zaata- nia danych, dzierżawy infrastruktury IT oraz pełnieniem platformy Azure Services Plat-
kować systemy Sun 3 oraz Digital VAX modelu SaaS, czyli Software + Services we- form mają być narzędzia ułatwiające m.in. in-
działające pod kontrolą BSD Unix, był dług nomenklatury Microsoftu. Z informa- stalację i zarządzanie aplikacjami zarówno w
więc wieloplatformowy. W założeniu cji ujawnionych do tej pory wynika m.in., że centrach danych Microsoftu, jak i po stronie
robak miał być nieszkodliwy, za zadanie
platforma Azure zakłada rozdzielenie war- urządzeń klienckich.
miał jedynie pokazanie słabości zabez-
pieczeń. Ponieważ jednak do infekcji stwy systemowej od warstwy aplikacyjnej. http://www.idg.pl
mogłoby dojść wielokrotnie, co spowo-
dowałoby przeciążenie komputerów,
Morris dodał sprawdzanie czy wirus już
jest uruchomiony na danym kompute- Ile jest wart Linux?
O
rze. Ponowne zarażenie zainfekowane-
go komputera miało zachodzić tylko raz rganizacja Linux Foundation opubliko- czeniach na stworzonym przez siebie narzędziu
na siedem przypadków. Morris myślał, wała rozległy raport poświęcony szaco- sloccount (SLOC: Software Lines of Code) korzy-
że to wystarczy, jednak robak namnażał waniu wartości Linuksa. Analiza prze- stającym z modelu (COCOMO: constructive cost
się tak szybko, że zainfekowane kompu- prowadzona przez Amandę McPherson, Briana model, model szacowania liczby osobogodzin za-
tery i tak szybko stawały się przeciążone. Proffitta oraz Rona Hale’a-Evansa wskazuje, że ba- angażowanych w procesie tworzenia oprogramo-
Atak spowodował problemy z dostępem
zując na dzisiejszych kosztach związanych z two- wania). Analiza wskazuje, że dystrybucja Fedo-
do Internetu na dużą skalę przez kilka
dni. Amerykańskie Ministerstwo Obrony rzeniem oprogramowania stworzenie od podstaw ra 9 zawiera 204,5 mln linii kodu, nad stworze-
nawet samo odłączyło się od Internetu dystrybucji Fedora 9 kosztowałoby 10,8 mld dola- niem jej pracowałoby 60 tys. osób przez rok. We-
aby uchronić się przed infekcją. Zaintere- rów. 1,4 mld pochłonąłby samo jądro. Raport nie dług raportu taki ludzki wysiłek wart jest około
sowani mogą pobrać źródła robaka oraz jest zupełną nowością – raczej uaktualnieniem, 10,8 mld dolarów. Zainteresowanych tematyką
inne związane z nim dokumenty pod analizę kosztów stworzenia typowej dystrybucji zachęcamy do zapoznania się z pełną treścią rapor-
adresem http://ftp.cerias.purdue.edu/
w 2002 roku przeprowadził David A. Wheeler. tu Estimating the Total Development Cost of a Li-
pub/doc/morris_worm/.
http://www.slashdot.org/ Koszt stworzenia od podstaw dystrybucji Red Hat nux Distribution (http://www.linuxfoundation.org/
Linux 7.1 wg ówczesnych cen w USA oszacował publications/estimatinglinux.php)
on na 1,2 mld dolarów. Wheeler bazował w obli- http://linux-foundation.org/

12 01/2009
Aktualności

Kto zarabia na Google udostępnia źródła Androida


Firma Google udostępniła pełny kod źró-

naszych błędach?
dłowy platformy mobilnej Android. Udo-
stępnienie kodów źródłowych zapew-
ne nie przypadkiem nastąpiło tuż przed

C
hyba każdy Internauta przynajm- tingu jest nielegalny, w 1999 roku wprowa- oficjalną premierą pierwszego urzą-
niej kilkukrotnie wpisał adres swej dzony został Anti-Cybersquatting Consu- dzenia stworzonego z myślą o platfor-
mie Google. Smartphone G1 dostępny
docelowej strony z błędem, zwykle mer Protection Act (ACPA), który to zjawi- od końca października w sieci T-Mobile
literówką. Oczywiste jest więc, że w wyniku sko normuje jednak w praktyce eliminacja (cena w USA od 179,90 USD, oczywi-
tego rodzaju pomyłek otwierane się bardzo tego zjawiska jest niezwykle trudna. Rok te- ście w abonamencie) wyprodukowany
czesto niechciane strony. Korzyści z takich mu firma Dell wytoczyła proces 16 firmom został przez firmę HTC, a jego parame-
pomyłek czerpią oszuści (typosquatters) utrzymującym domeny wykorzystujące mar- try techniczne wskazują na to, że Andro-
id będzie miał solidne oparcie w sprzę-
oraz dostawcy reklam, w dużej mierze Go- kę Dell. 16 pozwanych zarabia w sumie ok. 2
cie. Wydaje się, że tandem G1 z Andro-
ogle. Oszuści kupują masowo domeny o bar- mln dolarów miesięcznie na reklamach Go- idem na pokładzie śmiało będzie mógł
dzo zbliżonych nazwach do popularnych ser- ogle emitowanych tylko na stronach związa- podjąć rywalizację z takimi hitami jak
wisów i emitują na nich reklamy, często rów- nych z marką Dell. W wyniku powództwa iPhone pracujący pod kontrolą syste-
nież innego rodzaju „niepożądane treści”. O Google zabezpiecza mln dolarów miesięcz- mu OS X czy też Samsungiem Omnia i
skali problemu świadczy choćby raport fir- nie z dochodów pozwanych. Ostateczne roz- innymi urządzeniami wyposażonymi w
Windows Mobile.
my McAfee, wg danych w nim opubliko- strzygnięcie jeszcze nie nastąpiło. Sprawa
Kod źródłowy Androida dostępny jest na
wanych na czele listy podrabianych domen tychże 16 firm to oczywiście kropla w mo- stronie source.android.com.
znajduje się Freecreditreport.com, która do- rzu. Czy ta sprawa wpłynie na politykę Go- http://www.helloandroid.com/
robiła się 742 podróbek! W pierwszej trój- ogle i wprowadzone zostaną jakieś mechani-
ce znalazły się również YouTube.com (320) zmy eliminujące zasilanie typosquottingu
oraz CartoonNetwork.com (327). 2 tys. naj- nie wiadomo. Nie wiadomo również ile zara-
popularniejszych amerykańskich witryn ma bia potentat z Mountain View na oszustach.
swoich 80 tys. podróbek. 80 % z nich utrzy- http://www.theregister.com/
muje się dzięki Google AdSense. W świetle
amerykańskiego prawa proceder typosquat-

Rosyjskie szkoły
już oficjalnie na Linuksie Znacząca aktualizacja Javy od Suna
Firma Sun udostępnił znaczącą aktuali-

N
ie dalej jak rok temu mówiło się gólnie wielkich, zatem można się łatwo do- zację środowiska Java SE 6. Update 10
o rozpoczęciu programu pilotażo- myślić który z tych wariantów będzie dla znacznie redukuje rozmiar środowiska,
wego mającego na celu upowszech- nich oczywistym wyborem. Według Szczo- poprawia znacznie wydajności aplika-
cji (w tym prędkość ich uruchamiania) i
nienie użytkowania wolnego oprogramowa- golewa, taka polityka ma sprzyjać rozwo- szykuje grunt pod technologię JavaFX,
nia w rosyjskich szkołach. Pierwsze efek- jowi, modernizacji systemu i całego środo- stanowiącą konkurencję dla platform
ty podjętych prac są już widoczne. Rosjanie wiska edukacyjnego. Umożliwi to szybkie RIA takich jak AIR, Silverlight czy Google
najwyraźniej nie zasypiają gruszek w popie- i skuteczne wzbogacenie go o nowe mate- Gears. Aktualizacja nie wnosi żadnych
le, bowiem okres pilotażowy wdrażania roz- riały dla kadr i uczniów służące kształce- dużych zmian z punktu widzenia progra-
misty – pojawiło się jedynie kilka drob-
wiązań opartych o wolne i otwarte oprogra- niu oraz pozwoli na efektywne ich rozpo-
nych zmian w implementacji appletów.
mowanie właśnie zakończył się pomyślnie. wszechnianie. Większe zmiany w tym zakresie odczuje
Jak ogłosił na sesji plenarnej minister ko- http://spo.cnews.ru/ użytkownik, który po instalacji aktuali-
munikacji Igor Szczogolew, wszystkie rosyj- zacji zyskuje możliwość przeciągnięcia
skie szkoły będą miały utrudniony dostęp do dowolnego apletu poza okno przeglądar-
użytkowania oprogramowania innego niż te- ki. Programiści póki co zyskali nowe moż-
liwości i narzędzia pozwalające dostoso-
go należącego do oficjalnego pakietu otwar-
wać wygląd i zachowanie aplikacji pra-
tego oprogramowania „PSPO”, w którego cujących w takim trybie. Dużo większych
skład wchodzi m.in. system operacyjny opar- zmian pod kątem programistów należy
ty na jądrze Linux. spodziewać się wraz z JavaFX, który
Minister stwierdził, że oczekuje się że licz- zapewni obsługę dla nowego języka:
ba komputerów w rosyjskich szkołach osią- JavaFX Script. Język ten ma uprościć pro-
gramowanie w Javie – przewiduje się, iż
gnie milion do 2010 roku. Po trzech latach będzie on bazował na konkurencyjnych
od teraz, placówki edukacyjne będą posta- rozwiązaniach takich jak ActionScript czy
wione przed wyborem: z własnej kieszeni JavaScript. Ponadto, JavaFX ma zapew-
uiścić opłaty licencyjne za używanie opro- nić wsparcie dla wysokiej jakości dźwię-
gramowania i je zakupywać, lub korzystać ku i grafiki 2D i 3D; w przypadku Windows
– przy wykorzystaniu Direct 3D.
z wolnego i otwartego oprogramowania. Bu-
http://www.techcrunch.com/
dżety rosyjskich szkół nie należą do szcze-

www.sdjournal.org 13
Biblioteka miesiąca

Biblioteka FreeMarker
System szablonów w praktyce

Za pomocą biblioteki FreeMarker jesteśmy w stanie oddzielić zadania


programistów od zadań projektantów pracujących nad poszczególnymi
warstwami aplikacji. Dzięki wykorzystaniu silnika szablonów, w postaci
biblioteki FreeMarker, znacznie ułatwiamy wprowadzanie zmian graficznych
w warstwie prezentacji aplikacji. Tym samym osiągnięcie wysokiej jakości
oprogramowania i jego utrzymanie w późniejszych etapach realizacji projektu
będzie łatwiejsze.

Spring czy Struts. Dopiero od wersji 2.0 zo-


Dowiesz się: Powinieneś wiedzieć: stało rozszerzone o język wyrażeń (Expresion
• Co to jest system szablonów FreeMarker i jak • Jak programować i tworzyć aplikacje sieciowe Language), który pozwala na dostęp do wła-
go zastosować. w języku Java 5 EE. ściwości obiektów. Powszechnie wiadomo,
• Jak zintegrować system szablonów FreeMar- • Znać podstawy Spring Framework (oraz mo- że JSP to tak na prawdę rozszerzenie funk-
ker z Spring Framework. duł Web MVC). cjonalności Servlet API. Pliki JSP są kompi-
lowane (za pierwszym razem) przez serwer
aplikacyjny a następnie generują widok stro-
dzie, które naszym zdaniem jest warte bliż- ny dla użytkownika. Warto pamiętać, że pli-
szego poznania i wykorzystania. Poniżej po- ki JSP mogą być również dostarczane jako
Poziom trudności staramy się opisać podstawowe elementy i prekompilowane, co m.in. odciąża serwer
zalety tego silnika szablonów. aplikacyjny.
Mimo tych wszystkich zalet JSP nie są ide-
Początki alne. Pierwszą wadą jest konieczność zajmo-

P
rzy budowie dużych aplikacji aby za- Obecnie duża część aplikacji sieciowych wania się wyświetlaniem HTMLa przez pro-
chować odpowiednią jakość tworzo- stworzonych w JEE wykorzystuje JavaServer gramistę, drugą duży nakład pracy przy ja-
nych programów potrzebna jest spe- Pages. Początki tej technologii wywodzą się z kiejkolwiek zmianie widoków (nie wspomi-
cjalizacja osób uczestniczących w danym czasów kiedy twórcy oprogramowania zwró- nając o zagnieżdżaniu szablonów), dodat-
projekcie. Aby każdy mógł rzeczywiście zaj- cili uwagę na to, że podczas procesu wytwa- kowo trudno zachować wysoką jakość ko-
mować się tym co lubi i dzięki temu two- rzania programiści co raz rzadziej są odpo- du HTML/CSS. W tych wszystkich przy-
rzyć dobre oprogramowanie stosuje się mię- wiedzialni za tworzenie i projektowanie war- padkach pomocny okazuje się system sza-
dzy innymi wzorzec projektowy MVC (Mo- stwy prezentacji. Makiety są przecież przy- blonów.
del View Controller). Założony podział na gotowywane obecnie przez projektanta stro-
model danych, logikę sterowania i interfejs ny w postaci HTML. Rolą programisty jest Zasada działania
użytkownika może być stosowany gdy poza natomiast łączenie widoku z logiką aplika- Szablony FreeMarker są programami pisany-
wszystkimi warunkami wykorzystamy któ- cji. Technologia JSP nadaje się do tego świet- mi w języku FTL (FreeMarkerTemplate Lan-
ryś z systemów szablonów takich jak Smar- nie, ponieważ proces łączenia polega na uży- guage). Jest to bardzo prosty język, przy-
ty, Velocity czy WebMacro. ciu makiety i wprowadzenia do niej elemen- stosowany do tworzenia opisywanych sza-
W tym artykule chcielibyśmy przedstawić tów dynamicznych. Dzięki temu projektant blonów wykorzystujący prostsze konstruk-
mniej popularną bibliotekę Java FreeMar- widoku zna swój kod – aplikacja jest łatwiej- cje znane z pełnoprawnych języków progra-
ker stworzoną przez Benjamina Geera i Mi- sza do utrzymania i rozwoju. Przez lata tech- mowania. Oprócz tego autorzy rozszerzyli
kea Bayera. Określili oni składnię i wszystkie nologia wyewoluowała i umożliwia wyko- jego funkcjonalność o kilkanaście elemen-
elementy, które obecnie składają się na wer- rzystanie rożnych bibliotek tagów (począw- tów związanych tylko z tworzeniem wido-
sję pierwszą FreeMarkera. Kolejnym znaczą- szy od nierozerwalnej JSTL – JavaServer Pa- ków. Zacznijmy jednak od elementów stan-
cym krokiem było przepisanie w 2002 ro- ges Standard Tag Library) oraz tagów wła- dardowych.
ku przez Jonathana Revuskiego kompilato- snych (ang. custom tags). Dodatkowo ideal- W bibliotece FreeMarker aby wyświetlić ja-
ra i parsera czym przybliżył omawianą bi- nie wspiera integrację z takimi technologia- kąś przesyłaną zmienną należy zastosować
bliotekę do obecnej postaci czyli FreeMarke- mi jak: JavaBeans, JDBC, RMI czy EJB. składnię :
ra 2. Przez późniejsze lata jemu i innym au- JSP bardzo łatwo integruje się ze współcze-
torom udało się stworzyć kompletne narzę- snymi szkieletami tworzenia aplikacji jak np. ${user}

14 01/2009
Biblioteka FreeMarker

Oczywiście wartości te możemy otrzymywać > jako zamknięcie taga. Przy operacjach wa- zapisu biorąc pod uwagę także to, że nie-
z kontrolera, ale również sami określić w ko- runkowych należy wspomnieć o sytuacjach które z parametrów mogą przyjmować war-
dzie FTL : <#assign x = 1.234> gdy nie otrzymamy obiektu w miejscu gdzie tości domyślne i nie są wymagane przy wy-
Zmienne te mogą być określone jednym z za- się jego spodziewaliśmy. Filozofia FreeMar- wołaniu (Listing 8). Kolejną zaletą jest moż-
implementowanych typów: kera zakłada, że jest to poważny błąd któ- liwość przekazania zawartości taga danego
rego nie ukrywa się wyświetlając wtedy pu- makra przy pomocy konstrukcji "nested"
• Łańcuch, ste miejsce. Autorzy argumentują to więk- (Listing 9). Jest to bardzo ważna funkcjo-
• Numer, szą kontrolną nad otrzymanymi danymi i nalność biblioteki FreeMarker. Dzięki niej
• Logiczne (Boolean), łatwiejszym wykryciem błędów. Aby zabez- w prosty sposób możemy podzielić stronę
• Data, pieczyć się przed taką sytuacją wystarczy za- na moduły. Każda zmiana np. odnośnika w
• Hash, stosować konstrukcję ?? i deklaracje warun- głównym menu jest możliwa w bardzo pro-
• Sekwencja, kową (Listing 4). Kolejną ważną instrukcją sty sposób do zaimplementowania, ale także
• Kolekcja. są pętle dzięki, którym możemy wypełnić większe zmiany nie sprawiają trudności.
np. tablicę kolejnymi danymi z kolekcji tak
Bardzo przydatne w tym momencie dla twór- jak w Listingu 5. Wszystkie wyżej wymie- Listing 1. Przykłady działań arytmetycznych
cy warstwy prezentacji stają się operacje wy- nione właściwości języka FTL są konieczne na zmiennych
konywane na poszczególnych z nich. Łań- jednak naszym zdaniem o potencjale tej bi-
cuchy standardowo możemy łączyć w więk- blioteki stanowi system makr. ${2 + x}
sze a na liczbowych wykonywać podstawo- ${x - 12}
we działania matematyczne (Listing 1). Do- Makra ${x * x - 100}
datkowo za pomocą wbudowanych metod Dzięki zastosowaniu makr można bardzo ${x / 2}
możemy określić odpowiednio format daty: ograniczyć wysiłek wkładany w zmianę wie- ${12 % 10}
${"1995-10-25 03:05 PM"?datetime("yyyy- lokrotnie używanych elementów interfej-
MM-dd hh:mm . Także liczby możemy
a")} su użytkownika jak również w prosty spo- Listing 2. Różne sposoby formatowania
liczb.
formatować zależnie od naszych wymagań i sób podzielić daną stronę na funkcjonalne
oczekiwań (Listing 2). Oczywiście są to tyl- części. ${1?string("000.00")}
ko dwa przykłady wykorzystania wbudowa- Wystarczy zdefiniować dane makro w któ- ${12.1?string("000.00")}
nych funkcji FreeMarkera, jest ich dużo wię- rym określimy wszystkie elementy składają- ${123.456?string("000.00")}
cej i opisujemy je w ramce dołączonej do te- ce się przykładowo na nagłówek naszej stro-
go artykułu. ny (Listing 6) i później możemy je wykorzy- ${1.2?string("0")}
stać wielokrotnie. Oczywiście w momen- ${1.8?string("0")}
Instrukcje warunkowe, pętle cie kiedy potrzebujemy zmodyfikować da- ${12345?string("0.##E0")}
Wielokrotnie spotkamy się przy tworze- ną treść strony zależnie od przyjętych wa-
niu skomplikowanych serwisów z sytuacją, runków, możemy do danego makra prze- Wynik:
w której zależnie od danych należy zmienić słać konkretne zmienne jak w Listingu 7. Pa-
któryś z elementów widoku. FreeMarker w rametry można także przekazywać bez ko- 001.00
takie sytuacji pozwala nam na porównywa- nieczności wpisywania pełnej nazwy para- 012.10
nie zmiennych i wartości (Listing 3). Należy metru jednak zmniejsza to czytelność ko- 123.46
tylko pamiętać o tym aby w przypadku po- du (szczególnie w przypadku wielu makr i 1
równania większości zastosować <#if (x > zmiennych): <@someMacro "Admin" "John" 2
1)> lub <#if x &gt; 1> ponieważ w innym 1 true />. Naszym zdaniem, dla lepszej czy- 1.23E4
wypadku silnik FreeMarkera odczyta znak telności kodu należy zachować taki standard

Przydatne funkcje i konstrukcje dostępne w bibliotece FreeMarker


• html – usuwa wszystkie znaki możliwe do zinterpretowania jako język HTML(np. znaki większości) i zamienia je na interpretowane jako tekst (np .
znak < na &lt;)
• cap _ first – zmienia pierwszą literę łańcucha na wielką.
• lower _ case – zamienia wszystkie litery w łańcuchu na małe
• upper _ case – zamienia wszystkie litery w łańcuchu na duże
• trim – usuwa wszystkie zbędne spacje z początku i końca łańcucha
• size – zwraca numer elementów w sekwencji
• int – zwraca całkowitą część podanej liczby (np. -1.9?int zwróci liczbę -1)
• url – zwraca łańcuch zamieniając wszystkie niedozwolone znaki w adresie na wzorzec %XX . (np. ${'a/b c'?url} na a%2Fb%20c )
• round – zaokrągla liczbę (gdy wartość po przecinku jest większa od 0,5 w górę gdy mniejsza w dół)
• floor – zaokrągla liczbę w dół
• ceiling – zaokrągla liczbę w górę
• date – wyświetla datę zgodnie z wzorcem (np. "10/25/1995"?date("MM/dd/yyyy") jako Oct 25, 1995 )
• time – wyświetla godzinę zgodnie z podanym wzorcem (np. "15:05:30"?time("HH:mm:ss") jako 3:05:30 PM )
• datetime – wyświetla date i czas zgodnie z podanym wzorcem (np. "1995-10-25 03:05 PM"?datetime("yyyy-MM-dd hh:mm a") jako Oct
25, 1995 3:05:00 PM )
• <#compress >/ – dokument HTML umieszczony w tych znacznikach będzie pozbawiony wszystkich zbędnych spacji.
• <#escape /> – wszystkie elementy mogące być zinterpretowane jako struktura dokumentu(np. znaczniki) są zastąpione ich odpowiednikami
nie naruszających struktury(np. znaki większości) i zamienia je na interpretowane jako tekst (np . znak < na &lt;)
• <#noescape /> – wszystkie element w znaczniku będą pozostawione bez zmian (możliwy do wykorzystania w znacznikach <#escape />)
• <#noparse /> – wszystkie znaki znajdujące się w tym znaczniku nie będą interpretowane jako część języka FTL

www.sdjournal.org 15
Biblioteka miesiąca

Instalacja w projekcie
Listing 3. Instrukcje warunkowe Przejrzystość działania prezentowanego w ni-
<#if x == 1> niejszym artykule silnika szablonów FreeMar-
x is 1 ker (wersja biblioteki 2.3.x) zaprezentujemy
<#if y == 1> natomiast przy wykorzystaniu Spring Frame-
and y is 1 too work w wersji 2.5.x. Niewątpliwym atutem
<#else> Spring Framework, a dokładniej modułu Web
but y is not MVC, jest jego łatwość integrowania się z do-
</#if> wolną technologią generowania widoków. Ce-
<#else> cha ta została osiągnięta dzięki obiektom tzw.
x is not 1 wyboru widoków (ang. view resolver).
<#if y < 0> Uruchomienie aplikacji wykorzystującej
and y is less than 0 technologię FreeMarker bazuje na utworze-
</#if> niu dedykowanego obiektu konfiguracyjnego
</#if> (ang. configurer) oraz użyciu odpowiedniego
resolvera widoku. (Zakładamy, że czytelniko-
Listing 4. Obsługa warunkowa w przypadku braku zmiennej wi znane są podstawy działania Spring Frame-
<#if zmienna??> work – z tego powodu pomijamy konfiguracje
jest zmienna. deskryptora aplikacji wraz ze strukturą apli-
<#else> kacji). Integrację aplikacji podzieliliśmy na na-
brak zmiennej. stępujące kroki:
</#if> W kroku pierwszym dodajemy do kontek-
stu aplikacji obiekt konfigurujący silnik Fre-
Listing 5. Wykorzystanie listy eMarker (Listing 10). W tym kroku wyko-
<#assign seq = ["winter", "spring", "summer", "autumn"]> rzystaliśmy w konfiguracji: konwersje znaków
<#list seq as x> XML (<,>,',”,&) oraz wymuszenie domyślne-
${x_index + 1}. ${x} go kodowania szablonów (UTF-8). Prócz te-
</#list> go należy zwrócić szczególną uwagę na wła-
ściwość o nazwie templateLoaderPath. Para-
Listing 6. Definicja nagłówka strony metr ten wskazuje źródło przechowywanych
<#macro header> plików (sugerowane rozszerzenie plików sza-
<head> blonów to ftl) szablonów, które zostaną uży-
<title>Strona startowa</title> te w aplikacji.
<link rel="shortcut icon" href="favicon.ico" /> W kroku drugim dodajemy do kontekstu
<link href="/css/default.css" type="text/css" media="all" rel="stylesheet" /> aplikacji obiekt resolvera widoku obsługu-
</head> jącego szablony FreeMarker – pliki *.ftl (Li-
</#macro> stingu 11). W tym kroku prócz standardo-
Wywołanie: wej konfiguracji resolvera szczególnie waż-
<@header /> nym parametrem jest exposeSpringMacroHel-
pers. Parametr ten ustawiony na true pozwa-
Listing 7. Definicja makra i wywołanie z parametrami. la na wykorzystanie makr Spring Web MVC,
<#macro LogBox role> np. makro message w JSP: <spring:message
Jesteś zalogowany jako ${role} code=”foo”> w szablonie FTL piszemy odpo-
</#macro> wiednio: <@spring.message ”foo”/>. Pełna
<@logBox role="Admin" /> lista odwzorowań makr Spring Web MVC dla
FTL pod adresem: http://static.springframewor
Listing 8. Definicja makra z parametrami przyjmującymi wartości domyślne k.org/spring/docs/2.0.x/reference/view.html.
<#macro LogBox role roleClass="normal"> W kroku trzecim dodajemy do kontekstu
Jesteś zalogowany jako <span class="${roleClass}">${role}</span> aplikacji mapowania URL oraz przykładowy
</#macro> kontroler – to już standard Spring WEB MVC

Listing 9. Definicja Makra wykorzystującego tag „nested” i przykład jego wywołania.


<#macro redBox>
<div class="redBox"> �������
<div class="inner"> �����
<#nested/> ���������
����������
</div> ���������
</div>
</#macro> ����

<@redBox>
Uwaga należy uzupełnić wszystkie pola.
</@redBox>
Rysunek 1. Schemat działania biblioteki
FreeMarker

16 01/2009
Biblioteka FreeMarker

(Listing 12). Kod źródłowy przykładowego Identycznie wygląda sytuacja z wykorzysta- wera aplikacyjnego (lub kontenera Servle-
kontrolera prezentujemy w Listingu nr 13. niem np. ACEGI w FTL (Listing 15). tów) oraz przetwarzania plików teksto-
Następnie możemy wykorzystywać wszystkie wych, HTML, XML i CSV. Wystarczy wy-
konstrukcje i funkcje FreeMarkera z makrami Logowanie korzystać bibliotekę FreeMarkera i napisać
Springa – przykładem jest modułu logowania Czytelność błędów w silniku FreeMarker za- kilka linii kodu lub użyć FMPP (FreeMar-
(formularz) jak w Listingu 14. Gdy potrzebu- sługuje na szczególną pochwałę. W przypad- ker PreProcessor). FMPP to gotowe narzę-
jemy wykorzystać któryś z zestawu dedyko- ku gdy pomyliliśmy się w szablonie FTL z dzie (linia poleceń lub zadanie ANT), któ-
wanych tagów dla technologii JSP, zrobimy to określeniem nazwy pola z danymi: welco- re potrafi transformować, z wykorzystaniem
przy pomocy FreeMarkera bez większych pro- me.ftl, zamiast ${foo} napiszemy ${baz}. składni FTL, wszystkie pliki ze struktu-
blemów. Przykładowo dla biblioteki JSTL Co- FreeMarker podczas wyświetlania poinfor- ry aplikacji. Strona domowa projektu: http:
re: dodajemy do aplikacji biblioteki JSTL oraz muje nas wiadomością z pełnym backtrace //fmpp.sourceforge.net.
(w zależności od środowiska: serwera aplika- (Listing 16). Dodatkowo z łatwością integru-
cyjnego i jego konfiguracji) pliki TLD. Nato- je się z Log4J, Avalon LogKit i java.util.log- Podsumowanie
miast w samym pliku szablonu (FTL) wystar- ging. Należy wspomnieć o tym, że ze względu na
czy dodać linijki: podejście do tworzenia warstwy prezentacji,
Niezależność aplikacje webowe możemy podzielić na dwa
<#assign c=JspTaglibs["http://java.sun.com/ W przeciwieństwie do technologii JSP, bi- rodzaje: generowane dynamicznie w opar-
jstl/core"]> blioteka FreeMarker może być wykorzysty- ciu o koncepcję kontrolek (technologia Ja-
<@c.url value=”foo”/> wana do tworzenia makiet bez użycia ser- vaServer Faces – JSF) oraz aplikacje gdzie

Listing 10. Kontekst aplikacji

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">


<property name="templateLoaderPath" value="/WEB-INF/ftl/"/>
<property name="freemarkerSettings">
<props>
<prop key="default_encoding">UTF-8</prop>
</props>
</property>
<property name="freemarkerVariables">
<map>
<entry key="xml_escape" value-ref="fmXmlEscape"/>
</map>
</property>
</bean>
<bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape"/>

Listing 11. Dodanie resolvera.


<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="suffix" value=".ftl"/>
<property name="exposeSpringMacroHelpers" value="true"/>
<property name="contentType" value="text/html; charset=utf-8"/>
</bean>

Listing 12. Wycinek kontekstu aplikacji.


<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/welcome.html">welcomeController</prop>
</props>
</property>
</bean>

<bean id="welcomeController" class="com.blstream.rnd.web.controller.WelcomeController"/>

Listing 13. Przykładowy kontroler odpowiedzialny za powiązanie widoku welcome.ftl z modelem danych.
public class WelcomeController implements Controller {
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) throws Exception {
Map<String, Object> info = new HashMap<String, Object>();
info.put("foo", "bar");
return new ModelAndView("welcome", info);
}
}

www.sdjournal.org 17
Biblioteka miesiąca

warstwą prezentacji zajmuje się bezpośred- gim ważnym argumentem jest to, że zmiany przykładem o wiele bardziej zależnej tech-
nio projektant/programista (JavaServer Pa- prezentacji aplikacji wymagane przez klien- nologii niż FreeMarker. Świadczy o tym po-
ges, Velocity, Tiles, SiteMesh, FreeMarker). ta, mogą zostać przeprowadzone w prosty trzeba zastosowania biblioteki RichFaces, w
Naszym zdaniem dynamiczne generowanie sposób z pominięciem programistów war- technologii JSF, aby wykorzystać pełną funk-
HTML i JavaScript jest nieefektywne. Pierw- stwy logiki i modelu. Cecha ta jest szczegól- cjonalność jQuery.
szym powodem jest to, że aplikacje tworzo- nie ważna w procesie wytwarzania aplikacji W związku z małą popularnością silnika ge-
ne w sposób dynamiczny zawierają dużo w podejściu iteracyjnym lub też gdy wyma- nerowania szablonów FreeMarker, ma on obec-
nadmiarowego kodu. Z badań przeprowa- gania od klienta otrzymujemy podczas two- nie małe wsparcie w zintegrowanym środowi-
dzonych przez Yahoo! (z inicjatywy YSlow rzenia aplikacji. Trzecim argumentem prze- sku programistycznym. W praktyce składnia
– http://developer.yahoo.com/yslow/help/) wy- mawiającym za bezpośrednim projektowa- języka FTL jest nie do końca rozumiana przez
nika, że ograniczenie chociażby liczby ele- niem i implementowaniem warstwy prezen- IDE (NetBeans – wersja 6.0+, Eclipse – wersja
mentów DOM lub też kompresja w odpo- tacji jest łatwość szybkiego zastosowania i 3.2.1+ i IntelliJ IDEA - wersja 8a).
wiedni sposób JavaScript może bardzo pozy- przetestowania najnowocześniejszych roz- Jeżeli udało nam się przekonać czytelników
tywnie wpłynąć na wydajność aplikacji. Dru- wiązań np. użycie biblioteki jQuery. JSF jest do stosowania systemu szablonów to naszym
zdaniem kolejnym krokiem powinno być zapo-
Listing 14. Zawartość szablonu, plik login.ftl. znanie się z opisywaną biblioteką FreeMarker.
Porównując ją z innymi dostępnymi rozwiąza-
<#import "spring.ftl" as spring /> niami należy zwrócić uwagę na łatwość przy-
<html> swajania składni języka FTL i możliwość pisa-
<head> nia szablonów przez osoby nie będące specjali-
<title><@spring.message "app.title"/></title> stami języka Java. Niezwykle pomocna jest tak-
</head> że bardzo dobra dokumentacja projektu a do-
<body> datkowym argumentem jest fakt, że FreeMar-
<form method="POST"> ker jest aktywnie rozwijany i aktualizowany.
<label for="name">Username:</label> Również programiści docenią elastyczność w
<@spring.bind "account.name" /> integracji z różnymi dostępnymi elementami
<input type="text" logiki. Podsumowując naszym zdaniem jest to
name="${spring.status.expression}" biblioteka warta przetestowania w swoim pro-
value="${spring.status.value}"/> jekcie i mamy nadzieję, że sami czytelnicy prze-
<#list spring.status.errorMessages as error> konają się o jej zaletach w praktyce.
<b>${error}</b><br/>
</#list>
<br/> PIOTR WIERZBA
<input type="Submit" value="Login"/> Autor jest miłośnikiem języka Java 5 w wydaniu
</form> korporacyjnym (EE) oraz wszelkich technologii po-
</body> krewnych. Obecnie pracuje na stanowisku starsze-
</html> go programisty w firmie BLStream Sp. z.o.o i zajmu-
je się koordynacją wytwarzania oprogramowania.
Listing 15. Przykład integracji biblioteki ACEGI z szablonem FTL Kontakt z autorem: piotr.wierzba@blstream.com
<#assign acegi=JspTaglibs["http://acegisecurity.org/authz"]>
<@acegi.authorize ifAllGranted=”ROLE_ADMIN”> PIOTR GAWLE
Witaj admin! Autor jest programistą GUI specjalizującym w tech-
</@acegi.authorize> nologiach opartych na języku Javascript, oraz me-
chanizmach zapewnienia użyteczności i dostępno-
Listing 16. Treść błędu wyświetlanego przez FreeMarker. ści interfesów aplikacji webowych. Obecnie pracu-
Foo: Expression baz is undefined on line 10, column 16 in welcome.ftl. je na stanowisku starszego programisty interfejsów
The problematic instruction: ---------- ==> ${foo} [on line 10, column 14 in użytkownika w firmie BLStream Sp. z.o.o w dziale
welcome.ftl] User Experience.
Kontakt z autorem: piotr.gawle@blstream.com

W Sieci
• http://freemarker.org/ – strona domowa FreeMarker.
• http://developer.yahoo.com/yslow/ – strona domowa YSlow (Yahoo! Developer Network).
• http://java.sun.com/products/jsp/ – strona domowa produktu Sun JSP.
• http://java.sun.com/products/jsp/jstl/ – strona domowa produktu Sun JSTL.
• http://www.springframework.org/ – strona domowa Spring Framework.
• http://logging.apache.org/log4j/ – strona domowa Apache log4j.
• http://www.acegisecurity.org/ – strona domowa Acegi Security – system bezpieczeństwa dla aplikacji bazujących na Spring Framework.
• http://www.servlets.com/soapbox/problems-jsp.html – ciekawy artykuł opisujący problemy z JSP.
• http://sourceforge.net/projects/webmacro/ – strona domowa WebMacro - silnik szablonów dla Java
• http://velocity.apache.org/ - strona domowa Velocity – silnik szablonów dla Java.
• http://www.jamon.org/ – strona domowa Jamon – silnik szablonów dla Java.
• http://www.opensymphony.com/sitemesh/ – strona domowa SiteMesh – struktura i dekorator warstwy prezentacji dla Java.

18 01/2009
Opis CD

WinZip 12 Trial Version XAMPP


WinZip 12 wprowadza kilka nowości i zmian, wśród których wy- XAMPP jest darmowym wieloplatformowym pakietem, składają-
mienić warto z pewnością sposobność przesyłania wybranych pli- cym się głównie:
ków ze skompresowanych archiwów poprzez e-mail lub tworzenie
z nich nowych paczek. Usprawniono algorytmy kompresji plików • z serwera Apache,
.jpg, co zaowocowało 25 % zmniejszeniem rozmiaru archiwów, bez • bazy danych MySQL,
utraty jakości zdjęć. Nowy WinZip pozwala także podglądać i roz- • interpreterów dla skryptów napisanych w PHP i Perlu.
pakowywać pliki w formacie .iso, .img oraz 7Z oraz dodano wspar-
cie dla metody kompresji opartej na LZMA, pozwalającej zachować Nazwa XAMPP jest akronimem dla X (Cross-platform), Apache,
lepszą wydajność. Wspomnieć warto także o rozbudowanej funk- MySQL, PHP, Perl. Program jest wydawany na licencji GNU Gene-
cjonalności związanej z szyfrowaniem plików oraz zabezpieczania ral Public License jako darmowy serwer WWW do obsługi dyna-
archiwów przy użyciu haseł. WinZip 12 współpracuje z systemami micznych stron.
Microsoftu Windows 2000, Windows XP oraz Windows Vista.
Archiwum SDJ i SDJ Extra
MySQL Server 6.0 Na płytce znajdziecie kompletne archiwum SDJ z roku 2007, a tak-
Niezwykle popularna, szybka, wielowątkowa baza danych umożli- że wydania SDJ Extra. Wszystko w PDF. Dla wszystkich tych, któ-
wiająca udostępnianie zasobów wielu użytkownikom i wykorzystują- rzy nie czytali nas wcześniej jest to niezwykła okazja na zapoznanie
ca język SQL. Umożliwia budowanie wieloserwerowych baz danych, się z materiałami archiwalnymi SDJ. Dla tych, którzy są z nami już
którymi łatwo się zarządza i uaktualnia. Produkt stanowi doskonałą dłużej to niepowtarzalna szansa na odświeżenie sobie archiwalnych
konkurencję dla innych baz danych opartych na technologii SQL . artykułów.

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 19
Bazy danych

ORACLE DATA
ACCESS COMPONENTS
programowanie baz danych Oracle 10g i 11g

Firma Core Lab Software Development specjalizuje się w tworzeniu


technologii dostępu do baz danych z poziomu Delphi i C++ dedykowanych
jednemu systemowi zarządzania bazami danych oraz modyfikacji
istniejących mechanizmów dostępu takich jak ADO.NET, BDP.NET,
dbExpress.
• TOraSQL – klasa służąca do wykonywania
Dowiesz się: Powinieneś wiedzieć: instrukcji PL/SQL, procedur składowa-
• Co to jest ODAC ; • Co to jest PL./SQL ; nych itp.,
• Dlaczego warto stosować technologię ODAC ; • Jak tworzy się programy w Delphi/C++ Buil- • TOraNestedTable – klasa służąca do ob-
• Jak obsługiwać atrybuty typu BLOB; derze ; sługi tabel zagnieżdżonych,
• Co to jest ItraWeb. • Jak tworzy się zapytania w SQL. • TOraScript – klasa służąca np. do wyko-
nywania sekwencji,
• TOraPackage – klasa służąca do wykony-
technologia komercyjna, za którą trzeba pła- wania pakietów PL/SQL,
cić. Jednak ze strony producenta możemy • TOraAlert – klasa pozwalająca na przeka-
Poziom trudności pobrać testową, sześćdziesięciodniową wer- zywanie informacji pomiędzy sesjami,
sję komponentów dla Delphi, C++ Buildera • TOraLoader – klasa pozwalająca na
lub Kylixa. Obecność komponentów dla Ky- szybkie załadowanie danych do bazy da-
lixa powoduje, że technologia jest dostępna nych,

B
ardziej interesującą propozycją są jed- dla systemów z rodziny Linux. Ponadto tech- • TOraErrorHandler – klasa służąca do tłu-
nak rozwiązania dedykowane: ODAC, nologia ta ma jeszcze kilka zalet, wśród któ- maczenia komunikatów błędów,
SDAC i MyDAC zapewniające dostęp rych najważniejsze to: • TBDESession – klasa pozwalająca integro-
do danych przechowywanych w bazach Orac- wać komponenty ODAC z aplikacjami
le, MS SQL Server i MySQL. Ja w tym artykule • łatwa obsługa atrybutów typu BLOB, stworzonymi w technologii BDE,
opiszę technologię ODAC. • obsługa protokołu TCP/IP podczas komu- • TConnectDialog – klasa służąca do prze-
nikacji ze zdalnym serwerem, dzięki cze- chowywania nazwy użytkownika, hasła i
Informacje ogólne mu pozwala tworzyć cienkiego klienta, nazwy serwera baz danych,
ODAC (Oracle Data Access Components) to • ODAC może używać BDE do komunikacji • TVirtualTable – klasa służąca do składo-
technologia zapewniająca dostęp do danych z serwerem Oracle, wania zbioru danych w pamięci.
przetrzymywanych w bazie danych Orac- • wspieranie platformy .NET (co jest stan-
le. Technologia ta pozwala na współpracę z dardem w nowoczesnych technolo- Oczywiście dostępne są również komponenty
Oracle 11g, 10g, 9i, 8i, 8.0 i 7.3, włączając giach), służące do nawiązywania połączenia, czy też
Personal Edition, 10g Xe oraz Oracle 8 Lite. • dość łatwa obsługa obiektowych baz da- wykonywania zapytań SQL:
ODAC zostało stworzone jako alternatywa nych tworzonych w Oracle,
dla innych technologii, w szczególności dla • świetna instrukcja użytkownika i bardzo • TOraSession – komponent służący do na-
BDE. ODAC wykorzystuje OCI (Oracle Call dobrze przygotowane przez twórców pro- wiązywania połączenia,
Interface), czyli pewnego rodzaju API (Appli- gramy przykładowe. • TOraQuery – komponent do wykonywania
cation Programming Interface) do łączenia się zapytań SQL,
z bazą. OCI to interfejs będący zbiorem na- W technologii ODAC można znaleźć kilka • TOraDataSource – odpowiednik kompo-
tywnych funkcji i procedur języka trzeciej klas niewystępujących w żadnej z dotychczas nentu TDataSource, przekazuje dane do
generacji stworzony przez Core Lab Softwa- omówionych technologii. Wśród tych klas naj- TDBGrid,
re Development, żeby ułatwić komunikacje ważniejsze to: • TOraTable – odpowiednik komponentu
z Oracle. Oczywiście w Delphi (lub C++ Bu- TTable w technologii BDE, służy do prze-
ilderze) po zainstalowaniu środowiska nie • TOraSmart (SmartQuery) – klasa będąca al- chowywania zbioru danych i wykonywa-
znajdziemy komponentów ODAC. Jest to ternatywą dla klasy TOraQuery, nia operacji na jednej tabeli,

20 01/2009
ORACLE DATA ACCESS COMPONENTS

• – komponent służący do
TOraStoredProc lub C++ Buildera zna ich odpowiedniki pobrać za darmo ze strony producenta http:
wykonywania procedur i funkcji składo- np. w technologii ADO lub BDE. //crlab.com/odac/. My potrzebujemy dwa pliki,
wanych, w przypadku Delphi 7 będą to odac7.exe i orato-
• TOraUpdateSQL – odpowiednik kompo- Instalacja olsadd.exe (w przypadku innych wersji Delphi
nentu TUpdateSQL występującego w tech- ODAC to komponenty komercyjne, za któ- lub C++ Buildera trzeba ściągnąć odpowiednią
nologii BDE, Każdy programista Delphi re trzeba zapłacić. Wersję trial można jednak wersję ODAC). Instalacja ODAC przebiega in-
aczej niż instalacja większości komponentów
– bardzo przypomina instalację programów w
środowisku Windows.

Nawiązywanie
połączenia z Oracle
Nawiązywanie połączenia za pomocą ODAC,
SDAC lub MyDAC przebiega bardzo podob-
Rysunek 1. Komponenty służące do budowy aplikacji z wykorzystaniem technologii ODAC
nie, różnią się jedynie nazwy komponentów
biorące udział w nawiązywaniu połączenia.
Listing 1. Przykładowy kod służący do nawiązania połączenia z Oracle 10g lub Oracle 11g W ODAC (Rysunek 1.) komponentami, któ-
rych używa się do tworzenia aplikacji bazo-
// ustawienie parametrów połączenia z bazą danych danowej są: OraSession – komponent słu-
żący do nawiązywania połączenia, OraQu-
ORASession1.Server:='nazwa bazy danych'; ery – komponent do wykonywania zapytań
ORASession1.Home:='nazwa serwera'; SQL, OraDataSource – odpowiednik kompo-
ORASession1.Username:='login'; nentu DataSource, który przekazuje dane do
ORASession1.Password:='hasło'; DBGrid, DBGrid – siatki służącej do wyświe-
ORASession1.Connected:=True; tlania danych.
//połączenie komponentu zbioru danych z ORASession Aby nawiązać połączenie z Oracle 11g lub
ORAQuery1.Session:=ORASession1; 10g za pomocą ODAC, należy umieścić wy-
//połączenie ORADataSource z ORAQuery mienione komponenty na formie, a następnie
ORADataSource1.DataSet:=ORAQuery1; dwukrotnie kliknąć komponent OraSession.
//połączenie DBGrid z ORADataSource Ukaże się wówczas okno konfiguracji połącze-
DBGrid1.DataSource:=ORADataSource1; nia (Rysunek 2.), w którym trzeba podać kilka
//wykonanie zapytania SQL parametrów: login i hasło użytkownika, nazwę
ORAQuery1.Close; serwera i domyślną sesję.
ORAQuery1.SQL.Clear; Połączenie z bazą danych i wykonywanie
ORAQuery1.SQL.Add('SELECT * FROM tabela'); instrukcji SQL możliwe jest również z po-
ORAQuery1.Open; ziomu kodu. Trzeba wykorzystać obiekty
klas TORASession do nawiązania połączenia,
Listing 2. Przykładowy kod służący tworzenia obiektów bazy danych z Oracle 10g lub Oracle 11g TORAQuery do wykonania instrukcji SQL oraz
CREATE TABLE Zdjecia_samochodow ( TORADataSource do przekazania danych na
siatkę DBGrid. Przykładowy kod zaprezento-
ID NUMBER PRIMARY KEY, wany został na Listingu 1.
Nazwa VARCHAR2(30),
Zdjecie BLOB Komponent klasy TORAQuery
); Komponent klasy TOraQuery to odpowied-
nik komponentu TQuery w technologii BDE.
CREATE SEQUENCE klucz_zdjecia_samochodow Służy do wykonywania instrukcji SQL i prze-
increment by 1 chowuje zbiór rekordów będący rezultatem
start with 1; wykonania zapytania SQL. Zobaczmy wyko-
rzystanie komponentu TOraQuery w prakty-
CREATE OR REPLACE ce. Zbudujemy teraz w środowisku Delphi
PROCEDURE zdjecia_samochodow_Insert ( aplikację, która pozwoli na wyświetlenie i
p_ID NUMBER,
p_Nazwa VARCHAR2,
p_Zdjecie OUT BLOB
)
is
begin
INSERT INTO Zdjecia_samochodow(ID, Nazwa, Zdjecie)
VALUES (klucz_zdjecia_samochodow.nextval, p_Nazwa, EMPTY_BLOB())
RETURNING Zdjecie
INTO p_Zdjecie;
end;
/ Rysunek 2. Nawiązywanie połączenia z Oracle za
pomocą ODAC z Oracle 10g

www.sdjournal.org 21
Bazy danych

edycję rekordów z założonej w Oracle tabe- niami SQL. Kliknij dwukrotnie właściwość ży zmienić zapytanie wpisane we właściwo-
li Ksiazki (składającej się z kolumn: ISB, Ty- SQLInsert komponentu OraQuery1 a w oknie ści SQLUpdate na następujące:
tuł, Podtytuł, Id_kategorii, Liczba_stron, Re- String Editor wpisz następującą treść zapyta-
cenzja). nia SQL: UPDATE Ksiazki
Uruchom Delphi i na formularzu umieść SET ISBN=:ISBN, Tytul=:tytul, Podtytul=:
komponenty OraSession1, OraQuery1, INSERT INTO Ksiazki VALUES (:ISBN, :Tytul, Podtytul, Liczba_stron=:Liczba_stron,
OraDataSource1 i DBGrid1. Skonfiguruj połą- :Podtytul, :Liczba_stron, :Id_kategorii, Id_kategorii=:Id_kategorii, Recenzja=:Recenzja
czenie z bazą danych (patrz poprzedni punkt). :Recenzja). WHERE ISBN=:OLD_ISBN.
Dwukrotnie kliknij właściwość SQL kompo-
nentu OraQuery1 i w nowo otwartym oknie Jak zapewne zauważyłeś, do wartości wpisy- ODAC i atrybuty typu LOB
wpisz treść zapytania wanych w komponencie DBGrid można się od- W Oracle 10g i 11g istnieją specjalne typy do
nieść poprzez nazwę atrybutu tabeli poprze- przechowywania dużych obiektów (Large Ob-
SELECT * FROM Ksiazki. dzoną znakiem dwukropka. Od tego momen- ject, LOB), takich jak dokumenty graficzne,
tu operacja wstawiania nowych rekordów do dźwiękowe, video, czy po prostu dowolne pli-
Zauważ, że właściwość Session we wszyst- tabeli za pomocą komponentu DBGrid jest ki. Nazwa Large (duże) pochodzi stąd, że gór-
kich komponentach zbioru danych, w tym możliwa. ny limit wielkości każdego obiektu, który mo-
także w OraQuery1 naszej aplikacji, jest au- Teraz kliknij dwukrotnie właściwość że zostać dodany do bazy danych, wynosi oko-
tomatycznie ustawiana na dostępny kom- SQLUpdate komponentu OraQuery1 a w oknie ło 4 GB.
ponent klasy TOraSession. Jest to ułatwie- String Editor wpisz następującą treść zapyta- Praca z tak dużymi obiektami jest du-
nie, gdyż nie trzeba pamiętać o połączeniu nia SQL: żym wyzwaniem dla programistów – na
komponentów zbioru danych z komponen- szczęście większość obiektów LOB jest du-
tem odpowiedzialnym za połączenie z ba- UPDATE Ksiazki żo mniejsza.
zą danych. SET ISBN=:ISBN, Tytul=:tytul, Podtytul=: Istnieją trzy główne typy danych LOB:
W kolejnych krokach ustaw właściwość Podtytul, CLOB, BLOB i BFILE.
DataSet komponentu OraDataSource1 na Liczba_stron=:Liczba_stron, Id_kategorii=:
OraQuery1, ustaw właściwość DataSource kom- Id_kategorii,
ponentu DBGrid1 na OraDataSource1 i zmień Recenzja=:Recenzja
właściwość Active komponentu OraQuery1 WHERE ISBN=:ISBN.
na True.
Możesz już teraz skompilować i urucho- Tak jak w przypadku zapytania INSERT rów-
mić aplikację. Oczywiście dane z tabeli nież posłużyliśmy się notacją z dwukrop-
Ksiazki zostaną wyświetlone, ale nie będzie kiem.
można ich edytować, ani dodawać. To wła- Od tego momentu operacje dodawania,
śnie jest jedna z głównych różnic pomiędzy modyfikowania i wyświetlania zawartości ta-
komponentami OraQuery i Query. Ten drugi beli Ksiazki są już możliwe, oprócz modyfi-
pozwala na dopisywanie i modyfikowanie re- kowania pola z kolumny ISBN. Dzieje się tak
kordów, natomiast ten pierwszy musi zostać dlatego, że atrybut ISBN jest użyty po obu
odpowiednio oprogramowany, by pozwolił stronach znaku przypisania w sekcji WHERE.
na edycję rekordów. Jednak komponenty zbioru danych techno-
Jak zapewne zauważyłeś, w komponen- logii ODAC udostępniają poprzednią war-
cie OraQuery jest kilka dodatkowych właści- tość pola (to znaczy tę sprzed modyfikacji) w
wości: SQLInsert, SQLDelete, SQLUpdate. zmiennej o nazwie old_nazwa_atrybutu. Tak
Aby móc edytować rekordy, trzeba uzupeł- więc, aby możliwa była modyfikacja wszyst-
nić te właściwości odpowiednimi zapyta- kich pół, nawet tych z kolumny ISBN nale- Rysunek 3. Aplikacja podczas działania

Tabela 1. Efektywność w obrębie Oracle


Czas wykonania zapytania w sekundach
SELECT INSERT UPDATE DELETE
Technologia ADO
średni czas 0,0148 0,0103 0,0096 0,0102
Technologia dbExpress

średni czas 0,0051 0,0093 0,0076 0,0079


Technologia ODAC
średni czas 0,0063 0,0072 0,0072 0,0072
Technologia BDE
średni czas 0,0096 0,0069 0,0082 0,0079
Technologia ODBC
średni czas 0,0094 0,0241 0,0249 0,0130
Technologia EasySoft
średni czas 0,0249 0,0317 0,0285 0,0196

22 01/2009
ORACLE DATA ACCESS COMPONENTS

• CLOB (Character Large Object) – duży CLOB, NCLOB i BLOB są często określa- LECT * FROM Tabela), w której jeden z atry-
obiekt znakowy. Przechowuje dane tek- ne mianem wewnętrzny LOB, natomiast ter- butów jest typu BLOB, nie mówiąc o możliwo-
stowe, które mogą być reprezentowane min zewnętrzny LOB dotyczy obiektów ty- ści dodania lub modyfikacji takich rekordów.
tym samym zestawem znaków, jaki jest pu BFILE. A zatem, jak pracować z tabelami zawiera-
używany w bazie danych. Jeśli zachodzi Jednym ze sposobów zwiększenia wydaj- jącymi kolumny typu BLOB? Należy stworzyć
potrzeba przechowywania tekstu w in- ności działania na danych zaliczanych do we- odpowiedni interfejs użytkownika w PL/SQL i
nym zestawie znaków narodowych, moż- wnętrznych obiektów LOB, stosowanym przez Javie lub skorzystać z możliwości technologii
na zastosować odmianę typu CLOB zwa- system Oracle, jest przechowywanie ich w spe- ODAC. Napiszmy w Delphi (w C++ Builde-
ną NCLOB. cjalnych obszarach zwanych segmentami LOB, rze czynności będą analogiczne) aplikację, któ-
• BLOB (Binary Large Object) – duży które są fizycznie oddzielone od segmentów ra pozwoli na pracę z tabelą zawierającą atry-
obiekt binarny. Zawiera dowolny zbiór tabel. but typu BLOB (tabela będzie przechowywa-
bitów reprezentujący dowolny rodzaj ła identyfikator, nazwę i zdjęcie samochodu),
danych. Obsługa atrybutów czyli dodawanie, usuwanie i wyświetlanie re-
• BFILE (Binary File) – plik binarny. Po- typu BLOB za pomocą ODAC kordów tabeli. Ponadto w przykładzie tym za-
zwala na przechowywanie w bazie da- Obsługa atrybutów typu BLOB nie jest już tak prezentujemy, jak za pomocą ODAC tworzyć
nych informacji o dowolnym pliku, któ- łatwa, jak np. obsługa atrybutów typu VAR- i usuwać tabele, sekwencje i procedury z po-
ry faktycznie znajduje się poza bazą da- CHAR2. Oczywiście iSQL*Plus nie wyświe- ziomu aplikacji - nie będziemy więc używać
nych. tli danych tabeli (jeśli wydamy polecenie SE- iSQL*Plusa.

Listing 3. Kod obsługi zdarzeń

// Zastąp wszystkie moduły występujące po słowie uses


następującymi: procedure TForm1.Button4Click(Sender: Tobject);
{$IFDEF LINUX} begin
SysUtils, Types, Classes, QGraphics, QControls, QForms, OraQuery1.Close //zamknięcie komponentu OraQuery1
QDialogs, QStdCtrls, end;
QDBCtrls, QComCtrls, QExtCtrls, QGrids, QDBGrids, OdacClx, Oprogramuj zdarzenie onClick przycisku Dodaj rekord.
{$ELSE} procedure TForm1.Button5Click(Sender: TObject);
Windows, Messages, SysUtils, Classes, Graphics, Controls, begin
Forms, Dialogs, {$IFDEF LINUX}
DBCtrls, ExtCtrls, Grids, DBGrids, StdCtrls, ToolWin, with TOpenDialog.Create(nil) do
ComCtrls, ExtDlgs, OdacVcl, {$ELSE}
{$ENDIF} with TOpenPictureDialog.Create(nil) do
Db, Ora, OraScript, MemDS, DBAccess, OraSmart; {$ENDIF}
try
(...) InitialDir := '.';
if Execute then begin
Oprogramuj zdarzenia onClick przycisków Stwórz tabelę with OraStoredProc1 do begin
i Usuń tabelę. Aby stworzyć bądź StoredProcName := 'Zdjecia_samochodow_Insert';
usunąć tabelę (wraz z sekwencją i PrepareSQL;
procedurą składowaną) wystarczy wykonać
odpowiedni skrypt przechowywany w ParamByName('p_Nazwa').AsString := ExtractFileName(F
komponentach OraScript1 i OraScript2. ileName);
Robi się to poprzez wywołanie metody ParamByName('p_Zdjecie').ParamType := ptInput;
Execute. ParamByName('p_Zdjecie').AsOraBlob.LoadFromFile(Fil
//przycisk uruchamiający tworzenie tabeli, sekwencji i eName);
procedury składowanej Execute;
procedure TForm1.Button1Click(Sender: TObject); end;
begin OraQuery1.Refresh;
Orascript1.Execute end;
end; finally
Free;
//przycisk uruchamiający usuwanie tabeli i sekwencji end;
procedure TForm1.Button2Click(Sender: TObject); end;
begin
OraScript2.Execute //Oprogramuj zdarzenie onClick przycisku Usuń rekord.
end; procedure TForm1.Button6Click(Sender: TObject);
begin
//Oprogramuj zdarzenia onClick przycisków Połącz i Rozłącz. if OraQuery1.State = dsBrowse then
procedure TForm1.Button3Click(Sender: Tobject); OraQuery1.Edit;
begin ORAQuery1.Delete
OraQuery1.Open //otwarcie komponentu OraQuery1 end;
end;

www.sdjournal.org 23
Bazy danych

Otwórz Delphi i umieść na formularzu na- ponieważ przy uruchomieniu skryptu prze- Żeby usunąć dany rekord, zbiór danych mu-
stępujące komponenty: chowywanego w komponencie OraScript1 si być w stanie dsEdit, tak więc najpierw należy
zostanie ona zastąpiona (nic jednak nie stoi sprawdzić stan zbioru danych. Jeśli jest to stan
• OraSesion1 – komponent odpowiedzialny na przeszkodzie, żebyś do skryptu dopisał przeglądania (dsBrowse) to zmieniamy go na
na połączenie z bazą danych. instrukcję usuwającą procedurę składowaną stan edycji, a następnie wywołujemy instruk-
• OraQuery1 – komponent odpowiedzialny DROP PROCEDURE zdjecia_samochodow_In- cję ORAQuery1.Delete uruchamiającą zapyta-
za przechowywanie zbioru danych i wy- sert) Ja usuwam tylko tabelę i sekwencję za po- nie Delete.
konywanie zapytań SQL. mocą kodu: Teraz możesz już skompilować i urucho-
• OraStoredProc1 – ten komponent będzie mić aplikację. Ja dodatkowo w komponen-
potrzebny przy dodawaniu nowego rekor- DROP TABLE Zdjecia_samochodow; tach OraQuery1, OraStoredProc1, OraScript1
du zawierającego pole typu BLOB. DROP SEQUENCE klucz_zdjecia_samochodow; i OraScript2 zmieniłem jeszcze właściwość
• OraScript1 i OraScript2 – dwa kompo- Debug na True. Dzięki temu podczas dzia-
nenty odpowiedzialne za przechowywa- Uzupełnij właściwości komponentu OraQuery1: łania programu, wszystkie wykonywane in-
nie skryptów SQL, które będą uruchamia- strukcje PL/SQL będą wyświetlane w specjal-
ne w odpowiednim momencie. • SQL: nym oknie.
• OraDataSource1 – komponent odpowie- SELECT * FROM Zdjecia _ samochodow, Po uruchomieniu można przetestować
dzialny za połączenie zbioru danych z • SQLDelete: DELETE FROM Zdjecia _ działanie programu (Rysunek 3.). Najpierw
komponentem DBGrid. samochodow WHERE ID = :ID, należy nacisnąć przycisk Utwórz tabelę, a na-
• DBGrid1 – komponent służący do wyświe- • SQLInsert: INSERT INTO Zdjecia _ stępnie Połącz. Po wykonaniu tych czynności
tlenia danych. samochodow (ID, Nazwa, Zdjecie) można dodawać i usuwać atrybuty. Jeśli zaj-
• DBImage1 – komponent służący do wy- VALUES, (:ID, :Nazwa, EMPTY _ BLOB()) dzie potrzeba usunięcia tabeli możesz posłu-
świetlenia obrazków przechowywanych w RETURNING Zdjecie INTO :Zdjecie, żyć się przyciskiem Usuń tabelę. Oczywiście
polach typu BLOB. • SQLLock: SELECT * FROM Zdjecia _ nie możesz dwa razy po kolei nacisnąć przy-
• 6 komponentów klasy TButton. samochodow WHERE ID = :ID FOR UPDATE cisku Utwórz tabelę, ponieważ z oczywistych
NOWAIT, względów (tabela już istnieje) spowoduje to
Zmień właściwości Caption komponentów • SQLRefresh: WHERE P.ID = :ID, wystąpienie błędu.
klasy TButton na: Stwórz tabelę, Usuń tabe- • SQLUpdate: UPDATE ODAC _ BLOB SET ID
lę, Połącz, Rozłącz, Dodaj rekord, Usuń re- = :ID, TITLE = :TITLE, PIC = EMPTY _ ODAC i IntraWeb
kord. Skonfiguruj połączenie z bazą da- BLOB() WHERE ID = :OLD _ ID RETURNING IntraWeb to pakiet dostarczony przez firmę
nych (patrz punkt Tworzenie połączenia z PIC INTO :PIC, AtoZed Software. Po raz pierwszy pojawił się
bazą danych). Kliknij dwukrotnie na kom- • Wpisz kod zamieszczony w Listingu 3. dla w C++ Builderze i Delphi 7 w wersjach Enter-
ponent OraScript1 i w oknie Form1.Ora- odpowiednich komponentów. prise i Professional Edition (w wersji Professio-
Script1 wpisz treść skryptu tworzącego ta- nal Edition tylko część pakietu). Pakiet ten słu-
belę, perspektywę i procedurę składowaną W deklaracji modułów użyliśmy specjal- ży do tworzenia webowych interfejsów użyt-
(Listing 2.). nych dyrektyw. Pozwalają one kompilować kownika (interaktywnych stron WWW) i ser-
Tabela o nazwie Zdjecia_samochodow prze- tak napisany program zarówno w Delphi, werów.
chowywać będzie identyfikator, nazwę pliku jak i w Kylixie. Tak więc aplikacja może pra- My za pomocą IntraWeb i ODAC zbuduje-
graficznego i plik graficzny. Sekwencja po- cować zarówno w środowisku Windows, jak my w Delphi (tworzenie projektu w C++ Bu-
służy do ustalania unikalnej wartości iden- i Linuxie. Jest to bardzo duża zaleta kompo- ilderze jest analogiczne) narzędzie podobne do
tyfikatora. Procedura posłuży do wstawiania nentów ODAC. W Linuxie nie można wy- iSQL*Plusa.
rekordu zawierającego pole typu BLOB. wołać okna OpenPictureDialog, dlatego wy- W celu stworzenia nowego projektu In-
Kliknij dwukrotnie na komponent wołujemy okno OpenDialog. Pozostałe in- traWeb uruchom Delphi i z menu File wy-
OraScript2 i w oknie Form1.OraScript2 wpisz strukcje są wspólne zarówno dla Delphi, jak bierz kolejno New i Other. Pojawi się okno
treść skryptu usuwającego tabelę i perspekty- i Kylixa (gdy programujesz w C++ Builde- New Items. Przejdź w tym oknie do zakład-
wę. Procedury składowanej nie trzeba usuwać, rze, dyrektywy są zbędne). ki IntraWeb, wybierz ikonę Stand Alone Ap-
plication i naciśnij przycisk OK. Następnie
będziesz musiał wskazać folder, w którym
Delphi zapisze projekt. Delphi utworzy w
tym katalogu sześć plików, podstawowym
jest IWProject.dpr. Tworzona przez nas apli-
kacja będzie miała wbudowany serwer. Aby
zbudować stronę internetową, musisz otwo-
rzyć plik IWUnit1.pas. Gdy to zrobisz, zoba-
czysz biały formularz. To na nim będziemy
umieszczać komponenty z czterech zakła-
dek IntraWeb.
Po uruchomieniu zawartość tego formu-
larza będzie przedstawiana w formie stro-
ny internetowej, o czym zaraz się przeko-
nasz. Skompiluj i uruchom projekt. Uru-
chomiony zostanie serwer o nazwie My In-
traWeb Application Server, który jest częścią
projektu. Naciśnięcie klawisza [F9] albo wy-
Rysunek 4. Interfejs aplikacji wykorzystującej ODAC i IntraWeb branie z menu głównego serwera opcji Ru-

24 01/2009
ORACLE DATA ACCESS COMPONENTS

n>Execute spowoduje wyświetlenie pustej


(gdyż nie dodaliśmy żadnych komponen- Listing 4. Oprogramowane zdarzenia w aplikacji wykorzystującej ODAC i IntraWeb
tów) jeszcze strony internetowej o przykła- procedure TformMain.IWButton1Click(Sender: TObject);
dowym adresie: http://127.0.0.1:1574/EXEC/ begin
0/7CF5AD000F99B76851DCE240 (adres OraSession1.Connected:=False; //zamknij połączenie z bazą danych
oczywiście na każdym komputerze będzie //wczytaj nazwę użytkownika, hasło i bazę danych
wyglądał inaczej). OraSession1.Username := IWEdit1.Text;
Po zapoznaniu się z IntraWeb przejdźmy do OraSession1.Password := IWEdit2.Text;
budowy aplikacji. Oczywiście podczas doda- OraSession1.Server := IWEdit3.Text;
wania kontrolek do formularza projektu moż- //nawiąż połączenie ze wskazaną przez użytkownika bazą danych
na stosować jedynie komponenty z palet IW- OraSession1.Connected:=True;
Standard, IWData, IW Client Site i IWControl end;
oraz komponenty baz danych (np. te z palety
ODAC). Poza tym wszystko odbywa się tak jak procedure TformMain.OraSession1AfterConnect(Sender: TObject);
w zwykłym projekcie Delphi. begin
Otwórz plik IWUnit1.pas i z palet IntraWeb IWLabel5.Font.Color := clGreen;
umieść na formularzu 7 komponentów IWLa- IWLabel5.Caption := 'Status: Połączenie nawiązane';
bel, 3 komponenty IWEdit, komponent IWMe- IWLabel5.Visible := True;
mo1, 2 komponenty IWButton, komponent IW- end;
Rectangle1, komponent IWNavigator1 i kompo-
nent IWDBGrid1. procedure TformMain.IWButton2Click(Sender: TObject);
Jak zapewne zauważyłeś komponenty z pa- begin
let IntraWeb są odpowiednikami znanych z in- //zczytaj zapytanie SQL z komponentu IWMemo1
nych technologii komponentów – więc nie bę- OraQuery1.SQL.Assign(IWMemo1.Lines);
dę omawiać do czego służą. Ponadto umieść na IWDBGrid1.Columns.Clear; //czyści zawartość komponentu IWdBGrid1
formularzu komponenty z palety ODAC: Ora- try
Session1, OraQuery1, OraDataSource1. W Del- OraQuery1.Execute; //wykonaj zapytanie
phi pod słowem implemantation dopisz kilka if OraQuery1.Active then begin //jeśli komponent OraQuery1 jest aktywny...
modułów. //... to zmień opis na komponencie IWlabel7...
IWLabel7.Font.Color := clBackground;
uses IWLabel7.Caption := 'Wynik';
ServerController, Graphics, SysUtils; IWLabel7.Visible := True;
//... i wyświetl komponenty IWDBGrid1 i IWNavigator1
kolejnym krokiem jest skonfigurowanie po- IWDBGrid1.Visible := True;
łączenia z bazą danych (patrz jeden z po- IWDBNavigator1.Visible := True;
przednich punktów). Jeśli właściwość end
Sesion komponentu OraQuery1 jest pusta, else begin //wprzeciwnym wypadku
to ustaw ją na OraSesion1. IWLabel7.Font.Color := clBackground; //zmień kolor czcionki i ...
Ustaw właściwość DataSet komponentu //... jeśli zbiór danych nie jest pusty to ...
OraDataSource1 na OraQuery1. if OraQuery1.RowsAffected > 0 then
Ustaw właściwość DataSource kom- //... wyświetl ile jest wierszy
ponentów IWNavigator1 i IWDBGrid1 na IWLabel7.Caption := IntToStr(OraQuery1.RowsAffected) + ' wyświetlonych
OraDataSource1. wierszy'
Zmień właściwość Caption następujących else// w przeciwnym wypadku, gdy w zbiorze danych nie ma żadnego rekordu
komponentów: IWLabel7.Caption := 'Wykonano zapytanie'; //... to wyświetl napis
IWLabel7.Visible := True;
• IWLabel1 na iSQLPlus stworzony w Delphi, //... i ukryj komponenty IWDBGrid1 i IWNavigator1
• IWLabel2 na Użytkownik, IWDBGrid1.Visible := False;
• IWLabel3 na Hasło, IWDBNavigator1.Visible := False;
• IWLabel4 na Baza, end;
• IWLabel5 na Status: brak połączenia, except //jeśli przy próbie wykonania zapytania będzie błąd
• IWLabel6 na Wynik, on E:Exception do begin
• IWLabel7 na Wpisz zapytanie SQL, IWLabel7.Font.Color := clRed; //... zmień kolor czcionki i ...
• IWButton1 na Połącz, //... wyświetl treść błędu
• IWButton2 na Wykonaj zapytanie. IWLabel7.Caption := 'Bląd: '+ E.Message;
IWLabel7.Visible := True;
Zmień właściwości Font i Color wybra- // ukryj komponenty IWDBGrid1 i IWNavigator1
nych komponentów wg własnego uznania. IWDBGrid1.Visible := False;
Zmień właściwość PasswordPrompt kompo- IWDBNavigator1.Visible := False;
nentu IWEdit2 na True. Spowoduje to, że za- end;
miast wpisywanego tekstu będą wyświetla- end;
ne gwiazdki, czyli nikt nie będzie mógł po- end;
dejrzeć wpisywanego hasła. Ustaw domyśl-
ne wartości (właściwość Text) komponen-

www.sdjournal.org 25
Bazy danych

tów IWEdit1, IWEdit2 i IWEdit3. Zmień wła- jekt. Na koniec przekażę jedną uwagę: jeśli Zaprezentuję teraz działanie komponentu
ściwości Visible komponentów IWDBGrid1 i zapytania typu OraSQL na przykładzie.
IWNavigator1 na False w celu ukrycia tych Napiszę aplikację w Delphi, która pozwoli
komponentów. SELECT * FROM tabela na wykonywanie bloków PL/SQL i zaprezen-
Ustaw właściwości BGColor, RowHeaderColor tuje wyniki. Jeżeli chcesz napisać podobną
i RowCurrentColor komponentu IWDBGrid1 wg nie będą działać, to używaj zapytań w postaci aplikację, to umieść na formularzu kompo-
własnego uznania. Możesz również zmienić nent OraSession1 i skonfiguruj połączenie z
właściwości BackgrounColor i Title formula- SELECT * FROM schemat.tabela. bazą danych. Umieść na formularzu kompo-
rza formMain. Zapisz projekt. Stworzony przez nent OraSQL1 i sprawdź, czy jego właściwość
nas interfejs użytkownika został przedstawiony Oczywiście naszemu programowi brakuje Session jest ustawiona na OraSession1.
na Rysunku 4. jeszcze trochę do prawdziwego iSQL*Plusa, Umieść na formularzu dwa komponenty
Kolejnym krokiem jest oprogramowanie np. nie potrafi on wykonywać skryptów, czy Memo. Pierwszy będzie służył do wpisywania
kilku zdarzeń (Listing 4.). Oprogramuj zda- kilkunastu instrukcji PL/SQL wpisanych w poleceń PL/SQL, drugi do prezentacji wyni-
rzenie onClick przycisku IWButton1, odpo- pole IWMemo1. Rozwiązanie tej kwestii nie ków. Zmień właściwość ReadOnly komponen-
wiadającego za połączenie z bazą danych, jest trudne i możemy ją rozwiązać, wykorzy- tu Memo2 na True, żeby nie można było zmie-
zdarzenie onAfterConnect komponentu stując komponent ORASQL. niać treści prezentowanej w tej kontrolce.
OraSession1. Możesz wpisać przykładowy blok PL/SQL w
Po nawiązaniu połączenia z bazą da- Komponent ORASQL komponencie Memo1. Umieść na formularzu
nych napis informujący o statusie połącze- Jednym ze sposobów poprawienia aplikacji z komponent Button1 i zmień jego właściwość
nia zmieni się. Oprogramuje także zdarze- poprzedniego punktu jest użycie komponen- Caption na Wykonaj blok PL/SQL. Oprogra-
nie onClick komponentu IWButton2 odpo- tu OraSql zamiast OraQuery. Komponent muj zdarzenia onShow i onDestroy formula-
wiedzialnego za wykonywanie zapytań SQL. OraSQL pozwala na wykonywanie nie tylko rza. W zdarzeniu onShow będzie następowało
Teraz możesz skompilować i uruchomić pro- zapytań SQL, ale również bloków PL/SQL. połączenie z bazą danych, w zdarzeniu onDe-

Listing 5. Kod źródłowy programu wykorzystującego komponent klasy TORASQL

unit Unit1; end;

interface procedure TForm1.FormDestroy(Sender: TObject);


begin
uses OraSession1.Disconnect;
Windows, Messages, SysUtils, Variants, Classes, Graphics, end;
Controls, Forms,
Dialogs, StdCtrls, DBAccess, Ora, DB; procedure TForm1.Button1Click(Sender: TObject);
var
type i:integer;
TForm1 = class(TForm) begin
OraSession1: TOraSession; OraSQL1.SQL :=Memo1.Lines;
OraSQL1: TOraSQL; for i := 0 to OraSQL1.Params.Count-1 do
Memo1: TMemo; if OraSQL1.Params[i].DataType = ftUnknown then
Button1: TButton; OraSQL1.Params[i].DataType := ftString;
Memo2: TMemo; OraSQL1.Execute;
procedure FormShow(Sender: TObject); end;
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject); procedure TForm1.OraSQL1AfterExecute(Sender: TObject; Result:
procedure OraSQL1AfterExecute(Sender: TObject; Result: Boolean);
Boolean); var
private i:integer;
{ Private declarations } begin
public if Result then
{ Public declarations } begin
end; Memo2.Lines.Clear;
for i := 0 to OraSQL1.Params.Count-1 do
var Memo2.Lines.Add(OraSQL1.Params[i].Name + ' = ' + OraSQL1
Form1: TForm1; .Params[i].AsString);
end
implementation
else
{$R *.dfm} showmessage('Nic nie zostalo zwrócone, lub wystąpil
bląd');
procedure TForm1.FormShow(Sender: TObject); end;
begin
OraSession1.Connect; end.

26 01/2009
ORACLE DATA ACCESS COMPONENTS

stroy rozłączanie z bazą danych. Oprogramuj poszczególnych technologii pozwalających ciem odpowiednich dyrektyw). Co prawda
zdarzenie onClick przycisku Button1. Na- na dostęp do Oracle 10g i 11g podczas wyko- środowisko Delphi uruchamiane jest tylko
ciśnięcie przycisku będzie powodowało wy- nywania zapytań SQL typu SELECT, INSERT, na systemie operacyjnym MS Windows, jed-
konanie bloku PL/SQL. W pętli for wyszu- UPDATE i DELETE. Wszystkie przeprowadzo- nak programy napisane w Delphi mogą być
kiwane będą parametry bloku. Jeśli dowol- ne testy wykonane były na jednakowej kon- przenoszone na platformę Linux. Możliwe
ny z parametrów nie ma zadeklarowanego figuracji sprzętowej i programowej, przy jed- jest to dzięki stworzeniu przez firmę Bor-
typu to przypisywany mu będzie typ łańcu- nakowym obciążeniu systemu. W Tabeli 1. land środowiska programistycznego Kylix.
chowy. Każdy parametr musi mieć określony znajdują się wyniki przeprowadzonych prze-
typ. Oprogramuj zdarzenie AfterExecution ze mnie badań efektywności poszczególnych Podsumowanie
komponentu OraSQL1. Zdarzenie to zacho- technologii. ODAC to technologia komercyjna, współpra-
dzi po wykonaniu bloku PL/SQL. Ja w tym Tabela 1. pokazuje, że jeśli zależy nam na cująca jedynie z Oracle. Jednak moim zdaniem
zdarzeniu wypiszę nazwy i wartości para- efektywności budowanej przez nas aplikacji, jest to jedna z najlepszych technologii dostę-
metrów. Nazwę parametru uzyskuje się po- którą musimy wykonać w Delphi (lub C++ pu do baz danych z poziomu Delphi lub C++.
przez instrukcję OraSQL1.Params[i].Name, Builderze) i Oracle 10g lub Oracle 11g, to Wpływ na moją ocenę miały przede wszystkim
natomiast jego wartość można uzyskać np. warto zastanowić się nad zakupem kompo- efektywność, intuicyjność obsługi, prostota w
poprzez instrukcję OraSQL1.Params[i].As nentów ODAC. tworzeniu aplikacji oraz możliwość wykorzy-
String. Ponadto technologia ODAC ma jeszcze stania specyficznych cech serwera Oracle 10g
Cały kod programu został zamieszczony w jedną zaletę - jest wieloplatformowa (jeśli i Oracle 11g.
Listingu 5. aplikacja zostanie napisana w Delphi z uży-

Efektywność technologii ODAC


Jak już wspomniałem, ODAC to technologia ARTUR MOŚCICKI
komercyjna. Po co zatem wydawać pienią- Artur Mościcki jest z wykształcenia informatykiem. Obecnie pracuje jako programista baz danych i hur-
dze, skoro można stworzyć aplikację z wy- towni danych. Ma również doświadczenie w tworzeniu aplikacji BI dla dużych i średnich firm. Jest współ-
korzystaniem dostępnych w Delphi lub C++ autorem książek: Oracle 10g i Delphi. Programowanie baz danych, SQL Server 2005. Zaawansowane roz-
Builderze komponentów technologii, które wiązania biznesowe oraz Photoshop. Pluginy i efekty specjalne. Oprócz hurtowni i baz danych, jego in-
są standardowo dołączone. ODAC jest tech- formatyczną pasją jest fotografia cyfrowa i obróbka zdjęć za pomocą Adobe Photoshop. W wolnych
nologią bardzo efektywną. W punkcie tym chwilach kibicuje piłkarskiej reprezentacji Argentyny.
zaprezentowane będą wyniki efektywności Kontakt z autorem: arturmoscicki@op.pl

R E K L A M A

www.sdjournal.org 27
Testowanie Oprogramowania

Testy jednostkowe
trudnego kodu w Javie
Testowanie metod statycznych i konstruktorów

Istnieje szereg konstrukcji w kodzie Javy, które skutecznie utrudniają pisanie


testów jednostkowych. Należą do nich wywołania konstruktorów i metod
statycznych. Celem tego artykułu jest przedstawienie różnorodnych technik,
pomocnych w pisaniu testów dla kodu, w którym takie konstrukcje występują.

mialnie zwrócili się w stronę frameworków IOC,


Dowiesz się: Powinieneś: które eliminują konieczność użycia poprzednio
• jak przetestować jednostkowo każdy kod w Ja- • czym testy jednostkowe różnią się od innych wymienionych konstrukcji i czynią kod łatwiej-
vie, rodzajów testów, szym do testowania. Jednak nie w każdym pro-
• jakie są silne i słabe strony różnych technik te- • umieć pisać testy jednostkowe (z wykorzysta- jekcie użycie Springa czy Guice ma sens i nadal
stowania metod statycznych i konstruktorów, niem TestNG i/lub jUnit), istnieje wiele sytuacji, gdzie najbardziej natural-
• do czego mogą przydać się: refaktoring, • umieć korzystać z bibliotek mocków (np. Easy- nym rozwiązaniem jest bezpośrednie wywołanie
aspekty i instrumentacja. Mock, jMock), konstruktora czy też użycie wzorca fabryki (ang.
• mieć pojęcie o AspectJ. factory). Z tego powodu, nawet mimo popular-
ności IOC, wciąż istnieje potrzeba testowania
kodu, który z takich konstrukcji korzysta.
przypadku niepowodzenia (tj. gdy test nie przej- Przyjrzyjmy się fragmentowi kodu, na któ-
dzie) możemy bardzo precyzyjnie zlokalizować rym będziemy testować różne podejścia. Li-
Poziom trudności wadliwy fragment kodu i co za tym idzie, bardzo sting 1. przedstawia fragment klasy dokonu-
szybko dokonać stosownej poprawki. jącej pewnych operacji biznesowych (przykład
Tworzenie mocków ułatwiają wyspecjalizowa- zaczerpnięty z tutoriala biblioteki jMockit).
ne biblioteki – ich najbardziej znanymi przed- Kod ten zawiera zarówno wywołanie konstruk-

A
rtykuł podzielony jest na trzy części. W stawicielami w świecie Javy są jMock i EasyMock. tora (new ServiceB()) jak i metod statycznych
pierwszej przedstawimy problem i po- Cechą obu wymienionych bibliotek jest to, że (Database.find(...), Database.save(...)).
znamy fragment kodu, z którym przyj- tworzą one mocki w oparciu o mechanizm proxy. Możemy zgłosić pod adresem kodu z Listingu 1.
dzie się nam zmierzyć. W drugiej, najobszerniej- Korzystając z wyżej wymienionych bibliotek, zarzut, który najłatwiej wyrazić jako to powinno się
szej, poznamy cztery różne techniki, które umoż- w klasie testowej tworzymy obiekty proxy, a na- było napisać inaczej ! (i dalej rozwodzić się nad tym,
liwią przetestowanie takiego kodu, i omówimy ich stępnie podsuwamy je testowanemu obiektowi czemu singletony są niedobre, nad zaletami kodo-
silne i słabe strony. W części trzeciej pokusimy się zamiast prawdziwych obiektów współpracują- wania do interfejsu, a nie do implementacji, depen-
o podsumowanie całości zagadnienia, dając ogólne cych. Możemy tego dokonać, przekazując proxy dency injection itp. itd.). Zgadzam się, tak nie po-
zalecenia co do postępowania z trudnym do testo- poprzez setter, jako argument konstruktora lub winniśmy kodować. Jednak celem tego artykułu
wania kodem. jako argument testowanej metody – pod warun- jest przetestowanie właśnie takiego, dalekiego od
W sieci znaleźć można liczne artykuły wyczer- kiem, że klasa testowanego obiektu dostarcza ta- ideału kodu. Stąd też przejdziemy do porządku
pująco omawiające testy jednostkowe i nie ma po- ką możliwość. I na tym właśnie polega ogranicze- dziennego nad zgłoszoną wątpliwością, skupiając
trzeby byśmy powtarzali zawarte w nich informa- nie tej techniki. się jedynie na technicznej stronie zagadnienia.
cje. Do naszych celów wystarczy taka oto maksy- Pewne powszechnie stosowane konstrukcje, Zastanówmy się, co warto przetestować w
malnie okrojona definicja testu jednostkowego: jak np. tworzenie instancji obiektu przez wywo- powyższym fragmencie kodu. Wydaje się, że są
Test jednostkowy testuje możliwie mały frag- łanie konstruktora lub niektóre ze wzorców pro- to dwie rzeczy:
ment systemu (najczęściej pojedynczą klasę) w jektowych (np. wzorzec singletonu lub fabryki),
izolacji od reszty systemu. nie poddają się testowaniu przy pomocy mecha- • czy pole total obiektu data jest wypeł-
Testowany fragment kodu izolujemy po- nizmu proxy. Nie ma bowiem możliwości zastą- nione wartością wyliczoną przez ServiceB
przez zastąpienie wszelkich obiektów współ- pienia takich obiektów współpracujących stwo- na podstawie danych zwróconych przez
pracujących specjalnie przygotowanymi obiek- rzonymi obiektami proxy. zapytanie skierowane do Database,
tami mock, które jedynie symulują ich działanie Skoro nie potrafimy tych konstrukcji przetesto- • czy obiekt data został zapisany do bazy
we wskazany przez nas sposób. Dzięki temu, w wać, to ich nie stosujmy uznali developerzy i gre- danych.

28 1/2009
Testy jednostkowe trudnego kodu w Javie

Rozwiązania Aspekty – JEasyTest cza po prostu metodę testową, którą JEasyTest


Możliwe rozwiązania podzielimy na dwie grupy. Pierwsze z proponowanych rozwiązań wyko- powinien się zainteresować.
Pierwsza z nich umożliwia napisanie testów bez rzystuje bibliotekę JEasyTest, która działa w Najciekawsze są jednak fragmenty wykorzy-
jakiejkolwiek ingerencji w kod źródłowy klasy. oparciu o AspectJ. Jej autor - Roberto Malagigi, stujące statyczne metody z pakietu org.jeasy
Druga wymaga dokonania pewnych zmian w ko- stworzył ją z myślą o użyciu jako plugin do Ec- test.external.Util -- fragment on(Databas
dzie testowanej klasy, przekształcając ją w taki spo- lipse, w rzeczywistości można ją również z po- e.class).expectStaticNonVoidMethod("sa
sób, by dalej można już było skorzystać z tradycyj- wodzeniem zastosować do naszych celów. ve").(...) oraz on(ServiceB.class).(...).
nych bibliotek mocków (tj. opartych o mechanizm Spójrzmy na listing 2., który przedstawia Przedstawiają one oczekiwania wobec tego, co
proxy). Każde z opisywanych rozwiązań rozważy- kluczowe fragmenty klasy testującej napisanej ma się stać. Taki fragment kodu:
my, wskazując na jego silne i słabe strony. z użyciem JEasyTest.
W kodzie na Listingu 2. widać dwie specyficz- on(Database.class).expectStaticNonVoidMethod
Metody niewymagające ne dla JEasyTest adnotacje -- @ClassUnderTest ("find").with(arg("select item from
zmian w kodzie testowanej klasy i @JEasyTest. Adnotacja @ClassUnderTest EntityY item where
Poniżej przedstawiam dwa rozwiązania oparte wskazuje bibliotece JeasyTest, jaka klasa jest item.someProperty=?"),
odpowiednio na bibliotece JEasyTest i jMockit. testowana – dzięki temu tworzone są aspek- arg("abc")).andReturn(Collections.
Ograniczymy do minimum opis obu bibliotek, ty zawierające pointcuty wskazujące na odpo- EMPTY_LIST);
skupiając się tylko na cechach istotnych z punktu wiednie miejsca w kodzie testowanej klasy (po
widzenia wykorzystania ich do przetestowania in- skompilowaniu aspekty te znajdą się w katalo- możemy przeczytać jako oczekiwanie, że oto
teresującego nas fragmentu kodu (jednocześnie gu target/jeasytest/generatedAspects – warto się na klasie Database zostanie wywołana statycz-
zachęcam do przyjrzenia się wszystkim możliwo- im przyjrzeć, by mieć lepsze pojęcie o tym, co na metoda find z dwoma argumentami - select
ściom przez nie oferowanym). robi JEasyTest). Adnotacja @JEasyTest ozna- item from EntityY item where item.someProper-
Nim przejdziemy do szczegółów technicznych,
pozwolę sobie przytoczyć fragmenty z tutoriala Listing 1. Kod do przetestowania
JEasyTest, w którym autor przestrzega przed za-
chłyśnięciem się możliwościami, jakie niesie ze public final class ServiceA {
sobą ta biblioteka (tłumaczenie własne): public void doBusinessOperationXyz(EntityX data) throws InvalidItemStatus {
List items = Database.find("select item from EntityY item
• Nigdy nie powinniśmy zapominać o kon- where item.someProperty=?",
cepcjach takich jak luźne powiązanie kom- data.getSomeProperty());
ponentów, zapewnienie wysokiej we- BigDecimal total = new ServiceB().computeTotal(items);
wnętrznej spójność komponentów i wyraź- data.setTotal(total);
ne określenie ich obowiązków, modulary- Database.save(data);
zacja, kodowanie raczej do interfejsów niż }
do implementacji, zasada żądaj, a nie proś, }
dependency injection, i wielu innych.
• [...] fakt, że JEasyTest umożliwia np. moc- Listing 2. Test napisany z użyciem biblioteki JEasyTest
kowanie metod statycznych, nie jest po- @ClassUnderTest(ServiceA.class)
wodem byśmy ignorowali zasady progra- public class ServiceATest extends TestCase {
mowania obiektowego. Używajmy JEasy-
Test w rozważny sposób. private final static BigDecimal TOTAL = new BigDecimal("125.40");

@JEasyTest
Mechanizm proxy public void testBusinessOperation() throws InvalidItemStatus {
a testy jednostkowe EntityX entity = new EntityX(1, "entityName", "entityCode");
Mechanizm proxy stanowi część pakietu ServiceA serviceA = new ServiceA();
java.lang.reflect i jest dostępny od wer- ServiceB servB = createMock(ServiceB.class); // EasyMock
sji JDK 1.3. Umożliwia tworzenie obiektów
proxy, implementujących jeden lub wie-
// oczekiwania wywołań metod statycznych i konstruktora
le interfejsów, których zadaniem jest przyj-
mowanie żądań i przekazywanie ich dalej // z użyciem JEasyTest
do obiektu, który w rzeczywistości je obsłu- on(Database.class).expectStaticNonVoidMethod("find").with(
guje. Mechanizm proxy jest powszechnie arg("select item from EntityY item where item.someProperty=?"),
wykorzystywany przez biblioteki tworzące arg("abc")).andReturn(Collections.EMPTY_LIST);
mocki (EasyMock, jMock) aby:
on(ServiceB.class).expectEmptyConstructor().andReturn(servB);
• przechwycić żądanie skierowane do on(Database.class).expectStaticVoidMethod("save").with(arg(entity));
obiektu, który zastąpiliśmy mockiem,
• zapamiętać wywoływania metod, // oczekiwanie wywołania metody z użyciem EasyMock
• zwrócić żądane wartości. expect(servB.computeTotal(Collections.EMPTY_LIST)).andReturn(TOTAL);
replay(servB);
Słabością proxy z JDK jest fakt, że umożli-
wia on wyłącznie tworzenie obiektów pro- serviceA.doBusinessOperationXyz(entity);
xy dla interfejsów. Z tego powodu wyżej wy- verify(servB);
mienione biblioteki posiłkują się biblioteką assertEquals(TOTAL, entity.getTotal());
CGLib zdolną tworzyć obiekty proxy również }
dla konkretnych klas.
}

www.sdjournal.org 29
Testowanie Oprogramowania

Listing 3. Test napisany z użyciem biblioteki jMockit


ty=? oraz abc; w odpowiedzi na co, klasa Data-
base zwróci pustą listę.
@Test Taki zapis przetwarzany jest przez JEasyTest
public class ServiceATest extends Expectations { na odpowiednie konstrukcje języka AspectJ, a
// wersja klasy Database, którą zastąpimy prawdziwą klasę Database następnie w trakcie budowania projektu kom-
public static class MockDatabase { pilator AspectJ wplata je w kod źródłowy testo-
static int findMethodCallCount; wanej klasy.
static int saveMethodCallCount; Każdy, kto korzysta z frameworków typu
EasyMock, z łatwością odnajdzie się wśród me-
public static void save(Object o) { tod udostępnianych przez JEasyTest. Zauważ-
saveMethodCallCount++; my, że w przypadku EasyMock (zakładając, że
} jesteśmy w stanie podmienić obiekt reprezen-
tujący bazę danych przez mock), analogiczna li-
public static List find(String ql, Object arg1) { nia kodu wygląda podobnie (choć zwięźlej):
findMethodCallCount++;
return Collections.EMPTY_LIST; expect(databaseStub.find("select item from
} EntityY item where item.someProperty=?”,
} "abc")).andReturn(Collections.
EMPTY_LIST);
public void testDoBusinessOperationXyz() throws Exception {
// podmieniamy definicję klasy Database W omawianym fragmencie kodu z listingu 2.
Mockit.redefineMethods(Database.class, MockDatabase.class); używamy JEasyTest wyłącznie do testowania wy-
EntityX data = new EntityX(5, "abc", "5453-1"); wołań metod statycznych i konstruktorów – tam
gdzie to możliwe, korzystamy ze standardowego
final BigDecimal total = new BigDecimal("125.40"); rozwiązania z użyciem biblioteki EasyMock.
//podmieniamy klasę ServiceB Korzystając z JeasyTest, należy zmodyfiko-
Mockit.redefineMethods(ServiceB.class, new Object() { wać sposób budowania projektu – przed odpa-
public BigDecimal computeTotal(List items) { leniem testów odpowiednie aspekty muszą zo-
return total; stać stworzone i wplecione w kod. Nie wymaga
} to od programisty żadnego wysiłku -- JEasyTest
}); dostarcza stosownych tasków ANT-a do wyko-
nania tych zadań; istnieje też plugin do mavena
new ServiceA().doBusinessOperationXyz(data); oferujący analogiczną funkcjonalność.
// sprawdzenie wyników i wartości zapamiętanych przez test-spy Zalety:
assert total.equals(data.getTotal());
assert MockDatabase.findMethodCallCount == 1; • nie musimy dokonywać żadnych zmian w
assert MockDatabase.saveMethodCallCount == 1; kodzie testowanej klasy,
} • kod klasy testowej jest bardzo czytelny (dla
} osób, którym nie jest obca składnia stosowa-
na powszechnie w bibliotekach mocków).
Listing 4. Testowana klasa po refaktoringu extract method
public class ServiceA { Wady:
public void doBusinessOperationXyz(EntityX data) throws InvalidItemStatus {
List items = find(data); • prosty refaktoring (RenameMethod) może
ServiceB serviceB = getServiceB(); uszkodzić test (np. zmiana nazwy metody
BigDecimal total = serviceB.computeTotal(items); find w klasie Database),
data.setTotal(total); • dłuższa kompilacja projektu (związana z
save(data); generacją aspektów i ich wplataniem w
} bytecode, czym zajmuje się kompilator
AspectJ) a co za tym idzie wolniejsze od-
void save(EntityX data) { palanie zestawu testów,
Database.save(data); • nie radzi sobie z klasami oznaczonymi ja-
} ko final.
ServiceB getServiceB() { // uwaga – domyślny identyfikator dostępu !
return new ServiceB(); Instrumentacja
} (mechanizm redefinicji klas)– jMockit
W drugim rozwiązaniu skorzystamy z bibliote-
List find(EntityX data) { // uwaga – domyślny identyfikator dostępu ! ki jMockit, która opiera się na dostępnym w JDK
return Database.find( od wersji 1.5 mechanizmie redefinicji klas (pakiet
"select item from EntityY item where item.someProperty=?", data java.lang.instrument) i używa biblioteki ASM.
.getSomeProperty()); Listing 3. przedstawia fragment kodu klasy te-
} stującej. W kodzie przedstawionym na Listingu 3.
} wprowadziliśmy nową klasę MockDatabase, któ-
rą wykorzystamy jako test-spy (do zliczania wywo-

30 1/2009
Testy jednostkowe trudnego kodu w Javie

łań metod) oraz stub (do zwrócenia pustej kolekcji JVM parametru -javaagent:jmockit.jar. Ja- • nie ma problemów z mierzeniem pokrycia
przy wywołaniu metody find) podczas testu. ko dodatkowy zysk ze stosowania jMockit nale- kodu (ang. code coverage) (warto tu zazna-
Cała tajemnica jMockit opiera się na meto- ży podkreślić możliwość podmiany klas ozna- czyć, że jMockit dostarcza własne narzę-
dzie redefineMethods, która w powyższym czonych jako final (w powyższym przykładzie dzie do mierzenia pokrycia kodu).
przypadku umożliwia: fakt, że klasa ServiceB jest oznaczona jako final
nie stanowi przeszkody w testowaniu) – jest to Wady:
• zastąpienie oryginalnej klasy Database nieosiągalne przy pomocy innych opisywanych
przez klasę MockDatabase, tu technik. • musimy ręcznie stworzyć klasę/klasy test-
• podmianę metody computeTotal w kla- Zalety: spy, co znacznie zwiększa rozmiary klasy
sie ServiceB na implementację zwracają- testu i (zazwyczaj) wprowadza pewną do-
cą wcześniej ustaloną wartość. • nie musimy dokonywać żadnych zmian w zę logiki do klasy testu.
kodzie testowanej klasy,
Podczas uruchamiania testów należy uaktyw- • działa również dla klas oznaczonych jako Metody wykorzystujące
nić agenta jMockit poprzez przekazanie do final, przekształcenia kodu testowanej klasy
W odróżnieniu od zaprezentowanych wcze-
Listing 5. Test dla niefaktorowanie klasy śniej technik, sposoby opisywane w tym roz-
dziale opierają się na takim przekształceniu ko-
public class ServiceATest extends TestCase { du klasy testowanej, by mógł on podlegać testo-
waniu przy pomocy tradycyjnych, tj. opartych
private static final BigDecimal TOTAL = BigDecimal.TEN; na mechanizmie proxy, bibliotek mocków.

class MyServiceA extends ServiceA { Refaktoring + dziedziczenie


private boolean saved = false; Skorzystajmy z refaktoringu extract method,
private ServiceB serviceB; by wydzielić do osobnych metod niewygodne
fragmenty kodu (czyli te zawierające odwoła-
public void setServiceB(ServiceB serviceB) { nia do singletonów lub wywołania konstrukto-
this.serviceB = serviceB; rów) – sens tego kroku stanie się jasny już nie-
} bawem. Listing 4. przedstawia klasę ServiceA
po dokonaniu zmian (proszę porównać z orygi-
@Override nalną wersją widoczną na Listingu 1.).
ServiceB getServiceB() { Dzięki domyślnym modyfikatorom dostępu w
return serviceB; nowo utworzonych metodach, możemy w klasie
} testowej stworzyć klasę dziedziczącą z klasy testo-
wanej i nadpisać te metody. Na Listingu 5. widać,
@Override że w klasie testowej stworzyliśmy podklasę testo-
List find(EntityX data) { wanej klasy ServiceA. Jej implementacja nadpi-
return Collections.EMPTY_LIST; suje trzy nowo utworzone metody – getService,
} find, save – które zwracają wartości wygodne z
punktu widzenia testu. W ten sposób niejako stwo-
@Override rzyliśmy obiekty współpracujące (w postaci nadpi-
void save(EntityX data) { sanych metod) tam gdzie ich wcześniej nie było.
this.saved = true; Zalety:
}
• żadnej magii opartej na aspektach czy in-
public boolean isSaved() { strumentacji – mniej doświadczeni deve-
return saved; loperzy bez trudu połapią się o co chodzi,
} • kod metody testowej
testBusinessOperation jest bardzo prosty
}; do zrozumienia,
• bezproblemowy code coverage,
public void testBusinessOperation() throws InvalidItemStatus { • API testowanej klasy pozostaje niezmienione.
MyServiceA serviceA = new MyServiceA();
ServiceB serviceB = createMock(ServiceB.class); Wady:
serviceA.setServiceB(serviceB);
EntityX entity = new EntityX(1, "abc", "def"); • nie jesteśmy w stanie stwierdzić:
expect(serviceB.computeTotal(Collections.EMPTY_LIST)).andReturn(TOTAL); • czy wywołano metodę save na obiek-
replay(serviceB); cie Database,
serviceA.doBusinessOperationXyz(entity); • czy wywołano metodę computeTotal
verify(serviceB); na obiekcie klasy ServiceB.
assertEquals(TOTAL, entity.getTotal()); • wymaga dużo pracy,
assertTrue(serviceA.isSaved()); • musimy dokonać znacznej ingerencji w
} kod klasy – przy dużej ilości wywołań me-
} tod statycznych lub konstruktorów pro-
wadzi to do bardzo dużych zmian,

www.sdjournal.org 31
Testowanie Oprogramowania

• zmieniliśmy znacznie kod testowanej kla- • jako argumenty metody radziłbym następująco. Jeżeli czas pozwa-
sy, w klasie testowej testowaliśmy jej po- doBusinessOperationXyz. la, wówczas z pewnością warto uzdrowić kod
tomka, a nie tę klasę... to, co właściwie kłopotliwych klas (metoda 4.) – zyski będą
przetestowaliśmy ?, Zakładając, że wybierzemy najpopularniej- długoterminowe.
• klasa testowa urosła do nieprzyzwoitych szą z opcji (settery), kod testu wyglądać bę- Jeżeli czasu brak (bo np. odziedziczyliśmy
rozmiarów i zawiera bardzo dużo ko- dzie tak: projekt, który w całości nadaje się do przepi-
du, którego zadaniem jest przygotowanie Jak widać na Listingu 6., w przypadku gdy sania, lub też korzystamy z licznych biblio-
gruntu pod właściwy test, wszystkie obiekty współpracujące są wstrzeli- tek zewnętrznych narzucających korzysta-
• by móc w testach dokonać sprawdzenia wane zgodnie z DI, wówczas w teście wystarczy nie z określonych konstrukcji), wówczas po-
różnych scenariuszy, będziemy musie- zastąpić je klasycznymi mockami. zostają techniki oparte na aspektach albo in-
li w klasie testowej albo stworzyć kilka Zalety: strumentacji.
klas dziedziczących z testowanej klasy (co Nie widzę tutaj wyraźnej przewagi żad-
oznacza sporo pracy) lub stworzyć jedną • poprawiliśmy design testowanej klasy, nej z nich i wybór pozostawiam gustom czy-
klasę i wyposażyć ją w pewną dozę logiki • (najprawdopodobniej) poprawiliśmy desi- telnika.
(co również oznacza sporo pracy i dodat- gnu całego projektu, Osobiście wybieram jEasyTest, bo odpo-
kowo możliwość wprowadzenia błędów w • testy stają się proste. wiada mi jego składnia (zbliżona do zna-
samej klasie testowej !), nych mi frameworków), a w jMockit irytuje
• czy wprowadzając zmiany do testowanej Wady: mnie konieczność ręcznej implementacji za-
klasy polepszyliśmy jej design, czy też po- stępowanej klasy. Ale jako że oba podejścia
psuliśmy go? – jeżeli to drugie, to doszło • musieliśmy zmienić API klasy, mają swoje wady i zalety, nie skreślam żad-
do paradoksalnej sytuacji – testy, które ze • (najprawdopodobniej) musieliśmy doko- nego z nich.
swojej natury mają stać na straży jakości nać wielu zmian w całym projekcie. Również w przypadku, jeżeli kłopotliwy do
kodu, doprowadziły do pogorszenia pew- testowania kod występuje bardzo sporadycz-
nych cech tego kodu. Podsumowanie nie w projekcie, wówczas prawdopodobnie naj-
Jak zwykle w przypadku istnienia wielu me- łatwiej posłużyć się techniką 3. lub 4., nie włą-
Zmiana API tod poradzenia sobie z problemem nie istnie- czając do procesu testowania dodatkowych bi-
Ostatnia z prezentowanych technik jest bar- je najlepsze rozwiązanie. Wszystko zależy od bliotek.
dzo prosta (przynajmniej w teorii) i opiera się konkretnego przypadku. Jeżeli miałbym za-
na prostym założeniu, że wszelkie niewygod- proponować ogólny sposób postępowania to
ne z punktu widzenia testów konstrukcje na-
leży wyeliminować. Słusznie, ale w przypadku Listing 6. Test dla klasy o zmienionym API
omawianego kodu, takie podejście oznacza po-
ważne zmiany nie tylko w API testowanej klasy, private static final BigDecimal TOTAL = new BigDecimal(10);
ale i w całym projekcie: private static final String SOME_PROPERTY = "some_property";
private ServiceA serviceA;
• np. singleton Database należy zastąpić private EntityDAO entityDAO;
zwykłą klasą (o jej singletonowość zadba np. private ServiceB serviceB;
Spring), private Entity entity;
• klasa ServiceA powinna otrzymywać private List items;
obiekty współpracujące jako:
• argumenty konstruktora, @Override
• poprzez settery, protected void setUp() throws Exception {
serviceA = new ServiceAImpl();
serviceB = createMock(ServiceB.class);
TOMASZ KACZANOWSKI entityDAO = createMock(EntityDAO.class);
Jestem developerem Javy, pracuję w firmie Softwa- entity = createMock(Entity.class);
re Mind S.A. Od dłuższego czasu śledzę (i wypró- items = createMock(List.class);
bowuję na własnym kodzie) wszystko co związane serviceA.setEntityDAO(entityDAO);
z testami – zwłaszcza jednostkowymi. serviceA.setServiceB(serviceB);
Kontakt z autorem: tkaczano@poczta.onet.pl }

public void testBusinessOperation() throws InvalidItemStatus {


W Sieci expect(entityDAO.find("select item from EntityY item where item.someProperty=?",
SOME_PROPERTY)).andReturn(items);
• https://jeasytest.dev.java.net/ – strona
domowa projektu JEasyTest expect(entity.getSomeProperty()).andReturn(SOME_PROPERTY);
• http://www.jmock.org – strona domowa expect(serviceB.computeTotal(items)).andReturn(TOTAL);
projektu jMock entity.setTotal(TOTAL);
• http://www.easymock.org – strona do- entityDAO.save(entity);
mowa projektu EasyMock replay(entityDAO, serviceB, entity, items);
• http://java.sun.com/j2se/1.5.0/docs/api/
serviceA.doBusinessOperationXyz(entity);
java/lang/reflect/Proxy.html – informa-
cje o mechanizmie proxy verify(entityDAO, serviceB, entity, items);
• https://jmockit.dev.java.net/ – strona do- }
mowa projektu jMockit

32 1/2009
Testowanie oprogramowania

Adobe Flash
w budowie dynamicznych interfejsów HMI

Już ponad 300 milionów mobilnych urządzeń wyposażonych jest w interfejsy


graficzne (GUI), wykorzystujące technologię Adobe Flash. Przewiduje się,
że liczba ta przekroczy do 2010 roku miliard. Firmy projektujące systemy
wbudowane na potrzeby przemysłu, branży medycznej i motoryzacyjnej
również zaczynają stosować Flash.
sprzętowej. W efekcie twórcy mogą tworzyć kom-
Dowiesz się: Powinieneś wiedzieć: ponenty GUI raz, a następnie wykorzystywać je w
• Jak zintegrować technologię Flash z tradycyj- • Co to są systemy wbudowane; różnych systemach przeznaczonych na różne ryn-
ną grafiką 2D/3D; • Co to jest interfejs HMI; ki i do różnych grup cenowych.
• Jak połączyć korzyści płynące z zastosowania • Co to jest technologia Flash. Nie mniej jednak, aby spełnić wymagania
czasu rzeczywistego i technologii Adobe Flash? twórców korzystających z rozwiązań wbudo-
wanych, wdrożenie oprogramowania Flash mu-
si rozwiązywać kilka kwestii:
wości wyświetlania niezbędne do uzyska-
nia zadowalającego efektu Flash na moni- • w jaki sposób twórcy integrują treść Flash
Poziom trudności torach VGA i większych. Na przykład, aby z innymi programami graficznymi, takimi
uzyskać dobrą animację 10 klatek na se- jak przeglądarki sieciowe lub aplikacje do
kundę, system potrzebuje procesora z co wizualizacji 3D? Czy zwykły monitor ob-
najmniej 100 MIPS (milionami instrukcji służy jednocześnie zarówno animacje Flash

W
przeszłości zespoły opracowujące na sekundę) – to znacznie mniej niż typo- i własną grafikę 2D/3D, nawet jeśli wyko-
oprogramowanie musiały przekła- we 300 MIPS i więcej, oferowane obecnie rzystują one różne modele rysowania?
dać prototypy interfejsów GUI na przez procesory wbudowane. • w jaki sposób twórcy mogą zapewnić, że
kody C, C++ lub Java, co było mozolnym pro- interfejs użytkownika działający w opar-
cesem, trwającym całe tygodnie lub nawet mie- Aby przejść do Flash, twórcy przemysłowych ciu o oprogramowanie Flash będzie wydaj-
siące. Obecnie zespoły te mogą projektować i systemów kontroli mogą korzystać z narzę- ny w warunkach zmiennego obciążenia?
tworzyć komponenty GUI przy wykorzystaniu dzi, z których wiele i tak już stosują. Mogą na Interfejsy GUI większości systemów wbu-
narzędzi Flash wysokiego poziomu i stosować przykład skorzystać z narzędzi oprogramowa- dowanych muszą zawsze szybko reagować
je bezpośrednio na wbudowanych odtwarza- nia CAD i procesorów tekstu, aby stworzyć na działania użytkownika i w efekcie wy-
czach Flash bez konieczności zapisywania ko- treść do programu Flash i zastosować narzę- magają kontroli poziomu dostępu i wydaj-
du graficznego. dzia konwersji w celu dostosowania różnorod- ności w czasie rzeczywistym;
Adobe Flash nabiera znaczenia wśród firm nych formatów prezentacji do formatu Flash. • w jaki sposób twórcy zapewniają wiarygod-
opracowujących systemy wbudowane z kilku Mogą też wykorzystywać komponenty Flash ność interfejsu użytkownika działającego w
powodów: integrujące treść Flash z ActiveX. Tak szero- oparciu o oprogramowanie Flash? Czy sys-
ki zakres kompatybilności w zakresie tworze- tem może monitorować awarie i usuwać je
• ponad milion projektantów graficznych na nia treści Flash i kontroli na ekranie uprasz- bez zakłóceń? Czy treść Flash może współ-
całym świecie wykorzystuje narzędzia au- cza przejście na interfejsy działające w opar- istnieć z procesami krytycznymi?
torskie Flash, zapewniające ogromne zasoby ciu o Flash.
grafiki, z których mogą czerpać. Co więcej, W jaki sposób twórcy kontrolują to, jak treść
twórcy mogą w prosty sposób integrować ty- Nieograniczone możliwości Flash współdziała z usługami systemu opera-
siące komponentów Flash już występujących W przeciwieństwie do języków programowania cyjnego (OS), takimi jak dźwięk, ekrany doty-
na rynku desktopów i małych urządzeń; i narzędzi ogólnego zastosowaniu Flash zapew- kowe, sterowniki urządzeń, dla których czas
• w porównaniu z odtwarzaczami Flash ty- nia specjalistyczne środowisko grafiki i multime- ma krytyczne znaczenie, systemy plików i czy
pu desktop, wbudowane odtwarzacze diów, oferując niemal nieograniczone możliwo- obsługa sieci?
Flash firmy Adobe (na przykład Flash Li- ści budowania nowych efektów. W efekcie twór-
te 3) zajmują mniej pamięci i zapewniają cy korzystający z rozwiązań wbudowanych mo- Integracja programów Flash
szybsze operacje przy mniejszym zajęciu gą tworzyć animacje i efekty specjalne w znacz- z innymi aplikacjami graficznymi
procesora; nie krótszym czasie. Poza tym certyfikacja Ado- Tradycyjnie odtwarzacz Flash działa z przeglą-
• procesory i chipy graficzne w konstrukcji be Flash Player zapewnia, że aplikacje powstałe na darką internetową lub uruchamia się w systemie
wbudowanej obsługują obecnie częstotli- bazie Flash działają tak samo na każdej platformie okienek. Jednakże rozwój interfejsu GUI można

34 01/2009
Adobe Flash – budowanie dynamicznych interfejsów HMI

znacznie uprościć poprzez odwrócenie tego mo- innymi aplikacjami graficznymi na tym samym wet, gdy system realizuje jednocześnie kilka
delu i uczynienie z Flash głównego oprogramo- ekranie. Na Rysunku 1. odtwarzacz Flash rysuje obciążających procesor zadań. Nie ma tu miej-
wania, które uruchamia wszystkie aplikacje gra- na pierwszym planie i kontroluje rysowanie wi- sca na czekanie. Jeszcze większe wyzwanie poja-
ficzne, niezależnie od tego, czy działają one w zualizacji 3D w warstwie tła. Aby uwidocznić wia się, gdy o czas procesora walczy kilka progra-
oparciu o oprogramowanie Flash. Flash doskona- plan trójwymiarowy, twórca zastosował techni- mów graficznych. Jednym z rozwiązań jest stwo-
le sprawdza się jako menedżer ekranu, pozwala- kę chroma key w warstwie tła. Ponieważ rende- rzenie centralnego menedżera, który wykorzy-
jąc grafikowi kontrolować zmiany menu i efek- rowanie 3D i renderowanie Flash zachodzi na stuje priorytety wątków do wskazania, kiedy da-
tów. Upraszcza ponadto dostosowanie środowi- niezależnych warstwach, kontroler grafiki mo- ny program uzyskuje dostęp do procesora.
ska, pozwalając projektantom i twórcom dowol- że odświeżać wizualizację 3D bez konieczności W tej metodzie program (na przykład, odtwa-
nie rozmieszczać, wymiarować i konfigurować przerysowywania treści Flash. Eliminuje to mi- rzacz wykorzystujący Flash do prezentacji do-
komponenty graficzne. gotanie i zmniejsza obciążenie procesora. kumentacji filmowych), który musi połączyć
Rysunek 1. przedstawia przykład zastosowa- Twórca może również zastosować techniki ta- się ze środowiskiem graficznym, wysyła prośbę
nia oprogramowania Flash jako menedżera ekra- kie jak alpha blending i chroma key, aby sprawić, do centralnego menedżera. Menedżer przyzna-
nu. Program po lewej stronie to odtwarzacz Flash, że komponenty Flash staną się półprzezroczyste, je dostęp lub go odmawia, w zależności od tego,
który załadował dwa komponenty bezpośrednio a następnie umieścić je bezpośrednio w innej tre- czy program ma wystarczające uprawnienia. Po
do swojej przestrzeni na aplikacje: bibliotekę gra- ści. Rysunek 2, ukazujący półprzezroczyste ostrze- połączeniu program uzyskuje dostęp do mecha-
fiki 2D i sterownik graficzny, kontrolujący sprzęt żenie wyświetlane na animowanej konsoli stero- nizmu wzajemnego wykluczenia (mutex). Gdy
graficzny. Załadowanie sterownika w ten sposób wania. Przykład ten demonstruje, że metoda ta program chce narysować coś na ekranie, czeka
umożliwia programowi bezpośrednie sterowanie umożliwia zamieszczenie większej ilości informa- zablokowany na mutexie, następnie otrzymu-
chipem graficznym, co wpływa na zwiększenie cji na niewielkim ekranie. Ponieważ ostrzeżenie i je dostęp, rysuje bezpośrednio w chipie graficz-
wydajności. Program własny OS po prawej stronie konsola są renderowane w różnych warstwach, ste- nym i zwalnia mutex. Każdy program graficz-
rysuje wizualizacje 3D w OpenGL ES, standardo- rownik graficzny może ponownie rysować kon- ny współzawodniczy o mutex na podstawie prio-
wym API 3D dla systemów wbudowanych. Po- solę bez konieczności rysowania ostrzeżenia. Pół- rytetów. Ponieważ program graficzny o najwyż-
dobnie jak program środowiska Flash, także bez- przezroczyste komponenty pozwalają umieścić na szym priorytecie zawsze otrzyma mutex jako
pośrednio kontroluje on sprzęt graficzny, zapew- niewielkim ekranie więcej informacji. pierwszy, metoda ta zapewnia stosunkowo wy-
niając wysoką wydajność. soki poziom wydajności w czasie rzeczywistym
Liczne chipy graficzne systemów wbudowa- Zapewnienie i niezmiennie szybkie działanie.
nych obsługują obecnie techniki wielowarstwo- przewidywalnych czasów reakcji Jednak w warunkach dużego obciążenia proce-
we, co umożliwia programom działającym w Wbudowany interfejs GUI winien zawsze re- sora – np. gdy system zarządza sterowaniem wie-
oparciu o Flash bezkonfliktową współpracę z agować szybko na komendy użytkownika, na- loma procesami lub synchronizuje tysiące punk-
tów danych – wydajność interfejsu GUI może się
obniżyć do nieakceptowanego poziomu. W sys-
O QNX Software Systems
QNX Software Systems, firma należąca do Harman International, to przodu- temie zamkniętym, w którym, można kontrolo-
jący, światowy dostawca innowacyjnych technologii wbudowanych, w tym wać przypadki wykorzystania, zespół opracowu-
środków programowo-sprzętowych, narzędzi rozwojowych i systemów ope- jący oprogramowanie może być w stanie zapobiec
racyjnych. Systemy wykorzystujące komponenty architektury QNX® Neutrino® takim sytuacjom. Jednakże staje się to znacznie
RTOS, QNX Momentics® i QNX Aviage® wspólnie zapewniają najbardziej niezawodne i skalowal- trudniejsze w systemach, które muszą dynamicz-
ne rozwiązania do tworzenia wydajnych systemów wbudowanych. Liderzy rynku globalnego, ta-
cy jak Cisco, Daimler, General Electric, Lockheed Martin i Siemens wykorzystują technologię QNX
nie przetwarzać nowe treści lub aplikacje.
w routerach sieciowych, sprzęcie medycznym, systemach telematyki samochodowej, systemach Sposobem na rozwiązanie tego problemu jest
zabezpieczenia i ochrony, robotach przemysłowych i innych zastosowaniach o krytycznym zna- podział czasu. Technika ta umożliwia konstruk-
czeniu. Firma ma siedzibę w Ottawie w Kanadzie i sprzedaje swoje produkty w ponad 100 kra- torowi systemu na umieszczenie komponentów
jach na całym świecie. oprogramowania w oddzielnych przedziałach i
przypisanie gwarantowanej części czasu proce-
sora każdemu przedziałowi. Na przykład kon-
struktor może przypisać 20% czasu procesora
interfejsowi GUI, 20% sterowaniu PID, synchro-
nizacji bazy danych 30% i tak dalej. Dzięki tej
metodzie interfejs GUI może szybko reagować
na działania użytkownika, bez względu na to,

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

����������

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

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

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

Rysunek 2. Interfejs GUI wykorzystujący


Rysunek 1. Zintegrowanie aplikacji Flash z innymi aplikacjami graficznymi. W tym przykładzie technikę alpha blending w celu ukazania
wykorzystujący Flash program kontroluje aplikację do wizualizacji 3D działającą w oparciu o OpenGL ES półprzezroczystego ostrzeżenia na animowanej
3D API konsoli sterowania.

www.sdjournal.org 35
Testowanie oprogramowania

jak pilne stają się procesy w innych przedzia- Może on też pomóc zapewnić, że funkcje po- • odtwarzacz wideo Flash, który zapew-
łach – nawet jeśli mają one wyższy priory- wiadamiania o awariach i naprawy będą reali- nia obsługę umożliwiającą uruchamianie,
tet. zowane bez zwłoki, nawet jeśli mają one niski przewijanie do przodu i do tyłu itd. (śro-
Często procesy w danym przedziale nie zu- priorytet. Im szybciej zostaną one uruchomio- dek ekranu);
żywają wszystkich przydzielonych cykli pro- ne, tym lepiej można zapobiec sytuacji, w któ- • interfejs HMI, napisany z wykorzysta-
cesora. W systemie QNX® Neutrino® RTOS rej awaria oprogramowania przerodzi się w po- niem programu Flash, kontrolujący
mechanizm podziału na przedziały może z tego ważny kryzys. przyciski głównego menu (dolna części
skorzystać i dynamicznie przydzielać niezużyte ekranu).
cykle procesora przedziałom, które są w stanie Zarządzanie interakcjami
wykorzystać dodatkowy czas przetwarzania. Aby skutecznie zintegrować Flash, twórcy ko- W tym przykładzie interfejs HMI urucha-
Metoda ta umożliwia interfejsowi GUI działa- rzystający z rozwiązań wbudowanych muszą mia i steruje odtwarzaczem wideo Flash
jącemu na bazie Flash szybszą i równiejszą pra- zarządzać dwoma rodzajami interakcji: (Flash kontroluje Flash). Odtwarzacz wideo
cę, gdy dostępny jest dodatkowy czas procesora. Flash komunikuje się wówczas z usługą od-
Z kolei inne podsystemy oprogramowania mo- • wykorzystaniem treści Flash w celu uru- twarzania wideo systemu operacyjnego po-
gą działać szybciej w momencie, gdy interfejs chamiania i kontroli innych treści Flash przez serwer HMI (treść Flash komuniku-
GUI nie zużywa wszystkich przypisanych mu – wymaga to mechanizmu, który umoż- je się z usługami własnymi systemu opera-
zasobów procesora. liwi głównej aplikacji Flash załadowanie, cyjnego).
umiejscowienie i zwolnienie drugorzęd- Serwer HMI zapewnia asynchroniczną ko-
Zarządzanie nych aplikacji Flash; munikację z usługami systemu operacyjne-
sytuacjami awaryjnymi • umożliwienie nawiązania komunikacji po- go. Taka metoda chroni interfejs HMI, dzia-
Aby zapobiec niesprawności systemu, wiele między treścią Flash a usługami systemu łający w kontekście odtwarzacza Flash, przed
systemów wbudowanych wymaga określone- operacyjnego – wymaga to mechanizmu potencjalnym spowodowaniem wstrzyma-
go poziomu dynamicznego usuwania awarii. przekazywania żądań danych. nia przez interfejs GUI działający w oparciu
Korzystając z mechanizmów powiadamiania o Flash, przyjmowania danych lub rysowania
o awariach zapewnianych przez system ope- Rysunek 3. przedstawia przykład tego, jak na ekranie.
racyjny, wspomniany centralny menedżer mo- można wdrożyć takie interakcje. Interfejs
że uzyskać informacje o niesprawnych aplika- HMI umożliwia głównej aplikacji Flash za- Doskonała mieszanka
cjach graficznych. Jeżeli awaria wystąpi w pro- rządzanie drugorzędnymi aplikacjami Flash Podsumowując, zespoły wykorzystujące roz-
gramie wykorzystującym Flash lub programie (przeglądanie punktów danych, menedżer wiązania wbudowane mogą zyskać wydajność
graficznym, gdy będzie on posiadał przydzie- konfiguracji systemu itp.), natomiast serwer w czasie rzeczywistym i wzmocnić niezawod-
lony mutex, centralny menedżer może zwol- HMI zapewnia bramkę do usług systemu ność, zwiększając jednocześnie moc i skracając
nić mutex i przydzielić go następnemu pro- operacyjnego. czas wprowadzania produktu na rynek, co jest
gramowi w kolejce priorytetów. Menedżer Należy rozważyć, w jaki sposób układ taki zapewniane przez Adobe Flash. Ponadto mo-
może też odzyskać wszelkie zasoby wykorzy- może działać w aplikacjach odtwarzacza wi- gą wykorzystywać oparte o komponenty struk-
stywane przez uszkodzony program i ponow- deo. Jeśli spojrzymy na Rysunek 4, dostrzeże- tury HMI, które niezauważalnie połączą się z
nie go uruchomić. my interfejs użytkownika który obejmuje: aplikacjami 2D/3D, aplikacjami Flash i multi-
Omówiliśmy sposób, w jaki podział czasu mediami.
może wspomóc szybkość i niezmienność reak- • obszar podglądu, ukazujący treść wideo
cji interfejsu GUI na działania użytkownika. (górna część ekranu);

������ ����������
BILL GRAHAM I PAUL N. LEROUX
����� ������� �����
����� ������������� ������ QNX Software Systems
������ ������� ������������ ������
������������ ������������ ������������ ������������ ������������ Kontakt: bgraham@qnx.com, pt:aull@qnx.com

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

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

�����������

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


������� ��������
������ ������� ������ ������ ������
������ ������ ������
Rysunek 4. W tym przykładzie, interfejs HMI
wykorzystujący Flash odpowiada za przyciski menu
Rysunek 3. Architektura zarządzania interakcjami pomiędzy kilkoma aplikacjami Flash oraz aplikacjami (dolna część ekranu), zaś odtwarzacz wideo Flash
wykorzystującymi i nie wykorzystującymi Flash odtwarza film w warstwie przechwytywania wideo

36 01/2009
Hurtownie danych

Informacja w służbie
organów bezpieczeństwa
Systemy analityczne jako skuteczne
narzędzie pracy organów bezpieczeństwa publicznego

W treści artykułu przedstawiono syntetyczne omówienie systemu


analitycznego wykorzystującego mechanizmy hurtowni danych jako
skutecznego narzędzia organów bezpieczeństwa publicznego działających
na rzecz poprawy bezpieczeństwa obywateli. W opisie wykorzystano
doświadczenia z wdrożenia systemu analitycznego w polskiej Policji.
temach przez lata terabajty danych, w ob-
Dowiesz się: Powinieneś wiedzieć: liczu pojawiających się wciąż nowych form
• Czym jest System Analityczny i jaka jest jego • Ogólna wiedza na temat Hurtowni Danych. przestępczości stały się na tyle istotne w pro-
ogólna architektura; cesie zwiększenia skuteczności działań Policji,
• Jak przebiega proces tworzenia Systemu Ana- że należało dokonać przeorganizowania, upo-
litycznego; rządkowania i zoptymalizowania przechowy-
• Jaką rolę odgrywa informacja elektroniczna we wanych w różnych miejscach danych pod ką-
współczesnych systemach bezpieczeństwa pu- tem pewnego wycinka rzeczywistości. W ten
blicznego. sposób powstał w Policji system analityczny
wykorzystujący mechanizmy hurtowni da-
nych (data wherehouse) [1,2].
ny dostęp do nowoczesnych technologii jest Sposób organizacji danych w systemie ana-
niezbędny zarówno w działaniach służb kry- litycznym Policji zapewnia dostęp do takich
Poziom trudności minalnych, prewencyjnych, jak i wspoma- funkcjonalności analizowania danych, których
gających. Wykorzystywanie zaawansowa- uzyskanie bez wcześniejszej ich przebudowy
nych rozwiązań informatycznych umożli- byłoby niemożliwe. W skład systemu wchodzą
wia bezzwłoczną reakcję na zdarzenie, nie- wyspecjalizowane tematycznie podzbiory (da-

O
rgany administracji rządowej, nie zawodną wymianę informacji oraz typowa- ta marts) zorganizowane, odpowiednio do bie-
będą działać efektywnie i skutecz- nie sprawców przestępstw, jak również efek- żących potrzeb służb kryminalnych i prewen-
nie, nie są w stanie spełnić pokła- tywne dysponowanie siłami Policji. W wal- cyjnych Policji.
danych w nich oczekiwań bez korzystania ce z przestępczością, w tym z przestępczo-
z nowoczesnych technologii. Bez sprawnie ścią zorganizowaną, wręcz nieodzowne jest Koncepcja systemu analitycznego
funkcjonujących systemów teleinformatycz- wykorzystywanie najnowocześniejszych i Koncepcja budowy policyjnego systemu ana-
nych trudno sobie wyobrazić także nowocze- najskuteczniejszych narzędzi umożliwiają- litycznego wykorzystującego mechanizmy
sne i dobrze zorganizowane organy państwa cych wymianę informacji, szybkie przetwa- hurtowni danych zakładała stworzenie wy-
działające na rzecz bezpieczeństwa obywate- rzanie i analizę danych. Brak ograniczeń te- odrębnionego, od innych systemów infor-
li i porządku publicznego. Jednym z nich jest rytorialnych dla działań przestępczych spra- matycznych Policji, środowiska aplikacyj-
Policja, która jako umundurowana i uzbrojo- wia, że bez wsparcia pracy Policji zaawanso- nego posiadającego dedykowaną bazę da-
na formacja służąca społeczeństwu i przezna- wanymi technologiami, służba społeczeń- nych [3,4]. Miało to na celu przede wszyst-
czona do ochrony bezpieczeństwa ludzi oraz stwu, ochrona obywateli oraz utrzymywanie kim wydzielenie funkcji analitycznych z sys-
do utrzymywania bezpieczeństwa i porząd- bezpieczeństwa i porządku publicznego sta- temów nie przeznaczonych to tego typu ope-
ku publicznego, bez dostępu do nowocze- łoby się niemożliwe. racji, w tym głównie z Krajowego Systemu
snych rozwiązań informatycznych, nie mo- Policyjne systemy informacyjne, ze wzglę- Informacyjnego Policji (KSIP) [5]. Przyję-
że efektywnie i skutecznie realizować swo- du na swoją specyfikę, stały się magazynami to, że zasilanie bazy analitycznej będzie od-
ich zadań. wartościowych danych, których łatwość prze- bywać się z różnorodnych źródeł danych, a
Obecnie działania Policji coraz częściej syłania, przechowywania, jak i przetwarza- gromadzone w niej informacje będą upo-
opiera się na gromadzeniu, analizie i wyko- nia ogromnie zwiększyły wydajność pracy na rządkowane tematycznie, zintegrowane, za-
rzystywaniu informacji we wszystkich ob- rzecz bezpieczeństwa i porządku publiczne- silane przyrostowo, często redundantne i od-
szarach jej aktywności. Szybki i niezawod- go. Jednocześnie zgromadzone w wielu sys- powiednio zagregowane oraz będą zawierały

38 01/2009
Informacja w służbie organów bezpieczeństwa

wymiar czasowy. Na podstawie pobieranych nego spojrzenia na organizację jako całość • Elementy zasilające (interfejsy do sys-
danych będą tworzone odpowiednie agrega- do szczegółowej analizy wybranych, inte- temów źródłowych, w tym głównie do
ty, tj. postać przekształcona na potrzeby ra- resujących składników, KSIP);
portowania statystycznego oraz dodatkowe • zaawansowaną kontrolę dostępu do da- • System analityczny, w tym:
struktury danych umożliwiające prowadze- nych wrażliwych w celu śledzenia i elimi- • obszar przejściowy;
nie analiz. nacji zjawisk nielegalnego wykorzystania • repozytorium danych i narzędzi anali-
Założono, że system ten ze względu na za- informacji, tycznych oraz narzędzi do przekształ-
stosowane zaawansowane rozwiązania tech- • wspomaganie grup dochodzeniowo- cania i ładowania danych.
niczne, w tym implementację najnowszych śledczych poprzez typowanie informa- • Metadane przetwarzania, praw dostępu i
rozwiązań z dziedziny wyszukiwania da- cji szczegółowych na podstawie niepeł- raportowe;
nych, ich wszechstronnego analizowania, nych informacji, a tym samym zawęża- • Narzędzia do publikacji danych umożli-
modelowania i prezentacji będzie wspie- nie listy poszukiwanych osób lub przed- wiające dostęp do danych;
rał działania funkcjonariuszy i pracowni- miotów. • Zbiory danych główne i pomocnicze.
ków cywilnych Policji bezpośrednio na ich
stanowiskach pracy, w zakresie określonym Wdrożenie systemu analitycznego pozwo- Rysunek 1. ukazuje logiczną architekturę po-
ich potrzebami oraz posiadanymi przez nich li także na zwiększenie czytelności danych, licyjnego systemu analitycznego obrazującą
uprawnieniami. gdyż o ich umiejscowieniu decyduje tematy- zależności funkcjonalne pomiędzy ww. skła-
W systemie tym, jako centralnej bazie da- ka, a nie przykładowo ich pochodzenie, czy dowymi.
nych fizycznie wydzielonej od innych syste- też przeznaczenie. System analityczny jest zasilany ze źródeł
mów, będą gromadzone dane pozyskiwane Założono, że ułatwienie dostępu do zagre- danych (tabele źródłowe, dzienniki zmian,
okresowo z wszelkich innych policyjnych i po- gowanych danych zwiększy także jakość pla- etc), w tym z bazy KSIP. Dane źródłowe są naj-
zapolicyjnych baz danych. W trakcie ładowania nowania, prognozowania i określania strate- pierw weryfikowane i przetwarzane (procesy
dokonywane będzie scalanie i ujednolicanie da- gii. Wszelkie decyzje podejmowane w opar- ETL – extraction, transformation, loading) w
nych oraz ich transformacja i agregacja. Struk- ciu o dane zgromadzone w systemie anali- obszarze przejściowym, a następnie ładowa-
tura i użyte do budowy systemu analityczne- tycznym będą efektywniejsze z uwagi na rze- ne do obszaru struktur docelowych, tzw. re-
go narzędzia będą zoptymalizowane pod ką- telne i aktualne informacje oraz dedykowa- pozytorium danych. W ten sposób, po zakoń-
tem przetwarzania analitycznego w sposób po- ny dla tego rodzaju funkcjonalności model czeniu procesów ETL wszelkie zapytania, ana-
zwalający na: danych. lizy, statystki oraz typowania mogą być wyko-
nywane w oparciu o docelowe, zoptymalizo-
• tworzenie przekrojowych analiz danych, Architektura wane struktury danych.
w tym weryfikację podjętych przez odpo- systemu analitycznego W obszarze przejściowym dane są spraw-
wiednie służby decyzji oraz badanie ich Konstrukcja policyjnego systemu analitycz- dzane pod względem ich zgodności ze zało-
skuteczności, nego zakładała wykorzystanie centralnej ba- żonymi kryteriami poprawności. Kryteria te
• identyfikację i odkrywanie przyczyn zy danych jako miejsca przechowywania da- dotyczą ewentualnych sytuacji nieprawidło-
zjawisk oraz zależności pomiędzy nimi, nych. Dlatego też dane główne oraz dane po- wych, które mogą być poprawione automa-
w tym wyszukiwanie współzależności mocnicze wraz z repozytorium danych syste- tycznie lub wymagają interwencji użytkow-
przestępczych poprzez analizę porów- mu analitycznego zostały umieszczone w no- nika.
nawczą wpływu pojawienia się na da- wej bazie, oddzielnej w stosunku do systemów Takiej weryfikacji dokonują procesy, które
nym obszarze zjawiska (przestępstwa) zasilających bazę analityczną, w tym bazy da- mogą korzystać z metadanych obszaru przej-
i korelację z pojawieniem się lub zani- nych Krajowego Systemu Informacyjnego Po- ściowego, np. dla operacji mapowania, prze-
kaniem innych zjawisk (rodzajów prze- licji (KSIP). kodowania, ze zbiorów dozwolonych warto-
stępstw, innych faktów towarzyszą- W skład systemu analitycznego wchodzą na- ści, reguł zachowania kolejności itp. Kolejno,
cych), stępujące elementy: w obszarze tym odbywa się właściwe przetwa-
• formułowanie prognoz zachowań, czy też
doszukiwanie się określonych trendów
na skutek rejestrowanych i przechowy- ������������������
wanych w długim horyzoncie czasowym
����
zdarzeń oraz innych faktów towarzyszą- �������������������
����������������
cych, ������������������
�������
• otrzymywanie na czas aktualnej informa- �������� ���������������
cji, np. lokalnej lub globalnej mapy prze- �����������
stępczości pomocnej w planowaniu i alo- � ����������������
���������
kacji służb, � ���������
• przeprowadzanie analiz gromadzonych
danych zarówno w formie liczbowej, jak
i graficznej, w celu wyboru wąskiej gru- ���������������������
����������������������
py najistotniejszych informacji wymagają-
cych ciągłego monitorowania - dzięki zwę- ������������������
żeniu danych, sam nadzór nad nimi staje
się dużo bardziej efektywny i mniej czaso-
���������������
chłonny,
• analizę przyczyn powstawania zjawisk
przestępczych poprzez umożliwienie za-
głębienia się w dane, drążenia ich od ogól- Rysunek 1. Architektura logiczna systemu analitycznego

www.sdjournal.org 39
Hurtownie danych

rzanie danych źródłowych, czyli m.in. nada- Implementacja aktualnych, istotnych i przydatnych informa-
wanie wartości domyślnych, nadawanie klu- i wdrożenie systemu cji za pośrednictwem interfejsu internetowe-
czy sztucznych oraz przeprowadzana jest W procesie implementacji policyjnego sys- go. Pakiet ten składa się z kilku produktów,
analiza składniowa złożonych zapisów. Dane temu analitycznego wykorzystano aktual- które mogą być wykorzystane razem lub też
przetworzone i odpowiednio przygotowane ną infrastrukturę sprzętowo-programową niezależnie od siebie. Przykładowo, do łącze-
są umieszczone w strukturach docelowych, systemu KSIP. Dla potrzeb zasilania syste- nia danych relacyjnych, nieusystematyzowa-
tj. w repozytorium danych. Sposób zaprojek- mu analitycznego dodano nowy węzeł w kla- nych i pochodzących ze różnych źródeł (w
towania tych struktur zależy prawie w cało- strze bazy danych KSIP. Dane pomocnicze tym relacyjnych jak i OLAP1) oraz pobiera-
ści od wymaganych raportów, formy i zakre- oraz repozytorium danych hurtowni danych nych z różnych gotowych aplikacji, można
su danych źródłowych oraz od wymagań do- zostały umieszczone w nowej bazie systemu wykorzystać narzędzie OracleBI Server, któ-
tyczących przechowywania historii, a także analitycznego oddzielnej w stosunku do ba- ry jest wysoce skalowalnym i wydajnym ser-
od wymaganych czasów odpowiedzi wykony- zy danych systemu źródłowego, ale współ- werem zapytań oraz analiz. Do tworzenia za-
wania raportów. dzielącej ten sam klaster sprzętowy z instan- pytań i analiz na żądanie można wykorzystać
Metadane opisują zawartość systemu ana- cją bazy danych KSIP. W ten sposób hurtow- narzędzie OracleBI Answers pracujące w śro-
litycznego, przedstawiają proces przetwarza- nia danych wykorzystuje istniejącą już in- dowisku opartym na technikach interneto-
nia danych i administracji hurtownią oraz frastrukturę zapewniającą bezpieczeństwo wych oraz operujące na logicznym modelu
sposób ich prezentacji na raportach. Meta- i wysoką niezawodność oraz zwiększa ela- danych zebranych z wielu źródeł. Wykorzy-
dane obszaru przejściowego służą parame- styczność w zakresie alokacji zasobów syste- stywanie zaawansowanych, interaktywnych
tryzacji procesów walidacji, przetwarzania i mowych na potrzeby KSIP lub systemu ana- konsol internetowych, zwanych także kok-
konsolidacji danych źródłowych. Repozyto- litycznego w zależności od aktualnego zapo- pitami informacyjnymi, umożliwiającymi
ria narzędzi analitycznych przechowują za- trzebowania. użytkownikom podejmowanie dokładnych i
równo informacje niezbędne do przygoto- Do realizacji funkcjonalności typowań, zapy- trafnych decyzji dzięki spersonalizowanym
wywania raportów, jak i definicji samych ra- tań ad hoc, generowania statystyk i raportów widokom danych, jest możliwe dzięki Orac-
portów. Repozytoria znajdują się w bazie da- została wykorzystana funkcjonalność pakietu leBI Interactive Dashboard. W skład pakie-
nych w oddzielnym schemacie bądź są prze- Oracle Business Inteligence Enterprise Edition tu OBI EE wchodzi także OracleBI Publi-
chowywane we wskazanych plikach. Repozy- (OBI EE) oraz Oracle BI Publisher. sher oraz OracleBI Disconnected Analytics.
torium narzędzi do przekształcania i łado- Pakiet OBI EE zaprojektowano z myślą o Pierwszy z nich dostarcza skalowalny mecha-
wania danych przechowuje dane o struktu- sprostaniu wymaganiom stawianym narzę- nizm raportowania umożliwiający generowa-
rach danych wszystkich obszarów hurtow- dziom przeznaczonym do analizy dużych ilo- nie raportów na podstawie danych z wielu
ni danych, w tym mapowania, transforma- ści danych w dużych organizacjach. Stanowi źródeł i publikowanie ich w różnych forma-
cje oraz kolejność przetwarzania procesów. on kompleksowy i zintegrowany zestaw na- tach oraz za pomocą różnych kanałów publi-
Są to wszelkie metadane pozwalające na za- rzędzi analitycznych opracowany w celu za- kacji, zaś drugi jest produktem łączącym pro-
projektowanie i późniejsze zarządzanie hur- pewnienia wglądu w wyniki analiz jak naj- dukty Answers i Dashboards w pakiet skie-
townią w jej pełnym cyklu życia, tj.: zasila- większej grupie użytkowników oraz umoż- rowany do użytkowników mobilnych korzy-
nie, odświeżanie oraz wprowadzanie zmian liwiający dowolnemu z nich z dowolnej jed- stających z komputerów niepodłączonych
do struktur. nostki organizacyjnej samodzielny dostęp do do sieci

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

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

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

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

����� �����

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

Rysunek 2. Architektura fizyczna systemu analitycznego

40 01/2009
Informacja w służbie organów bezpieczeństwa

Rysunek 2. przedstawia umiejscowienie po- W skład pakietu Warehouse Builder wcho- partycjach na potrzeby optymalizatora za-
szczególnych składników oprogramowania i dzi m.in. moduł repozytorium (Repository), pytań.
sprzętu na potrzeby hurtowni danych. który jest zbiorem tabel i widoków relacyj-
W zaimplementowanym systemie anali- nych umieszczonych w bazie danych Orac- W ramach ww. procesu wyróżniono dwa
tycznym wyszukiwanie i prezentowanie da- le i zawierających definicje metadanych, a rodzaje ładowania danych, tj. ładowanie
nych w oparciu o dane szczegółowe jest możli- także moduł generowania kodu (Code Ge- inicjalne i ładowanie cykliczne (przyrosto-
we poprzez typowanie oraz wykorzystanie ra- nerator) przeznaczony do budowania skryp- we). Dla uniknięcia dużego obciążenia sys-
portów typu lista za pomocą pakietu Oracle BI tów w oparciu o metadane z repozytorium. temów źródłowych ładowanie inicjalne zo-
Publisher. Narzędzie to wykorzystuje kreato- Skrypty te są kolejno wykorzystywane do stało wykonane metodą klonowania baz da-
ry i jest wyposażone w graficzny edytor ukła- przetwarzania docelowych schematów baz nych z wykorzystaniem backupów dane-
du pozwalający użytkownikom na tworzenie danych. Zapisywanie danych pobranych go systemu. Z kolei ładowania cykliczne, w
skomplikowanych raportów z użyciem mode- ze źródeł w zaprojektowanym i stworzo- przypadku systemu KSIP, są wykonywane
lu deklaracyjnego, ukierunkowanego na doku- nym przez użytkownika schemacie, a tak- w cyklu dobowym przy bezpośrednim pod-
ment. Możliwe jest także wykorzystywanie za- że przechowywanie informacji wymaga- łączeniu do systemu źródłowego z wykorzy-
awansowanych funkcji do tworzenia skompli- nych do audytu procesów ładujących prze- staniem mechanizmu partycjonowania ta-
kowanych raportów ze złożonymi zapytania- noszących dane do tego schematu, odby- bel bazodanowych oraz przenoszeniu du-
mi i elementami programowania. Dodatkowo, wa się w tzw. środowisku wykonawczym żych ilości danych bezpośrednio do obsza-
typowania są rozbudowane o mechanizm gro- (Runtime Environment). Użytkownicy syste- ru przejściowego. Proces ładowania danych
madzenia informacji na temat dostępu do da- mu analitycznego mają również możliwość wykonuje tutaj niskopoziomową walida-
nych przez poszczególnych użytkowników, tj. wykorzystywania przeglądarki audytu śro- cję danych na poziomie interfejsu, np. obo-
kto, kiedy, jakie uzyskał informacje. dowiska wykonawczego (Repository Brow- wiązkowość pól identyfikacyjnych, zgod-
Do definicji, tj. zaprojektowania i późniejsze- ser) przeznaczonej do analizowania danych ność typów itp., tak aby zapewnić możli-
go utrzymywania procedur ładowania, trans- z audytu w tym środowisku, a także tzw. wość późniejszej interpretacji danych. Każ-
formacji i struktur pomocniczych oraz doce- aplikacji klienta (Client Application) udo- de zasilanie danych jest zadaniem, które ma
lowych, wszelkich aspektów budowy policyj- stępniającej interfejs graficzny wspomaga- przypisany unikalny identyfikator dołącza-
nego systemu analitycznego wykorzystano na- jący użytkownika w procesie definiowania ny do każdego ładowanego rekordu. Takie
rzędzie klasy CASE o nazwie Oracle Wareho- i projektowania aplikacji. Do dyspozycji za- podejście pozwala na późniejsze śledzenie
use Builder w wersji 10gR2. Oprogramowanie awansowanego użytkownika systemu ana- problemów z ładowaniem rekordów z okre-
to pozwoliło na zaprojektowanie wymaganych litycznego jest także tzw. administracyjne ślonego źródła.
obiektów bazy danych służących do przecho- środowisko raportowania (Advanced Repor- Zarządzanie ładowaniem danych dostar-
wywania danych (tabele, zmaterializowane wi- ting Environment) obejmujące udostępnia- cza informacji dla administrowania metada-
doki), obiektów wspierających analizę wielowy- ne przez oprogramowanie Warehouse Buil- nymi m.in. o tym, z których interfejsów ła-
miarową (fakty, wymiary, w tym hierarchie), der funkcje raportowania, które umożliwia- dowano dane, statystykach, poprawności da-
jak i ich przetwarzania. Użytkownicy korzysta- ją przeglądanie metadanych za pomocą apli- nych i statusie ładowania. Skuteczność pro-
jący z tego narzędzia uzyskali możliwość: kacji pracującej w technologii internetowej cesu zasilania jest monitorowane przez ad-
oraz udostępnianie ich szerszemu gronu za- ministratorów w środowisku Oracle Enter-
• importowania definicji źródeł danych oraz interesowanych. prise Manager.
projektowania i tworzenia schematów do- Uruchomienie i utrzymywanie systemu ana- System analityczny jest zasilany także z wy-
celowych struktur danych, litycznego wiązało się z tzw. zarządzaniem ła- korzystaniem informacji zawartych w tzw.
• definiowania oraz tworzenia przepływów dowaniem danych z systemów źródłowych, w dziennikach zmian przechowywanych w sys-
danych między źródłami i strukturami tym z KSIP do systemu analitycznego. Proces temach źródłowych. Dane z tych dzienników
docelowymi dokonując w locie transfor- ten obejmował: są przenoszone do systemu analitycznego z za-
macji danych, chowaniem danych po stronie systemu źródło-
• zarządzania definicjami źródeł danych • identyfikację danych, które mają być zała- wego dla dnia bieżącego i z zachowaniem za-
oraz uaktualniania ich, dowane (danych zmienionych i nowych) danego okresu historii wstecz dla zminima-
• zarządzania schematami docelowymi oraz oraz usunięcie danych w źródle, lizowania ryzyka chwilowej utraty dzienni-
uaktualniania ich i rozbudowywania, • konwersję i przeniesienie danych na plat- ków. Historyczny okres przechowywania da-
• projektowania i tworzenia narzędzi do za- formę systemu analitycznego, nych dzienników zmian po stronie systemu
pytań ad hoc oraz OLAP, • weryfikację poprawności danych, źródłowego jest określany parametrem typu
• wykorzystywania funkcji systemu zarzą- • transformację danych, metadana. Dane dzienników są usuwane po
dzania bazą danych, w celu zapewnienia • agregację i sumowanie, stronie systemu źródłowego, zgodnie z ww.
skalowalności, niezawodności i elastycz- • przebudowanie indeksów, parametrem. W przypadku systemu źródło-
ności. • zebranie statystyk o tabelach, indeksach i wego KSIP została wprowadzona zmiana par-

Bibliografia
• [1]Inmon, W.H. Tech Topic: What is a Data Warehouse? Prism Solutions. Volume 1. 1995.
• [2]http://pl.wikipedia.org/wiki/Hurtownia_danych
• [3]Yang, Jun. WareHouse Information Prototype at Stanford (WHIPS). Stanford University. July 7, 1998.
• [4]Witold Abramowicz, Paweł Kalczyński and Krzysztof Węcel, Enhanced Data Warehouse, A. Grzech, Z. Wilimowska (eds.), Proceedings of Informa-
tion Systems Architecture and Technology – ISAT 2001, The Wrocław University of Technology Publishing House, Wrocław 2001, pp. 190-197, ISBN 83-
7085-578-4.
• [5]Decyzja nr 167 Komendanta Głównego Policji z dnia 19 marca 2008 r. w sprawie funkcjonowania zestawu centralnych zbiorów informacji two-
rzących Krajowy System Informacyjny Policji, Dziennik Urzędowy Komendy Głównej Policji nr 10 z dnia 21 maja 2008 r.

www.sdjournal.org 41
Hurtownie danych

tycjonowania dla dzienników zmian polegają- oraz ustalanie praw dostępu do danych z gra- funkcjonariuszy dokonujących sprawdzeń i
ca na utworzeniu partycji dziennych dla no- nulacją do wiersza. Proces uwierzytelniania rejestracji w systemie. Dlatego też natural-
wych danych. i autoryzacji użytkowników systemu anali- nym stało się stworzenie systemu analitycz-
Na potrzeby administrowania systemem tycznego jest realizowany przy wykorzysta- nego dedykowanego wyłącznie dla potrzeb
analitycznym zdefiniowano role admini- niu tzw. systemu bezpiecznego trybu uwie- typowań, analiz i statystyk wykonywanych
stratora technicznego i administratora biz- rzytelniania i autoryzacji użytkowników w dowolnym układzie i konfiguracji, przy
nesowego. Przez rolę administratora tech- (Bezpieczny Tryb Uwierzytelniania Użytkow- zachowaniu wymagań w zakresie śledzenia i
nicznego rozumie się administratora o wie- ników – BTUU). BTUU zapewnia bezpiecz- zasad bezpieczeństwa dostępu do danych.
dzy technicznej na temat zarządzania opro- ny dostęp do policyjnych i pozapolicyjnych Wdrożony system analityczny stał się
gramowaniem bez znajomości merytorycz- systemów informacyjnych, w tym Systemu składnicą ujednoliconych i sprawdzonych
nej systemów źródłowych i systemu anali- Informatycznego Schengen, poprzez dedy- danych, niezbędnych do sprawnego wspo-
tycznego, w tym modelu biznesowego i ja- kowaną infrastrukturę teleinformatyczną magania podejmowanych decyzji, w tym
kości danych przechowywanych w ww. syste- w oparciu o usługi katalogowe z wykorzy- efektywnego zarządzania dyslokacją sił i
mach. Przez rolę administratora biznesowe- staniem wewnętrznej infrastruktury klu- środków. Kadra kierownicza ma na bieżą-
go rozumie się administratora o wiedzy me- cza publicznego (Public Key Infrastructure) co wgląd i możliwość porównania wszelkie-
rytorycznej na temat systemów źródłowych i rozwiązania jednokrotnego logowania (sin- go rodzaju wskaźników, tj. ilość przestępstw
i systemu analitycznego, również ze znajo- gle sign-on). na danym terenie oraz wykrywalność. Zbu-
mością biznesowego modelu danych i umie- dowana hurtownia stała się tym samym cen-
jętnościami odniesienia się do jakości danych Podsumowanie tralnym źródłem informacji dla całej Policji.
ww. systemów. We współczesnym społeczeństwie, w dobie Dzięki budowie policyjnego systemu ana-
Dla zapewnienia wysokiego poziomu bez- totalnych przekształceń w dziedzinie zarzą- litycznego użytkownicy mają również oka-
pieczeństwa danych przetwarzanych w sys- dzania informacją gromadzenie wielkiej ilo- zję wykazania się w twórczej pracy nad ana-
temie analitycznym wdrożono podział grup ści danych nie jest już wystarczające. Opty- lizą danych, a nie tylko nad ich ewidencją
użytkowników, zgodnie ze strukturą organi- malizacja przechowywanych informacji zo- - wsparcie operacyjnej i prewencyjnej pracy
zacyjną, regułami podległości w ramach or- rientowanych tematycznie, odpowiednio do Policji możliwe jest dla funkcjonariuszy do
ganizacji oraz funkcjami użytkowników w bieżących potrzeb, w naturalny sposób skut- tej pory nie zaangażowanych bezpośrednio
systemie. Zapewniono, że zastosowane pro- kuje poprawą jakości i spójności danych po- w ten obszar działalności.
dukty bazodanowe do budowy systemu speł- trzebnych do podejmowania decyzji, a tym Wybudowany system analityczny wyko-
niają wymagania stawiane przez powszech- samym do utrzymywania bezpieczeństwa i rzystujący mechanizmy hurtowni danych
nie akceptowalne standardy bezpieczeń- porządku publicznego. W czasach totalnych jest wydzieloną centralną bazą danych, wy-
stwa, takie jak: US TCSEC/TDI C2 oraz IT- zmian należy sprawnie zarządzać zbieraną la- twarzającą informacje służące do wsparcia
SEC F-C2/EAL4. Wprowadzenie zarządza- tami informacją. procesów decyzyjnych koniecznych do za-
nia uprawnieniami systemowymi i obiekto- Analityczne przetwarzanie danych groma- rządzania Policją. Wszelkie dane są groma-
wymi dało możliwość nadawania praw użyt- dzonych w systemach policyjnych stało się dzone w jednej centralnej lokalizacji, a do-
kownikom do wykonywania dopuszczalnych niezbędne do prawidłowego zarządzania ca- starczana funkcjonalność jest realizowana i
operacji oraz jednoznacznego wyznaczania łą organizacją. Potrzebne dane były na ogół udostępniona w jednym miejscu. Dostęp do
obiektów bazy danych (tablica, procedura, rozproszone i niedostosowane do potrzeb systemu analitycznego nie jest jednak ogra-
perspektywa itd.), na których uprawnione analiz. Ponadto, przed wdrożeniem systemu niczony do jednej lokalizacji i jest możli-
operacje mogą być wykonane. Dla zapewnie- analitycznego funkcje typowań i analiz były wy w ramach ogólnopolskiej sieci transmi-
nia wybiórczego dostępu do danych wrażli- wykonywane w KSIP, co powodowało znacz- syjnej Policji. Podstawowym celem bizneso-
wych zastosowano mechanizm VPD (Virtu- ne obciążenie transakcyjnego systemu KSIP, wym istnienia tego systemu jest zapewnie-
al Private Database) umożliwiający separa- co w konsekwencji wydłużało czas odpowie- nie dostępu do analiz i statystyk opartych o
cję danych na poziomie serwera bazy danych dzi i tym samym obniżało komfort pracy dane zbierane w systemie KSIP oraz zapew-
nienie dostępu do interaktywnego procesu
(aplikacja typowań) polegającego na wyko-
ANDRZEJ MACHNACZ nywaniu sekwencji zapytań, w których za-
 CENTRUM PROJEKTÓW INFORMATYCZNYCH MSWIA wężana jest liczba zwracanych rekordów po-
Doktor nauk technicznych w zakresie informatyki. Wszechstronne przygotowanie z zakresu informatyki, w tym przez dodawanie przez użytkownika kolej-
bezpieczeństwa sieci WAN i LAN. Umiejętność prowadzenia i zarządzania projektami informatycznymi, m.in. nych ograniczeń.
zgodnie z metodyką ITIL, PRINCE2 (Certyfikat PRINCE2™ Foundation), KeySteps oraz COBIT potwierdzona reali- Opisany tu System Analityczny jest nie-
zacją kilkunastu projektów m.in. z zakresu bezpieczeństwa systemów IT dla dużych instytucji o zastrzeżonych na- wątpliwie cennym elementem infrastruktu-
zwach. W latach 1996-2005 r. członek grupy doradców Interpolu z zakresu bezpieczeństwa (Interpol Security Of- ry krytycznej. System ten poza swoją podsta-
ficers Advisory Group) oraz Zarządu Europolu ds. Technologii Informatycznych (Europol ICT Programme Board). wową funkcjonalnością polegającą na spraw-
Uczestnik wielu specjalistycznych szkoleń i konferencji, krajowych i zagranicznych, związanych z technicznymi nym pozyskiwaniu danych z systemów infor-
metodami zabezpieczania systemów teleinformatycznych, a także metodami zwalczania przestępczości kompu- matycznych oraz udostępnianiu tych danych
terowej, w tym gromadzenia materiału dowodowego (szkolenia m.in. w USA, Francji, Hiszpanii, Wielkiej Brytanii, w przyjaznej formie dla użytkownika końco-
Szwajcarii i w Polsce). Autor licznych publikacji dotyczących systemów operacyjnych oraz przestępczości kompu- wego, może być rozszerzany o szereg dodat-
terowej. Autor szeregu wystąpień na konferencjach i seminariach, organizowanych w kraju i za granicą, poświę- kowych elementów.
conych zagadnieniom bezpieczeństwa TI. Doświadczenie w zakresie przeprowadzania audytów systemów tele- Rozszerzenia te oraz integracja z innymi
informatycznych, w tym wykonywania testów penetracyjnych z wykorzystaniem zarówno narzędzi komercyj- narzędziami w znacznie większym stopniu
nych, jak i ogólnie dostępnych. W latach 2005–2008 Dyrektor Biura Łączności i Informatyki Komendy Głównej Po- pozwalają na wykorzystanie potencjału roz-
licji. Od września 2008 r. Dyrektor Centrum Projektów Informatycznych Ministerstwa Spraw Wewnętrznych i Ad- wiązań BI dla zachowania i poprawy bezpie-
ministracji. czeństwa publicznego.
Kontakt z autorem: a.machnacz@cpi.mswia.gov.pl

42 01/2009
Języki programowania

Biblioteka senseGUI
czyli GUI z automatu

Większość programistów zetknęła się z potrzebą stworzenia Graficznego


Interfejsu Użytkownika (ang. GUI). Zwykle do tego celu stosuje się popularne
biblioteki (np. Swing) lub dedykowane edytory, co jest dość pracochłonne. W
tym artykule chcielibyśmy omówić inne rozwiązanie, bazujące na podejściu
deklaratywnym.
Warto zauważyć, że jednym z najbardziej
Dowiesz się: Powinieneś wiedzieć: znanych przykładów podejścia deklaratywne-
• Jakie są sposoby tworzenia GUI; • Jak programować w jednym z popularnych ję- go, chociaż nie związanym z GUI, jest język
• Jak zaprojektować własną bibliotekę do auto- zyków, np. Java. zapytań SQL. Użytkownik określa, co ma być
matycznego tworzenia GUI; zrobione (jakie dane potrzebuje), ale nie defi-
• Do czego mogą się przydać adnotacje. niuje, jak to ma być wykonane. O użyteczno-
ści takiego podejścia niech świadczy fakt, iż
jedno zapytanie SQL może odpowiadać kilku-
cej ręczne modyfikacje kodu źródłowe- dziesięciu (lub nawet kilkuset) liniom progra-
go na wizualny projekt. Istnieją również mu w klasycznym języku programowania (np.
Poziom trudności rozwiązania działające tylko jako czyste Java czy C#).
generatory kodu. Wtedy ręczne modyfi- Podobne rozwiązanie chcielibyśmy zastoso-
kacje są tracone po ponownym wygene- wać dla graficznych interfejsów użytkownika.
rowaniu kodu dla wizualnego projektu. Naszym celem jest, aby mając określone dane

P
rogramista określa, które elementy mo- • Zastosowanie specjalnego, deklaratyw- biznesowe (zdefiniowane w postaci klas np. ję-
delu (danych) mają mieć GUI, a odpo- nego podejścia. Jego zaletą jest to, że zyka Java czy C#) GUI pojawiło się automatycz-
wiednia biblioteka automatycznie je ge- projektant/programista skupia się na tym nie. I najlepiej, aby spełniało nasze oczekiwania
neruje w czasie działania programu. Na począ- co jest do zrobienia, a nie jak to zrobić. Naj- m.in. w zakresie:
tek pokuśmy się o rozważenie kilku opcji, ja- nowsze, komercyjne technologie podąża-
kie mamy, gdy chcemy stworzyć GUI. Ogólnie jące tym tropem to propozycja Microsoft • funkcjonalności,
rzecz biorąc, współcześni twórcy oprogramo- dotycząca języka XAML (ang. Extensible • użyteczności,
wania, wykorzystują trzy główne podejścia do Application Markup Language). Poszcze- • wydajności,
tworzenia graficznego interfejsu użytkownika: gólne elementy GUI są definiowane w • estetyki.
specjalnym języku programowania, a wła-
• Ręczne pisanie kodu źródłowego odwo- ściwie języku opisu. Czy to jest w ogóle możliwe? Czy komputer
łującego się do odpowiednich bibliotek. może wygenerować coś tak skomplikowane-
W przypadku Javy może to być Swing Niestety, większość przedstawionych po- go, jak interfejs użytkownika bez dostarczenia
[3] lub SWT [4]. Programiści C# korzy- dejść do tworzenia GUI, wymaga dość zna-
stają z WinForms [5]. Najbardziej skom- czącego zaangażowania ze strony progra- Listing 1. Przykładowa klasa biznesowa
plikowana sytuacja jest w C++, gdzie za- misty. Cały czas, każdy element GUI od-
stosowanie konkretnej biblioteki jest powiadający jednostce danych musi być public class Person {
zdeterminowane przez dialekt języ- przetwarzany indywidualnie. Przedstawio- private String firstName;
ka. Istnieje również wiele niezależnych ny pomysł polega na stworzeniu rozwiąza- private String lastName;
rozwiązań, które czasami są dedykowa- nia, które jest bardzo łatwe w użyciu, a za- private Date birthDate;
ne dla różnych platfor. Najbardziej po- razem użyteczne i nie wymaga dużego na- private boolean higherEducation;
pularne to Qt [6], wxWidgets [7] oraz kładu pracy ze strony programisty. Opisy- private String remarks;
GTK+ [8]. wana propozycja została zaimplementowa- private int SSN;
• Wykorzystanie wizualnego edytora, na w postaci biblioteki senseGUI dla języka private double annualIncome;
który umożliwia narysowanie GUI i wy- Java i może być wykorzystana w dowolnej
generowanie odpowiadającego mu ko- aplikacji pracującej na tej platformie. War- public int getAge() {
du źródłowego. Jakość takich generato- to podkreślić, że stosując opisane podejście, // [...]
rów jest bardzo różna. Niektóre z nich możliwe jest stworzenie podobnego rozwią- }
korzystają z tzw. inżynierii wahadło- zania dla dowolnego języka wspierającego }
wej (ang. round-trip) odzwierciedlają- refleksję (np. C#).

44 01/2009
Biblioteka senseGUI – czyli GUI z automatu

mu dokładnych informacji? Otóż jest to wyko- • dla każdej metody dodać widget, który za- Uważamy, że w przypadku typowych,
nalne do pewnego stopnia. Niestety, im efekt prezentuje wynik jej działania, biznesowych formularzy do wprowadzania/
końcowy ma być bliższy naszym oczekiwa- • dla każdego widgetu dodać odpowiednią edycji danych, najbardziej obiecującym roz-
niom, tym nasz wkład pracy będzie większy. etykietę, wiązaniem jest podejście deklaratywne. Po-
Wydaje się, że podstawą przy konstruowaniu • dla każdego widgetu dodać kod, który od- wodem tego jest fakt, iż programista może
takiego automatu generującego GUI jest zna- czyta wartość określonego atrybutu i wsta- skupić się na tym, co chce osiągnąć, a nie
lezienie złotego środka pomiędzy generycz- wi ją do widgetu, jak to zrobić. Kolejną potencjalną zaletą jest
nością (zdolnością do pracy z różnymi dany- • dodać przyciski kontrolne (accept, cancel), możliwość przezroczystej pracy na różnych
mi) rozwiązania a naszymi oczekiwaniami, a • dla przycisku accept dodać kod, który od- platformach (przenośność). W ogólnym
co za tym idzie nakładem pracy. Innymi sło- czyta zawartość widgetów, uaktualni od- przypadku, programista adnotuje kod źró-
wy, zaproponujemy rozwiązanie, które da się powiedni fragment modelu oraz ukryje dłowy, a dedykowana biblioteka generuje od-
stosować łatwo, szybko i przyjemnie, ale za ce- formatkę, powiedni kod zależny od platformy.
nę pewnych uproszczeń, które musimy zaak- • dla przycisku cancel dodać kod ukrywają-
ceptować. cy formatkę. Założenia
Aby sprecyzować nasze oczekiwania funk- proponowanego rozwiązania
cjonalne dotyczące GUI, spróbujmy określić, Realizacja powyższych wymagań oznacza na- Naszym celem będzie stworzenie biblioteki,
do czego ono jest nam potrzebne. Przecięt- pisanie kilkudziesięciu linii kodu (7 atrybutów która automatycznie wygeneruje formularze
ny użytkownik aplikacji komputerowej wy- mnożone przez 5 do 10 linii na kontrolkę plus GUI na podstawie zwykłych klas języka Java.
korzystuje graficzny interfejs użytkowni- zarządzanie rozkładem, przyciskami kontrol- Korzystając z tych formatek, użytkownik apli-
ka jako: nymi, itp.), które są do siebie dość podobne. kacji będzie w stanie wprowadzić dane, uak-
Aby zmniejszyć nasz nakład pracy, może- tualnić istniejące informacje lub je po prostu
• Wejście dla danych w celu wypełnienia ich my skorzystać z edytora GUI. Jednym z nich przeglądać. Przykładowo, programista chce
pewną zawartością. W tym celu, progra- jest np. Jigloo GUI Builder [9] przeznaczony wykonać GUI (podobne do tego z Rysunku 1.)
mista stosuje pewne widgety (np. pole tek- dla środowiska Eclipse. Korzystając z tego roz- dla wcześniej przedstawionej klasy Person. W
stowe) i łączy je z danymi (np. nazwiskiem wiązania projektant/programista jest w sta- miarę możliwości, będziemy się starali, aby ca-
klienta w systemie). Gdy użytkownik wpro- nie graficznie zaprojektować formatkę odpo- ły proces odbywał się bez nadmiernego zaan-
wadzi odpowiednie informacje, dedykowana wiednio rozmieszczając poszczególne widge- gażowania ze strony programisty.
część programu, zapisuje je w modelu. ty. Przykład dla klasy Person (Listing 1.) jest W trakcie prac projektowych musimy roz-
• Wyjście, celem zaprezentowania informa- pokazany na Rysunku 1. Dla tego formularza, wiązać trzy główne problemy:
cji przechowywanych w modelu. W tym edytor GUI wygenerował 105 linii kodu Javy.
celu, programista pisze kod odczytujący Ta liczba nie zawiera elementów niezbędnych • Jak odczytać zawartość klasy (jej strukturę)?
odpowiedni fragment danych i wyświetla do odczytu/zapisu wartości z/do modelu. Kod • Jaki widget powinien być użyty do po-
go w określonym komponencie GUI. taki musi być stworzony ręcznie przez progra- szczególnych rodzajów danych?
mistę. Mimo wszystko, jest to spore udogod- • Jak połączyć poszczególne elementy GUI
Powyższe potrzeby mogą być zaspokojone, nienie w porównaniu z ręcznym pisaniem ca- (widgety) z danymi?
korzystając z jednego ze wcześniej opisa- łego kodu. Niestety programista musi spędzić
nych sposobów. Ponieważ stworzony proto- trochę czasu rozmieszczając widgety, dodając
typ jest dedykowany dla Javy, w dalszej czę- kod obsługujący odczyt/zapis danych i zarzą-
ści artykułu skupimy się na rozwiązaniach dzający rozłożeniem elementów.
przeznaczonych właśnie dla tego języka. Wróćmy jeszcze na chwilę do propozycji
Następne paragrafy zawierają krótkie omó- Microsoft zwanej XAML (Extensible Appli-
wienie implementacji potrzeb związanych cation Markup Language) mocno wykorzy-
z wejściem/wyjściem korzystając z istnieją- stywanej w WPF (Windows Presentation Fo-
cych rozwiązań. undation). Polega ona na tym, że sposób wy-
korzystania poszczególnych kontrolek nie jest
Sposoby tworzenia GUI definiowany w języku programowania, jak w
Najbardziej powszechnym sposobem tworzenia klasycznym wykorzystaniu np. Swinga, ale za
GUI jest wykorzystanie bibliotek dostarczanych pomocą specjalnego pliku. Do tego celu wyko-
razem z językiem. Większość graficznych inter- rzystywany jest specjalny język opisu (właśnie
fejsów użytkownika dla Javy jest implementowa- XAML) oparty o XML. Fragment takiego pli-
Rysunek 1. Okno obsługujące klasę Person
na z użyciem bibliotek Swing [3] lub SWT [4]. ku jest pokazany na listingu 2. Można się z nie- stworzone za pomocą edytora GUI
Spójrzmy na kod znajdujący się na listingu nr 1. go zorientować, że programista korzystający z
Przedstawia on typową klasę biznesową jakich XAML do tworzenia GUI nie ma znacząco ła-
wiele we współczesnych systemach. twiejszego zadania. Praktycznie rzecz biorąc,
Aby opracować dla niego odpowiednie GUI, musi wykonać każdy z powyżej opisanych kro-
działające zgodnie z uprzednio określonymi po- ków, z ta tylko różnicą, że nie robi tego w ję-
trzebami wejścia/wyjścia, należy wykonać po- zyku programowania, ale w specjalnym języku
niższe kroki: znaczników. Z naszego punktu widzenia, czy-
li maksymalnego zautomatyzowania całego
• utworzyć pustą formatkę, procesu, to podejście nie wnosi nowej jakości
• dodać odpowiedni manager rozkładu, i właściwie nawet trudno nazwać je deklara-
• dla każdego atrybutu dodać widget, który tywnym. Sprawdza się za to znakomicie przy
zaprezentuje jego zawartość i umożliwi je- generowaniu kodu XAML z dedykowanych Rysunek 2. Formatka wygenerowana przez
go edycję, edytorów, np. Microsoft Expression Blend. bibliotekę dla kodu z Listingu 2.

www.sdjournal.org 45
Języki programowania

Pierwszy problem rozwiążemy przy pomo- jest możliwe automatyczne szacowanie, któ- dowaliśmy się wykorzystać adnotacje. Takie
cy techniki zwanej refleksją. Jest dostępna re elementy powinny mieć swoje odpowied- konstrukcje istnieją dla języka Java oraz C#
dla popularnych języków programowania (Ja- niki w GUI, byliśmy zmuszeni wprowadzić i umożliwiają opisywanie klas oraz ich skła-
va, C# i częściowo C++) i umożliwia odczyta- pewne znaczniki. Umożliwiają one dostoso- dowych. Staraliśmy się zaprojektować je mak-
nie informacji o budowie klasy i tworzenie jej wanie generowanego interfejsu użytkowni- symalnie prostymi w użyciu, ale ostatecznie
obiektów. Pozostałymi kwestiami zajmiemy ka do konkretnych potrzeb. Kwestią otwar- ich liczba wzrosła do 11. Na szczęście więk-
się w dalszej części artykułu. tą było, w jaki sposób osiągnąć taką funkcjo- szość z nich ma domyślne wartości, których
Niestety mimo naszych najlepszych chęci, nalność, czyli połączyć programistę, bibliote- nie trzeba modyfikować. Wprowadziliśmy
aby biblioteka obywała się bez podawania do- kę i GUI? Mieliśmy do wyboru kilka możli- dwa podstawowe typy adnotacji: przezna-
datkowych parametrów, byliśmy zmuszeni wości, włączając w to pliki konfiguracyjne czone dla atrybutów (GUIGenerateAttribu-
je zdefiniować. Dotyczy to choćby przypad- (np. XML) lub przekazywanie parametrów te) oraz metod (GUIGenerateMethod). Każdy
ku gdy niecała zawartość klasy powinna być w wywoływanych metodach. Ostatecznie, po z nich ma dodatkowe parametry (z domyśl-
edytowalna i/lub wyświetlana. Ponieważ nie przeanalizowaniu różnych rozwiązań, zdecy- nymi wartościami). Poniżej znajdują się naj-
ważniejsze z nich:
Listing 2. Zastosowanie adnotacji celem wygenerowania GUI – wariant z wartościami domyślnymi
• Label – opisuje etykietę znajdującą się
public class PersonAnnotated { przy widgecie. Jeżeli jest pusta (wartość
@GUIGenerateAttribute domyślna) to zostanie wykorzystana na-
private String firstName; zwa atrybutu lub metody. Ten parametr
@GUIGenerateAttribute był wymagany przy wprowadzaniu spe-
private String lastName; cjalnego nazewnictwa (np. spacji, czy pol-
@GUIGenerateAttribute skich liter).WidgetClass – klasa widgetu,
private Date birthDate = new Date(); która będzie wykorzystana do edycji oraz
@GUIGenerateAttribute wyświetlania danych. Domyślna wartość
private boolean higherEducation; zakłada użycie pola tekstowego (Jtext-
@GUIGenerateAttribute Box);
private String remarks; • Tooltip – krótki tekst wyświetlany po na-
@GUIGenerateAttribute jechaniu kursorem na element;
private int SSN; • GetMethod – metoda wykorzystywana
@GUIGenerateAttribute do odczytu wartości atrybutu. Domyślna
private double annualIncome; wartość zawiera pusty ciąg i oznacza za-
@GUIGenerateMethod stosowanie podejścia opartego na gette-
public int getAge() { rach oraz setterach (biblioteka wyszukuje
// ... takie metody w ciele klasy);
} • SetMethod – analogicznie jak w przypad-
// Standard getters/setters methods ku getMethod , ale dotyczy zapisu warto-
} ści;
• Order – liczba określająca kolejność widge-
Listing 3. Zastosowanie adnotacji celem wygenerowania GUI – wariant ze zmodyfikowanymi tu na formularzu;
wartościami
• ReadOnly – flaga definiująca, czy dane są
public class PersonAnnotated { dostępne w trybie tylko do odczytu (bez
@GUIGenerateAttribute(label = "First name", order = 1) możliwości modyfikacji);
private String firstName; • ScaleWidget – określa, czy widget powi-
@GUIGenerateAttribute(label = "Last name", order = 2) nien zmieniać swój rozmiar w czasie mo-
private String lastName; dyfikacji wielkości formularza.
@GUIGenerateAttribute(label = "Birth date", order = 3)
private Date birthDate = new Date(); Opisywane rozwiązanie jest w stanie pra-
@GUIGenerateAttribute(label = "Higher education", widgetClass="mt.mas.GUI.CheckboxBo cować z różnymi typami danych: liczbami,
olean", order = 5) tekstem, wartościami Tak/Nie, datami oraz
private boolean higherEducation; typami wyliczeniowymi. Domyślna imple-
@GUIGenerateAttribute(label = "Remarks", order = 50,
widgetClass="javax.swing.JTextArea",scaleWidget=false)
private String remarks;
@GUIGenerateAttribute(order = 6)
private int SSN;
@GUIGenerateAttribute(label= "Annual income", order=7)
private double annualIncome;
@GUIGenerateMethod(label="Age", showInFields = true, order = 4)
public int getAge() {
return 0;
}
// Standard getters/setters methods
}
Rysunek 3. Formatka wygenerowana przez
bibliotekę dla kodu z Listingu 3.

46 01/2009
Biblioteka senseGUI – czyli GUI z automatu

mentacja zakłada wykorzystanie pól teksto- zmienioną kolejność elementów, czy wykorzy- • Automatycznie wyszukiwać obiekty na
wych do wszystkich typów danych za wy- stanie dedykowanego widgetu dla informacji o podstawie kryteriów podanych w specjal-
jątkiem: wykształceniu. nej formatce.
Zainteresowany Czytelnik, analizując kod • Zarządzać ekstensją klasy.
• wartości Tak/Nie – stosowany jest prze- źródłowy biblioteki (do pobrania na stronie
łącznik (check box), www.sdjournal.org) może zauważyć, iż można Wykorzystanie powyżej opisanych funkcjo-
• typu wyliczeniowego (enum ), który jest z niej korzystać na dwa sposoby: nalności jest równie proste, jak podstawo-
przetwarzany w oparciu o specjalne pole wych możliwości oryginalnego rozwiąza-
wyboru zawierające wszystkie zdefiniowa- • uproszczony – sprowadzający się do wy- nia. Dzięki połączeniu bibliotek (senseGUI
ne w nim wartości (odczytane dzięki re- wołania jednej dużej metody, która zadba + senseObjects) programista ma ułatwione
fleksji). o kompleksowe wygenerowanie i wyświe- tworzenie typowych, biznesowych aplikacji.
tlenie formatki dla podanego obiektu,za-
Listing nr 2. zawiera kod przykładowej klasy awansowany zakładający wołanie mniej- Podsumowanie
Person udekorowany adnotacjami zdefinio- szych metod umożliwiających dokładniej- Przedstawiliśmy pewną propozycję dotyczącą
wanymi w bibliotece. Warto zauważyć, że je- sze dostosowanie wyświetlanych elemen- automatycznego generowania graficznych in-
dyne co musieliśmy zrobić to dopisać krótkie tów. W efekcie otrzymujemy np. instan- terfejsów użytkownika dla aplikacji bizneso-
adnotacje dla wybranych atrybutów (korzy- cję JPanel (zamiast pełnego okna), zawiera- wych. Wygenerowany formularz jest oparty na
stając z domyślnych wartości). jącą odpowiednie widgety, która może być prostych adnotacjach umieszczonych w kodzie
W rezultacie wywołania pojedynczej me- dodana do dowolnego, innego elementu źródłowym klas definiujących model danych.
tody z biblioteki, wygenerowana i wyświe- GUI. Dzięki temu można wyświetlać np. Programista wybiera, które inwarianty powinny
tlona została formatka pokazana na Rysunku zawartość atrybutów opisywanych za po- mieć swoje odzwierciedlenie w GUI, a zaprezen-
2. Jest ona połączona z instancją klasy Person, mocą typów zdefiniowanych przez pro- towana biblioteka zajmuje się stworzeniem od-
dzięki czemu wprowadzone zmiany są auto- gramistów (a nie tylko typów prostych). powiedniego interfejsu użytkownika.
matycznie odzwierciedlane w modelu. Moż- W kolejnej części artykułu dokładniej omó-
na zauważyć, że nie zawiera ona widgetu dla Prototypowa biblioteka, którą tu opisaliśmy, jest wimy budowę biblioteki oraz pokusimy się o
metody obliczającej wiek. Jest to zgodne z częścią większego frameworku (senseFrame- jej rozbudowę o kilka istotnych elementów do-
zaproponowanym podejściem, które zakła- work) i w połączeniu z nim pozwala na wiele wię- tyczących elementów międzynarodowości, ge-
da, że przy domyślnym (bezparametrowym) cej niż tylko edycję i wyświetlanie stanu poszcze- nerowania GUI bez konkretnego modelu da-
użyciu adnotacji, metody nie mają swoich gólnych obiektów. Dzięki dodatkowemu zastoso- nych oraz sprawdzania poprawności wprowa-
odpowiedników na formatkach. waniu biblioteki senseObjects możemy: dzonych informacji.
Jak widać, takie proste udekorowanie ko-
du nie zawsze prowadzi do idealnych rezulta- • Zarządzać powiązaniami pomiędzy obiek-
tów. Z punktu widzenia użytkownika, moż- tami. Stworzyliśmy odpowiednią funk- MARIUSZ TRZASKA
na mieć zastrzeżenia do nazewnictwa po- cjonalność, która na podstawie adnota- Mariusz Trzaska jest adiunktem w Polsko-Japoń-
szczególnych elementów, kolejności, w jakiej cji pozwala wyświetlać oraz zarządzać po- skiej Wyższej Szkole Technik Komputerowych. Wy-
występują, czy zastosowanych widgetów. W wiązanymi obiektami (asocjacje). Co wię- kłada tam przedmioty związane z bazami danych,
takich sytuacjach warto wykorzystać odpo- cej, można tworzyć kompozycje, asocjacje programowaniem, modelowaniem oraz inżynie-
wiednie parametry adnotacji, tak jak pokaza- kwalifikowane, czy powiązania ogranicza- rią oprogramowania. Oprócz tego bierze udział w
no na Listingu 3. ne przez {xor} lub {subset}.Wyświetlić wie- różnego rodzaju projektach komercyjnych oraz ba-
Efekt wygenerowania formularza na podsta- le obiektów korzystając z widoku tabela- dawczych. Jest autorem kilkunastu artykułów pu-
wie powyższego kodu pokazano na rysunku nr rycznego wygenerowanego na podstawie blikowanych w kraju i za granicą.
3. Warto zwrócić uwagę na poprawne nazwy, adnotacji. Kontakt z autorem: mtrzaska@pjwstk.edu.pl

R E K L A M A

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

���Visual Studio Professional�


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

Kontakt���������������������������������������������������������������������������
Aplikacje biznesowe

SQL Server 2005


i SQL Server 2008
Wykorzystanie tabel tymczasowych
i zmiennych tablicowych w tworzeniu aplikacji biznesowych

W artykule tym omówię nieco mniej znane i rzadziej wykorzystywane


obiekty baz danych – tabele tymczasowe i zmienne tablicowe. Odpowiednie
wykorzystanie tych obiektów może przynieść wymierne korzyści w aplikacjach
biznesowych.

Jeśli poziom tworzący tabelę tymczasową za-


Dowiesz się: Powinieneś wiedzieć: kończy się, to tabela jest automatycznie usuwa-
• Co to są zmienne tablicowe; • Co to jest T-SQL; na. W przypadku utworzenia tabeli na pozio-
• Po co stosować tabele tymczasowe w aplika- • Jak tworzyć zapytania w SQL Server. mie najbardziej zewnętrznym, zostanie ona
cjach biznesowych; skasowana po zamknięciu sesji.
• Co to jest tempdb; Możliwe jest utworzenie kilku tabel tym-
• Co to są wyrażenia tablicowe. czasowych o takich samych nazwach w tej sa-
mej sesji pod warunkiem, że będą one utwo-
rzone na różnych poziomach. Jednak tego
rver 2008 mogą przechowywać je w pamięci typu postępowanie może doprowadzić do
podręcznej. Dla bazy danych tempdb obowią- błędów. Z tego też względu wykorzystywa-
Poziom trudności zuje tzw. model odzyskiwania danych SIM- nie tabel tymczasowych o jednakowych na-
PLE (można go zamienić na inny). W mode- zwach w aplikacjach biznesowych nie jest
lu tym masowe operacje korzystające z tabel zalecaną praktyką. Na przykładzie (Listing
tymczasowych podlegają jedynie minimalne- 1.) zaprezentuję, jakie problemy mogą wy-

T
abele tymczasowe w aplikacjach biz- mu rejestrowaniu. Należy jednak pamiętać, nikać z niewłaściwego nazwania tabel tym-
nesowych mogą być używane do kil- że w bazie danych tempdb nie istnieje proces czasowych.
ku celów: odzyskiwania danych. Po wywołaniu procedury dbo.procedura_
Jednym z ważniejszych powodów stosowa- tymcz_2 (EXEC dbo.procedure_tymcz_2) wy-
• przetrzymywania częściowych zbiorów nia tabel tymczasowych jest odciążenie nor- niki będą prawidłowe. Najpierw wyświetlana
danych wynikowych, malnych baz danych, a to w kontekście budowy jest zawartość tabeli #tabela_tymcz_1 utwo-
• materializacji zagregowanych danych i ge- aplikacji biznesowych ma duże znaczenie. rzonej w procedurze dbo.procedura_tymcz_
nerowania raportów, Tabele tymczasowe mają nazwy poprze- 1 (czyli wartość 1), a następnie zawartość ta-
• do przechowywania danych tymczaso- dzone znakiem # i są widoczne tylko w sesji, beli #tabela_tymcz_1 utworzonej w proce-
wych przed wstawieniem danych do wła- w której zostały utworzone. W różnych se- durze dbo.procedura_tymcz_2 (czyli war-
ściwych tabel, sjach tabele tymczasowe mogą posiadać ta- tość 2). Zobaczmy, jakie skutki spowoduje
• tworzenia specjalnych hierarchii z dodat- kie same nazwy. SQL Server 2005 i SQL Se- zmiana procedury dbo.procedura_tymcz_1
kowymi atrybutami. rver 2008 rozpoznają je dodając do nazw przy- (Listing 2.).
rostki. Nazwy tabel z przyrostkami można zo- Jeśli teraz wykonamy procedurę (procedu-
W SQL Server 2005 i SQL Server 2008 są do- baczyć oglądając zawartość widoku sys.objects. ra_tymcz_2)
stępne dwa rodzaje tabel tymczasowych: Oczywiście w kodzie należy stosować nazwy
użyte podczas definicji tabeli (czyli bez przy- EXEC dbo.procedura_tymcz_2
• globalne tabele tymczasowe, rostków).
• lokalne tabele tymczasowe. W ramach danej sesji tabela tymczasowa wi- to wynik działania może nas nieco zaskoczyć.
doczna jest dla tworzącego ją poziomu i po-
Tabele tymczasowe tworzone są w bazie da- ziomów wewnętrznych. Jeśli tabela tymczaso- kolumna1 kolumna2
nych tempdb, niezależnie od aktualnego kon- wa zostanie stworzona w procedurze składo- 2 2
tekstu bazy danych. Tabele tymczasowe za- wanej, to będzie widoczna w tej procedurze i
zwyczaj zapisywane są na dysku. Jednak je- we wszystkich procedurach składowanych za- Przykład zademonstrował, że używanie takich
śli są one małe, to SQL Server 2005 i SQL Se- gnieżdżonych. samych nazw tabel tymczasowych w różnych

48 01/2009
SQL Server 2005 i SQL Server 2008

procedurach, czy też na różnych poziomach


nie jest najlepszą praktyką, zwłaszcza gdy two- Listing 1. Przykład fragmentu kodu, który może generować błędy
rzymy aplikacje biznesowe. Zamiast stosować USE testowa_baza;
takie same nazwy, należy uzupełniać je przed- GO
rostkami lub przyrostkami związanymi np. z -- jeśli w bazie występuje procedura to jest usuwana
nazwą procedur lub funkcji tworzących po- IF OBJECT_ID('dbo.procedura_tymcz_1') IS NOT NULL
szczególne tabele. DROP PROCEDURE dbo. procedura_tymcz_1';
GO
Tabele tymczasowe globalne -- tworzona jest nowa procedura
Globalne tabele tymczasowe różnią się od lo- CREATE PROCEDURE dbo. procedura_tymcz_1'
kalnych odpowiedników zakresem i trwało- AS
ścią. Nazwy globalnych tabel tymczasowych BEGIN
poprzedzone są symbolami ## i podobnie jak -- tworzona jest tabela tymczasowa z jedną kolumną
tabele lokalne tworzone są w bazie tempdb. CREATE TABLE #tabela_tymcz_1
Globalne tabele tymczasowe dostępne są w (
sesji bez jakichkolwiek zabezpieczeń (nie za- kolumna INT
leżą od poziomu i połączenia, w którym po- );
wstały). Z tego też względu stosując w apli- -- wstawiany jest jeden wiersz danych do tabeli tymczasowej
kacjach biznesowych globalne tabele tymcza- INSERT INTO #tabela_tymcz_1 VALUES (1);
sowe, należy wziąć pod uwagę czynnik bez- -- pobierane są dane z tabeli tymczasowej
pieczeństwa. SELECT * FROM #tabela_tymcz_1;
END;
Zmienne tablicowe GO
Zmienne tablicowe to elementy T-SQL, któ- -- tworzona jest drugą procedura
re nie są zbyt często wykorzystywane w apli- -- jeśli w bazie istnieje procedura składowana, to ją usuwamy
kacjach biznesowych. Czasem jednak lepiej jest IF OBJECT_ID('dbo.procedura_tymcz_2') IS NOT NULL
używać zmiennych tablicowych niż tabel tym- DROP PROCEDURE dbo. procedura_tymcz_2';
czasowych. GO
Zmienne tablicowe tworzone są w sek- -- tworzona jest nowa procedura
cji DECLARE i mają fizyczną reprezentację CREATE PROCEDURE dbo. procedura_tymcz_2'
(podobną do tabel tymczasowych) w bazie AS
tempdb. Po zadeklarowaniu zmiennej moż- BEGIN
na wstawić do niej dane, a następnie użyć -- tworzona jest tabela tymczasowa z jedną kolumną
polecenia SELECT do wyświetlenia zawarto- CREATE TABLE #tabela_tymcz_1
ści. (Listing 4) (
Używając zmiennych tablicowych trzeba kolumna INT
mieć świadomość, że posiadają one wiele ogra- );
niczeń (niektóre z tych ograniczeń negatyw- -- wstawiany jest jeden wiersz danych do tabeli
nie wpływają na tworzone aplikacje bizneso- INSERT INTO # tabela_tymcz_1 VALUES (2);
we), które nie istnieją w przypadku tabel tym- -- wywoływana jest wcześniej napisana procedura
czasowych: EXEC dbo.procedura_tymcz_1;
-- pobierane są dane z tabeli tymczasowej
• Nie można tworzyć jawnych indeksów, SELECT * FROM #tabela_tymcz_1;
można tworzyć ograniczenia UNIQUE i END;
PRIMARY KEY (cecha negatywnie wpły- GO
wająca na efektywność aplikacji bizneso-
wych). Listing 2. Zmiana procedury dbo.procedura_tymcz_1
• Po utworzeniu zmiennych tablicowych -- zmiana procedury
nie można zmieniać ich definicji – fakt ALTER PROCEDURE dbo.procedura_tymcz_1
ten powoduje zmniejszenie ponownych AS
kompilacji wymaganych przy zmianie BEGIN
struktur – dzięki czemu używając zmien- -- tworzona jest tabela z dwoma kolumnami
nych tablicowych, zyskujemy na efektyw- CREATE TABLE #tabela_tymcz_1
ności. Z drugiej jednak strony wszystko, (
co będzie potrzebne należy umieścić w kolumna1 INT,
sekcji DECLARE – tak więc tracimy na ska- kolumna2 INT,
lowalności. );
• Nie można używać instrukcji nielogowa- -- wstawiany jest jeden rekord do tabeli
nej SELECT INTO – czyli używając zmien- INSERT INTO #tabela_tymcz_1 VALUES (1, 1);
nych tablicowych w aplikacjach bizneso- -- pobierane są dane z tabeli
wych, nie możemy używać bardzo efek- SELECT * FROM #tabela_tymcz_1;
tywnej techniki kopiowania danych (ce- END;
cha negatywnie wpływająca na efektyw- GO
ność aplikacji biznesowych).

www.sdjournal.org 49
Aplikacje biznesowe

• Nie można precyzować nazwy kolumny Liczba zwróconych wierszy przy drugim uru- rane). Jest to jeden z głównych czynników,
poprzez dodanie do niej nazwy zmien- chomieniu instrukcji SELECT jest o jeden więk- jakie należy uwzględnić, wybierając pomię-
nej, co jest szczególnym utrudnieniem sza niż w przypadku pierwszego wywoła- dzy zmiennymi tablicowymi a tabelami tym-
w przypadku tworzenia skomplikowa- nia. Drugie zapytanie SELECT zwróci wiersz czasowymi przy tworzeniu aplikacji bizneso-
nych zapytań używających podrzęd- np. w postaci #5AEA84B7 (czytelnik zapewne wych. Minusem zmiennych tablicowych mo-
nych zapytań, co w przypadku aplikacji uzyska inną nazwę), który oznacza tabelę re- że być nieefektywny plan wykonania, co mo-
biznesowych jest praktycznie nieunik- prezentującą zmienną tablicową @zmienna _ że doprowadzić do wielu operacji I/O. Takie
nione. tablicowa . zachowanie w przypadku bardzo licznych
• W zapytaniach modyfikujących zmienne Tak więc podczas deklaracji zmiennych tabli- zmiennych tablicowych używanych w apli-
tablicowe nie stosuje się równoległych pla- cowych w bazie tempdb powstaje ukryta tabela kacjach biznesowych nie jest pożądane (spa-
nów wykonania. tymczasowa. Wniosek jest więc taki: wszystko, da efektywność rozwiązania). Plusem jed-
• Zakres zmiennych tablicowych jest jeszcze co napisałem o tabelach tymczasowych w kon- nak jest fakt, ze zmienne tablicowe powo-
bardziej ograniczony niż zakres tabel tym- tekście bazy danych tempdb odnosi się także do dują znacznie mniej ponownych kompilacji.
czasowych. zmiennych tablicowych. Tak więc tworząc aplikację biznesową, należy
Zakres zmiennych tablicowych jest ściśle wziąć pod uwagę, czy wykorzystanie zmien-
Wcześniej wspomniałem, że zmienne tablico- ograniczony do bieżącego poziomu i bieżą- nych tablicowych będzie korzystniejszym
we mają swoją reprezentację w bazie tempdb. cego zadania – tak jak to ma miejsce w przy- rozwiązaniem.
Można to w łatwy sposób sprawdzić wykonu- padku zwykłych zmiennych. Oznacza to, że
jąc najpierw zapytanie pokazujące wszystkie zmienne tablicowe nie są widoczne nawet w Baza tempdb
tabele w bazie tempdb, zadaniach wewnętrznych, ani w innych za- Oprócz tabel tymczasowych i zmiennych ta-
daniach uruchamianych na tym samym po- blicowych w bazie tempdb SQL Server 2005 i
SELECT table_name FROM tempdb.INFORMATION_ ziomie. SQL Server 2008 przechowują także niejaw-
SCHEMA.TABLES Zmienne tablicowe nie są elementem ze- ne aspekty swojego działania: m.in. buforo-
wnętrznej transakcji – ich zakres transakcji jest wanie danych, sortowanie i utrzymanie wer-
a następnie wykonując fragment kodu: ograniczony do poziomu instrukcji (umożli- sji poszczególnych wierszy. Tworząc zaawan-
wiają wycofanie transakcji jedynie na pozio- sowane aplikacje biznesowe można sprawić,
DECLARE mie instrukcji). że baza tempdb stanie się wąskim gardłem. Z
@zmienna_tablicowa TABLE (kolumna INT); Jak już wspomniano, w przypadku zmien- tego też względu należy dostroić również ba-
INSERT INTO @zmienna_tablicowa VALUES nych tablicowych SQL Server nie tworzy sta- zę tempdb, aby mogła sprostać obciążeniu ser-
(20); tystyk rozkładu, ani dokładnych danych o li- wera.
SELECT table_name FROM tempdb.INFORMATION_ czebności takiej zmiennej (w przypadku ta- Podczas strojenia bazy tempdb należy wziąć
SCHEMA.TABLES bel tymczasowych informacje takie są zbie- pod uwagę kilka aspektów.
Przy każdym uruchomieniu SQL Server
tworzy bazę tempdb od nowa. Jej rozmiar
Listing 3. Przykład zapytania wykorzystującego wyrażenia tablicowe
powraca wtedy do efektywnego zdefinio-
SELECT wanego rozmiaru. Jeśli po zainstalowaniu
-- pobierane są dane dotyczące imienia, nazwiska, zarobków i nazwy działu SQL Server 2005 lub SQL Server 2008 nie
p.imie, p.nazwisko, p.zarobki, d.nazwa_dzialu wykonano żadnych czynności konfiguracyj-
FROM nych, to rozmiar bazy tempdb wynosi 8 MB,
pracownicy p, -- dane pobierane są z tabeli pracownicy, z tabeli działy ... a przyrost wielkości ustawiany jest na 10%.
dzialy d, W przypadku większości aplikacji bizneso-
-- ... i z wyrażenia tablicowego wych wielkość ta jest bardzo niepraktycz-
-- zewnętrzne wyrażenie tablicowe na. Zawsze, gdy jakiś proces próbuje zapi-
(SELECT sać dane do tempdb i wielkość danych prze-
MIN(wyr_wew.zarobki_max) AS zarobki_min kracza 8 MB, to SQL Server inicjuje proces
FROM powiększania bazy o 10%, co w przypadku
-- wewnętrzne wyrażenie tablicowe zapytań w aplikacjach biznesowych jest bar-
(SELECT dzo niewielką jednostką. Ponadto, gdy pro-
MAX(zarobki) AS zarobki_max, ces będzie próbował zapisać do tempdb dużo
id_dzialu danych, to małe fragmenty zostaną zapisane
FROM pracownicy w różnych miejscach dysku powodując frag-
GROUP BY id_dzialu) wyr_wew) wyr_zew mentacje na poziomie systemu plików. Nale-
WHERE ży również pamiętać, że po restarcie SQL Se-
-- złączenie następuje po identyfikatorze działu i wielkości pensji rvera, baza powraca do pierwotnej wielkości
p.id_dzialu = d.id AND i cały proces zwiększania musi rozpocząć się
p.zarobki = wyr_zew.zarobki_min od nowa.
To wszystko negatywnie odbije się na efek-
Listing 4. Operacje wykonywane na zmiennych tablicowych tywności aplikacji biznesowej. Tak więc
DECLARE @zmienna_tablicowa TABLE (kolumna INT); wdrażając taką aplikację na serwer produk-
-- wstawienie danych cyjny, należy zdefiniować odpowiednią wiel-
INSERT INTO @zmienna_tablicowa VALUES (12); kość bazy tempdb. Określenie odpowiedniej
INSERT INTO @zmienna_tablicowa VALUES (40); wielkości nie jest łatwe i najczęściej wielkość
SELECT * FROM @zmienna_tablicowa -- wyświetlenie danych ta wyznaczana jest na podstawie testów na
środowisku developerskim lub testowym –

50 01/2009
obserwuje się wielkość bazy tempdb w dłuż- Wyrażenia tablicowe
szym okresie bez restartu serwera. Gdy już Tworząc aplikacje biznesowe czasem trzeba ko-
wiemy, jaki powinien być rozmiar bazy, wte- rzystać z tzw. logicznych tabel tymczasowych –
dy należy zmienić wartość parametru SIZE czyli wirtualnej materializacji zbiorów danych
dla pliku tempdb. Od tego momentu przy pośrednich, w przeciwieństwie do fizycznej
każdym restarcie serwera baza tempdb roz- materializacji zbiorów w postaci omówionych
pocznie funkcjonowanie od zdefiniowanej w tym artykule tabel tymczasowych i zmien-
wielkości. nych tablicowych.
W aplikacjach biznesowych, w których ba- Wyrażeń tablicowych używa się zazwy-
za tempdb jest intensywnie wykorzystywa- czaj w sytuacjach, w których potrzebny jest
na w sposób jawny lub też niejawny, należy obiekt tymczasowy głównie dla uproszcze-
rozważyć umieszczenie jej na osobnej macie- nia tworzonego kodu np. podczas tworze-
rzy dyskowej nie używanej przez żadne inne nia rozwiązania przy użyciu modularnego
procesy. podejścia. Wyrażenie tablicowe stosowane
Ponadto można rozdrobnić część przecho- są zazwyczaj w klauzuli FROM. Na listingu 3.
wującą dane na wiele dysków, aby zwiększyć zaprezentowany jest przykładowy kod z uży-
przepustowość operacji I/O. Im więcej dys- ciem wyrażeń tablicowych. Kod ma za za-
ków fizycznych tym lepiej. Najlepszym roz- danie wyświetlić wszystkich pracowników,
wiązaniem jest użycie macierzy RAID-10 do którzy mają taką samą pensję, jak pracow-
przechowywania danych oraz macierzy RA- nik zarabiający najmniej spośród pracowni-
ID-1 do przechowywania zapisów dzienni- ków zarabiających najwięcej w poszczegól-
ka. nych działach.
Logiczna baza tempdb tworzona jest przy Jak zapewne zauważyłeś w przykładzie z Li-
każdym restarcie serwera. Oznacza to, że baza stingu 3., użyto zagnieżdżonego wyrażenia ta-
tempdb jest tworzona, jako kopia modelowej ba- blicowego. W wewnętrznym wyrażeniu tabli-
zy. Tak więc jeśli przed restartem serwera w ba- cowym wybierane są dane na temat najwyż-
zie zostały utworzone trwale obiekty takie jak: szych zarobków w poszczególnych działach.
typy danych, tabele, konta użytkowników, to W zewnętrznym wyrażeniu tablicowym po-
po restarcie zostaną one usunięte. Jeśli zależy bierana jest najmniejsza pensja z wartości po-
nam na tym, aby po ponownym uruchomieniu branych w wewnętrznym wyrażeniu tablico-
serwera obiekty z bazy tempdb nie zniknęły, to wym.
mamy trzy wyjścia: Stosując wyrażenia tablicowe w SQL Server
2005 i SQL Server 2008 należy pamiętać jesz-
• utworzyć obiekty w modelowej bazie (roz- cze o jednej kwestii – całe zapytanie należy
wiązanie posiada poważną wadę – obiekty wziąć w nawiasy a za nawiasem zamykającym
tworzone są dla każdej nowej bazy użyt- należy umieścić alias do całego wyrażenia.
kownika),
• okresowo kopiować dane do innej ba- Podsumowanie
zy (moim zdaniem rozwiązanie najgor- W artykule tym zaprezentowano trochę mniej
sze, bo podważające sens istnienia bazy znane obiekty baz danych – zmienne tablico-
tempdb), we i tabele tymczasowe.
• utworzyć odpowiedni kod w procedurze W niektórych sytuacjach dzięki tym
startup (która jest uruchamiana przy każ- obiektom można osiągnąć dużą efektyw-
dym stracie SQL Servera - moim zdaniem ność aplikacji biznesowych. Jednak aby by-
jest to najlepsze rozwiązanie), ło to możliwe, trzeba prawidłowo skonfigu-
rować bazę tempdb. Prawidłowa konfiguracja
Należy również pamiętać, że w przypad- bazy tempdb jest również pomocna w przy-
ku bazy tempdb problemy związane z wydaj- padku używania wyrażeń tablicowych – nie-
nością mogą pojawić się dużo szybciej niż w stety w praktyce prawie zawsze fakt ten jest
przypadku normalnych baz, szczególnie gdy pomijany podczas tworzenia rozwiązań biz-
bardzo duża liczba równoczesnych sesji two- nesowych.
rzy tabele tymczasowe. Może wtedy wystą-
pić rywalizacja przy próbie alokacji nowych
stron.

ARTUR MOŚCICKI
Jest z wykształcenia informatykiem. Obecnie pracuje jako programista baz danych i hurtowni danych.
Ma również doświadczenie w tworzeniu aplikacji BI dla dużych i średnich firm. Jest współautorem książek:
Oracle 10g i Delphi. Programowanie baz danych, SQL Server 2005. Zaawansowane rozwiązania biznesowe
oraz Photoshop. Pluginy i efekty specjalne. Oprócz hurtowni i baz danych jego informatyczną pasją jest fo-
tografia cyfrowa i obróbka zdjęć za pomocą Adobe Photoshop. W wolnych chwilach kibicuje piłkarskiej re-
prezentacji Argentyny.
Kontakt z autorem: arturmoscicki@op.pl

www.sdjournal.org 51
Narzędzia programistyczne

GNU Linear Programming Kit


Narzędzie do rozwiązywania
zagadnień programowania liniowego
Zagadnienie programowania liniowego oraz metoda simplex umożliwiająca
jego rozwiązanie były tajnym orężem podczas drugiej wojny światowej.
Pozwalały na maksymalizację zysków lub minimalizację strat przy zadanych
ograniczeniach. W poniższym artykule wprowadzamy czytelnika w arkana
programowania liniowego oraz narzędzie GLPK.
• Przy pomocy ciężarówek można prze-
Dowiesz się: Powinieneś wiedzieć: wieźć maksymalnie 1500 ton kruszywa
• Czym jest zagadnienie programowania linio- • Co to jest funkcja liniowa. miesięcznie.
wego. • Co to jest układ równości lub nierówności. • Zakładamy, że nie można wozić betonu
• Jakie problemy można dzięki niemu rozwiązać. ciężarówkami, ani kruszywa betoniarka-
• W jaki sposób sformułować problemy w na- mi.
rzędziu GLPK. • Przewiezienie tony betonu kosztuje 17
• Jak interpretować otrzymane rezultaty. PLN, a tony kruszywa 4 PLN; całkowity
• Gdzie znaleźć dodatkowe informacje. budżet na ten cel wynosi 25000 PLN.
• Czas potrzebny na przewiezienie tony be-
tonu wynosi 8 godzin, a tony kruszywa
nych wyrobów. Spektrum zastosowań ograni- 6 godzin; całkowity czas dostępny przez
czone jest jedynie wyobraźnią. Zanim zosta- pracodawcę wynosi 15000 godzin.
Poziom trudności nie formalnie zdefiniowanie zagadnienie pro- • Firma zarabia 22 PLN na przewiezieniu
gramowania liniowego, spróbujmy prześledzić tony betonu, a 20 PLN na przewiezieniu
prosty problem. tony kruszywa.
• Należy uzyskać jak największy zysk na

P
rogramowanie liniowe jest dziedziną ba- Pierwszy przykład przewożeniu betonu oraz kruszywa.
dań operacyjnych, które skupiają się na Firma transportowa ma do dyspozycji beto-
opracowywaniu metod pozwalających niarki do przewozu betonu oraz ciężarówki Po syntezie informacji dochodzimy do wnio-
na podjęcie optymalnej decyzji. Zagadnienie do transportu kruszywa. Za pomocą betonia- sku, iż zysk firmy zależy od dwóch zmien-
programowania liniowego [1][2] umożliwia rek może przewieźć 1400 ton betonu miesięcz- nych: b – ilości przewiezionych ton betonu
sformułowanie i rozwiązanie problemów, któ- nie, a za pomocą ciężarówek 1500 ton. Aby zre- oraz k – ilości przewiezionych ton kruszywa.
rych celem jest maksymalizacja (lub minima- alizować kontrakt, musi najpierw sama wyło- Co więcej, zysk ten można wyrazić przy po-
lizacja) pewnej funkcji przy zadanych ograni- żyć środki. Przewiezienie z bazy na budowę to-
czeniach. ny betonu kosztuje firmę 17 PLN, a tony kru- Listing 1. Model problemu z transportem
Dzięki pakietowi GLPK [3] możliwe jest szywa 4 PLN. Firma może maksymalnie wyło- betonu i kruszywa
rozwiązanie problemów programowania li- żyć 25000 PLN na ten cel. Dodatkowo uśred-
niowego oraz całkowitoliczbowego. W jego niony czas przewiezienia tony betonu wynosi 8 # Transport betonu i kruszywa
skład wchodzą biblioteka w języku C oraz so- godzin, a tony kruszywa 6 godzin. Pracodawca
lver, który z niej korzysta. Poprzez język pro- dysponuje miesięcznie 15000 godzinami, jakie /* Zmienne */
gramowania GNU MathProg solver pozwa- może przeznaczyć na przewóz. Firma zarabia var b >= 0; /* beton */
la na formułowanie problemów oraz ich roz- 22 PLN na przewiezieniu tony betonu oraz 20 var k >= 0; /* kruszywo */
wiązanie za pomocą wspomnianej biblioteki PLN na przewiezieniu tony kruszywa. Oblicz,
programowej. Możliwe jest również korzysta- w jaki sposób zrealizować kontrakt (to jest, ile /* Funkcja celu */
nie z samej biblioteki w programach pisanych przewieźć betonu i kruszywa na budowę), aby maximize zysk : 22 * b + 20 * k;
w języku C. osiągnąć największy zysk.
Na potrzeby niniejszego artykułu zosta- Aby rozwiązać ten problem, prześledźmy /* Ograniczenia */
ły wybrane przykłady, w których powracają- najważniejsze informacje: s.t. c1 : 17 * b + 4 * k <= 25000;
cym motywem jest firma transportowa. Oczy- s.t. c2 : 8 * b + 6 * k <= 15000;
wiście metoda ta może być użyta do rozwią- • Firma przewozi beton oraz kruszywo. s.t. c3 : b <= 1400;
zywania innych zagadnień. Przykładami mo- • Przy pomocy betoniarek można prze- s.t. c4 : k <= 1500;
gą być problemy z opracowywaniem optymal- wieźć maksymalnie 1400 ton betonu end;
nych diet, grafików pracy czy składów chemicz- miesięcznie.

52 1/2009
GNU Linear Programming Kit

mocy prostego równania z = 22 * b + 20 * k. Aby rozwiązać tak stworzony model, posłu- macje o czasie i pamięci użytej do znalezienia
Jak łatwo zauważyć, równanie to jest liniowe. gujemy się narzędziem glpsol. rozwiązania.
Zmienne te będą zmieniały wartość w trakcie Najistotniejszymi informacjami są te, iż po-
poszukiwania optymalnego rozwiązania przez glpsol -m betonkruszywo.mod -o wiodło się wygenerowanie modelu oraz uzyska-
algorytm simplex. betonkruszywo.sol nie optymalnego rozwiązania. Oznacza to, że
Na pierwszy rzut oka można odnieść wra- znaleziono takie wartości zmiennych, dla któ-
żenie, iż zysk dałoby się zwiększać w nieskoń- Jego wywołanie składa się z dwóch parame- rych funkcja celu przyjmuje wartość najwięk-
czoność poprzez zwiększanie zmiennych b trów. Pierwszy z nich określa nazwę pliku, z szą. W szczególnym przypadku takich miejsc
oraz k. Niestety nie jest to możliwe, gdyż ist- którego ma być wczytany model. Drugi z nich może być nieskończenie wiele. Możliwe są
nieją dodatkowe ograniczenia. Pierwsze z nich wskazuje na plik, do którego ma być zapisane jeszcze dwa przypadki rozwiązania problemu
dotyczy konieczności przeznaczenia pewnych rozwiązanie. programowania liniowego. Pierwszym z nich
środków na realizację zadania. Środki te ro- Po uruchomieniu solvera zostaną wypisane jest nieskończona wartość funkcji celu. Drugi
sną wraz z ilością przewiezionych materiałów. informacje o przebiegu jego działania. Na Li- przypadek to brak rozwiązania ze względu na
Ograniczenie możemy wyrazić przy pomocy stingu 2. widzimy, że został poprawnie utwo- sprzeczność ograniczeń.
nierówności 17 * b + 4 * k <= 25000. Drugim rzony model, uruchomiona metoda simplex, Przeanalizujmy zawartość wygenerowane-
ograniczeniem jest liczba godzin, jakie mogą oraz że udało się znaleźć rozwiązanie opty- go pliku z rozwiązaniem problemu (Listing
być przeznaczone na zrealizowanie zlecenia. malne. Na końcu raportu podawane są infor- 3.). Składa się on z czterech części. Pierw-
Ich liczba również zależy od liczby przewie-
zionych materiałów. Bez trudu możemy dojść
do nierówności 8 * b + 6 * k <= 15000. Ostat-
nimi ograniczeniami będą te najprostsze, któ-
re zostały już explicite zaznaczone w najważ-
niejszych informacjach. Ilość przewiezione-
go betonu nie może być większa niż 1400
ton, a ilość przewiezionego kruszywa więk-
sza od 1500 ton. Daje to dwie nierówności:
b <= 1400 oraz k <= 1500. Ostatnie nierów-
ności nie zostały opisane wcześniej, ale wy-
nikają implicite z rozważanego zagadnienia.
Ilość przewiezionych materiałów nie może
być ujemna. Stąd otrzymujemy nierówności:
b >= 0 oraz k >= 0.
Podsumowując, otrzymaliśmy następujące
równania oraz nierówności:

• Funkcja celu, która podlega maksymaliza-


cji: z = 22 * b + 20 * k.
• 1-wsze ograniczenie: 17 * b + 4 * k <= 25000.
• 2-gie: 8 * b + 6 * k <= 15000.
• 3-cie ograniczenie: b <= 1400.
• 4-te ograniczenie: k <= 1500.
• 5-te ograniczenie na zmienne: b >= 0,
Rysunek 1. Graficzna interpretacja problemu dwuwymiarowego
k >= 0.

W celu rozwiązania opisanego problemu po- Listing 2. Informacja o działaniu solvera


służmy się pakietem GLPK. W pierwszym
kroku zdefiniujemy model systemu. Został on Reading model section from betonkruszywo.mod...
przedstawiony na Listingu 1. 19 lines were read
Komentarze zaczynają się od znaku # lub Generating zysk...
są zawarte pomiędzy /* */. W następnych li- Generating c1...
niach następuje deklaracja zmiennych b oraz Generating c2...
k wraz z ograniczeniem ich co do znaku. Na- Generating c3...
zwy zmiennych mogą składać się z więcej niż Generating c4...
jednej litery. Funkcję celu, którą mamy maksy- Model has been successfully generated
malizować, przedstawiono w linii rozpoczyna- lpx_simplex: original LP has 5 rows, 2 columns, 8 non-zeros
jącej się od słowa kluczowego maximize. Moż- lpx_simplex: presolved LP has 2 rows, 2 columns, 4 non-zeros
liwa jest również minimalizacja funkcji celu. lpx_adv_basis: size of triangular part = 2
W takim przypadku funkcję poprzedza się sło- * 0: objval = 0.000000000e+00 infeas = 0.000000000e+00 (0)
wem kluczowym minimize. Ostanie linie defi- * 2: objval = 4.650000000e+04 infeas = 0.000000000e+00 (0)
niują ograniczenia, jakie muszą być zastosowa- OPTIMAL SOLUTION FOUND
ne przy naszym problemie. Deklarację ograni- Time used: 0.0 secs
czenia możemy rozpocząć od jednego ze słów Memory used: 0.1M (151406 bytes)
kluczowych subject to, subj to, s.t., lub po- lpx_print_sol: writing LP problem solution to `betonkruszywo.sol'...
minąć w ogóle.

www.sdjournal.org 53
Narzędzia programistyczne

sza z nich przedstawia informację o proble- oznaczająca, o ile zmieni się funkcja celu, gdy formie graficznej może ono zostać wyobra-
mie oraz o optymalnym rozwiązaniu. Druga dane ograniczenie zostanie poluzowane o jed- żone jako poszukiwanie maksymalnej warto-
część prezentuje funkcję celu oraz ogranicze- ną jednostkę. W naszym przykładzie dla ogra- ści funkcji wewnątrz dopuszczalnego obsza-
nia. Kolejna dotyczy optymalnych wartości niczenia c2 dotyczącego ilości godzin przezna- ru. Obszar ten jest definiowany poprzez zada-
zmiennych decyzyjnych. Wreszcie ostatnia czonych na wykonanie zadania, funkcja celu ne ograniczenia. Na Rysunku 1. przedstawia-
część umożliwia prześledzenie błędów nu- zwiększy się o 2.75, a dla ograniczenia c4 doty- my obszar zdefiniowany przez kryteria zawar-
merycznych, jakie mogły pojawić się w trak- czącego limitu na ilość przewożonego kruszy- te w przykładzie z betoniarkami oraz ciężarów-
cie rozwiązania. wa o 3.5 PLN. Proszę sprawdzić, czy rzeczywi- kami. Co ciekawe, najlepsze rozwiązanie le-
Najprostszą interpretacją jest stwierdzenie, ście funkcja celu wzrośnie o odpowiednią war- ży na obwiedni dopuszczalnego obszaru. Stąd
iż funkcja celu przyjmuje największą wartość tość. Dla ograniczeń oznaczonych przez B nie też nazwa metody simplex, gdzie simplex sta-
46500 dla wartości zmiennych b = 750 oraz k = zostały osiągnięte limity. Zmiana dla takich nowi granicę takiego obszaru. Dzięki poszuki-
1500. Dla naszego przykładu oznacza to, że fir- przypadków nie będzie miała wpływu na war- waniu optymalnego rozwiązania na obwiedni
ma transportowa osiągnie największy zysk, gdy tość funkcji celu. obszaru, udało się opracować algorytmy, które
przetransportuje 750 ton betonu oraz 1500 działają w czasie liniowym w zależności od roz-
ton kruszywa. W ten sposób osiągnie zysk o Teoria w pigułce miaru problemu. Jest to jedno z największych
wartości 46500 PLN. Mam nadzieję, że zainteresowałem Cię drogi osiągnięć w badaniach nad rozwiązywaniem
Co jeszcze można wyczytać z przedstawio- Czytelniku zagadnieniem programowania li- zagadnienia programowania liniowego. Proszę
nego listingu? W kolumnie St pojawiają się niowego. Wprowadźmy teraz trochę formali- wskazać miejsce, dla którego funkcja celu osią-
dwa oznaczenia B oraz NU. Za każdym razem, zmów oraz przedstawmy graficznie, na czym ga wartość największą. Jest ono jednym z prze-
gdy ograniczenie sięga swojej dolnej lub górnej polega rozwiązanie problemu programowa- cięć funkcji ograniczających dopuszczalny ob-
granicy, jest ono odpowiednio zwane dolnym nia liniowego dla przypadku dwuwymiaro- szar (Rysunek 1).
lub górnym. Ograniczenie takie uniemożliwia wego. W formie macierzowej ma ono postać:
osiągnięcie przez funkcję celu lepszej wartości. ������� Przykład z modelem oraz danymi
Przez solver oznaczane jest ono jako NL (dla dol- ��������� Kolejny przykład ma pokazać, w jaki sposób
nego ograniczenia) oraz NU (dla górnego). W ko- Zadanie polega na maksymalizacji funkcji li- zdefiniować model dla danego problemu oraz
lumnie Marginal pojawia się dodatkowa liczba niowej przy narzuconych ograniczeniach. W wprowadzić dla niego konkretne dane. Model
jest ogólnym przedstawieniem rozważanego za-
Listing 3. Rozwiązanie problemu z transportem betonu i kruszywa dania. Dzięki niemu możliwe jest podstawianie
konkretnych danych i analizowanie dla nich ko-
Problem: betonkruszywo lejnych rozwiązań, na przykład w celu rozstrzy-
Rows: 5 gnięcia pomiędzy kilkoma alternatywami. So-
Columns: 2 lver umożliwia wprowadzenie modelu oraz da-
Non-zeros: 8 nych z kilku plików. Dla uproszczenia w zapre-
Status: OPTIMAL zentowanym przykładzie model oraz dane bę-
Objective: zysk = 46500 (MAXimum) dą w jednym pliku.
Model zawiera kilka parametrów, ze wzglę-
No. Row name St Activity Lower bound Upper bound Marginal du na które będzie rozważany. Parametry te
------ ------------ -- ------------- ------------- ------------- ------------- są definiowane przy pomocy słowa kluczowe-
1 zysk B 46500 go param. Konieczne jest również zdefinio-
2 c1 B 18750 25000 wanie zmiennych, które będą zmieniały się
3 c2 NU 15000 15000 2.75 w trakcie działania algorytmu. Zmienne te
4 c3 B 750 1400 definiuje się przy pomocy słowa kluczowego
5 c4 NU 1500 1500 3.5 var. To one wyznaczą optymalne rozwiąza-
nie. Parametry będą mogły być zmieniane po-
No. Column name St Activity Lower bound Upper bound Marginal przez różne dane. W ten sposób otrzymamy
------ ------------ -- ------------- ------------- ------------- ------------- kilka różnych zadań do rozwiązania. Zmien-
1 b B 750 0 ne z kolei stanowią rozwiązanie dla konkret-
2 k B 1500 0 nego problemu.
Zanim przedstawimy zadanie, musimy jesz-
Karush-Kuhn-Tucker optimality conditions: cze trochę skomplikować opis, aby w rezultacie
KKT.PE: max.abs.err. = 0.00e+00 on row 0 ułatwić zapis modelu. Niejednokrotnie w trak-
max.rel.err. = 0.00e+00 on row 0 cie definicji modelu będziemy musieli wyliczać
High quality kilka parametrów oraz zmiennych, które będą
KKT.PB: max.abs.err. = 0.00e+00 on row 0 indeksowane przy pomocy pewnego zbioru ele-
max.rel.err. = 0.00e+00 on row 0 mentów. Na przykład zmienne k_1, k_2, ..., k_n.
High quality Zamiast jednak stosować taki zapis, można
KKT.DE: max.abs.err. = 1.78e-15 on column 2
max.rel.err. = 8.46e-17 on column 2 Tabela 1. Koszt przejazdu pomiędzy fabrykami a
magazynami
High quality
KKT.DB: max.abs.err. = 0.00e+00 on row 0 X Y Z
max.rel.err. = 0.00e+00 on row 0 A 30 25 15
High quality
B 15 20 10
End of output
C 20 35 15

54 1/2009
GNU Linear Programming Kit

zdefiniować je jako k_i, gdzie i należy do zbioru na za pomocą bardziej zwartego zapisu. Stano- wieniem informacji z tekstu zadania. Z kolei
Z = {1, 2,..., n}. Solver oferuje taką możliwość wi też cel, jaki chcemy osiągnąć – zminimalizo- ograniczenie c3 dotyczy obostrzeń dotyczących
poprzez definiowanie zbioru indeksów. Na ta- wać koszt związany z użyciem szukanej liczby liczby dużych i małych aut. Tak naprawdę dla
kim zbiorze możemy również wykonywać ope- dużych i małych samochodów. naszego przykładu będą to cztery ogranicze-
racje. Zamiast pisać k_1 + k_2 +...+ k_n, wystar- Teraz wyjaśnienie sformułowania ograni- nia! Dzięki wyliczeniom elementów zbioru po-
czy napisać sum{i in Z} k_i. czeń nie powinno być już problemem. Ogra- wstaną ograniczenia o nazwach c3_Male_Male,
Jeśli jest to jeszcze niezrozumiałe, mam nadzie- niczenie c1 i c2 są matematycznym przedsta- c3_Male_Duze, c3_Duze_Male i c3_Duze_Duze.
ję, że przykład doskonale wyjaśni, o co chodzi.
Firma spedycyjna ma do przewiezienia 2000 Listing 4. Model problemu z małymi i dużymi autami
paczek przy pomocy małych i dużych aut. Każ-
de małe auto może pomieścić 60 paczek, w du- set Auta;
żym aucie mieści się ich 150. Koszt przejazdu
małego auta wynosi 15 PLN, a koszt przejazdu param koszt{a in Auta};
dużego auta to 25 PLN. Dodatkowo, cały prze- param pojemnosc{a in Auta};
wóz ma zmieścić się w kwocie 400 PLN, a licz- /* Zmienna pomocnicza do ostatniego ograniczenia */
ba dużych aut nie może przekraczać liczby ma- param transport{m in Auta, d in Auta};
łych aut użytych do transportu. Ile dużych i
małych samochodów należy użyć do wykona- /* Zmienna decyzyjna, liczba aut */
nia zadania, aby spełnić powyższe ograniczenia var auta{a in Auta} >= 0, integer;
i zminimalizować koszt?.
Listing 4. przedstawia zdefiniowany model /* Funkcja celu */
oraz konkretne dane dla zadania z małymi i du- minimize z : sum{a in Auta} auta[a] * koszt[a];
żymi autami. Zawiera on kilka elementów, któ-
re postaram się przybliżyć. Definicja modelu /* Ograniczenia */
znajduje się na początku pliku (do słowa klu- s.t. c1 : sum{a in Auta} auta[a] * koszt[a] <= 400;
czowego data). W dalszej części zaczyna się de- s.t. c2 : sum{a in Auta} auta[a] * pojemnosc[a] >= 2000;
finicja konkretnych danych. Zajmijmy się jed- s.t. c3{m in Auta, d in Auta} : auta[d] * transport[m,d] <=
nak najpierw modelem. auta[m] * transport[m,d];
Z treści zadania wynika, iż firma posiada ma- data;
łe i duże samochody. Pojawiają się również in- set Auta := Male, Duze;
formacje o ich pojemności oraz koszcie trans- param koszt := Male 15
portu. Możemy więc przypuszczać, iż w mo- Duze 25;
delu będą występowały parametry dla takich param pojemnosc := Male 60
aut. Zamiast pisać koszt_Małe, koszt_Duze, Duze 150;
pojemność_Małe, pojemność_Duze, zadeklaruj- param transport : Male Duze :=
my zbiór rodzajów aut, ze względu na które te Male 0 1
parametry będą określane. Co więcej, rozwiąza- Duze 0 0;
nie będzie polegało na określeniu liczby obu ro- end;
dzajów aut w taki sposób, aby koszt był jak naj-
mniejszy. Będziemy więc potrzebowali dwóch Listing 5. Rozwiązanie problemu z małymi i dużymi autami
zmiennych: auta_Małe oraz auta_Duze. I tu-
taj przyda nam się wspomniany zbiór rodza- Problem: duzemaleauta
jów aut. Rows: 7
Zadeklarujmy więc ów zbiór, którego ele- Columns: 2 (2 integer, 0 binary)
menty będą służyły jako indeksy dla parame- Non-zeros: 8
trów oraz zmiennych modelu. Jego deklaracja Status: INTEGER OPTIMAL
to set Auta;. Wyszczególnienie, iż mamy do Objective: z = 390 (MINimum) 380.952381 (LP)
czynienia z małymi i dużymi autami znajdzie
się w sekcji z danymi modelu. Kolejne linie de- No. Row name Activity Lower bound Upper bound
klarują wspomniane parametry i zmienne. Dla ------ ------------ ------------- ------------- -------------
przykładu, param koszt{a in Auta};, ozna- 1 z 390
cza deklarację parametrów koszt z indeksami 2 c1 390 400
w zbiorze Auta. Dla konkretnych danych Auta 3 c2 2010 2000
:= Male, Duze;, możemy sobie wyobrażać, że 4 c3[Male,Male] 0 -0
będą to parametry koszt_Male, koszt_Duze. 5 c3[Male,Duze] -2 -0
Przejdźmy teraz do omówienia funkcji celu 6 c3[Duze,Male] 0 -0
oraz ograniczeń. W ich deklaracji również za- 7 c3[Duze,Duze] 0 -0
stosowano wyliczenia odnoszące się do zbio-
ru indeksów. Aby łatwiej zrozumieć zapis No. Column name Activity Lower bound Upper bound
funkcji celu z : sum{a in Auta} auta[a] * ------ ------------ ------------- ------------- -------------
koszt[a], rozwińmy ją do naszego przypadku z 1 auta[Male] * 11 0
małymi i dużymi autami. Będzie ona miała po- 2 auta[Duze] * 9 0
stać auta_Male * koszt_Male + auta_Duze * End of output
koszt_Duze. Widzimy więc, że jest ona wyrażo-

www.sdjournal.org 55
Narzędzia programistyczne

Dla konkretnych danych będziemy mogli zde- przypadku małych i dużych aut. Zrozumienie su, ale nie stanowi istoty omawianego tutaj za-
finiować, że ma ono być uwzględniane tylko w tego ograniczenia może zająć trochę więcej cza- dania. Ma raczej pokazać, iż wyliczenie elemen-
tów zbioru, może być użyte do deklaracji kilku
Listing 6. Model problemu transportowego ograniczeń.
Omówienie fragmentu z danymi nie jest już
set Fabryki; takie skomplikowane. Pierwsza linia w tej sek-
set Magazyny; cji deklaruje zbiór typów aut. Będziemy mieć
do czynienia z małymi i dużymi pojazdami.
param produkcja{f in Fabryki}; Następnie zadeklarowane są wartości parame-
param zapotrzebowanie{m in Magazyny}; trów. Parametry koszt oraz pojemność są jed-
param koszt{f in Fabryki, m in Magazyny}; nowymiarowe. Na przykład koszt dla małego
auta wynosi 15, a pojemność dla dużego 150.
var wysylka{f in Fabryki, m in Magazyny} >= 0, integer; Parametr transport jest macierzą dwuwymia-
rową. Jej deklaracja jest podobna do deklara-
minimize budzet: sum{f in Fabryki, m in Magazyny} wysylka[f,m] * koszt[f,m]; cji zwykłej macierzy: w poziomie zapisane są
wiersze, a w pionie jej kolumny. Na przykład
s.t. podaz{f in Fabryki}: sum{m in Magazyny} wysylka[f,m] <= produkcja[f]; wartość transport[Male, Duze] wynosi 1.
s.t. popyt{m in Magazyny}: sum{f in Fabryki} wysylka[f,m] = zapotrzebowanie[m]; Uff, dobrnęliśmy do końca omawiania tego
dość skomplikowanego przykładu. Zostały po-
data; kazane tutaj najważniejsze konstrukcje języka
set Fabryki := A B C; GNU MathProg. Wydaje mi się, iż powinieneś
set Magazyny := X Y Z; sobie, drogi Czytelniku, poradzić samodzielnie
param produkcja := A 9 z innymi przykładami. Gratuluję cierpliwości i
B 5 dociekliwości.
C 2; Po uruchomieniu możemy zobaczyć intere-
param zapotrzebowanie := X 6 sujący nas wynik. Jednak tutaj czeka nas niespo-
Y 3 dzianka. Uważni czytelnicy z pewnością zauwa-
Z 3; żą, iż w linii deklarującej zmienne decyzyjne poja-
param koszt : X Y Z := wiło się słowo kluczowe integer. Oznacza ono, iż
A 30 25 15 poszukiwane rozwiązanie musi zostać ograniczo-
B 15 20 10 ne do wartości całkowitych. Niemożliwe jest prze-
C 20 35 15; cież użycie do transportu tylko kawałka auta. Szu-
end; kaną odpowiedzią jest 11 i 9. Oznacza to, iż naj-
lepszy efekt osiągniemy, gdy do przewozu użyje-
Listing 7. Rozwiązanie problemu transportowego my 11 małych i 9 dużych aut. Dzięki tej prostej
Problem: transport modyfikacji do wyznaczenia rozwiązania został
Rows: 7 użyty algorytm całkowitoliczbowy.
Columns: 9 (9 integer, 0 binary) Model zawierał explicite podane wartości
Non-zeros: 27 dotyczące ilości paczek do przewiezienia oraz
Status: INTEGER OPTIMAL całkowitego kosztu, jaki może być poniesiony
Objective: budzet = 215 (MINimum) 215 (LP) w związku z tym kontraktem. Ustalenie tych
wartości jako parametrów zadania, nie powin-
No. Row name Activity Lower bound Upper bound no stanowić żadnego kłopotu.
------ ------------ ------------- ------------- -------------
1 budzet 215 Zagadnienie transportowe
2 podaz[A] 5 9 Zaprezentowany w tej sekcji przykład korzy-
3 podaz[B] 5 5 sta z konstrukcji poznanych w poprzednim za-
4 podaz[C] 2 2 daniu. Podobnie do poprzedniego, jest ono cał-
5 popyt[X] 6 6 = kowitoliczbowe. Oto nasz problem do rozwią-
6 popyt[Y] 3 3 = zania.
7 popyt[Z] 3 3 = W fabrykach A, B, C znajduje się odpowied-
nio 9, 5 i 2 maszyny, które mają zostać prze-
No. Column name Activity Lower bound Upper bound transportowane do magazynów X, Y, Z. W każ-
------ ------------ ------------- ------------- ------------- dym z magazynów mają znaleźć się odpowied-
1 wysylka[A,X] * 0 0 nio 6, 3 i 3 maszyny. Koszt transportu pomię-
2 wysylka[A,Y] * 3 0 dzy miejscami podano w Tabeli 1. Należy za-
3 wysylka[A,Z] * 2 0 planować transport maszyn w taki sposób, aby
4 wysylka[B,X] * 4 0 zminimalizować jego całkowity koszt (budżet
5 wysylka[B,Y] * 0 0 przedsięwzięcia).
6 wysylka[B,Z] * 1 0 Z treści zadania wynika, iż należy uwzględ-
7 wysylka[C,X] * 2 0 nić kilka parametrów ze względu na fabryki oraz
8 wysylka[C,Y] * 0 0 magazyny. Parametry te będą dotyczyły ilości
9 wysylka[C,Z] * 0 0 maszyn dostępnych w fabryce, zapotrzebowa-
nia w danym magazynie oraz kosztu transpor-

56 1/2009
GNU Linear Programming Kit

tu pomiędzy fabryką a magazynem. Zmienny- da się z elementów X, Y, Z. W kolejnych krokach Najistotniejszym do zapamiętania jest fakt,
mi decyzyjnymi będzie ilość maszyn, jakie mu- deklarujemy parametry dotyczące produk- iż programowanie liniowe jest metodą optyma-
szą być przetransportowane z każdej fabryki do cji poszczególnych fabryk, zapotrzebowania w lizacji. Między innymi można ją wykorzystać
każdego magazynu. Ponieważ musimy wysyłać magazynach oraz kosztu transportu z fabryki do maksymalizacji przychodów, minimalizacji
całe maszyny, nie zapominamy o słowie kluczo- do magazynu. wydatków, rozwiązywania problemów trans-
wym integer. Funkcja celu, jaką chcemy zmini- Po uruchomieniu solvera możemy przekonać portowych oraz alokacji zasobów. Najbardziej
malizować, to całkowity koszt wysyłki ze wszyst- się o ilości maszyn, jakie mają być wysłane z da- znanym sposobem rozwiązywania jest meto-
kich fabryk do wszystkich magazynów. nej fabryki do danego magazynu. Dla przykła- da simplex. Jej nazwa bierze się od poruszania
Rozważania te prowadzą nas do zdefiniowa- du z fabryki A zostaną wysłane trzy maszyny do się w trakcie działania algorytmu po obwiedni
nia dwóch zbiorów, które będą oznaczały na- magazynu Y oraz dwie maszyny do magazynu (simplex'ie) obszaru dopuszczalnego.
zwy fabryk oraz magazynów. Zbiory te będą na- Z. Z kolei, do składu X trafią cztery urządzenia z Poruszone w tym artykule zagadnienia nie
zywały się, ku ogólnemu zaskoczeniu, Fabryki fabryki B oraz dwa z fabryki C. wyczerpują wszystkich związanych z narzę-
oraz Magazyny. Parametrami będą: produkcja dziem GLPK oraz programowaniem linio-
(zależna od fabryki), zapotrzebowanie (zależ- Podsumowanie wym. Zainteresowanym szczególnie polecam
ne od magazynu) oraz koszt przesyłki (zależ- GNU Linear Programming Kit jest jednym z teorię problemu dualnego. Ma ona bardzo cie-
ny od obu tych elementów). Zmienna decyzyj- wielu dostępnych narzędzi umożliwiających kawą interpretację ekonomiczną i stanowi in-
na oznaczająca ilość wysłanych maszyn również rozwiązywanie problemów programowania li- trygujące rozszerzenie teorii programowania
będzie zależała od fabryki i magazynu. W pro- niowego. Jego zaletą jest bezpłatne udostępnie- liniowego.
sty sposób zbliżamy się do zadeklarowania pod- nie oraz możliwość zainstalowania na różnych
stawowych elementów modelu. systemach operacyjnych. Oprócz języka GNU
W następnym kroku zastanówmy się nad MathProg, w którym dokonuje się opisu pro- SŁAWOMIR MALUDZIŃSKI
funkcją celu. Jej postać będzie sumą liczby ma- blemu, możliwe jest skorzystanie bezpośrednio Jest doktorantem informatyki AGH. Specjalizuje się
szyn wysłanych z danej fabryki do magazynu biblioteki w języku C. Dodatkowo istnieją in- w metodach formalnych oraz systemach agento-
pomnożoną przez koszt przesyłki maszyny do terfejsy pozwalające na korzystanie z niej w ję- wych. Posiada kilkuletnie doświadczenie zawodo-
magazynu. W zapisie z użyciem operatora sum zykach programowania takich jak Perl, Python, we w czołowych placówkach naukowych oraz fir-
funkcja ta ma postać: sum{f in Fabryki, m in Java czy Delphi. Fakty te bezspornie świadczą mach softwarowych.
Magazyny} wysylka[f,m] * koszt[f,m]. na korzyść opisywanego tu pakietu. Kontakt z autorem: slawomir.maludzinski@gmail.com
Niestety istnieje ograniczona ilość maszyn
dostępnych w fabrykach oraz sprecyzowane za- R E K L A M A
potrzebowanie w magazynach. Oto ogranicze-
nia dla tych warunków:

podaz{f in Fabryki}: sum{m in Magazyny}


wysylka[f,m] <= produkcja[f]; ��������������������������������������������������������������������������������������������
������������������������������������������������������������������������������������������
popyt{m in Magazyny}: sum{f in Fabryki} ��������������������������������������������������������������������������������������������
wysylka[f,m] = zapotrzebowanie[m]; ������������
�����������������������������������������������������������������

Ograniczenia te są kilkoma powstałymi w wy-


niku zastosowania wyliczenia indeksów w �����������������������������������
zbiorze. Na przykład ograniczenie podaz{f in ������������������������������
Fabryki} oznacza deklarację ograniczeń dla
�����������������������������������������������������������������������������������������������
wszystkich fabryk. Podobnie będzie z ograni- ��������������������������������������������������������������������������
czeniem opisującym popyt. Dla ograniczenia
podaży i konkretnego magazynu widzimy, iż �����������������������������
suma maszyn wysłanych do wszystkich ma- ��������������������������������������������������������������������������������������������������
gazynów, nie może być większa niż produk- ����������������������������
cja w danej fabryce. Podobnie z ograniczeniem ������������������������������������������������������������
�����������������������������������������������������������������������������
popytu – dla danego magazynu, suma maszyn ��������������������������������������
wysłanych z wszystkich fabryk musi odpowia- ���������������������������������������������������������
������������������������������������������������
dać zapotrzebowaniu.
����������������������������������������������������
Deklaracja danych, które odpowiadają tym ���������������������������������������
przedstawionym w treści zadania, nie stanowi �������������������������������������������
większego problemu. Zbiór fabryk zawiera ele- ����������
menty A, B, C. Podobnie zbiór magazynów skła-
���������������������������������������������������������������������������������������
�����������������������������������������
W sieci �������������������������������������������
��������������������������������������������������������������������������
�������������������������
• [1] Linear Programming: Foundations
and Extensions, Robert J. Vanderbei ����������������������������������������������������������������
• [2] http://en.wikipedia.org/wiki/Linear_ �����������������
programming
• [3] GNU Linear Programming Kit, �������������������������������������������
www.gnu.org/software/glpk ��������������������������������������������������������������������������������������
�����������������������������������������������������������������������������������������������
�����������������������������������������������������

www.sdjournal.org 57
Warsztaty

Media streaming
Wykorzystanie Adobe Flex i Red5

Aplikacje RIA bardzo często wykorzystują technologię strumieniowania


mediów (media streaming). Może ona być podstawową funkcjonalnością
danej aplikacji (lub jedną z podstawowych) w przypadku komunikatorów
czy też odtwarzaczy plików audio i video.

tacją i kodami źródłowymi. Serwer możemy


Dowiesz się: Powinieneś wiedzieć: uruchomić za pomocą skryptu red5.bat (lub
• jak skonfigurować i uruchomić aplikację Red5; • podstawy Adobe Flex i Flex Builder IDE; red5.sh na Linuksie). Po uruchomieniu ser-
• jak za pomocą technologii Adobe Flex stru- • podstawy języka Java; wera i wpisaniu w przeglądarkę adresu http:
mieniować obraz i dźwięk. • podstawy Spring Framework. //localhost:5080, ukaże nam się strona starto-
wa, gdzie możemy zobaczyć szereg przykła-
dowych aplikacji prezentujących możliwo-
cej i przekazywał go do aplikacji odtwarza- ści Red5.
jącej. Do tego wykorzystamy serwer Red5.
Poziom trudności Red5 jest open source’ową (i co za tym idzie Moja pierwsza aplikacja Red5
– darmową) alternatywą dla Adobe Flash Pisanie naszej aplikacji Red5 rozpoczynamy
Media Server. od utworzenia nowego katalogu myRed5App
Udostępniany jest na licencji LGPL, co po- w katalogu webapps. To będzie główny kata-

M
oże też być wykorzystana do wzbo- zwala użyć go zarówno w projektach komer- log naszej aplikacji i jednocześnie nazwa jej
gacenia samej oprawy audiowizual- cyjnych, jak i open source’owych. Dostarcza kontekstu.
nej aplikacji np. kiedy chcemy do- praktycznie wszystkich funkcjonalności do- W nowo utworzonym katalogu tworzy-
dać podkład muzyczny do serwisu WWW wy- stępnych w FMS i dodatkowo pozwala na zdal- my katalog WEB-INF. W nim z kolei doda-
konanego we Flashu. ne wywoływanie metod (remoting) z wykorzy- jemy 2 pliki konfiguracyjne: appCtx.xml i
Dostęp do mediów strumieniowych można staniem AMF. web.xml.
podzielić na dwa rodzaje: My nie będziemy jednak tej funkcjonalności Plik appCtx.xml zawiera definicje beanów
potrzebować i ograniczymy się jedynie do wy- Springowych reprezentujących naszą aplikację
• streaming na żywo (live) – transmitowa- korzystania możliwości Red5 w zakresie stre- (Listing 1.).
ne dane docierają od razu do wszystkich amingu.
użytkowników (na przykład aplikacja ty- Red5 jest oparty na frameworku Spring, Nazwa pliku może być tutaj dowolna, nieko-
pu videochat), dodatkowo w całości napisany został w języ- niecznie appCtx.xml. Ja nazwałem go tak, po-
• streaming na życzenie (on demand) – ku Java, dzięki czemu cała konfiguracja ser- nieważ reprezentuje kontekst Springowy naszej
użytkownik może wybrać, jaki strumień wera znajduje się w kilku plikach XML. Poza aplikacji. W pliku zdefiniowane są 3 beany:
i od którego momentu chce oglądać/ tym bardzo łatwe jest rozszerzanie lub mody-
słuchać (przykładem może tu być wspo- fikacja standardowych funkcjonalności, a • web.context – wrapper na kontekst Sprin-
mniana aplikacja odtwarzająca pliki au- także integracja z innymi frameworkami ta- gowy aplikacji. Praktycznie we wszystkich
dio i video). kimi jak chociażby Spring Security (daw- aplikacjach Red5 ta definicja jest standar-
niej Acegi Security). Red5 jest dostarczany dowa.
ActionScript 3.0 pozwala w bardzo łatwy spo- w dwóch wersjach: standalone (jako archi- • web.scope – tutaj istotna jest wartość pro-
sób wykorzystać możliwości strumieniowa- wum tar.gz lub plik instalatora) bądź też jako perty contextPath. Definiuje ona ścieżkę,
nia. Aby to zilustrować, napiszemy 2 proste plik WAR, który możemy następnie zainsta- na której dostępna będzie nasza aplikacja.
aplikacje w technologii Adobe Flex – jedna lować na dowolnym serwerze aplikacji. My Ścieżka ta może, ale nie musi, pokrywać
z nich będzie transmitować na żywo obraz z w naszym przykładzie posłużymy się wersją się z nazwą kontekstu aplikacji w katalogu
kamery internetowej oraz dźwięk z mikrofo- standalone. webapps. W tym przypadku wartości są ta-
nu, natomiast druga będzie ten multimedial- Po ściągnięciu i rozpakowaniu archiwum kie same. Ważny jest też znak / na począt-
ny strumień odtwarzać. widzimy strukturę katalogów znaną nam z ku.
serwera aplikacji Apache Tomcat (katalogi • web.handler – definiuje klasę, któ-
Red5 Flash Server conf, lib i webapps). ra będzie odpowiedzialna za komunika-
Oprócz aplikacji klienckich potrzebny bę- Wynika to z faktu, że Red5 w wersji stan- cję z aplikacją kliencką. W tym momen-
dzie też komponent serwerowy, który bę- dalone jest oparty właśnie na serwerze Tomcat cie użyjemy standardowej klasy z Red5
dzie odbierał strumień od aplikacji nadają- 6.0. Dodatkowo mamy katalogi z dokumen- – ApplicationAdapter. Jednak w mo-

58 01/2009
Media streaming

mencie, gdybyśmy potrzebowali dodat- rzenie własnej klasy dziedziczącej z Plik web.xml to deskryptor naszej aplikacji we-
kowej logiki (np. mechanizmu autenty- ApplicationAdapter i wykorzystanie jej bowej. Jego zawartość przedstawiona jest na
kacji połączeń), konieczne byłoby utwo- w definicji beana. Listingu 2.
Składnia deskryptora zgodna jest z wersją
Listing 1. Definicje beanów Springowych w pliku appCtx.xml 2.3. Jako listener rejestrujemy klasę ładującą
kontekst Springowy z pliku konfiguracyjne-
<?xml version="1.0" encoding="UTF-8"?> go. Lokalizacja pliku konfiguracyjnego określo-
<!DOCTYPE beans PUBLIC na jest przez parametr kontekstu contextConfi-
"-//SPRING//DTD BEAN//EN" gLocation.
"http://www.springframework.org/dtd/spring-beans.dtd"> Wartość tego parametru wskazuje na
<beans> nasz plik konfiguracyjny appCtx.xml wzglę-
dem głównego katalogu naszej aplikacji, czyli
<bean id="web.context" class="org.red5.server.Context" webapps/myRed5App.
autowire="byType" /> W tym momencie nasza aplikacja jest już
poprawnie skonfigurowana. Możemy ją prze-
<bean id="web.scope" class="org.red5.server.WebScope" testować, uruchamiając serwer, a następnie
init-method="register"> odszukać w logu następujący fragment: (Li-
<property name="server" ref="red5.server" /> sting 5)
<property name="parent" ref="global.scope" /> Świadczy to o tym, że nasza aplikacja została
<property name="context" ref="web.context" /> uruchomiona poprawnie i możemy się do niej
<property name="handler" ref="web.handler" /> podłączyć z Flexa.
<property name="contextPath" value="/myRed5App" />
<property name="virtualHosts" value="*" /> Streaming danych
</bean> Aplikacja Flexowa odpowiedzialna za nada-
wanie (publikowanie) strumienia – nazwij-
<bean id="web.handler" my ją publisher – będzie łączyć się z naszą
class="org.red5.server.adapter.ApplicationAdapter" /> aplikacją Red5 i wysyłać do niej zakodowa-
ny obraz z kamery internetowej oraz dźwięk
</beans> z mikrofonu.
Flash Player ma wbudowaną obsługę urzą-
Listing 2. Deskryptor web.xml aplikacji Red5 dzeń audio/video i dostęp do nich jest bar-
<?xml version="1.0" encoding="UTF-8"?> dzo prosty – za pomocą statycznych me-
<!DOCTYPE web-app PUBLIC tod zdefiniowanych w klasach Camera i
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" Microphone.
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app> Camera.getCamera()
Microphone.getMicrophone()
<display-name>My first Red5 application</display-name>
Tworzymy nowy projekt Flex z domyślnymi
<context-param> ustawieniami i nadajemy mu nazwę publisher.
<param-name>globalScope</param-name> Następnie w głównym pliku MXML dodaje-
<param-value>default</param-value> my znacznik <mx:Script>. Definiujemy pry-
</context-param> watną zmienną typu NetConnection – jest to
<context-param> połączenie, za pomocą którego będziemy ko-
<param-name>locatorFactorySelector</param-name> munikować się z serwerem.
<param-value>red5.xml</param-value>
</context-param> private var nc: NetConnection = new
<context-param> NetConnection();
<param-name>parentContextKey</param-name>
<param-value>default.context</param-value> Następnie w znaczniku <mx:Application> doda-
</context-param> jemy listener na zdarzenie. creationComplete:
<context-param>
<param-name>contextConfigLocation</param-name> creationComplete=”onCreationComplete()”
<param-value>/WEB-INF/appCtx.xml</param-value>
</context-param> Z kolei w ciele funkcji onCreationComplete
rejestrujemy listener na zdarzenie netStatus i
<listener> łączymy się z aplikacją Red5.
<listener-class>
org.springframework.web.context.ContextLoaderListener nc.addEventListener(NetStatusEvent.NET_
</listener-class> STATUS, onStatus);
</listener> nc.connect("rtmp://localhost/myRed5App");

</web-app> Flex łączy się z Red5 za pomocą protokołu


RTMP (Real Time Messaging Protocol). Ścież-

www.sdjournal.org 59
Warsztaty

ka, z którą się łączymy, odpowiada wartości kacji i okno dialogowe ustawień bezpieczeń- pierw musimy oczywiście uruchomić aplika-
contextPath, zdefiniowanej wcześniej w pli- stwa Flash Playera. Jest ono wyświetlane, cję publisher), to usłyszymy już strumieniowa-
ku appCtx.xml. W funkcji onStatus() spraw- ponieważ użytkownik musi pozwolić Fla- ny dźwięk.
dzamy najpierw czy udało się nawiązać połą- showi na dostęp do urządzeń audio/video. Jednak potrzebowalibyśmy jeszcze jakiegoś
czenie. Z kolei w konsoli Red5 widzimy logi świad- komponentu wizualnego, aby zobaczyć tak-
czące o nawiązaniu połączenia z aplikacji że obraz. W tym celu dodajemy w MXML-
if (event.info.code == "NetConnection.Conne klienckiej. u, poniżej znacznika <mx:Script> następu-
ct.Success") { jący kod:
} Odtwarzanie strumienia
Tworzymy drugi projekt we Flex Builde- <mx:UIComponent id="videoBox" width="100%"
Jeżeli połączenie zostało nawiązane pomyśl- rze, który tym razem nazywamy subscri- height="100%" />.
nie, możemy opublikować nasz strumień. ber. Kod tej aplikacji jest w dużej części ta-
ki sam jak w przypadku aplikacji publisher. Jest to definicja wrappera na komponent
var ns: NetStream = new NetStream(nc); Podobnie jak tam, musimy utworzyć obiekt Video, w którym będziemy wyświetlać stru-
ns.attachCamera(Camera.getCamera()); NetConnection, następnie nawiązać połącze- mień video.
ns.attachAudio(Microphone.getMicrophone()); nie, sprawdzić czy połączenie się udało i jeże- Komponent Video tworzymy w metodzie
ns.publish("myStream"); li tak to utworzyć obiekt NetStream. Jednak, onStatus(), po wywołaniu metody play()
zamiast podpinać do tego obiektu urządze- na obiekcie NetStream. Podłączamy do niego
Jako parametr do metody publish() przeka- nia audio i video, wywołujemy na nim me- nasz strumień, a następnie dodajemy na wi-
zujemy string będący identyfikatorem stru- todę play(), przekazując jako parametr iden- dok jako dziecko komponentu zdefiniowane-
mienia. Tego samego identyfikatora będziemy tyfikator opublikowanego wcześniej stru- go w MXML-u.
później używać do odtwarzania. mienia.
Pełny kod źródłowy aplikacji publisher var video: Video = new Video();
został przedstawiony na Listingu 3. Może- ns.play("myStream"); video.attachNetStream(ns);
my teraz przetestować aplikację, naciskając videoBox.addChild(video);
przycisk Run we Flex Builderze. Po włącze- W tym momencie strumień jest już odtwa-
niu powinniśmy zobaczyć puste okno apli- rzany. Jeżeli teraz uruchomimy aplikację (naj- W tym momencie po uruchomieniu aplikacji
zobaczymy już strumieniowany obraz z kame-
Listing 3. Kompletny kod aplikacji publisher. ry internetowej. Kompletny kod aplikacji za-
wiera Listing 4.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationCo Rozszerzanie
mplete="onCreationComplete()"> funkcjonalności Red5
Spróbujemy teraz utworzyć własną implemen-
<mx:Script> tację adaptera Red5. W tym celu w katalogu
<![CDATA[ WEB-INF tworzymy katalog classes a w nim z
private var nc: NetConnection = new NetConnection(); kolei katalog mypackage. Następnie w katalo-
private var ns: NetStream; gu mypackage tworzymy nowy plik MyAdap-
ter.java. Jego zawartość przedstawiona jest na
private function onCreationComplete(): void { Listingu 6.
nc.addEventListener(NetStatusEvent.NET_STATUS, onStatus); Klasa MyAdapter dziedziczy z klasy
nc.connect("rtmp://localhost/myRed5App"); ApplicationAdapter, której używaliśmy
} wcześniej w trakcie definiowania bean’ów
Springowych w pliku appCtx.xml. Przecią-
private function onStatus(event: NetStatusEvent): void { żamy w niej metodę appConnect(), która jest
if (event.info.code == "NetConnection.Connect.Success") { wywoływana w momencie próby nawiąza-
ns = new NetStream(nc); nia połączenia z serwerem. Metoda ta przyj-
ns.attachCamera(Camera.getCamera()); muje 2 argumenty: obiekt IConnection re-
ns.attachAudio(Microphone.getMicrophone()); prezentujący nawiązywane właśnie połącze-
ns.publish("myStream"); nie, oraz tablicę parametrów przesyłanych
} przez aplikację kliencką w wywołaniu me-
} tody connect(). Zwracana wartość infor-
]]> muje o tym czy połączenie zostało zaakcep-
</mx:Script> towane (wartość true) czy odrzucone (war-
tość false). W tym przykładzie będziemy
</mx:Application> dopuszczać połączenie tylko wtedy gdy jako
pierwszy parametr przesłany zostanie string
„user123” (w prawdziwej implementacji mo-
glibyśmy tutaj sprawdzać np. nazwę użyt-
kownika i hasło). Jeżeli prześlemy inną ilość
W Sieci parametrów lub nieprawidłową wartość, po-
• http://osflash.org/red5 – strona domowa Red5 łączenie zostanie odrzucone. Dodatkowo lo-
• http://www.springframework.org/ – strona domowa Springa gujemy informację czy połączenie się uda-
ło czy nie.

60 01/2009
Media streaming

Listing 4. Kompletny kod aplikacji subscriber.


Kompilujemy klasę za pomocą kompilatora
javac dołączonego do standardowego JDK:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationCo JAVA_HOME/bin/javac –cp RED5_HOME/red5.jar
mplete="onCreationComplete()"> MyAdapter.java
<mx:Script>
<![CDATA[ JAVA_HOME to katalog gdzie mamy zainsta-
private var nc: NetConnection = new NetConnection(); lowane JDK, natomiast RED5_HOME to ka-
private var ns: NetStream; talog, w którym rozpakowaliśmy dystrybu-
cję Red5.
private function onCreationComplete(): void { Za pomocą parametru –cp wskazujemy któ-
nc.addEventListener(NetStatusEvent.NET_STATUS, onStatus); re biblioteki powinny być wykorzystane pod-
nc.connect("rtmp://localhost/myRed5App"); czas kompilacji (w tym przypadku definicje
} klas Red5 w pliku red5.jar).
Po skompilowaniu klasy, wprowadzamy
private function onStatus(event: NetStatusEvent): void { zmianę w pliku appCtx.xml. W definicji beana
if (event.info.code == "NetConnection.Connect.Success") { web.handler używamy naszej klasy zamiast kla-
ns = new NetStream(nc); sy Red5:
ns.play("myStream");
<bean id="web.handler" class="mypackage.MyA
var video: Video = new Video(); dapter" />
video.attachNetStream(ns);
videoBox.addChild(video); Musimy także zmodyfikować kod aplikacji
} klienckich, tak aby mogły się połączyć z no-
} wym adapterem. W tym celu w wywołaniu
]]> metody connect() na obiekcie NetConnection
</mx:Script> dodajemy drugi argument:

<mx:UIComponent id="videoBox" width="100%" height="100%" /> nc.connect("rtmp://localhost/myRed5App",


</mx:Application> "user123");

Listing 5. Fragment logu serwera Red5 świadczący o prawidłowym uruchomieniu aplikacji Powyższą zmianę musimy wprowadzić zarów-
2008-11-04 09:57:50,140 [main] INFO /myRed5App - Initializing Spring root no w aplikacji publisher jak i subscriber.
WebApplicationContext
2008-11-04 09:57:50,140 [main] INFO org.springframework.web.context.ContextLoader - Podsumowanie
Root WebApplicationContext: initialization started Powyższy przykład jest bardzo prosty, jednak
2008-11-04 09:57:50,156 [main] INFO org.springframework.beans.factory.support.Default może służyć jako podstawa do poznania in-
ListableBeanFactory - Pre-instantiating singletons in org.sprin nych możliwości Red5 oraz praktycznego ich
gframework.beans.factory.suppo wykorzystania w aplikacjach Flex. Przykłado-
rt.DefaultListableBeanFactory@124614c: defining beans [web.context,web.scope,web.handle wo można dodać własną implementację ada-
r]; parent: org.springframework.beans.factory.support.DefaultLi ptera Red5 z logiką odpowiedzialną za auten-
stableBeanFactory@b31b77 tykację, czy też połączyć 2 napisane aplikacje
2008-11-04 09:57:50,156 [main] INFO org.springframework.web.context.ContextLoader - klienckie, tak aby każda mogła zarówno nada-
Root WebApplicationContext: initialization completed in 16 ms wać, jak i odbierać strumień, tworząc w ten
sposób prosty videochat. Zachęcam do eks-
Listing 6. Klasa MyAdapter perymentów, gdyż jest to najlepszy sposób,
package mypackage; by poznawać nowe technologie i rozwijać swo-
je umiejętności.
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IConnection;

public class MyAdapter extends ApplicationAdapter {


ROMAN SWOSZOWSKI
public boolean appConnect(IConnection conn, Object[] params) { Absolwent Uniwersytetu Ekonomicznego w Kra-
if (params.length == 1 && params[0].equals("user123")) { kowie na kierunku Informatyka i ekonometria, ma
System.out.println("Connection accepted"); kilkuletnie doświadczenie w branży IT. Obecnie jest
return super.appConnect(conn, params); współwłaścicielem firmy Grape Software (http://
} else { www.grapesoftware.com) oferującej m.in. usługi
System.out.println("Connection rejected"); w zakresie tworzenia oprogramowania. Interesuje
return false; się głównie zagadnieniami związanymi z warstwą
} prezentacji – w tym tworzeniem interfejsu użyt-
} kownika w aplikacjach typu RIA z wykorzystaniem
} technologii Adobe Flex.
Kontakt: roman.swoszowski@grapesoftware.com

www.sdjournal.org 61
Warsztaty

Świat 3D w Javie
Podstawy programowania z wykorzystaniem API Java 3D

Java jest jednym z najczęściej wykorzystywanych języków programowania,


który w połączeniu z wirtualną maszyną Javy daje aplikacjom w niej napisanym
dużą przenośność. Java 3D, darmowe API do Javy, pozwala wykorzystać
podstawowe zalety języka i platformy do renderowania obiektów 3D w bardzo
elastyczny i logiczny sposób.
• Tworzymy główną gałąź (BranchGro-
Dowiesz się: Powinieneś wiedzieć: up) naszego świata 3D, po czym ją kom-
• jak wyświetlać obiekty 3D przy pomocy Javy 3D, • podstawy języka Java, pilujemy. Kompilacja sceny to swego ro-
• jak wykorzystywać podstawowe obiekty 3D do- • podstawy geometrii analitycznej, dzaju optymalizacja struktury obiek-
stępne w Javie 3D, • wiedzieć czym cechuje się struktura drzewa. tów przez nas dodanych. Czynność ta
• jak tworzyć własne obiekty 3D, powinna być wykonana przed wyświe-
• jak przypisywać obiektom kolory, tekstury, wła- tleniem danej grupy, gdyż może ona
ściwości oświetlenia, etc. zwiększyć wydajność. Szczegóły doty-
czące kompilacji można znaleźć pod
adresem http://java3d.j3d.org/tutorials/
tlony z trzech stron – od przodu punktowym quick_fix/compile.html oraz w dokumen-
światłem zielonym, z lewej kierunkowym nie- tacji API.
Poziom trudności bieskim, a z prawej kierunkowym żółtym. Za- • Tworzymy nowy świat 3D przypisany do
nim przejdziemy do samego obiektu 3D, jakim utworzonego wcześniej obiektu canvas3d.
jest ten tekst, musimy przyjrzeć się klasom nie- • Dodajemy do świata utworzoną wcześniej
zbędnym do stworzenia świata 3D, z którego gałąź z obiektami 3D.

J
ava 3D to darmowe, wszechstronne i potęż- będziemy korzystać. Fragment kodu za to od-
ne API pozwalające na wyświetlanie obiek- powiedzialny widoczny jest na Listingu 1. Po wykonaniu tych czynności mamy w peł-
tów 3D w czasie rzeczywistym oraz inte- Kluczową rolę w tym kodzie pełni klasa Sim- ni funkcjonujący świat 3D, którego zawartość
rakcję z nimi. Wykorzystuje ona w pełni moc kar- pleUniverse. Jest ona swego rodzaju kontene- wyświetlana jest poprzez obiekt canvas3d. Na-
ty graficznej poprzez DirectX lub OpenGL, przez rem, który po utworzeniu zawiera wszystkie leży jeszcze dodać go do naszego GUI: frag-
co renderowane sceny są naprawdę wysokiej jako- niezbędne do renderowania świata 3D obiek- ment zaprezentowany w Listingu 2.
ści. Obsługiwane są funkcje takie jak antyaliasing, ty z przypisanymi podstawowymi ustawienia-
filtrowanie anizotropowe, cieniowanie, dynamicz- mi. Nie będę szczegółowo opisywał każdego z Dodawanie
ne oświetlanie, słowem, Java 3D daje programi- nich, gdyż z punktu widzenia przedstawianych obiektów do świata 3D
ście naprawdę szerokie możliwości – począwszy programów nie jest to konieczne. Warto jednak Najwyższa pora, by po stworzeniu obiektów
od tworzenia prostych aplikacji, poprzez wizuali- zauważyć, że każdy z obiektów składowych jest pozwalających na renderowanie świata 3D,
zacje różnego rodzaju symulacji, aż po gry 3D. Co dostępny poprzez odpowiednie metody w Sim- zająć się zawartością tego świata. W tym pro-
ważniejsze, Java 3D jest naprawdę dobrze przemy- pleUniverse, dzięki czemu możemy zmieniać gramie cała zawartość głównej gałęzi genero-
ślanym API, choć może nie jest to widoczne przy tylko te jego elementy, które nas interesują. wana jest w jednej metodzie – linijka po li-
pierwszym zetknięciu z nim, a programowanie z Oto opis wykonywanych czynności przygo- nijce. W przypadku bardziej skomplikowa-
jego wykorzystaniem jest bardzo intuicyjne. towawczych: nych światów sugeruję, by stworzyć własne
klasy reprezentujące obiekty 3D, dzięki cze-
Instalacja • Tworzymy obiekt GraphicsConfiguration mu aplikacja stanie się dużo bardziej przej-
Należy ściągnąć odpowiedni instalator (lub – metodą statyczną klasy SimpleUniverse rzysta, a operowanie na nich dużo prostsze.
ewentualnie zestaw binarek) ze strony https:// pobieramy konfigurację grafiki, która po- Przykład takiej klasy znaleźć można w pro-
java3d.dev.java.net/binary-builds.html, po czym winna być optymalna dla naszej konfigu- gramie 3.
go uruchomić. Java 3D zostanie zainstalowana racji sprzętowej. Świat 3D w Javie 3D tworzony jest w for-
i zintegruje się z JRE/SDK automatycznie. • Tworzymy obiekt Canvas3D. Jest to kom- mie drzewa. Każdy obiekt 3D musi mieć
ponent, który służy do renderowania świa- przypisanego dokładnie jednego rodzica,
Pierwszy program ta 3D. Dodajemy go później do GUI w do- przy czym korzeniem jest w naszym przy-
– J3DTextDemo – Hello 3D World! wolnym, odpowiadającym nam miejscu. padku obiekt SimpleUniverse. Ilość potom-
Program ten, jak widać na obrazku, wyświetla Dodatkowo ustawiamy preferowany roz- ków nie jest ograniczona. Strukturę tę w Ja-
trójwymiarowy napis Hello 3D World oświe- miar tego płótna. vie 3D reprezentują klasy abstrakcyjne Node

62 01/2009
Świat 3D w Javie

– węzeł oraz dziedziczące po nim Leaf – liść nie było niezmienne. Gdybyśmy dodali utwo- Jest to układ współrzędnych nieco inny, niż
(węzeł bez potomków, właściwy obiekt 3D) rzony tekst do głównej gałęzi bezpośrednio, ten, do którego jesteśmy przyzwyczajeni ze
oraz Group – grupa (węzeł do którego można okazałoby się, że jest zbyt duży, by zmieścić się szkoły czy uczelni. By się z nim zaznajomić,
przypinać inne węzły, w tym liście). na ekranie. Ponadto, tekst ten byłby ułożony proponuję modyfikować wierzchołki sześcia-
Dwie najważniejsze i najczęściej stosowane dokładnie frontem do nas, w związku z czym nu w programie 2 i obserwować jak wpłynie to
klasy potomne klasy Group to BranchGroup w ogóle nie widzielibyśmy, że jest on obiek- na kształt bryły.
oraz TransformGroup. Opiszę je teraz dokład- tem 3D! Dlatego właśnie shDispText dołączo- Każdy obiekt 3D składa się z pewnej ilo-
niej. ny jest do textScalingGroup, która zmniejsza ści polygonów – trójkątów umieszczonych w
BranchGroup jest takim węzłem, o które- jego rozmiar, ta grupa zaś dołączona jest do przestrzeni. Każdy taki trójkąt definiowany
go poddrzewie powinno się myśleć jak o sa- textRotatingGroup, która go obraca. jest przez trzy punkty o współrzędnych kar-
modzielnej miniscenie. Obiektu tego używa- Mam nadzieję, że struktura J3DTextDemo tezjańskich (x, y, z). By stworzyć kształt inny
my do oznaczenia konkretnego obiektu lub jest już dla Was zrozumiała. Program ten miał niż trójkąt, musimy stworzyć pewną ilość po-
grupy obiektów, które tworzą pewną całość, na celu zademonstrowanie jak proste i szyb- lygonów – np. na ścianę sześcianu (kwadrat)
np. jeśli mamy w świecie 3D lampę składają- kie jest tworzenie scen 3D. Teraz skupimy się wystarczą dwa trójkąty, zaś na cały sześcian
cą się z abażuru, żarówki, stojaka oraz źródła na tym, co dzieje się za kulisami, czyli jak to – 2*6 = 12 polygonów. Grupę polygonów
światła, obiekty te powinny zostać zamknię- wszystko tak naprawdę działa. składających się na obiekt będę nazywał jego
te w oddzielnej BranchGroupie, która będzie geometrią - przykład jej definiowania znajdu-
reprezentować lampę jako całość. Oprócz Świat Javy 3D je się w programie 2.
wprowadzania logiki i ładu, takie konstru- Pierwszą rzeczą, którą trzeba zapamiętać, jest Zakładając, że mamy gotowy zestaw poly-
owanie sceny ma zalety praktyczne – dzięki układ współrzędnych obowiązujący w Javie gonów, który chcemy umieścić w określonym
temu możemy jedną operacją np. odłączyć od 3D, widoczny obok ilustracji 3. Patrząc na sce- miejscu w przestrzeni, mamy dwie możliwo-
sceny całą grupę. nę z domyślnego punktu, widzimy osie x i y jak ści: albo zmodyfikujemy geometrię obiektu i
TransformGroup jest węzłem, który ma przy- w 2D, zaś nasze oczy skierowane są w stronę przesuniemy wszystkie jego wierzchołki ręcz-
pisaną transformację. Oznacza to, że wszyscy mniejszych wartości osi z. nie, tzn. zmodyfikujemy ich współrzędne, al-
potomkowie tego węzła mogą zostać przesu-
nięci i obróceni w dowolny (ale wszyscy w ta-
ki sam) sposób.
Oprócz węzłów-rodziców scena składa się
���������������
także z liści. W przypadku J3DTextDemo wy- ������������������������������������
������
korzystywane są następujące klasy dziedziczą-
ce po Leaf:

• Shape3D,który jest dość ogólną klasą re-


prezentującą dowolny kształt w świecie
3D. W naszym przypadku zawiera ona �����������
����������
napis przygotowany przy pomocy klas
Text3D i Font3D.
• DirectionalLight, który definiuje źró-
dło światła padające w konkretnym kie-
runku z nieskończenie dalekiego źródła,
w związku z czym promienie światła są do ����������
siebie równoległe. ��������������� ����������
�����������������
• PointLight, który definiuje źródło światła
w konkretnym miejscu w przestrzeni. Pro-
mienie światła rozchodzą się koncentrycz-
nie we wszystkich kierunkach. ����������������
• Obie powyższe klasy rozszerzają klasę �������������
Light, która definiuje także kolor emito-
wanego światła.
��������������
Wiedząc to wszystko, przyjrzyjmy się struktu- ���������������� ����������������
������������
rze sceny w J3DTextDemo (Rysunek 2)
Korzeniem jest obiekt klasy Locale (któ-
ry jest częścią SimpleUniverse) i do nie-
go przypinamy stworzoną przez nas grupę
wholeScene. Bezpośrednio do niej przypina-
my źródła światła, gdyż chcemy, by ich położe-

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

Rysunek 1. Hello 3D World – napis


wyrenderowany przez Javę 3D Rysunek 2. Drzewo sceny programu J3DTextDemo

www.sdjournal.org 63
Warsztaty

bo umieścimy ten obiekt wewnątrz obiektu Transform3D. Z matematycznego punktu wi- Gdy tworzymy nowy obiekt Transform3D,
TransformGroup i przypiszemy mu określo- dzenia jest macierzą 4 x 4, zaś współrzędne reprezentuje on przekształcenie identyczno-
ną transformację dokonującą tego samego. Z punktu lub wektora objętego daną transfor- ściowe, czyli niezmieniające w żaden sposób
punktu widzenia wydajności obie metody są macją to iloczyn macierzy z tym wektorem. obiektów 3D. By zmienić działanie transfor-
podobne, zaś z punktu widzenia prostoty roz- Rozumienie mechanizmów matematycznych macji można ręcznie przypisać mu pewną ma-
wiązania, dużo lepiej umieścić dany kształt w jest przydatne, ale nie jest konieczne, gdyż cierz lub skorzystać z metod zaimplemento-
TransformGroupie. Java 3D daje nam możliwość tworzenia zło- wanych w Javie 3D. Są to między innymi:
Do każdego obiektu TransformGroup przy- żonych transformacji poprzez składanie tych
pisana jest pewna transformacja – obiekt podstawowych. • rotX (double angle) – przypisuje danej trans-
formacji obrót w osi x o dany kąt,
Listing 1. Inicjalizacja świata 3D • rotY (double angle), rotZ (double angle)
– analogicznie do powyższego, dla róż-
// pobieramy podstawową konfigurację graficzną z SimpleUniverse nych osi,
GraphicsConfiguration config = • setTranslation(Vector3f translation) –
SimpleUniverse.getPreferredConfiguration(); ustawia przesunięcie w przestrzeni o dany
wektor,
// tworzymy nowy Canvas3D z podaną konfiguracją • mul(Transform3D transform) – łączy da-
Canvas3D canvas3d = new Canvas3D(config); ną transformację z podaną w argumencie,
dzięki czemu możemy otrzymać zarówno
// ustawiamy preferowany rozmiar canvasa obrót, jak i przesunięcie,
canvas3d.setPreferredSize(new Dimension(800,200)); • mul(Transform3D transform1, Transform3D
transform2) – ustawia wartość transforma-
// tworzymy główną gałąź świata 3D cji na złączenie transformacji podanych jako
BranchGroup scene = createSceneGraph(); parametry.

// po zakończeniu jej tworzenia dokonujemy kompilacji Przykład wykorzystania tych metod demon-
scene.compile(); struje fragment kodu z programu 2. –Listing 3.
Zmienna newTransform, po wykonaniu po-
// tworzymy nowy świat 3D wyższych operacji, staje się złączeniem po-
SimpleUniverse universe = new SimpleUniverse(canvas3d); przedniej transformacji oraz obrotów wokół
trzech osi o różne kąty. Zachęcam do poekspe-
// dodajemy do świata stworzoną wcześniej gałąź rymentowania z tym fragmentem kodu, np. po-
universe.addBranchGraph(scene); przez dodanie przesunięcia.
Łącząc transformacje zawierające przesunię-
Listing 2. Wyświetlanie stworzonego świata 3D na ekranie cie oraz obrót należy pamiętać, że wektor prze-
JFrame dialog = new JFrame(); sunięcia będzie dotyczył nowej bazy, tzn. jeśli
dialog.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ustawimy w transformacji przesunięcie o wek-
dialog.setTitle("Hello 3D World!"); tor (1, 0, 0) a następnie (lub wcześniej, kolejność
JPanel panel = new JPanel(); nie ma znaczenia) dodamy (metodą mul) obrót
dialog.getContentPane().add(panel); o kąt 90 stopni wokół osi y, to obiekt znajdzie się
w przestrzeni w miejscu (0, 0, 1). By zrozumieć
// dodajemy Canvas3D jak zwykły komponent ten problem, sugeruję szczegółowo zapoznać się
panel.add(new J3DTextDemo().getCanvas()); z hierarchią transformacji w programie 3.
dialog.pack();
dialog.setVisible(true); Program 2 – J3DRotatingCube
– Wirujący sześcian
Listing 3. Złożenie transformacji W tej części artykułu zapoznamy się m.in. z
// ustalamy obrót w rotTransform - w osi x; metodami tworzenia i dodawania własnych
// zmienna curTransform zawiera transformację, kształtów do świata 3D, poznamy szczegóły do-
// którą mieliśmy wcześniej, chcemy do niej dodać nowe obroty tyczące działania oświetlenia oraz mechanizm
rotTransform.rotX(Math.PI/100*Math.sin(x)); nakładania tekstur na obiekty 3D.
// ustawiamy newTransform na złożenie transformacji aktualnej i obrotu
newTransform.mul(curTransform, rotTransform); �

// ustalamy obrót w rotTransform - w osi y


rotTransform.rotY(Math.PI/100*Math.cos(x));
// ustawiamy new transform na złożenie siebie samego z rotTransform
newTransform.mul(rotTransform); �

// ustalamy obrót w rotTransform - w osi z


rotTransform.rotZ(-Math.PI/100*Math.sin(x));
// ustawiamy new transform na złożenie siebie samego z rotTransform �
newTransform.mul(rotTransform);
Rysunek 3. Układ współrzędnych w Javie 3D

64 01/2009
Świat 3D w Javie

Najważniejsze klasy By zrozumieć działanie poszczególnych ko- Na początek rozważmy ścianę dolną, czy-
Podstawowe obiekty, które wykorzystywać bę- lorów (oraz wykorzystać dotychczas zdoby- li czerwoną. Po uruchomieniu programu
dziemy w tym programie, to: tą wiedzę w praktyce) sugeruję stworzyć sce- można zauważyć, że widoczna jest ona tyl-
nę 3D, w której znalazłaby się kula (Sphere- ko wtedy, kiedy patrzy się od środka sze-
• Appearance – obiekt-kontener, zawiera- 3D) oraz umiejscowione nad nią źródło świa- ścianu. Nie jest to przypadkowe zachowa-
jący wszystkie ustawienia związane z wy- tła, po czym poeksperymentować z różnymi nie. Każdy polygon posiada nie tylko zdefi-
glądem danego obiektu, począwszy od ko- materiałami. niowane położenie, ale ma także swoją stro-
loru, przez sposób renderowania, aż po nę, czyli kierunek, z którego jest widocz-
przezroczystość. Sześcian ny. Po szczegóły definiowania kierunków
• Shape3D – podstawowa klasa opisują- Każda ze ścian sześcianu z programu J3DRo- odsyłam do dokumentacji, dodam jednak,
ca obiekt 3D. By pojawić się na ekranie, tatingCube demonstruje oddzielne zagad- że są dwie metody na sprawienie, by poly-
musi posiadać swoją geometrię (Geome- nienie. Każda z nich tworzona jest jednak w gon był widoczny z obu stron. Po pierw-
try), zaś jeśli chcemy, by pojawiała się ten sam sposób – poprzez ustalenie w obiek- sze, można utworzyć drugi trójkąt, który bę-
w formie innej niż czarne plamy, musi cie QuadArray wierzchołków opisujących po- dzie skierowany w przeciwnym kierunku.
także posiadać swój wygląd (Appearan- wierzchnię. Wykorzystuje się do tego metodę Po drugie, do wyglądu (klasa Appearance)
ce). setCoordinate(int index, Point3f). obiektu 3D można przypisać obiekt
• Geometry - klasa definiująca wierzchołki
w przestrzeni 3D, a co za nimi idzie, poly-
gony, a także ich normalne (wektory defi-
niujące zorientowanie polygonu, potrzeb-
ne do obliczania wpływu oświetlenia), ko-
lory dla wierzchołków oraz współrzędne
dla tekstur.
Istnieje wiele klas rozszerzających Geo-
metry, zaś każda z nich ma właściwy dla
siebie sposób zastosowania. W J3DRo-
tatingCube wykorzystywana jest kla-
sa QuadArray. W jej konstruktorze spe-
cyfikujemy, jakie informacje będzie za-
wierać – jest to ważne, gdyż brak odpo-
wiedniej flagi będzie powodował rzuce-
nie wyjątku przy próbie zapisu związa-
nej z nią informacji.
• Material – opisuje właściwości świetlne
powierzchni, musi być przypisana do kla-
sy Appearance. Materiał opisywany jest
przez:
• EmmisiveColor - kolor, który jest emi-
towany przez obiekt,
• AmbientColor – kolor, który jest emi-
towany przy oświetleniu światłem ty-
pu Ambient,
• DiffuseColor – kolor kierunkowo
oświetlonej części obiektu,
• SpecularColor – kolor efektu odbi-
cia światła od kierunkowo oświetlone-
go obiektu,
• Shininess – liczba określająca roz-
miar odbłysku SpecularColor, Rysunek 4. Sześcian 3D – widok okna programu J3DRotatingCube

Listing 4. Definiowanie świateł

// tworzymy światło - kierunkowe, świecące od góry


DirectionalLight sunlikeLight = new DirectionalLight(new Color3f(Color.RED), new Vector3f(0,-1,0));
sunlikeLight.setInfluencingBounds(new BoundingSphere());

// tworzymy światło - kierunkowe, świecące z lewej


DirectionalLight blueSideLight = new DirectionalLight(new Color3f(Color.BLUE), new Vector3f(1,0,0));
blueSideLight.setInfluencingBounds(new BoundingSphere());

// tworzymy światło - kierunkowe, świecące z tyłu


DirectionalLight greenBackLight = new DirectionalLight(new Color3f(Color.GREEN), new Vector3f(0,0,1));
greenBackLight.setInfluencingBounds(new BoundingSphere());

www.sdjournal.org 65
Warsztaty

PolygonAttributes z ustawionym CullFace zmieniają? Otóż kolor ściany lewej będzie zale- Appearance dodajemy do Shape3D. Trzeba pa-
na PolygonAttributes.CULL_NONE. Warto żeć od światła na nią padającego! Przyjrzyjmy miętać o tym, że nie wszystkie systemy obsłu-
jednak zauważyć, że większość obiektów 3D się definicji świateł w naszej scenie (Listing 4) gują tekstury o dowolnych wymiarach – war-
to obiekty zamknięte, wobec czego brak wi- Widzimy trzy światła kierunkowe: padające to więc, dla bezpieczeństwa, upewniać się, by
doczności od środka wcale nie jest proble- z góry czerwone, z lewej niebieskie, oraz z ty- tworzone tekstury miały wymiary boków będą-
mem, wręcz przeciwnie! Wyobraźmy sobie łu zielone. Kierunek propagacji określony jest ce dowolną potęgą 2 (64, 128, 512, etc.). Wy-
kamerę umiejscowioną w głowie renderowa- przez wektor podany w konstruktorze świa- miary boków nie muszą być równe (np. 128 x
nej postaci 3D – widzielibyśmy wówczas, tła. Przykładowy kierunek normalnej i pada- 512 także jest dozwolonym rozmiarem).
zamiast świata, wnętrze głowy. Widok nie- nia światła pokazuje ilustracja 5. Kąt φ określa Po drugie, należy przypisać każdemu wierz-
zbyt przydatny w grze. wpływ światła na kolor, dla φ=0 jest on mak- chołkowi w geometrii, która ma być teksturo-
Kolorowanie polygonów także może od- symalny, dla φ>PI/2 (90O) jest zerowy (po- wana, współrzędne tekstury. Pokazuje to Rysu-
bywać się na kilka sposobów. Istnieje obiekt wierzchnia nie jest oświetlona wcale). W na- nek 6. Dla każdego punktu w świecie 3D przy-
ColoringAttributes, w którym można usta- szym przykładzie mamy ścianę widoczną z porządkowujemy punkt 2D z zakresu 0 - 1. W
wić kolor, a następnie przypisać go do obiek- obu stron, ale z uwagi na jedną normalną, bę- naszym przypadku rozwiązanie jest dość oczy-
tu Appearance związanego z danym kształ- dzie oświetla tylko wtedy, gdy będzie skiero- wiste, po prostu lewy górny róg ściany to punkt
tem (Shape3D). Można także przydzielić ko- wana jedną stroną do światła. By uniknąć te- (0, 1) na teksturze. Problem pojawia się dopie-
lor do konkretnego wierzchołka, co zrobio- go problemu, należy w PolygonAttributes ro w przypadku niepłaskich obiektów 3D, jak
ne jest na ścianie górnej. Trzeba pamiętać, przypisanych do danego Apparance i Shape- np. kula – tym jednak na razie przejmować się
że funkcja wyznaczania koloru dla dane- 3D ustawić setBackFaceNormalFlip(true) nie będziemy.
go miejsca w polygonie jest w pełni mody- . Wówczas powierzchnia będzie oświetlana z Dodatkowo, dla ściany tylnej ustawiliśmy
fikowalna, może zależeć od światła, tekstu- obu stron. normalne, dzięki czemu będzie ona mogła być
ry, koloru wierzchołka i koloru ustawionego Przyjrzyjmy się teraz ścianie tylnej. Widzimy, oświetlana przez światła dodane do sceny. Nie
w ColoringAttributes. Słowem, może być że jej powierzchnia jest nieregularna – jest tak, jest to jednak jedyne, co trzeba zrobić. Niezbęd-
dość skomplikowana. ponieważ ściana ta pokryta jest teksturą. By na- ny jest także wybór metody obliczania wartości
Wróćmy jednak do ściany górnej. Jej wy- łożyć mapę bitową na powierzchnię, należy wy- koloru dla oświetlanej tekstury. Robi się to po-
gląd został zdefiniowany poprzez przypisa- konać kilka kroków. przez obiekt TextureAttributes przypisany
nie kolorów do wierzchołków, a by to zrobić, Po pierwsze, trzeba wczytać obrazek (do do Appearance. Wywołujemy na nim meto-
do konstruktora QuadArray dodaliśmy flagę BufferedImage), po czym przypisać go do dę setTextureMode(int mode). Po listę i opi-
GeometryArray.COLOR_3, po czym przypisali- obiektu Texture2D. Po szczegóły dotyczące tej sy metod teksturowania odsyłam do dokumen-
śmy kolory za pomocą metody setColor(int klasy odsyłam do dokumentacji J3D. Utwo- tacji J3D, gdyż jest ich naprawdę wiele; można
index, Color3f color). Sposób oblicza- rzoną w ten sposób teksturę poprzez obiekt nawet zdefiniować swoją własną.
nia koloru dla konkretnego miejsca na po-
lygonie definiuje shadeModel w obiekcie
ColoringAttributes, w naszym przypad-
ku ma wartość SHADE_GOURAUD. Ściana górna
jest widoczna z obu stron dzięki ustawieniu
PolygonAttributes.CULL_NONE.
Ściana lewa zaś jest... po prostu biała. Tyle że
ma zdefiniowane normalne – są to, w teorii,
wektory prostopadłe do powierzchni. Cóż one

����

Rysunek 5. Wektory: normalna powierzchni i


padające światło

�����

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


Rysunek 6. Współrzędne tekstur w Javie 3D Rysunek 7. Wirujący układ słoneczny – widok okna J3DSolarSystem

66 01/2009
Świat 3D w Javie

Przy temacie teksturowania warto jeszcze MouseTranslate, które pozwalają na zmienia- postępować dydaktycznie. Nie jest to bardzo
wspomnieć o dwóch metodach klasy Texture: nie skali transformacji oraz położenia kamery. długi czas.
setMagFilter i setMinFilter. Definiują one Warto też pamiętać, o możliwości pobrania z Prawdopodobnie wielu z Was zastanawia
sposób wyznaczania wartości koloru rende- SimpleUniverse TransformGroupy związanej się, czy Java 3D nadaje się do pisania gier. Mo-
rowanej powierzchni, jeśli na 1 piksel obraz- z kamerą – wówczas, zamiast obracać światem, im zdaniem odpowiedź brzmi: tak. Osiągnię-
ka przypada więcej niż 1 piksel powierzchni możemy obracać głową. cie wydajności porównywalnej z językami z ro-
(magFilter), lub na 1 piksel obrazka przypa- Przejdźmy teraz do rosnącej, czerwo- dziny C jest raczej niemożliwe, wirtualna ma-
da mniej niż 1 piksel powierzchni (minFil- nej, przezroczystej sfery, która pojawia się w szyna ma swoje obciążenia, jednak jestem w
ter). Jeśli dysponujemy mocną maszyną, war- J3DSolarSystem. Jest to obiekt typu Sphere, stanie sobie wyobrazić dynamicznego shoote-
to ustawić oba filtry na NICEST. Powierzch- z ustawionymi parametrami przezroczystości ra 3D, działającego płynnie na współczesnych
nie pokryte takimi teksturami staną się dużo – czyli TransparencyAttributes przypisany- komputerach, napisanego z wykorzystaniem
ładniejsze. mi do Appearance. Podobnie jak w przypadku Javy 3D. Sęk w tym, że żadna większa firma ta-
wyboru metody obliczania koloru, przy inicjo- kiego dzieła się nie podejmie – głównie dlate-
Wirowanie waniu przezroczystości trzeba dokonać podob- go, że nie ma to sensu. Istnieją dużo wydajniej-
Oprócz tworzenia i konfigurowania zawartości nego wyboru. Parametry, które ja podałem w sze i zapewne prostsze w użyciu platformy pro-
sceny, bardzo ważnym elementem programu konstruktorze TransparencyAttributes są gramistyczne.
jest też dynamiczna jej modyfikacja. W J3DRo- dość uniwersalne i powinny działać na więk- Ewentualną komercyjną przyszłość Javy
tatingCube widzimy przykład zmiany orienta- szości systemów – zachęcam jednak do zapo- 3D widzę raczej w zaadaptowaniu biblioteki
cji obiektu – wirowanie. Jak tego dokonać? Naj- znania się z dokumentacją tej klasy i ekspery- na potrzeby gier na komórki, w których plat-
pierw należy cały obiekt, którego położenie ma- mentowania, można uzyskać naprawdę cieka- forma Java jest wszak bardzo popularna. Lecz
my zmieniać, podpiąć do obiektu Transform- we efekty. czy producenci telefonów zaczną na poważnie
Group, któremu z kolei trzeba nadać właściwo- Sugeruję dokładnie przeanalizować kod pro- rozwijać sprzęt w kierunku grafiki 3D? Czy
ści umożliwiające tę zmianę. Są to tzw. Capabi- gramu J3DSolarSystem, gdyż stanowi on swe- pojawią się proste akceleratory, np. na pozio-
lities, których zastosowanie demonstruje frag- go rodzaju zestawienie wszystkiego, co zostało mie pierwszego 3DFX? Na te pytania odpo-
ment kodu w Listingu 5. przedstawione w tym artykule. wiedzi nie znam. Ale wydaje mi się, że brzmi
By móc odczytywać/zmieniać dowolny ona tak.
parametr dowolnego obiektu dziedziczące- Podsumowanie
go po SceneGraphObject (nadrzędnej kla- Mam nadzieję, iż przekonałem Was, że Java
sy dla wszystkich obiektów znajdujących się 3D jest potężnym i zarazem łatwym w uży- DARIUSZ WAWER
w drzewie świata 3D), należy nadać mu od- ciu narzędziem. Przygotowanie zaprezento- Student 4 roku Telekomunikacji na Politechnice
powiednie uprawnienia. Robi się to poprzez wanych tu programów zajęło mi może 6 go- Warszawskiej. Java Developer w firmie CC Otwarte
metodę setCapability – w naszym przy- dzin, przy czym starałem się robić to porząd- Systemy Komputerowe.
padku zezwalamy na zapisywanie transfor- nie, pisać wyczerpujące komentarze, słowem, Kontakt z autorem: dariusz.wawer@cc.com.pl
macji do grupy, która odpowiada za obraca-
nie sześcianu. W ramach nauki analizę meto-
dy run() zajmującej się obracaniem sześcia-
W Sieci
nu pozostawiam czytelnikowi – wszelkie in- • https://java3d.dev.java.net/ – oficjalna strona projektu
formacje dotyczące wykorzystywanych klas • http://download.java.net/media/java3d/javadoc/1.5.0/index.html – dokumentacja
zostały już podane. • http://www.j3d.org/ – portal społeczności Java 3D
• http://pl.wikipedia.org/wiki/Grafika_3d – podstawowe informacje o grafice 3D
• http://pl.wikipedia.org/wiki/Mnożenie_macierzy – mnożenie macierzy, przydatne przy do zro-
Program 3 – J3DSolarSystem zumienia działania Transform3D
– Wszechświat w Javie 3D
Program ten demonstruje wykorzystanie
wszystkich poznanych dotychczas funkcjonal-
ności oraz wprowadza kilka nowych: obracanie Listing 5. Nadawanie uprawnień (Capabilities) do zapisywania i odczytywania transformacji
kamery oraz przezroczystość. Widok okna pro-
gramu prezentuje Rysunek 7. // tworzymy grupę, w której będziemy zmieniać transformację, odpowiedzialną za
Klasą użytą w tym programie, która powin- obracanie
na wzbudzić największe zainteresowanie, jest rotateTransformGroup = new TransformGroup();
MouseRotate. Po dodaniu do sceny oraz wska-
zaniu odpowiedniej TransformGroupy, po- // pozwalamy na zapisywanie transformacji
zwala ona na sterowanie jej transformacją po- rotateTransformGroup.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE);
przez przeciąganie myszą po odpowiednim
obiekcie Canvas3D. Listing 6 przedstawia frag- // pozwalamy na odczytywanie transformacji
ment kodu pokazujący tworzenie i konfigura- rotateTransformGroup.setCapability( TransformGroup.ALLOW_TRANSFORM_READ);
cję tej klasy.
Dodawanie tego obiektu jest bardzo proste i Listing 6. Wykorzystanie klasy MouseRotate
zarazem wydajne – sterowanie transformacją TransformGroup rotGr = new TransformGroup();
tą metodą jest szybsze niż samodzielne łapanie // dodajemy obiekt Behaviour z j3d pozwalający na obracanie sceny
eventów MouseListenerem, dokonywanie obli- MouseRotate wholeSceneMouseRotator = new MouseRotate();
czeń i aplikowanie ich w TransformGroupie. // ustawiamy grupę, której transformację ma modyfikować
Wiem, bo sprawdzałem. wholeSceneMouseRotator.setTransformGroup(rotGr);
Oprócz MouseRotate warto także zapoznać wholeSceneMouseRotator.setSchedulingBounds(new BoundingSphere());
się z klasami MouseZoom, MouseWheelZoom oraz

www.sdjournal.org 67
Warsztaty

Pozycjonowanie stron
Skuteczny marketing internetowy w wyszukiwarkach

Pozycjonowanie stron internetowych to wyprowadzenie serwisu


internetowego na pierwsze pozycje w wyszukiwarkach internetowych.
Przede wszystkim Google, z uwagi na bezkonkurencyjny udział
w rynku polskim ok. 92%.

ne są za nieodpowiednie – gra nie warta świeczki.


Dowiesz się: Można również samemu zająć się procesem pozy-
• Czym jest pozycjonowanie w Google; cjonowania, jest to jednak bardzo czasochłonne.
• Jak zwiększyć zarobki z serwisu internetowego; Ostatnią opcją jest inwestycja w oprogramowa-
• W jaki sposób wypromować firmę. nie (koszt kilkaset złotych), które znacznie upro-
ści i skróci czas pracy, potrzebny na pomyślne wy-
pozycjonowanie witryny.
sprzedaży produktów i usług oraz wypromowa-
nia marki; posiadacze serwisów, w celu zwięk- Czas pozycjonowania
Poziom trudności szenia zysków z reklamy, uzyskania popular- Proces pozycjonowania to zabieg długotermi-
ności i wyższej oglądalności; webmasterzy, aby nowy, wymaga czasu. Obecnie, roboty Go-
tworzyć strony w oparciu o techniki pozycjono- ogle przeszukują miliardy stron interneto-
wania dające już od samego początku przewa- wych pod kątem użytecznych informacji. Do-

N
adrzędnym celem jest, aby internau- gę konkurencyjną – powinni zainteresować się tarcie do nowego serwisu zajmuje im najczę-
ci wpisujący określone słowa kluczo- techniką pozycjonowania. ściej od kilku dni do kilku tygodni. Dopiero
we w oknie wyszukiwarki, odnajdywa- po tym czasie, nowa witryna uzyskuje odpo-
li dany serwis na czołowych pozycjach w wyni- Niskie koszty reklamy wiednią pozycję w wynikach wyszukania. Po-
kach zapytania. Przykładowo, wpisując frazę wia- Internet jako stosunkowo nowe medium komu- czątkowo, pozycje mogą być odległe. Wypro-
domości sport w wyszukiwarce, Google wskaże 10 nikacji i marketingu, pozwalające na nieporów- mowanie serwisu do czołowych pozycji naj-
wyników. Naturalnie pierwszy serwis będzie oglą- nywalnie niższe koszty, z każdym miesiącem częściej trwa od 3 do 6 miesięcy. Szybkość i
dany najczęściej. Pozostałe strony będą cieszyły się zdobywa coraz większą przewagę nad tradycyj- skuteczność samego pozycjonowania jest za-
znacznie mniejszą liczbą odwiedzin. ną formą reklamy w radiu, telewizji, czy prasie. leżna od bardzo wielu czynników (niestety
Mimo to, cena zakupu odpowiedniego bilbor- algorytm Google jest tajny i jedynie doświad-
Po co? du reklamowego lub mailingu w dużym porta- czenia pozwalają wyróżnić cechy serwisu,
Czy jest sens inwestować swój czas i pieniądze w lu internetowym wiąże się z wysokimi wydatka- które wpływają na podwyższenie pozycji).
pozycjonowanie? Oczywiście, że jest! Pozycjono- mi, sięgającymi nawet 100 tys. zł/ dobę. Tego ty- Wynik w wyszukiwarce jest zależny m.in.: od
wanie to obecnie jedna z najtańszych i przy tym pu reklamy najczęściej dają od kilkuset do kilku- wieku domeny, od budowy i treści strony, od
najskuteczniejszych form reklamy. Niewielkim dziesięciu tysięcy wejść w ciągu 24 godzin. Nale- popularności, od konkurencji (jak się promu-
nakładem finansowym można zdobywać tysiące ży zadać tutaj pytanie, czy warto ponosić wydat- je, od jakiego czasu), czy ilości stron o podob-
klientów każdego dnia. Serwis dopracowany funk- ki na taką formę promocji? Czy koszt się zwróci nej tematyce.
cjonalnie, z przepiękną grafiką i animacjami może i przyniesie zysk? Tym bardziej, że istnieje możli-
przynosić zerowe korzyści, podczas gdy prosta, lecz wość darmowego uzyskania masy wejść potencjal- Pozycjonowanie – dwa etapy
dobrze wypromowana w Google strona, będzie nych klientów, poprzez posiadanie pozycji w czo- Wypromowanie serwisu techniką pozycjono-
przynosić zyski ze sprzedaży produktów i usług. łówce wyników wyszukiwania Google dla wybra- wania wymaga realizacji dwóch zadań: jed-
Na przykład firma zajmująca się wykańczaniem nych słów kluczowych. Wypromowanie serwi- norazowej optymalizacji strony, czyli odpo-
wnętrz, przez długi czas, w wyszukiwarce pod ha- su może kosztować znacznie mniej lub nie kosz- wiedniego dopasowania kodu i treści oraz
słem wystrój wnętrz, zajmowała pozycje w granicach tować w ogóle. Alternatywy są trzy. Można zle- ciągłego, regularnego linkowania, czyli zdo-
50-70. Obecnie, firma zajmuje miejsce w czołówce cić zadanie firmom profesjonalnie zajmującym bywania linków prowadzących do danego
wyników wyszukiwania, zwiększając tym samym się pozycjonowaniem. W takim przypadku nale- serwisu.
liczbę zamówień z 5 do nawet 25 dziennie! ży liczyć się z kosztami rzędu 400-3000 zł. mie-
sięcznie za wypromowanie i utrzymanie pozycji.
Dla kogo Wszelkie oferty z niskimi cenami i gwarancjami
W Sieci
Niewiele jest osób, których pozycjonowanie nie pozycji, niosą ryzyko zbanowania, usunięcia ser- • www.seoadder.info
dotyczy. Właściciele firm w celu zwiększenia wisu z Google z uwagi na działania, które uznawa-

68 01/2009
Pozycjonowanie stron

Optymalizacja Analiza serwisu gając gwałtowne, skokowe pojawienie się wielu


Poprzez tworzenie strony w określonych stan- W celu uzyskania konkretnych, szczegóło- linków może uznać stronę za sztucznie promo-
dardach można uzyskiwać wyższe pozycje. Na- wych informacji na temat możliwości popra- waną i usunąć ją całkowicie z wyszukiwarki.
leży stosować właściwą budowę, składnię w ję- wy / dopracowania strony, tak aby uzyskiwa-
zyku HTML. ła wyższe pozycje w wynikach Google, można Zaplecze
Odpowiednie nasycenie stron treścią wraz zlecić analizę serwisu. Firmą profesjonalnie i Osoby zajmujące się pozycjonowaniem two-
ze słowami kluczowymi ma ogromne znacze- kompleksowo zajmująca się tematem, jest fir- rzą zaplecze, czyli setki stron, na których ma-
nie. Optymalizację można podzielić na dwa ma Enterso - lider na polskim rynku. Po reali- ją później możliwość umieszczania linków. Są
etapy zacji w 48 godzin, klient otrzyma raport w po- to przykładowo katalogi stron internetowych,
staci PFD. Cena usługi względem innych firm w których umieszcza się odnośniki wraz z krót-
• Treść – wybór słów kluczowych, na które pozycjonujących jest stosunkowo niska, i mie- kim opisem serwisu w odpowiednich katego-
chcemy wypromować serwis i ich umiesz- ści się w granicach 100zł. Zamówienie moż- riach tematycznych. Drugim typem zaplecza są
czenie w kodzie i treści; stworzenie wielu na zrealizować poprzez stronę www.seoad- tzw. precle, czyli katalogi z różnymi artykułami
podstron z materiałami z zakresu działal- der.info. – także podzielone na kategorie.
ności. Linki można umieszczać ręcznie na tego typu
Linkowanie stronach. Czynność wymaga jednak poświęcenia
Przykładowo, można wykonać wstawie- Drugim wartym uwagi zabiegiem pozycjono- około 30-50 minut dziennie dla jednego serwi-
nie słów kluczowych w atrybucie title w wania jest linkowanie, czyli zdobywanie lin- su; co daje nam rocznie 240 godzin monotonnej,
linkach do podstron: ków prowadzących do danej strony. Proces żmudnej pracy. Rozwiązaniem problemu i nie-
polega na umieszczaniu w innych serwisach odzowną pomocą, może być odpowiednie opro-
<a href=”kup _ teraz.html” odnośników bezpłatnie, za pobraniem opłaty gramowanie. Dlatego dalsza część artykułu, zosta-
title=”Wycieczka kanary”>kup lub na zasadach wymiany. nie poświęcona szczegółowemu jego omówieniu.
teraz</a> Roboty Google odnotowując, że do witry-
ny prowadzi wiele linków i liczba ich stale ro- System Adder
Inną metodą nasycenia kodu jest umiesz- śnie, podnoszą wartość serwisu pokazując go Jest to program, który sam, w pełni automa-
czanie słów kluczowych w atrybucie alt na wyższych pozycjach wyników wyszukania tycznie pozycjonuje serwis, zdobywając regu-
dla obrazków: dla konkretnych słów kluczowych. larnie linki dla strony. System Adder jest in-
stalowany na serwerze i za pomocą modułu
<img src=”obrazek.jpg” alt=”Sprzęt Gdzie można umieścić link? CRON, uruchamia się o wybranych godzinach,
komputerowy”> Najlepszym miejscem na link jest serwis o po- dodając określoną ilość linków do katalogów
dobnej tematyce do strony, którą chcemy wy- (qlweb, cncat, mini), precli (wordpress, moc-
• Kod – poprawienie budowy HTML i CSS promować. Można poprosić o płatny link na ta- nelinki). Potrafi on także rejestrować się na fo-
uwzględniając techniki, które pozwalają kiej witrynie – trzeba liczyć się jednak z kosz- rach phpBB, umieszczając w profilu link. Posia-
robotom Google szybciej odnaleźć treść i tami rzędu 350zł za rok. Odnośników powin- da obsługę pingowania – czyli zgłaszania serwi-
wskazywać ich wysoką wartość. no być wiele, 1-5 może nie wystarczyć. Ważne su do odpowiednich serwerów, przyspieszając
jest, aby zdobywać je regularnie. Robot dostrze- tym samym indeksowanie stron w Google.
Przykładowo, może być to użycie mod _
rewrite do skracania linków w serwisie.
Polega to na utworzeniu pliku .htaccess, w
którym definiuje się, jaki link odpowiada
jakiemu adresowi. Np.

zamiast:

www.przyklad.pl/index.php?art=648&page-
=2&log=1

można dać adres zawierający słowa kluczowe:

www.przykład.pl/telewizory_lcd_2.html

Ważne, aby w serwisie znajdowała się ma-


pa linków i wszystkie podstrony były dostęp-
ne po maksymalnie 2-3 kliknięciach. Dzięki
temu roboty Google szybciej odnajdą pełną
treść serwisu, a poszczególne strony będą wi-
doczne w wynikach zapytania.
Kolejnym sposobem na zwiększenie atrak-
cyjności serwisu dla Google jest wyczyszcze-
nie kodu. Należy wszystkie fragmenty ko-
du CSS, JavaScript, komentarze usunąć lub
przenieść do plików zewnętrznych. Wówczas
witryna będzie posiadała więcej treści wzglę-
dem kodu. Rysunek 1. Google - miejsce na Twój serwis

www.sdjournal.org 69
Warsztaty

Dla kogo? • Potrzebne moduły to cURL, IonCube, dawanych na dzień, poprzez inkrementację mie-
Program jest niezastąpioną pomocą zarówno dla CRON; sięczną można w sposób łagodny przyspieszać
specjalistów z branży, jak i kompletnych laików, • Większość hostignów płatnych spełnia po- promocję witryny.
zupełnie nieznających tematu. System Adder wyższe wymagania, jednak w celu upew- Zakładka 2. ustawienia wspólne. Definiujemy
zastępuje człowieka w codziennej monotonnej nienia się czy serwer jest odpowiedni, w niej, do jakich kategorii zalicza się dana stro-
pracy sprawnym i skutecznym działaniem. Jest można uruchomić plik testowy dostęp- na. Należy wypisać w tym polu wiele pasują-
to produkt dla właścicieli firm, posiadaczy ser- ny pod adresem www.seoadder.info/lib/ cych nazw kategorii. Program podczas dodawa-
wisów, webmasterów i pozycjonerów. test.zip; nia musi odnaleźć pasującą nazwę w każdym
Szacuje się, że z programu Adder korzysta • Rozpakowany plik umieścić na FTP i uru- katalogu. Wskazanie jest dopisanie na końcu #i
ponad 100 tys. stron w Polsce, pomimo faktu, chomić z przeglądarki. nne#pozostałe#inny#other#others#a#b, po-
że technika marketingu internetowego w Pol- nieważ w przypadku kiedy zabraknie kategorii
sce dopiero raczkuje. Przystępując do instalacji należy włączyć in- Adder, doda wpis do działu np. inne, nie tracąc
Warto zacząć pozycjonować serwis jak naj- strukcję install.html dostępną w katalogu Ad- przy tym miejsca na kolejny link.
szybciej, teraz, dziś, ponieważ takie działanie dera. Do uruchomienia programu potrzebne Zakładka 3. Qlweb, CnCat, Mini odpowia-
daje cenną przewagę nad konkurencją. Należy będzie, wgranie plików na serwer FTP, stwo- da za formę linków dodawanych do katalogów.
przy tym pamiętać, że jest to proces długotrwa- rzenie nowej pustej bazy MySQL na koncie Najważniejszym polem jest tytuł, ponieważ to
ły, i dopiero z czasem, strona zyskuje wysokie hostingowym, uruchomienie z poziomu prze- on będzie odnośnikiem do strony przekazują-
pozycje w Google. glądarki instalacji oraz na koniec zdefiniowa- cym słowa kluczowe. Należy podać w tym po-
Program Adder to innowacyjny system, sta- nie modułu CRON. Od momentu zakończe- lu kilka najważniejszych fraz, zalecane jest od-
nowiący jak najbardziej uzasadniony zakup dla nia instalacji dostęp do programu będzie moż- dzielenie znakiem # i użycie trybu losowego.
oszczędności czasu i uniknięcia wysokich kosz- liwy poprzez zalogowanie się na stronie www, Zakładka 4. Mocne Linki, Word Press wymaga
tów związanych ze współpracą z firmami po- wystarczy więc dostęp do internetu z dowol- poświęcenia najwięcej czasu, gdyż w tym miej-
zycjonującymi. nego miejsca na świecie. scu potrzebny będzie artykuł powiązany tema-
Licencja na oprogramowanie zgodnie z infor- tycznie z działalnością, której dotyczy strona.
macją dystrybutora jest dożywotnia, jest więc to Konfiguracja Nie powinna być to treść reklamowa. Przykła-
jednorazowa inwestycja w wieloletnie zyski. Za- Robot Adder działa całkowicie automatycznie, dowo, posiadając hurtownię baterii, należy na-
kup można zrealizować poprzez stronę www.se- jednak wymaga na początku zdefiniowania konfi- pisać ogólne informacje o bateriach a system
oadder.info guracji strony. Przed rozpoczęciem należy ustalić, Adder przemyci wewnątrz artykułu kilka lin-
na jakie słowa właściciel chce wypromować serwis. ków do strony, którą promuje. Jest to obecnie
Instalacja systemu Adder Zalecane są 2-3 frazy, ponieważ siła pozycjonowa- jedna z najlepszych technik na pozyskanie od-
Instalacja oprogramowania jest stosunkowo pro- nia zależy od ilości słów. Oczywiście można rów- nośników ze stron tematycznych.
sta, wymaga podstawowej wiedzy z zakresu in- nież promować poboczne frazy, jednak najlepiej Zakładka ostatnia 5. phpBB odpowiada za re-
formatyki. Instalację można zlecić firmie lub robić to już na konkretnych podstronach serwi- jestrację na forach dyskusyjnych.
przeprowadzić ją samemu w niespełna 15 mi- su poświęconych wybranej szczegółowo tematyce. Pełna konfiguracja wymaga około 45-60 mi-
nut. Podczas konfiguracji należy trzymać się wy- nut pracy, jednak Adder przez kolejne lata za-
pisanych wskazań, jest to bardzo ważne, aby oszczędzi setki godzin pracy. Warto jest dokład-
• Program jest napisany w języku PHP i wy- program działał maksymalnie skutecznie. nie zdefiniować promowaną stronę, aby w peł-
maga serwera hostingowego typu home.pl, W pierwszej zakładce ustawienia podstawowe ni wykorzystać potencjał programu.
nazwa.pl, cal.pl itp. System Adder może definiujemy najważniejsze informacje, takie jak Więcej na temat instalacji i konfiguracji systemu
być zainstalowany na innym serwerze niż adres pozycjonowanej strony, szybkość pozycjo- Adder na stronie z instrukcją – www.seoadder.com
promowana strona; nowania, czyli w tym wypadku ilość linków do-
Dla pozycjonerów
System Adder może być doskonałym narzę-
dziem wspomagającym promocję stron klien-
tów oraz skutecznym programem do pozycjono-
wania swojego zaplecza. Przyspiesza indeksację
stron zwiększając równocześnie siłę serwisu.

Dla właścicieli
Pozycjonowanie pomaga skutecznie wypromo-
wać serwis przyczyniając się do rozwoju firmy
poprzez napływ nowych, potencjalnych klien-
tów. Zalecane jest pozycjonowanie strony fir-
mowej w każdej branży w celu wypromowania
marki, wyprzedzenia konkurencji i maksyma-
lizacji zysków. Obecnie w Polsce jest 16 milio-
nów internautów i liczba ta stale rośnie.

WOJCIECH KŁODZIŃSKI
Od 10 lat specjalista IT ; programista; webmaster;
pozycjoner; realizator specjalistycznego oprogra-
mowania dla firm.
Rysunek 2. SEO Adder 6 - Panel zarządzania systemem Kontakt z autorem: W.Klodzinski@uku.pl

70 01/2009
Felieton

Najpierw zespół
P
orzekadło mówi, że trudności to okazje w przebraniu. Liderzy Wszyscy potrzebujemy być wysłuchani. Nawet minimalna ozna-
powinni je dostrzegać nawet w obliczu spowolnienia gospo- ka zainteresowania nami ze strony współpracownika sprawia, że
darczego. Kryzys może stworzyć niecodzienną okazję do pod- biuro robi się odrobinę przytulniejsze. Pozycja szefa jest w tym
reperowania wewnętrznego wizerunku firmy. względzie szczególna. Dla pracownika to on jest uosobieniem fir-
Bańka pękła. Przecena firm na światowych parkietach osiągnęła my. Jeżeli potrafimy dotrzeć do bezpośrednich przełożonych, być
status paniki. Trudno bowiem znaleźć racjonalne usprawiedliwienie przez nich wysłuchani i zrozumiani, to automatycznie mamy wraże-
dla dyskontów, gdzie kapitalizacja znajduje się poniżej wartości akty- nie, że cała firma nas rozumie. Lider musi być częścią zespołu rów-
wów. Wahania wskaźników typu z -18 w piątek na +11 w poniedzia- nież w wymiarze emocjonalnym. Musi pokazać, że wspiera pracow-
łek (S&P 500, 10/13 października), nacjonalizacje podmiotów sekto- nika nie tylko w sensie wykonawczym, ale również socjalnym, mię-
ra finansowego, a nawet bankructwo całych krajów nie pozostawiają dzyludzkim. Niewrażliwość na problemy współpracowników, igno-
wątpliwości: nadchodzą ciężkie czasy. rowanie pojawiających się wątpliwości, może stanowić istotne za-
Kryzys z 2001 roku dotknął najpierw IT. I chociaż kłopoty, których grożenie dla jedności zespołu.
doświadczamy dzisiaj, mają swoje źródło w instrumentach finanso- Od lidera oczekuje się, że poprowadzi zespół przez zawieruchę,
wych, to nie ulega wątpliwości, że ofiarą spowolnienia padnie rów- bo wie co należy robić. W czasie kryzysu lider nie może okazać
nież sektor high-tech (zwłaszcza jego części zależne od konsumen- zwątpienia, zawieść zaufania. Nie oznacza to oczywiście zwodze-
tów). Widać to wyraźnie na przykładzie telefonów komórkowych. nia, kreowania fałszywego obrazu sytuacji. Wręcz przeciwnie, je-
Prognozy wzrostu dla tego rynku na przyszły rok są już weryfikowa- go uczciwość może być najważniejszym spoiwem, które utrzyma
ne (oczywiście w dół). Ponieważ ograniczenie popytu zdecydowanie zespół wokół wyznaczonych celów. Szeroko pojęty profesjonalizm
wydłuży czas zwrotu wszelkich inwestycji (np. telefonów będzie się jest tu cechą krytyczną.
używać średnio 4, a nie 3 lata [1]), można oczekiwać redukcji wydat- Naglące terminy, klienci, złośliwość rzeczy martwych – wszystkie
ków na badania. Całkiem niedawno Sony Ericsson zwolnił ponad po- te elementy praktycy podejścia procesowego potrafią przewidywać,
łowę pracowników swojego największego centrum R&D [2]. śledzić i przeciwdziałać im pod postacią zarządzania ryzykiem. Mo-
Firmy dostarczające rozwiązania dla high-tech znajdą się zapew- że to nie wystarczyć w czasach kryzysu. Konieczne jest dostrzeganie
ne w nie lada opałach. Kasacje projektów, trudności w pozyskiwaniu aspektów znacznie subtelniejszych niż twarde umiejętności. Mowa tu
następnych, ostrożność klientów we wprowadzaniu nowych techno- o materii osobistej takiej jak świadomość i kontrola emocji, umiejęt-
logii, poszukiwanie rezerw wewnętrznych - będą prowadzić do za- ność przystosowania się, optymizm mimo niepowodzeń oraz znajdo-
ostrzenia kontroli kosztów i niejednokrotnie do tego co najgorsze - wanie motywacji do działania. Mowa tu również o umiejętnościach
redukcji zatrudnienia. Podobne czarne scenariusze będą testem sta- społecznych, jak empatia, budowanie i utrzymywanie więzi między-
bilności fundamentów organizacji. Gdy robi się gorąco, często podej- ludzkich, łagodzenie konfliktów. Takie potrzeby emocjonalne powin-
muje się decyzje niepopularne lub kontrowersyjne, podporządkowa- ny wpłynąć na wybór stylów, jakich używa lider (zob. [4]).
ne wyłącznie jednemu celowi - przeżyciu. A przecież to jak firma, jej Zdecydowanie potrzebny jest wizjoner, który uświadomi i ukierun-
zarząd i liderzy dotychczas traktowali swoich pracowników, zdecydu- kuje na cele. Ich osiąganie, pomimo otaczających trudności, powin-
je o wewnętrznym poparciu (lub jego braku) dla planowanych dzia- no być priorytetem. Lider musi być w tym przewodnikiem. Nie obę-
łań ratunkowych. dzie się również bez dozy afiliacji, która scali zespół na płaszczyźnie
Stres, jaki niesie za sobą niepewność jutra, będzie towarzyszyć socjalnej. Należy rozsądnie stosować za to metody oparte na osią-
przez cały okres kryzysu. Ponieważ mówimy tu o miesiącach spo- ganiu konsensu, ponieważ mogą sprawiać wrażenie, że lider nie ma
wolnienia, to uczucia rezygnacji, bezsilności a w końcu apatii bę- planu. Zdecydowanie przestrzegałbym jednak przed popadaniem w
dą się z czasem potęgować. Efektywność zespołów spadnie wtedy, dyktaturę. Jej toksyczne oddziaływanie może niekorzystnie odbić się
gdy wzmożony wysiłek będzie najbardziej potrzebny. Zamiast razem na i tak już zdemotywowanym zespole.
podjąć wyzwanie, załoga straci poczucie wspólnoty, celów osobi- Należy również pamiętać, o wrażeniu jakie lider (firma) pozosta-
stych i firmowych. Zapanują nastroje typu ten frajer mógłby już pójść wi po sobie, gdy sytuacja wróci do normy. Jeżeli odpowiednio nie za-
na dno (George W. Bush, zob. [3]). Rachunek błędów w zarządzaniu dbamy o pracowników w okresie kryzysu – stracimy ich na rzecz in-
ludźmi pogłębi niewesołą sytuacje firmy. nych pracodawców przy pierwszym ociepleniu.
Czy jest więc za późno? Czy w czasie kryzysu można odzyskać kredyt Zawirowania, jakich obecnie jesteśmy świadkami, spowodują, że
zaufania? Arogancją byłoby myśleć, że można go nakazać okólnikiem; wiele firm znajdzie się na zakręcie. W takich trudnościach, oprócz za-
desperacją zaś prosić o niego. Ale można (wreszcie) zacząć słuchać. grożeń, należy dostrzec szansę na poprawę wewnętrznego wizerun-
ku firmy i nastawienia pracowników do swojego pracodawcy. Odpo-
wiedzialność za to niekoniecznie spada na barki wyższego zarządu.
W Sieci Duże możliwości mają bezpośredni przełożeni. Jak te szanse wyko-
• [1] Handset makers face reversal of fortune, Andrew Parker, Paul Taylor rzystamy? Okaże się pewnie, kiedy indeksy pójdą w górę.
and Robin Harding, The Financial Times, 26 października 2008, http:// Artykuł wyraża prywatne poglądy autora, które niekoniecznie od-
www.ft.com/cms/s/0/308c803e-a393-11dd-942c-000077b07658.html?nc-
zwierciedlają stanowisko Silicon & Software Systems Ltd. (S3)
lick_check=1
• [2] Kryzys i masowe zwolnienia w Sony Ericsson, TwojePC, 30
września 2008, http://twojepc.pl/news17575.html
• [3] Kryzys określa na nowo naszych przywódców, Gideon Rach- ARKADIUSZ MERTA
man, The Financial Times, 14 października 2008, http://ft.onet.pl/ Autor od 10 lat zajmuje się zagadnieniami projektowania i realizacji oprogra-
10,15765,kryzys_określa_na_nowo_naszych_przywodcow,artykul.html
mowania. Aktualnie jest pracownikiem Silicon & Software Systems Polska za-
• [4] Naturalne przywództwo, Daniel Goleman, Richard Boyatzis, Annie
McKee, Jacek Santorski – Wydawnictwa Biznesowe, Warszawa 2002 trudnionym na stanowisku menadżera projektów.
Kontakt z autorem: arkadiusz.merta@s3group.com

www.sdjournal.org 71
Programowanie urzadzeń mobilnych

Programowanie
gier dla Symbian OS
Efekty specjalne

Niniejszy, ostatni artykuł z cyklu opisującego zagadnienia związane


z programowaniem gier dla Symbian OS, pokazuje jak zaimplementować
takie efekty specjalne jak wielokanałowy dźwięk oraz wibrację.
jest pod adresem http://www.forum.nokia.com/
Dowiesz się: Powinieneś wiedzieć: info/sw.nokia.com/id/7bbe94f9-119c-475e-942b-
• Jak dodać zaimplementować obsługę wielo- • Jak się programuje w języku C++; aa248d012544/S60_Platform_Sound_Mixer_
kanałowego dźwięku oraz wibracji w aplika- • W jaki sposób zbudowana jest bazowa wer- Example_v2_0.zip.html. Mikser softwarowy za-
cjach dla Symbian OS. sja LaserQuest, opisana w poprzednich odcin- prezentowany w niniejszym artykule opiera się
kach cyklu. właśnie na wspomnianym przykładzie.
Zanim przejdziemy do analizy kodu źródło-
wego gry, chciałbym zwrócić uwagę na pewien
nież dodatkowe efekty: w momencie niszcze- aspekt. Otóż opisując temat obsługi dźwię-
nia czujnika systemu alarmowego pojawiać się ku pod Symbian OS przyjąłem nieco inne po-
Poziom trudności będzie odpowiedni dźwięk oraz efekt wibracji. dejście niż w poprzednich odcinkach cyklu, w
których przedstawiałem dane zagadnienie od
Śpiewać każdy może... przysłowiowej podszewki. Opis szczegółów im-
...jak mówią słowa znanej i powszechnie lu- plementacji miksera dźwięku wykracza mocno

W
poprzedniej odsłonie cyklu pokaza- bianej piosenki. Prawda ta odnosi się również poza tematykę niniejszego cyklu i w zasadzie
łem jak doprowadzić eksperymen- do aplikacji działających pod kontrolą Sym- mogłoby stanowić temat na oddzielny tekst.
talny projekt LaserQuest do po- bian OS. Oczywiście – w tym przypadku sło- Dlatego też postanowiłem skupić się na funk-
staci przypominającej w miarę kompletną grę wo śpiewać należałoby zastąpić zwrotem odgry- cjonalnym opisie miksera (głównie w odniesie-
komputerową, opisując implementację takich wać klipy audio. Jednakże na głowy programi- niu do jego publicznego API) oraz na pokaza-
kluczowych mechanizmów jak obsługa ope- stów Symbian OS żądnych wysublimowanych niu jak można go wykorzystać w swoim wła-
racji na plikach czy formatowanie i wyświetla- efektów dźwiękowych, z miejsca wylany jest snym projekcie.
nie napisów. W niniejszym, ostatnim artyku- kubeł zimnej wody: do ich dyspozycji dostępny
le z cyklu traktującego o programowaniu gier jest jedynie jeden kanał dźwiękowy. W praktyce Mikser audio
pod Symbian OS skupię się na zaprezentowa- oznacza to, że sprzęt odpowiedzialny za genero- – przegląd możliwości
niu technik implementacji pozostałych, braku- wanie afektów akustycznych jest w stanie w da- Nasze rozważania rozpoczniemy od zapozna-
jących elementów LaserQuest, takich jak obsłu- nym momencie odegrać tylko pojedynczą ścież- nia się z możliwościami wspomnianego w po-
ga dźwięku oraz wibracji. kę dźwiękową. Mądre książki sugerują, aby w przednim podpunkcie softwarowego mikse-
takiej sytuacji skorzystać z tzw. softwarowego ra dźwięku. Jako, że mikser stanowi odrębny
Plan działania miksera audio, który potrafi złożyć kilka nie- komponent, który z powodzeniem można wy-
W dzisiejszych, niewątpliwie bardzo wyma- zależnych próbek dźwięku w jeden strumień. korzystać w innych projektach, więc jego ko-
gających czasach dla produktów walczących o I tutaj kolejna nieprzyjemna niespodzianka dy źródłowe umieściłem w oddzielnych pod-
przetrwanie na rynku ogólnie pojętej rozrywki – Symbian OS nie udostępnia takowego mik- katalogach: src/Mixer oraz inc/Mixer. Kluczo-
komputerowej, gra bez dźwięku jest bezdysku- sera w zestawie swoich standardowych udogod- wym komponentem przedstawianego rozwią-
syjnie towarem wybrakowanym. W tej sytuacji, nień. Wydawało by się, że sprawa jest pogrzeba- zania jest klasa CAudioMixer. Proponuję w tym
oczywistym jest że LaserQuest powinien ofero- na i pozostaje jedynie usiąść i... zaimplemento- miejscu zapoznać się z zawartością Listingu 1,
wać ciekawe efekty audio. W tym miejscu za- wać własny mikser (co w rzeczywistości nie jest na którym przedstawiona jest definicja wspo-
stanowimy się jak zaplanować dźwiękową war- aż takim trudnym zdaniem, jak by się mogło mnianej klasy.
stwę naszej gry. Plan jest następujący: dodamy wydawać). Na szczęście, okazuje się, że ktoś ta- To co w tej definicji interesuje nas najbar-
do LaserQuest dwa utwory muzyczne; pierw- ką pracę już za nas wykonał – wystarczy dobrze dziej, to publiczny interfejs. Prześledzimy teraz
szy z nich odgrywany będzie w widoku menu, poszukać. W miarę sensowną, referencyjną po kolei składniki tego interfejsu. Dwie pierw-
zaś drugi – w trakcie rozgrywki. W widoku me- wersję wspomnianego miksera dla telefonów sze metody: Pause() i Resume() służą do zarzą-
nu dodamy również efekt dźwiękowy pojawia- z rodziny Series 60 można znaleźć w przykła- dzania globalnym stanem miksera. Wywołanie
jący się w momencie przechodzenia pomiędzy dzie udostępnianym na łamach popularnego pierwszej z nich wprowadza mikser w stan pau-
opcjami. W trakcie rozgrywki dołączymy rów- serwisu Forum Nokia. Przykład ten dostępny zy (wszystkie kanały są zastopowane). Metoda

72 01/2009
Programowanie gier dla Symbian OS

Resume() restartuje mikser, co w praktyce obja-


wia się tym, że odgrywanie muzyki jest konty- Listing 1. Definicja klasy CAudioMixer
nuowane. Mikser zapamiętuje swój stan, więc class CAudioMixer : public CBase
po restarcie muzyka odgrywana jest od tego {
miejsca, w którym została spauzowana. public:
Kolejna para metod: Play() oraz Stop(), słu- static CAudioMixer* NewL();
żą do obsługi miksera na poziomie kanałów. Pre- ~CAudioMixer();
zentowany tutaj mikser obsługuje 16 wirtual- private:
nych kanałów. Innymi słowy – jest on w stanie CAudioMixer();
w czasie rzeczywistym przetwarzać jednocze- void ConstructL();
śnie 16 próbek muzycznych (tzw. sampli) i skła- public:
dać je w jeden wynikowy strumień audio, któ- void Pause();
ry jest odgrywany na wyjściowym urządzeniu. void Resume();
Dzięki temu łatwo jest uzyskać efekt nakładania void Play( const TSample& aSample,
się kilku dźwięków. Dla przykładu: w przypad- TInt aChannel,
ku LaserQuest na jednym kanale odtwarzana TInt aFrequency,
jest muzyka stanowiąca tło rozgrywki, zaś na ko- TInt aVolume = 256 );
lejnych odgrywane są efekty dźwiękowe sygnali- void Stop( TInt aChannel );
zujące poszczególne wydarzenia w grze. Przy po- void SetVolume( TInt aVolume );
mocy metody Play() można przekazać do mik- TInt Volume();
sera żądanie odegrania określonej próbki dźwię-
ku. W naszym przypadku próbka reprezentowa- private:
na jest przy pomocy typu TAudioSample. Defini- void SendCmd( TMixerCmd aCmd );
cję klasy opisującej ten typ opiszę w dalszej czę-
ści tego podpunktu. Obiekt typu TAudioSample private:
przekazywany jest jako pierwszy argument do TAudioShared iShared;
metody Play(). Drugi argument określa numer RThread iMixerThread;
kanału, na którym ma być odtworzona próbka. TSample iEmptySample;
W dalszej kolejności przekazujemy częstotliwość TBool iPaused;
z jaką próbka ma być odegrana (im wyższa war- };
tość tego argumentu, tym wyższy jest wynikowy
dźwięk). Na końcu podawana jest wartość okre- Listing 2. Definicja klasy TAudioSample
ślająca głośność odtwarzania próbki (maksymal- struct TAudioSample
na i zarazem domyślna wartość tego argumentu {
to 256). Uważni Czytelnicy zastanawiają się za- TAudioSample()
pewne w jaki sposób obsługiwane jest zapętlenie : iData( NULL )
próbek; oczywiście nasz mikser obsługuje tę po- {
żyteczną funkcjonalność – mechanizm ten bę- }
dzie opisany klika linijek dalej. Metoda Stop()
wyłącza odgrywanie dzwięku na kanale o zada- TAudioSample( TInt16* aData, TInt aLength )
nym numerze. Dwie ostatnie metody służą do : iData( aData )
kontrolowania globalnej głośności miksera. , iLength( aLength )
Kolejną kluczowym składnikiem opisywane- , iRepStart( 0 )
go rozwiązania jest struktura TAudioSample. De- , iRepEnd( 0 )
finicja tej klasy przedstawiona jest na Listingu 2. {
Struktura ta jest prostym opakowaniem na }
dane próbki dźwiękowej. Oprócz dwóch po-
mocniczych konstruktorów mamy tam odpo- TAudioSample( TInt16* aData,
wiednio wskaźnik do bufora z danymi prób- TInt aLength,
ki (iData), długość próbki (iLength) oraz TInt aRepStart,
dwa znaczniki zapętlenia próbki (iRepStart, TInt aRepEnd )
iRepEnd). Dwie wymienione na końcu skła- : iData( aData )
dowe są wykorzystywane przez mikser w ce- , iLength( aLength )
lu kontrolowana zapętlenia danego sampla. , iRepStart( aRepStart )
Działą to według następujących zasad: jeśli pę- , iRepEnd( aRepEnd )
tla nie jest zdefiniowana (składowa iRepEnd {
ma przypisaną wartość 0) to próbka jest od- }
grywana tylko raz. W innym przypadku, sam-
pel jest najpierw odgrywany od początku do TInt16* iData;
końca, po czym mikser odtwarza w pętli frag- TInt iLength;
ment opisany przez znaczniki iRepStart oraz TInt iRepStart;
iRepEnd. Praktyczny przykład zastosowania TInt iRepEnd;
tego mechanizmu pokazany będzie w dalszej };
części artykułu.

www.sdjournal.org 73
Programowanie urzadzeń mobilnych

Ostatnią, nieodzowną z punktu widze- na jest z funkcji jako obiekt TAudioSample. Trze- temu Symbian. Czytelników zainteresowanych
nia użytkownika-programisty, częścią nasze- ba w tym miejscu mocno podkreślić dość spo- szczegółami implementacji miksera zapraszam
go miksera jest klasa CWavLoader. Jak sugeruje re ograniczenie naszego miksera – jest on w sta- do przeanalizowania plików źródłowych klasy
nazwa tej klasy, odpowiada ona za wczytywanie nie obsłużyć tylko jeden format w postaci suro- CAudioMixerThread (AudioMixerThread.h i Au-
plików wav, zawierających dane audio. Prze- wych plików wav nagranych z częstotliwością 8 dioMixerThread.cpp). Pliki te dostępne są w pacz-
analizujmy publiczny interfejs tej klasy, przed- bitów w trybie monofonicznym. Podstawową ce dołączonej do niniejszego artykułu, dostępnej
stawiony na Listingu 3. zaletą wypływającą z takiego ograniczenia jest tradycyjnie na witrynie SDJ. Lwią część wspo-
Wspomniany interfejs jest maksymalnie przenośność: możemy być niemalże pewni, że mnianej implementacji stanowi obsługa tworze-
uproszczony. Oprócz standardowych mecha- nasz mikser będzie obsługiwany przez wszystkie nia nowego wątku oraz komunikacji międzypro-
nizmów związanych z dwufazową konstrukcją urządzenia z rodziny Series 60. cesowej. Kluczowa funkcjonalność miksera (tj.
obiektu, mamy do dyspozycji w zasadzie jed- Pozostałe, pominięte w powyższym opi- miksowanie dźwięku) zawiera się w metodzie
ną metodę: LoadL(), która alokuje odpowied- sie pliki źródłowe miksera stanowią jego we- CaudioMixerThread::FillBufferL(). Warto
nią ilość pamięci potrzebną do przechowywania wnętrzną implementację. Pisząc w dużym skró- też zwrócić uwagę na metody odziedziczone z
danych próbki po czym wczytuje je z pliku o na- cie – ze względów wydajnościowych mikser za- interfejsu MMdaAudioOutputStreamCallback; w
zwie przekazanej jako argument. Próbka zwraca- implementowany jest jako oddzielny wątek sys- tym miejscu odbywa się interakcja miksera z sys-
temowym mechanizmem odgrywania dźwięku
(tj. z Symbian Multimedia Framework, MMF).
Listing 3. Definicja klasy CWavLoader
W kolejnym podpunkcie Czytelnicy będą
class CWavLoader : public CBase mieli okazję przekonać się jak opisane powyżej
{ mechanizmy działają w praktyce.
public:
static CWavLoader* NewL(); Obsługa dźwięku w LaserQuest
static CWavLoader* NewLC(); Uzbrojeni w wiedzę z zakresu funkcjonowania
~CWavLoader(); softwarowego miksera dźwięku, możemy przejść
do analizy jego praktycznych zastosowań. Na po-
private: czątek zastanowimy się, które miejsce w naszej
CWavLoader(); grze najlepiej nadawać się będzie jako punkt
void ConstructL(); podłączenia naszego miksera. Czytelnicy, którzy
z uwagą śledzili kolejne kroki rozwoju LaserQu-
public: est, poprawnie odgadną, iż potencjalnymi kan-
TAudioSample LoadL( const TFileName& aFileName ); dydatami będą klasy CLaserQuestContainer
}; oraz CLaserQuestGame. Ostateczny wybór pa-
da na pierwszą z wymienionych klas – ona, ja-
Listing 4. Tworzenie obiektu reprezentującego mikser audio ko właściciel miksera, będzie odpowiedzial-
void CLaserQuestContainer::ConstructL( const TRect& aRect ) na za jego inicjalizację oraz zniszczenie. Klasa
{ CLaserQuestContainer została wybrana w tym
CreateWindowL(); celu nie bez kozery. Przypominam, że klasa ta
SetBlank(); stanowi swoisty punkt styku warstwy gry z war-
SetRect( aRect ); stwą systemu. Kluczowy jest w tym przypadku
fakt, iż nasz mikser musi odpowiednio reagować
iAudioMixer = CAudioMixer::NewL(); na zdarzenia systemowe związane z utratą i od-
zyskaniem focusu aplikacji.
iBackupBitmap Mikser dźwięku reprezentowany jest w
= new ( ELeave ) CWsBitmap( iCoeEnv->WsSession() ); klasie CLaserQuestContainer jako składo-
iBackupBitmap->Create( wa iAudioMixer. Na Listingu 4 przedsta-
Rect().Size(), wiona jest zmodyfikowana wersja metody
iEikonEnv->DefaultDisplayMode() ); CLaserQuestContainer::ConstructL(), od-
powiedzialnej za tworzenie obiektu miksera.
iBitmapDevice Szczególną uwagę należy zwrócić w tym Li-
= CFbsBitmapDevice::NewL( iBackupBitmap ); stingu na linijkę:
User::LeaveIfError(
iBitmapDevice->CreateContext( iBitmapGc ) ); iAudioMixer = CAudioMixer::NewL();

iFpsCounter = CLaserQuestFpsCounter::NewL( Warto też przyjrzeć się fragmentowi, w któ-


KFpsCounterIntervalInSeconds ); rym tworzony jest obiekt reprezentujący grę
iGame = CLaserQuestGame::NewL( iKeyState, (iGame). Jak widać, obiekt ten w trakcie kon-
iAppDrive, strukcji przyjmuje referencję do miksera.
*iAudioMixer ); Dzieje się to oczywiście po to, aby logika gry
iTickGenerator mogła kontrolować odtwarzanie dźwięku.
= CPeriodic::NewL( CActive::EPriorityStandard ); Niszczenie miksera jest oczywiste – wystar-
czy jedna, dodatkowa linijka kodu w destrukto-
ActivateL(); rze klasy CLaserQuestContainer:
}
delete iAudioMixer;

74 01/2009
Programowanie gier dla Symbian OS

Obsługa dźwięku w kontekście interakcji z


systemem zaimplementowana jest w metodzie Listing 5. Tworzenie obiektu reprezentującego mikser audio
CLaserQuestContainer::FocusChanged(). void CLaserQuestContainer::FocusChanged(
Zmodyfikowana zawartość tej metody przed- TDrawNow aDrawNow )
stawiona jest na Listingu 5. {
W tym przypadku kluczową rolę pełnią if ( IsFocused() )
metody kontrolujące globalny stan miksera: {
Pause() i Resume(). Warto zauważyć, jak do- StartTickGenerator();
brze metody te wpasowują się w mechanikę iAudioMixer->Resume();
działania szkieletu naszej aplikacji – prawdę }
mówiąc zostały one zaimplementowane mię- else
dzy innymi z myślą o obsłużenia takiego wła- {
śnie przypadku. I to by w zasadzie było tyle, je- if ( iTickGenerator->IsActive() )
śli chodzi o zarządzenie mikserem na poziomie {
systemowym. W dalszej części niniejszego pod- StopTickGenerator();
punktu opiszę w jaki sposób kolejne warstwy }
aplikacji zarządzają tym komponentem. iAudioMixer->Pause();
Projektując i implementując LaserQuest, }
przyjęliśmy zasadę, iż poszczególne zasoby gry
(np. grafika bądź dane opisujące zawartość po- if ( aDrawNow )
szczególnych etapów) przechowywane i zarzą- {
dzane są przez komponenty, które z nich bez- DrawNow();
pośrednio korzystają. Rozważmy, jak w myśl tej }
filozofii należałoby zorganizować kwestię za- }
rządzania zasobami audio. Na początek zasta-
nówmy się nad ścieżką muzyczną stanowiącą Listing 6a. Tworzenie obiektu reprezentującego mikser audio
tło naszej gry. Przypominam, że według przy- void CLaserQuestGame::ConstructL( TPtrC aAppDrive )
jętych wcześniej założeń mamy tu do czynie- {
nia z dwoma zasobami: jedna melodia jest od- CWavLoader* wavLoader = CWavLoader::NewLC();
grywana w trybie menu, zaś druga – w try-
bie rozgrywki. Jako, że trybami rozgrywki za- TFileName menuMusicSampleFilePath;
rządza klasa CLaserQuestGame, to na nią nale- TFileName gameplayMusicSampleFilePath;
żałoby nałożyć obowiązek zarządzania wspo-
mnianymi zasobami. Tak też uczynimy. Oby- #ifdef __WINS__
dwie ścieżki audio reprezentowane będą przez _LIT( KAppDrive, "c:" );
obiekty typu TAudioSample, umieszczone w menuMusicSampleFilePath.Format(
definicji wspomnianej klasy: KLaserQuestMenuMusicSampleFilePath,
&KAppDrive );
TAudioSample iMenuMusicSample; gameplayMusicSampleFilePath.Format(
TAudioSample iGameplayMusicSample; KLaserQuestGameplayMusicSampleFilePath,
&KAppDrive );
Wczytywanie i konfiguracja tych próbek au- #else
dio umieszczona jest tradycyjnie w metodzie menuMusicSampleFilePath.Format(
ConstructL() (patrz Listing 6). KLaserQuestMenuMusicSampleFilePath,
Dzieje się tutaj cały szereg interesujących rze- &aAppDrive );
czy, więc przyjrzyjmy się im po kolei. Na samym gameplayMusicSampleFilePath.Format(
początku tworzony jest pomocniczy obiekt kla- KLaserQuestGameplayMusicSampleFilePath,
sy CWavLoader. Warto zauważyć, że wywołanie &aAppDrive );
metody konstruującej NewLC() umieszcza ten #endif // __WINS__
obiekt automatycznie na stosie czyszczenia. W
dalszej kolejności budowane są ścieżki dostępu iMenuMusicSample = wavLoader->LoadL(
do odpowiednich plików audio, po czym pliki menuMusicSampleFilePath );
są wczytywane. Na wyjściu uzyskujemy obiek- iGameplayMusicSample = wavLoader->LoadL(
ty gotowe do współpracy z naszym mikserem. gameplayMusicSampleFilePath );
W tym momencie obiekt wavLoader nie jest już
potrzebny więc jest niszczony za pomocą nastę- CleanupStack::PopAndDestroy( wavLoader );
pującej linii kodu:
iMenuMusicSample.iRepEnd
CleanupStack::PopAndDestroy( wavLoader ) = iMenuMusicSample.iLength;
iGameplayMusicSample.iRepEnd
W obydwu próbkach przypisujemy składo- = iGameplayMusicSample.iLength;
wym iRepEnd wartości odpowiadające ich dłu-
gościom (iLength): chcemy aby sample były od iAudioMixer.Play( iMenuMusicSample,
początku do końca zapętlone. Wreszcie nad-

www.sdjournal.org 75
Programowanie urzadzeń mobilnych

szedł długo wyczekiwany moment: urucha- kretnym przypadku – z oczywistych wzglę- będzie odgrywana z częstotliwością 16KHz.
miamy nasz mikser, wykorzystując w tym ce- dów – jest to melodia przeznaczona dla wi- Na koniec warto zauważyć, że obiekt repre-
lu metodę Play(). Od tej chwili nasza aplikacja doku Menu). Stała KMenuMusicSampleFreque zentujący mikser jest przekazywany do kolej-
będzie odgrywać wybrany utwór (w tym kon- ncy ma wartość 16000, co oznacza, że próbka nych warstw naszej aplikacji (iMenuMode oraz
iPlayMode ).

Listing 6b. Tworzenie obiektu reprezentującego mikser audio Przełączanie aktywnych podkładów muzycz-
nych odbywa się odpowiednio w metodach
KMenuMusicSampleChannelIndex, UpdateMenuMode() oraz UpdatePlayMode()
KMenuMusicSampleFrequency, (patrz Listingi 7 i 8).
KMenuMusicSampleVolume ); Na podobnej zasadzie obsługiwane jest rów-
nież wczytywanie i odgrywanie dźwięków w
iMenuMode = CLaserQuestGameMenuMode::NewL( kolejnych warstwach gry. W ramach dodatko-
iKeyState, wego przykładu spójrzmy na Listing 9, gdzie
aAppDrive, zaimplementowane jest odgrywanie dźwięku
iAudioMixer ); sygnalizującego przechodzenie pomiędzy kolej-
TInt maxAchievedLevel = ReadRestartFileL(); nymi opcjami w menu gry.
iPlayMode = CLaserQuestGamePlayMode::NewL( To co jest najistotniejsze w tym przykładzie,
iKeyState, to fakt że zastosowany tutaj dźwięk odgrywany
aAppDrive, jest jednocześnie z muzyką przygrywającą ca-
maxAchievedLevel, ły czas w tle. Aby przekonać się, że jest tak w
iAudioMixer ); rzeczywistości, zapraszam w w tym momen-
} cie Czytelników do uruchomienia LaserQuest
i poeksperymentowania z grą. Można by powie-
Listing 7. Implementacja metody CLaserQuestGame::UpdateMenuMode() dzieć: jeden zagrany dźwięk wart jest więcej niż
void CLaserQuestGame::UpdateMenuMode( TInt64 aDt ) tysiąc zapisanych słów!:)
{ Na tym przykładzie zakończymy opis obsłu-
iMenuMode->Update( aDt ); gi dźwięku w naszej grze. Oczywiście – temat
ten można by drążyć dalej, chociażby w kierun-
if ( iMenuMode->IsFireKeyPressed() ) ku odgrywania takich formatów jak MP3 czy
{ OGG. Jest to oczywiście możliwe do zrealizo-
switch ( iMenuMode->ActiveOption() ) wania – implementację takiej funkcjonalności
{ pozostawię jako ćwiczenie dla ambitnych Czy-
case CLaserQuestGameMenuMode::EExit: telników. Teraz czas omówić jeszcze jeden efekt
{ specjalny: wibrację.
iExitFlag = ETrue;
break; Obsługa wibracji
} w aplikacjach Symbian OS
case CLaserQuestGameMenuMode::ERestart: Wibracja jest dość ciekawym efektem, specy-
{ ficznym dla telefonów komórkowych. Moż-
iMode = EPlay; na powiedzieć, iż stanowi on szczątkową wer-
iPlayMode->SetLevelOnRestart(); sję efektu force-feedback, dostępnego w dedyko-
iPlayMode->ReloadLevelL(); wanych kontrolerach gier konsolowych i desk-
iPlayMode->Reset(); topowych. Obsługa wibracji może stanowić je-
break; den z elementów wykończenia gry. Rozważmy
} prosty efekt specjalny w LaserQuest, polegający
case CLaserQuestGameMenuMode::EStart: na chwilowym włączeniu wibracji w momen-
{ cie niszczenia czujnika systemu alarmowego.
iMode = EPlay; Z punktu widzenia Symbian OS obsługa wi-
iPlayMode->SetLevelOnStart(); bracji jest bardzo prosta. Odpowiada za to kla-
iPlayMode->ReloadLevelL(); sa CHWRMVibra. Przepis na dołączenie wibracji
iPlayMode->Reset(); w LaserQuest jest następujący. Najpierw należy
break; dołączyć odpowiednią składową w klasie CLase
} rQuestGameBoardEngine:
}
iAudioMixer.Stop( CHWRMVibra* iVibra;
KMenuMusicSampleChannelIndex );
iAudioMixer.Play( W metodzie CLaserQuestGameBoardEngine:
iGameplayMusicSample, :ConstructL() dodajemy linię:
KGameplayMusicSampleChannelIndex,
KGameplayMusicSampleFrequency, iVibra = CHWRMVibra::NewL();
KGameplayMusicSampleVolume );
} zaś w destruktorze:
}
delete iVibra;

76 01/2009
Programowanie gier dla Symbian OS

Jedyne co pozostało to w pożądanym mo- rządny menadżer zasobów (ang. resource mana- w jednym miejscu, to niniejszy cykl artykułów
mencie uruchomić wibrację (w naszym ger) zaimplementowany jako Singelton. Gra aż zamieniłby się w opasłą książkę.
przypadku trzeba zrobić to w funkcji się prosi o wykorzystanie maszyny stanów do Mimo wszystko wierzę, że cel który postawiłem
UpdateFadingSensor). Posłuży nam do tego kontroli logiki. Warto by też pomyśleć o opra- sobie przed rozpoczęciem prac został osiągnięty
metoda StartVibraL(), która jako parametr cowaniu uogólnionego systemu obsługi inter- – przedstawione artykuły stanowią solidne wspar-
przyjmuje czas wibracji w milisekundach. fejsu użytkownika. Grafika rodem z kompu- cie dla osób, które planują bardziej poważnie zająć
Wszytskie te wywołania warto otoczyć nastę- terów 8-bitowych też mogłaby być zastąpiona się programowaniem gier na urządzenie mobilne
pującą dyrektywą kompilacji warunkowej: czymś lepszym: przydałaby się obsługa wielu działające pod kontrolą Symbian OS.
poziomów przeźroczystości (ang. alpha blen- Wszystkim Czytelnikom, którzy dotrwali do
#ifndef __WINS__ ding) i być może jakiś nieskomplikowany silnik tego miejsca – serdecznie dziękuję za poświęco-
... obsługi cząsteczek (ang. particle engine). Kolej- ny czas. Dziękuję również wszystkim osobom,
#endif ne usprawnienia można by wymieniać bez koń- które wspomagały mnie w pracach nad kolejnymi
ca. Na swoje usprawiedliwienie mogę napisać odcinkami cyklu oraz mojej ukochanej żonie, Oli
Wynika to z faktu, iż wibracja nie działa pod jedynie tyle, że gdybym miał opisać to wszystko – za nieustające wsparcie i cały ocean cierpliwości.
emulatorem.
Podsumowując temat efektów specjalnych Listing 8. Implementacja metody CLaserQuestGame::UpdatePlayMode()
warto zauważyć, iż mogą być one różnie od-
bierane zarówno przez samych użytkowników void CLaserQuestGame::UpdatePlayMode( TInt64 aDt )
jak i przez ich otoczenie (pamiętajmy, że osoby {
grające na telefonie komórkowym mogą znajdo- iPlayMode->Update( aDt );
wać się w przeróżnych miejscach – również o if ( iPlayMode->MenuKeyPressed() )
charakterze publicznym). Z tego względu klu- {
czowe jest dodanie do gry systemu opcji pozwa- iMode = EMenu;
lających kontrolować natężenie wspomnianych iMenuMode->Reset();
efektów, czy wręcz całkowite ich wyłączenie. iAudioMixer.Stop(
LaserQuest nie posiada takiego systemu – je- KGameplayMusicSampleChannelIndex );
go implementację pozostawiam jako pożytecz- iAudioMixer.Play(
ne ćwiczenie dla Czytelników. iMenuMusicSample,
KMenuMusicSampleChannelIndex,
Podsumowanie KMenuMusicSampleFrequency,
W ten oto sposób kończymy czwarty, ostat- KMenuMusicSampleVolume );
ni odcinek cyklu artykułów o programowaniu }
gier przeznaczonych dla Symbian OS. W po- }
wyższym tekście przedstawiono obsługę efek-
tów specjalnych w projekcie LaserQuest, z po- Listing 9. Implementacja metody CLaserQuestGame::UpdatePlayMode()
łożeniem szczególnego nacisku na wykorzy- void CLaserQuestGameMenuMode::UpdateWithoutRestart(
stanie softwarowego miksera dźwięku. Patrząc TInt64 aDt )
z perspektywy na niniejszy, wydawałoby się {
– bardzo długi, bo aż czteroodcinkowy cykl ar- iMenuOptionsTransitionDelayPeriod.Update( aDt );
tykułów – dochodzę do wniosku, że przedsta- if ( iMenuOptionsTransitionDelayPeriod.Passed() )
wiłem jedynie malutki czubek olbrzymiej gó- {
ry lodowej. To czego niewątpliwie zabrakło, to if ( iKeyState & KKeyUp || iKeyState & KKeyDown )
prezentacja pewnych mechanizmów w postaci {
uogólnionej. O wiele prościej (i czyściej) można switch ( iActiveOption )
by napisać grę pokroju LaserQuest, posiadając {
pożądaną bazę kodu, oferującą takie udogod- case EStart: iActiveOption = EExit; break;
nienia jak system duszków (ang. sprites) i ani- case EExit: iActiveOption = EStart; break;
macji czy chociażby podstawową obsługę ka- }
fli (ang. tiles). Na pewno przydałby się też po- iSndMixer.Play(
iMenuOptionsTransitionEffectSample,
RAFAŁ KOCISZ KMenuOptionsTransitionEffectSampleChannelIndex
Pracuje na stanowisku Dyrektora Technicznego w KMenuOptionsTransitionEffectSampleFrequency,
firmie Gamelion, wchodzącej w skład Grupy BLStre- MenuOptionsTransitionEffectSampleVolume );
am. Rafał specjalizuje się w technologiach zwią- iMenuOptionsTransitionDelayPeriod.Reset(
zanych z produkcją oprogramowania na platfor- KOneSecondInMicroSeconds / 5 );
my mobilne, ze szczególnym naciskiem na tworze- }
nie gier. Grupa BLStream powstała, by efektywniej }
wykorzystywać potencjał dwóch szybko rozwijają-
cych się producentów oprogramowania – BLStre- if ( iKeyState & KKeyFire )
am i Gamelion. Firmy wchodzące w skład grupy {
specjalizują się w wytwarzaniu oprogramowania iIsFireKeyPressed = ETrue;
dla klientów korporacyjnych, w rozwiązaniach mo- }
bilnych oraz produkcji i testowaniu gier. }
Kontakt z autorem: rafal.kocisz@game-lion.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ć
naszych czytelników, prezentujemy zarówno najnowsze
rozwiązania, jaki starsze, sprawdzone technologie.

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

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


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

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


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

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

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

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

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

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

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

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

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

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

□ automatyczne przedłużenie prenumeraty

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

TESTOWANIE OPROGRAMOWANIA
GNU Linear Programming Kit
Testowanie metod statycznych
Porównanie wydajności obliczeniowych i bazodanowych technologii JSF,
PHP oraz ASP.NET

PROGRAMOWANIE JAVA
Java 3D

NOWE ARTYKUŁY W DZIAŁACH


Biblioteka miesiąca
Systemy operacyjne

I WIELE INNYCH ARTYKUŁÓW, KTÓRYCH NIE MOŻESZ PRZEOCZYĆ!

W spr
zedaż
y od 18
grudn
ia
Redakcja zastrzega sobie możliwość zmiany zawartości pisma.

You might also like