Professional Documents
Culture Documents
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.
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.
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
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
6 01/2009
Aktualności
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
8 01/2009
Aktualności
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
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
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
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 > 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
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
<@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 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
www.sdjournal.org 19
Bazy danych
ORACLE DATA
ACCESS COMPONENTS
programowanie baz danych Oracle 10g i 11g
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
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.
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
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-
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-
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
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
@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
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.
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 }
32 1/2009
Testowanie oprogramowania
Adobe Flash
w budowie dynamicznych interfejsów HMI
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,
������������ ������������������������
����������
���������������
� ���������� ���������
���������������
�
�����������������
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
����� ����������
������������� ������
����������
������
�����������
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
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
������������������ ����������������
�����������
������������������� ����������������
������
����� �� ������
��������������� ���������� ���������
��������
�����
�����
���������
���������� �����
����� �����
�������
�������
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
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
����������
������ �� � �
������
Kontakt���������������������������������������������������������������������������
Aplikacje biznesowe
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
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
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:
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:
www.sdjournal.org 57
Warsztaty
Media streaming
Wykorzystanie Adobe Flex i Red5
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");
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 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;
www.sdjournal.org 61
Warsztaty
Świat 3D w Javie
Podstawy programowania z wykorzystaniem API Java 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:
�������
����������
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); �
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
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 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
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
zamiast:
www.przyklad.pl/index.php?art=648&page-
=2&log=1
www.przykład.pl/telewizory_lcd_2.html
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
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
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();
74 01/2009
Programowanie gier dla Symbian OS
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.
kadry@frontstudios.com http://www.future-processing.pl
http://www.kei.pl http://www.wit.edu.pl
KLUB PRO
http://www.statconsulting.com.pl http://www.OprogramowanieKomputerowe.pl
http://www.itsolutions.biz.pl
marcin.pytlik@itsolutions.biz.pl http://www.softline.com.pl
http://www.proximetry.com http://www.swdsoft.pl
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
Nazwa firmy.....................................................................................
.........................................................................................................
Telefon ............................................................................................
E–mail .............................................................................................
ID kontrahenta ................................................................................
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
W spr
zedaż
y od 18
grudn
ia
Redakcja zastrzega sobie możliwość zmiany zawartości pisma.