You are on page 1of 84

11/2008 (167)

SPIS TREŚCI
06 AKTUALNOŚCI PROGRAMOWANIE PHP
Rafał Kocisz
32 Opensource-owe platformy blogowe
12 OPIS CD Lech Albrzykowski
Lech opisuje jak w przeciągu ostatnich lat blogi internetowe zjedna-
ły sobie wielką popularność wśród użytkowników internetu. Przestały
BIBLIOTEKA MIESIĄCA być tylko i wyłącznie formą pamiętników a stały się miejscem wymia-
14 Jericho HTML ny zdań pomiędzy różnymi środowiskami jak choćby programistów.
David de Rosier
David opisuje Jericho jako prostą, lekką i darmową bibliotekę uży-
teczną dla wszystkich programistów Java przetwarzających bądź TESTOWANIE OPROGRAMOWANIA
generujących kod HTML. Jericho dostarcza klasy umożliwiające ana- 36 SAP GUI Scripting API
lizę i przekształcanie istniejących dokumentów HTML bądź też ge- Roman Gryzowski
nerowanie nowych. Wszystko z użyciem minimalnego nakładu pra- Roman opisuje że SAP GUI Scripting API to interfejs pozwalają-
cy ze strony programisty. cy na emulowanie każdej czynności jaką może wykonać użytkow-
nik w środowisku SAP GUI. Dzięki jego użyciu można zautomatyzo-
wać czynności powtarzalne, ale również uzyskać dostęp do SAP GUI
ECOMMERCE z poziomu innych aplikacji, np. Windows Scripting Host.
20 Sklep internetowy w PHP i SQLite
Grzegorz Hibner 40 IBM Rational Data Architect
Zdaniem Grzegorza gotowych rozwiązań na rynku e-commerce są – pierwsze kroki
setki. Znajdziemy gotowe skrypty o funkcjonalności systemów au- Szymon Gruszewski
kcyjnych, sklepów internetowych oraz systemów barterowych. To Wyobraźmy sobie sytuację, w której musimy stworzyć oprogra-
najczęściej sprawdzone i tanie rozwiązania, regularnie aktualizowane mowanie dla biblioteki. Chcąc wywiązać się z zadania musimy
– dlatego skorzystanie z nich najczęściej bywa bardzo kuszące. Jednak zaprojektować system, który będzie spełniał wymagania stawia-
czy zawsze uzasadnione? Najczęściej o wiele lepiej stworzyć własną ne przez naszego zleceniodawcę. Z pomocą przychodzi nam Ra-
platformę e-commerce. Nie jest to trudne – zajmie to 60 minut. tional Data Architect, który jest narzędziem służącym do two-
rzenia zarówno prostych, jak i bardzo złożonych modeli bazo-
28 Wydajny, elastyczny i przyjazny CMS danowych.
Krystian Rajski
Krystian napisał że Textpattern nie jest tak popularny jak np. Joom- 44 Bezpieczne partycjonowanie
la. Nie posiada tak rozbudowanej listy plugin'ów i dodatków. Mniej – systemy wielordzeniowe QNX
znany, nie oznacza jednak gorszy czy też mniej wydajny. Stanowi Kerry Johnson, Romain Saha
ciekawą alternatywę i chociażby tylko ze względu na to warto po- Autorzy opisują że w dzisiejszych czasach praktycznie każdy wbu-
szerzyć horyzonty i przyjrzeć się rozwiązaniu bliżej. Niniejszy artykuł dowany system podłączony jest fizycznie lub bezprzewodowo to
pełni rolę wprowadzenia. świata zewnętrznego. Taka łączność sieciowa pozwala użytkow-

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


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

4
11/2008
nikom na zdalne monitorowanie i sterowanie oraz umożliwia sys- ki z takich reklam są jednak stosunkowo niewielkie, stąd istnieje
temom pobieranie nowych programów i treści wtedy, kiedy jest zapotrzebowanie na inne formy reklamy. Gwarantowany zarobek
to konieczne. oferuje nowy wchodzący do Polski LinkLift.

48 Joomla 1.5
– nowości NARZĘDZIA PROGRAMISTYCZNE
Stefan Wajda 60 Plugin
Nowe wydanie Joomla! zapewnia użytkownikom i projektantom – wielokrotne wykorzystanie sprawdzonych narzędzi
wygodny i łatwy w użyciu szkielet publikacji treści w witrynach Piotr Plenik
internetowych wszelkiego typu. Stworzenie doskonałej witryny Tworzenie aplikacji, składa się zarówno z tych bardziej twórczych,
ze wszystkimi funkcjami, jakie sobie wymarzysz, może wymagać jak i bardziej odtwórczych prac. Mimo wszelkich naszych starań
czasu i zaangażowania. Ale ze społecznością Joomla!, wsparciem tworzenia wedle zasady DRY (z ang. DRY – Don't Repeat Your-
projektantów oraz dzięki licznym rozszerzeniom tworzonym dla self ), zdarza się, że dla tej samej funkcjonalności powielamy i do-
Joomla! 1.5, jest to jak najbardziej możliwe. Możesz również two- stosowujemy ten sam kod na wielu różnych elementach aplika-
rzyć własne rozszerzenia i udostępniać je ku uciesze całej spo- cji lub pomiędzy różnymi aplikacjami. Na początek zaprezentuje-
łeczności. my najczęściej wykorzystywane pluginy w Symfony, których jest
w chwili obecnej ponad 200. Następnie stworzymy prosty doda-
tek do wysyłania maila w symfony bez dodatkowego nakładu na-
XML szej pracy.
52 Spring 2 Schema
– własne przestrzenie nazw w Spring 2.x
Henryk Konsek PROGRAMOWANIE
Osoby intensywnie wykorzystujące Springa w swoich aplika-
cjach często narzekają na ogrom konfiguracji XML koniecznej do URZĄDZEŃ MOBILNYCH
utworzenia aplikacji o większym stopniu zaawansowania. Autorzy 64 Programowanie gier dla Symbian OS
Spring Framework pisząc o dobrym oprogramowaniu promują za- – budujemy grę!
sadę DRY (Don't Repeat Yourself ) – wyraźnie widać to w mecha- Rafał Kocisz
nizmie rozszerzania konfiguracji XML kontenera Springa. Ten arty- W poprzednim, pierwszym odcinku z serii „Programowanie gier dla
kuł wprowadzi Cię szybko w podstawowe techniki tworzenia wła- Symbian OS” Mieliśmy okazję przebrnąć przez gąszcz stosunkowo
snych przestrzeni nazw XML Schema dla plików konfiguracyjnych zawiłych i miejscami mało interesujących szczegółów dotyczących
Spring IOC. programowania aplikacji pod Symbiana. W rezultacie powstał pro-
sty szkielet gry pod wspomniany system. W niniejszej części cyklu
zajmiemy się tematem znacznie ciekawszym – odejdziemy (chwilo-
KASA DLA WEBMASTERA wo) od niskopoziomowych zagadnień systemowych i zrobimy to co
58 LinkLift Tygrysy lubią najbardziej – zbudujemy grę!
– koniec z reklamą kontekstową
Krzysztof Trynkiewicz
W internecie królują systemy reklamy kontekstowej. W oparciu o WYWIAD
treść witryny, wyświetlane są odpowiednie reklamy z takich serwi- 76 Wywiad z Bartoszem Stebnickim
sów jak Google AdSense, czy AdKontekst Wirtualnej Polski. Zarob- – dyrektorem generalnym firmy EMC

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

Druk: ArtDruk intéressées par la coopération sont priées de nous contacter :


Les personnes
cooperation@software.com.pl

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

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

www.sdjournal.org 5
Aktualności

Windows 7 Beta 1 jeszcze w tym roku?


Wygląda na to, że Microsoft dojrzał już,
by publicznie i konkretnie mówić o przy-
Google Chrome
G
szłej wersji systemu Windows oznaczo- oogle zaprezentowało nową, zbudowa- i Mac OS X. Co ciekawe, już po trzech dniach od
nej kodowo cyfrą 7. Sesje techniczne ną w oparciu o otwarte oprogramowa- wydania aktualizacji dla przeglądarki Chrome, jej
poświęcone następcy Visty są już zapla- nie, przeglądarkę mającą ułatwić użyt- twórcy opisali na łamach oficjalnego blogu aplika-
nowane na listopadowej Windows Har- kownikom na całym świecie korzystanie z Interne- cji zmiany jakie wprowadzono w aplikacji za jej po-
dware Engineering Conference. Nie
oznacza to oczywiście, że już wtedy
tu. Dostępny w wersji beta w 43 językach, Google średnictwem. Aktualizacja niweluje dwie, poważ-
testowe kompilacje będą rozdawane Chrome odzwierciedla nowe podejście do przeglą- ne luki w zabezpieczeniach, oraz trzy mniej groź-
uczestnikom. Niemniej z najnowszych, darek, oparte na prostych i skutecznych rozwiąza- ne. Instalacja aktualizacji odbywa się automatycz-
oczywiście nieoficjalnych informacji niach, do których przyzwyczajeni są użytkownicy nie u wszystkich użytkowników przeglądarki i nie
wynika, że wersja Beta 1 nowych Okie- produktów korporacji. Google projektując Chro- daje żadnych nowych funkcjonalności. Kolejna cie-
nek może zostać wydana szerszej grupie
me położyło szczególny nacisk na jej lekkość, prze- kawostka dotycząca przeglądarki rodem z Moun-
testerów jeszcze w tym roku, a konkret-
nie w połowie grudnia. Niewielka grupa kładającą na niskie wykorzystanie zasobów sys- tain View wiąże się z jej licencją i rzekomo niepo-
wybrańców już bierze udział w pracach temowych. Wykorzystuje ona silnik renderowa- kojących zapisach znajdujących się w jej treści. Li-
nad Windows 7 – dotychczas Microsoft nia stron webKit – framework używany w Safari cencja Chrome mówi, że Google ma nieograniczo-
wydał dwie wersje Milestone 1 i Milesto- i iPhone, wraz z autorskimi rozwiązaniami z Mon- ne czasowo, ogólnoświatowe, nieodwołalne pra-
ne 2 tego systemu, a przygotowania do tain View, dostarczającymi gamę innowacyjnych wo do reprodukcji, adaptacji, modyfikowania, pu-
wydania Milestone 3 właśnie mają się ku
rozwiązań. Jednym z nich jest funkcja dynamicz- blikowania i tłumaczenia każdej treści, którą użyt-
końcowi. Wydanie pierwszej Bety 1 już
w grudniu sugerowałoby znaczne przy- nych kart, pozwalająca na tworzenie nowych kart kownik wysyła lub wyświetla za pomocą przeglą-
spieszenie prac i mogłoby rodzić ocze- poprzez przeciągnięcie jej poza aktywny obszar darki. Brzmi to groźne, jednak w rzeczywistości
kiwania co do wydania finalnej wersji przeglądarki. Dodatkowo, dzięki Kontroli awarii, nie jest to nic nowego. Google stosuje podobne wa-
produktu jeszcze w 2009 roku. Pytanie każda z nich jest uruchamiana oddzielnie, co spra- runki także przy innych swoich usługach. Stosowa-
zasadnicze brzmi więc – kiedy Micro- wia, iż wskutek zawieszenia się jednej, nie wpłynie ne jest to w celu uproszczenia obowiązujących za-
soft zdecyduje się na szerszy program
beta, a nawet na publiczną betę? Więk-
to na funkcjonowanie pozostałych. Prócz tego, tryb sad i może nie zawsze pasować do wszystkich pro-
szość obserwatorów uważa, że całkowite incognito oferuje możliwość niezapisywania od- duktów Google. W odpowiedzi na kontrower-
otwarcie programu beta nastąpi dopie- wiedzanych witryn w historii. W Chrome znala- sje Google zapowiedziało jednak zmiany w licen-
ro w momencie, gdy system będzie kom- zły się także mechanizmy zabezpieczające takie jak cji Chrome. W przeszłości internetowy gigant po-
pletny funkcjonalnie – choć pojawiają się Bezpieczne przeglądanie – ostrzegający przed wej- stąpił tak z licencją Google Docs. Należy przy oka-
coraz poważniejsze głosy, że Windows 7
ściem na witryny podejrzewane o phishing czy roz- zji zauważyć, że Chrome jest otwarte i kod wysyła-
będzie wydany publicznie jeszcze wcze-
śniej, niż w przypadku Visty (w której powszechniającymi złośliwe oprogramowanie, z jący do Google dane użytkownika zostałby szybko
przypadku była to faza Beta 2). dwoma aktualizowanymi okresowo blacklistsami. zauważony. Ponadto kod Chrome jest objęty licen-
http://www.techit.pl/ W programie nie zabrakło również opcji impor- cją BSD, która narzuca bardzo małe ograniczenia
tu ustawień, menadżera pobierania plików i pro- na programistów chcących modyfikować kod prze-
Ile znaczy Google News?
cesów. Dostępna jest też możliwość instalacji wty- glądarki, np. w celu usunięcia niechcianych funk-
Mały błąd Google spowodował, że wła-
ściciele linii United Airlines stracili 1,14 czek, poszerzających możliwości aplikacji, wspar- cji. Należy się jednak spodziewać, że mało kto zre-
miliarda dolarów. W 2002 roku linia lotni- cie dla technologii Gears, a rosnące wykorzysta- zygnuje z funkcjonalności paska adresowo-wyszu-
cza United Airlines była bliska bankructwa. nie zasobów może być rozkładane na wiele rdzeni kiwawczego i nadal wszystkie wpisywane tam sło-
Informację o tym zamieściły różne serwisy, procesora. Najnowszą testową wersję Google Chro- wa, także adresy odwiedzanych przez internautów
w tym także Google News. Google jednak me dla systemów Windows można pobrać bezpo- stron, będą trafiały do Google wraz z adresami IP
nie ustawiło daty newsa co spowodowało,
średnio ze strony twórców (http://www.google.com/ użytkowników.
że pojawił się ponownie – w połowie wrze-
śnia 2008 roku. Został on szybko podchwy- chrome/index.html). W chwili obecnej, trwają pra- http://www.google.com/chrome/index.html
cony przez inne serwisy informacyjne, łącz- ce na wersjami przeglądarki dla systemów Linuks http://dobreprogramy.pl/
nie z Bloombergiem. Jak się łatwo domyślić,
spowodowało to gwałtowny spadek ceny
akcji linii z 12 na 3 dolary, a ich posiadacze
stracili łącznie ponad miliard. Na szczęście
szybko zauważono pomyłkę i cena akcji
znów wzrosła, osiągając poziom ok. 10
dolarów. Jak się później okazało, informa-
cja pojawiła się na Google News ponieważ
robot Google dostrzegł jej popularność na
stronach gazety South Florida Sun-Senti-
nel. Przypadek ten pokazuje jak duże jest
obecnie uzależnienie globalnego rynku
od serwisów firmy Google. Jeszcze niedaw-
no ciekawostką były procesy wytaczane w
sytuacjach, gdy na skutek zmian w algo-
rytmie wyszukiwarki Google czyjaś strona
nagle spadała na dalsze miejsca w rankin-
gach. Aktualnie, wraz ze wzrostem znacze-
nia Google, takich incydentów może poja-
wiać się coraz więcej.
http://online.wsj.com/

6 11/2008
Aktualności

Apache nie daje za wygraną Luka w DNS


poważniejsza niż przewidywano
Od jakiegoś czasu wiele się słyszy o luce w

W
przeciągu ostatnich miesięcy da- dyfikowana przez Google wersja Apache (Google systemie nazw Domian Name Sever (DNS).
ło się zaobserwować dynamiczny Front End) z wynikiem ok. 8 miliona witryn, co Wydawać by się mogło, że luka ta została
wzrost udziału usług Internet In- daje prawie 11-procentowy udział. Na dalszych usunięta. Niestety, eksperci są zgodni co
formation Services w rynku serwerów interne- miejscach plasują się lighttpd, Sun, Zeus, oraz do tego, że sprawa jest nadal daleka od
pomyślnego zakończenia. Na trop wspo-
towych przy jednocześnie słabnącej popularno- dynamicznie pnący się w górę nginx. Równocze-
mnianej usterki wpadła na początku bie-
ści konkurencyjnego serwera Apache. Z badań śnie, jak wynika z najnowszego raportu firmy ana- żącego roku firma IOActive, a konkretnie
firmy Netcraft wynikało wówczas, że IIS wbudo- litycznej IDC, wzrasta także sprzedaż serwerów z Dan Kaminsky, prowadząc w ten sposób
wany w systemy z rodziny Windows Server konse- Linuksem. W porównaniu z rokiem ubiegłym, do największego łatania w historii Inter-
kwentnie umacnia swoją pozycję, a oglądając da- kiedy zainteresowanie nimi kształtowało się na netu. Wspomniana luka pozwala ataku-
ne za październik można było dojść do wniosku, poziomie 9,4%, odnotowano wzrost o całe czte- jącemu wykorzystać specjalny typ żądań
w celu doprowadzenia do przejęcia sesji
że jeszcze nigdy dotąd obu rozwiązań nie dzieli- ry punkty procentowe, wskutek czego dzisiaj licz- TCP/IP, a wskutek tego – przekierowania
ła tak niewielka różnica. Co ciekawe, we wrześniu ba ta wynosi już 13,4%. Sprzedaż maszyn z Unik- sporej ilości osób na odpowiednio sprepa-
bieżącego roku nastąpiła zdecydowana zamiana sem stanowiła 7,7%, z kolei sprzedaż serwerów z rowane witryny. Działanie opracowanych
w dynamice tych statystyk. Z wykonanego przez Windows –36,5%. W sumie, w drugim kwarta- poprawek, bez względu na platformę sys-
Netcraft sierpniowego badania wynika, że w Sie- le, dochód z pierwszych z nich wyniósł 4,6 miliar- temową, polega na dodaniu mechanizmu
losowania portów co zmniejsza ryzyko
ci pojawiło się ponad 1,3 miliona nowych witryn dów dolarów, co jest tylko o pół miliarda dolarów
wykorzystania luki. Jak pokazują bada-
z czego 1,2 mln wykorzystuje serwer Apache zaś mniej, w porównaniu z maszynami wyposażony- nia po takim zabiegu liczba serwerów
pół miliona hostowana jest na rozwiązaniu ofero- mi w Windows Server. Niezmiennie liderem w podatnych na ataki z ponad 85%, zmalała
wanym przez Google. Z sieci jednocześnie znik- ich sprzedaży pozostaje IBM, na drugim miejscu do około 30. Jednak zdaniem Kamińskie-
nęło 760 tysięcy witryn obsługiwanych przez IIS. uplasował się HP, trzecie miejsce cały czas zajmu- go i innych ekspertów z branży, opisane
Udział serwera Microsoft w rynku odnotował je Dell, który przewodzi w sprzedaży maszyn 32- wyżej zabiegi nie eliminują w całości luki,
a jednie utrudniają napastnikowi przepro-
spadek o 1,74 punktu procentowego (strata bli- bitowych (x86). Analizując dane z przedstawio-
wadzenie pomyślnego ataku. Przewidu-
sko dwóch milionów witryn), zaś udział Apache nych badań można dojść do wniosku, że, zarówno je się więc kolejną porcję poprawek do
wzrósł o 0,33 punktu procentowego. W badaniu Apache, jak i IIS idą niemalże łeb w łeb. Pierwszy wprowadzenia w najbliższym czasie. Nie-
łącznie sprawdzono ponad 176 748 506 stron. Po z nich kroczy niemalże cały czas w granicach 50% stety, ze względu na liczne problemy tech-
uwzględnieniu tych danych w ogólnej klasyfikacji udziałów w rynku, drugi natomiast sukcesywnie niczne szansa ich równoczesnego wdroże-
nadal prowadzi Apache z 46.84% udziałem i 33 nadrabia straty. Zanosi się na to, iż taka równowa- nia przez administratorów wszystkich śro-
dowisk serwerów DNS jest znacznie mniej-
milionami witryn. Tuż za nim jest Microsoft IIS ga będzie trwała jeszcze długo, a wojowniczy Apa- sza niż w przypadku poprzednich popra-
wykorzystywany na 34,83% serwerów WWW che niełatwo da się pokonać. wek.
(24,5 mln stron). Trzecie miejsce zajmuje zmo- http://netcraft.com/ http://www.techit.pl/

Google skraca czas

Apple prezentuje
przechowywania adresów IP w logach
Pod presją Unii Europejskiej Google poin-
formował, że skraca czas, przez jaki w
iTunes 8 oraz nowe iPody logach serwerów webowych przechowy-
wane są informacje o adresach IP pozwa-

K
onferencję Let's Rock rozpoczęły ade- odtwarzacz iTunes przeszedł prawdziwą meta- lające zidentyfikować użytkowników
korzystających z wyszukiwarki i pozo-
kwatne do nazwy, rockowe brzmienia morfozę, jeśli chodzi o wygląd. Jobs zaprezen-
stałych usług firmy. Dotychczas dane te
Rolling Stones oraz Jimmiego Hen- tował zupełnie nowy sposób przeglądania mu- były przechowywane przez 18 miesięcy,
drixa. Muzyka była tematem przewodnim wy- zyki i filmów. Wizualnie przeglądarka przypo- po czym adresy IP były z nich usuwane.
darzenia. Steve Jobs rozpoczął prezentację od mina iPhoto i pozwala przeglądać albumy, ar- Teraz czas ten został skrócony o połowę
iTunes. iTunes Store, według rankingów naj- tystów, kompozytorów, gatunki etc. Co więcej, – do 9 miesięcy. Trudno powiedzieć, czy
większy dystrybutor multimediów na świecie, ten sam mechanizm pozwala przeglądać filmy, Komisja Europejska będzie zadowolona
z takiego kroku – w oficjalnym oświad-
teraz wzbogaci się o filmy HD. Również odcin- na przykład sezony seriali. A wszystko to moż-
czeniu wydanym w kwietniu apelowała
ki seriali będzie można ściągnąć w SD lub HD na kontrolować głosem (voice-over)! Skoro mo- do Google, by dane w logach serwerów
i obejrzeć na komputerze za pomocą nowego wa o muzyce, nie można pominąć odtwarzacza były neutralizowane już po sześciu mie-
iTunes lub na AppleTV. Poza tym, tak jak nio- iPod. Tutaj również Apple przygotowało nie la- siącach. Google broniło się twierdząc, że
sły plotki, iTunes posiada teraz możliwość two- da nowość w postaci całej tęczy (czarny, fiole- korzysta z tych danych do opracowywa-
rzenia zestawu piosenek o podobnym nastroju towy, niebieski, zielony, żółty, pomarańczowy, nia nowych usług i polepszania jakości
już istniejących – oczywiście przy jedno-
(funkcja znana z serwisu Pandora). Ale to nie czerwony, różowy) Nano. Najnowsza wersja
czesnej odpowiedniej ochronie prywatno-
wszystko. Nowym elementem programu jest jest najcieńsza z wyprodukowanych do tej pory ści użytkowników, których adresy IP wid-
Genius Sidebar. Za pomocą tego paska nie tyl- a jednocześnie najbardziej przyjazna środowi- nieją w logach. Teraz firma w tonie ubole-
ko stworzymy nastrojową playlistę z własnej ko- sku. Towarzyszą mu nowe modele słuchawek wania zapewnia, że choć ma do dyspozy-
lekcji, ale też dowiemy się jakie utwory z iTu- i większa pojemność (8 i 16GB). iPod Touch cji o połowę mniej logów, to jest na dobrej
drodze do opracowania nowych metod
nes Store mogą się spodobać. Propozycje do- również jest teraz cieńszy, ale przede wszyst-
analizowania przechowywanych danych
bierane są na podstawie statystyk zbieranych kim jego oprogramowanie również zostało – bardziej polegających na informacjach
przez program oraz ocen użytkownika i wysyła- wzbogacone o zestaw usług Genius. innych niż adresy IP.
nych, oczywiście anonimowo, do serwisu. Sam http://www.apple.com/ http://www.google.com/

www.sdjournal.org 7
Aktualności

Microsoft przegrał z Komisją


Europejską jednym głosem OpenGL 3.0
– początek końca?
Okazuje się, że zawarcie ugody z Komi-
sją Europejską tuż po kolejnym nieko-
rzystnym wyroku z 17 września ubiegłe-

G
go roku mogło być ogromnym błędem rupa Khronos udostępniła ostatecz-
Microsoftu. Koncern z Redmond nie wie- ną wersję specyfikacji OpenGL 3.0,
dział bowiem wtedy, że przegrał całą
będącej otwartym, wieloplatformo-
sprawę zaledwie... jednym głosem. Gło-
sowanie w unijnym sądzie było oczywi- wym API pozwalającym na sprzętową obsłu-
ście tajne, ale teraz na jaw wyszła infor- gę grafiki 3D. Firmom rozwijającym opro-
macja, że Microsoft przegrał stosun- gramowanie CAD nowa wersja biblioteki z
kiem głosów 7 do 6. Źródłem przecieku pewnością się spodoba, stanowi bowiem roz-
było dwóch proszących o anonimowość winięcie wydania 2.1, aczkolwiek wielu de-
urzędników z bezpośrednią wiedzą na
temat procesu. Analitycy są zgodni, że w
weloperów otwarcie wyraża frustrację. Ich wej odsłony OpenGL wymienia następujące
takiej sytuacji zawarcie ugody nie musia- zdaniem biblioteki są mocno zacofane pod kwestie – brak obiecanego obiektowego mo-
ło być najlepszą decyzją prawników względem możliwości, zwłaszcza w kontek- delu API, zachowanie wstecznej kompaty-
Microsoftu. Sędziowie unijni byli dalecy ście wykorzystania ich jako platformy do roz- bilności (czynniki mocno hamujący rozwój),
od jednomyślności i jak widać, mieli cał- woju gier. OpenGL 3.0 pojawił się z ponad utrudnienie procesu tworzenia sterowników.
kiem sporo wątpliwości. W kolejnej ape-
rocznym opóźnieniem, półtora roku po pre- W tym samy miejscu podkreślone jest jednak
lacji mogłoby więc okazać się, że Micro-
soft wygrałby. Taka wygrana pozwoliła- mierze DirectX 10, a ciągle jeszcze nie ob- iż nowo wprowadzony kontekst GL3 stanowi
by uniknąć płacenia rekordowej w histo- sługuje wszystkich funkcji, jakie dawno te- rozwiązanie przyszłościowe i otwiera szerokie
rii firmy i w całej historii Unii Europej- mu zostały zaimplementowane przez Micro- możliwości dla kolejnych odsłon standardu.
skiej kary finansowej, razem z odsetkami soft. Jak powszechnie wiadomo OpenGL jest Pocieszający może być również fakt, iż wraz z
i kosztami procesowymi grubo przekra- zestawem standardów umożliwiających de- premierą Larrabee i innych GPU ogólnego za-
czającej miliard euro, a przede wszystkim
weloperom tworzenie aplikacji graficznych stosowania (GPGPU) wojna na liczbę obsłu-
miałaby zupełnie inny wpływ na prze-
mysł IT. W tej sytuacji przedstawiciele dla Windows, Mac OS oraz Linuksa. Według giwanych funkcji przez DirectX i OpenGL
Microsoftu mogą czuć się mocno rozgo- szacunków, ilość sprzętu zainstalowanego w powinna stać się przeszłością. Deweloperzy
ryczeni. Według źródeł wewnątrz firmy, komputerach i posiadającego wsparcie dla gier nie będą musieli już czekać, aż firma X
prawnicy korporacji dowiedzieli się o OpenGL 3.0 przekracza 60 milionów. Fir- udostępni chipset implementujący funkcję
stosunku głosów dopiero w maju bieżą- my takie jak Intel, Advanced Micro Devices Y, a następnie wypatrywać API, za pomocą
cego roku.
http://seattletimes.nwsource.com/
czy NVidia znacząco przyczyniły się do roz- którego ją obsłużą. Zamiast tego sami będą
woju specyfikacji i dziś wszystkie trzy przy- mogli zaprogramować chip do własnych po-
Ubiquity – wykonaj to co napiszę znają, że w ich intencji leży wprowadzenie trzeb korzystając z klasycznych narzędzi i ję-
Fundacja Mozilla poinformowała o wyda- obsługi standardu we wszystkich możliwych zyków wykorzystywanych na platformie x86.
niu pierwszej wersji nowego rozszerze-
produktach. Jednak od zapewnień do reali- Co by nie mówić, nowy standard wprowadza
nia dla Firefoksa – Ubiquity 0.1. Jest to
dosyć nietypowy dodatek, pozwalający zacji droga daleka. Ani chipsety Intela, ani pewne nowości. Wśród nowinek wprowadzo-
na zastąpienie najpopularniejszych czyn- ATI (AMD) nie błyszczą, gdy wziąć pod uwa- nych w OpenGL 3.0 znalazło się kilka rozsze-
ności wykonywanych podczas korzysta- gę wydajność aplikacji OpenGL w porówna- rzeń potencjalnie mogących zwiększyć moż-
nia z Internetu słownymi poleceniami. niu do szybkości przetwarzania w wypadku liwości następnej wersji bibliotek. Oprócz te-
Rozszerzenie Ubiquity pozwala użytkow- DirectX. Kiedy opublikowano specyfikację go API pozwala na obsługę GLSL 1.30, no-
nikowi na integrację funkcji wielu aplika-
OpenGL 3.0, na forum Khronos Group pod- wej wersję języka cieniowania oraz posiada
cji sieciowych.
Przykładowo chcąc zaprosić znajo- niósł się lament. Wielu deweloperów uzna- wszechstronne wsparcie dla funkcji ofero-
mych do restauracji wystarczy użyć kilka ło, że zapomniano o obietnicach, które rok i wanych przez akceleratory graficzne ostat-
prostych komend, które np. przekieru- dwa lata temu dano programistom. Co cieka- niej generacji. Ponadto w bibliotekach poja-
ją użytkownika do usługi Google Maps, we, a jednocześnie niepokojące, do pełnej ob- wiła się implementacja Vertex Array Objects,
bądź zaprezentują mu recenzje danego sługi OpenGL 3.0 konieczne jest stosowanie funkcja kompaktowania danych pikseli i wer-
lokalu z serwisu Yelp. Następnie pozo-
kart kompatybilnych z DirectX 10, ale jed- teksów w celu oszczędzania pamięci i pasma,
staje tylko skopiowanie kodu i wkleje-
nie go do wiadomości mailowej, która nocześnie sam OpenGL 3.0 nie implemen- wsparcie dla 32-bitowego bufora głębi, czte-
wyląduje w elektronicznych skrzynkach tuje wszystkich funkcji dostępnych w DX10. ry nowe schematy kompresji tekstur, nieblo-
pocztowych uczestników imprezy. Doda- Wśród opinii deweloperów nie brakuje rady- kowalny dostęp do obiektów bufora wertek-
tek oferuje użytkownikom wiele przydat- kalnych stwierdzeń – niektórzy z miejsca de- sów oraz funkcja renderowania warunkowe-
nych komend i poleceń, które usprawnią
klarują „przesiadkę” na standard Microsoftu. go zwiększającego wydajność. Jak potoczą się
ich pracę w Internecie. Wśród nich zna-
leźć można m.in. defi – wywołujący defi- Pojawiły się również opinie, że opublikowa- dalsze losy standardu OpenGL? Trudno prze-
nicję, trans – tłumaczący wskazany tekst, na właśnie specyfikacja jest zacofana aż o sie- widzieć. Teraz kolej na ruch Microsoftu. Jed-
czy np. twit – kopiujący materiał do ser- dem lat względem DirectX – a przepaść ma no jest niestety pewne – niesmak i niedosyt
wisu Twitter. Ponadto każdy zaintereso- rosnąć z każdą chwilą. Co gorsza, mniej wię- związane z ogłoszeniem trzeciej odsłony po-
wany może w prosty sposób zdefinio- cej w tym samym czasie Gigant z Redmond zostaną na długo w głowach użytkowników
wać własne polecenia. Dodatek Ubiqu-
zapowiedział przypadającą na koniec bieżące- tej – jak by nie patrzeć – istotnej we współ-
ity pobrać można z oficjalnej strony pro-
jektu. go roku premierę DirectX 11. Nehe, popular- czesnym świecie informatycznym bibliotece.
http://www.mozilla.org/ ny serwis poświęcony programowaniu aplika- http://www.idg.pl/
cji na bazie Open jako największe grzechy no- http://nehe.gamedev.net/

8 11/2008
Aktualności

20 lat Internetu w Polsce Red Hat kupił KVMa


W czerwcu bieżącego roku pojawiły się
informacje o pracach Red Hata nad wbu-

1
7 sierpnia bieżącego roku Polski In- dowanym linuksowym hypervisorem,
ternet obchodził 20 urodzimy. Rów- który ma być uzupełnieniem, a nie kon-
no 20 lat temu, 17 sierpnia 1988 ro- kurencją dla istniejącego już rozwiąza-
ku, Polska po raz pierwszy połączyła się z nia Xen. Fundament nowego hypervi-
sora miał stanowić projekt Kernel-based
Kopenhagą, za pośrednictwem łącza inter- Virtual Machine. Tymczasem korpora-
netowego o prędkości 9600 bitów na sekun- cja oficjalnie poinformowała o kupnie,
dę (bps). Trzy lata później, dr Rafał Pietrak z za kwotę 107 milionów USD jego produ-
Uniwersytetu Warszawskiego nawiązał łącz- centa – firmy Qumranet. Zdaniem Paula
ność w oparciu o protokół TCP/IP z pracow- Cormiera, jednego z prezesów Red Hata,
fuzja obu przedsiębiorstw ma wpro-
nikiem Uniwersytetu w Kopenhadze, wysy-
wadzić niespotykane dotąd możliwo-
łając elektroniczną wiadomość pocztową. ści wirtualizacyjne w produktach spółki.
Wraz ze wzrostem popularności Internetu Ich połączenie może się bowiem przy-
w Polsce, medium to nabrało zupełnie nowe- czynić do eliminacji kilku problemów.
go znaczenia. O ile kiedyś Internet był obec- Przede wszystkim, stworzenia własnego
ny na uczelniach technicznych, a jego zna- cy dużo większą liczbę możliwych adresów silnika wirtualizacyjnego, czego korpo-
racja wcześniej nie była w stanie zrobić
jomość rozpoczynało się od nauki Uniksa, (teoretycznie nawet 2 do potęgi 128), któ-
z Xenem, ze względu na XenSource,
obecnie, z pojawieniem się pierwszych wer- re nawet przy niezbyt oszczędnym rozdzie- który niedawno wykupiony został przez
sji Windows oraz spadkiem cen utrzymania laniu nie powinny się wyczerpać, pozwalając Citriksa. Uzyska za to gotową platformę,
łącz, niemal każdy może mieć go w zasięgu na bezpośrednie podłączenie do sieci prak- cechującą się przede wszystkim elastycz-
ręki. Dzisiaj Internet jest powszechnie wy- tycznie każdego urządzenia. IPv6 wprowa- nością pozwalającą na jej wdrożenie na
korzystywany głównie do przeglądania wi- dza również wiele ulepszeń w zakresie bez- różnego rodzaju serwerach, kompute-
rach stacjonarnych, urządzeniach wbu-
tryn WWW, korzystania z Usenetu, czyli po- pieczeństwa. Proces migracji na ten protokół dowanych oraz jakichkolwiek innych
wstałych w 1979 roku grup dyskusyjnych, wspomaga od niedawna Unia Europejska, a pracujących pod kontrolą Linuksa. Może
czy prowadzenia różnego rodzaju rozmów, na początku lutego br. ICANN, organizacja to również pomóc w umocnieniu pozy-
realizowanych za pośrednictwem komuni- zajmująca się między innymi zarządzaniem cji na rynku wirtualizacyjnym, a także
katorów, czy IRC-a. Dużą popularnością cie- domenami najwyższego poziomu uaktualni- lepszej konkurencji z Novellem, kryty-
kowanym za współpracę z Microsoftem.
szą się też serwisy umożliwiające udostęp- ła sześć z trzynastu głównych serwerów DNS
Jednym z ciekawszych rozwiązań opra-
nianie zdjęć czy filmów wideo. Przy takiej o adresy IPv6. Przyszłość Internetu to rów- cowanych przez Qumranet jest oprogra-
okrągłej rocznicy warto zadać sobie pytanie nież nowe techniki tworzenia witryn inter- mowanie o nazwie Virtual Desktop Inter-
jaka będzie przyszłość globalnej sieci. W cią- netowych oraz takie standardy jak Web 2 i face (VDI) – połączenie brokera z nową
gu najbliższych lat, nasz kraj czeka między 3.0, czy HTML5. wersję protokołu Remote Desktop. Inną,
innymi przejście na protokół IPv6, oferują- http://gazeta.pl/ wartą uwagi technologią jest SolidICE.
Pozwala ona – przy wykorzystaniu tech-
niki wirtualizacji pulpitów – na urucho-
mienie dowolnej liczby maszyn wirtu-
TinEye – nowa wyszukiwarka alnych, zarówno z Windows, jak i Linuk-
sem pod kontrolą KVM, pracującego na

plików graficznych centralnym serwerze. Red Hat już teraz


zapowiedział wdrożenie w swojej sztan-

P
darowej dystrybucji – Red Hat Enterpri-
owstała nowa, ciekawa wyszukiwarka pli- kiwarka. Pozwala ona np. śledzić autorom zdjęć i se Linux – KVM w zastępstwie do tej pory
ków graficznych, TinEye. W przeciwień- grafik co się dzieje z ich twórczością, np. czy ich wykorzystywanego Xena oraz otwarcie
stwie do tradycyjnych wyszukiwarek, nie praca nie jest wykorzystywana w sposób nielegal- źródeł SPICE (Simple Protocol for Indepen-
odnajduje ona plików graficznych na podstawie ny. Może też pomóc w przypadku posiadania pli- dent Computing Enviromentns), z kolei
słów, które im towarzyszą na stronach interneto- ków o których nie wiadomo co przedstawiają lub opracowywany przez Red Hata hypervi-
sor ma ujrzeć światło dzienne na począt-
wych. Nie oczekuje nawet na wpisanie słów klu- kto jest ich autorem. Dzięki TinyEye odnaleźć
ku przyszłego roku.
czowych. Zamiast tego użytkownik wysyła plik można bowiem strony, które zawierają informa- http://www.techit.pl/
graficzny ze swojego komputera lub podaje adres cje o danym pliku. Wyszukiwarka jest obecnie w
URL. TinEye wyszukuje wskazany plik w Interne- fazie beta i ma zaindeksowanych przeszło 700 mi- Java Lightweight UI Toolkit otwarty
cie, nawet jeśli jest on w innym formacie, ma inne lionów plików graficznych. Korzystanie z niej wy- Sun otworzył Java Lightweight UI Toolkit,
zestaw narzędzi do tworzenia mobilnych
rozmiary a nawet jeśli obraz został przetworzony maga logowania.
aplikacji w języku Java. LWUIT został udo-
z użyciem różnych efektów lub też został włączo- http://tineye.com/ stępniony na licencji GPLv2 with Classpath
ny do innego zdjęcia/grafiki. Pozwalają na to dosyć Exception jako projekt-inkubator hostowa-
zaawansowane algorytmy, które tworzą sygnaturę ny w ramach serwisu java.net. Bazując na
danego obrazu analizując zawarte w nim kształty Java Mobile Edition oferuje wiele kompo-
i kolory. TinEye jest wyszukiwarką wyjątkową nie nentów graficznych, tematów, czcionek,
animacji i efektów przejść, obsługę ekra-
tylko dlatego, że nie opiera się w ogóle na tekście,
nów dotykowych oraz obsługę formatu
ale przede wszystkim dlatego, że służy do wyszu- SVG przy wykorzystaniu Java Specification
kiwania plików, które użytkownicy już posiada- Request (JSR) 226.
ją. Ma więc inne zastosowania niż zwykła wyszu- http://www.theregister.com/

www.sdjournal.org 9
Aktualności

Milion dolarów za włamanie


Jak informuje serwis Hacking.pl, firma Per-
manent Privacy złożyła hakerom publicz-
Układ scalony ma już 50 lat!
C
ną ofertę – jeśli uda im się złamać stwo- ały przemysł komputery nie byłby
rzone przez nich zabezpieczenia, będą tym, czym jest obecnie, gdyby nie
mogli odejść z milionem dolarów. Platfor- technologia, która powstała równo
ma Permanent Privacy bazuje na szyfrowa- pół wieku temu. Układy scalone, opracowa-
niu AES, dodaje natomiast dodatkową war-
stwę zabezpieczającą, która, jak twierdzą
ne przez dwóch naukowców, są dziś obecne w
jej projektanci, jest nie do zdobycia. Ogól- każdym sprzęcie elektronicznym i trudno wy-
nie rzecz biorąc, pomysł wziął się z zaszyfro- obrazić sobie życie bez nich. Dwaj inżyniero-
wania fragmentu bezsensownego tekstu. wie, którzy zaprezentowali pierwsze na świe-
Autorzy zabezpieczenia są tak pewni siły cie układy scalone to Jack Kilby (pracujący
zabezpieczenia, że postanowili wypłacić
wówczas w Texas Instruments) i Robert Noy-
milion dolarów każdej osobie, która zdoła
się włamać do systemu. Peter White, dyrek- ce (zatrudniony w Fairchild Semiconductor,
tor zarządzający firmy Permanent Priva- późniejszy współzałożyciel firmy Intel). Noy- dyskusji o układach scalonych włączył się wte-
cy zapewnia, że użytkownicy mogą teraz ce i Kilby pracowali oddzielnie, ale niemal jed- dy Moore (wszyscy chyba znamy sformułowa-
wysyłać listy elektroniczne i przechowy- nocześnie zaprezentowali bardzo podobne do ne przez niego prawo), twierdząc, że układ
wać dane ze 100-procentową pewnością, iż siebie rozwiązania. Z tym, iż Noyce oparł swój opracowany przez Noyce'a (oparty na krze-
pozostaną one zabezpieczone. Nawet Pen-
wynalazek na krzemie, a Kilby na germanie. mie) jest bardziej praktyczny i będzie łatwiej-
tagon nie może odczytać waszych sekre-
tów, jeśli nie ma kluczy – dodaje. Być może Pierwszy mikrochip ujrzał światło dzienne do- szy do produkowania niż układ oparty na ger-
niedługo ktoś będzie bogatszy o milion... kładnie 12 września 1958 r. Ten dziwnie wy- manie, co okazało się prawdą. Kilby złożył ja-
http://hacking.pl/ glądający (jak na dzisiejsze czasy) układ scalo- ko pierwszy wniosek o opatentowanie swoje-
ny miał wielkość 11,1 na 1,58 mm i jego kon- go wynalazku, jednak pierwszy patent został
Keyczar
struktorem był Kilby. Obecnie przemysł wy- przyznany rozwiązaniu opracowanemu przez
– usługi kryptograficzne od Google
Właściwe zastosowanie rozwiązań krypto- twarzający układy scalone może się pochwa- Noyce'a. Następnie po powtórnym rozpatrze-
graficznych nie jest łatwym zadaniem i nie lić obrotami rzędu 300 mld USD rocznie. Po- niu całej kwestii związanej z datami sprawę
każdy webmaster potrafi z nim sobie pora- pularne scalaki pełnią w produktach elektro- wygrał Kilby, jednak po wieloletnich przepy-
dzić. Ich niewłaściwa implementacja może nicznych rolę mózgu oraz układu nerwowe- chankach sądowych ostatecznie patent po-
przyczynić się do występowania poważ- go. Są to produkty zawierające miliony tran- wrócił do Noyce'a. Na początku nie wszyscy
nych luk w bezpieczeństwie. Wielu progra-
zystorów, wytwarzane przy użyciu technolo- byli przekonani, że układ scalony to dobry po-
mistów korzysta też często z przestarzałych
algorytmów i pomija istotne aspekty bez- gii kilkudziesięciu nanometrów, co oznacza mysł. Wielu znawców przedmiotu argumen-
pieczeństwa zapominając choćby o rota- iż poszczególne elementy czy ścieżki są na ta- towało, że proces produkcji układu scalonego
cji kluczy. Wychodząc naprzeciw tym pro- kim układzie oddalone od siebie np. o 60 nm. jest tak skomplikowany, że będzie to niemoż-
blemom, Google udostępnił nowe narzę- A warto pamiętać, że nanometr to jedna mi- liwe albo bardzo drogie i nieopłacalne przed-
dzie kryptograficzne. Keyczar, bo tak wła-
liardowa część metra (ludzki włos ma śred- sięwzięcie. Po latach widać, jak bardzo się my-
śnie brzmi jego nazwa, jest zestawem
narzędzi kryptograficznych, zapewniają- nicę 10 tys. nanometrów). Czterdzieści lat lili. Tak czy inaczej obie firmy dogadały się
cych wsparcie zarówno dla szyfrowania, jak temu superkomputer mający wydajność za- w sprawie patentów i po jakimś czasie zaczę-
i uwierzytelniania dla algorytmów syme- ledwie 1000 dzisiejszych pecetów zajmował ły produkować układy scalone. Uważa się, że
trycznych lub kluczy publicznych. Aplika- kilka dużych pokoi i kosztował bajońskie su- produkcję pierwszego komercyjnego układu
cja udostępnia proste API i potrafi wska- my – ponad 10 mln USD. Wszystko zmieni- scalonego podjęła firma Fairchild. Firma TI
zywać domyślnie najniebezpieczniejsze
ło się właśnie za sprawą układów scalonych. uruchomiła natomiast w 1964 roku produk-
miejsca, tagować dane wyjściowe z infor-
macjami o wersjach kluczy, a także oferu- W latach pięćdziesiątych komputery składa- cję swoich pierwszych kalkulatorów opartych
je możliwość rotacji kluczy z prostym sys- ły się z dziesiątków tysięcy pojedynczych tran- na układach scalonych. Przemysł zbrojeniowy
temem wersjonowania. Prócz tego w pro- zystorów, diod i rezystorów. To też była swo- Stanów Zjednoczonych wykorzystał bardzo
gramie znajdziemy opcje związane z auto- ista rewolucja, ponieważ wcześniej stosowa- szybko układy scalone, wprowadzając je do
matycznym generowaniem wektorów ini- no lampy. Kilby i Noyce doszli więc do wnio- swoich produktów, takich jak np. rakiety ba-
cjalizacyjnych oraz podpisami zaszyfro-
sku, że tranzystory, rezystory i kondensato- listyczne Minuteman. Z kolei NASA stosowa-
wanymi (ang. ciphertextowymi). Korzysta-
nie z narzędzia wiąże się z koniecznością ry można przecież zintegrować ze sobą w ra- ła szeroko scalaki podczas realizacji misji czło-
zaszyfrowania parametru URL przy użyciu mach jednego kawałka np. krzemu czy innego wieka na Księżyc (program Apollo). Patrząc
klucza symetrycznego. Dotychczas, dewe- materiału. Jak rewolucyjny to był wynalazek w przeszłość i oceniając rolę układów scalo-
loper musiał zadecydować o wyborze algo- niech świadczy fakt, że Kilby zdobył w 2000 nych w rozwoju elektroniki, Kilby wypowie-
rytmu, długości klucza, trybu działania, jak
r. nagrodę Nobla w dziedzinie fizyki właśnie dział znamienne słowa podczas odbierania w
również sposobu obsługi wektorów inicja-
lizacyjnych, rotacji kluczy, czy też cipher- za wynalezienie układu scalonego. Noyce ma 2000 r. nagrody Nobla – To tak jakby bóbr i
tekstu. Keyczar upraszcza całą sytuację, w tej dziedzinie też duże zasługi, opracowu- królik przyglądali się potężnej zaporze przedzie-
dzięki czemu interakcja ze strony progra- jąc układ scalony oparty na krzemie, który to lającej rzekę i ten pierwszy powiedział do królika
misty wiąże się z wprowadzeniem zaled- materiał jest stosowany do dzisiaj. Firma Fair- – ja jej nie zbudowałem, ale cały pomysł to chyba
wie dwóch linijek kodu, używając Pythona, child (w której pracował Noyce) produkowa- wzięli ode mnie. Wynalazcy układów scalonych
Javy, oraz – już niebawem – C++. Keyczar
ła w latach pięćdziesiątych tranzystory opar- już nie żyją. Noyce zmarł na atak serca w 1990
funkcjonuje w ramach usługi Google Code
i jest dostępny do pobrania pod adresem te na krzemie. Stąd pomysł stosowania krze- r. mając 63 lata, a Jack Kilby zmarł na raka w
http://www.keyczar.org/. mu do budowania układów scalonych, a nie 2005 r. w Dallas (w wieku 81 lat).
http://www.techit.pl/ germanie, jak to zrobił Kilby. Co ciekawe, do http://www.itpartner.pl

10 11/2008
Aktualności

Tim Berners-Lee ogłasza Picasa rozpoznaje twarze


Google dodało funkcję rozpoznawania twarzy
do swojego serwisu Picasa Web Albums. Dzięki
powstanie Fundacji WWW niej użytkownik dostaje zestaw zdjęć, które
według algorytmu rozpoznającego przedsta-

W
wywiadzie dla BBC News, wiają tą samą osobę i może je łatwo otagować,
Tim Berners-Lee, twórca sieci np. imieniem. Dzięki tagom można przeglądać
na bieżąco tworzone albumy zawierające zdję-
WWW, poinformował o powsta- cia danej osoby. Odnajdywanie twarzy na 3
niu Fundacji WWW, której jednym z głów- tysiącach zdjęć zajmuje ok. 20 minut.
nych założeń jest opracowanie mechanizmu Jak można się było spodziewać, nowa funk-
umożliwiającego oddzielenie miejsc w Inter- cja nie zawsze działa poprawnie. Czasami nie
necie, gdzie znaleźć można rzetelne informa- wykryje twarzy na zdjęciu, czasem za twarz
uzna coś, co nią nie jest. Wykrywanie działa
cje od tych zawierających plotki. Berners-Lee
najlepiej, gdy twarz fotografowanej osoby
w trakcie rozmowy z dziennikarzami mówił była skierowana w stronę fotografujące-
o zmianach, jakie wprowadzić należy w Sieci, go oraz nie występują na niej cienie. Ogól-
by stała się ona bardziej przyjazna i dostępna nie jednak mechanizm ten spisuje się bardzo
dla Internautów. Pośród wszystkich poruszo- dobrze. Technologię rozpoznawania twarzy
nych przez niego aspektów najistotniejszym Google pozyskało kupując firmę Neven
Vision. Serwis Picasa Web Albums wzboga-
wydaje się zastosowanie podziału stron i ser-
cił się też o funkcję Explore, która pozwala na
wisów internetowych w taki sposób, by pro- przeglądanie wszystkich publicznych zdjęć.
mować tylko te, które zawierają wiarygodne Nawigować można na podstawie daty, miej-
informacje. sca i popularnych tagów. Przy okazji Google
Przykładem niepotrzebnej histerii, jaką wy- planuje także wydanie Bety trzeciej wersji
wołać mogą plotki rozpowszechnione w In- aplikacji Picasa. Pojawią się w niej takie funk-
cje jak tworzenie filmów ze zdjęć i muzyki,
ternecie jest według niego historia Wielkie- usuwanie przebarwień skóry oraz efektu czer-
go Zderzacza Hadronów. Powołana przez Ber- wonych oczu, ulepszona funkcja kolażu, prze-
nersa-Lee do życia Fundacja WWW opraco- bilnych, a z racji tego, że większość osób za- glądarka plików graficznych oraz synchroni-
wać ma złożony mechanizm oznaczania rze- mieszkałych wspomniane tereny to analfa- zacja z serwisem Picasa Web.
telnych dostawców informacji w Sieci, umoż- beci, Berners-Lee mówił także o dostarcza- http://www.cnet.com/
liwiając tym samym wielu organizacjom nada- niu treści w sposób niewymagający umiejęt- Microsoft poszerza
wanie serwisom różnych etykiet, które świad- ności czytania. Ponadto ważnym elementem współpracę z Novellem
czyłyby o wiarygodności treści. Inną kwestią, działalności Fundacji WWW ma być także Firmy Microsoft i Novell poinformowały o
nad jaką pracować będzie Fundacja WWW zapewnianie neutralności każdemu użyt- poszerzeniu współpracy na rzecz budowa-
jest ułatwienie dostępu do Internetu miesz- kownikowi Internetu, tak by mógł swobod- nia mostów pomiędzy otwartym i zamknię-
tym oprogramowaniem. Koncentruje się
kańcom najbiedniejszych rejonów na świecie. nie wyrażać swoje zdanie i dokonywać wy-
ona między innymi na umocnieniu oferowa-
Z czasem Sieć stać się ma bardziej przyja- borów. nego wsparcia technicznego oraz szkoleń,
zna dla wszelakiego rodzaju urządzeń mo- http://www.bbc.co.uk/ ale przede wszystkim na zwiększeniu inte-
roperacyjności pomiędzy systemami z rodzi-
ny Microsoft Windows Server i SUSE Linux

Najlepsze aplikacje Enterprise Server. Microsoft zobowiązał się


do zakupu certyfikatów o wartości stu milio-

dla Androida wybrane


nów dolarów, mogących zostać wykorzy-
stanych przez klientów korzystających ze
wsparcia technicznego produktów Novella.

F
irma Google ogłosiła zwycięzców pierw- multimedialnych w oparciu o Social Network, W ramach nawiązanej pierwotnie na pięć lat,
szego etapu konkursu Android Develo- udostępniając tym samym publicznie informa- w listopadzie 2006 roku, współpracy, gigant
per Challange, którego głównym zało- cje o odtwarzanych aktualnie plikach. Dzięki z Redmond nabył wówczas certyfikaty warte
240 mln USD. W ciągu kolejnych 18 miesię-
żeniem było napisanie jak najlepszej aplikacji temu możliwe jest podglądnięcie czego słucha-
cy ponad połowa z nich została wykorzysta-
przeznaczonej na platformę Android. Jako naj- ją inni użytkownicy Androida w lokalizacji, w na. Wśród klientów, którzy skorzystali z oferty
ciekawsze aplikacje stworzone przez uczestni- której aktualnie się znajdujemy. Ogółem nagro- korporacji znalazły się takie koncerny jak
ków konkursu wymienić należy m.in. cab4me, dzonych zostało 50 zespołów, których projek- Wal-Mar Stores, Renault, czy BMW. Zdaniem
GoCart, czy też TuneWiki. Pierwsza z nich to ty uznane zostały za najlepsze. Pierwsza dzie- Kevina Turnera z Microsoftu, celem posze-
rzonej współpracy jest podołanie wymaga-
przydatne rozszerzenie dla telefonów komór- siątka otrzymała po 270 tys. USD, twórcy ko-
niem klientów, którzy chcą mieć możliwość
kowych za którego pomocą w łatwy sposób lejnych 10 aplikacji zostali nagrodzeni sumą uruchamiania równocześnie zarówno Win-
znaleźć można najbliższą taksówkę, nie zna- 100 tys. USD, z kolei wszyscy pozostali otrzy- dows, jak i Linuksa, a także pomoc w migracji
jąc nawet dokładnej lokalizacji, w której się mali po 25 tys. USD. Więcej informacji na te- do SUSE Linux Enterprise Server z innych roz-
znajdujemy. Kolejna aplikacja, GoCart, znacz- mat wszystkich nagrodzonych w konkursie wiązań. Inwestycja ma wejść w życie z dniem
nie ułatwia zakupy. Rejestrując za pośrednic- aplikacji znaleźć można na stronie ADC Galle- 1 listopada 2008. Korporacje już teraz wyrazi-
ły chęć kontynuacji innych inicjatyw, w takich
twem wbudowanej kamery kod kreskowy da- ry. Warto dodać, iż wszystkie one dostępne bę-
dziedzinach jak wirtualizacja, systemy zarzą-
nego produktu, aplikacja informuje użytkow- dą do pobrania za darmo w serwisie Android dzania, zgodności formatów dokumentów
nika, gdzie wybrany towar można kupić najta- Marketplace. oraz technologia Moonlight.
niej. TuneWiki pozwala na odtwarzanie plików http://osnews.pl/ http://www.techit.pl/

www.sdjournal.org 11
Opis CD

Acrobat 9 Pro na CD
Na dołączonej do tego magazynu płycie znajdziecie ewaluacyj-
ną wersję programu Acrobat 9 Pro w angielskiej wersji języko-
wej. Dodatkowo, aby ułatwić Wam pracę na tym narzędziu za-
mieściliśy na CD wideotutoriale pokazujące jak korzystać z no-
wych funkcji i do jakich zastosowań może być przydatna ta
aplikacja.

Opis nowości w Acrobat 9


W najnowszej, dziewiątej już wersji oprogramowania, po raz
pierwszy wprowadzono bezpośrednią obsługę technologii Ado-
be Flash, dzięki czemu użytkownicy mogą umieszczać w pliku
PDF materiał wideo zgodny z tym popularnym standardem. Od-
biorca dokumentu do obejrzenia jego zawartości potrzebuje jedy- Dodatkowo Acrobat 9 umożliwia wspólną pracę w czasie
nie bezpłatnego oprogramowania Adobe Reader 9. rzeczywistym na dokumencie PDF. Wykorzystywany jest do
Acrobat 9 umożliwia także łączenie różnorodnej zawartości tego Acrobat.com – nowy zestaw usług udostępnianych w ho-
w jeden dokument, tzw. pakiet PDF (Portfolio). Pakiety PDF stingu, w chwili obecnej dostępny w postaci publicznej wersji
pozwalają na łączenie kilku różnych typów plików multime- beta. Dzięki niemu kilka osób może w tym samym czasie pra-
dialnych — takich jak dokumenty, materiały filmowe i dźwię- cować na jednym dokumencie, konsultować zmiany i wprowa-
kowe, a nawet obiekty trójwymiarowe — w jeden skompreso- dzać poprawki.
wany plik PDF. Użytkownicy mogą zastosować różne układy Co więcej, użytkownicy programu Acrobat 9 mogą za pośred-
stron (lub utworzyć własne), aby zintegrować zawartość, okre- nictwem serwisu Acrobat.com zapisywać i udostępniać pliki, wy-
ślić sposób nawigacji oraz całość oprawić w odpowiednią sza- korzystywać go jako centrum przechowywania danych w ramach
tę graficzną. przetwarzania formularzy, a także zbierać za jego pomocą komen-
W rezultacie takie dokumenty jak oferty handlowe, doku- tarze do udostępnionych dokumentów. Acrobat.com oferuje także
menty prawne czy materiały informacyjne do produktu, sta- inne usługi, takie jak:
ją się bardziej urozmaicone i dostosowane do specyficznych
potrzeb. • Adobe ConnectNow – osobisty serwis do konferencji interne-
towych, pozwalający na współużytkowanie pulpitu, konfe-
rencje wideo i audio oraz czat;
• Adobe Buzzword – funkcjonalny, internetowy edytor tekstu,
który może być wykorzystywany w celu współtworzenia i
współużytkowania dokumentów na potrzeby komentowania
i recenzji, zapewniający jednocześnie najwyższej jakości wy-
druki.

Dwie wersje programu Acrobat 9 dostępne są też w języku pol-


skim. Są to: Acrobat 9 Standard oraz Acrobat 9 Pro.

Ceny i dostępność
Adobe Acrobat 9 Standard w polskiej bądź angielskiej wersji ję-
zykowej kosztuje około 1172 złotych netto. Adobe Acrobat 9
Pro w polskiej bądź angielskiej wersji językowej kosztować bę-
dzie około 1878 złotych netto.
Natomiast Acrobat 9 Pro Extended, dostępny jedynie w wersji
anglojęzycznej, to wydatek rzędu 2751 złotych netto.

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

Redakcja nie udziela pomocy technicznej


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

Jericho HTML
Parser i biblioteka narzędziowa HTML

Jericho to prosta, lekka i darmowa biblioteka użyteczna dla wszystkich


programistów Java przetwarzających bądź generujących kod HTML.
Jericho dostarcza klasy umożliwiające analizę i przekształcanie istniejących
dokumentów HTML bądź też generowanie nowych. Wszystko z użyciem
minimalnego nakładu pracy ze strony programisty.
biblioteka jest stabilna i z powodzeniem mo-
Dowiesz się: Powinieneś wiedzieć: że być wykorzystywana w komercyjnych pro-
• Jak w łatwy sposób, bez używania bezpośred- • Jak programować w językach Java i HTML na jektach. Oprogramowanie jest rozpowszechnia-
nich operacji na łańcuchach znaków, modyfi- poziomie podstawowym. ne na zasadzie licencji EPL (Eclipse Public Licen-
kować, czytać i generować kod HTML z pozio- se) oraz LGPL (GNU Lesser General Public Licen-
mu aplikacji Java. se), które pozwalają na jego pełne i nieodpłatne
wykorzystywanie w dowolnego typu projektach.
Autorzy rozważają wydanie w przyszłości odpo-
powiedzieć, iż jest parserem HTML ale ja użyję wiednika biblioteki dla platformy .NET.
tu określenia nieco szerszego – Jericho to biblio-
Poziom trudności teka narzędziowa pozwalająca na łatwe parsowa- Struktura i możliwości biblioteki
nie a także – sformatowane generowanie kodu Jericho jest narzędziem łatwym do opanowania
HTML. Jej wewnętrzne mechanizmy pozwala- i lekkim. Programiści mogą bez obaw o utratę wy-
ją na wygodną współpracę ze scriptletami innych dajności lub nadmiar zajmowano miejsca dołą-

J
ozue wyruszył na bitwę o Jerycho i mury mia- języków, jak JSP, ASP, PHP. W praktyce narzę- czać ją do swoich aplikacji. Skompilowana biblio-
sta runęły [...] Nie ma to jak stary dobry Jo- dzie to przyda się programistom na trzech płasz- teka zajmuje łącznie około 160kB a na całość skła-
zue i bitwa o Jerycho” – płyną słowa ponie- czyznach – przy analizie struktury kodu HTML, da się zaledwie kilkadziesiąt klas. Ponadto do pra-
kąd religijnej pieśni, która równie dobrze mogła- podczas konieczności odfiltrowywania fragmen- widłowego działania biblioteka nie wymaga uży-
by być żołnierską przyśpiewką, mruczaną pod no- tów tekstu z kodu HTML oraz podczas automa- cia żadnych niestandardowych klas zewnętrz-
sem podczas ostrzenia mieczy. Pewnie wszyscy zna- tycznego generowania stron HTML. Jak nieczy- nych. Wszystkie klasy Jericho umieszczone są
my krwawą historię o Jerycho w której mury mia- telny lub rozdmuchany jest nierzadko kod automa- w pakiecie au.id.jericho.lib.html.
sta zawaliły się od ryku trąb a potem ludzie Jozu- tycznie generowanych stron wie każdy programi- W sferze funkcjonalnej bibliotekę można po-
ego „wyrżnęli do nogi ostrzem miecza wszystko, co sta WWW. Z zarówno estetycznych jak i praktycz- dzielić na cztery podstawowe moduły:
było w mieście, mężczyzn i kobiety, młodych i sta- nych powodów (choćby debugowanie), chciałoby
rych, woły, owce i osły (Joz 6,21; BW). się mieć nieco więcej porządku w takim kodzie, co • parser – narzędzie samo w sobie oraz baza
Być może jednak nie wszyscy znamy małą, acz właśnie umożliwia opisana tu biblioteka. Kwestia dla pozostałych modułów – pozwala w ła-
użyteczną bibliotekę Java a tej samej nazwie – Je- parsowania HTML może być dla niektórych Czy- twy i intuicyjny sposób nawigować po drze-
richo. Z góry nadmieniam, iż nie jest to oprogra- telników zagadnieniem bardziej kontrowersyjnym wiastej strukturze dokumentu HTML;
mowanie służące celom destrukcyjnym lub reli- – przecież HTML (zwłaszcza współczesny, opar- • renderer – narzędzie pozwalające na wy-
gijnym krucjatom a zbieżność nazw jest tu taka ty o XHTML) to podzbiór języka XML, dla które- odrębnianie elementów tekstowych z do-
sama jak w przypadku języka Java i wyspy o iden- go narzędzi, w tym parserów, nie brakuje. Czy nie kumentu HTML, z pominięciem tagów
tycznej nazwie. No, może nieco większa – twór- jest to zatem tworzenie dodatkowych bytów? Otóż i atrybutów języka. Można tutaj w łatwy spo-
ca biblioteki nazywa się Martin Jericho. nie. Przynajmniej dla miłośników rozwiązań pro- sób odnosić się do pojedynczych elementów
Tak więc – wbrew groźnej nazwie – polecam stych i czytelnych. Jericho jest biblioteką dedyko- strony – np. wartości pól formularzy lub
tym razem Czytelnikom bibliotekę łatwą i przy- waną i dla swojej dziedziny, znacznie wygodniejszą wręcz całościowo skonwertować dokument
jemną, a przede wszystkim – nader przyjazną. w użyciu niż bardziej ogólny parser XML. HTML do czytelnej dla człowieka postaci
Nie jest to może ogromny połeć oprogramowa- Pierwsza wersja biblioteki została opubliko- – z zachowaniem definiowalnych przez pro-
nia, za to jego przydatność – dość wszechstron- wana w lutym 2004 roku i od tamtego czasu re- gramistę reguł formatowania tekstowego;
na dla wszystkich programistów aplikacji inter- gularnie się rozwija. Obecnie na stronie interne- • formatter – komponent dający wsparcie
netowych spod znaku Java. Czym dokładnie jest towej projektu znaleźć można wersję 2.6 wyda- dla formatowania dokumentu HTML; nie-
ta biblioteka? W pierwszej kolejności można by ną w czerwcu 2008 roku. W obecnym stadium zwykle użyteczne narzędzie dla wszyst-

14 11/2008
Jericho HTML

kich programistów generujących dyna- nie tekstowym. Dobrze napisany filtr powinien SourceCompactor działa na zasadzie czarnej
micznie strony WWW, którym zależy na rozpoznać taką sytuację i wyłączyć kompresję skrzynki, wykonując za nas całą pracę. Może-
czytelnym kodzie wynikowym; znaków. Pozostawiam to Czytelnikom jako zada- my tu jedynie wpłynąć na sposób generowa-
• kompresor – jak wyżej, narzędzie przy- nie domowe. nia nowych linii – metoda setNewLine (String
datne przede wszystkim jako wsparcie Większość kodu z Listingu 1 poświęcona jest newLine) przyjmuje jako parametr ciąg znaków
dla generowanego kodu HTML; pozwala pobraniu odpowiedzi z serwletu w postaci tekstu. reprezentujących nową linię. Jeśli wartość nie
zmniejszyć jego objętość poprzez usuwa- Sama redukcja jego wielkości danych sprowadza zostanie przez nas ustalona, biblioteka użyje
nie niepotrzebnych znaków (zwykle nad- się zaledwie do dwóch kluczowych linii kodu: identycznej reprezentacji nowych linii jak w da-
miarowe białe znaki). Wbrew pozorom nych wejściowych (patrz metoda getNewLine()
taka operacja potrafi czasem zredukować Source source = w klasie Source). Ustawiając tę wartość na spa-
wielkość pliku wynikowego o kilkadzie- new Source(wrapper.toString()); cję, uzyskamy w wyniku niezbyt czytelny, zapi-
siąt procent. SourceCompactor compactor = sany w jednej długiej linii. W niektórych przy-
new SourceCompactor(source); padkach może to być użyteczne. Powrotu do
Dużym atutem biblioteki jest umiejętność ra- wartości domyślnych możemy dokonać po-
dzenia sobie z dodatkowymi skryptami umiesz- Klasa Source reprezentuje źródło dokumentu przez wywołanie metody z wartością null.
czonymi wewnątrz kodu. Narzędzie potra- HTML – może to być plik, URL lub strumień
fi ignorować tagi specyficzne dla skryptów JSP, danych. Zawsze pracę z biblioteką rozpocznie- Praca z parserem HTML
PHP, ASP, PSP i Mason. Ponadto istnieje możli- my od utworzenia instancji tej klasy. W wie- Jak wspomniano wcześniej – Jericho nie jest praw-
wość zarejestrowania dodatkowych tagów, które lu wypadkach będzie to też jedyny obiekt, któ- dziwym parserem a bardziej – zaawansowanym
będą akceptowane przez parser biblioteki. ry będzie nam potrzebny, gdyż klasa Source to mechanizmem wyszukiwania tekstowego, zorien-
Parser oferowany przez Jericho prezentuje jednocześnie parser HTML. Z użyciem jej me- towanym na składnię HTML. Tym niemniej pro-
nieco odmienną filozofię niż klasyczne parsery tod możemy przykładowo łatwo przeszukać gramista może odnieść wrażenie, iż (podobnie jak
XML i nie operuje bezpośrednio na drzewie ta- wskazany dokument. Opisane zostanie to sze- w przypadku DOM) operuje na drzewie obiek-
gów lub zdarzeniach przejścia przez kolejne ta- rzej w dalszej części artykułu. tów reprezentujących strukturę dokumentu. We-
gi a przypomina bardziej mechanizm zaawanso- SourceCompactor to narzędzie, które wyko- wnętrznie jednak biblioteka wykonuje karkołom-
wanego wyszukiwania tekstowego. Dzięki temu nuje za nas całą pracę. Jak widać musimy jedynie ne operacje na łańcuchach znaków – i to z uży-
plik HTML jest cały czas traktowany jako doku- wskazać na źródło danych HTML oraz finalnie ciem podstawowych mechanizmów standardowej
ment tekstowy o specyficznym (dowolnym) – wskazać na obiekt Writer, który obsłuży zapis biblioteki Java. Analizując kod biblioteki nie znaj-
układzie, a nie jako obiektowa struktura danych danych wynikowych. W naszym wypadku zapi- dziemy operacji z użyciem wyrażeń regularnych
i atrybutów. Każdy element dokumentu iden- szemy dane bezpośrednio do wyjścia z filtra: lub budowania złożonego modelu obiektowego
tyfikowany jest poprzez swoje położenie w nim przed rozpoczęciem przeszukiwania dokumentu.
(wiersz i kolumna początku i końca elementu). compactor.writeTo( Biblioteka działa zatem bardzo niskopoziomowo,
Taka forma reprezentacji dokumentu HTML new OutputStreamWriter(out)); co czyni ją narzędziem dość wydajnym.
nie pozwala na utratę jego tekstowej natury i po-
zwala na dowolne a nie tylko globalne operowa- Szybki start
nie wyglądem dokumentu. Dzięki tekstowemu Najlepiej i najszybciej jest uczyć się na przykładach. Biblioteka dostarczana jest waz ze zbiorem
podejściu biblioteka pozwala na pracę z doku- kilkunastu przykładowych klas obrazujących jej działanie w różnych aspektach. Aby je urucho-
mentami HTML zawierającymi błędy programi- mić, musimy oczywiście w pierwszej kolejności pobrać bibliotekę ze strony projektu:
stów (niezamknięte tagi, błędy w strukturze do- http://sourceforge.net/projects/jerichohtml/
Oprogramowanie dystrybuowane jest postaci pojedynczego pliku ZIP z dokumentacją, źródła-
kumentu, etc.), co byłoby niemożliwe przy kla-
mi i skompilowaną biblioteką wewnątrz. Nas interesować będzie katalog samples/console, zawie-
sycznych parserach XML. rający zbiór plików .bat uruchamiających wybrane przykłady. Nie pozostaje zatem nic innego jak
uruchomić wybrane skrypty a potem przeanalizować wynikowy ekran wraz ze źródłami progra-
Pierwszy program mów. W tych ostatnich zabrakło niestety komentarzy.
Czas napisać pierwszy program z użyciem biblio- Programiści nieużywający systemu Windows będą musieli uruchomić programy bezpośrednio z
teki. Zaczniemy od niewielkiego przykładu, za to linii komend, wpisując z poziomu katalogu samples/console:
bardzo obrazowego. Zaprezentowany na Listin- java -classpath classes:../../lib/jericho-html-2.6.jar -Djava.util.logging.config.file=lo
gu 1 kod ukazuje filtr HTTP, który wycina nad- gging.prop
miarowe znaki z wyjścia serwletu (np. pliku JSP). erties ClassName
W przypadku kodu JSP używającego dużej ilości
scriptletów, zazwyczaj generowana jest bardzo gdzie ClassName jest nazwą wybranej aplikacji przykładowej.
Z ciekawszych programów, którym warto się przyjrzeć na początku są:
duża ilość białych znaków, które w tym wypad-
ku zostaną usunięte, zauważalnie redukując roz- • Encoding – program odczytujący tryb kodowania znaków dla pliku HTML; przy okazji pobie-
miar odpowiedzi z serwera aplikacji. Przykład bę- ra też podstawowe informacje o stronie (np. jej tytuł);
dzie działał z dowolnym serwletem generującym • RenderToText – przekształca plik HTML do sformatowanego pliku tekstowego, czytelnie za-
na wyjściu kod HTML. JSP jest najprostszą formą znaczając akapity, listy, etc;
• DisplayAllElements – analizuje plik HTML i wyświetla listę wszystkich jego elementów oraz
jego zobrazowania.
ich położenie w pliku;
Aby nasza aplikacja mogła poprawnie działać, • ConvertStyleSheets – program demonstruje odczyt danych i manipulację na strukturach
trzeba jeszcze zadeklarować filtr w deskryptorze HTML – wyszukuje zewnętrzne style z plików CSS i osadza je bezpośrednio w pliku HTML (jego
aplikacji. Zobrazowano to na Listingu 2. Jak wi- zmodyfikowana wersja została przedstawiona na listingu 6 i szerzej opisana w niniejszym artykule).
dać program bezpośrednio odwołuje się do serw-
Wszystkie opisane programy operują na przykładowym pliku HTML dostarczanym wraz z biblioteką.
letów reprezentowanych przez pliki JSP. Uważny
W katalogu samples można również znaleźć inny podkatalog – webapps, zawierający plik .war z
Czytelnik z pewnością spostrzegł, że program jest przykładową aplikacją internetową, którą przed uruchomieniem należy zainstalować pod wy-
mocno uproszczony i nie rozpatruje sytuacji, kie- branym serwerem aplikacji.
dy odpowiedź z serwera jest ciągiem binarnym a

www.sdjournal.org 15
Biblioteka miesiąca

Reprezentacja dokumentu HTML Większą jednostką od taga jest Element, któ- ciem znaku &). Za operacje na nich odpowia-
Najmniejszą częścią dokumentu HTML w rozu- ry reprezentuje fragment kodu HTML ograni- da klasa CharacterReference a w szczegól-
mieniu Jericho jest tag, reprezentowany przez kla- czony tagiem otwierającym i zamykającym. Ele- ności – dwie różne klasy dziedziczące po niej
sę o tej samej nazwie. W rzeczywistości biblioteka ment umożliwia dostęp do tagów wewnętrz- – CharacterEntityReference dla znaków po-
rozróżnia (dziedziczący po klasie Tag) tag otwie- nych, pozwala no odczyt atrybutów oraz ciał po- siadających swą nazwę w standardzie HTML
rający (klasa StartTag) i zamykający (EndTag), szczególnych tagów. Można go przyrównać do (np. &, €) oraz NumericCharacterR
dzięki czemu łatwo można nawigować między obiektów typu Node w DOM. Specyficznym eference dla znaków reprezentowanych po-
początkami i końcami poszczególnych elemen- typem elementu jest FormControl, który repre- przez ich kod (np. >)
tów strony. Obiekty tego typu zawierają infor- zentuje pole formularza HTML. Dedykowane Najbardziej nadrzędną jednostką jest cały
macje jedynie o samym tagu, z pominięciem jego metody pozwalają na odczyt lub zapis wartości dokument reprezentowany przez omawianą
atrybutów i ciała. Dostarczają za to szeregu metod pól oraz na manipulację ich atrybutami. już klasę Source. Z punktu widzenia możliwo-
pozwalających zidentyfikować tag lub nawigować Kolejną specyficzną częścią dokumen- ści poruszania się po dokumencie, Source przy-
pomiędzy związanymi z nim elementami. tu HTML są znaki specjalne (zapisane z uży- pomina klasę Element. Ponadto zawiera szereg
dodatkowych metod, specyficznych dla całego
Listing 1. Przykład użycia klasy SourceCompactor na potrzeby filtru HTTP dokumentu HTML.
Wszystkie wymienione wyżej elementy dzie-
package org.sdjournal.jericho; dziczą po jednej klasie – Segment, która dostar-
import java.io.*; cza zbioru wspólnych metod służących porusza-
import javax.servlet.*; niu się po dokumencie. Ponadto większość z klas
import javax.servlet.http.*; narzędziowych (jak choćby poznany na początku
import au.id.jericho.lib.html.*; artykułu SourceCompactor) będzie operowała na
obiektach typu Segment, zatem nie będzie miało
public class CompactorFilter implements Filter { znaczenia, czy do operacji przedstawimy cały do-
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) kument, czy np. tylko element formularza.
throws IOException, ServletException {
OutputStream out = response.getOutputStream(); Przeszukiwanie dokumentu
ApplicationResponseWrapper wrapper = Siła tekstowej natury parsera Jericho ujawnia się
new ApplicationResponseWrapper((HttpServletResponse)response); przy przeszukiwaniu dokumentów HTML. Mo-
chain.doFilter(request, wrapper); żemy tutaj bowiem poruszać się zarówno po-
Source source = new Source( wrapper.toString() ); między elementami (tagami) dokumentu, jak
SourceCompactor compactor = new SourceCompactor(source); również dokonywać na nim klasycznych poszu-
compactor.writeTo(new OutputStreamWriter(out)); kiwań zadanych wycinków tekstu. Ilość opcji
out.close(); wyszukiwania jest spora – rozważmy dla przy-
} kładu różne warianty wyszukań zwracających li-
stę wszystkich elementów zgodnych z zadanymi
public void init(FilterConfig arg0) throws ServletException { kryteriami dla segmentu nadrzędnego (może to
} być cały dokument lub tylko jego element):
public void destroy() {
} • findAllElements() – zwraca listę wszyst-
} kich elementów zawierających się w elemen-
cie, dla którego metoda została wywołana;
class ApplicationResponseWrapper extends HttpServletResponseWrapper { • findAllElements(String name) – zwraca
private ByteArrayOutputStream output; listę wszystkich elementów oznaczonych
private CharArrayWriter myOut; tagiem podanym w parametrze metody;
• findAllTags(String name) – jak wyżej ale
public ApplicationResponseWrapper(HttpServletResponse response) { zwraca listę tagów a nie elementów (opera-
super(response); cja szybsza i mniej zachłanna w wykorzy-
output = new ByteArrayOutputStream(); staniu pamięci);
this.myOut = new CharArrayWriter(); • findAllStartTags(String name) – jak wy-
} żej ale uwzględnia tylko tagi otwierające;
public ServletOutputStream getOutputStream() throws IOException { • findAllElements
return new FilterServletOutputStream(output); (String attributeName, String
} value, boolean valueCaseSensitive)
public PrintWriter getWriter() throws IOException { – zwraca listę wszystkich elementów pod-
return new PrintWriter(this.myOut); rzędnych, których tagi zawierają zadany
} atrybut i wartość;
public byte[] getData() { • findAllCharacterReferences() – zwraca
return output.toByteArray(); listę znaków specjalnych w zadanym seg-
} mencie;
public String toString() { • findFormControls() – zwraca listę elemen-
return myOut.toString(); tów formularza HTML w zadanym seg-
} mencie;
} • getChildElements() – zwraca listę bez-
pośrednich dzieci zadanego segmentu.

16 11/2008
Jericho HTML

Powyżej przedstawiono jedynie wybrane me- ta dalej metoda getElement. Z użyciem metody • Renderer – bardziej złożone narzędzie,
tody przeszukiwania – nie jest to pełna lista. getAttributeValue (dostępnej dla obiektów kla- które pozwala na sformatowanie wyniko-
W przypadku wyszukiwania tekstowego uży- sy Element ale nie Tag), możemy odczytać wartość wego tekstu na podstawie tagów źródłowe-
teczne będą następujące podstawowe metody: poszukiwanego atrybutu (class). go kodu HTML. Narzędzie będzie głównie
przydatne przy transformacji większych
• subSequence(int beginIndex, int Z HTML do tekstu części HTML lub całych stron, dając w
endIndex) – zwraca ciąg znaków zawarty Częstą praktyką programistyczną jest odfiltro- efekcie tekst czytelny dla człowieka.
pomiędzy wskazanymi indeksami; wywanie części tekstu z wnętrza kodu HTML
• charAt(int index) – zwraca pojedynczy – choćby na potrzeby kanałów RSS, przedsta- TextExtractor
znak z zadanej pozycji; wiania wyników wyszukiwania, etc. Bibliote- Skupmy się w pierwszej kolejności na prost-
• getParseText() – zwraca obiekt typu ka Jericho daje pełne wsparcie dla tego procesu, szym narzędziu – TextExtractor, wyodrębnia-
ParseText , który bezpośrednio reprezen- dostarczając dwa różne narzędzia: jącym tekst spośród kodu HTML. Jak wszystkie
tuje tekst kodu HTML i dostarcza całej ga- narzędzia Jericho, klasa operuje na danych typu
my metod przeszukiwania tekstowego. • TextExtractor – klasa odfiltrowuje z za- Segment. Nową instancję klasy TextExtractor
danego segmentu wszystkie znaki specjalne tworzymy z użyciem operatora new, podając w
Zapewne jedną z najczęściej wykonywanych i nazwy tagów, pozostawiając czysty tekst; konstruktorze obiekt segmentu lub... wywołu-
operacji przez programistów będzie przechodze-
nie całego segmentu element po elemencie. Aby Listing 2. Plik web.xml do przykładu z Listingu 1, który definiuje filtr dla wyjścia z plików JSP
usprawnić ten proces, klasa Segment dostarcza
metodę getNodeIterator(), zwracającą iterator <?xml version="1.0"?>
przechodzący po wszystkich tagach segmentu. <!DOCTYPE web-app PUBLIC
Oprócz standardowych mechanizmów wy- '-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN'
szukiwania, otrzymujemy do dyspozycji meto- 'http://java.sun.com/j2ee/dtds/web-app_2_2.dtd'>
dy pozwalające na poruszanie się pomiędzy za- <web-app>
leżnymi od siebie elementami – podobne do <display-name>SDJ - Jericho</display-name>
tych jak ma to miejsce w DOM. Wyżej wspo- <filter>
mniałem już o metodzie getChildElements, <filter-name>Compactor Filter</filter-name>
zwracającej listę bezpośrednich potomków ele- <filter-class>org.sdjournal.jericho.CompactorFilter</filter-class>
mentu. W alternatywie mamy również metodę </filter>
getParentElement, zwracającą obiekt ojca. Dla <filter-mapping>
tagów odnajdziemy metody typu findNextTag i <filter-name>Compactor Filter</filter-name>
findPreviousTag. Całość pozwala na bardzo ła- <servlet-name>jsp</servlet-name>
twe i intuicyjne poruszanie się po dokumencie. </filter-mapping>
</web-app>
Przykład
Przykładowa aplikacja prezentująca możliwo- Listing 3. Program demonstrujący przeszukiwanie dokumentu HTML. Aplikacja wypisuje nazwy
wszystkich klas CSS użytych na stronie wskazanej w parametrze uruchomienia programu
ści parsera została zaprezentowana na Listingu
3. Program pobiera kod HTML zadanej stro- package org.sdjournal.jericho;
ny (wskazanej w parametrze wywołania progra- import java.net.URL;
mu) i wyszukuje w nim nazwy wszystkich uży- import java.util.*;
tych klas CSS. Program w pierwszej kolejności import au.id.jericho.lib.html.*;
wyszukuje w dokumencie taga body. Ponieważ
nie interesuje nas jego pełna zawartość, a jedynie public class ClassFinder {
miejsce w dokumencie, gdzie tag się znajduje, public static void main(String[] args) {
posłużyliśmy się tutaj szybszą metodą wyszuku- try {
jącą obiekt typu StartTag (a nie Element). Na- Source source = new Source(new URL(args[0]));
zwa taga została została podana z użyciem kla- Iterator it = source
sy HTMLElementName, reprezentującej listę nazw .findNextStartTag(0, HTMLElementName.BODY)
wszystkich elementów HTML ale można tu .getElement().findAllElements().iterator();
również posłużyć się zwykłym tekstem. HashSet classes = new HashSet();
Dla uproszczenia załóżmy, że pobieramy stro- while( it.hasNext() ) {
nę HTML o poprawnej strukturze, tak więc mo- Element el = (Element)it.next();
żemy oczekiwać tylko jednego taga body – w tej sy- String cssClass = el.getAttributeValue("class");
tuacji skorzystamy z metody findNextStartTag, if(cssClass != null && !classes.contains(cssClass)) {
by pobrać jedynie pierwszy zgodny element a classes.add(cssClass);
nie całą listę. W rezultacie otrzymaliśmy obiekt System.out.println(cssClass);
typu StartTag, jednak chcemy w jego obrębie }
poszukiwać obiektów typu Element (metoda }
findAllElements), która zwróci listę pełnych da- } catch (Exception e) {
nych na temat każdego elementu wewnątrz ta- e.printStackTrace();
ga body. Bezpośrednie odwołanie się do tej meto- }
dy jest błędną koncepcją – w pierwszej kolejno- }
ści musimy bowiem pobrać dla elementu typu }
Tag jego zawartość (Element). Służy do tego uży-

www.sdjournal.org 17
Biblioteka miesiąca

jąc metodę getTextExtractor() dla dowolne- Przetworzenie całej strony HTML do czystego dzielający poszczególne kolumny w tabeli
go segmentu. To ostatnie rozwiązanie pozwa- tekstu zmieści się w dwóch liniach kodu: (domyślnie tabulator).
la na bardzo szybkie operacje na tekście za-
wartym w tagach HTML. Zostało to zilustro- Source source=new Source(new URL(url)); Każda z wymienionych metod zwraca swój
wane na Listingu 4. Można tam zauważyć, iż System.out.println( obiekt (this), dzięki czemu łatwo można zbu-
dla otrzymanego obiektu typu TextExtractor source.getRenderer().toString()); dować łańcuch operacji.
wywołujemy metodę setIncludeAttributes,
która informuje narzędzie o tym, czy atrybu- Po takiej operacji otrzymamy tekst, który nie bę- Formatowanie kodu HTML
ty tagów mają być uwzględniane w generowa- dzie tylko długim ciągiem znaków. Akapity będę Za formatowanie kodu HTML odpowiada kla-
nym tekście czy nie. Ponieważ metoda settera od siebie oddzielone wolnymi liniami. Listy będą sa SourceFormatter. To kolejna z klas narzędzio-
zwraca referencję do swojego obiektu, wygod- numerowane lub wypunktowane z użyciem zna- wych biblioteki, która – udostępniając niewielki in-
nie można tworzyć cały łańcuch operacji. ku *. Odnośniki będą wyróżnione trójkątnymi terfejs, kryje za sobą niemałą funkcjonalność. Klasa
TextExtractor pozwala na bardziej zaawanso- nawiasami. Całość będzie prawie przypominać nie buduje kodu HTML z czystego tekstu i nie zaj-
wane reguły eksportowania tekstu z kodu HTML, efekt otwarcia strony pod przeglądarką Lynx. muje się żadną konwersją. Jak każde narzędzie Jeri-
wprowadzając dodatkowe mechanizmy filtro- Jak widać na przedstawionym kodzie, filo- cho – oczekuje na wejściu obiektu typu Segment,
wania. W tym celu należy stworzyć własną kla- zofia dostępu do obiektu Renderer jest iden- a więc istniejącego dokumentu HTML (lub jego
sę dziedziczącą po TextExtractor i nadpisać in- tyczna jak w przypadku klasy TextExtractor. fragmentu). Jej zadanie sprowadza się więc do po-
teresujące nas metody. Przykład takiego rozwią- Możemy tutaj otrzymać obiekt klasy rendere- nownego zbudowania pliku HTML, który będzie
zania przedstawiono na Listingu 5. Jak widać ra bezpośrednio z segmentu, poprzez meto- sformatowany zgodnie ze wskazanymi parametra-
obiekt nadpisuje metodę includeElement, któ- dę getRenderer lub utworzyć nową instancję mi. Można tutaj definiować wielkości wcięć, okre-
ra jako parametr pobiera obiekt typu StartTag klasy z operatorem new, podając w parametrze ślić znak definiujący koniec wiersza, etc. – całość
a zwraca wartość logiczną. Metoda ta będzie wy- konstruktora obiekt segmentu. łudząco przypomina składnię opisanej wcześniej
wołana dla każdego taga otwierającego w zadanym Sterowanie generowaniem tekstu odbywa się klasy Renderer. Dodatkową metodą, o której war-
segmencie. Jeśli metoda zwróci wartość false, Te- za pomocą kilku setterów. Poniżej wymieniono to tu wspomnieć, jest setTidyTags(boolean), któ-
xtExtractor pominie przetwarzanie danego taga i najważniejsze z nich: ra (przy podaniu parametru true) wymusza gene-
nie zwróci dla niego żadnego tekstu. W przedsta- rowanie tagów zgodnych z XHTML. Zachęcam do
wionym przykładzie, program wyszukuje jedy- • setMaxLineLength(int maxLineLength) poeksperymentowania z klasą SourceFormatter i
nie tagów typu P, których atrybut class jest róż- – ustawia maksymalną długość linii, po przedstawionym w pierwszym przykładzie kodem
ny od „info”. Pozostałe elementy segmentu zosta- której nastąpi automatyczne łamanie tek- filtru HTTP. Poniżej niewielki przykład demon-
ną zignorowane. Na podobnej zasadzie funkcjonu- stu; wartość domyślna to 76 ; strujący, jak w kilku liniach kodu można uporząd-
je metoda excludeElement, która zwraca wartość • setNewLine(String newLine) – ustawia kować wygląd zadanego pliku HTML:
true dla wszystkich elementów, które mają zostać znak reprezentujący koniec linii; domy-
pominięte w generowaniu tekstu. ślanie wartość jest identyczna jak w pliku Source source=new Source(url);
źródłowym; new SourceFormatter(source).setTidyTags(true)
Renderer • setListBullets(char[] listBullets) – .writeTo(new OutputStreamWriter(
Renderer jest dużym narzędziem dbającym o ge- ustawia znaki elementów listy UL dla jej po- System.out));
nerowanie sformatowanego tekstu, który możli- szczególnych poziomów (domyślnie *, o, + #);
wie najwierniej będzie reprezentował tekst opi- • setListIndentSize(int listIndentSize) Modyfikowanie kodu HTML
sany językiem HTML. Z punktu widzenia pro- – ustawia wielkość wcięcia dla elementów li- Biblioteka nie byłaby kompletna, gdyby nie po-
gramisty, narzędzie jest czarną skrzynką, którą sty (domyślnie 6); zwalała na modyfikowanie kodu HTML i mani-
możemy co najwyżej dostosować do swoich wy- • s e t T a b l e C e l l S e p a r a t o r( S t r i n g pulowanie na jego strukturze. Jak wszystkie in-
magań z użyciem kilku zaledwie parametrów. tableCellSeparator) – ustawia znak od- ne elementy Jericho – i ten moduł jest logiczny
i prosty. Aby móc modyfikować źródłowy kod
Listing 4. Przykład użycia narzędzia TextExtractor do wypisania wszystkich linków zawartych w HTML należy zapoznać się przede wszystkim z
zadanym fragmencie strony klasą OutputDocument, która reprezentuje kod
wynikowy. W konstruktorze tej klasy należy po-
public static void showAllLinks(Segment seg) { dać obiekt typu Source. OutputDocument do-
List links = seg.findAllElements(HTMLElementName.A); starcza zbioru metod umożliwiających zmiany na
for(Iterator it=links.iterator(); it.hasNext();) { kodzie źródłowym. Przede wszystkim są to meto-
Element link = (Element)it.next(); dy typu replace (z rożnymi typami parametrów
System.out.println(link.getTextExtractor() wejściowych – od Attributes po Segment), któ-
.setIncludeAttributes(false).toString()); re pozwalają na podmianę w bieżącym dokumen-
} cie wybranych jego elementów. Schemat działania
} często będzie zatem polegał na odczytaniu kawał-
ka kodu dokumentu, wprowadzeniu oczekiwa-
Listing 5. Przykład użycia mechanizmu filtrowania wewnątrz klasy TextExtractor nych poprawek i podmianie elementu w doku-
TextExtractor textExtractor=new TextExtractor(seg) { mencie. Ponieważ Jericho jest biblioteką do bez-
public boolean includeElement(StartTag tag) { pośrednich manipulacji na tekście, istnieje moż-
return tag.getName()==HTMLElementName.P liwość zastąpienia dowolnej sekwencji znaków
&& !"info".equalsIgnoreCase(tag.getAttributeValue("class")); (w zadanym położeniu) lub wstrzyknięcia w po-
} danej lokalizacji dowolnego tekstu. Zostało to do-
}; brze zobrazowane w programie przykładowym o
textExtractor.writeTo(new OutputStreamWriter(System.out)); nazwie ConvertStyleSheets, dostarczanym wraz
z biblioteką (patrz Listing 6, przedstawiający nie-

18 11/2008
Jericho HTML

co zmodyfikowaną wersję programu). Program nalnym kodzie przykładowym, tagi budowane są z (co prawda bardzo podstawowe) narzędzia, umoż-
odnajduje w kodzie HTML deklaracje zewnętrz- użyciem operacji na klasie StringBuffer, poprzez liwiające na budowanie kodu tagów w ładniej-
nych stylów CSS a jeśli takie napotka, przenosi za- jawne podawanie tekstu taga i konkatenację z atry- szy sposób. Służą do tego celu statyczne metody
wartość pliku CSS bezpośrednio do wnętrza kodu butami. Jest to praktyka podatna na błędy i zwy- generateHTML w klasach OpenTag i EndTag, zade-
HTML, zamykając całość tagami style. W orygi- czajnie nieładna, a przecież biblioteka udostępnia monstrowane na przykładowym Listingu.
Najważniejszym elementem przykładowego
Listing 6. Program dołączający zawartość pliku CSS bezpośrednio do kodu HTML (zmodyfikowana programu jest linia:
wersja jednego z programów dostarczanych wraz z biblioteką)
outputDocument.replace(
import au.id.jericho.lib.html.*; startTag,sb.toString());
import java.util.*;
import java.io.*; która podmienia kod odwołania do zewnętrzne-
import java.net.*; go pliku CSS na uprzednio wygenerowany tekst
z tagiem style. Ostatnia linia programu zapisu-
public class ConvertStyleSheets { je nowo wygenerowany kod HTML na wyjściu,
public static void main(String[] args) throws Exception { z użyciem znanej już nam metody writeTo.
if (args.length==0) {
System.err.println("Podaj URL lub nazwe wejsciowego dokumentu HTML"); Modyfikowanie
System.exit(1); danych formularzy HTML
} Modyfikowanie fragmentów kodu HTML z uży-
String sourceUrlString=args[0]; ciem Jericho polega głównie na bezpośrednich
if (sourceUrlString.indexOf(':')==-1) operacjach na tekście, jednak w kwestii modyfika-
sourceUrlString="file:"+sourceUrlString; cji danych formularzy HTML, biblioteka udostęp-
URL sourceUrl=new URL(sourceUrlString); nia narzędzia, pozwalające w łatwiejszy sposób
Source source=new Source(sourceUrl); na dokonywanie manipulacji. Za całość odpowie-
OutputDocument outputDocument=new OutputDocument(source); dzialne są klasy FormFields i FormField, których
StringBuffer sb=new StringBuffer(); metody pozwalają na szybki dostęp do poszczegól-
List linkStartTags=source.findAllStartTags(Tag.LINK); nych pól formularza HTML (Listing 7).
for (Iterator i=linkStartTags.iterator(); i.hasNext();) { Przedstawiony kod pobiera z podanego źró-
StartTag startTag=(StartTag)i.next(); dła listę pól formularza. Metoda clearValues
Attributes attributes=startTag.getAttributes(); usuwa wszystkie domyślne wartości, natomiast
String rel=attributes.getValue("rel"); metoda addValue ustawia nową wartość dla za-
if (!"stylesheet".equalsIgnoreCase(rel)) danego pola (jest to skrót operacji formFields.
continue; get("name").addValue("John Smith");).
String href=attributes.getValue("href"); Oprócz manipulacji na wartościach pól for-
if (href==null) mularza, możemy również modyfikować do-
continue; datkowe atrybuty, jak na przykład ReadOnly
String styleSheetContent; lub Disabled. Całość finalnie musi zostać za-
try { pisana w dokumencie wynikowym, z użyciem
styleSheetContent=Util.getString( opisanej wcześniej klasy OutputDocument.
new InputStreamReader(new URL(sourceUrl,href).openStream()));
} catch (Exception ex) { Podsumowanie
continue; // nie konwertuj dla błędnego URLa Jericho jest typowym przykładem udowadniają-
} cym siłę w prostocie. Niewielki, czytelny kod, ko-
sb.setLength(0); rzystający jedynie z bibliotek standardowych oraz
Attribute typeAttr=attributes.get("type"); prosta koncepcja tworzą dość wszechstronne na-
sb.append(StartTag.generateHTML(HTMLElementName.STYLE, rzędzie programistyczne, które może znaleźć za-
typeAttr != null ? Collections.singletonMap(typeAttr.getKey(), stosowanie w wielu aplikacjach Java. Na chwilę
typeAttr.getValue()) : null, false)) obecną największą wadą Jericho jest brak wersji
.append("\n").append(styleSheetContent).append("\n") biblioteki zgodnej ze składnią Java 5 oraz nazbyt
.append(EndTag.generateHTML(HTMLElementName.STYLE)); uproszczony mechanizm generacji kodu HTML.
outputDocument.replace(startTag,sb.toString()); Ponadto mimo że narzędzie znalazło zastosowa-
} nie w wielu projektach i zdobyło zaufanie progra-
outputDocument.writeTo(new OutputStreamWriter(System.out)); mistów, pewnym ryzykiem jest fakt, iż jest to opro-
} gramowanie jednego autora. Przydałaby się grupa
} programistów bądź instytucja czuwająca nad dal-
szym rozwojem biblioteki.
Listing 7. Przykład modyfikacji danych formularza
FormFields formFields=source.findFormFields(); DAVID DE ROSIER
formFields.clearValues(); Programista-podróżnik. Pasjonat WEB 2.0, estetycz-
formFields.addValue("name","John Smith"); nego kodowania i algorytmów szachowych. Zawo-
OutputDocument outputDocument=new OutputDocument(source); dowo – specjalista od aplikacji J2EE i MDA w sekto-
outputDocument.replace(formFields); rze bankowym.
Kontakt z autorem: ddrosier@gmail.com

www.sdjournal.org 19
E-commerce

Sklep internetowy
w PHP i SQLite
Zaprojektuj i zbuduj w mniej niż godzinę

Gotowych rozwiązań na rynku e-commerce są setki. Znajdziemy gotowe


skrypty o funkcjonalności systemów aukcyjnych, sklepów internetowych
oraz systemów barterowych. To najczęściej sprawdzone i tanie rozwiązania,
regularnie aktualizowane – dlatego skorzystanie z nich najczęściej bywa bardzo
kuszące. Jednak czy zawsze uzasadnione? Najczęściej o wiele lepiej stworzyć
własną platformę e-commerce. Nie jest to trudne – nam zajmie to 60 minut.
zostać również umieszczony w konkretnej
Dowiesz się: Powinieneś znać: kategorii – ułatwi to przeszukiwanie sklepu
• Jak zaprojektować od podstaw sklep interne- • Co najmniej podstawy PHP oraz SQL; użytkownikowi.
towy; • Podstawy programowania obiektowego. Klient naszego sklepu w przypadku doko-
• W jaki sposób korzystać z SQLite; nania zakupu powinien przekazać nam da-
• Jak wykorzystać sesje do przechowywania da- ne niezbędne do zrealizowania zamówienia
nych użytkownika. (m.in. imię, nazwisko, adres, dane do faktu-
ry, dane wysyłki). Przyjęliśmy więc, że w ce-
lu dokonania zakupu konieczne jest posia-
go wpływu na poziom trudności pracy. Dlate- danie konta w systemie. Rejestracja powin-
go nasz sklep zbudujemy wykorzystując PHP5 na być oczywiście bezpłatna, a klient powi-
oraz… SQLite. nien mieć również możliwość samodzielne-
Poziom trudności go usunięcia konta.
Przed rozpoczęciem pracy… Warto również pomyśleć o systemie ra-
… należy zastanowić się nad funkcjonalnością batów – pozwoli to zatrzymać klienta oraz

P
owodów, dla których nie warto wdra- sklepu. Chcemy oczywiście sprzedawać okre- uatrakcyjnić cenowo naszą ofertę. Rabat mo-
żać gotowych rozwiązań może być wie- ślone produkty – to oczywiste. Zastanówmy żemy uzależnić od wielu elementów – wiel-
le. Dla prostego sklepu internetowego, się jednak, co dokładnie chcemy przedsta- kości zakupów, kodu promocyjnego podane-
w którym właściciel chce zaoferować kilka pro- wić potencjalnemu nabywcy. Na pewno bę- go podczas rejestracji lub przekroczenie okre-
duktów wykorzystanie osCommerce może być dzie to nazwa produktu oraz jego opis. Lu- ślonej wartości wszystkich zakupów od chwi-
nieoptymalne. Dodatkowo modyfikowanie ta- dzie lubią widzieć, co kupują, wskazane jest li zarejestrowania konta. W naszym sklepie
kiej gotowej platformy również nie należy do więc umieszczenie co najmniej jednego zdję- rabat będzie przydzielany ręcznie przez ad-
rzeczy najprostszych – jeśli dostępna jest do- cia. Część produktów wymaga dokładniejsze- ministratora – czytelnik jednak bez więk-
kumentacja, wystarczy się z nią zapoznać. Jeśli go sfotografowania, tak więc nie powinniśmy szych problemów będzie w stanie dopasować
jednak jej nie ma, pozostaje metoda prób i (nie- ograniczyć maksymalnej liczby zdjęć. Oczy- system rabatowy do własnych potrzeb.
stety najczęściej) błędów. W obu przypadkach wiście niezbędne jest również uwzględnienie Ostatnim niezbędnym elementem jest lista
potrzebujemy czasu – który możemy poświę- ceny oraz stawkę podatku VAT. W zależno- zamówień. Zastanówmy się jakie informacje
cić na stworzenie własnego, dedykowanego roz- ści od typu produktów można pomyśleć rów- są naprawdę potrzebne do sprawnego obsłuże-
wiązania. Za chwilę zobaczysz, że w mniej niż nież nad dodatkowymi polami określający- nia klienta. W większości przypadków powin-
60 minut można zbudować sklep interneto- mi jego parametry (dla sklepu z butami war- no wystarczyć imię i nazwisko zamawiającego,
wy, który pomimo okazałej nazwy jest po pro- to pomyśleć o polach z rozmiarami, sprzeda- adres wysyłki, data złożenia zamówienia, stan,
stu interfejsem pośredniczącym pomiędzy ba- jąc dyski twarde warto zaznaczyć ich pojem- data wysłania towarów oraz oczywiście zamó-
zą danych a użytkownikiem, wykonującym na ność) a jeśli znamy stan magazynu możemy wione towary.
niej określone operacje. Struktura takiej ba- również wykorzystać tą informację. Nie ma
zy najczęściej nawet nie jest bardzo skompli- bowiem sensu pokazywać użytkownikowi to- Minuta pierwsza – baza danych
kowana, tak więc można użyć praktycznie do- waru, którego nie mamy na stanie, lub który Na początku prac zaprojektujemy struktu-
wolnego silnika baz danych. Nie ma to żadne- został już raz sprzedany. Produkt powinien rę naszej bazy danych. Do stworzenia ba-

20 11/2008
Sklep internetowy w PHP i SQLite

zy można użyć zewnętrznych narzędzi (np. Zamiast tego, zdjęcia będą miały nazwę od- Minuta 10 – obiekty
zewnętrzny SQLite Manager działający ja- powiadającą unikalnemu polu zawierające- W kolejnym kroku utworzymy klasy repre-
ko dodatek do przeglądarki Mozilla Firefox) mu unikalne ID produktu, znak separato- zentujące trzy podstawowe typy obiektów
lub napisanego samodzielnie prostego skryp- ra (podkreślnik) oraz kolejny numer zdję- które zdefiniowaliśmy na początku artyku-
tu w PHP. cia produktu. Pozwoli to na umieszczenie łu – dla użytkownika, produktu, oraz za-
Wystarczy do tego podstawowa znajomość praktycznie nieograniczonej ilości zdjęć. mówienia.
języka SQL oraz funkcji wbudowanych w PHP PHP dostarcza nam mechanizm umożliwia- W każdej klasie oprócz pól charaktery-
służących do komunikacji z bazą sqlite. jący proste sprawdzenie czy plik w określo- stycznych dla bazy danych znajduje się rów-
Gotowy skrypt przedstawiony jest na Li- nej lokalizacji istnieje (służy do tego funk- nież prywatne pole error – wykorzystamy
stingu 1. Jego działanie jest proste – łączy- cja file_exist()) – dzięki temu nie musi- je do zapisywania informacji o ewentual-
my się z plikiem bazy danych, oraz wywo- my przechowywać informacji o tym fakcie w nym błędzie (na przykład błędzie podczas
łujemy 5 zapytań tworzących 5 tabel – ta- bazie danych. połączenia z bazą danych, lub nieprawidło-
belę do przechowywania informacji o użyt- Zdziwić może również brak atrybutów wych danych logowania). Przyjmijmy rów-
kownikach, produktach, dostępnych kate- AUTOINCREMENT przy tworzeniu bazy. Jest to nież, że wszystkie funkcje i metody zwraca-
goriach, oraz dwie tabele do przechowywa- związane z tym, że w SQLite wszystko jest łań- ją wartość logiczną – prawdę, gdy realizowa-
nia informacji o zamówieniach użytkowni- cuchem znaków. Typ kolumny pomaga silniko- na operacja się powiedzie, oraz fałsz gdy wy-
ka. Strukturę utworzonych tabel przedsta- wi bazy dane te odpowiednio posortować, oraz stąpi jakikolwiek błąd. Dzięki temu spraw-
wia Rysunek 1. zwiększa przejrzystość tabel. dzenie poprawności wykonania nawet cy-
Część z was najprawdopodobniej zauwa- Autorzy jednak udostępnili substytut atry- klu operacji jest dziecinnie proste – sprowa-
żyła, że brakuje pól w których będą przecho- butu – wystarczy zadeklarować w tabeli pole dza się do wprowadzenia kilku instrukcji wa-
wywane informacje o zdjęciach produktów. INTEGER PRIMARY KEY . runkowych.

Listing 1. Skrypt tworzący tabele w bazie danych

<?php
include 'config.php';

if($db = sqlite_open($sqlitePath, 0666, $sqliteerror))


{
sqlite_query($db, 'CREATE TABLE "users" ( "users_id" INTEGER PRIMARY KEY , "users_username" TEXT NULL , "users_name" TEXT NULL
, "users_city" TEXT NULL , "users_postcode" TEXT NULL , "users_adress" TEXT NULL , "users_phone" TEXT NULL
, "users_mail" TEXT NULL , "users_dname" TEXT NULL , "users_deliverycity" TEXT NULL , "users_password" TEXT
NULL , "users_deliverypostcode" TEXT NULL , "users_deliveryaddress" TEXT NULL , "users_discount" TEXT NULL ,
"users_nip" TEXT NULL );');
sqlite_query($db, 'CREATE TABLE "products" ("products_id" INTEGER PRIMARY KEY , "products_name" TEXT NULL , "products_
description" TEXT NULL , "products_price" TEXT NULL , "products_tax" INT NULL , "products_count" INT NULL ,
"products_categoryid" INT NULL );');
sqlite_query($db, 'CREATE TABLE "category" ( "category_id" INTEGER PRIMARY KEY , "category_name" NULL);');
sqlite_query($db, 'CREATE TABLE "orders" ( "order_id" INTEGER PRIMARY KEY , "order_userid" INT NULL , "order_date" INT NULL ,
"order_status" TEXT NULL , "order_sdate" INT NULL );');
sqlite_query($db, 'CREATE TABLE "order_products" ( "product_id" INTEGER PRIMARY KEY , "order_id" INT NOT NULL , "op_amount" INT
NOT NULL );');
sqlite_close($db);
echo 'Tabele zosta³y utworzone!';
}
else
{
die('Wystąpił błąd: '. $sqliteerror);
}
?>

Listing 2. Zawartość pliku config.php

<?php
$sqlitePath = './sklep2.sqlite';
session_start();

function __autoload($class_name) {
require_once './class/'.$class_name . '.php';
}

?>

www.sdjournal.org 21
E-commerce

Listing 3a. Fragment klasy user – służącej do obsługi użytkownika

class user }
{ }
public $id;
public $username; function checklogin($username, $password)
public $password; {
public $name; if($db = sqlite_open($sqlitePath, 0666, $this->error ))
public $city; {
public $postcode; $value = sqlite_array_query($db, "SELECT users_id
public $adress; FROM users WHERE users_username =
public $phone; '".$username."' AND users_password =
public $mail; MD5(".$password.")");
public $dname; if(sqlite_num_rows($db) == 0)
public $deliverycity; {
public $deliverypostcode; $this->error = 'Nieprawid³owa nazwa u¿ytkownika
public $deliveryadress; lub has³o!';
public $discount; sqlite_close($db);
public $nip; return -1;
private $error; }
return $value['users_id'];
function __constuct($id='') }
{ else
if($id!='') {
$this->load($id); return 0;
} }
}
function load($id)
{ function add($username, $password, $name, $city, $postcode,
if($db = sqlite_open($sqlitePath, 0666, $this->error )) $adress, $phone, $mail, $dname,
{ $deliverycity, $deliverypostcode,
$value = sqlite_array_query($db, "SELECT * FROM users $deliveryadress, $discount, $nip)
WHERE users_id = '".$id."'"); {
$this->username = sqlite_escape_string($username);
if(sqlite_num_rows($value) == 0) $this->password = sqlite_escape_string($password);
{ $this->name = sqlite_escape_string($name);
$this->error = "Brak u¿ytkownika o podanym id!"; $this->city = sqlite_escape_string($city);
return false; $this->postcode = sqlite_escape_string($postcode);
} $this->adress = sqlite_escape_string($adress);
$this->id = $value['users_id']; $this->phone = sqlite_escape_string($phone);
$this->username = $value['users_username']; $this->mail = sqlite_escape_string($mail);
$this->password = $value['users_password']; $this->dname = sqlite_escape_string($dname);
$this->name = $value['users_name']; $this->deliverycity = sqlite_escape_
$this->city = $value['users_city']; string($deliverycity);
$this->postcode = $value['users_postcode']; $this->deliverypostcode = sqlite_escape_string($delivery
$this->adress = $value['users_adress']; postcode);
$this->phone = $value['users_phone']; $this->deliveryadress = sqlite_escape_
$this->mail = $value['users_mail']; string($deliveryadress);
$this->dname = $value['users_dname']; $this->discount = sqlite_escape_string($discount);
$this->deliverycity = $value['users_deliverycity']; $this->nip = sqlite_escape_string($nip);
$this->deliverypostcode = $value['users_
deliverypostcode']; if($this->validate())
$this->deliveryadress = $value['users_ {
deliveryadress']; if($db = sqlite_open($sqlitePath, 0666, $this->error
$this->discount = $value['users_discount']; ))
$this->nip = $value['users_nip']; {
$this->error=''; sqlite_array_query($db, "INSERT INTO users (users_
sqlite_close($db); id, users_username, users_password,
return true; users_name, users_city, users_postcode,
} users_adress, users_phone, users_mail,
else users_dname, users_deliverycity, users_
{ deliverypostcode, users_deliveryadress,
return false; users_discount, users_nip) VALUES

22 11/2008
Sklep internetowy w PHP i SQLite

W naszym systemie skorzystamy z mecha- Klasa posiada zdefiniowany jednoparame- dany, zostanie utworzony pusty obiekt. Jeśli
nizmu automatycznego ładowania plików trowy konstruktor. Podanie parametru nie jednak jako parametr podamy id użytkow-
z klasami wprowadzonego w piątej wersji jest jednak konieczne – jeśli nie zostanie po- nika, zostanie wywołana metoda load() któ-
PHP. Dlatego klasy, z których będziemy korzy-
stać bezpośrednio w skrypcie musimy umie-
ścić w osobnych plikach o nazwach takich sa-
�������� ��������������
mych jak nazwy klas.
Sama funkcja __autoload() umieszczona ���������������
��������������
�����
została w pliku config.php. Plik ten dołącza- ������������������ ������������
ny jest na początku projektu – gwarantuje to, ������������������������� �������������
������������
że funkcja będzie dostępna w każdym miej- ������������������� ������������������� �������
scu skryptu. ���������������
����������������
W pliku tym zdefiniowaliśmy również na- ���������������
������������������
zwę pliku z bazą danych oraz wystartowaliśmy �������������������
�����������������������
mechanizm sesji. ����������������� �������
����������������
Użytkownik ��������
���������������
Na Listingu 3a i 3b przestawiono fragment ���������������� ���������������
klasy reprezentującej użytkownika. Powinna �����������������������
�������������
ona dostarczyć nam wszystkich operacji nie- �������������������������� ������
zbędnych do obsługi użytkownika. Wszyst- ��������������������������� ������������
�������
kie pola wyłączając pole $error są publicz- �������������������������� ����������������
ne – chcemy mieć bowiem do nich dostęp ������������������� ��������������
w każdym miejscu skryptu. Oczywiście mo- �������������� �����������������
żesz utworzyć zmienne prywatne i utwo- ���������������
rzyć metodę do ich zwracania. Pole error ������� �������
nie powinno być modyfikowane z zewnątrz
klasy – dlatego pozostanie prywatne, a do-
stęp do jego zawartości spoza klasy odby-
wa się wyłącznie za pośrednictwem meto-
dy geterror(). Rysunek 1. Schemat utworzonej bazy danych

Listing 3b. Fragment klasy user – służącej do obsługi użytkownika

(NULL, ".$this->username.", ".$this- }


>password.", ".$this->name.",
".$this->city.", ".$this->postcode.", function validate()
".$this->adress.", ".$this->phone.", {
".$this->mail.", ".$this->dname.", //realizację funkcji validate pozostawiamy czytelnikowi.
".$this->deliverycity.", ".$this- //funkcja powinna zwróciæ false gdy nie podano wszystkich
>deliverypostcode.", ".$this- wymaganych pól
>deliveryadress.", ".$this->discount.", return true;
".$this->nip.");"); }
sqlite_close($db);
return true; function geterror()
} {
else return $this->error;
{ }
return false;
} }
}

Listing 4. Metoda updatecount() klasy product


sqlite_close($db);
function updatecount($id, $newcount) return true;
{ }
if($db = sqlite_open($sqlitePath, 0666, $this->error )) else
{ {
sqlite_array_query($db, "UPDATE products SET products_ return false;
count = '".$newcount."' WHERE products_ }
id = '".$this->id."';"); }

www.sdjournal.org 23
E-commerce

Listing 5. Fragment odpowiedzialny za wyświetlenie kategorii oraz spisu towarów


<?php
include 'config.php';
$error = '';
$categories = array();
$products = array();

if($db = sqlite_open($sqlitePath, 0666, $error ))


{
//wybieramy wszystkie dostêpne kategorie
$table = sqlite_array_query($db, 'SELECT * FROM category');
foreach($table as $value)
{
$categories[] = array($value['category_id'], $value['category_name']);
}
//Wyœwietlamy u¿ytkownikowi menu z wyborem kategorii:
echo '<div name="categories">';
foreach($categories as $category)
{
echo '<a href="list.php?category='.$category[0].'">'.$category[1].'</a><br>';
}
echo '</div>';
//sprawdzamy, czy u¿ytkownik wybra³ kategorie:
if($_GET['category']=='')
{
echo '<div name="message">Witaj w naszym sklepie internetowym! Wybierz interesuj¹c¹ Ciê kategorie!</div>';
}
else
{
//jeœli tak - pobieramy towary z bazy:
$table = sqlite_array_query($db, 'SELECT products_id FROM products WHERE products_categoryid = "'.sqlite_escape_string($_
GET['category']).'" AND products_count>0;');
if(count($table)==0)
{
echo '<div name="message">Nie znaleziono produktów w kategorii!</div>';
}
else
{
foreach($table as $value)
{
$products[] = $value['products_id'];
}
//oraz wyœwietlamy:
echo '<div name="products">';
foreach($products as $id)
{
$product = new product($id);
echo '<div name="singleproduct"><a href="details.php?productid='.$product->id.'">'.$product->name.'</a><br>
Cena netto: '.$product->price.' (+ '. $product->tax.') z³ <br>
Opis: '.substr($product->description, 0, 150).'<a href="details.php?productid='.$product->id.'">[...] dalej</a></div>';
}

echo '</div>';
}
}
sqlite_close($db);
}
else
{
die('Wyst¹pi³ b³¹d: '. $error);
}
?>

24 11/2008
Sklep internetowy w PHP i SQLite

ra uzupełni wszystkie pola klasy jego dany- rzystanie jakieś struktury danych. Niestety, wersja PHP 5.1alpha1 – dlatego do przecho-
mi. Oczywiście funkcja może zostać wyko- w chwili obecnej PHP nie obsługuje list czy wywania informacji o produktach w zamó-
nana w dowolnym momencie życia obiektu kolejek – trzeba je implementować samo- wieniu wykorzystaliśmy rozwiązanie mniej
– możemy więc po prostu utworzyć obiekt dzielnie. Sytuacja ma się jednak zmienić – w subtelne – zwykłą tablicę. Elementami ta-
i dopiero później uzupełnić pola metodą PHP od wersji 5.3 mają zostać zaimplemen- blicy są obiekty typu orderProduct. Defini-
load(). towane podstawowe struktury danych (m.in. cję tej klasy umieściliśmy w tym samym pli-
Klasa zawiera również metodę checkLogin lista, kolejka, stos oraz kopiec). W chwili pi- ku co klasa order – nie jest to błąd. Bezpo-
przyjmująca jako argumenty nazwę użytkow- sania artykułu dostępna była jednak jedynie średnio do tej klasy powinny odwoływać się
nika i hasło. Zadaniem tej metody jest spraw-
dzenie istnienia w bazie użytkownika o poda-
nych danych logowania. Jeśli użytkownik ta- �������
ki istnieje – funkcja zwróci jego id, w prze- �����
ciwnym wypadku zwróci wartość 0. Funkcja
ta będzie wykorzystywana podczas logowa- ������
nia użytkownika do sklepu. ������������ ����������
W klasie zdefiniowano również meto- �����
�����
dy add() , remove() oraz validate(). Z po- �����������
����� ������
wodu ograniczonej objętości artykułu, pe- ����� �����
łen kod klasy znajdziecie na stronie http: �����
��
//sdjournal.org. Pierwsza metoda ustawia po- ������
�������������
����
la klasy zgodnie z wartościami podanymi na ����
��������������
�����
parametr oraz zapisuje użytkownika do ba- ��
���������
���
zy danych. Metoda jest wykorzystywana ������� �������
�������������
przy rejestracji użytkownika. Wykorzystu-
�����
je ona dodatkowo metodę validate(), któ-
������ �������
ra służy do walidacji danych. Możesz w niej ������������
������ ����� �����
sprawdzać, czy dane spełniają przyjęte zało-
żenia – na przykład, czy wypełniono wszyst- �������
������ ������
kie pola ustalone jako obowiązkowe. Metoda ����������
�����
powinna zwracać logiczną prawdę, jeśli dane �����
�������������
są wypełnione poprawnie oraz fałsz w prze-
�������������� �����������
ciwnym wypadku. Ostatnia metoda – służy
��������� �����
do usuwania użytkownika którego id poda-
��
my jako parametr. �������
����
�����
Produkty
���
Klasa reprezentująca produkty jest bardzo po-
�������
dobna do klasy user. Również tutaj znajduje
się metoda load() , add(), validate() oraz
remove(). Ich funkcjonalność jest identycz-
na – nie ma więc sensu ich szerszego omawia-
nia. Klasa posiada dwie nowe metody służą- Rysunek 2. Struktura klasy order
ce do uaktualnienia stanu magazynu. Pierw-
sza – updatecount() przedstawiona na Listin- Listing 6. Wyszukiwanie obrazków danego produktu
gu 4 służy do zaktualizowania dostępnej licz-
by egzemplarzy towaru o określonym ID. Dru- //pobieramy długość identyfikatora ID produktu
ga – decreasecount() zmniejsza ilość dostęp- $length = strlen(trim($_GET['productid']));
nych produktów o jeden.
Kod całej klasy products znajduje się na stro- //otwieramy katalog images
nie: http://sdjournal.org if($dir = opendir('./images/'))
{
Zamówienia //pobieramy nazwy wszystkich plików
Nieco bardziej skomplikowana jest klasa do while (false !== ($file = readdir($dir)))
obsługi zamówień. Związane jest to z tym, {
że zamówienia przechowujemy w dwóch ta- //porównujemy pierwsze znaki
belach w bazie – w jednej przechowujemy in- if (substr($file, 0, ($length+1)) == trim($_GET['productid'])."_")
formacje o zamówieniu (numer, datę złoże- {
nia, datę realizacji) a w drugiej identyfikato- echo '<img src="./images/'.$file.'">';
ry zamówionych towarów oraz ich ilość. Ko- }
lejnym problemem jest nieznana ilość typów }
towarów – nie możemy przewidzieć ile rze- closedir($dir);
czy zostanie przez użytkownika nabytych. }
Dlatego nie możemy wprowadzić określonej
ilości pól w klasie. Konieczne więc jest wyko-

www.sdjournal.org 25
E-commerce

tylko instancje klasy order(), a jakiekolwiek ne są informacje o produkcie. Struktura kla- funkcjonalności identycznej jak w poprzed-
odwołanie powinno być możliwe wyłącznie sy order może wydawać Ci się skomplikowa- nich klasach.
przez pole z tablicą obiektów w tej klasie. Sa- na. Jeśli tak rzeczywiście jest, spójrz na Ry-
ma klasa orderProduct składa się z czterech sunek 2. Powinien on wyjaśnić wszelkie nie- I to wszystko!
pól – zawierającego id produktu, ilość za- jasności. Choć może ciężko w to uwierzyć, to klasy które
mówionych egzemplarzy oraz pole omówio- Oczywiście klasa posiada również meto- stworzyliśmy wystarczą do stworzenia w pełni
nego typu product w którym przechowywa- dy load(), add(), remove(), validate() o funkcjonalnego sklepu. Za chwilę zobaczysz, w
jaki sposób umiejętnie manipulując utworzo-
Listing 7. Dodawanie produktów do koszyka nymi obiektami (zarówno polami jak metoda-
mi) stworzymy w pełni funkcjonalny sklep in-
<?php ternetowy!
include 'config.php';
Minuta 30 – wystawa
//jesli nie utworzono wczesniej obiektu w koszyku: Czas zabrać się za kod właściwy. Na początek
if(!isset($_SESSION['order'])) stworzymy naszą wystawę – stronę, która pre-
{ zentować będzie klientowi dostępne produk-
$_SESSION['order'] = new order(); ty wraz z krótkim opisem oraz ich ceną. Po
} wybraniu produktu klient powinien zobaczyć
dokładny opis, wraz ze zdjęciami oraz linkiem
//jeœli nie podano iloœci kupowanych produktów, wyœwietlamy formularz. umożliwiającym dodanie produktu do wirtu-
if($_POST['amount']!='') alnego koszyka.
{
//dodajemy towar.
$_SESSION['order']->addproduct($_POST['productid'], $_POST['amount']);
header("location:list.php");
�����������������������������������
exit;

������������������
}
else
{
?>
<form method="POST"> ������������������������������
������
<input type="hidden" name="productid" value="<?php echo $_GET['productid'];?>">
Chce kupiæ <input type="text" name="amount" value="1"> sztuk.<br>
<input type="submit" value="Dodaj do koszyka">
������������������������
</form> ����������������
<?php
}
?>

��������������������������������
��������������������������
�������
Listing 8. Dodanie zamówienia do bazy danych
<?php
include 'config.php';
���

//sprawdzamy, czy u¿ytkownik jest zalogowany


if(isset($_SESSION['user']->id))
{
header("location:login.php"); ������������������������������
exit;
}

//uzupe³niamy dane zamówienia


$_SESSION['order']->userid = $_SESSION['user']->id; ���
$_SESSION['order']->date = now();
$_SESSION['order']->status = '';
$_SESSION['order']->add(); �������������������

//kasujemy zawartoϾ koszyka


unset($_SESSION['order']);

//przekierowujemy klienta na stronê z podziêkowaniami �������������������������


header("location:thanks.html");
exit;
?>

Rysunek 3. Proces zakupów

26 11/2008
Sklep internetowy w PHP i SQLite

Spis towarów… readdir() otwieramy folder ze zdjęciami i szu- ka nie obsługuje Cookies – dodając do adre-
…będzie pierwszą rzeczą którą zobaczy kamy plików, które rozpoczynają się od tych su parametr. Jednak najlepsze w tym rozwią-
klient po wejściu do naszego sklepu. Dodat- znaków. Jeśli warunek ten jest spełniony – wy- zaniu jest to, że nie musimy w ogóle przejmo-
kowo będzie to najprawdopodobniej strona świetlamy zdjęcia na stronie. wać się szczegółami implementacji tego me-
która będzie najczęściej wyświetlana. Dla- Ponownie, ze względu na ograniczoną obję- chanizmu – wszystko załatwia PHP. Jedy-
tego należy zadbać, aby była czytelna. Nie tość artykułu, po pełen kod skryptu odsyłamy ne o co musimy zadbać, to wystartowanie
powinniśmy więc przeładowywać jej ma- na http://sdjournal.org mechanizmu sesji – realizujemy to funkcją
ło przydatnymi informacjami – wystarczy session_start().
wyświetlić nazwę, początek opisu oraz cenę Minuta 45 – koszyk zakupów W plikach sesyjnych możemy przechowy-
– to właśnie nią kieruje się większość użyt- Jednym z najbardziej charakterystycznych wać dowolny typ danych, mogą to być proste
kowników. Oczywiście informacje wyświe- rzeczy w sklepach internetowych są niewąt- zmienne, tablice, a nawet obiekty – ograni-
tlane w naszym sklepie są tylko przykładem pliwie koszyki. To one będą przechowywać czają nas wyłącznie nasze potrzeby oraz wy-
– ostateczny wygląd strony zależy od Czy- informację o produktach, które klient zde- obraźnia.
telnika. cydował się kupić (zarówno o samym pro- My do budowy koszyka wykorzysta-
Listing 5 przedstawia gotowy skrypt. Na po- dukcie jak i ilości zamówionych egzempla- my utworzoną wcześniej klasę order, któ-
czątku łączymy się z bazą – jeśli połączenie się rzy). Poprawne skonstruowanie koszyka jest ra przechowuje informacje o zamówieniu.
nie uda, wykonywanie skryptu zostanie prze- bardzo ważne – w koszyku nie mogą pojawić W rzeczywistości będziemy korzystać tylko
rwane. Po połączeniu z bazą pobieramy z ba- się zakupy kogoś innego, nie mogą one rów- z pola orderproducts, które jest tablicą za-
zy danych wszystkie kategorie oraz tworzymy nież zniknąć. mówionych obiektów.
tablicę dwuwymiarową w której przechowuje- Podstawowa zasada jest więc prosta – na- Aby dodać nowy produkt do koszy-
my pary – nazwa kategorii oraz jej unikalny leży zagwarantować każdemu klientowi wła- ka stworzyliśmy dodatkową metodę –
identyfikator numeryczny. Dane te wyświe- sny koszyk. Można to oczywiście zrobić na addproduct(). Przyjmuje ona 2 parametry
tlamy w bloku <div> o nazwie categories. wiele (lepszych lub gorszych) sposobów. Ko- – ID dodawanego towaru oraz jego ilość.
Umożliwi to prostą zmianę wyglądu sekcji szyk każdego klienta może być plikiem prze- Gdy klient złoży zamówienie, wystarczy
(i całego sklepu) przy użyciu zewnętrznego ar- chowywanym w jednym z folderów sklepu. uzupełnić obiekt danymi zamówienia i wywo-
kusza stylów. Może być również wpisem w bazie danych. łać metodę add() która doda zamówienie do
Przy wyświetlaniu strony należy spraw- W obu przypadkach należałoby wybrać bazy danych. Oczywiście, możemy to wykonać
dzić, czy klient wybrał już kategorie. Ponie- pewną unikalną cechę klienta, która sta- tylko wtedy, gdy klient jest zalogowany – je-
waż informacja o kategorii przesyłana jest nowiłaby jego identyfikator. Pewnie część śli nie, przekierowujemy go na odpowiednią
jako parametr w adresie, wystarczy spraw- czytelników zaproponowałaby, aby takim stronę. Cały proces dokonywania zamówienia
dzić wartość tej zmiennej. Jeśli użytkownik identyfikatorem był adres IP komputera przedstawiony jest na Listingu 8.
niczego nie wybrał – wyświetlamy komu- z którego korzysta użytkownik. Niestety ad-
nikat powitalny zachęcający do obejrzenia resu nie możemy wykorzystać – istnieją roz- Podsumowanie
naszej oferty. Jeśli kategoria jest wybrana – wiązania, które umożliwiają współdzielenie Właściwie mamy już działający sklep. Klient
pobieramy z bazy danych identyfikatory pro- adresu IP pomiędzy wieloma komputerami może przeglądać oferowane przez nas produk-
duktów należących do tej kategorii oraz two- (najpopularniejsze to proxy oraz NAT). Je- ty, dodać je do koszyka i ostatecznie jeśli zde-
rzymy obiekt klasy products , który wykorzy- śli dwóch naszych klientów korzystałoby cyduje się na zakup – zamówić je. Oczywiście,
stując metodę load() wypełnia wszystkie po- z takiej sieci nie jesteśmy w stanie rozróżnić nie jest to pełna funkcjonalność sklepu – po-
la klasy danymi produktu, które następnie są ich koszyków. winieneś stworzyć jeszcze moduł dla obsługi
wyświetlane. Innym rozwiązaniem jest wykorzysta- sklepu, który będzie wyświetlał złożone za-
nie mechanizmu ciastek (cookies) do prze- mówienia, umożliwiał tworzenie kategorii
Szczegóły produktu chowania informacji o zawartości koszyka. oraz dodawanie towaru.
Po wybraniu interesującego produktu kliento- Rozwiązanie to jest jednym z lepszych, choć Nie powinno to jednak sprawić Ci już naj-
wi powinny wyświetlić się dokładniejsze infor- również nie jest pozbawione wad. Nie może- mniejszego problemu – wystarczy wykorzy-
macje – między innymi pełen opis, cena oraz my bowiem zagwarantować, że każdy nasz stać metody load() oraz add() z odpowied-
wszystkie dostępne zdjęcia. Wyświetlenie da- klient będzie miał włączoną obsługę ciastek niej klasy. Jeśli jednak nie będziesz czegoś
nych przedmiotu nie powinno Ci już sprawić w przeglądarce. Co prawda odsetek takich pewien – zachęcamy do przejrzenia kodu
żadnego problemu – również tutaj tworzymy ludzi jest coraz mniejszy, jednak nie oznacza pełnego skryptu, umieszczonego na stronie
nowy obiekt typu product podając jako para- to, że ktoś z tej grupy nie będzie chciał sko- http://sdjournal.org.
metr id projektu przesyłane w adresie. Trud- rzystać z sklepu. Odrzucamy to rozwiązanie Kod jest dosyć szeroko skomentowany, sta-
niejsze może wydawać się wyświetlenie wszyst- również z innego powodu – w PHP od daw- nowi więc dosyć dobre uzupełnienie niniejsze-
kich zdjęć produktu. na istnieje mechanizm nie posiadający wspo- go artykułu.
Kod realizujący to zadanie przedstawiony mnianych wcześniej wad. Mowa oczywiście
jest na Listingu 6. o sesjach, których zasada działania jest po-
Przypomnijmy – przyjęliśmy, że obrazki łączeniem zasad metod wcześniej wymie-
produktu o określonym id mają nazwę: id_ nionych.
(numer). Używając funkcji opendir() oraz Dla każdego użytkownika generowany jest GRZEGORZ HIBNER
plik, w którym przechowywać możemy da- Autor jest studentem Politechniki Poznańskiej
ne. Dodatkowo każdy użytkownik posiada i pracownikiem firmy zajmującej się consultingiem
W Sieci unikalny identyfikator sesji (PHPSESSID) IT. Z PHP związany jest od pierwszych wersji PHP4.
• http://www.php.net który pozwala na przyporządkowanie plików Interesuje się szeroko pojętym programowaniem
• http://www.sqlite.org konkretnym użytkownikom. Identyfikator (PHP, C/C++, C#, JAVA), bazami danych oraz za-
ten jest przesyłany pomiędzy podstronami rządzaniem projektami.
wykorzystując ciastka, lub – jeśli przeglądar- Kontakt z autorem: grzegorz.hibner@gmail.com

www.sdjournal.org 27
E-commerce

Wydajny, elastyczny
i przyjazny CMS
Poznajemy Textpattern cz.1
TXP nie jest tak popularny jak np. Joomla. Nie posiada tak rozbudowanej
listy plugin'ów i dodatków. Mniej znany, nie oznacza jednak gorszy czy też
mniej wydajny. Stanowi ciekawą alternatywę i chociażby tylko ze względu
na to warto poszerzyć horyzonty i przyjrzeć się rozwiązaniu bliżej. Niniejszy
artykuł pełni rolę wprowadzenia.
Zalecany jest również serwer Apache od wer-
Dowiesz się: Powinieneś wiedzieć: sji 1.3 lub 3.0 z włączonym modułem wsparcia
• Zdobędziesz podstawową wiedzę na temat • Znać podstawy XHTML, CSS i PHP; dla przyjaznych linków (clean URLs) mod_rew-
CMS Textpattern; • Posiadać podstawową wiedzę na temat ser- riter.
• Dowiesz się jak zainstalować i przygotować werów WWW oraz witryn internetowych zbu- Po szczegółowe informacje odnośnie wyma-
TXP do pracy, skonfigurować podstawowe i dowanych w oparciu o system CMS; gań warto zajrzeć na domową stronę projektu
zaawansowane opcje. • Orientować się w tematyce budowy wydaj- http://www.textpattern.com.
nych stron WWW. W dalszej części zakładam, iż posiadamy za-
instalowane, skonfigurowane i działające środo-
wisko dla TXP.
figurowaniu, mógł cieszyć się własną witryną
WWW. Dla szukających szybkiej i w miarę bez- Licencjonowanie
Poziom trudności bolesnej metody na zaistnienie w Sieci to zna- TXP jest darmowym rozwiązaniem open sour-
komite rozwiązanie, które porównałbym do ce objętym licencją GNU GPL (General Public
mieszkania w stanie pod klucz. License). Oznacza to, że możemy zarówno w ce-
Po odmalowaniu, wyłożeniu wykładziny, lach komercyjny jak i prywatnych wykorzysty-

T
extpattern to darmowy, elastyczny, ele- umeblowaniu możemy cieszyć się własnym wać, dystrybuować i modyfikować CMS.
gancki, łatwy w użyciu system zarządza- kątem. TXP natomiast przedstawiłbym jako Należy pamiętać, iż zewnętrzne rozwiązania
nia treścią. Informację taką znajdziemy mieszkanie w stanie surowym, w którym mo- zwiększające funkcjonalność TXP, plugin'y, do-
na oficjalnej stronie projektu i chyba jest to naj- żemy zdecydować o ilość i układzie pokoi, bu- datki itp. mogą być objęte odrębnymi warunka-
trafniejsza definicja której słuszności mam na- dowie ścianek działowych, lokalizacji pomiesz- mi licencyjnymi.
dzieję dowiodę. czeń. Od wersji 4.1 planowane jest objęcie TXP li-
Owszem, jest wiele innych systemów CMS, TXP oferuje większą swobodę. Dostajemy cencją BSD (Berkley Software Distrybution).
które możemy objąć podobną definicją. Dlate- solidny i stabilny szkielet na którym realizuje- Zgodnie z zasadami licencji Textpattern
go warto wspomnieć o tym co odróżnia Texpat- my naszą wizję. W minimalnym stopniu ogra- nadal pozostanie darmowym rozwiązaniem.
tern (w skrócie TXP) od innych systemów za- niczona jest wolność twórcza. Dzięki zastoso- Zasady licencji BSD czynią zasady korzystania
rządzania treścią. waniu przejrzystej składni opartej o charakte- nawet bardziej liberalnymi.
Podobnie jak inne znane rozwiązanie te- rystyczne znaczniki, dokonanie zmian odbywa
go typu TXP wykorzystuje PHP, XHTML, ar- się w intuicyjny i prosty sposób. Proces instalacji
kusz CSS oraz bazę danych MySQL. Tak jak in- Ściągamy paczkę instalacyjną z witryny projekt.
ne systemy zarządzania treścią może wykorzy- Instalacja Rozpakowaną zawartość kopiujemy do wybra-
stać TXP do budowy witryny firmowej, porta- Do prawidłowej instalacji, TXP wymaga działa- nego katalogu naszego serwera w obrębie któ-
lu korporacyjnego czy prywatnego bloga. jącej platformy LAMP w postaci tria serwerów rego powstawać będzie nasza witryna np. http:
Różnice odnajdziemy kiedy rozpoczniemy – WWW, PHP i MySQL. //localhost/cms
pracę nad budową własnej witryny w oparciu Minimalne wymagania to PHP w wersji W oknie przeglądarki wpisujemy adres na-
o prezentowane rozwiązanie. Wiele z systemów 4.3 lub wyższej wraz z obsługą MySQL (my- szej lokalizacji wskazując na podkatalog textpat-
CMS z którymi się spotkałem oferowało możli- sql extension) i XML (XML extension) , serwera tern, http://localhost/cms/textpattern/.
wość łatwego wprowadzania treści, dodawania baz danych MySQL w wersji 3.23 lub wyższej. Pojawia się ekran powitalny na którym musimy
artykułów oraz podstron. Rekomendowane jest posiadanie PHP od wersji dokonać wyboru domyślnego języka. TXP posia-
Nie będąc zawodowym webmasterem użyt- 4.4.1 lub od wersji 5.0.2 oraz MySQL w wersji da wsparcie dla języka polskiego, jednak wybierz-
kownik, po zainstalowaniu i wstępnym skon- 4.2.7 lub wyższej. my język angielski. Uczyni to zdobytą wiedzę bar-

28 11/2008
Wydajny, elastyczny i przyjazny CMS

dziej uniwersalną, poza tym większość dokumen- podczas normalnej pracy z witryną np. konfigura- nia, ustawiamy kiedy chcemy aby nasz projekt
tacji dostępna jest w języku angielskim. cja, zamiany ustawień, modyfikacja treści. ujrzał światło dzienne.
W następnym oknie musimy podać nazwę Oba statusy powodują wyświetlanie infor- Use textile – opcja definiuje domyślny edy-
użytkownika MySQL, hasło, adres serwera My- macji o czasie budowy poszczególnych pod- tor TXP. Textile jest ciekawym rozwiązaniem
SQL oraz nazwę istniejącej bazy danych (pro- stron, ilości wysłanych zapytań MySQL oraz znacznie upraszczającym budowę treści zgod-
ponuję stworzyć wcześniej pustą bazę np. z wy- zużyciu pamięci. nej z XHTML. Edytor wykorzystuje uproszczo-
korzystaniem phpMyAdmin). W trybie Debugging wszystkie napotkane ną składnię dzięki czemu szybko możemy dodać
Możemy również wprowadzić ścieżkę do in- podczas budowania witryny tagi widoczne są treść, która będzie prezentowana w postaci po-
stalacji (Site path) oraz adres URL (Site URL). również w postaci kodu XHTML. Status Live prawnego kodu XHTML. Pseudokod jest automa-
Pozostawiam domyślne wartości bez zmian i to publikacja w trybie normalnego użytkowa- tycznie formatowany do właściwej postaci.
przechodzimy dalej (Next).
W oparciu o wprowadzone dane zostaje auto-
matycznie wygenerowany skrypt konfiguracyjny.
Zaznaczamy cały kod, za pomocą np. notat-
nika tworzymy plik config.php i wklejamy kod.
Zapisany plik przesyłam na serwer do podkata-
logu textpattern.
Jeśli wykonaliśmy wszystko poprawnie, po
kliknięciu przycisku I did it ukaże się kolejne
okno w którym wprowadzamy dane o admini-
stratorze (Publisher).
Podajemy pełną nazwę użytkownika, login, Rysunek 1. Strona powitalna
hasło oraz istniejący adres email.
Po kliknięciu na przycisk Next zostanie utwo-
rzona odpowiednia struktura. Wstrzymujemy
oddech i naszym oczom ukazuje się informacja
o pomyślnej instancji. Możemy zalogować się
do webowego interfejsu użytkownika.
GUI zorganizowane jest w postaci paneli lub
też zakładek – Content, Presentation, Admin,
View Site. Pod każdą z zakładek kryją się dodat-
kowe panele ze szczegółowymi opcjami konfi-
guracyjnymi.
Przejdźmy do zakładki Admin. Pierwszym
krokiem jest wykonanie diagnostyki instalacji.
Panel podzielony jest na dwie części w pierw-
szej Preflight check otrzymujemy ostrzeżenia ze-
brane po wstępnym sprawdzeniu instalacji.
W oknie Diagnostyki info znajdują się szcze-
gółowe dane dotyczące m.in. konfiguracji ser-
wera WWW, zainstalowanych modułów ser-
wera, ustawień lokalnych itd.

Konfiguracja
Panel konfiguracyjny podzielony jest na trzy Rysunek 2. Konfiguracja dostępu do bazy danych
części Basic, Advanced, Langugae.
W zakładce Language mamy możliwość zde-
finiowania używanego języka, wyboru języków
dodatkowych z dostępnej listy, a także instalacji
pliku zewnętrznego.
Basic zawiera opcje podstawowej konfigura-
cji. Definiujemy Site name (nazwa witryny), Site
slogan (motto), Site URL (domyślny katalog in-
stalacyjny), strefę czasową Time Zone, automa-
tyczną zmianę czasu letni/zimowy, format da-
ty używany przez TXP Data format, oraz for-
mat daty którą opatrzone będą dodawane przez
nas artykuły.
Production status pozwala zdefiniować jeden
z trzech stanów w który aktualnie znajduje się
witryna.
Debugging umożliwia identyfikację problemów
z funkcjonowaniem szablonu, plugin'ów lub do-
danych skryptów. Testing to tryb wykorzystywany Rysunek 3. Wygenerowany skrypt konfiguracyjny

www.sdjournal.org 29
E-commerce

Ustawienie opcji na Convert linebreaks igno- sób zamieszczania komentarzy. W niniejszym Admin
ruje wszystkie znaczniki poza znacznikiem artykule pominąłem omawianie szczegółów
przełamania wiersza. Leave text untouched wy- związanych z publikacją komentarzy. • Image directory – definiuje domyślny kata-
łącza opcje autofrmatowania. Po zapisaniu konfiguracji podstawowej prze- log do którego będziemy zaciągać zdjęcia i
Accept commnets? Włączenie/wyłączenie opcji chodzimy do konfiguracji opcji zaawansowa- ilustracje;
umożliwiającej użytkownikom zamieszczanie nych – Advanced. Opcje konfiguracyjne po- • File directory path – definuje ścieżkę do kata-
komentarzy. Po ustawieniu na Yes, na ekranie dzielone są na kilka części. Omówię te najważ- logu przechowywania zaciągniętych plików;
pojawiają się dodatkowe opcje definiujące spo- niejsze. • Use ISO-8859-1 encoding in e-mails sent (de-
fault is UTF-8) – zmiana kodowania w ge-
nerowanych wiadomościach e-mail.

Style

• Use raw editing mode by default? Ustawienie


opcji na Yes spowoduje, że do edycji arku-
sza stylów wykorzystywany będzie edytor
z wyłączonym autoformatowaniem, praca
będzie odbywała się z surowym kodem.

Do dyspozycji mamy również edytor organizu-


jący arkusz stylów do postaci tabeli, grupującej
selektory i klasy w przejrzystą formę. Aby użyć
edytora Textpattrern zmieniamy opcje na No.

Publish
Najważniejsze z punktu widzenia prawidłowe-
go i bezpiecznego funkcjonowania witryny są
opcje zawarte w sekcji Publish.

Rysunek 4. Wprowadzenie danych użytkownika • Prevent widowed words in article titles? Włą-
czenie opcji zapobiega powstawaniu jed-
nowyrazowych linii w tytułach artyku-
łów. Jeśli TXP wykryje, iż w tytule wystą-
pi przełamanie wiersza pomiędzy przed-
ostatnim, a ostatnim wyrazem automa-
tycznie zostaje dodany odpowiedni znacz-
nik XHTML. Dwa ostanie wyrazy będą
traktowane jako jeden;
• Artricle use excerpts? Definiuje czy artyku-
ły będę opatrzone skrótami tzw. zajawka-
mi których rozwinięcie stanowi właściwy
artykuł;
• Allow from override? Kiedy opcja jest włą-
Rysunek 5. Ekran logowania
czona możemy wybranym artykułom
nadać odmienny format bez konieczno-
ści separowania poprzez umieszczania w
osobnych sekcjach;
• Send „lats-Modified” header? Włączenie
opcji powoduje, że do przeglądarki odwie-
dzającego wysłane zostaje zapytanie o wer-
sje witryny przechowywanej w cash'u. Je-
śli witryna nie zmieniła się Textpattern
nakazuje przeglądarce korzystanie z wersji
znajdujące się w cash'u. Rozwiązanie po-
zwala ograniczyć czas ładowania witryny
oraz zmniejszyć zapotrzebowanie na prze-
pustowość łącza klienta;
• Attach titles permalinks? Zaznaczenie powo-
duje, że Textpattern tworzy przyjazne linki
w oparciu o nazwę artykułu. Opcja wyma-
ga włączonej obsługi przyjaznych linków;
• Ping Textpattern? Zaznaczenie umożliwia po-
wiadomienie zespołu Textpattern.com o fakcie
Rysunek 6. Konfiguracja opcji podstawowych istnienia i działania naszej witryny w Sieci;

30 11/2008
Wydajny, elastyczny i przyjazny CMS

• Ping ping-o-matic.com? Wysyłanie powia- kułów, co jest wbrew postulatowi o od- tworzenia, usuwania i edycji uprawnień
domień do wyszukiwarek o aktualizacji dzieleniu warstwy logicznej od warstwy innych użytkowników;
strony za pośrednictwem serwisu http:// prezentacji; • Copy Editor – może modyfikować artyku-
pingomatic.com/; • Allow raw PHP? Zalecane jest wyłączenie ły, odnośniki, komentarze użytkowników
• Logs expire after how many days? Wyrażony funkcjonalności. Rozwiązanie przydatne witryny, ponadto posiada uprawnienia do
w dniach okres przechowywania logów o w sytuacji upgrade witryny z wersji wcze- zmiany szablonu i formularzy;
odwiedzających w bazie danych TXP; śniejszych, gdzie kod PHP stosowany był • Staff Writer – tworzy, edytuje, publikuje i
• Maximum URL length (in characters). Defi- jawnie w treści artykułów. usuwa artykuły. Może zaciągać ilustracje i
niuje maksymalną długość adresów URL. zdjęcia;
Przydatna opcja zabezpieczająca witrynę Dodawanie nowego użytkownika • Freelancer – może tworzyć i edytować ar-
przed atakami typu przeładowanie bufora Przejdźmy do zakładki Users. Oprócz zmia- tykuły oraz zmieniać ich status. Publikacja
przy użyciu ekstremalnie długich linków; ny danych dodanego wcześniej administratora wymaga jednak akceptacji użytkownika o
• Use plugins? Włączenie obsługi plugin'ów. (nazwa, email, nowe hasło, uprawnienia) ma- roli Managing Editor lub Publisher;
Warto wyłączyć w przypadku konieczno- my możliwość dodania nowych użytkowników • Designer – odpowiada za kreację wyglądu
ści identyfikacji problemów z funkcjono- o zróżnicowanych prawach dostępu. witryny. Posiada pełen dostęp do szablonu
waniem witryny; oraz stylów CSS. Nie może jednak zmie-
• Use admin-side plugins? Włączenie/wyłączenie • Publisher – użytkownik o pełnych upraw- niać publikowanej treści.
plugin'ów interfejsu administratora. nieniach. Może tworzyć, edytować i usu-
• Allow PHP in pages? Włączenie funkcjonal- wać artykuły, a także zarządzać komen- Pozostałe panele
ności umożliwi użycie kodu PHP w sza- tarzami i odnośnikami. Publisher może Zakładka Visitor Logs nie wymaga szerszego omó-
blonie witryny po umieszczeniu w znacz- zmienić status artykułów, konfigurację wienia. Mamy możliwość przeglądania zebranych
nikach <txt:php>...</txp:php>; witryny, zarządzać sekcjami i artykułami logów, filtrowania zawartości i szczegółowego wy-
• Allow PHP in articles? Opcja nie zalecana oraz zarządzać użytkownikami; szukiwania informacji o odwiedzających.
ze względów bezpieczeństwa. Umożli- • Managing Editor – posiada podobne Plugins umożliwia instalację dodatków. Pro-
wia stosowanie kodu PHP w treści arty- uprawnienia co Publisher za wyjątkiem ces instalacji jest specyficzny i polega na wkleje-
niu odpowiedniego kodu w polu Install plugin i
zaciągnięciu na serwer (Upload).
Bardzo ciekawą funkcjonalność oferuje za-
kładka Import. Mamy możliwość importowa-
nia zawartości witryn opartych o inne platfor-
my. W wersji 4.0.6 Textpattern wspiera import
z systemów Movable, WordPress, b2 i Blogger.
Importowaną treść możemy przypisać do od-
powiednich sekcji oraz nadać wybrany status.
Nieco rozczarowuje brak popularnych syste-
mów CMS.

Podsumowanie
Mam nadzieję, że Textpattern zainteresował
Cię drogi Czytelniku. Zapoznałeś się z proce-
sem instalacji oraz szczegółowej konfiguracji.
Wspólnie udało się nam stworzyć szkielet, na
którym zbudujemy witrynę.
Rysunek 7. Konfiguracja opcji zaawansowanych
W następnej części ożywimy nasz projekt do-
dając treść, zmieniając domyślny wygląd po-
przez edycję szablonu i arkusza CSS. Zainstalu-
jemy wybrany plugin i skonfigurujemy witrynę
na nasze potrzeby.

W Sieci
• http://www.textpattern.com – strona do-
mowa projektu

KRYSTIAN RAJSKI
Autor interesuje się tworzeniem aplikacji webo-
wych oraz technologiami internetowymi. Związa-
ny z grupą ProgInn. Na co dzień pracuje jako So-
ftware Test Engineering w firmie ADVA Optical Ne-
tworking.
Kontakt z autorem: krajski@p-innovations.com,
Rysunek 8. Dodawanie użytkowników http://www.p-innovations.com

www.sdjournal.org 31
Programowanie PHP

Opensource-owe
platformy blogowe
Porównanie oparte o PHP i bazy danych

W przeciągu ostatnich lat blogi internetowe zjednały sobie wielką


popularność wśród użytkowników internetu. Przestały być tylko i wyłącznie
formą pamiętników a stały się miejscem wymiany zdań pomiędzy różnymi
środowiskami jak choćby programistów.

Them-y
Dowiesz się: Powinieneś wiedzieć: Wordpress jak wszystkie omawiane w tym ar-
• O najpopularniejszych platformach blogo- • Powinieneś mieć wiedzę na temat zarządzania tykule skrypty posiada system szablonów moż-
wych napisanych w PHP; systemami CMS (instalacja systemów, obsługa liwych do łatwej instalacji. Osoby, które nie
• O ich obsłudze, możliwościach i porównaniu z panelów); mają wiedzy, a które nie chcą korzystać z do-
rozwiązaniami konkurencyjnymi. • Powinieneś znać PHP i umieć konfigurować myślnych, po instalacji mogą pobrać setki, wie-
bazy danych MySQL. le them-ów. Skupię się jednak na omówieniu
kwestii technicznej pracy z szablonami tego
skryptu. Wordpress nie korzysta z systemu sza-
blogów w oparciu o jedną platformę. Jako, że blonów takiego jak Smarty, bądź HTML_Tem-
temat jest obszerny przy omawianiu każdego plate_IT (parser klas Pear). Odbija się to lekko
Poziom trudności ze skryptów chciałbym skupić się na rzeczach na wydajności gdyż mechanizmy cache-owania
podstawowych i najważniejszych a więc kwe- w wymienionych wcześniej systemach znacz-
stia związana z łatwością i intuicyjnością zarzą- nie przyspieszają przetworzenie i wyświetlenie
dzania blogiem, sposobem tworzenia własnych widoków. Kolejnym bardzo poważnym manka-

W
iele firm (np. Microsoft) zaczęło them-ów (sposoby szablonowania), dostępność mentem jest kwestia tego, że wiele słów zaszy-
wykorzystywać platformy blogo- plugin-ów (rozszerzeń), dokumentacja aplika- tych jest na stałe w szablonie. Takie rozwiązanie
we jako formę kontaktu z klien- cji oraz wsparcie techniczne. uniemożliwia łatwą internacjonalizację strony
tem, kontaktu, choć częściowo anonimowe- frontowej i wymaga ręcznej edycji. Włączenie
go, jednak bardziej przyjaznego. Równocześnie Wordpress (wersja 2.3.2) mechanizmu cache-owania możliwe jest przez
wraz z tym boomem rozwinęło się PHP i stało Poczynając od instalacji a na zarządzaniu koń- instalacje dodatkowych rozszerzeń jak plugin
powszechnie stosowanym językiem programo- cząc można śmiało powiedzieć, że Wordpress WP-Cache.
wania w aplikacjach internetowych. Natural- jest skryptem zarówno stabilnym jak i przyja-
nym było, więc, że wiele platform blogowych znym użytkownikowi. Zarówno grafika pane- Plugin-y
powstało właśnie w oparciu o niego i zazwyczaj lu administracyjnego jak i jego filozofia czynią Domyślnie po instalacji mamy możliwość ko-
w sprzężeniu z systemem baz danych MySQL. go bardzo łatwym w opanowaniu i intuicyjnym rzystania z dwóch dostarczonych domyślnie
W temacie artykułu podkreśliłem właśnie tech- w zarządzaniu. Co ważne, a o czym pisałem na plugin-ów.
niki (PHP + bazy danych), na jakich omawiane wstępie, dostosowanie panelu administracyjne- Zamiast jednak opisywać przykładowe z nich,
w artykule blogi bazują. Powodem tego jest go do obsługi w ojczystym języku jest łatwiej- tak w tym skrypcie jak i pozostałych chciałbym
fakt, że konkurencyjne rozwiązania (Perl, Ruby- sza niż strony frontowej, nawet dla osób niezna- się skupić bardziej na teoretycznych kwestiach.
OnRails) również oferują darmowe, opensour- jących PHP. Rozwijanie możliwości bloga przez Jak wiadomo by napisać własne rozszerzenie,
ce-owe platformy blogowe (odpowiednio Mo- wgrywanie własnych them-ów czy plugin-ów potrzebna jest znajomość, co najmniej PHP. Co
vableType, Typo etc.). We wstępie chciałbym również nie przysparza najmniejszych proble- jednak jest jeszcze bardzo ważne to dokumen-
jeszcze wytłumaczyć powody wybrania oma- mów. Dodatkową zaletą jest obszerna i prosta tacja gotowego skryptu, oraz tutoriale, pomaga-
wianych platform. Wordpress i Texpattern są możliwość konfiguracji systemu. Wordpress jące deweloperom w pisaniu własnego plugin-a.
zapewne wielu czytelnikom doskonale znane, został zaprojektowany tak, że doskonale nada- W przypadku Wordpress-a, nie można mieć żad-
jeśli nie z praktyki to chociażby ze słyszenia. wać się może nie tylko jako skrypt typowo blo- nych zastrzeżeń w tych względach. Na oficjalnej
Dwie ostatnie aplikacje wybrałem ze względu gowy, ale również jako bardzo dobry CMS do stronie projektu, umieszczono bardzo wiele in-
na to, iż pracują w trybie Multi – Users (MU), prowadzenia małych i średnich stron interne- formacji na temat rozwoju własnych rozszerzeń
co pozwala na prowadzenie wielu niezależnych towych. a także, co jest ogromnym ułatwieniem, można

32 11/2008
Porównanie opensource-owych platform blogowych

tam znaleźć API przygotowane właśnie pod tym intuicyjnym. Mimo, że na oficjalnej stronie Them-y
kątem. Osoby nieznające PHP, mają szeroki wa- projektu opisywany jest jako CMS a nie platfor- Textpattern dysponuje dość różnym podej-
chlarz dostępnych rozszerzeń, dostępnych całko- ma blogowa, wydaje się jednak, że został stwo- ściem do systemu szablonów. Na stronie,
wicie za darmo a oferujących duże możliwości rzony z myślą o tym drugim przeznaczeniu. Co twórcy zaznaczają, że skrypt nie posiada ta-
rozszerzenia swojego bloga o dodatkową funk- prawda możliwości konfiguracyjne skryptu są kowego systemu jak większość pozostałych
cjonalność. bogate niemniej, dotyczą one przede wszyst- skryptów. Podejściem przypomina bardziej
kim właśnie ustawień związanych z prowadze- serwisy blogowe jak http://www.blox.pl czy
Wsparcie techniczne i dokumentacja niem bloga. To, co na pewno jest istotną kwe- http://www.blogger.com, ze względu na we-
Tak jak pisałem już w poprzednich paragrafach stią i wiele osób może zachęcić, to możliwość wnętrzny system znaczników. Jest to rozwią-
wsparcie techniczne dla opisywanego skryp- wyboru języka zarówno instalacji jak i prowa- zanie ciekawe i wydajne, jednak poważnym
tu nie pozostawia dla mnie nic do życzenia. dzenia bloga już w pierwszym kroku konfigu- ograniczeniem jest fakt, braku pełnej inge-
Podobnie ma się sytuacja z techniczną doku- racji skryptu. Dla osób myślących o wykorzysta- rencji w widoki, bez dokładniejszego pozna-
mentacją (API). Dzięki ogromnej popularno- niu go tylko i wyłącznie jako skrypt blogowy i nia struktury skryptu. Edycja them-ów moż-
ści Wordpress-a osoby nieznające języka angiel- niemyślących o dalszym rozwoju swojej strony, liwa jest z poziomu panelu administracyjne-
skiego, dzięki dobremu suportowi w wielu kra- najpoważniejszym mankamentem wydawać się go, gdzie tak jak napisałem możemy ingero-
jach nie miałyby żadnego problemu z pracą z może tylko ubogi edytor tekstowy WYSIWYG wać zarówno w strukturę HTML/XHTML
tym skryptem. służący do wprowadzania i edycji wpisów. jak i arkusze CSS. Dla Textpattern-a, dostęp-
Tabela 1. Zestawienie platform
Zalety
Wordpress Textpattern b2evolution LifeType
• stabilność skryptu; Wymagania plat- PHP 4+ PHP 4+ PHP 4+ PHP 4+
• intuicyjność i przyjazność środowiska pra- formy MySQL MySQL MySQL MySQL
cy nawet dla niezaawansowanych użyt- Sposób szablono- Pełna możliwość System szablono- Pełna możliwość Pełna możliwość
kowników; wania edycji, jednak w wania ciągle nie edycji szablonów edycji szablonów
• możliwość pisania własnych them-ów z przypadku chę- jest w fazie koń- z ograniczeniami
ci dostępu do cał- cowej i trwają spowodowanymi
samą znajomością PHP (dodatkowo też
kowitego forma- nad nim prace systemem Smarty
API); towania przez au-
• nieduże wymagania (dla omawianej wer- tora wymaga zna-
sji: PHP 4.2, MySQL 4.0, opcjonalnie jomości choćby
mod _ rewrite włączony na serwerze) sys- podstaw PHP
temowe oraz lekkość skryptu; Importowanie obsługa impor- b2, Blogger, Mo- Obsługa między Brak
• duża popularność a co za tym idzie bardzo danych z innych tu z ponad 20 in- vable Type, Word- innymi: Word-
dobre wsparcie techniczne i dokumenta- platform nych platform press Press, Movable
Type, Blogger, Li-
cja, duże możliwości rozwoju skryptu za-
veJournal
równo przez początkujących jak i zaawan-
sowanych użytkowników; Rozmiar skryptu/ średni skrypt/ duży skrypt/dość niewielki skrypt/ duży skrypt/
prędkość wyko- średni czas wyko- szybki czas wyko- szybki czas wyko- średni czas wy-
• możliwość wykorzystania jako pełnego nywania * nania nania nania koanania (moż-
CMS-a. liwość włącze-
nia cache-owania
Wady dzięki szablonom
Smarty)
• co może wydać się niekonsekwencją, jed- Optymalizacja Dobra obsługa Dobra obsługa Dobra obsługa Dobra obsługa
nak ze względu na dużą popularność wie- pod silniki wyszu- przyjaznych URL- przyjaznych URL- przyjaznych URL- przyjaznych URL-
le dostępnych rozszerzeń jest niestabil- kiwarek i, wiele plugin-ów i, istnieją plugin-y i, istnieją plugin-y i, istnieją plugin-y
przydatnych do do optymalizacji do optymalizacji do optymalizacji
nych i napisanych na niskim poziomie; optymalizacji
• brak dobrego sposobu internacjonalizacji
Społeczność/ Bardzo wiele Dość duże gro- Średnie grono Średnie grono
frontu strony;
wsparcie/ użytkowników/ no użytkowni- użytkowników, użytkowników,
• sposób szablonowania ze względu na czy- dokumentacja wsparcie w wie- ków/ ograni- przede wszystkim przede wszystkim
telność oraz wydajność; lu językach, rów- czone wspracie osoby o zaawan- osoby o zaawan-
• obsługa tylko i wyłącznie systemu baz da- nież wspar- w językach po- sowanej wiedzy sowanej wiedzy
nych MySQL; cie komercyjne/ za angielskim/ o PHP i admini- o PHP i admini-
• wiele plugin-ów wykorzystujących Java- bardzo dobra do- obszerna doku- stracji/ ograni- stracji/ ograni-
kumentacja mentacja czone wspracie czone wspracie
Script korzysta z metod niezgodnych z w językach po- w językach po-
wytycznymi DOM level 1 i 2, oraz spe- za angielskim/ za angielskim/
cyfikacji języka JavaScript (ECMAScript) obszerna doku- obszerna doku-
opracowanego przez organizację ECMA; mentacja mentacja
• Wordpress pracujący w trybie MU jest nie- Domyślny format XHTML 1.0 Trans- XHTML 1.0 Trans- XHTML 1.0 Trans- XHTML 1.0 Strict
stabilny, dlatego wyłączyłem jego opis i wyjściowy da- itional itional itional
skupiłem się na możliwościach trybu dla nych
jednego użytkownika. Edytor WYSIWYG Tak Tak Tak Tak
Obsługa kanałów Tak Tak Tak Tak
Textpattern (wersja 4.0.6) informacyjnych
Poczynając od instalacji jak i zarządzaniu same- RSS/Atom
go panelu Textpattern również jest skryptem * testy przeprowadzone przy użyciu rozszerzenia Xdebug

www.sdjournal.org 33
Programowanie PHP

nych jest wiele gotowych tematów, z których • wbrew oficjalnemu opisowi skrypt nie po- mniejszą ilość informacji do znalezienia w in-
niektóre znaleźć można w odnośnikach na siada bogatych możliwości jako CMS i na- ternecie.
końcu artykułu. daje się raczej na platformę blogową;
• mocno strukturalny kod co w pewien spo- Wsparcie techniczne i dokumentacja
Plugin-y sób ogranicza możliwość rozwoju w szyb- Niestety, jak pisałem na początku, po poja-
Decydując się na pracę z Textpattern-em z jednej ki i łatwy sposób; wieniu się dość poważnego problemu nie
strony możemy być zaskoczeni lekkością skryp- • brak dobrego systemu szablonowania uzyskałem pomocy. Mimo iż b2evolution
tu, jego minimalizmem i łatwą obsługą, z dru- o pełnych możliwościach. wydaje się wyjątkowo wielojęzycznym skryp-
giej możliwościami, jakie daje przy prowadze- tem to dokumentacja choć dobrze przygoto-
niu bloga. Właśnie dzięki plugin-om, o bardzo b2evolution (wersja 2.4.0) wana, dostępna jest zaledwie w dwóch języ-
dużych możliwościach jest to osiągalne. W mo- Tak jak w pozostałych platformach tak i w kach w tym oczywiście w języku angielskim.
mencie powstawania artykułu na równoległej przypadku b2evolution instalacja jest bar- Ocena powyższa jak powiedziałem opiera się
do strony http://www.textpattern.com witrynie dzo prosta i przebiega w trybie graficznym. mniej na własnym doświadczeniu, bardziej
http://www.texpattern.org można było znaleźć Ze względu na tryb MU jako główne prze- na informacjach przeczytanych w internecie.
prawie pięćset rozszerzeń i plugin-ów dla opi- znaczenie tego skryptu, panel administra- To samo dotyczy listy zalet i wad jakie przed-
sywanego skryptu. Osoby zainteresowane pisa- cyjny jest już jednak dużo bardziej zaawan- stawiam.
niem własnych dodatków, również dostępnych sowany. Niestety po zainstalowaniu pojawia
jest wiele tutoriali i dobra dokumentacja skryp- się problem z polskimi znakami. Mimo, że Zalety
tu. Również ciekawą kwestią jest sposób pracy z w wykazie dostępnych kodowań i języków
plugin-ami opierający się też o autorski dla Text- znajduje się język polski niestety nawet po • możliwość pisania własnych them-ów z sa-
pattern-a system znaczników/tagów. Więcej in- jego wybraniu blog niepoprawnie interpre- mą znajomością PHP (dodatkowo API);
formacji na ten temat można znaleźć w linkach tował polskie znaki. Na oficjalnym forum su- • duże możliwości administracyjne;
na końcu artykułu. portu również nie udało mi się znaleźć roz- • jak na specyfikę przeznaczenia (tryb MU)
wiązania, stąd opis poniższych możliwości duża ilość them-ów i plugin-ów;
Wsparcie techniczne i dokumentacja opieram na dyskusjach jakie znalazłem w in- • czytelna i bogata dokumentacja;
Na oficjalnej stronie skryptu, możemy zna- ternecie oraz dokumentacji skryptu. Prze- • popularność w swojej kategorii;
leźć odnośniki do pełnej dokumentacji stwo- glądając panel administracyjny w pierw- • możliwość obsługi kilku systemów baz da-
rzonej przez użytkowników i twórców Text- szym momencie, można mieć duże proble- nych.
pattern-a, która została nazwana TextBook i za- my z ogarnięciem wszystkich jego możliwo-
wiera wszystkie niezbędne informacje zarów- ści. Zagłębiając się dalej, łatwo jednak od ra- Wady
no dla początkujących jak i zaawansowanych zu rozpoznać ogromne możliwości jakie da-
użytkowników. Dokumentacja w dniu powsta- je b2evolutions. Można stwierdzić, że duży • mała popularność w porównaniu z plat-
wania artykułu dostępna była w kilkunastu ję- nacisk położono na bezpieczeństwo skryp- formami dla trybów blogowych przezna-
zykach (bez języka polskiego). Na temat Texpat- tu choćby po tym jak wiele opcji zarządza- czonych dla jednego użytkownika;
tern-a została napisana również książka: Text- nia uprawnieniami użytkowników oferuje • brak dobrego wsparcia na oficjalnym fo-
pattern, Solutions, która jest uznana za oficjal- panel. Oczywiście poza wieloma możliwo- rum suportu przy bardziej skomplikowa-
ną dokumentację dostępną w formie książko- ściami ustawień samego trybu MU przez ad- nych zagadnieniach;
wej. Pozycja ta jest w pełni dostępna i możliwa ministratora również wiele ustawień doty- • niewiele informacji w języku innym niż
do nabycia w internecie. czy samego sposobu prowadzenia konkret- angielski;
nego bloga. • duży brak kompatybilności pomiędzy
Zalety wersjami.
Them-y
• stabilność skryptu; System szablonów b2evolution spośród 4 LifeType (wersja 1.2.5)
• intuicyjność i przyjazność środowiska na- opisywanych tu platform najbliższy jest po- LifeType jest skryptem wymagającym zdecy-
wet dla niezaawansowanych użytkowni- dejściu jakie oferuje Wordpress. Różnicą na dowanie większej wiedzy w porównaniu za-
ków; pewno jest użycie słownika do łatwiejszej in- równo z Wordpress-em jak i Texpattern-em.
• lekkość skryptu; ternacjonalizacji strony frontowej. Tutaj jed- Choć miałem raczej opisywać ogólnie pewne
• zaawansowane możliwości jako skrypt blo- nak znów natrafiłem na problem, mimo usta- aspekty a nie wnikać w szczegóły chciałbym
gowy; wienia jakiegokolwiek z dostępnych języków, jednak podsunąć pewne rozwiązanie dla osób
• wiele dostępnych them-ów i plugin-ów; zarówno front strony jak i panel administra- instalujących skrypt po raz pierwszy. Otóż w
• szeroki zakres języków instalatora dla pa- cyjny nie zareagowały na zmienione usta- pliku wizard.php, czyli skrypcie instalacyjnym
nelu i bloga; wienia. Plusem jest spora ilość darmowych bloga w linii siódmej znajduje się następujący
• bogata dokumentacja i duża ilość artyku- them-ów do ściągnięcia z oficjalnej strony zapis: set_time_limit (5 * 3600), zapobie-
łów poświęconych Textpattern-owi; platformy. ga on samoczynnemu wykonywaniu się po-
• ze względu na strukturę kodu, skrypt jest szczególnych czynności w czasie instalacji je-
bardzo wydajny i szybki. Plugin-y żeli trwają powyżej określonego czasu. Insta-
W przypadku plugin-ów, b2evolution również lowałem LifeType-a lokalnie oraz na serwerze
Wady oferuje na swojej stronie duży wybór. Podzielo- firmy home.pl w obydwu przypadkach zapis
ne są zarówno kategoriami jak i wersjami wy- ten niestety powodował zatrzymanie proce-
• mniejsza popularność w porównaniu do dania. Co bardzo ważne dokumentacja wspo- su instalacji w momencie tworzenia i wypeł-
Wordpress-a również jeśli chodzi o zaple- magająca tworzenie własnych rozszerzeń jest niania tabel w bazie. Polecam więc zakomen-
cze programistyczne; bardzo szczegółowa. Brak natomiast jest do- towanie tej linii.
• obsługa tylko i wyłącznie systemu baz da- brych tutoriali, a względna popularność plat- Przechodząc do panelu administracyjne-
nych MySQL; formy (tryb MU), powoduje również znacznie go użytkownik z prawami administratora za-

34 11/2008
Porównanie opensource-owych platform blogowych

pewne szybko zwróci uwagę na to, że autorzy stronie jest ich bardzo niewiele i również w Zalety
skryptu główny nacisk, jeśli chodzi o możli- internecie ciężko jest znaleźć takowe.
wości konfiguracyjne postawili na zarządza- • stabilność skryptu;
nie możliwościami bloga przez administra- Plugin-y • dobra dokumentacja skryptu (język angiel-
tora dając mu wiele opcji. Z tych najważniej- Jak pozostałe skrypty, LifeType posiada dobrą ski);
szych ale i kierowanych do osób z pewnym dokumentację dla osób chcących wykonać wła- • w swojej klasie nie posiada dużej konku-
doświadczeniem wymienię np. możliwości sne rozszerzenia. API skryptu jest udokumen- rencji;
ustawienia cache-owania zarówno szablonów towane w pełni (nie w języku polskim), brak • duży nacisk postawiony na bezpieczeń-
Smarty (system szablonowania LifeType-a), natomiast szerszej sekcji z tutorialami odno- stwo;
cache-owania przez HTTP, czy ze względów śnie budowy plugin-ów. Podobnie jak w przy- • bogate możliwości dla administratora (sys-
bezpieczeństwa uniemożliwienie edycji i padku them-ów, tak i jeśli chodzi o plugin-y dla tem zarządzania blogami oraz użytkowni-
tworzenia skryptów PHP właśnie w szablo- LifeType-a nie ma ich wielu, natomiast bez pro- kami);
nach jak i w samym skrypcie. Jeśli natomiast blemu można znaleźć te najbardziej powszech- • system szablonów oparty na Smarty.
chodzi o możliwości konfiguracyjne samego ne jak chociażby chmura tagów lub ogranicze-
bloga i kwestie, które najbardziej powinny za- nie dostępu do bloga osobom nieupoważnio- Podsumowanie
interesować przeciętnego użytkownika, Life- nym przez weryfikację hasłem. Powyższy artykuł napisany został z zamia-
Type oferuje tylko te podstawowe, co dla wie- rem przedstawienia czytelnikom najpopu-
lu użytkowników może okazać się zniechęca- Wsparcie techniczne i dokumentacja larniejszych systemów blogowych wraz z ich
jące. Dodatkowo, w wersji, którą opisuję nie Mimo dobrej dokumentacji w języku angiel- docelowym przeznaczeniem, stąd też celowe
ma zarówno spolszczenia dla frontu jak i pa- skim, ze względu na popularność zarówno ofi- rozgraniczenie na systemy napisane dla try-
nelu administracyjnego, szczegóły jednak opi- cjalne forum skryptu jak i informacje możli- bu single/multi user/s. Oczywiście istnieje du-
szę poniżej. we do znalezienia w internecie mogą zniechę- żo alternatywnych rozwiązań i platform ta-
cić wielu użytkowników do rozpoczęcia pracy kich jak np. Serendipity czy boastMachine,
Them-y z LifeType-m. Zdecydowanie jest on przezna- które jednak ze względu na popularność ce-
LifeType co napisałem we wstępie korzysta czony dla osób posiadających wiedzę zarów- lowo ominąłem. Tekst ma być podpowiedzią
z szablonów Smarty. Nie chciałbym wnikać no jeśli chodzi o PHP jak i administrację CMS- dla osób, które stojąc przed wyborem instala-
i skupiać się na wadach i zaletach tego po- ami. Na stronach w języku polskim próżno szu- cji jakiegoś rozwiązania chciałyby mieć ogól-
dejścia, gdyż nie tego dotyczy artykuł i wie- kać jakichkolwiek informacji na temat skryp- ne spojrzenie na możliwości prezentowane
le na ten temat zostało już napisane. W przy- tu, w języku angielskim jak wspomniałem sy- przez poszczególne platformy, dlatego też
padku użytkowników nieposiadających do- tuacja jest podobna. Rozwiązaniem pozostaje celowy podział przy każdym opisie na kwe-
świadczenia w architekturze Smarty, wyko- w tym względzie poświęcenie się lekturze wi- stie najważniejsze w pracy z opisanymi sys-
nanie własnego them-u nie powinno jednak ki jak i dokumentacji API w przypadku chęci temami. Warto podkreślić jednak, że podob-
przysporzyć większych trudności. Konstruk- poważnych zmian podstawowej funkcjonalno- nie jak w przypadku CMS-ów, kierując się
cja nie jest skomplikowana i łatwo (posiada- ści skryptu. wyborem jakiegoś rozwiązania najlepiej jest
jąc choć podstawową wiedzę z programowa- dobrać skrypt w oparciu o docelowe wyma-
nia w PHP) można na zasadzie porównania Wady gania stawiane przez klienta bądź użytkow-
z domyślnym szablonem wykonać swój wła- nika. Niekoniecznie więc decyzja na insta-
sny. Dodatkowym atutem jest użycie w sza- • nieduża ilość gotowych them-ów oraz plu- lację bardzo rozbudowanej platformy blo-
blonach mechanizmu słownika (i18n) przez gin-ów; gowej będzie słuszną decyzją w przypadku
co spolszczenie można dokonać dodając od- • dokumentacja przede wszystkim w języku kiedy użytkownik oczekuje prostoty, lekko-
powiedni plik do folderu z tłumaczeniami a angielskim; ści i intuicyjności a duża część dostępnych
następnie ustawić go z poziomu panelu ad- • niewiele tutoriali oraz artykułów dotyczą- możliwości nie będzie wykorzystana. Dla-
ministracyjnego. Użycie szablonów Smarty cych LifeType-a; tego właśnie warto czasem rozważyć decy-
umożliwia ustawienie dla nich wielu opcji, • nieduże możliwości administracyjne sa- zję wyboru chociażby bardzo popularnego
jak choćby system cache-owania, o którym pi- mym blogiem; Wordpress-a na rzecz lekkiego i bardzo przy-
sałem powyżej. Jeśli chodzi o gotowe szablo- • obsługa tylko i wyłącznie systemu baz da- jaznego Textpattern-a. Z drugiej strony pro-
ny dedykowane blogowi niestety na oficjalnej nych MySQL. gramiści bądź webmasterzy mający wykonać
serwis blogowy dla wielu użytkowników, po-
winni dobrze zapoznać się z platformami
W Sieci b2evolution i LifeType ze względu na róż-
norodność opcji administracyjnych. Artykuł
• http://www.problogger.net/archives/2006/02/15/choosing-a-blog-platform/ – tekst poświęco-
nie miał na celu zasugerowania lepszego roz-
ny wyborowi platformy blogowej (EN);
• http://www.siteground.com/choose_blog_tool.htm – porównanie platform blogowych (EN); wiązania, a wszystkie opisane platformy ma-
• http://txpmag.com/article/textpattern-versus-wordpress – porównanie platform Wordpress i ją zarówno rzesze zwolenników jak i prze-
Textpattern (EN); ciwników. Zakończeniem artykułu są linki
• http://asymptomatic.net/blogbreakdown.htm – porównanie wielu platform blogowych (EN); do stron związanych z omówionymi w tek-
• http://www.ojr.org/ojr/images/blog_software_comparison.cfm – porównanie wielu platform ście zagadnieniami.
blogowych (EN);
• http://unblogbar.com/software/ – porównanie wielu platform blogowych (DE);
• http://www.weblogmatrix.org/ – porównanie wielu platform blogowych (EN);
• http://wordpress.org/ – oficjalna strona platformy Wordpress (EN); LECH ALBRZYKOWSKI
• http://textpattern.com/ – oficjalna strona platformy Textpattern (EN); Autor od kilku lat zajmuje się programowaniem
• http://b2evolution.net/ – oficjalna strona platformy b2evolution (EN); aplikacji internetowych oraz wdrażaniem syste-
• http://lifetype.net/ – oficjalna strona platformy LifeType (EN).
mów CMS.
Kontakt z autorem: albrzykowski@gmail.com

www.sdjournal.org 35
Testowanie oprogramowania

SAP GUI Scripting API


Automatyzacja czynności w SAP GUI

SAP GUI Scripting API to interfejs pozwalający na emulowanie każdej


czynności jaką może wykonać użytkownik w środowisku SAP GUI. Dzięki jego
użyciu można zautomatyzować czynności powtarzalne, ale również uzyskać
dostęp do SAP GUI z poziomu innych aplikacji, np. Windows Scripting Host.

Przy czym SGS nie umożliwia dokonywania z


Dowiesz się: Powinieneś wiedzieć: poziomu SGS jakichkolwiek zmian w samym
• W jaki sposób tworzyć skrypty automatyzują- • Czytelnik powinien posiadać dobrą orientację GUI np. dodawania nowych elementów ekranu.
ce czynności użytkownika w SAP GUI; w posługiwaniu się SAP GUI, czynności bądź Skrypty są wykonywane w SAP GUI, a niewie-
• W jaki sposób połączyć SAP GUI z aplikacją MS transakcje SAP jakie będą miały zostać zauto- le można z SAP GUI zrobić bez podłączenia się
Office. matyzowane; do serwera aplikacji i otwarcia sesji. Dlatego do
• Czytelnik powinien znać podstawy programo- poznania SGS i wypróbowania przykładowego
wania w języku skryptowym typu JavaScript kodu będzie potrzebna instalacja zarówno SAP
lub JScript. GUI jak i samego serwera aplikacji.
SAP udostępnia wersje testowe swojego sytemu,
które można pobrać ze strony http://sdn.sap.com,
GUI for Java, dostęp przez przeglądarkę interne- do czego wymagana jest rejestracja. Z sekcji Down-
tową dla aplikacji z interfejsem webowym). loads > SAP NetWeaver Main Release można po-
Poziom trudności Artykuł poniższy opisuje pokrótce SAP GUI brać SAP NetWeaver 7.0 ABAP Trial Version. SAP
Scripting API (dalej SGS), skryptowe API dostępu GUI można pobrać z ftp://ftp.sap.com/pub/sapgui/,
do funkcjonalności SAP GUI. Wszystkie odniesie- gdzie znajdują się obie wersje SAP GUI dla Win-
nia dotyczą SAP GUI for Windows 7100.1.5.1033. dows oraz Java. Należy zwrócić uwagę na to, że

N
iemiecki producent oprogramowania Głównym celem przyświecającym powsta- oprogramowanie skali SAP Netweaver ma duże
SAP tworzy szeroką gamę komplemen- niu SGS było stworzenie narzędzia emulują- wymagania sprzętowe, które podane są na stro-
tarnych rozwiązań do informatyczne- cego działania użytkownika. SGS zapewnia ta- nie pobierania.
go wsparcia procesów biznesowych. Poszczególne ką właśnie funkcjonalność wykonania każdego Kolejnym krokiem jest instalacja. Uruchamia-
elementy systemu wydzielane ze względu na biz- działania, jakie może podjąć użytkownik w in- na jest poprzez otwarcie w przeglądarce inter-
nesowy obszar ich zastosowania określane są mia- terakcji z systemem za pomocą SAP GUI. Dzia- netowej prezentacji w formacie html, w której
nem modułów. W celu zapewnienia kompatybil- łania dostępne przez SGS to: wszystkie kroki są przejrzyście opisane. Przed
ności i spójności poszczególnych modułów całość uruchomieniem instalatora warto zwrócić uwa-
napisana jest w dedykowanym języku programo- • użycie/aktywacja elementów SAP GUI (np. gę na kwestie dotyczące długości nazwy kompu-
wania ABAP lub w Javie, który to język programo- wybranie pozycji menu, naciśnięcie przyci- tera oraz zawartość plików services oraz hosts z ka-
wania posiada niekwestionowaną pozycję na ryn- sku); talogu %windir%/system32/drivers/etc/. Dodatko-
ku języków programowania systemów bizneso- • zapisanie czynności wykonanych przez użyt- wo, w przypadku, gdy nasz komputer nie po-
wych. W obu przypadkach oprogramowanie uru- kownika do postaci skryptu; siada adresu IP innego niż 127.0.0.1, konieczne
chamiane jest na dedykowanych serwerach. Ser- • logowanie informacji systemowych do pliku. jest zainstalowanie Microsoft Loopback Adapter.
wery funkcjonują w kilku wersjach w rozróżnie- Szczegóły można znaleźć w instrukcji instalacji.
niu na konkretne infrastruktury systemu opera- Przykładowe zastosowania SGS: Po instalacji i uruchomieniu serwera SAP Ne-
cyjnego i bazy danych, które stanowią szkielet da- tweaver oraz SAP GUI, aby móc połączyć się z
nej wersji konfiguracji serwera. • testy wydajności (symulowanie aktywno- serwerem, należy zainstalowany system dodać
Rozbudowany system aplikacji biznesowych ści wielu użytkowników); do listy systemów w zakładce Systemy w SAP Lo-
SAP można również podzielić na część transak- • automatyzowanie powtarzalnych czynno- gon. W polu opis wpisać można np. NSP, w polu
cyjną (moduły odpowiadające różnym proce- ści (zarówno administratorów jak i użyt- Serwer aplikacji nazwę albo adres IP komputera
som przedsiębiorstwa) oraz część szeroko rozu- kowników systemu); na którym serwer jest uruchamiany, Numer syste-
mianego raportowania – Business Intelligence. • łączenie SAP GUI z aplikacjami zewnętrz- mu to dla wersji testowej 00, ID systemu to NSP.
Struktura aplikacji SAP wyraźnie rozgranicza nymi. Jeśli wszystko zostało wykonane zgodnie z in-
warstwę przechowywania danych (Oracle, Ma- strukcją instalacji i serwer został uruchomiony,
xDB, MS SQL Server), warstwę wykonywania lo- Porównaniem mogącym dać zupełnie nowym po dwukrotnym kliknięciu na nowo dodanej po-
giki biznesowej (ABAP, J2EE) oraz warstwę inter- użytkownikom pewien obraz SGS w SAP GUI, zycji NSP w SAP Logon, SAP GUI otworzy się na
fejsu użytkownika (SAP GUI for Windows, SAP może być JavaScript i przeglądarka internetowa. ekranie logowania do systemu.

36 11/2008
SAP GUI Scripting API

Po zainstalowaniu obsługa SGS nie jest do- niżej na przykładzie zautomatyzowania exportu GUI. Okno jest maksymalizowane, co jest przydat-
myślnie aktywowana w ustawieniach serwera wyników raportu SAP Query. Jako, że SAP Qu- ne do zapewnienia zawsze tej samej widoczności,
SAP Netweaver. Do wyboru są dwie możliwo- ery oferuje kilka formatów, do jakich można eks- ponieważ SGS może się odwoływać tylko do wi-
ści uruchomienia obsługi SGS po stronie serwe- portować wyniki raportów, w przykładzie wy- docznych elementów, jest to istotne np. przy póź-
ra – tylko dla bieżącej sesji uruchomienia serwe- brano bezpośredni eksport do pliku tekstowego, niejszym odwoływaniu się do pozycji wyświetla-
ra lub zapisać to ustawienie aktywne dla wszyst- który dobrze nadaje się do późniejszego użycia nych list. Na końcu w pola tekstowe wpisywane są
kich nowo uruchamianych sesji serwera. w aplikacjach zewnętrznych. nazwa i hasło użytkownika, a całość zatwierdzana
W pierwszym przypadku należy użyć transak- Przykładowy skrypt napisany jest przy założe- klawiszem Enter powodując zalogowanie użytkow-
cji rz11 wybierając parametr sapgui/user_scripting. niu, że będzie on wykonywany bez potrzeby inge- nika w systemie. W celu odwoływania się do ele-
Ostatnia pozycja Current value ma wartość FAL- rencji użytkownika, a więc potrzebne będzie wpi- mentów ekranu użyta jest metoda findById().
SE. Należy kliknąć na niej i wybrać z paska narzę- sanie hasła i nazwy użytkownika. W przykładzie W zależności od rozdzielczości ekranu, na któ-
dziowego przycisk Change Value. Następnie po te dane wpisane są do kodu, co może być dozwo- rym uruchomione zostało SAP GUI, zmienia się
wpisaniu wartości TRUE w polu New value na- lone w środowisku systemu deweloperskiego, jed- ilość widocznych elementów. Jeśli element nie
leży kliknąć ikonę dyskietki, aby zapisać zmiany. nak ze względów bezpieczeństwa w zastosowa- jest widoczny na ekranie SGS nie może się do nie-
W środowisku produkcyjnym koniecznym mo- niach produkcyjnych, lepiej zastosować monit o go odwołać, co powoduje powstanie wyjątku. Np.
że być zaznaczenie również opcji Switch on all se- te dane np. przy użyciu elementu InputBox. przy wysokiej rozdzielczości widocznych jest 25 li-
rvers. Do kolejnego uruchomienia, dla wszystkich Pierwszą czynnością, jaką należy wykonać w nii raportu, przy niższej rozdzielczości już tylko
nowych sesji użytkownika w bieżącej sesji serwe- celu uruchomienia skryptu SGS, jest przygoto- 12, więc nie można odwoływać się do wiersza 25.
ra, SGS jest już aktywne. Takie rozwiązanie jest wanie środowiska uruchomieniowego dla skryp- Należy zwrócić na to uwagę, jeśli skrypty mogą być
praktyczne, jeśli w standardowym trybie nie udo- tu, a więc uruchomienie SAP GUI. Pojawia się uruchamiane przy innej rozdzielczości ekranu.
stępnia się SGS użytkownikom, a chce tylko jed- zatem okazja wykorzystania możliwości uży- Podana powyżej metoda zdefiniowania obiektu
norazowo wykonać czynności administracyjne cia SGS w połączeniu z Windows Scripting Host sesji i odwoływania się do elementów ekranu uła-
lub testy nie wymagające wielokrotnego urucha- (WSH) i zautomatyzowania również tej operacji twia późniejsze bezpośrednie użycie kodu genero-
miania serwera SAP Netweaver. Jeśli jednak SGS kodem zawartym w jednym, rozpoznawalnym wanego przez rejestrator skryptów. Kolejność wy-
ma być dostępne po restarcie serwera SAP Netwe- przez WSH pliku vbs. woływania obiektów składających się na ekran SAP
aver, należy wprowadzić wpis aktywujący obsługę W celu zawarcia całego kodu w jednym pliku GUI, do którego elementów odwołuje się skrypt
SGS w pliku profilu serwera. aplikacja SAP Logon uruchamiana jest przez WSH. jest następująca: Aplikacja>Połączenie>Sesja.
Plik profilu uruchomieniowego serwera zawie- Tworzony jest obiekt silnika WSH, a wywołanie Aplikacją jest uruchomiony SAP Logon, dlatego
ra parametry uruchomieniowe serwera. W syste- metody Run uruchamia SAP Logon przez otwarcie zawsze istnieć będzie tylko jeden taki obiekt. Połą-
mie testowym plikiem profilu jest: %nazwa_serwe- domyślnie tworzonego podczas instalacji skrótu na czenie z serwerem aplikacji jest otwierane poprzez
ra, domyślnie NSP%_DVEBMGS00_%nazwa_kom- pulpicie. Do momentu wystartowania SAP Lo- zalogowanie się w SAP GUI. Domyślna maksy-
putera_na_którym_uruchomiony_jest_serwer% gon nie można odwołać się do silnika SGS, dlate- malna ilość połączeń do sesji serwera wynosi 200
znajdujący się w katalogu: %katalog_instalacji, do- go na potrzebny na to czas, zależny od wydajności i nie jest proporcjonalnie dystrybuowana między
myślnie c:\SAP%\ %nazwa_serwera, domyślnie systemu, na którym SAP GUI jest używane, nale- użytkowników. Dlatego w teorii jeden użytkow-
NSP%\SYS\profile. Za pozycją rdisp/myname dopi- ży skrypt uśpić. Po uruchomieniu SAP Logon two- nik mógłby otworzyć do 200 sesji na serwerze.
sujemy w nowej linii: sapgui/user_scripting = TRUE. rzone są kolejno obiekty aplikacji, silnika, połącze- Oddzielną sesją w rozumieniu tego artykułu,
Po wprowadzeniu tej zmiany, każda nowo urucho- nia oraz sesji. Połączenie definiowane jest przez po- określane jest każde otwarte okna SAP GUI. W
miona sesja serwera będzie obsługiwać SGS. danie nazwy wpisu dla połączenia z listy w SAP Lo- każdej sesji można wykonywać niezależnie różne
Po wykonaniu opisanych dotąd czynności sys- gon. Po zainicjalizowaniu tych obiektów można się od siebie różne transakcje. Dla jednego połączenia
tem jest gotowy do używania w nim SAP GUI już odwoływać do elementów sesji i ekranu SAP można utworzyć maksymalnie pięć sesji. Dlatego
Scripting API.
Skrypty SGS można uruchamiać po zalogo- Listing 1. Uruchomienie SAP Logon oraz zalogowanie użytkownika do systemu
waniu poprzez kliknięcie pierwszego od prawej
przycisku ustawień layout’u (Alt+F12) i wybra- Set WshShell = WScript.CreateObject("WScript.Shell") ‘tworzymy obiekt do
niu Script Recording and Playback, a następnie odwoływania się do silnika WSH
poprzez kliknięcie zielonego przycisku odtwa- WshShell.Run("""d:\profiles\All Users\Desktop\Sap Logon.lnk""") ‘uruchamiamy SAP GUI
rzania, aby wybrać w wyświetlonym oknie plik poprzez skrót na pulpicie
skryptu do wykonania. Wybranie pliku podwój- WScript.Sleep(5000) ‘usypiamy skrypt na czas uruchomienia SAP GUI
nym kliknięciem albo po zaznaczeniu go klik- Dim objSapGui
nięcie przycisku OK rozpoczyna wykonanie za- Set objSapGui = GetObject("SAPGUI")
pisanego w pliku skryptu. Aby rozpocząć nagry- Dim objScriptingEngine
wanie wykonywanych czynności klika się w tym Set objScriptingEngine = objSapGui.GetScriptingEngine ‘kolejno obiekt silnika SGS
samym oknie na czerwony przycisk nagrywa- Set objConnection = objScriptingEngine.openConnection("NSP") ‘połączenia
nia. Po kliknięciu przycisku More można wpisać Set session = objConnection.Children(0) ‘oraz sesji
ścieżkę do pliku, w jakim zostaną zapisane czyn- session.findById("wnd[0]").maximize ‘maksymalizuje główne okno
ności wykonywane przez użytkownika w trakcie session.findById("wnd[0]/usr/txtRSYST-BNAME").text = "bcuser" ‘wpisanie nazwy uzytkownika
działania rejestratora skryptów. session.findById("wnd[0]/usr/pwdRSYST-BCODE").text = "minisap" ‘wpisanie hasła
Zarówno podczas nagrywania, jak i wykonywa- session.findById("wnd[0]/usr/txtRSYST-LANGU").text = "EN" ‘wybór języka sesji
nia skryptu, w prawym dolnym rogu okna SAP session.findById("wnd[0]").sendVKey 0 ‘wysłanie użycia klawisza Enter
GUI aktywny jest czerwono-biały wskaźnik działa-
nia skryptu, który podczas normalnego użytkowa- Listing 2. Uruchomienie transakcji sq01
nia SAP GUI również widoczny, ale nieaktywny. session.findById("wnd[0]/tbar[0]/okcd").text = "/nsq01"
Krótki przegląd możliwości zastosowania i session.findById("wnd[0]").sendVKey 0
składni kodu SGS przedstawiony zostanie po-

www.sdjournal.org 37
Testowanie oprogramowania

przy domyślnych ustawieniach, możliwe jest teo- łuje nowe okno modalne zawierające listę grup. pozostawiony zostaje domyślny wybór DAT, jedy-
retycznie otwarcie tysiąca okien SAP GUI i wyko- Dla zautomatyzowania tego wyboru, użyta zo- nie dodatkowo zaznaczane jest pole With column
nywanie w każdym z nich, innej transakcji. staje funkcja filtra, który zawęża wyświetlane po- heeaders. Zapisuje to w pierwszym wierszu pliku
Uruchamianie transakcji można wykonywać zycje do jednej konkretnej nazwy grupy. Kolejno, nazwy kolumn, co np. ułatwia późniejsze użycie
poprzez rozwinięcie drzewa menu i wybranie od- wywoływane jest wybranie i podwójne kliknię- pliku jako tabeli połączonej w MS Access. Ostatnia
powiedniego jego elementu, ale dużo praktyczniej- cie na pierwszy wiersz listy, co powoduje zmia- linia kodu zatwierdza zapisanie danych.
szym z punktu widzenia zastosowania w SGS spo- nę wyświetlanej listy kwerend na listę dla grupy Po wykonaniu wszystkich czynności w SAP
sobem jest wpisywanie kodu transakcji do pola ko- /SAPQUERY/QD. GUI w celu zamknięcia wszystkich otwartych
mend i wysłanie do GUI procedury wciśnięcia kla- Dzięki wyszukiwaniu elementu ekranu po jego dla wykonania skryptu sesji użyta zostaje transak-
wisza Enter. Tak więc, aby już po zalogowaniu uru- wartości, zapewnia się dostęp bez względu na to, cja /nex. Powoduje to zamknięcie sesji bez pytania
chomić transakcję tworzenia raportów ad hoc SAP czy w nowo otwartym oknie wyboru szukany ele- o potwierdzenie tego wyboru.
ABAP Query, użyty zostanie kod z Listingu 2. ment jest widoczny, ponieważ po zastosowaniu Wywołanie kwerendy SAP Query z poziomu
Najpierw kod transakcji wpisywany jest do filtra wyświetlana jest tylko jedna, właściwa dla transakcji sq01 umożliwia testowanie ich wyko-
okna komend, a następnie wysyłane naciśnięcie dalszego wykonania skryptu wartość. nania użytkownikom je tworzącym, jeszcze za-
klawisza Enter, do uruchomienia wpisanej trans- Po wybraniu grupy użytkowników wyświetlo- nim dla zapytania zostanie utworzona nowa
akcji. Poprzedzanie nazw transakcji znakiem /n na zostaje lista dostępnych kwerend. Do pola na- transakcja dodana do menu użytkownika koń-
umożliwia uruchamiania tej samej transakcji wie- zwy kwerendy skrypt wprowadza nazwę kweren- cowego. Ponadto, umożliwia to późniejsze uży-
lokrotnie w jednej sesji, jeśli np. zamierzamy wy- dy i uruchamia z wcześniej zapisanym wariantem. cie tego samego kodu, do wywoływania różnych
wołać po kolei kilka kwerend w tej samej sesji. Pojawia się okno wyboru nazwy wariantu, do któ- kwerend poprzez użycie funkcji i przekazywanie
W celu zapewnienia kontroli dostępu, rapor- rego skrypt wstawia zapisaną w kodzie nazwę. Wy- nazw kwerendy i wariantu w jej parametrach.
ty SAP Query przypisane są do specjalnych grup bór zatwierdzany jest klawiszem Enter, a następnie Użycie SAP GUI Scripting wymaga dobrej zna-
użytkowników SAP Query. Dlatego, aby na ekra- poprzez wybór klawisza F8, kwerenda zostaje uru- jomości systemu od strony użytkownika, dlatego
nie transakcji sq01 odwołać się do określonej kwe- chomiona z wybranym wariantem. W wariancie jest to narzędzie, które można polecić użytkowni-
rendy należy dla każdego nowego połączenia wy- dla transakcji można zapisać wiele ustawień. W kom kluczowym, pracownikom pierwszej i dru-
brać docelową grupę użytkowników. Wybór ten powyższym przykładzie wariant zawiera wybra- giej linii wsparcia, osobom, które potrzebują wy-
będzie zapamiętany do zamknięcia danego połą- nie z opcji Output format – File store z podaniem konać różnego rodzaju czynności administracyj-
czenia. Jeśli uruchomimy transakcję sq01 w no- ścieżki, czyli zapisu wyniku kwerendy do pliku. Po ne z poziomu SAP GUI. Do sprawnego rozumie-
wej sesji dla tego samego połączenia, wyświetlo- wykonaniu zapytania, wyświetla się okno, w któ- nia i edycji kodu przydatna jest znajomość pod-
ny zostanie katalog kwerend dla ostatnio wybra- rym jeszcze raz można zmienić ścieżkę do pliku. staw programowania, np. w JavaScript.
nej grupy użytkowników. Wybranie przycisku W tym samym oknie dokonuje się formaty pliku Możliwość łączenia w jednym pliku kodu SGS
wyświetlenia listy grup użytkowników, wywo- w jakim zapisane mają być wyniki. W przykładzie z WSH umożliwia łatwy dostęp do SGS z pozio-
mu każdej aplikacji mającej również możliwość
Listing 3. Użycie filtra w celu ograniczenia ilości wpisów na liście wyboru wywołania skryptu WSH. Ta właściwość umoż-
liwia na przykład uruchamianie skryptów SGS
session.findById("wnd[0]/tbar[1]/btn[19]").press poprzez Zaplanowane zadania Windows, z makr
session.findById("wnd[0]").sendVKey 19 aplikacji Microsoft Access lub z pliku batch w li-
session.findById("wnd[1]/tbar[0]/btn[29]").press nii komend Windows. Dostarcza to dużą ela-
session.findById("wnd[2]/usr/subSUB_DYN0500:SAPLSKBH:0600/cntlCONTAINER1_FILT/ styczność w dostępie do SAP GUI z innych apli-
shellcont/shell").selectedRows = "0" kacji przy dopasowywaniu rozwiązań do wyma-
session.findById("wnd[2]/usr/subSUB_DYN0500:SAPLSKBH:0600/cntlCONTAINER1_FILT/ gań konkretnej sytuacji.
shellcont/shell").doubleClickCurrentCell
session.findById("wnd[2]/usr/subSUB_DYN0500:SAPLSKBH:0600/btn600_BUTTON").press Podsumowanie
session.findById("wnd[3]/usr/ssub%_SUBSCREEN_FREESEL:SAPLSSEL:1105/ctxt%%DYN001- SGS, jak każdy skrypt, jest narzędziem użytecz-
LOW").text = "/SAPQUERY/QD" nym we wszystkich sytuacjach, w których wystę-
session.findById("wnd[3]/usr/ssub%_SUBSCREEN_FREESEL:SAPLSSEL:1105/ctxt%%DYN001- pują czynności powtarzalne, a których złożoność
LOW").caretPosition = 12 czyni je pracochłonnymi lub podatnymi na błędy
session.findById("wnd[3]/tbar[0]/btn[0]").press użytkownika. Może się okazać bardzo przydatne
session.findById("wnd[1]/usr/cntlGRID1/shellcont/shell").selectedRows = "0" dla osób tworzących szkolenia, ponieważ pozwala
session.findById("wnd[1]/usr/cntlGRID1/shellcont/shell").doubleClickCurrentCell na stworzenie interaktywnych tutoriali. Dla pro-
gramistów jest to otwarcie dostępu do SAP GUI
Listing 4. Uruchomienie kwerendy w transakcji sq01 z wariantem zapisującym wyniki bezpośrednio do pliku do wykorzystania w zewnętrznych aplikacjach.
session.findById("wnd[0]/usr/ctxtRS38R-QNUM").text = "NAZWA_KWERENDY" Dokumentacja SAP GUI Scripting dostępna
session.findById("wnd[0]/tbar[1]/btn[17]").press jest przy wybranym domyślnym katalogu instala-
session.findById("wnd[1]/usr/ctxtRS38R-VARIANT").text = "NAZWA_WARIANTU" cji SAP GUI w pliku Program Files/SAP/FrontEnd/
session.findById("wnd[1]/usr/ctxtRS38R-VARIANT").caretPosition = 4 SAPgui/SAPguihelp/SAPGUIScripting.chm. Moż-
session.findById("wnd[1]").sendVKey 0 na w nim znaleźć dobrze ustrukturyzowaną i ła-
session.findById("wnd[0]").sendVKey 8 two dostępną, popartą przykładami dokumen-
session.findById("ses[0]/wnd[1]/usr/chkRSAQDOWN-COLUMN").selected = true tację API.
session.findById("ses[0]/wnd[1]/tbar[0]/btn[0]").press
ROMAN GRYZOWSKI
Listing 5. Zamykanie sessji bez potwierdzenia wylogowania Autor od 3 lat zajmuje się programowaniem VBA,
session.findById("wnd[0]/tbar[0]/okcd").text = "/nex" a od 2 pracuje jako kluczowy użytkownik systemu
session.findById("wnd[0]").sendVKey 0 SAP MM-SD.
Kontakt z autorem: rg@whereto.pl

38 11/2008
Testowanie oprogramowania

IBM Rational
Data Architect
Pierwsze kroki...

Wyobraźmy sobie sytuację, w której musimy stworzyć oprogramowanie dla


biblioteki. Chcąc wywiązać się z zadania musimy zaprojektować system, który
będzie spełniał wymagania stawiane przez naszego zleceniodawcę. Z pomocą
przychodzi nam Rational Data Architect, który jest narzędziem służącym do
tworzenia zarówno prostych, jak i bardzo złożonych modeli bazodanowych.

boczy – widoczny na Rysunku 1 – na którym


Dowiesz się: Powinieneś wiedzieć: stworzymy model logiczny bazy danych bi-
• Czym jest IBM Rational Data Architect; • Czym jest model logiczny oraz model fizyczny blioteki.
• W jaki sposób tworzyć modele baz danych za bazy danych; Po prawej stronie opisywanego obszaru na-
pomocą IBM Rational Data Architect; • Znać podstawową składnię języka SQL; szym oczom ukazuje się zakładka Palette, w
• W jaki sposób konfigurować połączenie z bazą • Znać podstawy konfiguracji serwerów bazo- której znajdują się kontrolki służące do mo-
(bazami danych); danowych. delowania diagramów. Podstawowe kontro-
• Jak generować modele baz danych na serwe- lki odkryją się po zaznaczeniu opcji Data.
rach bazodanowych; Znajdują się tu między innymi kontrolki ta-
kie jak encja i relacja, które są najczęściej wy-
korzystywanymi elementami przy tworzeniu
chomieniu Rational Data Architect uka- diagramów związków encji. Dodatkowo dla
że się środowisko graficzne dobrze znane każdej kontrolki możemy ustawić interesu-
Poziom trudności dla osób, które wcześniej pracowały na ec- jące nas opcje w obszarze Properties, domyśl-
lipsie. Interfejs jest bardzo przyjazny i intu- nie znajdującym się poniżej naszego obszaru
icyjny dla użytkowników tego narzędzia. W roboczego.
zasadzie nie jest wymagana żadna dodatko- Wiedząc gdzie znajdują się podstawowe

W
celu głębszego poznania funk- wa konfiguracja. Po zakończeniu procesu in- funkcje Rational Data Architect możemy przy-
cjonalności Rational Data Ar- stalacji Rational Data Architect jest gotowy stąpić do modelowania bazy danych bibliote-
chitect przed instalacją tego na- do pracy. ki. Aby stworzyć encję, bądź relację wystarczy
rzędzia powinniśmy zainstalować serwer ba- przeciągnąć interesującą nas kontrolkę na ob-
zodanowy, na którym będziemy przeprowa- Tworzenie modelu logicznego szar roboczy.
dzać testy na modelach, oraz wykonywać za- W celu rozpoczęcia prac nad oprogramo- Na potrzeby testów stworzymy niewiel-
pytania SQL. waniem dla naszej uniwersyteckiej biblio- ki model składający się z kilku encji – Doku-
W moim przypadku serwerami bazodano- teki musimy stworzyć projekt całego syste- ment (DokumentID, Tytul, ISBN, AutorID, Wy-
wymi, na których będę działał są DB2 v.9.5 mu. Jednym z jego elementów będzie mo- dawcaID) połączonej w relacji wiele-do-wielu z
Express-C oraz SQL Server 2005 Express del logiczny, który wyrazi nam tabele, oraz encjami Autor (AutorID, Imie, Nazwisko), Wy-
Edition. relacje między nimi, dające zrealizować się dawca (WydawcaID, Nazwa) oraz w relacji
Rational Data Architect w najnowszej wer- w każdym Systemie Zarządzania Bazą Da- jeden-do-wielu z encją Egzemplarz (Egzempla-
sji dostępny jest do pobrania za darmo ze stro- nych (SZBD). rzID, Ilosc_egz).
ny IBM, do której odnośnik znajduje się czę- W celu rozpoczęcia prac nad modelem Przedstawiony powyżej model nie od-
ści W Sieci. W moim przypadku jest to wer- powinniśmy otworzyć nowy projekt (File-> zwierciedla rzeczywistych potrzeb biblio-
sja v7.0. New-> Data Design Project), w ramach któ- tek, ale nam do testów w zupełności wy-
Proces instalacji Rational Data Architect rego będziemy tworzyć modele bazodano- starczy. Schemat ten widoczny jest na Ry-
jest prosty i intuicyjny. Oczywiście mamy we i nie tylko. Mamy możliwość stworzenia sunku 2.
możliwość samodzielnego ustawienia po- modelu logicznego na kilka sposobów – jed-
szczególnych parametrów, ale na potrzeby nym z nich jest stworzenie pustego modelu Tworzenie modelu fizycznego
rozpoznania tego narzędzia wystarczy nam (File-> New-> Logical Data Model). Po skorzy- Mając gotowy model logiczny pójdźmy krok
instalacja z domyślną konfiguracją. Po uru- staniu z tej opcji zostanie otwarty obszar ro- dalej i stwórzmy model fizyczny bazy danych.

40 11/2008
IBM Rational Data Architect – pierwsze kroki

I tutaj ponownie Rational Data Architect da- skiem Finish i po chwili mamy gotowy mo- szego uznania. Oczywiście Rational Data Ar-
je nam szereg możliwości tworzenia owych del fizyczny. chitect posiada funkcję, która się tym zajmu-
modeli. Korzystając z tej samej funkcji możemy je, ale nie zawsze działa ona tak, jak byśmy te-
Podobnie jak w przypadku modelu logicz- również uaktualnić istniejący model fizycz- go chcieli.
nego możemy stworzyć nowy model fizyczny ny o zmiany, które wprowadziliśmy w mode- W sposób analogiczny wykorzystując funk-
postępując analogicznie do sposobu opisanego lu logicznym. W tej chwili jedyne co musimy cję transformacji do modelu logicznego (Data-
przeze mnie powyżej. z nim zrobić, to poukładać encje wedłgu na- > Transform-> Logical Data Model) możemy wy-
Ścieżka, pod którą znajdziemy kreator mo-
delu fizycznego to File-> New-> Phisical Data
Model. Tutaj ponownie pojawia się nam za-
kładka Palette po prawej stronie ekranu, na
której znajdują się kontrolki, które wykorzy-
stamy do stworzenia modelu fizycznego od
zera.
Bardzo ciekawą opcją jest możliwość ge-
nerowania modelu fizycznego z istniejące-
go już modelu logicznego. Nie jest to żad-
na nowinka wśród oprogramowania służą-
cego do modelowania baz danych, ale za-
skakująca jest prostota z jaką przebiega ca-
ły ten proces.
Powstanie modelu odbywa się w sposób
niemal natychmiastowy i aby tego doko-
nać nie jest nam potrzebna żadna specjali-
styczna wiedza, tak jak to jest w przypad-
ku niektórych produktów konkurencyjnych.
Po prostu wybieramy z menu opcję Data->
Transform-> Phisical Data Model. Pojawi się
nam nowe okno, w który ustawiamy param-
tery ułatwijące nam późniejszą pracę na mo-
delach. Rysunek 2. Obszar roboczy dla modelu logicznego
Jedną z największych zalet Rational Data
Architect jest to, że współpracuje nie tylko
z produktami firmy IBM, ale również z nie-
mal wszystkimi najpopularniejszymy ser-
werami bazodanowymi, do których moż-
liwe jest podłączenie za pomocą sterowni-
ka JDBC.
W związku z tym, że każdy serwer bazo-
danowy charakteryzuje się różnymi typami
danych, Rational Data Architect ma wpro-
wadzone słowniki typów danych, które wy-
bieramy przy generowaniu modelu fizycz-
nego.
W tej sytuacji w zależności od naszych wy-
magań wybieramy słowniki typów danych
odpowiadające naszym potrzebom. W mo-
im przypadku jest to DB2 UDB.
Po przebrnięciu przez proces konfigura-
cji naszego nowego modelu fizycznego za-
twierdzamy wszystkie ustawienia przyci-

Rysunek 1. Starter instalacji Rational Data Architect Rysunek 3. Konfiguracja połączenia z SQL Server 2005

www.sdjournal.org 41
Testowanie oprogramowania

generować model logiczny z istniejącego sche- wym przyciskiem myszy folder Connections a dajemy hasło podanego użytkownika w po-
matu fizycznego. następnie wybrać opcję New Connection... lu Password.
Innym sposobem tworzenia modelu fi- Po wykonaniu powyższych wskazówek W polu Database wpisujemy nazwę bazy
zycznego jest funkcja inżynierii odwrotnej otworzy się nam okno kreatora połączeń. danych, z którą chcemy się połączyć oraz po-
(Reverse Engeneering), która pozwala nam na Teraz musimy skonfigurować wszystkie nie- dajemy host.
pobranie modelu fizycznego istniejącej bazy zbędne ustawienia. Zacznijmy od nadania W przypadku, gdy serwer znajduje się na
danych z serwera baz danych. Aby tego doko- nazwy. Rational Data Architect ustawia do- tym samym komputerze, na którym zainsta-
nać musimy skonfigurować połączenie z ba- myślną nazwę dla połączenia, ale zaleca się lowany jest Rational Data Architect w po-
zą danych. jego zmianę. Następnie wybierzemy ser- lu host wpisujemy localhost. Konieczne jest
wer bazy danych, z którym chcemy się po- również wpisanie numeru portu, na którym
Nawiązanie łączyć (pole Select a database manager). W serwer baz danych nasłuchuje połączeń. Na
połączenia z bazą danych moim przypadku jest to SQL Server 2005. ogół serwery bazodanowe mają domyślnie
Aby nawiązać połączenie z bazą danych musi- W polu User ID wprowadzamy nazwę użyt- przypisany numer portu.
my w widoku Database Explorer zaznaczyć pra- kownika serwera baz danych. Następnie po- Ostatnią rzeczą, którą należy zrobić jest
podanie ścieżki dostępu do sterownika JDBC
w polu Class location. Gdy podamy wszyst-
kie niezbędne dane powinniśmy skorzystać
z opcji Test Connection aby sprawdzić, czy
wprowadzone przez nas informacje są po-
prawne. Jeśli test nie zwróci nam żadnego
błędu, wówczas zatwierdzamy ustawienia
przyciskiem Finish. W tej chwili powinni-
śmy mieć gotowe połączenie z bazą danych,
do którego odnośnik znajduje się w widoku
Database Explorer.
Chcąc nawiązać połączenie z serwerami baz
danych wspieranych przez firmę IBM sprawa
jest dużo łatwiejsza, mianowicie większość da-
nych wypełniona zostaje automatycznie. Nie
musimy również dostarczać sterownika JDBC
dla bazy danych, gdyż Rational Data Architect
go posiada.
Rational Data Architect dając możliwość
nawiązania połączenia z serwerami baz da-
nych otwiera przed nami olbrzymie możli-
wości.
Jakie możliwości daje nam możliwość na-
Rysunek 4. Widok na mapowane modele bazodanowe wiązania połączenia? Generowanie, aktuali-

W Sieci
• http://www.ibm.com/developerworks/downloads/r/rda/ – Rational Data Architect w wersji trial
• http://www-306.ibm.com/software/data/db2/express/download.html – DB2 9.5 Express-C
• http://www.microsoft.com/sql/downloads/trial-software.mspx#EZC – SQL Server 2005 Express Edition
• http://www.microsoft.com/downloads/details.aspx?FamilyID=c243a5ae-4bd1-4e3d-94b8-5a0f62bf7796&displaylang=en – SQL Server 2005 Manage-
ment Studio Express Edition
• http://msdn.microsoft.com/en-us/data/aa937724.aspx – JDBC dla SQL Server 2005

Konfiguracja połączenia z SQL Server 2005


W celu nawiązania połączenia Rational Data Architect z SQL Server-em 2005 potrzebny będzie nam sterownik JDBC dla SQL Server 2005. Na
pierwszym etapie skonfigurujemy serwer bazodanowy. W tym celu musimy uruchomić narzędzie, które zostało zainstalowane wraz z serwe-
rem bazy danych SQL Server Configuration Manager (domyślnie znajduje się w Start-> Programy-> Microsoft SQL Server 2005-> Configuration To-
ols). Z wyświetlonej listy wybieramy opcję TCP/IP. W tym miejscu konieczne jest uaktywnienie możliwości nawiązania połączenia z serwerem
bazodanowym, więc przy polu ENABLE wybieramy z listy YES, a następnie przechodzimy do zakładki IP Addresses, gdzie podamy port, w któ-
rym SQL Server będzie nasłuchiwał połączeń. Domyślnym portem dla SQL Server 2005 jest 1433. Zatwierdzamy wprowadzone zmiany klikając
na Apply.
Kolejnym ważnym elementem przy nawiązywaniu połączenia jest wybór sposobu logowania się do serwera bazodanowego. Logowanie nie może
odbyć się za pomocą Windows Authentication. Musimy uaktywnić użytkownika sa (domyślne konto dla administratora bazy danych), lub stworzyć no-
wego użytkownika.
Mając skonfigurowany SQL Server 2005 możemy nawiązać połączenie z nim za pomocą Rational Data Architect w sposób opisany w części Nawiąza-
nie połączenia z bazą danych.

42 11/2008
IBM Rational Data Architect – pierwsze kroki

zacja modeli baz danych na serwerach, pobie- pować stworzony przez nas model z mode- • prawym przyciskiem myszy klikamy na
ranie modeli z serwerów, mapowanie źródeł, lem znajdującym się na serwerze baz danych, połączeniu z bazą danych w panelu Da-
synchronizacja modeli, kojarzenie odrębnych konieczne jest użycie funkcji Reverse Engine- tabse Explorer i wybieramy opcję New SQL
źródeł danych, odszukiwanie podobieństw w ering w celu pobrania modelu do Rational Statement;
modelach, w sytuacji, kiedy nie istnieje fi- Data Architect. • w oknie, które się otworzy po wykonaniu
zyczna implementacja relacji pomiędzy ni- Aby wykonać mapowanie modeli w ob- polecenia z punktu pierwszego wpisujemy
mi, analiza modeli i źródeł danych pod ką- rębie jednego projektu w menu wybieramy nazwę polecenia oraz jego typ (SELECT,
tem zgodności ze standardami korporacyjny- opcję File-> New-> Mapping Model. Prawdo- INSERT, itp.);
mi stworzonymi w ramach Rational Data Ar- podobnie na etapie poznawania narzędzia • po wykonaniu poleceń z powyższych
chitect(!). Wymieniłem tylko najistotniejsze Rational Data Architect funkcja ta nie znaj- punktów otworzony zostanie edytor, w
zalety płynące z możliwości połączenia z ba- dzie zastosowania więc postanowiłem, że nie którym podajemy polecenie SQL, oraz do-
zą danych. Ich lista jest dużo dłuższa. będę jej dogłębnie analizował. dajemy tabele (poprzez klikniecie prawym
przyciskiem myszy na widoku Tables i wy-
Mapowanie modeli Wykonywanie branie opcji Add Tables), na których bę-
Mapowanie modeli ma na celu umożliwienie poleceń SQL za pomocą RDA dziemy operować;
nam porównania różnych źródeł danych mię- Rational Data Architect posiada wbudowane • podajemy polecenie SQL i aby je wykonać
dzy sobą, znalezienie powiązania w źródłach narzędzie służące do tworzenia poleceń SQL. używamy funkcji znajdującej się w: Run >
danych, oraz przeprowadzenie szczegółowej Można uzyskać dostęp do niego na wiele spo- Run SQL.
analizy porównawczej modeli. sobów, włączając dostęp bezpośrednio z panelu
Rysunek 4 obrazuje nam sposób w jaki wy- Database Explorer. Narzędzie służące do tworzenia poleceń
glądają dwa przykładowe mapowane modele Na potrzeby artykułu wykorzystałem połą- SQL w Rational Data Architect posiada sze-
bazodanowe. Abyśmy mogli wykonać mapo- czenie z SQL Server-em 2005. Aby wykonać roki wachlarz możliwości przy budowaniu
wanie modeli, konieczne jest umieszczenie polecenie SQL musimy wykonać następują- zapytań SQL, oraz operacji na wynikach za-
źródeł danych w jednym projekcie. Aby ma- ce kroki: pytań.
Wszystko to powoduje, że Rational Data Ar-
chitect jest narzędziem wielofunkcyjnym słu-
żącym nie tylko do tworzenia modeli baz da-
nych, ale również do ich testowania.

Podsumowanie
Rational Data Architekt jest narzędziem,
które dzięki swoim funkcjom pozwala na
drastyczną redukcję czasu pracy nad mode-
lami baz danych.
Narzędzie to zbudowane w oparciu o open
source-ową platformę eclipse nie tylko posia-
da przyjazne użytkownikom środowisko gra-
ficzne, ale również pozwala na zsynchroni-
zowanie pracy architektów tworzących pro-
jekty oprogramowania nie tylko bazodano-
wych. Wystarczy dodać kolejne wtyczki do
elipsa i osoby odpowiedzialne za różne ele-
menty powstawania projektu oprogramo-
wania mogą wymieniać się efektami swojej
pracy ciągle korzystając z tego samego na-
rzędzia.
Rational Data Architect jest jak szwajcar-
Rysunek 5. Widok narzędzia służącego do wykonywania poleceń SQL ski scyzoryk przy zarządzaniu modelami baz
danych. Czy to znaczy, że RDA może wszyst-
ko? Nie. Szwajcarski scyzoryk, również nie
Współpraca Rational Data Architect z serwerami baz danych może, ale możliwości, które dają te dobrze
Rational Data Architect w swojej pełnej funkcjonalności współpracuje z: zorganizowane narzędzie pozwalają na od-
nalezienie zastosowania w niemal każdej sy-
• Cloudscape® tuacji.
• DB2 for iSeries®
• DB2 for Linux®, UNIX®, and Windows®
• DB2 for z/OS®
• Derby
• Informix® Dynamic Server SZYMON GRUSZEWSKI
• Microsoft SQL Server Enterprise Autor jest studentem na wydziale informatyki w
• MySQL Polsko-Japońskiej Wyższej Szkole Technik Kompu-
• Oracle
• Sybase Adaptive Server Enterprise terowych w Warszawie. Odbył praktyki w firmie
• Teradata IBM Polska, których tematem było rozpoznanie na-
rzędzia Rational Data Architect.
Kontakt z autorem: szymon.gruszewski@gmail.com

www.sdjournal.org 43
Testowanie oprogramowania

Bezpieczne
partycjonowanie
Systemy wielordzeniowe QNX

W dzisiejszych czasach praktycznie każdy wbudowany system podłączony


jest fizycznie lub bezprzewodowo do świata zewnętrznego. Taka łączność
sieciowa pozwala użytkownikom na zdalne monitorowanie i sterowanie
oraz pozwala systemom pobierać nowe oprogramowanie i treści wtedy,
kiedy jest to konieczne.
tom systemów alokować predefiniowane zaso-
Dowiesz się: Powinieneś wiedzieć: by dla każdego z podsystemów. Kiedy rozpo-
• Co to jest technologia partycjonowania? • Co to jest system wbudowany? czyna się testowanie podsystemu, opracowują-
• Jak optymalnie wykorzystywać czas CPU • Na czym polega przetwarzanie współbieżne? cy go może ograniczyć partycję podsystemu do
w systemach wieloprocesorowych? alokowanego zapasu zasobów oraz może testo-
• Jak tworzyć bezpieczne systemy? wać podsystem w symulowanych warunkach
pesymistycznych. Dzięki temu może on roz-
wiązać potencjalne kwestie związane z wydaj-
nia w osobne partycje oraz alokować zagwaran- nością oraz rywalizacją o CPU we wczesnym
towany zapas pamięci oraz czasu CPU do każdej etapie, w dużym stopniu upraszczając następ-
Poziom trudności z partycji. W wyniku tego, złośliwe lub źle napi- na fazę integracji systemu.
sane procesy nie będą mogły zmonopolizować
zasobów niezbędnych dla innych procesów Skalowanie partycji
Partycjonowanie może również ochronić w procesorach wielordzeniowych

N
iestety, łączność opisana powyżej spra- przed problemami z wydajnością i niezawod- Do dziś partycjonowanie stosowano prawie wy-
wia, że systemy są narażone na infil- nością, które nieuchronnie pojawiają się pod- łącznie w środowiskach procesorów jednordze-
trację przez rosnącą rzeszę cyber-terro- czas integrowania wielu podsystemów. Projek- niowych. Jednakże, przy rosnącej popularno-
rystów oraz szantażystów. W rzeczywistości, zło- tant staje często przed problemem połączenia ści procesorów wielordzeniowych, producen-
śliwi hakerzy pokonali już wiele różnych syste- dowolnej liczby podsystemów opracowanych ci potrzebują sposobu na wdrożenie partycji
mów SCADA, systemów kontroli HVAC, urzą- na miejscu z podsystemami i elementami od w dwóch, czterech, ośmiu i większej liczbie
dzeń przenośnych oraz systemów bezpieczeń- zewnętrznych dostawców oprogramowania. rdzeni procesowych.
stwa nuklearnego przy użyciu wirusów, ataków W trakcie fazy integracji wszystkie te podsyste- W tym jest wyzwanie. W środowisku proce-
DoS (zablokowanie usług) oraz innych progra- my łączą się i rozpoczynają współzawodnictwo sorów pojedynczych, program planujący RTOS
mów sieciowych. o zasoby, co często skutkuje nieoczekiwanymi alokuje pojemność CPU do każdej partycji.
Aby opanować takie ataki wielu projektantów zachowaniami systemu. Podsystemy, które pra- W idealnej sytuacji program planujący RTOS mo-
systemów skierowało się do bezpiecznego partycjo- widłowo funkcjonowały w izolacji, teraz pracu- że po prostu rozszerzyć ten koncept na wszyst-
nowania. Mówiąc krótko technologia ta pozwa- ją wolno lub w ogóle odmawiają pracy.
la projektantom wyizolować procesy oprogra- Rozwiązanie takich kwestii związanych
mowania na wirtualne części lub partycje oraz z zasobami jest skomplikowanym i czasochłon- ���������� ���������� ����������
��������� ���������� ����������
alokować predefiniowane zapasy pamięci lub nym zadaniem. Po zidentyfikowaniu głównej
czasu CPU do każdej partycji. System operacyj- przyczyny projektant systemu musi żonglować
ny może wtedy wykorzystywać te zapasy, a co za priorytetami różnych podsystemów, lub co gor- ��������������������
tym idzie chronić procesy w którejkolwiek par- sze ponownie wdrożyć logikę podsystemu, aby
tycji przed fałszywym lub złośliwym monopoli- uzyskać pożądane zachowanie. Proces ten mo-
zowaniem zasobów wymaganych dla tych proce- że z łatwością przedłużyć realizację projektu ���������������������������
sów w innych partycjach – Rysunek 1. Przy po- o dodatkowe tygodnie lub miesiące.
mocy partycjonowania zasobów, projektant sys- Partycjonowanie odpowiada na te problemy
temu może wyizolować procesy oprogramowa- na etapie projektowania, pozwalając projektan- Rysunek 1. Schemat partycjonowania zasobów

44 11/2008
kie rdzenie procesowe w systemie wielordzeniowym. Niestety, wiele Syste-
mów Operacyjnych Czasu Rzeczywistego (RTOS) nie zapewnia tej możli-
wości, w dużej mierze z powodu ich ograniczonych możliwości w zakresie
przetwarzania wieloprocesorowego.
RTOS (System Operacyjny Czasu Rzeczywistego) może obsługiwać
jeden lub większą liczbę następujących modeli przetwarzania wielopro-
cesorowego:

• Asymetryczne Przetwarzanie Wieloprocesorowe (AMP) — traktuje każ-


dy rdzeń jako odrębny CPU. Osobny RTOS działa na każdy rdzeń,
wymuszając na projektancie systemu statyczną konfigurację pamię-
ci, przerwań oraz innych współdzielonych zasobów systemowych.
Aplikacje działające na danym rdzeniu mogą wykorzystywać wyłącz-
nie zasoby, które zostały statycznie skonfigurowane dla tego rdzenia;
• Symetryczne Przetwarzanie Wieloprocesorowe (SMP) — pojedynczy
RTOS zarządza wszystkimi rdzeniami. RTOS zarządza współdzie-
lonymi zasobami systemowymi, pozwalając im na wykorzystanie
przez którąkolwiek z aplikacji działających na którymkolwiek rdze-
niu. Dodatkowo, RTOS może dynamicznie planować wszelkie pro-
cesy na którymkolwiek rdzeniu, umożliwiając pełne wykorzysta-
nie CPU. Podejście to nie tylko upraszcza rozbudowę, ale również
oferuje większą elastyczność podczas wykorzystywania bezpiecz-
nych partycji w środowiskach wielordzeniowych;
• Ograniczone Przetwarzanie Wieloprocesorowe (BMP) — rozszerza
SMP poprzez umożliwienie projektantowi powiązać wszelkie pro-
cesy (oraz wszystkie wątki z nimi powiązane) z określonym rdze-
niem. Podejście to łączy w sobie sterowanie AMP oraz uproszczone
programowanie oraz większą skalowalność SMP.

Z natury AMP nie jest w stanie odpowiedzieć na wymagania przetwa-


rzania związane z rdzeniami wielokrotnymi. Z tego powodu wszelkie
partycje w AMP są ograniczone do rozmiaru pojedynczego rdzenia, do
100%. W SMP oraz BMP, z drugiej strony, RTOS posiada całkowity ob-
raz systemu, co pozwala mu na wykorzystanie całkowitej pojemności
CPU procesora wielordzeniowego (np. wszystkich rdzeni) do partycjo-
nowania. Projektanci systemu mogą w wyniku tego elastycznie mapo-
wać partycje na wiele rdzeni w dowolny sposób, odpowiedni do wymo-
gów systemowych — oraz niezależnie od ograniczeń procesora. Na przy-
kład, na Rysunku 2, Bezpieczna Partycja 1 rozciąga się na dwa rdzenie
CPU, podczas gdy inne partycje pracują na pojedynczych rdzeniach.
Elastyczność ta umożliwia projektantom systemów dostosowywać
rozwój platformy, zarówno w oprogramowaniu jak i w sprzęcie. Na przy-
kład, wprowadzanie nowych funkcjonalności oprogramowania do apli-
kacji może nadwerężyć partycję do poziomu, w którym pojedynczy
rdzeń CPU nie będzie już w stanie poradzić sobie z obciążeniem prze-
twarzania. W takim przypadku, partycje można łatwo rozszerzyć, aby
obejmowała dwa rdzenie. Migracja do nowej platformy sprzętowej może
również wymagać zmian w zasobach partycji, co z kolei spowoduje po-
trzebę zawarcia wielu rdzeni w partycji.

O firmie QNX Software Systems


QNX Software Systems, międzynarodowa firma należąca do Har-
man International, jest liderem w przemyśle technologii wbudo-
wanych systemów operacyjnych czasu rzeczywistego. Konstrukcje
QNX® Neutrino® RTOS oraz QNX Momentics® oparte na komponen-
tach tworzą najbardziej niezawodną i skalowalną ramę do budowy
innowacyjnych i wysoce wydajnych systemów wbudowanych. Świa-
towe firmy takie jak Cisco, DaimlerChrysler, General Electric, Lockhe-
ed Marti oraz Siemens zależne są od technologii QNX oraz routerów
sieciowych, sprzętu medycznego, układów telematycznych dla mo-
toryzacji, systemów bezpieczeństwa i obrony, robotów przemysło-
wych oraz innych aplikacji. Założona w 1980, firma QNX Software
Systems posiada swoja siedzibę główną w Ottawie, Kanada, i dystry-
buuje produkty do ponad 100 krajów na całym świecie.

www.sdjournal.org 45
Testowanie oprogramowania

Jeśli partycja wymaga dedykowanego rdze- wielka pracę. Na przykład, jeśli w partycji alo- Tworzenie
nia CPU, projektant systemu może zastosować kowano 30% CPU, będzie ona zawsze wykorzy- systemów, które przetrwają
ograniczone przetwarzanie wieloprocesorowe, stywała 30%, nawet jeśli w danej chwili potrze- Żadna, nawet największa liczba przeprowa-
aby ta i wyłącznie ta partycja była uruchamia- buje tylko 10%. To podejście stało-cyklowe mar- dzonych testów nie jest w stanie w pełni wy-
na na tym rdzeniu. nuje cenne (i dostępne) cykle CPU i uniemoż- eliminować wirusów lub potencjalnych dziur
liwia systemowi radzenie sobie z zapotrzebo- w skomplikowanym systemie, jak również ża-
Maksymalne wykorzystanie CPU waniem impulsowym. Inne aplikacje najlepiej den test nie jest w stanie przewidzieć każde-
Schemat partycjonowania powinien również wykorzystują takie jałowe cykle poprzez dyna- go zagrożenia, na które może napotkać system.
być elastyczny w sposobie zarządzania zaso- miczną alokację do partycji, co może przynieść Projektanci systemów oraz twórcy oprogramo-
bami CPU. Niektóre wdrożenia ściśle wymu- korzyści z dodatkowego czasu przetwarzania. wania muszą, w rezultacie zaadoptować tech-
szają zasoby CPU w każdej sytuacji, aby każ- Takie podejście daje nam bardziej czuły system nologie, które zawierają błędy w oprogramowa-
da z partycji zużywała w całkowite zasoby, na- oraz eliminuje kosztowną przebudowę związa- niu oraz inne zagrożenia i szybko je naprawić.
wet w przypadku, gdy ma do wykonania nie- ną z podejściem stało-cyklowym. W prawidłowy sposób wdrożone, partycjono-
wanie może zapewnić taką ochronę oraz ska-
lowanie ze zwiększającą się liczbą rdzeni pro-
��� ��� ��� ��� cesora. W wyniku takiej ochrony, zarówno pro-
cesory pojedyncze jak i systemy wielordzenio-
we mogą:

����������� ����������� ����������� • zawierać blokadę ataków;


���������������������
���������� ���������� ����������
• zawierać wadliwe podsystemy, które po-
wodują obciążenie CPU lub wyczerpanie
pamięci;
• zapewniać gwarantowany czas CPU dla
�������������
������
��� ����
������������
��� procesów przeprowadzających diagnosty-
kę systemu oraz odzyskiwanie danych;
• zapewniać zagwarantowany czas CPU dla
interfejsów użytkownika (idealne dla sys-
����� ����� ����� ����� temów, w których gwarantowany dostęp
zdalny jest wymogiem kluczowym);
• integrować podsystemy od różnych pro-
ducentów oraz dostawców przy jednocze-
���������������������������������������� snym uniknięciu typowych w takich sytu-
acjach konfliktów zasobów, które utrud-
niają integrację.

Co istotne, dobrze wdrożony plan partycjo-


nowania nie wymaga zmian kodów w istnie-
Rysunek 2. W modelach symetrycznego i ograniczonego przetwarzania wieloprocesorowego, partycje jących aplikacjach i umożliwia projektantom
mogą w sposób elastyczny rozciągać się na różne rdzenie
pracę zgodnie z tym samym planem i priory-
tetami zadań jak dotychczas. Dzięki adapta-
cyjnemu partycjonowaniu QNX, projektant
�����������
����������� ����������� �������������� systemu może na przykład uruchomić istnie-
���������� ���������� ���������� jące aplikacje i usługi systemowe w partycjach
��������� ��������� ��������� a program planujący systemu operacyjnego za-
����������� ����������� ����������� pewni, że każda partycja otrzyma swoje aloko-
wane zasoby. W ramach każdej partycji, pro-
����������� ������������������� gram planujący rozdysponuje wątki zgodnie z
tradycyjnymi zasadami priorytetowego szere-
������� ����������� ����������� gowania z wywłaszczeniem.
���������������
���������������
�������������������
��� ��� ���
W Sieci
������������������ ��� ��� �� ���� • http://www.qnx.com
�������������
��������������� ��� ��� ��� ����
���������������
KERRY JOHNSON,
����������� ����������� ����������� QNX SOFTWARE SYSTEMS
Kontakt z autorem: kjohnson@qnx.com

Rysunek 3. Inteligentne partycjonowanie, opatentowane przez QNX Software Systems, narzuca czas CPU ROMAIN SAHA,
dla budżetu partycji, kiedy system jest obciążony. Niewykorzystany czas CPU jest dynamicznie alokowany QNX SOFTWARE SYSTEMS
do partycji w sytuacji niepełnego obciążenia Kontakt z autorem: rsaha@qnx.com

46 11/2008
Testowanie oprogramowania

Joomla 1.5
Nowości

21 stycznia, w dwa i pół roku po pierwszym głównym wydaniu Joomla!


(miało to miejsce 16 września 2005 roku) zespół projektantów udostępnił
społeczności z radosnym komunikatem długo oczekiwane wydanie
drugie. Od tego momentu ukazało się pięć kolejnych aktualizacji,
eliminujących zauważone błędy, wnoszących dziesiątki drobniejszych
poprawek i udoskonaleń.

sy tcpdf, zapewniając atrakcyjniejsze dokumenty


Dowiesz się: Powinieneś wiedzieć: i ograniczając częste wcześniej problemy z kodo-
• Jakie zmiany wprowadzono do wersji 1.5. • Podstawy użytkowania Joomla 1.0. waniem znaków, czy obsługą niektórych forma-
tów graficznych.

• zachowano zgodność wsteczną z poprzedni- Łatwiejsza lokalizacja rozszerzeń


mi wydaniami Joomla!, komponentami, sza- Nowe rozwiązania w językowej warstwie Joomla!
Poziom trudności blonami, modułami i innymi dodatkami. już w najbliższej przyszłości będą zapewne skut-
kować szybszą polonizacją rozszerzeń. Już teraz
Uniwersalność i lokalizacja mamy do czynienia ze znacznie częstszymi pró-
Dla polskich użytkowników Joomla! 1.0 nie jest bami lokalizacji nowości, niż miało to miejsce

P
rzystosowanie Joomla!, którego początki zbytnią nowością w pełni zlokalizowany inter- w przypadku rozszerzeń dla Joomla 1.0. Proble-
sięgają przecież 2001 roku do zmieniającej fejs Joomla 1.5 – zarówno witryny, jaki zaplecza. mem może być wprawdzie utrzymanie pewnych
się natury internetu i nowoczesnych tech- Wielu użytkowników Joomla 1.0 w Polsce nie by- standardów, zapewnienie wysokiej jakości tłuma-
nologi sieciowych wymagało gruntownej przebu- ło i nie jest nawet świadomych faktu, że oryginal- czeń, ale sam proces stał się bardzo łatwy. Wystar-
dowy kodu, wzbogacenia użyteczności i uprosz- ny Joomla! przemawia na zapleczu tylko w języ- czy zainstalować specjalny komponent Transla-
czenia interfejsu użytkownika. Jak poprzednio, ku angielskim. tionManager. Komponent wyświetla na zapleczu
nowe wydanie Joomla! zapewnia użytkownikom frazy języka witryny i zaplecza, które wystarczy
i projektantom wygodny i łatwy w użyciu szkie- W UTF-8 przetłumaczyć i zapisać, by korzystać w swoim
let publikacji treści w witrynach internetowych W Joomla 1.5 problem lokalizacji rozwiązano Joomla! i ewentualnie udostępnić społeczności.
wszelkiego typu. W Joomla! 1.5: gruntownie i definitywnie. Dla wydawców pol-
skiego Joomla! skończył się problem z tygodnia- Ustawienia
• istotnie zwiększono funkcjonalność – za- mi pracy potrzebnej na dokonanie niezbędnych Ustawienia lokalne w Joomla 1.0 definiowano
równo użyteczność, jak i wykonalność (ang. zmian w skryptach. Do nowego wydania trzeba w Konfiguracji globalnej. W Joomla 1.5 nie znaj-
manageability), skalowalność i wydajność, zo- co najwyżej dotłumaczyć kilka nowych fraz w pli- dziemy w globalnych ustawieniach takich opcji.
stawiając daleko w tyle oryginalne Mambo; kach językowych. Kod języka i kod kraju ustawiane są teraz przez
• zapewniono obsługę dowolnego języka – Zmianą najważniejszą jest zapewnienie peł- plik językowy – jezyk.xml (np. pl-PL.xml). We-
dwubajtowe kodowanie utf (język japoński!), nej obsługi przez Joomla 1.5 standardu UTF, wnątrz znacznika locale można umieścić wiele
obsługa tekstów w językach z pisownią od a więc wielobajtowego kodowania znaków. W ciągów ustawiających lokalizację. System wybiera
prawej (np. arabski, farsi i hebrajski); efekcie Joomla 1.5 stał się projektem w pełni spośród nich automatycznie jedno, odpowiednie
• rozwinięto zdolność integracji z aplikacjami uniwersalnym, obsługującym dowolny język, w do konfiguracji serwera. Jeśli zatem mamy pro-
zewnętrznymi przez usługi sieciowe i zdalne tym języki z kierunkiem pisma od prawej do le- blemy z umiejscowieniem, takie jak niepoprawne
uwierzytelnianie, np. lekki protokół dostępu wej czy języki, w których stosowane jest pismo wyświetlanie daty, można – razem z administra-
do usług katalogowych (LDAP); morfosylabiczne (chiński, japoński). torem serwera sprawdzić i zmodyfikować wpisy
• udoskonalono technikę dodawania treści, w znaczniku locale.
szablony i formy prezentacji, aby zapewnić Doskonalszy PDF
obsługę standardów dostępności i użytecz- Dostosowanie do standardu UTF pozwoliło rów- Zarządzanie rozszerzeniami
ności dla dowolnych odbiorców; nież lepiej niż dotychczas rozwiązań problem ge- Oznaczenie komponentów, modułów, dodatków,
• zbudowano nowoczesny, prostszy i elastycz- nerowania dokumentów PDF. W miejsce stoso- szablonów i pakietów językowych jednym termi-
ny szkielet projektowy dla komponentów i wanego w poprzednim wydaniu Joomla! skryp- nem – rozszerzenia, to najdrobniejsza ze zmian.
innych rozszerzeń; tu free-PDF skorzystano z obsługującej UTF kla- Przede wszystkim uproszczono proces instalacji.

48 11/2008
Nowy Joomla 1.5 i nowe w Joomla!

W wydaniach sprzed Joomla 1.5 trzeba było do- wała już w kolejnych wydaniach Joomla 1.0. Po- nieczne było ręczne wpisanie markera wraz z od-
brać rodzaj instalatora do typu rozszerzenia. W Jo- czątkowo taki materiał można było udostępnić powiednimi atrybutami.
omla 1.5 instalatorowi dodano inteligencji, w re- jedynie przez publikację odnośnika w menu, nie W Joomla 1.0 dysponowaliśmy jednym edyto-
zultacie sprytnie sam rozpoznaje rodzaj instalo- można go było udostępnić w przeglądach arty- rem wizualnym – TinyMce. Wprawdzie możliwe
wanego rozszerzenia. Użytkownik nie musi się już kułów ani w modułach typu Popularne czy No- było doinstalowanie innych edytorów, ale trzeba to
martwić o poprawny wybór – po prostu wskazuj wości. Chociaż z czasem stało się to możliwe, ar- było uczynić, jeśli TinyMCE nie spełniał naszych
rozszerzenie, a resztę pracy wykonuje instalator. tykuł statyczny nadal różnił się od zwykłego, dy- oczekiwań. Joomla 1.5 udostępnia dwa edytory
Rozwiązano często doświadczane kłopoty na namicznego – nie można go było przenieść do ka- wizualne, obok TinyMCE – XStandard Lite. Edy-
serwerach Linuksowych i Uniksowych, a spowo- tegorii, a tym samym udostępnić w przeglądzie tor ten oferuje wprawdzie znacznie mniej funkcji,
dowane ograniczeniami praw dostępu do plików czy na liście artykułów w kategorii. ale zapewnia większą zgodność generowanego ko-
i bezpiecznym trybem działania PHP. Jak wiado- Odmienność typu wiązała się w Joomla 1.0 du ze standardami XHTML niż TinyMCE.
mo, bezpieczny tryb ogranicza PHP do możliwo- z dwoma różnymi procedurami tworzenia arty- W Joomla 1.5 na dobre zagościła też możliwość
ści wykonywania operacji tylko na tych plikach kułów i materiałów statycznych. Wspomniana wyboru przez użytkowników uprawnionych do
lub folderach, których właściciel jest tożsamy z wcześniej rezygnacja z formalnego podziału ar- współtworzenia witryny własnego edytora.
używanym przez PHP (zwykle jest to użytkownik tykułów na część wstępną i tekst główny rozwią-
'apache'). Normalnie pliki tworzone są albo przez zała również kwestię materiałów statycznych. Re- Parametry globalne
Joomla!, albo podczas transmisji przez FTP. W Jo- dakcję obu typów artykułów obsługuje jedna, taka Obowiązujących w całej witrynie, podstawo-
omla 1.5 dodano obsługę protokołu FTP przez sama procedura. A dawne materiały statyczne są wych ustawień prezentacji artykułów w Jo-
rdzeń systemu. Kombinacja akcji PHP na plikach teraz po prostu artykułami nieprzypisanymi do omla 1.0 dokonywaliśmy w edytorze konfigu-
i włączona obsługa FTP przez Joomla! umożliwia żadnej kategorii. racji globalnej witryny. W Joomla 1.5 edytor
bezproblemowe działanie przy włączonym safe W efekcie – jeśli potrzebujemy umieścić w wi- tych ustawień przeniesiono w bardziej natural-
mode. Włączenie FTP umożliwia operację na pli- trynie statyczny artykuł, jak statyczną, niezmien- ne miejsce – do menedżera artykułów. W każ-
kach (np. instalację rozszerzeń lub zmiany w pli- ną stronę HTML, możemy to uczynić – redaguje- dym bądź razie tak sądzili projektanci. W rezul-
ku konfiguracyjnym) bez konieczności dokony- my nowy artykuł w taki sam sposób, jak standar- tacie użytkownicy Joomla! 1.0 zastanawiają się
wania zmian praw zapisu dla katalogów i plików. dowy i zamiast przypisać go do konkretnej sekcji często, gdzie się te ustawienia podziały. A kryją
Takie rozwiązanie znacznie ułatwia życie admini- i kategorii, wybieramy na liście możliwości opcję się w przyborniku menedżera artykułów (strona
stratorowi i zwiększa bezpieczeństwo witryny. Nieprzypisany. W każdym jednak momencie nie- Wszystkie artykuły), pod ikoną Preferencje.
przypisany artykuł możemy umieścić w dowolnej Takie rozwiązanie wynika nie tylko z woli
Zarządzanie artykułami kategorii i sekcji, co w Joomla 1.0. możliwe nie by- uproszczenia interfejsu, ale także z rozwiniętych
Wprawdzie nie dokonano bodaj najbardziej ocze- ło, a także każdy artykuł przypisany do kategorii i w Joomla 1.5 możliwości zarządzania rozszerze-
kiwanej zmiany – możliwości przypisywania arty- sekcji możemy przekształcić w nieprzypisany ma- niami. W Joomla 1.0 parametry globalne można
kułów do wielu kategorii tudzież tworzenia wielo- teriał statyczny. było zdefiniować w zasadzie tylko dla treści zarzą-
poziomowego systemu kategorii, ale i w sferze za- dzanych przez komponent Artykuły (Content). W
rządzania artykułami zmiany są znaczące. Sposób Ilustrowanie artykułów Joomla 1.5 można ustawiać parametry globalne
obsługi został uproszczony, stając się jeszcze bar- Unowocześniony sposób zarządzania obrazkami także dla niektórych komponentów i modułów.
dziej intuicyjnym, niż był w Joomla 1.0. zaowocował również istotnymi zmianami w spo- W przybornikach na stronach menedżerów tych
sobie ilustrowania artykułów. W Joomla 1.0 ilu- rozszerzeń również znajdziemy ikonę Preferen-
Czytaj więcej strowanie artykułów obsługiwał specjalny, nie- cje (być może w następnych polskich wydaniach
Zrezygnowano z formalnego podziału artykułów zbyt intuicyjny dodatek (mosimage). Co prawda, użyjemy określenia Ustawienia lub Parametry).
na część wstępną i tekst główny. W konsekwencji samo stosowanie dodatku osobom nauczonym, Za pierwszym przemawia jego polski rodowód, za
w edytorze artykułów mamy zamiast dwóch jed- jak go używać kłopotu nie sprawiało, ale jeśli ktoś drugim spójność terminologiczna.
no pole na cały tekst. Oczywiście, nie zrezygno- nie doczytał, jak to się robi, miał problem.
wano jednak z możliwości wyodrębniania zapo- W Joomla 1.5 – podobnie jak w Joomla 1.0 Projektowanie menu
wiedzi i właściwego tekstu. Wszak zapowiedzi są wstawiamy ilustracje do artykułów za pomo- Spore udoskonalenia przyniosła w Joomla 1.5
niezwykle użytecznym sposobem prezentacji ar- cą przycisku Wstaw obraz, ale teraz polecenie to obsługa menu. Zmiany, pozornie drobne, mają
tykułów w przeglądach (zwanych dawniej bloga- otwiera specjalny edytor, umożliwiający zarówno jednak charakter wręcz rewolucyjny.
mi). Teraz jednak, aby podzielić artykuł na zapo- wybór obrazka, jak i opis jego właściwości.
wiedź i tekst główny, używamy markera Czytaj Co więcej – w Joomla 1.0 nie można było umie- Zmiana najtrudniej dostrzegalna
więcej. Można przy tym wpisać odpowiednie po- ścić w artykule obrazka, który nie został przesłany Zmiana najmniej widoczna, najtrudniej do-
lecenie, ale wygodniej zastosować przycisk wsta- na serwer przed przystąpieniem do pisania arty- strzegalna, a najbardziej rewolucyjna wynika z
wiający marker, umieszczony pod edytorem. W kułu. W Joomla 1.5 jest to, oczywiście, możliwe. konsekwentnego zastosowanego w Joomla 1.5
miejscu wstawienia znacznika pojawi się czerwo- wzorca projektowego MCV (Model-Kontroler-
na przerywana linia, oddzielająca wstęp artykułu Podgląd artykułu i inne usprawnienia Widok). Pozwala on projektantom witryn na
od całości. O obsługę podziału na stronach witry- W Joomla 1.0 redagowany artykuł można było stosunkowo łatwe zaprojektowanie własnych
ny zadba nowy dodatek (ang. plg_readmore). War- podejrzeć dopiero po zapisaniu go w bazie da- sposobów prezentacji treści, innych niż wido-
to przy tym wspomnieć, że w przypadku migracji nych. W Joomla 1.5 podgląd możliwy jest już ki domyślne. W efekcie spora już w Joomla 1.0
danych ze starszych stron, nie będzie to powodo- po napisaniu pierwszych słów, a więc w każdym ilość typów pozycji menu w Joomla 1.5 jest prak-
wać żadnych problemów. Nowe rozwiązanie jest momencie. tycznie nieograniczona. Każdy może wzboga-
w pełni zgodne z poprzednimi. Usprawniono również podział długich arty- cać oferowaną domyślnie paletę o nowe, od-
kułów na strony i generowanie spisu treści arty- powiednie dla konkretnej witryny rozwiąza-
Nieprzypisane zamiast statycznych kułów wielostronicowych. Przycisk Podziel stronę nia. Po umieszczeniu skryptów definiujących
W wydaniach sprzed Joomla 1.5 istniał specy- wywołuje teraz okno, w którym podajemy para- nowe widoki wśród skryptów szablonu, po-
ficzny typ artykułu nazywany materiałem sta- metry podziału – tytuł nowej strony oraz inną na- jawią sie one w zestawie typów pozycji menu
tycznym. Ewolucja jego właściwości następo- zwę umieszczaną w spisie treści. Poprzednio ko- do wyboru.

www.sdjournal.org 49
Testowanie oprogramowania

Trzy kliknięcia Zwolenników standardów dostępności intere- tów spoza zespołu Centrum Projektu nie znaj-
Nie chodzi tu o dotarcie po 3 kliknięciach do po- suje zapewne, na ile zmodyfikowano kod, który w dziemy jeszcze w Sieci zbyt wielu, ale jaskółki w
szukiwanej treści, ale o tworzenie nowej pozycji Joomla 1.0 preferował stosowanie do rozmieszcza- tym przypadku dość szybko uczynią wiosnę.
menu w Joomla 1.5. Dodajemy je dosłownie za nia treści obciążających kod i łącza, a przy tym wy-
pomocą trzech kliknięć – w pierwszym wybie- soce niedostępnych tabel. Gorszą wiadomością jest Kompatybilność
ramy w przyborniku polecenie Utwórz, w dru- ta, że tabele w kodzie pozostały. Nie zdecydowano z 1.0 i rozszerzeniami
gim wskazujemy zakres treści (artykuły, kompo- się na pełne wykorzystanie doświadczeń projektu Projektanci Joomla 1.5 uczynili wszystko, co
nent, łącze zewnętrzne), w trzecim widok – spo- a8e. Ale jest i dobra wiadomość, którą się już dzie- możliwe, aby zachować w maksymalnym stopniu
sób prezentacji (typ pozycji), po czym trafiamy liliśmy. Proces generowania kodu HTML został wsteczną zgodność z Joomla 1.0, a tym samym i z
na stronę edytora pozycji, gdzie wystarczy jedy- przeniesiony do odrębnych skryptów, które mo- rozszerzeniami stworzonymi dla Joomla 1.0. Za-
nie uściślić zakres treści i ewentualnie zdefinio- gą być swobodnie modyfikowane przez projektan- stosowane w Joomla 1.5 rozwiązania projekto-
wać dodatkowe parametry prezentacji. tów bez ingerencji w rdzenny kod. W efekcie każ- we, oparte na obiektowym PHP z natury rzeczy
dy projektant witryny może skutecznie wyelimi- wymagają rozszerzeń napisanych wedle nowego
Pozycja domyślna nować z kodu wszystkie niepotrzebnie zastosowa- wzorca projektowego. Natywnych rozszerzeń dla
Domyślna startowa pozycją menu w Joomla 1.0 ne tabele, zastępując je rozwiązaniami w pełni ko- Joomla 1.5 jest już sporo (niestety, niewiele spo-
musiała być pierwszą pozycją w głównym menu rzystającymi z możliwości CSS. Istotą rozwiązania lonizowanych), ale nie na tyle, by można zupeł-
witryny. Joomla 1.5 zapewnia w tej mierze peł- jest mechanizm podmiany skryptów rdzenia Joom- nie zrezygnować z opracowanych dla Joomla 1.0,
ną swobodę – domyślną pozycją menu, wska- la! skryptami szablonu. Przykład takiego rozwiąza- zwłaszcza że zastosowanie alternatywnych roz-
zującą na stronę startową witryny, wywoływaną nia dołączono, oczywiście, do oficjalnego wydania wiązań pociąga za sobą koszty migracji danych,
po wpisaniu w przeglądarce adresu witryny mo- Joomla 1.5. Zainteresowanych odsyłamy do przej- a projektanci dawnych rozszerzeń albo porzucili
że być dowolna pozycja w dowolnym menu. W rzenia skryptów szablonu Beez, zwłaszcza tych swoje dawne rozwiązania, albo publikują nowsze
każdym też momencie można ją zmienić. umieszczonych w katalogu /templates/beez/html. wersje na licencjach komercyjnych.
Znajdziemy tam wzorcowe skrypty widoków dla W Joomla 1.5 można korzystać z rozszerzeń
Zmiana typu bez usuwania rdzennych komponentów i modułów (contact, con- projektowanych dla Joomla 1.0 (komponentów,
W Joomla 1.0 takiej możliwości nie było w ogó- tent, poll, search, user, weblinks). Można je wykorzy- modułów, szablonów, dodatków) w specjalnym
le. Raz ustalonego typu pozycji menu zmienić się stać we własnych rozwiązaniach projekowych. trybie – trybie zgodności wstecznej. Uaktywnienie
nie dało. Jedynym wyjściem było usunięcie takiej trybu jest proste – wystarczy włączyć odpowiedni
nieodpowiadającej nam pozycji i stworzenie no- Otwartość dodatek, wybierając w menu zaplecza ->Dodatki ->
wej. W Joomla 1.5 wystarczy prosty zabieg – w Cechą umieszczającą Joomla 1.5 w ścisłej czołów- System : Spuścizna (Plugins -.System – Legacy).
edytorze pozycji menu naciskamy przycisk Zmień ce najnowocześniejszych rozwiązań współczesnej Zdarzyć się może, że włączenie trybu zgodno-
typ, a następnie dokonujemy odpowiednich usta- informatyki jest jego otwartość i łatwość integra- ści wstecznej nie rozwiąże jednak problemów z
wień. Walory tego rozwiązania można poznać cji z innymi systemami. W porównaniu z Joomla dawnymi rozszerzeniami. Na nic zda się narze-
tak naprawdę dopiero w trakcie migracji z Joom- 1.0, które pod tym względem również przodowa- kanie na niedobrych projektantów, co to nie prze-
la 1.0 do Joomla 1.5. Kto już przechodził ten pro- ło wśród innych CMS (systemów zarządzania wi- widzieli kilka lat temu, jakie możliwości i wyma-
ces, wie, ze podczas migracji tracimy – niestety trynami ineternetowymi), w Joomla 1.5 dokona- gania będzie mieć Joomla! w roku 2008, 2009
– wszystkie połączenia pozycji menu z nierdzen- no niemalże skoku o pokolenie wzwyż. Mechani- i następnych. Jeśli jakieś starocie ma miejsce w
nymi komponentami. Dzięki możliwości zmia- zmy integracji oparto na znanym już z poprzed- muzeum, poradzić się nie da. Trzeba poszukać
ny typu menu po doinstalowaniu komponentów niej wersji, ale rozbudowanym typie rozszerzenia nowszych rozwiązań. Szczególnie dotyczy to
przywrócenie połączeń w różnych menu witryny nazwanych obecnie dodatkami lub wtyczkami. komponentów stworzonych jeszcze dla Mam-
przebiega łatwo, bez zbędnego stresu. Zmiana ich nazwy nie jest ucieczką od przypomi- bo, wymagających rejestrowania zmiennych glo-
nających związek z Mambo mambotów czy krócej balnych. Nawet usilne próby bez zasadniczych
Szablony graficzne botów, ale podkreśla istotną zmianę ich roli. zmian w kodzie nie przywrócą im życia.
O najistotniejszej zmianie już wspominaliśmy: W Mambo i w Joomla 1.0 boty umożliwiały do-
konsekwentne rozdzielenie warstwy aplikacji, dawanie funkcji, których zadaniem było przetwa- Podsumowanie
warstwy danych i warstwy prezentacji – zastoso- rzanie treści (np. osadzanie obrazków i ich parame- Stworzenie doskonałej witryny ze wszystkimi
wanie modelu MCV – otworzyło nowe możliwo- trów, paginacja materiałów wielostronicowych). funkcjami, jakie sobie wymarzysz, może wymagać
ści przed projektantami szaty graficznej. W Joom- W Joomla 1.5 dodatki (kalka językowa – wtycz- czasu i zaangażowania. Ale ze społecznością Joom-
la 1.0 o mechanizmach personalizacji szablonów ki do najpiękniejszych nie należy, ale popularyzo- la!, wsparciem projektantów oraz dzięki licznym
można było raczej pomarzyć. Oczywiście, stosu- wana przez nas od lat nazwa dodatki może budzić rozszerzeniom tworzonym dla Joomla! 1.5, jest to
jąc specjalne skrypty, projektanci udostępniali nieporozumienia) mogą poszerzać funkcjonal- jak najbardziej możliwe. Możesz również tworzyć
użytkownikom pewne możliwości dostosowania ność Joomlowego frameworka. W dystrybucji 1.5 własne rozszerzenia i udostępniać je ku uciesze ca-
szablonu do swoich preferencji. Teraz te możliwo- znajdujemy kilka takich dodatków, m.in.: łej społeczności.
ści wzrosły w sposób w zasadzie nieograniczony.
Skrypt konfiguracyjny szablonu może posia- • upoważnienie – LDAP: obsługujący uwie-
dać sekcję parametrów definiujących opcjonalne rzytelnianie do usługi sieciowej LDAP; STEFAN WAJDA
rozwiązania różnych kwestii – rozmiarów stro- • upoważnienie – OpenID: obsługujący Stefan Wajda [Zwiastun] jest liderem PCJ!, koordyna-
ny, układu jedno- lub wielokolumnowego, roz- identyfikację za pomocą OpenID; torem Zespołu Tłumaczy i Dokumentacji akredytowa-
mieszczenia elementów, kolorystyki, wielkości • upoważnienie – GMail: obsługuje integra- nym przy Translation Work Group projektu Joomla!,
czcionki. Oczywiście, nie wystarczy samo zde- cję z usługami sieciowymi Gmail; wydawcą witryn PCJ, autorem w pełni zlokalizowa-
finiowanie możliwości wyboru – szablon trze- • XML-RPC - Blogger API: obsługuje inter- nych wersji Mambo i Joomla!, komponentów josDirec-
ba odpowiednio zaprogramować. Jest to jednak fejs oprogramowania XML-RPC Blogger. tory i josResource. Spolonizował ponad 150 rozszerzeń
działanie niezwykle proste – najczęściej wystar- dla Joomla!, opublikował w Internecie około 600 arty-
czy zdefiniowanie odpowiednich arkuszy stylów Przykładów praktycznego wykorzystanie tych i kułów poświęconych wszystkim aspektom Joomla!
dla poszczególnych opcji. innych dodatków oferowanych przez projektan- Kontakt z autorem: zwiastun@zwiastun.net

50 11/2008
XML

Spring 2 Schema
Własne przestrzenie nazw w Spring 2.x

Ten artykuł wprowadzi Cię szybko w podstawowe techniki tworzenia


własnych przestrzeni nazw XML Schema dla plików konfiguracyjnych
Spring IOC. Autorzy Spring Framework pisząc o dobrym oprogramowaniu
promują zasadę DRY (Don't Repeat Yourself) – wyraźnie widać to w
mechanizmie rozszerzania konfiguracji XML kontenera Springa.

rzyć. Zaliczyć do nich należy głównie usprawnio-


Dowiesz się: Powinieneś wiedzieć: ne uzupełnianie składni w edytorach XML do-
• Jak za pomocą własnej przestrzeni nazw XML • Podstawowa znajomość języka Java oraz kon- stępnych w popularnych IDE oraz zestaw dodat-
stworzyć najprostsze rozszerzenia składni pli- figuracja kontenera Inversion Of Control dla kowych przestrzeni nazw włączonych do dystry-
ków konfiguracyjnych XML dla Spring Frame- Spring Framework 2.x za pomocą plików XML; bucji Springa począwszy do wersji 2.0. W szcze-
work w wersji 2.x. • Wskazana jest również minimalna wiedza z za- gólności predefiniowane przestrzenie nazw oka-
kresu języka XML oraz API programowej ob- zują się być przydatne w codziennej pracy – po-
sługi kontenera Spring IOC. zwalają one m.in. na zastąpienie rozbudowanych
definicji fabryk typu FieldRetrievingFactoryBean,
ListFactoryBean lub TransactionProxyFactoryBe-
w dalszym ciągu działają w wersji 2.0 Springa (ze an ich kompaktowymi odpowiednikami wyrażo-
względu na słynne umiłowanie kompatybilności nymi za pomocą określonej przestrzeni nazw.
Poziom trudności wstecz przez jego autorów), jakkolwiek zalecaną Twórcy Springa nie poprzestali na szczęście
formą konfiguracji XML jest teraz XML Schema. na dostarczeniu nam zestawu predefiniowa-
nych przestrzeni nazw, ale udostępnili również
Motywacja mechanizm do samodzielnego tworzenia tych-

S
pring jest popularnym frameworkiem IOC Nie trzeba nawet specjalnie zachęcać do stoso- że. Nie muszę chyba wspominać o tym jak bar-
(Inversion Of Control) dla języka Java. Ofe- wania nowej definicji plików konfiguracyjnych dzo konfiguracja naszej aplikacji zyska na czy-
ruje on kilka sposobów konfiguracji apli- XML, gdyż oferuje nam ona rozliczne korzyści telności po zastosowaniu elementów oraz atry-
kacji oraz wstrzykiwania zależności, jednak naj- o których użytkownicy DTD mogą tylko poma- butów własnej konstrukcji, dostosowanych do
bardziej popularną techniką uzyskiwania tych ce-
lów jest konfiguracja w pliku XML. Jak powszech-
Listing 1. Szkielet konfiguracji kontenera Springa oparty na XML DTD
nie wiadomo XML oferuje czytelną, hierarchiczną
strukturą prezentowanych przez siebie informa- <!-- Stara konfiguracja -->
cji, które to m.in. zapewniły mu rolę niepisanego <?xml version="1.0" encoding="UTF-8"?>
standardu konfiguracji aplikacji webowych. XML <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
jednakże cechuje się również tendencją do gadatli- "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
wości tzn. do konieczności opisywania zawartych <beans>
w nim danych za pomocą dużej ilości tekstu. Pro- </beans>
gramiści używający Springa w wersji niższej niż
2.0 skazani byli na używanie dość ograniczonego Listing 2. Szkielet konfiguracji kontenera Springa oparty na XML Schema
zestawu narzędzi redukujących rozmiar plików <!-- Nowa konfiguracja -->
konfiguracyjnych XML oraz zjawiska tzw. XML <?xml version="1.0" encoding="UTF-8"?>
hell (np. stosowanie dziedziczenia definicji be- <beans xmlns="http://www.springframework.org/schema/beans"
anów lub automatycznego wiązania). Na szczęście xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
twórcy Springa od wersji 2.0 swojego frameworka xsi:schemaLocation="
dodali możliwość konfiguracji aplikacji za pomocą http://www.springframework.org/schema/beans http://www.springframework.org/schema/
plików XML zdefiniowanych nie tylko zgodnie z beans/spring-beans-2.0.xsd">
DTD, ale i mechanizmem XML Schema. Oczywi- </beans>
ście stare konfiguracje napisane pod kątem DTD

52 11/2008
Spring 2 Schema

naszych konkretnych potrzeb. Zysk ten będzie


widoczny w szczególności jeżeli planujemy Listing 3. Przykład użycia komponentu z własnej przestrzeni nazw
wielokrotne wykorzystywanie naszego kodu w <?xml version="1.0" encoding="UTF-8"?>
aplikacjach używających np. pisanej przez nas <beans xmlns="http://www.springframework.org/schema/beans"
biblioteki. W artykule tym chciałbym właśnie xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
przedstawić podstawowe techniki rozszerzania xmlns:myns="http://www.foo.com/customSchema"
możliwości konfiguracyjnych XML w Springu. xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/
Migracja beans/spring-beans-2.0.xsd
na nowy styl konfiguracji http://www.foo.com/customSchema http://www.foo.com/customSchema.xsd">
Przejście na nowy styl konfiguracji jest bardzo
proste. Wystarczy zamienić w istniejących pli- <myns:bar id="bar" value="barValue" />
kach konfiguracyjnych parę pierwszych linijek
dokumentu. </beans>
Migracja zaprezentowana na Listingu 2 jest
niemalże bezbolesna. Niemalże, gdyż istnieje Listing 4. Kod przykładowego komponentu Bar
parę (dosłownie parę) szczegółów konfigura- package foo;
cji które zostały uznane przez twórców Sprin- public class Bar {
ga za przestarzałe (deprecated) i które należy w // wartość komponentu
związku z tym dostosować do nowej konfigura- private String value;
cji opartej na XML Schema. Do szczegółów te- public Bar(String value) {
go typu należy np. atrybut singleton elemen- this.value = value;
tu <bean>, który w nowej konfiguracji powi- }
nien zostać zamieniony na atrybut scope (ze @Override
względu na wprowadzenie mechanizmu roz- public String toString() {
szerzalnych zasięgów w nowszych wersjach return value;
Springa). }
}
Witaj przestrzenio
– przypadek użycia Listing 5. Dokument XML Schema definiujący przykładową przestrzeń
Na początku spróbujemy napisać jak najszyb- <?xml version="1.0" encoding="UTF-8"?>
ciej najprostszą przestrzeń nazw z jednym ele- <xsd:schema xmlns="http://www.foo.com/customSchema"
mentem. Na potrzeby przykładów minimal- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
nych zawartych w tym artykule załóżmy, że xmlns:beans="http://www.springframework.org/schema/beans"
pracujemy dla firmy Foo i naszym zadaniem targetNamespace="http://www.foo.com/customSchema"
jest stworzenie elementu XML który pozwo- elementFormDefault="qualified"
li nam na bardziej efektywne używanie kom- attributeFormDefault="unqualified">
ponentu Bar w aplikacjach korzystających ze
sprzedawanej przez nas biblioteki. Wyobraźmy <xsd:import namespace="http://www.springframework.org/schema/beans" />
sobie, że docelowo nasz klient chciałby konfi-
gurować swoją aplikację za pomocą komponen- <xsd:element name="bar">
tu Bar w następujący sposób – Listing 3. <xsd:complexType>
Oczekujemy, że powyższa konfiguracja utwo- <xsd:complexContent>
rzy w kontenerze instancję klasy Bar o id rów- <xsd:extension base="beans:identifiedType">
nym bar oraz wartości prywatnej właściwości <xsd:attribute name="value" type="xsd:string" use="required" />
value równej barValue. Sam komponent Bar </xsd:extension>
wygląda następująco – Listing 4. </xsd:complexContent>
</xsd:complexType>
Schemat kroków </xsd:element>
Klasyczny schemat kroków wykonywany podczas </xsd:schema>
tworzenia własnej przestrzeni nazw to kolejno:

• napisanie dokumentu XSD;


• stworzenie parserów dla nowych elemen-
tów lub atrybutów XML;
W Sieci
• zaprogramowanie własnej klasy typu • http://springframework.org – Strona projektu Spring Framework
NamespaceHandler, która pozwoli nam na • http://static.springframework.org/spring/docs/2.5.x/api – Spring 2.5 API
zmapowanie parserów i dekoratorów do • http://static.springframework.org/spring/docs/2.5.x/reference/xsd-config.html – Konfiguracja
określonych elementów i atrybutów XML; oparta na XML Schema w Spring 2.5
• http://static.springframework.org/spring/docs/2.5.x/reference/extensible-xml.html – Własna prze-
• dodanie do wynikowej aplikacji lub biblio-
strzeń nazw wg Spring 2.5 Reference
teki meta-danych potrzebnych Springowi. • http://www.w3.org/XML/Schema – XML Schema
• http://www.w3.org/ – DOM XMl DOM
W kolejnych sekcjach opiszę szerzej każdy z
tych kroków.

www.sdjournal.org 53
XML

Dokument XSD kie elementy oraz atrybuty są w niej dopusz- w poszczególnych elementach i atrybutach na-
Dokument XML Schema pozwoli nam określić czalne, a jakie nie. Schema uwzględnia również szej przestrzeni oraz czy są one obowiązkowe.
składnię naszej przestrzeni nazw, czyli m.in. ja- informacje o tym jakie typy danych zawarte są Interesujący nas schemat mógłby mieć następu-
jącą postać – Listing 5.
Listing 6. Przykładowy parser komponentu Bar Tematyka tworzenia definicji XML Schema
jest poza zakresem tego artykułu. Ograniczę się
package foo; zatem do podsumowania, że zdefiniowaliśmy
import org.springframework.beans.factory.support.BeanDefinitionBuilder; właśnie element o nazwie bar zawierający jeden
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; (wymagany) atrybut o nazwie value. Element
import org.w3c.dom.Element; ten dziedziczy również po identyfikowalnym
public class BarParser extends AbstractSingleBeanDefinitionParser { typie Springa, co w praktyce oznaczna tyle, że
@Override również implicite dziedziczy atrybut id. Na-
// Oczekujemy instancji klasy Bar stępnym krokiem zbliżającym nas do działającej
protected Class<Bar> getBeanClass(Element element) { przestrzeni nazw będzie zmapowanie elementu
return Bar.class; XML zdefiniowanego powyżej do Javy.
}
@Override Parser elementu
protected void doParse(Element element, BeanDefinitionBuilder builder) { Aby przekonwertować element XML do instan-
// Odczytaj wartość atrybutu cji zarejestrowanej w kontenerze musimy napi-
String value = element.getAttribute("value"); sać parser implementujący interfejs org.spring
// i dodaj ją jako argument konstruktora wynikowej instancji framework.beans.factory.xml.BeanDefiniti
builder.addConstructorArgValue(value); onParser. Klasy implementujące wspomniane-
} go interfejsu służą do analizy pojedynczego ele-
} mentu XML znajdującego się bezpośrednio mię-
dzy elementami <beans></beans>, wraz z ew.
Listing 7. Handler mapujący przykładowy element 'bar' do wybranego parsera podelementami znajdującymi się wewnątrz na-
package foo; szej definicji. Nasz konkretny element <bar> jest
import org.springframework.beans.factory.xml.NamespaceHandlerSupport; raczej prosty tzn. nie zawiera zagnieżdżonych
public class BarNamespaceHandler extends NamespaceHandlerSupport { elementów i zwróci tylko jedną instancję (klasy
@Override Bar) do rejestracji w kontrolerze. Ograniczmy się
public void init() { zatem do dziedziczenia z klasy AbstractSingle
// zarejestruj instancję parsera dla BeanDefinitionParser – Listing 6.
// elementów <bar/> z tej przestrzeni nazw Klasa BeanDefinitionBuilder jest jedną z
registerBeanDefinitionParser("bar", new BarParser()); najważniejszych klas programowej obsługi kon-
} tenera Springa.
} Temat ten zasługuje na co najmniej parę
osobnych artykułów, tak więc ograniczę się tyl-
Listing 8. Zawartość pliku META-INF/spring.handlers ko do podania informacji, że klasa ta służy do
http\://www.foo.com/customSchema=foo.BarNamespaceHandler programowego tworzenia instancji klasy prze-
znaczonej do rejestracji w kontenerze. W tym
Listing 9. Zawartość pliku META-INF/spring.schema konkretnym przykładzie chcemy, aby nowy
http\://www.foo.com/customSchema.xsd=foo/foo.xsd obiekt klasy Bar został stworzony za pomocą
jednoargumentowego konstruktora.
Listing 10. Kod minimalnego komponentu 'Bar' rozszerzonego o listę swoich potomków
package foo; Zarejestrowanie
import java.util.List; elementu w NamespaceHandler
public class Bar { Instancje interfejsu org.springframework.bean
private String value; s.factory.xml.NamespaceHandler służą do łą-
private List<Bar> children; czenia przestrzeni nazw z parserami elementów
public Bar(String value) { oraz atrybutów XML. Sam NamespaceHandler
this.value = value; nie wykonuje logiki związanej z analizą elemen-
} tów i atrybutów XML, ponieważ całą logikę
@Override związaną z czytaniem dokumentu XML zawar-
public String toString() { liśmy w poprzednim kroku (w definicji parse-
return value; ra). NamespaceHandler oferuje parę metod po-
} zwalających na interakcję z nim w określonych
public void setChildren(List<Bar> children) { momentach jego cyklu życia, jakkolwiek na na-
this.children = children; sze skromne potrzeby zainteresujemy się jedynie
} bezargumentową metodą init() wywoływaną
public List<Bar> getChildren() { w momencie inicjalizacji handlera.
return children; W powyższym przykładzie (Listing 7) zma-
} powaliśmy parser napisany w poprzednim
} kroku do elementu XML <bar>. W miażdżą-
cej większości przypadków jeden handler bę-

54 11/2008
Spring 2 Schema

dzie mapował wiele parserów i/lub dekorato-


rów –nie implementujemy wielu handlerów Listing 11. Przykład użycia zagnieżdżonego komponentu
dla jednej przestrzeni nazw. Jak wspomnia- <myns:bar id="bar" value="parent">
łem wcześniej nasze potrzeby względem han- <myns:bar value="child1">
dlera są bardzo skromne – dlatego właśnie <myns:bar value="grandChild" />
dziedziczymy z klasy org.springframework. </myns:bar>
beans.factory.xml.NamespaceHandlerSupp <myns:bar value="child2" />
ort. Dzięki wspomnianej klasie pomocniczej </myns:bar>
możemy nadpisać metodę init() interfejsu
oraz nie martwić się o logikę związaną z reje- Listing 12. Uaktualniony dokument XML Schema uwzględniający zagnieżdżanie elementów
stracją parsera. <?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.foo.com/customSchema"
Meta-dane dla Springa xmlns:xsd="http://www.w3.org/2001/XMLSchema"
Ostatnim krokiem jest dodanie do korzenia targetNamespace="http://www.foo.com/customSchema"
ścieżki klas naszej aplikacji lub biblioteki fol- elementFormDefault="qualified" attributeFormDefault="unqualified">
deru META-INF wraz z plikami spring.handlers
oraz spring.schemas – Listing 8 i Listing 9. <xsd:element name="bar">
Jak widać pierwszy z nich mapuje URI prze- <xsd:complexType>
strzeni nazw na napisany przez nas wcześniej <xsd:choice minOccurs="0" maxOccurs="unbounded">
handler – tą metodą Spring wie których par- <xsd:element ref="bar" />
serów powinien użyć dla poszczególnych ele- </xsd:choice>
mentów i atrybutów w określonej przestrzeni <xsd:attribute name="id" type="xsd:ID" />
nazw. Drugi zaś wskazuje fizyczną lokalizację <xsd:attribute name="value" use="required" type="xsd:string" />
pliku XSD z definicją naszej przestrzeni – w </xsd:complexType>
tym konkretnym przypadku plik z definicją po- </xsd:element>
winien znajdować się w pakiecie foo i nazywać
się foo.xsd. Pragę zwrócić uwagę na koniecz- </xsd:schema>
ność poprzedzania znaków dwukropka w oby-
dwu plikach znakiem backslash (ze względu na Listing 13. Parser elementu 'bar' uwzględniający rekurencję
fakt, że nie tylko znak równości, ale i dwukro- package foo;
pek są poprawnymi symbolami końca klucza w import java.util.List;
plikach właściwości Javy). import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
Zagnieżdżanie elementów import org.springframework.beans.factory.support.ManagedList;
– rozszerzony przypadek użycia import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
Powyższy przykład jest nieco prosty, gdyż za- import org.springframework.beans.factory.xml.ParserContext;
kłada że sparsowany element XMLa zareje- import org.springframework.util.xml.DomUtils;
struje tylko jedną instancję określonej klasy w import org.w3c.dom.Element;
kontrolerze. Jeżeli chcielibyśmy rekurencyjnie public class BarParser extends AbstractBeanDefinitionParser {
parsować i rejestrować zagnieżdżone elemen-
ty XML powinniśmy stworzyć parser dziedzi- protected AbstractBeanDefinition parseInternal(Element element,
czący po czymś potężniejszym niż AbstractSi ParserContext parserContext) {
ngleBeanDefinitionParser – tą klasą jest np. // Stwórz budowniczego definicji elementu
AbstractBeanDefinitionParser. Wyobraź- BeanDefinitionBuilder barBuilder = BeanDefinitionBuilder
my sobie, że nasz przypadek użycia rozszerzy- .rootBeanDefinition(Bar.class);
my w następujący sposób – otóż nasz potężny barBuilder.addConstructorArgValue(element.getAttribute("value"));
komponent Bar został rozszerzony o listę swo-
ich dzieci (dla uproszczenia przykładu również // Wyszukanie dzieci elementu określonego typu
instancji klasy Bar) – Listing 10. List<Element> childElements = DomUtils.getChildElementsByTagName(
Przykładowy scenariusz konfiguracji drzewa element, "bar");
komponentów Bar w pliku XML mógłby wy- if (childElements != null) {
glądać następująco – Listing 11. // Dodanie potomków do listy zarządzanej przez kontener
Powyższa zmiana konfiguracji pociąga za so- ManagedList children = new ManagedList(childElements.size());
bą oczywiście konieczność aktualizacji doku- for (Element e : childElements) {
mentu XML Schema – Listing 12. // Rekurencja
Poza schematem XML w stosunku do po- children.add(parseInternal(e, parserContext));
przedniego przykładu zmianie uległby w zasa- }
dzie tylko sam parser – Listing 13. barBuilder.addPropertyValue("children", children);
Powyższy parser mógłby dziedziczyć po kla- }
sie AbstractSingleBeanDefinitionParser i return barBuilder.getBeanDefinition();
dalej zwracać wynik zgodny z zadanym scena- }
riuszem, jakkolwiek dziedziczenie po Abstrac
tBeanDefinitionParser pozwala na jego nie- }
co czytelniejszą implementację.

www.sdjournal.org 55
XML

Własne atrybuty mentu w pliku konfiguracyjnym – Listing 14. wartość licznika wskazującego ile elementów
– przypadek użycia Załóżmy, że chcemy aby podczas parsowania oznaczonych identyczną wartością znaleziono
Ostatnim istotnym przypadkiem użycia jest elementu oznaczonego atrybutem myns:bar dotychczas w kontenerze.
dodanie własnego atrybutu do dowolnego ele- (o dowolnej wartości) na konsoli pojawiała się
Zmiany w implementacji
Listing 14. Przykład użycia atrybutu XML z własnej przestrzeni nazw Jak łatwo się domyśleć na pierwszy ogień pój-
<bean class="java.lang.String" myns:bar="barValue" > dzie aktualizacja schematu XML – Listing 15.
<constructor-arg value="someValue"/> Podobnie jak w przypadku własnych ele-
</bean> mentów, dla nowego atrybutu również musi-
my napisać własny parser. Możemy to wygod-
Listing 15. Dokument XML Schema dla minimalnego atrybutu nie zrobić poprzez implementację interfejsu
<?xml version="1.0" encoding="UTF-8"?> BeanDefinitionDecorator – Listing 16.
<xsd:schema xmlns="http://www.foo.com/customSchema" Tym razem będziemy również musieli zmo-
xmlns:xsd="http://www.w3.org/2001/XMLSchema" dyfikować BarNamespaceHandler.
targetNamespace="http://www.foo.com/customSchema" Wynika to z faktu, iż tym razem nie rejestru-
elementFormDefault="qualified" attributeFormDefault="unqualified"> jemy parsera definicji beana, a tylko tzw. deko-
rator, czyli mniejszy parser służący do mody-
<xsd:attribute name="bar" type="xsd:string" /> fikacji lub wzbogacania wybranego fragmen-
tu definicji. Oczywiście wyświetlanie informa-
</xsd:schema> cji o tym którą z kolei definicję oznaczoną kon-
kretną wartością parsuje kontener, jest w real-
Listing 16. Parser minimalnego atrybutu z własnej przestrzeni nym świecie średnio przydatne, jakkolwiek do-
package foo; stęp do parametrów BeanDefinitionHolder
import java.util.HashMap; oraz ParserContext daje nam możliwość ma-
import org.springframework.beans.factory.config.BeanDefinitionHolder; nipulacji kolejno definicją dekorowanego ele-
import org.springframework.beans.factory.xml.BeanDefinitionDecorator; mentu (możemy również zwrócić całkowicie
import org.springframework.beans.factory.xml.ParserContext; nową instancję zamiast modyfikować istnie-
import org.w3c.dom.Attr; jącą) oraz całym rejestrem kontenera. Nieste-
import org.w3c.dom.Node; ty ze względu na ograniczony rozmiar niniej-
szego artykułu jestem zmuszony przemilczeć
public class BarParser implements BeanDefinitionDecorator { szczegóły dotyczące możliwości programowej
HashMap<String, Integer> counters = new HashMap<String, Integer>(); manipulacji definicjami beanów oraz zawarto-
@Override ścią kontenera.
public BeanDefinitionHolder decorate(Node node,
BeanDefinitionHolder holder, ParserContext ctx) { Podsumowanie
// odczytaj wartość atrybutu W niniejszym artykule poznaliśmy podsta-
String value = ((Attr) node).getValue(); wowe sposoby rozszerzania możliwości kon-
// sprawdź wartość licznika figuracyjnych plików XML w Springu za po-
Integer i = counters.get(value); mocą własnych przestrzeni nazw. Znając spo-
if (i == null) { soby na analizę elementów XML najwyższe-
i = 0; go poziomu (wraz z ich ew. zagniżdżenia-
} mi) oraz atrybutów XML możemy rozpocząć
// zwiększ licznik tworzenie własnych przestrzeni nazw, któ-
counters.put(value, ++i); re przy minimalnej znajomości XML DOM
// wyświetl wynik oraz API programowej manipulacji zawar-
System.out.println(value + ": " + i); tością kontenera IOC Springa pozwolą nam
return holder; na napisanie w pełni funkcjonalnych mapo-
} wań dla naszych komponentów. Tematyka
} tego artykułu powinna w szczególności za-
interesować osoby dostarczające dla innych
Listing 17. Handler mapujący parser do atrybutu 'bar' firm programistycznych gotowe rozwiąza-
package foo; nia oparte na Springu ze względu na zmini-
malizowanie wiedzy wymaganej przez klien-
import org.springframework.beans.factory.xml.NamespaceHandlerSupport; ta do poprawnego stosowania naszych kom-
ponentów.
public class BarNamespaceHandler extends NamespaceHandlerSupport {
HENRYK KONSEK
@Override Autor pracuje na stanowisku projektanta JEE w
public void init() { warszawskiej firmie Artegence. Udziela się rów-
registerBeanDefinitionDecoratorForAttribute("bar", new BarParser()); nież jako administrator serwisu javablackbelt.com.
} W wolnym czasie interesuje się swoją Anią oraz
m.in. psychiatrią oraz dobrymi technologiami.
} Kontakt z autorem: http://www.hekonsek.pl lub he-
konsek@gmail.com.

56 11/2008
Kasa dla webmastera

LinkLift
Koniec z reklamą kontekstową

Internecie królują systemy reklamy kontekstowej. W oparciu o treść


witryny, wyświetlane są odpowiednie reklamy z takich serwisów jak
Google AdSense, czy AdKontekst Wirtualnej Polski. Zarobki z takich reklam
są jednak stosunkowo niewielkie, stąd istnieje zapotrzebowanie na inne
formy reklamy. Gwarantowany zarobek oferuje nowy wchodzący do Polski
LinkLift.

strony i wyceny będziemy chcieli zmienić te


Dowiesz się: Powinieneś wiedzieć: dane, będzie to możliwe (ręczna zmiana wy-
• Jak dodatkowo zarobić na reklamie; • Jak umieścić kod PHP na swojej stronie. ceny jest właśnie wdrażana, lecz można o nią
• Dlaczego era reklamy kontekstowej może się poprosić administratora). Sam algorytm wy-
kończyć. ceny uwzględnia takie czynniki, jak tematy-
ka strony, pozycja linków na stronie, liczba
sprzedanych linków, liczba linków zewnętrz-
Z kim wchodzimy w interesy nych, wiek strony, ilość linków zwrotnych i
LinkLift został założony w 2006 roku w sąsiedztwo oraz przynależność do określo-
Poziom trudności Niemczech, zaś swym zasięgiem obejmuje nej branży.
już Francję, Włochy, Hiszpanię i Polskę. Fir- Osoba chcąca umieścić swoją reklamę, bę-
ma zatrudniła także polskich administrato- dzie mogła przeglądać dostępne przestrze-
rów, dzięki czemu można otrzymać odpo- nie reklamowe, wraz ze statystykami strony

Z
biegiem czasu formy reklamy w In- wiedź na każde pytanie w ciągu kilku dni. Na- m.in. w Yahoo, DMOZ i Alexa Rank. Poda-
ternecie rozwinęły się. Początkowo leży podkreślić, że są to osoby pomocne i cier- ne są także Page Rank strony oraz Page Rank
dostępne były jedynie reklamy tek- pliwe – pomogą nawet w instalacji skryptu na i ilość stron linkujących do danej, także bar-
stowe lub graficzne, płaciło się zaś za ilość własnej platformie. dzo szczegółowe statystyki, które powodu-
wyświetleń. ją, że znajomość dokładnego adresu nie jest
Następnie prym zaczęły wieść reklamy ro- Wycena linku potrzebna (jeśli zezwolimy, będzie on wi-
bione we flashu, a wraz z nimi przyszło pła- LinkLift oferuje jedynie odnośniki tek- doczny).
cenie niezależne od ilości wyświetleń, lecz stowe, podobnie jak do niedawna Google
od ilości kliknięć w reklamę. Niektórzy po- AdSense. Zarejestrować w serwisie mo- Instalacja skryptu
sunęli się jeszcze dalej – korzyści otrzymy- żemy się przez stronę http://www.linklift.pl/ Serwis współpracuje ze stronami stworzony-
wało się jedynie, jeśli użytkownik kliknął w ?ref=a1267774449. Następnie, jeśli chce- mi w PHP, Perlu, WordPressie, Joomli, Dru-
reklamę na naszej stronie, a następnie za- my oferować przestrzeń reklamową na na-
rejestrował się na witrynie reklamowanej szej stronie, zgłaszamy ją do serwisu. W cią-
lub kupił z niej jakiś produkt, bądź zamó- gu tygodnia (zazwyczaj dużo krócej) zosta-
wił usługę (taka forma reklamy jest dostęp- nie ona zweryfikowana przez administrato-
na także w Google AdSense jako tzw. skie- rów i podana zostanie wycena jednego lin-
rowania). ku tekstowego. LinkLift oferuje umieszcze-
Rezultatem takich praktyk było obniżenie nie do dziesięciu linków tekstowych na jed-
się zarobków webmasterów do tego stopnia, nej stronie, przy czym możemy określić,
że reklama na witrynie średnio poczytnej za- w której części strony będą one wyświetla-
częła być dyskusyjna – czy jest ona jeszcze ne – w nawigacji, części głównej strony, lub
opłacalna. stopce. Określamy także kategorię strony i,
W tej sytuacji odważniejsze serwisy wy- czy reklamy będą widoczne na pojedynczej
szły naprzeciw wymaganiom twórców stron stronie, czy także na wszystkich jej podstro-
i wprowadziły reklamy płatne za czas wy- nach. W zależności od tych ustawień, mo-
świetlania, nie zaś za ilośc odsłon lub klik- żemy oszacować wycenę jednego linku (Ry-
nięć. Pionierskim serwisem tego typu w Pol- sunek 1). Pomoże w tym poręczny kalkula- Rysunek 1. Kalkulator pomagający oszacować
sce jest LinkLift. tor na witrynie LinkLiftu. Jeśli po akceptacji wartość jednego linka

58 11/2008
LinkLift – pewny zarobek na reklamie

palu, Xoops, Serendipity oraz Joggerze. Ten Pierwsi klienci • 25 zł plus bonus promocyjny w wysokości
ostatni jest polskim systemem blogowania, Dopóki pierwszy klient nie zamówi u nas re- 5 zł za Advertiser Lead ;
który został dodany ekskluzywnie na potrze- klamy, będzie wyświetlana domyślna (dar- • 25 zł plus bonus promocyjny w wysokości
by polskich bloggerów – widać więc, że fir- mowa). Dla strony o Page Rank 0 (czyli no- 5 zł za Publisher Lead .
ma rozwija się prężnie i nie pozostaje obojęt- wej w Internecie) cena wyjściowa to około
na na potrzeby rynku. Wybierając którąś z po- 4zł - 7zł za jednego linka tekstowego. Jeśli Należność za Advertiser Lead przysługuje,
wyższych opcji, szybko skonfigurujemy nasz ktoś zdecyduje się wykorzystać naszą prze- gdy reklamodawca (ang. advertiser) zamó-
skrypt, który wystarczy wkleić do szablonu strzeń reklamową, zostaniemy poinformo- wi linki tekstowe o wartości minimum 120
naszej strony. wani o tym mailem. W ciągu 24 godzin mo- zł. Należność za Publisher Lead przysługu-
Nadszedł czas na główną zaletę LinkLiftu żemy zaakceptować lub odrzucić propozy- je, gdy skierowany reklamobiorca (ang. pu-
– brak inwazyjności. Niby Google AdSense cję reklamy z oferowaną przez zleceniodaw- blisher) udostępni swoją stronę w serwisie
oferuje także linki tekstowe, jednak według cę wyceną. Po tym czasie link jest automa- przez minimum miesiąc (bez przerw).
swojego szablonu, którego nie można zmie- tycznie akceptowany na okres 30 dni. Ceny
niać, co często jest bardzo irytujące. Rekla- podawane na witrynie są cenami netto (z ra- Reklamujemy naszą stronę
ma wyświetlana przez linklift ma przykłado- cji oferowanych usług w różnych krajach o Oczywiście, możemy także wykupić prze-
wą strukturę: różnych stawkach podatkowych) – w Pol- strzeń reklamową u innych użytkowników
sce otrzymujemy 70% wartości podanej na systemu. Po wpłaceniu pierwszych pienię-
<a href=”http://blog.eldoras.com” witrynie. dzy na konto przez PayPal, otrzymujemy do-
rel=”nofollow”>Blog autora</a> Wszystkie płatności w serwisie są realizowa- datkowe 60zł na kupno przestrzeni rekla-
ne przez PayPal, który jest w pełni dostępny w mowych.
I tyle! Żadnych dodatkowych znaczników, ca- Polsce. Minimalna kwota do wypłaty to 60zł.
łość możemy dowolnie modyfikować pod ką- Podsumowanie
tem wyglądu i rozmieszczenia. Pełna swobo- Program partnerski Z usług LinkLiftu często korzystają użytkow-
da. Na Rysunku 2 widać reklamy LinkLiftu Jak każdy porządny system reklamowy (poza nicy blogosfery, czyli autorzy witryn o Page
(czerwona obwódka) i Google AdSense (zie- Google AdSense), tak też LinkLift oferuje Pro- Rank 3 – 6. Osoby te mnóstwo czasu spędza-
lona obwódka) w akcji – jedna linijka LinkLi- gram Partnerski. Do wyboru mamy całą gamę ją w Internecie i są świetnie obeznane w syste-
ftu zawiera 4 reklamy, które idealnie kompo- linków graficznych i tekstowych, które może- mach reklamowych.
nują się ze stroną, podczas gdy Google Ad- my umieścić na naszej witrynie. Wynagrodze- LinkLift zdobył ich zaufanie i sprawdza się
Sense jest wyraźnie bardziej inwazyjne. nie można otrzymać za: bardzo dobrze, dlatego polecamy go wszyst-
Należy podkreślić, iż LinkLift nie jest re- kim, którym nie odpowiadają dotychczasowe
klamą kontekstową, więc może występo- • polecenie naszej strony użytkownikowi, formy reklamy. Zasady są proste – płacimy za
wać równolegle z reklamami Google AdSen- który zarejestruje się jako reklamodawca i reklamę na miesiąc i przez miesiąc ona widnie-
se. Reklamy LinkLiftu mają w swoim kodzie dokona zakupu linku tekstowego ("Adver- je na danej stronie. Prostota to kolejny plus Lin-
rel=”nofollow”, dzięki czemu nie są przez tiser Lead") lub ; kLiftu.
wyszukiwarki traktowane jak linki wychodzą- • polecenie strony użytkownikowi, który
ce, które obniżają nasz Page Rank – zapobie- zarejestruje się i zostanie zaakceptowany
ga to wykorzystaniu systemu przez reklamo- jako reklamobiorca ("Publisher Lead").
dawców do podwyższenia swoich pozycji w wy-
szukiwarkach przez zwiększenie ilości stron do Partner otrzymuje wynagrodzenie w wyso-
nich linkujących. kości:

Rysunek 3. Estetyczna strona porządnego


systemu LinkLift

KRZYSZTOF TRYNKIEWICZ
Krzysztof Trynkiewicz studiuje Informatykę na
Uniwersytecie Jagiellońskim. Od wielu lat zajmu-
je się tworzeniem witryn w technologii PHP i Flash
oraz publicystyką. Obecnie rozwija kilka równole-
głych projektów autorskich dostępnych na witrynie
http://blog.eldoras.com
Rysunek 2. Porównanie reklam Google AdSense i LinkLiftu Kontakt z autorem: chris.trynkiewicz@gmail.com

www.sdjournal.org 59
Narzędzia programistyczne

Plugin
Wielokrotne wykorzystanie sprawdzonych narzędzi

Tworzenie aplikacji, składa się zarówno z tych bardziej twórczych, jak


i bardziej odtwórczych prac. Mimo wszelkich naszych starań tworzenia
wedle zasady DRY (z ang. DRY – Don't Repeat Yourself), ile razy zdarza się,
że dla tej samej funkcjonalności powielamy i dostosowujemy ten sam kod
w różnych elementach aplikacji lub pomiędzy różnymi aplikacjami.
lub w wersji 1.1:
Dowiesz się: Powinieneś wiedzieć:
• Efektywnie wykorzystywać pluginy w swojej • Jak stworzyć projekt w symfony; <cd mojprojekt
pracy; • Posiadać doświadczenie w tworzeniu aplika- <symfony plugin:install nazwapluginu
• Stworzyć własny plugin; cji;
• Wykorzystywać istniejące pluginy to szybkie- • Posiadać doświadczenie w obiektowym PHP. Dokładną informację, jak należy zainstalować
go tworzenia aplikacji. potrzebny plugin do określonej wersji Symfo-
ny, możemy podejrzeć na stronie pluginu, w
zakładce Installation.
• sfThumbnailPlugin – tworzenie miniaturek
zdjęć; Rozpoczęcie pracy
• sfControlPanelPlugin – interfejs do zarzą- Do rozpoczęcia pracy potrzebujemy oczywiście
Poziom trudności dzania Symfony z poziomu przeglądarki; utworzonego projektu Symfony. Poszczególne
• sfLightboxPlugin – łatwe wykorzystywanie kroki tworzenia projektu dokładnie przedstawi-
skryptu AJAX-owego Lightbox2; liśmy na początku prezentacji multimedialnej.

N
a początek zaprezentuję najczęściej • sfSslRequirementPlugin – wprowadzenie Jak stworzyć plugin, zaprezentowaliśmy na
wykorzystywane pluginy w Symfony, kodowania SSL dla akcji; płycie dołączonej do Software Developer’s Jour-
których jest w chwili pisania artykułu • sfPropelActAsNestedSetBehaviorPlugin – nal 7/2008. W związku z tym, że sam plugin był
ponad 200. Następnie stworzymy prosty doda- wdrożenie algorytmu nested set zintegro- tworzony ponad pół roku temu, niektóre wyko-
tek do wysyłania maila (ang. plugin) w symfony, wanego z obiektami Propela; rzystane w nim techniki są już wycofywane.
bez dodatkowego nakładu naszej pracy. • sfPokaYoke – walidacja formularzy po stro- Aby nasz plugin był zgodny z symfony 1.0 na-
nie klienta. leży włączyć parametr compat_10 w pliku konfi-
Pluginy w Symfony guracyjnym config/settings.yml naszej aplikacji.
W Symfony jeden z największych walorów mo- Zmiany warto śledzić na bieżąco, gdyż pluginy Jest tam również kod źródłowy pluginu. Po-
żemy odnaleźć w liczbie i różnorodności plu- cały czas są tworzone i rozwijane. niżej omówimy zawartość płyty oraz pokaże-
ginów. Obecnie z ponad 200 pluginów mo- Przy korzystaniu z projektów, warto jest za- my, w jaki sposób można ją rozbudowywać.
żemy np. szybko stworzyć prosty CMS, Blog interesować się licencją, zgodnie z którą jest wy-
czy Forum, podłączyć do naszej aplikacji bez- dawany plugin. Licencję pluginu można zna- Struktura pluginu
pieczny mechanizm autoryzacji i autentyfika- leźć na stronie pluginu na http://symfony-pro- Sporym ułatwieniem jest, zorganizowanie
cji sfGuardPlugin, czy łatwo podczepić AJAX- ject.com oraz w głównym katalogu pluginu, w struktury katalogów i plików pluginu, w
owe biblioteki. pliku LICENSE. bardzo podobny sposób co struktura naszej
Wszystkie z nich tworzone są bezpłatnie Zdecydowana większość z nich jest wydawa- aplikacji. Dzięki temu bez problemu może-
przez społeczność Symfony i znajdziemy je na na na licencji MIT, tak jak i samo symfony, w my odnaleźć się w jego zawartości. Łatwo jest
stronie: http://www.symfony-project.org/plugins/ związku z czym bez przeszkód możemy je wyko- również przenieść istniejącego moduł w na-
Każdy plugin posiada dostępny kod źródło- rzystywać również w celach komercyjnych. szej aplikacji, aby funkcjonował jako osob-
wy, który budowany jest zgodnie z przyjętą ny moduł.
w Symfony strukturą, dzięki czemu łatwo się Instalacja pluginu Struktura plików przedstawiona została na
nam w nim odnaleźć. Wśród dostępnych plugi- Najczęściej pluginy wymienione na Symfony Listingu 1.
nów można między innymi znaleźć: Plugins zostały przygotowane jako paczki PE- Pamiętaj – aby po każdej zmianie struktury
AR, dlatego możemy je zainstalować, podając pluginu zalecane jest czyszczenie cache projek-
• sfSimpleCMSPlugin – prosty CMS do za- w Symfony 1.0 polecenie: tu komendą symfony cc.
rządzania treścią i strukturą strony; Postaramy się przedstawić najważniejsze ele-
• sfGuardPlugin – autoryzacja i zarządzanie <cd mojprojekt menty struktury i podać przykłady informacji,
użytkownikami oraz uprawnieniami; <symfony plugin-install nazwapluginu jakie można w nich zawrzeć.

60 11/2008
Plugin

Moduły Zadania wywołującą zadanie (zainteresowanych odsy-


Moduły umieszczamy w katalogu modules/. Nasz do uruchomienia z linii komend łam do Listingu 4).
prezentacyjny plugin posiada moduł (ang. Modu- Nowe zadania (ang. Tasks) tworzone w plu-
les) sfMailForm. W zależności od potrzeby, każdy ginie zawieramy w katalogu data/tasks/. Każ- Tworzenienie
moduł może zawierać cztery katalogi: de zadanie umieszczamy w oddzielnym pli- pluginu jako paczki PEAR
ku, który powinien zawierać wywołanie funk- Aby nasz plugin można było instalować za pomo-
• actions – definiujący dostępne akcje dla cji pake_desc oraz pake_task, a także funkcję cą komendy symfony plugin:install musi on
modułu;
• config – określający specyficzną konfigura-
cję samego modułu; Listing 1. Struktura plików pluginu
• templates – widoki dla modułów zwracane nazwaPluginu/
po wywołaniu akcji; config/
• validate – formularze sprawdzania wpro- *schema.yml # plik ze schematem bazy danych
wadzanych danych przez formularze. config.php # specyficzna konfiguracja dla pluginu
data/
W praktyce przyjęło się tworzenie dodatkowe- generator/
go katalogu lib/, zawierającego klasę z wszystkimi sfPropelAdmin/
akcjami (Listing 1). W pliku actions.class.php po- nazwaSzablonu/ # skórka dla admin generatora
zostawia się jedynie rozszerzenie do klasy z kata- template/
logu lib/ (Listing 2). Takie rozwiązanie zostało za- skeleton/
stosowane w przykładowym pluginie. fixtures/
*.yml # testowe informacji do bazy danych
Konfiguracja pluginu lib/
Konfigurację dla pluginu definiujemy config/ *.php # miejsce na nasze klasy
w katalogu pluginu. Może ona składać się z helper/
dwóch elementów: *.php # pomocniki
model/
• konfiguracji dla naszego pluginu – plik *.php # model danych, generowany z propela
config.php; task/
• struktury bazy danych – plik schema.xml Task.class.php # zadania do uruchomienia w pasku komend
lub schema.yml. modules/
nazwaModulu/ # nazwa tworzonego modułu
W pliku konfiguracyjnym config.php może- actions/
my elastycznie odwoływać się do konfiguracji config/
naszej aplikacji i dowolnie dopisywać lub mo- module.yml
dyfikować wprowadzone wartości. Przykła- view.yml
dowo możemy stworzyć przyjaźniejszy ad- security.yml
res wysyłania formularza na /wyslij zamiast / templates:
sfmailForm/submit (przykład na Listingu 2). *.php
W pliku definicji struktury bazy danych validate:
(plik schema.yml lub schema.xml) tworzymy *.yml
konfigurację – podobnie jak w całym projek-
Listing 2. Przykład wykorzystania konfiguracji w pliku config.php
cie. Wyjątkiem jest zawarcie w pliku informacji
o pakiecie (przykład na Listingu 3). Stworzona $r = sfRouting::getInstance(); // pobranie instancji odpowiedzialnej
schema będzie bez problemu wykrywana przez za przekierowania
wywoływanie komendy z prefiksem propel. $r->prependRoute('submit', '/wyslij',
Na Listingu 3 znajduje się przykład pliku array(
schema.yml, zawierający tabelę sfMailform_ 'module' => 'sfMailForm',
archive, która będzie zapisywać dane wprowa- 'action' => 'submit')
dzone w naszym przykładowym formularzu. ); // dopisanie czytelniejszego adresu
Po skonfigurowaniu pliku czeka nas jesz- // z /sfMailForm/submit na /wyslij
cze tylko dobre skonfigurowanie pliku databa-
ses.yml w naszym projekcie oraz budowa mode- Listing 3. Przykładowa schema.yml z encją gromadzącą informacje z wprowadzonych danych z
lu Propela, SQL-a i stworzenie struktury w ba- formularzy
zie danych (np. za jednym zamachem komendą propel:
symfony propel-build-all). _attributes: { package: plugins.sfMailFormPlugin.lib.model }
# deklaracja informacji o pakiecie (miejscu zapisu
Dane do testów (fixtures) klas pluginu)
Dane do testów umieszczamy w plugine w ka- sfMailForm_archive:
talogu data/fixtures/. Wywoływanie ładowa- attributes: { phpName: pluginMailForm }
nia danych wykonujemy komendą symfony id:
propel-load-data. Zawieramy tutaj dane, content: { type: longvarchar }
które chcielibyśmy umieścić w bazie danych, created_at:
tak aby nasz plugin działał poprawnie.

www.sdjournal.org 61
Narzędzia programistyczne

mieć zdefiniowany w głównym katalogu plik pac- instance" xsi:schemaLocation="http: • <name>: imię i nazwisko;
kage.xml. Plik ten zawiera w odpowiednio przy- //pear.php.net/dtd/tasks-1.0 http:// • <user>: nazwa użytkownika (w przy-
gotowanym formacie XML-owym wszystkie po- pear.php.net/dtd/tasks-1.0.xsd http: padku gdy jest to projekt na symfony-
trzebne informacje o pluginie. Opiszę wszystkie //pear.php.net/dtd/package-2.0 http:// project.org, będzie to login do zarzą-
możliwe do zastosowania znaczniki wraz z przy- pear.php.net/dtd/package-2.0.xsd">. Z ele- dzania projektami);
kładowymi wartościami dla naszego pakietu. mentów poniżej mamy: • <email>: poprawny adres e-mail lidera;
• <active>: informacja czy osoba nadal
Możliwe znaczniki • <name>: nazwa pluginu; w naszym przy- pracuje nad tym projektem (wartości:
Główny znacznik w pliku package.xml zawiera padku: sfMailFormPlugin; yes lub no);
<?xml version="1.0" encoding="UTF-8"?>, a • <channel>: informacja na jakim serwerze • <date>: data ostatniej poprawki w paczce
pod nim mamy informację o pakiecie: znajduje się paczka (w przypadku paczek (np.: 2008-12-31);
<package packagerversion="1.4.1" dostępnych na symfony-project.org, będzie • <time>: czas ostatniej poprawki w paczce
version="2.0" xmlns="http://pear.php.net/ to: plugins.symfony-project.org); (np.: 23:59:00);
dtd/package-2.0" xmlns:tasks="http: • <summary>: krótki opis o samym pluginie; • <version>: informacje o wydanej wersji:
//pear.php.net/dtd/tasks-1.0" xmlns: • <description>: dłuższy opis; • <release> i <api>: numer wydania;
xsi="http://www.w3.org/2001/XMLSchema- • <lead>: informacja o liderze projektu: • <stability>: informacja o stabilności wy-
dania;
Listing 4. Przykładowa budowa zadania mailform-raport • <release> i <api>: słowna informacja
<?php o stabilności (np. stable, beta, alpha);
/** • <license uri=”xxx”>: informacja o na-
* Raport o statystykach wypełniania formularza zwie licencji wraz z odesłaniem do strony
* plik: /plugins/sfMailFormPlugin/data/tasks/sfMailFormRaport.php z jej treścią podawaną w atrybucie uri;
*// • <notes>: miejsce na dodatkowe komentarze;
pake_desc('raport o statystykach do administratora – przeslanie na adres e-mail'); • <contents>: lista zamieszczonych plików:
pake_task('mailform-report', 'project_exists'); • <dir name=”xxx”>: nazwa katalogu
pake_alias('mailreport', 'mailform-report'); // możliwość używania skrótu „mailreport” podawana w atrybucie name;
/** • <file role=”data” name=”xxx”>:
* Funkcja wywoływana przy uruchomieniu zadania nazwa pliku (atrybut name);
* @param pakeTask $task • <dependencies>: zależności występu-
* @param Array $args jące przy naszej paczce:
*/ • <php>: zależność od wersji PHP
function run_mailform-report($task, $args) (np. ze znacznikiem <min>5.2.0</
{ min>, umożlwi instalację, gdy na ser
if (!count($args)) werze znajdować będzie się wersja
{ 5.2.0 lub wyższa);
throw new Exception('Podaj proszę adres e-mail, na który ma przyjść raport'); • <pearinstaller>: zależność od
} wersji PEAR;
$emial = $args[0]; • <package>: zależność od innych
// ... paczek symfony:
// miejsce na kod wyciągający dane z bazy i wysyłający mail z raportem • <name>: nazwa paczki;
// .. • <channel>: informacja o ser
} werze, na którym paczka się
znajduje;
• <min>: minimalna wersja paczki;
• <max>: maksymalna wersja
paczki;

PIOTR PLENIK, FIRMA TEAMLAB


Współzałożyciel firmy TeamLab.pl, specjalizującej
się w wytwarzaniu oprogramowania klasy enter-
prise. Zawodowo zajmujący się tworzeniem oraz
rozwojem aplikacji dla biznesu, typu CMS i CRM.
W wolnym czasie redaktor serwisu www.symfo-
ny.pl. W PHP programuje 2000 r., w frameworku
symfony od 2006 r.. Administrator portalu dla Or-
ganizacji Pozarządowych – www.ngo.pl. Absol-
went ostatniego roku Polsko-Japońskiej Wyższej
Szkoły Technik Komputerowych. Interesuje się za-
rządzaniem projektami biznesowymi oraz open
source, programowanie (PHP, ASP.NET, Java) oraz
bazy danych (MS SQL, PostgreSQL, MySQL).
Kontakt z autorem: piotr.plenik@teamlab.pl, strona
Rysunek 1. Schemat utworzonej bazy danych http://www.teamlab.pl

62 11/2008
Plugin

Poprawnie stworzony plugin zawsze powi- Podsumowanie wolnej funkcjonalności jest równie proste jak
nien mieć plik LICENSE, opisujący warunki Wiele rozszerzeń dla symfony już powstało tworzenie nowych bibliotek PEAR i umożli-
jego używania. Zalecane jest również doda- – są gotowymi pluginami, łatwymi do insta- wiających ponowne wykorzystywanie pomię-
nie pliku README zawierającego np. historię lacji, aktualizacji czy odinstalowania z naszej dzy różnymi aplikacjami.
zmian, działanie pluginu, jak instalować, itd. aplikacji. Tworzenie nowych pluginów o do-

Listing 5. Przykład zawartości paczki package.xml dla pluginu w symfony

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


<package packagerversion="1.4.6" version="2.0" xmlns="http: <dir name="task">
//pear.php.net/dtd/package-2.0" xmlns: <!-- tasks -->
tasks="http://pear.php.net/dtd/tasks- <file role="data" name="sfSampleTask.class.php" />
1.0" xmlns:xsi="http://www.w3.org/ </dir>
2001/XMLSchema-instance" xsi: <dir name="validator">
schemaLocation="http://pear.php.net/ <!-- validators -->
dtd/tasks-1.0 http://pear.php.net/dtd/ <file role="data" name="sfSampleValidator.class.
tasks-1.0.xsd http://pear.php.net/dtd/ php" />
package-2.0 http://pear.php.net/dtd/ </dir>
package-2.0.xsd"> </dir>
<name>sfPrzykladowyPlugin</name> <dir name="modules">
<channel>plugins.symfony.pl</channel> <dir name="sfSampleModule">
<summary>przykładowy plugin w symfony</summary> <file role="data" name="actions/
<description>To jest przykładowy plugin w symfony, w celu actions.class.php" />
pokazania zawartosci package.xml</ <file role="data" name="config/security.yml" />
description> <file role="data" name="lib/BasesfSampleModuleAc
<lead> tions.class.php" />
<name>Piotr PLENIK</name> <file role="data" name="templates/
<user>jupeter</user> indexSuccess.php" />
<email>piotr.plenik@teamlab.pl</email> </dir>
<active>yes</active> </dir>
</lead> <dir name="web">
<date>2008-01-01</date> <dir name="css">
<time>12:53:01</time> <!-- stylesheets -->
<version> <file role="data" name="sfSampleStyle.css" />
<release>1.0.0</release> </dir>
<api>1.0.0</api> <dir name="images">
</version> <!-- images -->
<stability> <file role="data" name="sfSampleImage.png" />
<release>beta</release> </dir>
<api>beta</api> </dir>
</stability> </dir>
<license uri="http://www.symfony-project.org/license">MIT </contents>
license</license> <dependencies>
<notes>-</notes> <required>
<contents> <php>
<dir name="/"> <min>5.2.0</min>
<file role="data" name="README" /> </php>
<file role="data" name="LICENSE" /> <pearinstaller>
<dir name="config"> <min>1.4.1</min>
<!-- model --> </pearinstaller>
<file role="data" name="schema.yml" /> <package>
</dir> <name>sfGuardPlugin</name>
<dir name="data"> <channel>pear.symfony-project.com</channel>
<dir name="fixtures"> <min>1.1.13</min>
<!-- fixtures --> <max>1.1.15</max>
<file role="data" name="fixtures.yml" /> <exclude>1.1.14</exclude>
</dir> </package>
</dir> </required>
<dir name="lib"> </dependencies>
<dir name="model"> <phprelease />
<!-- model classes --> <changelog />
<file role="data" name="sfSampleClass1.php" /> </package>
<file role="data" name="sfSampleClass2.php" />

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

Programowanie
gier dla Symbian OS
Budujemy grę!
W poprzednim artykule Czytelnicy mieli okazję przebrnąć przez gąszcz
stosunkowo zawiłych szczegółów dotyczących programowania aplikacji
pod Symbian OS. W rezultacie powstał prosty szkielet gry. W niniejszej
części cyklu zajmiemy się tematem znacznie ciekawszym – odejdziemy
(chwilowo) od niskopoziomowych zagadnień systemowych i zrobimy to
co Tygrysy lubią najbardziej – zbudujemy grę!

Yourself). Czytelników niezaznajomionych


Dowiesz się: Powinieneś wiedzieć: z tą zasadą zapraszam do lektury wspania-
• Jak zaprojektować architekturę prostej gry i • Jak się programuje w języku C++; łej książki pt. Pragmatyczny Programista au-
jak zaimplementować ją pod system operacyj- • Co to jest pętla gry; torstwa Andrew Hunta i Davida Thomasa.
ny Symbian; • Jak działa szkielet aplikacji opisany w poprzed- Tym, którzy mimo wszystko zdecydują się
• Jak zaprojektować i zaimplementować silnik niej odsłonie cyklu. podjąć tę żmudną pracę, gwarantuję wiele
gry oparty na przyrostach czasu; niezapomnianych emocji związanych z pró-
• Jak oprogramować menu gry. bami uruchomienia programu. Tych, którzy
wolą bardziej pragmatyczne podejście nama-
wiam na zautomatyzowanie tego procesu. Ja
mentuje podstawowy podzbiór funkcjonal- do wygenerowania szkieletu projektu Lase-
ności oryginalnej Lasermanii – szczegółowy rQuest wykorzystałem proste narzędzie o
Poziom trudności opis koncepcji gry, do którego lektury gorą- nazwie Template-2-Text (w skrócie t2t). T2t
co namawiam przed przejściem do kolejnej to prosty silnik renderowania tekstu na ba-
części artykułu, znajduje się w ramce zatytu- zie zadanych szablonów. To co wyróżnia to
łowanej LaserQuest: skrócony podręcznik użyt- narzędzie od całego zestawu innych, podob-

J
est to bardzo trafne pytanie, które po- kownika. nych rozwiązań, to możliwość generowa-
winna zadać sobie każda osoba planu- nia całego drzewa katalogów na bazie drze-
jąca stworzyć grę komputerową. Zakła- Gotowi...? Zaczynamy! wa szablonowego, możliwość wykorzysta-
dam, że wielu z czytelników SDJ-ta, będą- Punktem wyjścia do naszych rozważań będzie nia zmiennych szablonowych w nazwach
cych z przyczyn oczywistych programistami, szkielet aplikacji opracowany w poprzedniej plików oraz automatyczny mechanizm wy-
odpowiedziałaby: nie ma na co czekać, bie- odsłonie niniejszego cyklu. Dla porządku przy- krywania tych zmiennych w celu pobrania
rzemy się za kodowanie!. Takie podejście jest pomnę, że szkielet ten oferuje nam: ich od użytkownika. Aby dostosować nasz
właśnie przyczyną upadku wielu przedsię- szkielet aplikacji do wymagań t2t, skopio-
wzięć związanych z produkcją gier. Otóż to • implementację pętli gry; wałem go do oddzielnego katalogu i zmody-
od czego zawsze powinno zaczynać się two- • obsługę zdarzeń klawiatury; fikowałem nazwy i zawartości plików. Roz-
rzenie gry, to opracowanie jej koncepcji. Po- • podstawową obsługę przerwań (utrata ważamy plik GameSkeletonApplication.cpp
nieważ temat projektowania gier (ang. game i uzyskanie focusa). (Listing 1).
design), chociaż bardzo ciekawy, nie pokry- W nowej odsłonie plik ten będzie miał na-
wa się z tematem niniejszego artykułu – pój- Pierwszym zadaniem – być może niespe- zwę [%PROJECT-NAME%]Application.cpp. Jak
dziemy na łatwiznę i zaczerpniemy pomysł cjalnie twórczym, aczkolwiek niezbędnym się można łatwo domyśleć, tag o strukturze
na naszą aplikację z klasyki polskiej myśli – jest dostosowanie istniejącego szkieletu '[%NAZWA%]' oznacza zmienną, która przy ge-
kreatywnej w dziedzinie komputerowej roz- do wymogów naszego projektu. Wbrew po- nerowaniu tekstu na bazie zadanego szablonu
rywki. Opisywana w niniejszym artykule gra zorom – zmienia się wiele rzeczy – nazwa zostanie podmieniona na konkretną wartość.
– LaserQuest – bazuje na koncepcji logicz- aplikacji, UI, identyfikator zasobów, autor Zawartość szablonu [%PROJECT-NAME%]Ap-
nej gry pt. Lasermania, wydanej pierwotnie itd. Oczywiście można pokusić się o ręczne plication.cpp przedstawiona jest na Listingu 2.
na ośmiobitowe Atari przez Laboratorium przerabianie kodu, ale podejście takie jaw- Analizując plik szablonu można zauwa-
Komputerowe Avalon. LaserQuest imple- nie gwałci zasadę DRY (ang. Don't Repeat żyć takie zmienne jak – [%PROJECT-NAME%]

64 11/2008
Programowanie gier dla Symbian OS

(nazwa projektu), [%AUTHOR%] (autor), należy ustawić dodatkowo opcję Self sign sis est.sisx. Kwestia przetransportowania paczki
[%EMAIL%] (kontaktowy adres email autora) file. Osoby zainteresowane szczegółami pod- z grą na telefon jest mocno zależna od posia-
oraz [%UID%] (unikalny identyfikator aplika- pisywania aplikacji zapraszam do Ramki Jak danego systemu. W większości przypadków
cji). W podobny sposób przekształcone zosta- podpisać aplikację dla Symbian OS?. Po ta- wykorzystuje się w tym celu sieć Bluetooth
ły pozostałe pliki projektu GameSkeleton. Na- kich zabiegach konfiguracyjnych wystarczy – należy przy tym pamiętać o włączeniu od-
rzędzie t2t oraz szablon szkieletu gry są do- wybrać opcję Build Project i spokojnie cze- biornika Bluetooth w telefonie i ustawianiu
stępne do pobrania z witryny SDJ. Po skonfi- kać aż w podkatalogu sis projektu pojawi jego widoczności dla innych urządzeń (mię-
gurowaniu narzędzia (patrz Ramka Konfigu- się podpisana paczka instalacyjna LaserQu- dzy innymi dla komputera z którego będzie-
racja narzędzia t2t) wystarczy wywołać ko-
mendę: Listing 1. Zawartość pliku GameSkeletonApplication.cpp

t2t -d GameSkeletonS60 LaserQuest //


// FILE NAME:
W dalszej kolejności narzędzie poprosi o war- // GameSkeletonApplication.cpp
tości kolejnych zmiennych – UID, AUTHOR , //
RESOURCE-ID, VENDOR , EMAIL oraz PROJECT- // AUTHOR(S):
NAME po czym wygeneruje w bieżącym kata- // Rafal Kocisz <rafal.kocisz@gmail.com>
logu podkatalog LaserQuest z odpowiednią //
zawartością. Bardziej dociekliwi Czytelnicy
mogą w tej chwil zadać pytanie – skąd mam #include "GameSkeletonApplication.h"
wziąć UID aplikacji? Dla nich właśnie przygo- #include "GameSkeletonDocument.h"
towałem specjalną Ramkę o tytule podobnym
do przedstawionego wyżej pytania. const TUid KUidGameSkeletonApp = { 0xA000958F };

LaserQuest CApaDocument* CGameSkeletonApplication::CreateDocumentL()


– pierwsze wyjście z mroku {
Tytuł niniejszego podpunktu brzmi nieco ta- return ( static_cast< CApaDocument* >(
jemniczo, czy wręcz złowieszczo. Skąd taka CGameSkeletonDocument::NewL( *this ) ) );
nazwa? Sprawa jest prosta. W punkcie tym }
opiszemy sposób uruchomienia nowo wy-
generowanej aplikacji na telefonie. Dlaczego TUid CGameSkeletonApplication::AppDllUid() const
już teraz? Otóż – na nieszczęście programi- {
stów – program działający idealnie pod emu- return KUidGameSkeletonApp;
latorem urządzenia, na realnym sprzęcie ma }
szansę działać zupełnie niepoprawnie. Wyni-
ka to z istnienia szeregu subtelnych różnic // Eof
pomiędzy tymi dwoma środowiskami. Zasa-
da jest prosta – im dłużej będziemy odwle- Listing 2. Zawartość szablonu [%PROJECT-NAME%]Application.cpp
kać uruchomienie aplikacji na telefonie, tym //
większe jest prawdopodobieństwo wystąpie- // FILE NAME:
nia takich błędów i tym większe będą koszty // [%PROJECT-NAME%]Application.cpp
ich znalezienia. //
Aby uruchomić naszą grę na urządzeniu // AUTHOR(S):
musimy wykonać następujące kroki – zbudo- // [%AUTHOR%] <[%EMAIL%]>
wać binarną wersję aplikację przeznaczoną do //
uruchomienia na telefonie, wygenerować insta-
lator i podpisać go oraz przetransportować po- #include "[%PROJECT-NAME%]Application.h"
wstałą paczkę instalacyjną na telefon. #include "[%PROJECT-NAME%]Document.h"
Pierwsze dwa kroki można zautomatyzo-
wać przy pomocy środowiska Carbide. W const TUid KUid[%PROJECT-NAME%]App = { [%UID%] };
tym celu należy przestawić aktualną konfi-
gurację na Phone Release (GCCE) a następnie CApaDocument* C[%PROJECT-NAME%]Application::CreateDocumentL()
kliknąć prawym przyciskiem na nazwie pro- {
jektu w panelu Project Explorer i wybrać za- return ( static_cast< CApaDocument* >(
kładkę Carbide.c++ -> Carbide Build Confi- C[%PROJECT-NAME%]Document::NewL( *this ) ) );
gurations -> SIS Builder (Rysunek 1). Po wci- }
śnięciu przycisku Add możemy skonfiguro-
wać sposób budowania aplikacji (Rysunek 2). TUid C[%PROJECT-NAME%]Application::AppDllUid() const
Kluczową rolę odgrywa tutaj plik LaserQu- {
est.pkg (można go znaleźć w podkatalogu sis return KUid[%PROJECT-NAME%]App;
projektu) opisujący dokładnie sposób genero- }
wania paczki instalacyjnej. Do zawartości te-
go pliku wrócimy w kolejnych podpunktach. // Eof
Oprócz wpisania nazw generowanych plików

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

my wysyłać paczkę). Paczka instalacyjna poja-


Listing 3. Definicja klasy CLaserQuestGame wia się jako nowa wiadomość w skrzynce od-
class CLaserQuestGame : public CBase biorczej. Po jej otwarciu automatycznie roz-
{ poczyna się proces instalacji. Po jego pomyśl-
public: nym zakończeniu pozostaje jedynie urucho-
enum TMode { EMenu, EPlay }; mić aplikację. W naszym przypadku otrzy-
mujemy znajomy z poprzedniej części cyklu
static CLaserQuestGame* NewL( czarny ekran z mrugającym przyjaźnie liczni-
const TLaserQuestKeyState& aKeyState ); kiem FPS. Kolejny etap naszych zmagań za-
CLaserQuestGame( kończył się sukcesem!
const TLaserQuestKeyState& aKeyState );
~CLaserQuestGame(); Architektura gry
Dobrneliśmy wreszcie do momentu kiedy
void Draw( CBitmapContext& aGc ) const; można zacząć myśleć o tym, co nas najbardziej
void Update( TInt64 aDt ); interesuje – mowa tu oczywiście o implemen-
TBool ExitFlag() const { return iExitFlag; } tacji zawartości gry. Zanim przejdziemy do ko-
dowania, wypada zastanowić się nad architek-
private: turą naszego rozwiązania.
void ConstructL(); Rozwiązanie, które zdecydowałem się za-
void UpdateMenuMode( TInt64 aDt ); stosować w przypadku projektu LaserQuest,
void UpdatePlayMode( TInt64 aDt ); to drzewiasta hierarchia obiektów reprezen-
tujących poszczególne składniki gry. W hie-
const TLaserQuestKeyState& iKeyState; rarchii tej wyróżniać będziemy kilka pozio-
TMode iMode; mów. Na szczycie hierarchii umieszczony zo-
CLaserQuestGamePlayMode* iPlayMode; stanie obiekt reprezentujący grę jako całość
CLaserQuestGameMenuMode* iMenuMode; – w naszym przypadku obiekt ten będzie re-
TBool iExitFlag; prezentowany przez klasę CLaserQuestGame.
Obiekt ten będzie odpowiedzialny za in-
}; // class CLaserQuestGame tegrację warstwy gry z warstwą szkieletu
aplikacji oraz za zarządzanie trybami gry.
Listing 4. Definicja metody Draw() w klasie CLaserQuestContainer Obiekty reprezentujące wspomniane try-
void CLaserQuestContainer::Draw( by stanowić będą kolejną warstwę w naszej
CBitmapContext& aGc ) const hierarchii. W naszym przypadku wyróżni-
{ my dwa rodzaje trybów – tryb menu (kla-
aGc.Reset(); sa CLaserQuestGameMenuMode) oraz tryb
aGc.SetBrushColor( KRgbBlack ); rozgrywki (klasa CLaserQuestGamePlayMod
aGc.SetBrushStyle( CGraphicsContext::ESolidBrush ); e). Tryb gry, to według prezentowanego tu
aGc.DrawRect( Rect() ); zamysłu, maszyna stanów określająca, co się
iGame->Draw( aGc ); w danej chwili z grą dzieje. Dla przykładu –
TBuf< KFpsMessageMaxLength > fpsMessage; tryb rozgrywki (CLaserQuestGamePlayMode)
fpsMessage.Format( KFpsMessageFormatString, przechowuje i zarządza takimi informacja-
iFpsCounter->Fps() ); mi jak poziom etapu gry, warunki jej zakoń-
aGc.UseFont( iEikonEnv->NormalFont() ); czenia itd. Tryb gry może z kolei przechowy-
aGc.SetPenColor( KRgbWhite ); wać obiekt reprezentujący silnik określonej
aGc.DrawText( fpsMessage, części rozgrywki. W przypadku LaserQuest
TPoint( KFpsMessagePosX, wyróżnimy tylko jeden silnik, reprezentowa-
KFpsMessagePosY ) ); ny przez klasę CLaserQuestGameBoardEngine.
aGc.DiscardFont(); Obiekt silnika – w naszym przypadku stano-
} wiący liść hierarchii – reprezentować będzie
planszę na której odbywa się faktyczna roz-
Listing 5. Definicja metody Update() w klasie CLaserQuestContainer grywka. W tym miejscu zaimplementowna
void CLaserQuestContainer::Update( TInt64 aDt ) będzie mechanika gry oraz reguły nią steru-
{ jące. Gwoli jasności należy w tym miejscu
iGame->Update( aDt ); mocno podkreślić, że przedstawiona tu hie-
rarchia bazuje na kompozycji (to znaczy –
if ( iGame->ExitFlag() ) obiekty wchodzące w jej skład zawierają sie-
{ bie nawzajem), a nie na dziedziczeniu.
if ( iAppUi != NULL ) To co łączy klasy opisujące obiekty na po-
{ szczególnych poziomach to wspólna koncep-
iAppUi->Exit(); cja przetwarzania oparta na dwóch metodach
} – Draw() oraz Update(). Zadaniem pierwszej
} z tych metod jest renderowanie danego skład-
} nika, druga odpowiada za uaktualnianie oraz
obsługę ewentualnych przejść pomiędzy sta-

66 11/2008
Programowanie gier dla Symbian OS

nami gry (czytaj: przekazywania kontroli po-


między poszczególnymi składnikami). W
przypadku programowania bardziej skom-
plikowanych gier warto zastanowić się nad
zbudowaniem szkieletu gry opartego na po-
wyższej koncepcji – tak aby raz zaprogramo-
waną funkcjonalność można było wykorzy-
stać w przyszłości. Można by dla przykładu
stworzyć bazową klasę reprezentującą skład-
nik gry (np. CLaserQuestGameEntity) i z niej
dziedziczyć klasy bazowe reprezentujące po-
szczególne składniki hierarchii. W przypad-
ku LaserQuest – aby nie zaciemniać tematu
– zbudujemy opisaną wyżej hierarchię w spo-
sób bezpośredni.
Warto w tym miejscu zatrzymać się na
chwilę i zwrócić uwagę na zastosowaną kon-
wencję nazewnictwa klas w naszym projek-
cie. Ponieważ przy programowaniu aplika-
cji C++ dla Symbian OS nie stosuje się za-
zwyczaj przestrzeni nazw, dlatego zdecydo-
wałem się nadawać wszystkim klasom repre-
zentującym składniki gry nazwy rozpoczyna-
jące się prefiksem CLaserQuestGame. Podej-
ście takie pozwala w łatwy sposób odróżniać
klasy szkieletu aplikacji od klas reprezentują- Rysunek 1. Narzędzie do konfiguracji procesu budowania aplikacji
cych samą grę.
Warto w tym punkcie poruszyć jeszcze jed-
ną kwestię natury architektonicznej. Podejrze- Listing 6. Definicja metody Draw() w klasie CLaserQuestGame
wam, że wielu purystów projektowania obiek- void CLaserQuestGame::Draw( CBitmapContext& aGc ) const
towego obruszy się widząc w jednej klasie me- {
tody odpowiedzialne za przetwarzanie i ren- switch ( iMode )
derowanie swojej zawartości. Słyszę niemal- {
że jak padają groźnie pytania pokroju – a co case EMenu: iMenuMode->Draw( aGc ); break;
z separacją warstwy logiki od warstwy prezen- case EPlay: iPlayMode->Draw( aGc ); break;
tacji?! Odpowiedź jest prosta – w przypadku default: break;
programowania gier rzadko zachodzi ku te- }
mu potrzeba. Co więcej – w grach kompute- }
rowych warstwa logiki często łączy się z war-
stwą prezentacji (np.: badanie kolizji pomię- Listing 7. Definicja metody Update() w klasie CLaserQuestGame
dzy obiektami występującymi w grze na za- void CLaserQuestGame::Update( TInt64 aDt )
sadzie badania zawartości sprite'ów) i czasami {
wprowadzanie takiego podziału jest sztuczne switch ( iMode )
i powoduje niepotrzebny narzut. W takich sy- {
tuacjach warto jest stosować zasadę Brzytwy case EMenu: UpdateMenuMode( aDt ); break;
Ockhama – nie mnóżmy niepotrzebnych by- case EPlay: UpdatePlayMode( aDt ); break;
tów (czytaj: klas) jeśli nie ma po temu rzeczy- default: break;
wistej potrzeby. Co więcej – nasza koncepcja }
wcale nie kłóci się z ideą separacji wspomnia- }
nych warstw. Po prostu użyliśmy do tego inne-
go narzędzia – zamiast umieszczać te funkcjo-
nalności w różnych klasach, umieściliśmy je w
różnych funkcjach. Dodatkowo, fakt iż meto- Konfiguracja narzędzia t2t
da Draw() posiada modyfikator const jest do- Aby skonfigurować narzędzie t2t (pod systemami z rodziny Windows) należy podjąć następujące
datkowym gwarantem, iż wspomniane war- kroki:
stwy nie będą się przeplatać.
• rozpakować archiwum z narzędziem do wybranego podkatalogu;
W kolejnych podpunktach opiszę szczegó-
• ustawić zmienną środowiskową %T2T _ HOME% , przypisać jej nazwę wybranego podkatalogu
łowo kolejne klasy w przedstawionej tu hierar- i dodać ją do zmiennej %PATH% .
chii. Schemat hierarchii przedstawiony jest na
Rysunku 3. Po takich zabiegach konfiguracyjnych (zakładając, że w systemie dostępny jest interpreter języka
Perl) narzędzie t2t można uruchomić z dowolnego miejsca w systemie wpisując z linii poleceń ko-
mendę t2t. Po uruchomieniu tej instrukcji bez żadnych argumentów wyświetlona będzie lista po-
Gra zamknięta w obiekcie leceń narzędzia wraz z prostą instrukcją obsługi opatrzoną przykładami.
W niniejszym podpunkcie opiszę interfejs
oraz implementację klasy CLaserQuestGame,

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

która, jak wspomniałem wyżej, reprezentuje


Listing 8. Definicja metody CLaserQuestGame::UpdateMenuMode() grę jako całość. Klasa ta jest – niejako z powo-
void CLaserQuestGame::UpdateMenuMode( TInt64 aDt ) łania – punktem styku silnika gry oraz opisa-
{ nego w poprzednim odcinku szkieletu aplika-
iMenuMode->Update( aDt ); cji. Na początek przyjrzyjmy się definicji klasy
(plik LaserQuestGame.h w podkatalogu inc ka-
if ( iMenuMode->IsFireKeyPressed() ) talogu projektu; paczkę z kodem źródłowym
{ do niniejszego artykułu można pobrać z witry-
switch ( iMenuMode->ActiveOption() ) ny SDJ). Definicja klasy przedstawiona jest na
{ Listingu 3.
case CLaserQuestGameMenuMode::EExit: Prześledźmy na początek publiczne skład-
{ niki interfejsu tej klasy. Statyczna metoda
iExitFlag = ETrue; NewL(), konstruktor oraz prywatna meto-
break; da ConstructL() stanowią część mechani-
} zmu dwufazowej konstrukcji obiektów (ang.
case CLaserQuestGameMenuMode::EStart: two-phase construction). Osoby planujące na
{ poważnie zająć się programowaniem natyw-
iMode = EPlay; nych aplikacji dla Symbian OS powinny za-
iPlayMode->Reset(); poznać się z tym mechanizmem – tak samo
break; jak z mechanizmem stosu czyszczącego (ang.
} cleanup stack). Obydwa mechanizmy opisa-
} ne są w Ramce zatytułowanej Stos czyszczący
} oraz dwufazowa konstrukcja obiektów w Sym-
} bian OS.
W tym punkcie zakładamy, że meto-
Listing 9. Definicja metody CLaserQuestGame::UpdatePlayMode() da NewL() przejmuje rolę konstruktora kla-
void CLaserQuestGame::UpdatePlayMode( TInt64 aDt ) sy. Destruktor klasy uchował się na szczę-
{ ście od Symbianowych dziwactw i nadal po-
iPlayMode->Update( aDt ); zostaje zwykłym destruktorem. Metody
Draw() i Update() mają szczególne znacze-
if ( iPlayMode->MenuKeyPressed() ) nie. Do Draw() przekazywany jest kontekst
{ bitmapy reprezentującej tylny bufor apli-
iMode = EMenu; kacji. Z kolei Update() otrzymuje przyro-
iMenuMode->Reset(); sty czasu pomiędzy poszczególnymi iteracja-
} mi pętli gry. Znaczenie publicznej metody
} ExitFlag() opiszę w dalszej części tego pod-
punktu. Obiekt klasy CLaserQuestGame jest
przechowywany i tworzony w obiekcie kon-
tenera (klasa CLaserQuestContainer, pli-
LaserQuest – skrócony podręcznik użytkownika ki LaserQuestContainer.h/cpp). Tworzenie
Jak wspomniano we wstępie artykułu, LaserQuest to gra logiczna, bazująca na Lasermanii. Roz-
grywka LaserQuest odbywa się na dwuwymiarowej planszy podzielonej na równomierne pola, obiektu gry zrealizowane jest w metodzie
wypełnionej przeróżnymi elementami. Elementy występujące w grze to: CLaserQuestContainer::ConstructL():

• emiter lasera, czyli urządzenie generujące wiązkę skondensowanego światła; iGame = CLaserQuestGame::NewL( iKeyState );
• ściany absorbujące promień lasera;
• ściany odbijające promień lasera;
• ruchome lustra odbijające promień lasera; Warto zwrócić uwagę na to, w jaki sposób do
• czujniki układu alarmowego; obiektu gry przekazywany jest stan klawia-
• teleport do kolejnej planszy; tury. Prywatna składowa iKeyState prze-
• pojazd sterowany przez gracza.

Zadaniem gracza jest zniszczenie wszystkich czujników układu alarmowego i wejście do telepor-
tu prowadzącego do następnej planszy. Czujniki można niszczyć promieniem lasera. W prakty-
ce oznacza to, że gracz musi w taki sposób manipulować ruchomymi częściami planszy (lustrami)
aby nakierować odbijający się promień lasera na kolejne czujniki, a gdy zostaną one zniszczone –
dotrzeć do teleportu. Wspomniane manipulacje wykonywane są za pomocą sterowanego joystic-
kiem pojazdu, który można wykorzystać do przesuwania luster.
W niniejszym odcinku cyklu logika otaczająca główny silnik gry jest bardzo uboga, aczkolwiek
kompletna. Po uruchomieniu gry użytkownik ma do dyspozycji proste menu z dwoma opcjami
– Start i Exit. Opcja pierwsza powoduje przejście do testowej planszy i rozpoczęcie rozgrywki.
Opcja druga powoduje natychmiastowe opuszczenie aplikacji. Po rozpoczęciu rozgrywki gracz
ma następujące opcje. Może sterując pojazdem próbować rozwiązać planszę – jeśli mu się to
uda, to rozgrywka zostanie zakończona i gra przejdzie ponownie do trybu menu. Gracz może
wrócić do wspomnianego trybu w dowolnym momencie rozgrywki – wciskając prawy softkey.
Jeśli w trakcie rozgrywki gracz uzna, że znalazł się w położeniu bez wyjścia, to może zrestarto-
wać grę przy pomocy lewego softkey'a.
Rysunek 2. Narzędzie do konfiguracji procesu
budowania paczki instalacyjnej programu

68 11/2008
Programowanie gier dla Symbian OS

chowywana jest w klasie CLaserQuestGame kontenera). Wywołanie iAppUi->Exit() w Omówienie mechanizmu interakcji na linii
jako referencja do stałej. Idea tej decyzji pro- CLaserQuestContainer::Update finalnie za- silnik gry – pętla gry mamy za sobą. Wróćmy
jektowej polega na tym, iż mając referencję łatwia sprawę. ponownie do implementacji silnika i przeana-
do zmiennej reprezentującej stan klawiatury
wszelkie dotyczące jej zmiany (wykonywane Listing 10. Definicja klasy CLaserQuestGameMenuMode
na poziomie klasy CLaserQuestContainer)
będą widoczne w klasie CLaserQuestGame. class CLaserQuestGameMenuMode : public CBase
Referencję tę możemy oczywiście przeka- {
zać dalej – tak aby obiekty niżej w hierar- public:
chii również mogły śledzić stan klawiatu- enum TOption { EStart, EExit };
ry. Wykorzystanie referencji do stałej da- static CLaserQuestGameMenuMode* NewL(
je nam gwarancję, że nikt nie popsuje war- const TLaserQuestKeyState& aKeyState );
tości składowej iKeyState (tylko klasa CLaserQuestGameMenuMode(
CLaserQuestContainer ma prawo ją uaktu- const TLaserQuestKeyState& aKeyState );
alniać, wszyscy inni mogą ją tylko czytać). ~CLaserQuestGameMenuMode();
W rezultacie – stosując takie podejście – void Reset();
możemy badać stan klawiatury na zasadzie void Draw( CBitmapContext& aGc ) const;
bezpośredniego odpytywania (ang. key pol- void Update( TInt64 aDt );
ling), a nie na zasadzie notyfikacji (ang. key TOption ActiveOption() const
event notification). { return iActiveOption; }
Innymi słowy – to obiekt zainteresowany TBool IsFireKeyPressed() const
stanem klawiatury pyta o jej stan, w odróż- { return iIsFireKeyPressed; }
nieniu od sytuacji gdy obiekt śledzący stan private:
klawiatury informuje o zmianach wszystkich void ConstructL();
zainteresowanych. Stosowanie pierwszego po- const TLaserQuestKeyState& iKeyState;
dejścia w przypadkach pisania prostych gier TOption iActiveOption;
znacznie ułatwia oprogramowywanie war- CFbsBitmap* iTitle;
stwy logiki. CFbsBitmap* iStart;
Kolejne miejsca w których podpinamy nasz CFbsBitmap* iActiveStart;
silnik gry to metody Draw() i Update() w klasie CFbsBitmap* iExit;
CLaserQuestContainer (Listingi 4 i 5). CFbsBitmap* iActiveExit;
W przypadku metody CLaserQuest- TLaserQuestPeriod
Container::Draw() stosujemy proste podej- iMenuOptionsTransitionDelayPeriod;
ście – wystarczy w odpowiednim miejscu wy- TBool iIsFireKeyPressed;
wołać funkcję Draw() na obiekcie iGame. Za- }; // class CLaserQuestGameMenuMode
wartość metody Update() jest trochę bardziej
skomplikowana. Problem z tą metodą polega Listing 11. Definicja zasobu LaserQuestMenu.mbm w pliku LaserQuest.mmp
na tym, że oprócz komunikacji przebiegającej START BITMAP LaserQuestMenu.mbm
w dół hierarchii (w tym konkretnym przypad- SOURCEPATH ..\gfx
ku mowa jest o wywołaniu iGame->Update( TARGETPATH resource\apps
aDt )) musimy również odczytać wiadomość HEADER
wędrującą w górę hierarchii – obiekt reprezen- SOURCE c24 LaserQuestMenuExit.bmp
tujący grę powiadamia swojego rodzica (czyli SOURCE c24 LaserQuestMenuExitActive.bmp
klasę CLaserQuestContainer) o tym, że gdzieś SOURCE c24 LaserQuestMenuStart.bmp
w jej wnętrzu zapadła decyzja o zakończeniu SOURCE c24 LaserQuestMenuStartActive.bmp
działania aplikacji. Aby przekonać się o tym, SOURCE c24 LaserQuestMenuTitle.bmp
kontener sprawdza odpowiednią flagę w sil- END
niku gry.
Nasi znajomi puryści projektowania obiek- Listing 12. Zawartość wygenerowanego automatycznie pliku nagłówkowego
towego mogliby tym razem zauważyć, że al- LaserQuestMenu.mbg
ternatywą dla tego rozwiązania mógłby być // LaserQuestMenu.mbg
wzorzec projektowy znany pod nazwą Ob- // Generated by BitmapCompiler
serwatora, bazujący na wywoływaniu funk- // Copyright (c) 1998-2001 Symbian Ltd. All rights reserved.
cji zwrotnych. //
Owszem – jest to alternatywa warta roz-
ważenia, aczkolwiek w przypadku nie- enum TMbmLaserquestmenu
wielkich gier zastosowanie prostego od- {
pytywania jest zwyczajnie prostsze. Żąda- EMbmLaserquestmenuLaserquestmenuexit,
nie zakończenia gry trzeba przekazać jesz- EMbmLaserquestmenuLaserquestmenuexitactive,
cze o jeden poziom wyżej, do obiektu klasy EMbmLaserquestmenuLaserquestmenustart,
CLaserQuestAppUi. W tym celu trzeba by- EMbmLaserquestmenuLaserquestmenustartactive,
ło zmodyfikować kod szkieletu i przekazać EMbmLaserquestmenuLaserquestmenutitle
wskaźnik na wspomniany obiekt do konte- };
nera (patrz: nowa składowa iAppUi w klasie

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

lizujmy wewnętrzne mechanizmy jego działa- est składa się z dwóch podstawowych trybów niony jest w klasie CLaserQuestGame. W enu-
nia. Jak wspominałem wcześniej, gra LaserQu- – menu oraz rozgrywki. Podział ten uwzględ- meracji CLaserQuestGame::TMode zdefinio-
wane są dwie wartości reprezentujące wspo-
Listing 13. Fragment definicji metody CLaserQuestGameMenuMode::ConstructL() – wczytywanie bitmapy mniane tryby – EMenu oraz EPlay. Informacja
o tym jaki jest aktualny tryb gry przechowy-
void CLaserQuestGameMenuMode::ConstructL() wany jest w składowej iMode. Jeśli zajrzymy
{ do implementacji metod CLaserQuestGame:
iTitle = new ( ELeave ) CFbsBitmap(); :Draw() oraz CLaserQuestGame::Update()
User::LeaveIfError( iTitle->Load( (Listingi 6 i 7) to zauważymy, że są one zaim-
KLaserQuestMenuMbmFilePath, plementowane na bazie instrukcji switch.
EMbmLaserquestmenuLaserquestmenutitle ) ); Instrukcje te delegują zadania do obiek-
// ... tów reprezentujących poszczególne tryby gry
w zależności od wartości zmiennej iMode. W
Listing 14. Definicja stałej określającej ścieżkę dostępu do pliku mbm przypadku metody Draw() sytuacja jest pro-
#ifdef __WINS__ sta – wystarczy wywołać metodę Draw() dla
_LIT( KLaserQuestMenuMbmFilePath, obiektu reprezentującego aktywny tryb gry.
"z:\\resource\\apps\\LaserQuestMenu.mbm" ); W przypadku metody Update() należy dodat-
#else kowo obsłużyć komunikację zwrotną – kod
_LIT( KLaserQuestMenuMbmFilePath, odpowiedzialny za to zadanie umieszczo-
"c:\\resource\\apps\\LaserQuestMenu.mbm" ); ny jest w metodach UpdateMenuMode() oraz
#endif // __WINS__ UpdatePlayMode() (Listingi 8 i 9).
W UpdateMenuMode() oprócz wywołania
Listing 15. Fragment definicji metody CLaserQuestGameMenuMode::Draw() metody Update() na obiekcie iMenuMode,
void CLaserQuestGameMenuMode::Draw( sprawdzamy czy użytkownik podjął jakąś akcję
CBitmapContext& aGc ) const związaną z tym trybem. W tym celu wykorzy-
{ stujemy metody – IsFireKeyPressed() oraz
aGc.BitBlt( TPoint( KTitlePosY, KTitlePosY ), ActiveOption() stanowiące część publiczne-
iTitle, go interfejsu klasy CLaserQuestGameMenuMode.
iTitle->SizeInPixels() ); Pierwsza metoda zwraca wartość ETrue w
// ... przypadku gdy w trybie menu wykryto wci-
} śnięcie przycisku fire.
Po wykryciu takiej sytuacji, przy pomo-
cy drugiej metody – ActiveOption() – po-
bierany jest identyfikator opcji, która jest
�������������������� na dany moment aktywna i na tej podsta-
wie podejmowane są kolejne akcje – bądź
to ustawienie flagi wyjścia z programu, bądź
przejście do trybu rozgrywki. W przypadku
UpdateMenuMode() dzieje się podobnie – ty-
le, że do obsłużenia jest tylko jedna możli-
wość – powrót z trybu rozgrywki do trybu
��������������� menu.
W jaki sposób tryby gry kontrolują swój
stan – o tym już za moment. Na początek
sprawdzimy...

...co w menu piszczy


Po zapoznaniu się ze szczegółami imple-
����������������������� ����������������������� mentacji obiektu reprezentującego grę ja-
ko całość, czas przyjrzeć się klasom repre-
zentującym obiekty z drugiej warstwy hie-
rarchii – mowa tu o warstwie trybów gry.
Na początek przyjrzymy się prostszej z
dwóch klas występujących w LaserQuest
– CLaserQuestGameMenuMode.
Przeanalizujmy Listing 10, na którym znaj-
�������������������������� duje się definicja wspomnianej klasy.
Duża część interfejsu klasy wygląda znajo-
mo – wiele metod w tej klasie było wykorzy-
stywane w obiekcie klasy CLaserQuestGame.
To co na pewno rzuca się w oczy to zestaw
wskaźników do obiektów klasy CFbsBitmap.
Tak, tak – wreszcie dotarliśmy do miejsca
Rysunek 3. Schemat architektury gry LaserQuest gdzie narysujemy coś więcej niż czarny pro-

70 11/2008
Programowanie gier dla Symbian OS

stokąt czy informacja o liczniku FPS. Menu tu i zwalniające programistę z ręcznego mo- wspomnianego narzędzia należy otworzyć
w naszej grze jest na tyle proste, że nie war- dyfikowania plików mmp. Aby dostać się do plik mmp w eksploratorze projektu, a następ-
to rozbijać go na mniejsze klasy. Gdyby by-
ło inaczej, to zapewne architektura tej części Listing 16. Definicja metody CLaserQuestGameMenuMode::Update()
gry byłaby o wiele bardziej złożona; oprogra-
mowanie skomplikowanych interfejsów użyt- void CLaserQuestGameMenuMode::Update( TInt64 aDt )
kownika w grach to jednak temat na oddziel- {
ny, wcale niekrótki artykuł. W przypadku La- iMenuOptionsTransitionDelayPeriod.Update( aDt );
serQuest klasa CLaserQuestGameMenuMode
jest odpowiedzialna za obsługę menu oraz za if ( iMenuOptionsTransitionDelayPeriod.Passed() )
jego renderowanie. Przyjrzyjmy się jak zosta- {
ło to zrealizowane. if ( iKeyState & KKeyUp || iKeyState & KKeyDown )
Klasa CFbsBitmap służy w Symbian OS do {
reprezentacji specjalnie spreparowanej bit- switch ( iActiveOption )
mapy. Bitmapy takie są w procesie budowa- {
nia aplikacji przetwarzane dedykowanym na- case EStart: iActiveOption = EExit; break;
rzędziem (bmconv), a następnie pakowane case EExit: iActiveOption = EStart; break;
w pliki z rozszerzeniem mbm. Tak spreparo- }
wane paczki bitmap są następnie dołączone iMenuOptionsTransitionDelayPeriod.Reset(
do instalatora aplikacji i stanowią integral- KOneSecondInMicroSeconds / 5 );
ną ich część. }
Nagrodą, którą programista otrzymuje za }
uporanie się z całym tym galimatiasem jest
możliwość synchronicznego wczytania bit- if ( iKeyState & KKeyFire )
mapy na podstawie automatycznie wygene- {
rowanego identyfikatora (zapisanego jako iIsFireKeyPressed = ETrue;
enumeracja w nagłówkowym pliku z rozsze- }
rzeniem mbg). Brzmi skomplikowanie? Cóż }
– niestety – po części tak jest. Prześledźmy
jak w praktyce wygląda proces przygotowa- Listing 17. Definicja klasy TLaserQuestPeriod
nia bitmap reprezentujących menu gry La- class TLaserQuestPeriod
serQuest. {
Jako że ponoć jeden obraz wart jest tysią- public:
ca słów, zapraszam Czytelników do zapo- TLaserQuestPeriod( TInt64 aPeriod = 0 )
znania się z Rysunkiem 4, na którym poka- : iPeriod( aPeriod ) { }
zane jest menu gry LaserQuest. Obraz me- void Reset( TInt64 aPeriod )
nu składa się z kilku bitmap wyświetlonych { iPeriod = aPeriod; }
na czarnym tle. Bitmapy te są reprezento- void Update( TInt64 aDt )
wane przez następujące składowe w klasie { if ( iPeriod > 0 ) { iPeriod -= aDt; } }
CLaserQuestGameMenuMode: iTitle (tytuły TBool Passed() const
gry), iStart (napis Start), iExit (napis Exit), { return iPeriod <= 0; }
iActiveStart oraz iActiveExit (podświetlo-
ne napisy Start i Exit). Bitmapy zostały nary- private:
sowane w zwykłym edytorze grafiki i zapisa- TInt64 iPeriod; // In microseconds.
ne w podkatalogu gfx projektu LaserQuest. };
W dalszej kolejności zmodyfikowano odpo-
wiednio plik definicji projektu (mmp) doda-
jąc fragment pokazany na Listingu 11.
W definicji określone są źródłowa i doce-
lowa ścieżka dla zasobów oraz lista bitmap,
Skąd mam wziąć UID dla aplikacji Symbian OS?
UID w kontekście Symbian OS, to unikalny w skali światowej identyfikator aplikacji. Utrzy-
które składają się na paczkę LaserQuestMe- mywaniem puli i przydzielaniem UID-ów zajmuje się firma Symbian – producent Symbian
nu.mbm. To, na co warto zwrócić uwagę, to OS. Nie każda aplikacja musi mieć unikalny UID – np. do celów testowych można wykorzy-
specyfikacja formatu piksela dołączona do stywać jeden UID wielokrotnie, jednakże należy mieć świadomość, że gdy zainstalujemy na
każdego elementu we wspomnianej liście. W jednym telefonie dwie różne aplikacje z identycznym UID-em to efekty będą nieprzewidy-
walne (czytaj: coś się na pewno popsuje). Z tego względu – wszystkie aplikacja pretendują-
naszym przypadku używamy wartości c24,
ce do uzyskania certyfikacji Symbian Signed (jeden z podstawowych wymogów przy rozpo-
która oznacza, iż każdy piksel w docelowej wszechnianiu aplikacji komercyjnych) muszą posiadać swój własny UID. Generalnie, osoby
bitmapie reprezentowany jest przez 24 bity. planujące udostępnić swoją aplikację na publicznym forum (niekoniecznie w trybie komer-
Na tym kończy się praca programisty zwią- cyjnym – może to być równie dobrze aplikacja oferowana na zasadach Open Source) powin-
zana z przygotowaniem bitmap – pozosta- na postarać się o taki numer. Aby uzyskać UID na własne potrzeby trzeba zarejestrować się
łą częścią procesu przygotowania pliku mbm na stronie Symbian Signed (https://www.symbiansigned.com). Po pomyślnej rejestracji należy
przejść do zakładki My Symbian Signed a następnie wybrać z bocznej belki opcje UIDs i Re-
zajmuje się łańcuch budowania aplikacji. W
quest. Dalej należy postępować według przedstawionych instrukcji. Zamówione UID-y od-
tym momencie warto wspomnieć, że Car- biera się za pomocą poczty elektronicznej.
bide oferuje wygodne, wizualne narzędzie
wspomagające dołączanie bitmap do projek-

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

nie wybrać zakładkę Sources. Przyjrzymy się kodu źródłowego. W tym celu dobrze jest de.cpp. Na początku należy dołączyć plik na-
teraz jak obsłużyć nasze bitmapy z poziomu zajrzeć do pliku LaserQuestGameMenuMo- główkowy zawierający definicję enumeracji
z identyfikatorami bitmap:

Listing 18. Definicja metody CLaserQuestGameBoardEngine::ComputeNextVehicleMovePosX() #include <LaserQuestMenu.mbg>

TInt CLaserQuestGameBoardEngine::NextVehicleMovePosX( Plik ten jest generowany automatycznie w


TDirection aDir ) const trakcie budowania aplikacji i można go zna-
{ leźć w katalogu z systemowymi nagłówkami
static const TInt KDir2Dx[] = { -1, 1, 0, 0 }; SDK. Plik nagłówkowy dla zasobu LaserQu-
return iVehiclePosX + KDir2Dx[ aDir ]; estMenu.mbm w przypadku rozważanej apli-
} kacji wygląda tak jak przedstawiono na Li-
stingu 12.
Wczytywanie bitmap reprezentujących me-
nu zrealizowane jest w metodzie ConstrutL()
Stos czyszczący oraz dwufazowa konstrukcja obiektów w Symbian OS klasy CLaserQuestGameMenuMode. Przyjrzyjmy
Pisząc aplikacja C++ dla Symbian OS nie da się uniknąć mechanizmu stosu czyszczącego i
idiomu dwufazowej konstrukcji. W tym miejscu opiszę obydwa mechanizmy tak, aby Czy- się fragmentowi tej metody (Listing 13).
telnik był w stanie zrozumieć prezentowane kody źródłowe i w pewnym ograniczonym za- Na początek należy stworzyć przy pomocy
kresie stosować je przy budowaniu własnych gier. Czytelników zainteresowanych szczegóło- operatora new obiekt reprezentujący bitma-
wym zgłębieniem tej dziedziny wiedzy odsyłam do książki Symbian OS Explained autorstwa pę. W drugim kroku – przy pomocy metody
Jo Stichbury. Drugi, trzeci oraz czwarty rozdział tej książki stanowią w mojej opinii najlepsze
CFbsBitmap::Load() wczytujemy zawartość
dostępne wprowadzenie to tematyki opisywanej bardzo pobieżnie w niniejszej Ramce.
Potrzeba wprowadzenia stosu czyszczącego oraz dwufazowej konstrukcji obiektów wzię- bitmapy z pliku mbm. Oprócz identyfikatora
ła się z tego, iż kompilatory używane do budowania aplikacji pod pierwotne wersje syste- bitmapy podajemy również ścieżkę dostępu
mu Symbian nie obsługiwały sytuacji wyjątkowych. Na dzień dzisiejszy sytuacja ta może ba- do pliku mbm. Ścieżka ta zdefiniowana jest ja-
wić, aczkolwiek na ówczesne czasy (początek lat 90) taka była rzeczywistość. Jako, że Sym- ko stała tekstowa na początku pliku LaserQu-
bian OS miał być systemem dedykowanym dla urządzeń mobilnych o mocno ograniczonych estGameMenuMode.cpp (Listing 14).
zasobach, to jego autorzy byli zmuszeni wprowadzić spójny i przekrojowy system zabezpie-
Z racji tego, że ścieżki dostępu do pliku
czeń przed gubieniem tych zasobów. W tej sytuacji opracowano alternatywny mechanizm
obsługi wyjątków w postaci funkcji User::Leave() oraz makra TRAP. Rozważając temat mbm są różne w środowisku emulatora i na
w kategoriach języka C, mechanizmy te odpowiadają bibliotecznym funkcjom setjmp() i urządzeniu, dlatego do wyboru właściwej za-
longjmp(). W kontekście sytuacji wyjątkowych języka C++, funkcja User::Leave() działa stosowałem instrukcję warunkową preproce-
podobnie jak instrukcja throw, zaś TRAP pełni rolę bloku catch . Jednakże wbudowany me- sora. Dla ścisłości należy dodać, iż zmienna
chanizm wyjątków C++ oferuje coś więcej – mowa tu oczywiście o automatycznym wywoły-
__WINS__ jest definiowana automatycznie w
waniu destruktorów po pojawieniu się sytuacji wyjątkowej co – przynajmniej w teorii – za-
pobiega powstawaniu luk w zasobach. Pomijając szereg subtelnych zagrożeń, mechanizm momencie budowania aplikacji w wersji
wyjątków C++ stanowi stosunkowo wygodne narzędzie do obsługi nieprzewidzianych sytu- działajacej pod emulatorem, co – mam na-
acji w programie. W tym kontekście, symbianowy stos czyszczenia stanowi brakujący skład- dzieję – finalnie rozjaśnia sprawę. Niestety,
nik mechanizmu obsługi wyjątków. Niestety – ze względu na oczywiste ograniczania (jest podejście takie nie rozwiązuje do końca na-
to w końcu tylko biblioteka próbująca imitować mechanizmy wbudowane w język) – pro- szego problemu.
gramiści są zmuszeni ręcznie zarządzać obiektami znajdującymi się na takim stosie. To z ko-
Chodzi konkretnie o to, że ścieżka bę-
lei ciągnie za sobą fakt, iż tylko wybrane klasy mogą ze stosem czyszczenia współpracować
– mowa tu o obiektach dziedziczących z klasy CBase. Analizując przedstawione w poszcze- dzie niepoprawna w sytuacji gdy zainsta-
gólnych Listingach nagłówki klas Czytelnik może się łatwo przekonać, iż zasadniczo wszyst- lujemy aplikację na karcie pamięci (o ile ta-
kie klasy reprezentujące silnik LaserQuest dziedziczą z CBase (stąd też bierze się konwencja kowa jest dostępna w telefonie). Sytuację tę
zakładająca dodawanie klasom prefiksów – z góry wtedy wiadomo, że klasy o nazwach roz- można obsłużyć sprawdzając w czasie wyko-
poczynających się na C reprezentują obiekty przechowujące zasoby). W tym miejscu docho-
dzimy do genezy problemu na które remedium stanowić ma idiom dwufazowej konstruk-
cji obiektów. Chodzi o to, że wbudowany konstruktor obiektów klasy C nie może rzucać wy-
jątków (tj. wywoływać operacji leavującej). Jeśli przyjrzymy się dowolnej klasie przechowu-
jącej zasoby (np. dynamicznie alokowane obiekty reprezentujące bitmapy) to zauważymy,
że operacje związane z ich alokacją mają nazwy zakończone sufiksem L . To oznacza właśnie,
iż operacje te mogą bezpośrednio lub pośrednio wywołać operację User::Leave(). Z dru-
giej strony, alokacja pamięci jest sama w sobie operacją potencjalnie leavującą. W tej sytu-
acji – zakładając iż konstruktor klasy może wywoływać operację User::Leave(), przy dyna-
micznej alokacji obiektu mielibyśmy do czynienia z dwoma takimi operacjami wywołanymi
pod rząd. A jest to sytuacja niedopuszczalna, gdyż po wykonaniu pierwszej z operacji leavu-
jących należy bezzwłocznie umieścić wskaźnik do zaalokowanego zasobu oraz umieścić na
stosie czyszczenia (przy pomocy wywołania CleanupStack::PushL()). Aby obejść ten pro-
blem stosuje się prosty chwyt – wszystkie potencjalnie leavujące operacje związane z kon-
strukcją obiektu umieszcza się w metodzie ConstructL(), którą należy wywołać ręcznie po
uprzednim włożeniu wskaźnika do zaalokowanego obiektu na stos czyszczenia. Proces ten
można ukryć przed użytkownikiem umieszczając opisane wyżej operacje w statycznej meto-
dzie klasy, nazywanej według przyjętej konwencji NewL() lub NewLC(),. Metody te zastępują
wbudowany konstruktor, tak że obiekt można zkonstruować w następujący sposób:

iMenuMode = CLaserQuestGameMenuMode::NewL( iKeyState );

W ramach ćwiczenia zachęcam wszystkich Czytelników do przeanalizowania dołączonych źródeł


projektu i zbadania implementacji opisanych powyżej mechanizmów w praktyce.

Rysunek 4. Menu gry LaserQuest

72 11/2008
Programowanie gier dla Symbian OS

nania programu miejsce jej instalacji i dyna- użytkownik nie byłby w stanie kontrolować nam wysoki poziom elastyczności architek-
micznie budując ścieżkę dostępu. Wrócę do tego procesu. tury w kontekście kolejnych etapów imple-
tego tematu w kolejnych odsłonach niniej- Kończąc niniejszy podpunkt warto zwrócić mentacji gry.
szego cyklu. uwagę na metodę CLaserQuestGameMenuMode Kiedy w następnych odcinkach cyklu bę-
Wracając jeszcze do zawartości Listingu ::Reset(). Metoda ta stanowi pewną archi- dziemy rozszerzać LaserQuest o obsłu-
13, warto zwrócić uwagę na użycie konstruk- tektoniczną konwencję – jest ona wykorzy- gę wczytywania kolejnych plansz czy sys-
cji User::LeaveIfError(). Funkcja ta powo- stywana do resetowania stanu obiektu, co jest tem zapisywania stanu gry – tryb ten bę-
duje rzucenie symbianowego wyjątku w sy- bardzo przydatne w momencie kiedy prze- dzie bardzo przydatny. W bieżącej fazie
tuacji kiedy operacja wczytywania zawarto- chodzimy pomiędzy trybami gry lub restar- projektu nie ma się w tym miejscu specjal-
ści bitmapy z jakichś przyczyn się nie powie- tujemy tryb gry (będzie napisane więcej na nie o czym rozpisywać. Praktycznie wszyst-
dzie. Voila! Jedyne co nam pozostało to wy- ten temat w kolejnym podpunkcie). Wizual- kie operacje w tym trybie polegają na de-
świetlenia bitmapy, co też czynimy w funk- ny efekt naszych wysiłków związanych z opro- legowaniu zadań do silnika planszy. To, na
cji CLaserQuestGameMenuMode::Draw() (Li- gramowaniem menu gry przedstawiony jest co warto zwrócić uwagę, to mechanizm re-
sting 15). na Rysunku 4. startu rozgrywki zaimplementowany w me-
Rysowanie bitmapy zrealizowane jest przy todzie Update(), z wykorzystaniem wspo-
pomocy operacji szybkiego kopiowania frag- Rozgrywkę czas zacząć! mnianej wcześniej metody Reset(). Metoda
mentu pamięci zaimplementowanego jako me- Kolejny tryb gry, zaimplementowany w ra- CLaserQuestGamePlayMode::Draw() w przy-
toda CBitmapContext::BitBlt(). mach klasy CLaserQuestGamePlayMode re- szłości również będzie bardziej interesująca
Warto też podkreślić, iż zgodnie z do- prezentuje rozgrywkę. Tryb ten – na ten – umieścimy tam kod odpowiedzialny za wy-
brym zwyczajem programistycznym unika- moment – dostarczony jest nieco na wy- świetlanie aktualnego numeru planszy oraz
my tak zwanych magicznych numerów zapisa- rost. Aczkolwiek jego wprowadzenie daje statystyk gry, a także napisów reprezentują-
nych bezpośrednio w kodzie źródłowym, a w
zamian za to wykorzystujemy stałe (KTitle-
PosY, KTitlePosY). Patrząc z szerszej perspek-
tywy, należy uwypuklić fakt, iż w tym miej-
scu również idziemy na pewne uproszczenie.
Otóż przy profesjonalnej produkcji gier rozło-
żenie elementów ekranu realizuje się – w mia-
rę możliwości – w sposób niezależny od wy-
świetlacza.
W naszym przypadku, zamiast stałej po-
winniśmy wykorzystać raczej wartość wylicza-
ną, bazującą na takich parametrach jak sze-
rokość i wysokość ekranu urządzenia (pobie-
ranych w czasie działania programu). W pre-
zentowanym przykładzie zakładam, że wy-
świetlacz ma stałe rozmiary (240x320 pik-
seli). Przeanalizujemy teraz jak działa meto-
da CLaserQuestGameMenuMode::Update() (Li-
sting 16).
Wspomniana metoda sprawdza stan kla-
wiatury i ustawia odpowiednie flagi. To co
ewidentnie rzuca się w oczy to wykorzysta-
nie składowej iMenuOptionsTransitionDelay
Period. Składowa ta jest zdefiniowana w kla-
sie CLaserQuestGameMenuMode w następują-
cy sposób:

TLaserQuestPeriod
iMenuOptionsTransitionDelayPeriod;

Użyta powyżej klasa TLaserQuestPeriod re-


prezentuje okres czasu wyrażony w milisekun-
dach, a także oferuje proste operacje do zlicza-
nia tego okresu na podstawie przyrostów cza-
su (Listing 17).
Obiekt tej klasy wykorzystywany jest
w metodzie Update() w celu wprowadze-
nia opóźnienia przy zmianach opcji w me-
nu. Gdyby ta funkcjonalność zaimplemen-
towana była bez opisanego mechanizmu to,
ze względu na fakt, iż wspomniana funkcja
wywoływana jest około 30 razy na sekundę,
opcja w menu zmieniałby się tak szybko, że Rysunek 5. Przechodzenie fragmentów wiązki lasera przez elementy planszy

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

cych opcje przypisane do softkey'ów (restart modelowania planszy wykorzystałem zwy- Innymi słowy – jeśli dane pole ma wartość
gry i powrót do menu). kłą tablicę liczb całkowitych. Aczkolwiek, większą od jeden, to zakładamy, że jest to pu-
diabeł – jak zwykle – tkwi w szczegółach. ste pole przez które przechodzą fragmenty
Laserowa łamigłówka Pierwsza rzecz – rozmiar planszy – 14 na wiązki lasera. Aby przeprowadzić przez da-
I oto dotarliśmy do implementacji upragnio- 18 pól, z czego tak naprawdę wykorzystane ne pole wiązkę, możemy skorzystać z opera-
nego silnika planszy. Monolityczna klasa jest tylko 12 na 16 pól. Zewnętrzny obszar cji bitowych. Na przykład wyrażenie:
CLaserQuestGameBoardEngine stanowi nie- to strefa tak zwanych wartowników (ang. sen-
wątpliwie serce naszej aplikacji – tutaj za- tinels). Wykorzystanie wartowników to dość iCurrentGridData[ 6 ][ 4 ] |=
implementowano mechanikę działania gry. prosty zabieg pozwalający uniknąć wsta- EbeamBottomRight;
Tym razem podarujemy sobie zamieszczanie wiania kłopotliwych i podatnych na błędy
Listingu zawierającego pełną definicję klasy warunków brzegowych. Przy programowa- dodaje do pola o określonych indeksach
– skupimy się na jej publicznym interfejsie niu logiki planszy często zachodzi potrze- (x=6 i y=4) fragment wiązki znajdujący się
oraz zapoznamy się z wybranymi szczegóła- ba sprawdzenia tego co znajduje się na po- w jego dolnym prawym rogu. W tym miej-
mi jej wewnętrznej implementacji. W tym lu o indeksie i + 1, lub co gorsza – wsta- scu warto zauważyć, iż plansza gry prze-
podpunkcie Czytelnik znajdzie wiele od- wienia tam nowej wartości. Jeśli nie skorzy- chowywana jest w dwóch wersjach – jedna
niesień do plików projektu, a w szczególno- stamy z wartowników, to w podobnych sytu- w postaci oryginalnej i druga – zawierają-
ści do dwóch z nich – LaserQuestGameBo- acjach musimy posiłkować się dodatkowymi ca modyfikacje wprowadzone w trakcie gry.
ardEngine.h oraz LaserQuestGameBoardEn- warunkami, które zazwyczaj mocno zaciem- Podejście takie ułatwia implementację me-
gine.cpp. Z tego względu, sugerowane jest niają kod. chanizmu restartu, który w przypadku La-
zaopatrzenie się w paczkę z kodami źródło- O błąd naruszenia pamięci w takich wa- serQuest jest nieodzowny, jako że gracz po-
wymi projektu przed rozpoczęciem czyta- runkach nietrudno... Korzystając z wartow- przez niewłaściwe przesuwanie luster może
nia niniejszego podpunktu. Przypominam, ników mamy gwarancję, że przy takich ope- doprowadzić do sytuacji, w której ukończe-
że wspomniana paczka dostępna jest do po- racjach wyjście poza bufor tablicy nam nie nie planszy jest niemożliwe.
brania na witrynie SDJ. grozi, gdyż wszystkie algorytmy działają- Kolejnym ciekawym aspektem związanym
Publiczny interfejs klasy reprezentują- ce na planszy operują na jej wewnętrznym z implementacją mechaniki gry jest emisja
cej planszę gry, czyli punkt styku pomię- otoczonym warstwą ochronną. Druga spra- lasera.
dzy silnikiem LaserQuest, a obiektem re- wa, to reprezentacja poszczególnych składni- Na początek warto zauważyć, że emiter
prezentującym tryb rozgrywki, nie zadzi- ków planszy. A jest tego trochę – puste pole, zaimplementowany w grze może działać w
wia niczym niezwykłym. Ponownie widzi- ściana, ściana-lustro, lustro ruchome, emi- 8 konfiguracjach (jest w stanie wysyłać pro-
my tu takie metody jak Draw(), Update() ter promienia laserowego czy wreszcie sa- mień lasera na 8 sposobów). Wspomniana
czy Reset(). Uwagę należy zwrócić za to ma wiązka lasera – to tylko niektóre elemen- konfiguracja opisana jest przez pozycję emi-
na metodę IsSolved(). Metoda ta odpowia- ty rozgrywki. Pomysł na upakowanie tego tera na planszy, aktywny bok (tj. bok z któ-
da na pytanie, czy nasza laserowa łamigłów- wszystkiego w jednej tablicy jest następują- rego emitowany jest promień lasera) oraz
ka została pomyślnie rozwiązana. Przypo- cy. Wartość zero oznacza wartownika. War- orientację promienia (lewo- lub prawostron-
minam, że według opisanych wcześniej zało- tości mniejsze od zera oznaczają kolejne ele- ną). Poszczególne konfiguracje pracy emitera
żeń, warunkiem zakończenia gry jest znisz- menty planszy. Wartość jeden oznacza pole pokazane są na Rysunku 6, przy czym wiąz-
czenie wszystkich umieszczonych na plan- puste. Wartości powyżej jeden to maski bito- ki lasera o orientacji lewostronnej zaznaczo-
szy sensorów i dojście do pola oznaczonego we określające jaka część wiązki lasera prze- ne są kolorem zielonym, zaś prawostronnej
jako wyjście. chodzi przez dane pole. Warto w tym miej- – białym.
Prawdziwa mechanika LaserQuest – zgod- scu zauważyć, że puste pole planszy może Kluczową rolę w implementacji silnika od-
nie z zasadą ukrywania informacji – za- zawierać cztery fragmenty wiązki – w róż- grywa funkcja TrackBeam(). Funkcja ta odpo-
mknięta jest w metodach stanowiących nie- nych konfiguracjach. Idea ta jest przedsta- wiada za śledzenie wiązki lasera od momen-
publiczny interfejs klasy. Zanim jednak wiona na Rysunku 5, gdzie każdy fragment tu wyjścia z emitera aż do chwili, kiedy trafi
przejdziemy do opisu tej mechaniki, zbada- wiązki przedstawiony jest oddzielnym kolo- ona w materiał, który nie jest w stanie jej od-
my jaka struktura danych reprezentuje plan- rem (zielony – EBeamUpperLeft, niebieski bić. Algorytm ten korzysta intensywnie z ta-
szę gry. Dla większości Czytelników nie bę- – EBeamUpperRight, czerwony – EBeamBot- blic przejść (ang. lookup tables) opisujących
dzie zapewne wielkim zaskoczeniem, iż do tomLeft oraz żółty – EBeamBottomRight). zmiany fragmentów wiązki dla różnych kon-

Erratra
Nikt nie ma patentu na nieomylność. W tym miejscu opisane są usterki, które wkradły się do po-
przedniej części artykułu. Do implementacji metody CGameSkeletonContainer::OnTick()
wkradł się drobny aczkolwiek znaczący błąd. Chodzi konkretnie o fragment kodu w którym obli-
czany jest przyrost czasu pomiędzy kolejnymi iteracjami pętli gry:

TInt64 dt = iTickStart.Int64() - iTickStop.Int64();

Przy tak skonstruowanym zapisie przyrosty przekazywane do metody CGameSkeletonContainer:


:Update() są ujemne...
Drugi błąd polega na zastosowaniu zbyt ogólnego kontekstu graficznego w metodzie
CGameSkeletonContainer::Draw(). Uważni czytelnicy zauważą, iż w projekcie LaserQuest
jako kontekst graficzny przekazywany jest obiekt klasy CBitmapContext, w odróżnieniu do
CGraphicsContext używanego w przypadku projektu GameSkeleton. Problem polega na
tym, iż ten drugi nie oferuje kluczowej przy programowaniu gier operacji szybkiego kopio-
wania bitmap (BitBlit). Warto w tym miejscu podkreślić iż poprawki opisanych usterek zosta-
ły zaaplikowane w przykładowych kodach źródłowych są dostępne na witrynie SDJ.
Rysunek 6. Konfiguracje pracy emitera

74 11/2008
Programowanie gier dla Symbian OS

figuracji wejściowych i żonglując przyrosta- Analizując kod źródłowy silnika war- Podsumowanie
mi określa drogę wiązki, na której pozosta- to zwrócić uwagę na makro TILE _ ENUM _ Tak oto kończymy drugi odcinek cyklu ar-
wia ślad przy użyciu odpowiednich operacji VAL _ 2 _ TILE _ BITMAP _ INDEX , które w tykułów o programowaniu gier przeznaczo-
bitowych. Osoby zainteresowane szczegóła- sprytny sposób odwzorowuje wartości enu- nych dla Symbian OS. Niestety – mój ambit-
mi implementacji tego algorytmu zapraszam meracji identyfikujących poszczególne ka- ny plan opisany w podsumowaniu z poprzed-
do przeanalizowania kodów źródłowych. To fle na indeks w tablicy z odpowiadający- niego odcinka – spalił na panewce – wiele
na co chciałbym zwrócić jeszcze raz uwagę, mi im bitmapami. Nieco bardziej złożone z obiecanych wtedy zagadnień zmuszony by-
to wykorzystanie tablic przejść. Ta użytecz- struktury danych wykorzystywane są przy łem przenieść do kolejnego odcinka. Głów-
na technika pozwala niejednokrotnie uczy- animacji. Jako przykład można podać tu nym tego powodem stało się ograniczenie
nić dany fragment kodu krótszym i czytel- dwuwymiarową tablicę służącą do przecho- wielkości artykułu.
niejszym, toteż gorąco polecam stosowanie wywania klatek animacji pojazdu którym Z drugiej strony – staram się traktować
jej przy konstruowaniu swoich własnych steruje gracz: prezentowane zagadnienie bardzo poważ-
aplikacji. Jako przykład stosowania tej tech- nie, opisując niełatwy proces tworzenia gier
nik mogę podać implementację pomocni- CFbsBitmap* iVehicleFrames[ KLaserQuestVehi od podszewki i zahaczając o szczegóły pomi-
czej metody CLaserQuestGameBoardEngine: cleFrameCount ] jane często w publikacjach o podobnej te-
:ComputeNextVehicleMovePosX(), przedsta- [ KLaserQuestVehicleFrameBitmapCount ]; matyce.
wioną na Listingu 18. Mam nadzieję, iż prezentacja cyklu two-
Wspomniana metoda oblicza wartość Pierwszy wymiar tablicy odpowiada nume- rzenia gry – od początku do końca – z
składową na osi X dla kolejnej pozycji pojaz- rom klatek animacji zaś wymiar drugi – po- uwzględnieniem form przejściowych, da
du kierowanego przez gracza przy zadanym szczególnym kierunkom ruchu. pełniejszy pogląd na to zagadnienie. Na sam
kierunku. W implementacji funkcji korzy- Zarówno rysowanie jak i uaktualnianie za- koniec – zgodnie z tradycją chciałbym za-
stamy z faktu, iż enumeracje opisujące kie- wartości planszy przebiega w kilku etapach proponować Czytelnikom zadanie domowe.
runki ruchu przyjmują wartości z zakresu – niektóre z nich aktywowane są jedynie w Proponuję, korzystając z dołączonego do ni-
od 0 do 3. Biorąc to pod uwagę, wykorzy- specyficznych przypadkach – tak na przy- niejszego artykułu szablonu szkieletu apli-
stujemy wartość kierunku jako indeks w ta- kład dzieje się z animacją zanikającego sen- kacji oraz narzędzia t2t, stworzyć własny
blicy przejść zawierającej odpowiednie przy- sora. projekt i zaimplementować prostą grę o te-
rosty na osi X. Ten sam efekt można by uzy- Aby zwiększyć czytelność kodu starałem matyce podobnej do tej, którą reprezentuje
skać stosując operację switch do obsługi ko- się grupować metody i składowe w grupy te- LaserQuest (dobrymi przykładami tego ro-
lejnych wartościach enumeracji, aczkolwiek matyczne. dzaju gier są takie tytuły jak Sokoban czy Bo-
przedstawione rozwiązanie wydaje się być Niestety, w przypadkach takich jak silnik ulder Dash). Osoby, które zdecydują się na
bardziej proste, eleganckie i jednocześnie gry LaserQuest, gdzie mamy do oprogramo- taki krok, zachęcam również do rozwijanie
– kompaktowe. wania zestaw mocno powiązanych i przeni- obranego projektu na bazie technik opisywa-
Oprócz struktur danych opisujących roz- kających się reguł gry, ciężko jest uniknąć nych w kolejnych odcinkach niniejszego cy-
grywkę, silnik planszy przechowuje cały sze- monolitycznych klas. Zresztą LaserQuest klu – w myśl starego porzekadła, które w za-
reg bitmap wykorzystywanych do renderowa- jest i tak projektem stosunkowo nieskom- wodzie programisty sprawdza się jak nigdzie
nia składników gry. W przypadku kafli (ang. plikowanym – sama Lasermania stanowią- indziej – nie zrozumiesz dopóty, dopóki nie zro-
tiles), czyli statycznych składników planszy sy- ca jego pierwowzór zawiera o wiele szerszy bisz tego sam.
tuacja jest prosta – poszczególne bitmapy prze- zestaw reguł rozgrywki powiązanych z do- Na koniec chciałbym wymienić osoby, któ-
chowywane są w tablicy: datkowymi typami elementów występują- re dzięki swoim wnikliwym recenzjom przy-
cych na planszy gry. Czytelników zaintere- czyniły się do znacznej poprawy jakości ni-
CFbsBitmap* iTileBitmaps[ KLaserQuestTileBi sowanych szczegółami implementacji silni- niejszego artykułu. Wspomniane osoby to:
tmapCount ]; ka zapraszam do analizy kodu źródłowego. Dawid de Rosier, Jacek „Noe” Cybularczyk
Tych mniej cierpliwych zachęcam do obej- oraz Piotr Buła.
rzenia Rysunku 7, na którym przedstawio- Chciałbym również tradycyjnie podzięko-
ne są efekty działania opisanych wyżej me- wać mojej ukochanej żonie – Oli, za cierpli-
chanizmów. wość, którą mi nieustannie okazuje.

Gra w kieszeni
Nadszedł czas aby przetestować naszą grę w jej
docelowym środowisku. Procedura budowa- RAFAŁ KOCISZ
nia paczki instalacyjnej jest identyczna do tej Rafał Kocisz pracuje na stanowisku Dyrektora
opisanej na początku artykułu. Czytelników, Technicznego w firmie Gamelion, wchodzącej w
którzy są szczęśliwymi posiadaczami komó- skład Grupy BLStream. Rafał specjalizuje się w
rek Nokia z serii S60 3rd Edition, zapraszam technologiach związanych z produkcją oprogra-
do przetestowania LaserQuest. Mam nadzie- mowania na platformy mobilne, ze szczególnym
ję, że rozwiązanie przykładowej planszy (ścią- naciskiem na tworzenie gier. Grupa BLStream po-
gniętej zresztą z oryginalnej Lasermanii) nie wstała, by efektywniej wykorzystywać potencjał
sprawi nikomu dużego problemu. Już po kil- dwóch szybko rozwijających się producentów
ku minutach grania widać jest, że grze bardzo oprogramowania – BLStream i Gamelion. Firmy
dużo brakuje do finalnej postaci. Nadal braku- wchodzące w skład grupy specjalizują się w wy-
je dźwięku, obsługi wielu plansz, czy wykry- twarzaniu oprogramowania dla klientów korpo-
wania orientacji ekranu. Do aspektów tych racyjnych, w rozwiązaniach mobilnych oraz pro-
wrócimy w kolejnych odsłonach cyklu, a te- dukcji i testowaniu gier.
Rysunek 7. Plansza gry raz czas na... Kontakt z autorem: rafal.kocisz@game-lion.com

www.sdjournal.org 75
Wywiad

Na fali zmian
Informacja to najcenniejszy zasób w
firmie. EMC wie, jak sprawić aby ten zasób
generował zyski - dzięki integracji sprzętu,
oprogramowania i usług.
Bartosz Stebnicki

Software Developer's Journal: Proszę na wiązania dla indywidualnych użytkow-


początek powiedzieć naszym Czytelni- ników?
kom kilka słów o sobie – kiedy rozpoczął BS: Podjęliśmy już pewne kroki w tym kie-
Pan pracę w firmie EMC i z jakimi proble- runku: EMC przejęło firmę Iomega, któ-
mami zetknął się Pan pracując na obec- ra oferuje produkty dla rynku konsumenc-
nym stanowisku? kiego.
Bartosz Stebnicki: W EMC pracuję już 8 lat 10 lat temu zaczynaliśmy działania od
i przez ten czas stawiłem czoła wielu wy- współpracy z największymi firmami, naszymi
zwaniom. Firma w tym czasie zmieniała się klientami były m.in. PKO BP czy TP S.A. Póź-
i rozwijała dynamicznie – od oferującej po- niej nasze produkty stawały się coraz bar-
jedynczy produkt do potężnej korporacji, dziej powszechne. Myślę więc, że za jakiś
która proponuje klientom kilkadziesiąt pro- czas produkty EMC można będzie nabyć na-
duktów. Miałem dużą przyjemność uczest- wet w sieciach handlowych, takich jak Carre-
niczyć w procesie rozwoju firmy, ale wyma- four czy Media Markt.
gało to także dużego wysiłku i sporego na-
kładu pracy. W tym czasie dokonaliśmy kil- SDJ: Które z produktów w bogatej ofercie
ku akwizycji, pojawiali się w EMC nowi lu- EMC cieszą się największą popularnością i
dzie, firma zwiększała się obroty i rozro- najlepiej się sprzedają?
sła się z kilku do kilkudziesięciu zatrudnio- BS: Strukturę naszej firmy tworzą czte-
nych osób. ry główne działy odpowiadające specyfice
produktów i usług : storage, oprogramo-
SDJ: Czy wprowadził Pan jakieś rewolu- wanie m.in. Documentum i Legato, trzecia
cyjne zmiany przejmując dowodzenie fir- część firmy to produkty związane z bezpie-
mą na rynku polskim? czeństwem i wreszcie czwarta – wizualiza-
Bartosz Stebnicki: Oczywiście wprowadzili- cja i rozrywka. Można nas przyrównać do
śmy szereg istotnych zmian, ale raczej nie 4-silnikowego samolotu. Obecnie każdy z
nazwałbym ich rewolucyjnymi. Na pewno wymienionych działów osiąga wyśmieni-
pojawiło się kilka zmian w związku z po- te wyniki.
stępującymi akwizycjami. Rozpoczęliśmy
ekspansję na nowe rynki i otworzyły się SDJ: Czy dostrzega Pan już odpowied-
przed nami kolejne możliwości. Tak więc ni potencjał kadrowy do otwarcia cen-
w polskim oddziale EMC pojawiły się no- trum inżynierskiego EMC, czy woli
we obszary działania i możliwości rozwo- nadal korzystać z usług podwykonaw-
ju. Wprawdzie nie nastąpiła rewolucja, ale ców takich, jak S4E? Na odpowiedź na
odnotowaliśmy bardzo szybki i harmonij- to pytanie czeka jeden z naszych Czy-
ny wzrost. telników.
BS: Firma EMC świadczy usługi dedykowa-
SDJ: EMC swoje usługi oraz produk- ne i zauważyliśmy, że ich sprzedaż zwięk-
ty kieruje głównie do klientów bizne- sza się dużo szybciej niż sprzedaż licencji
sowych. Czy macie Państwo także roz- czy sprzętu. Natomiast nie planujemy obec-

76 11/2008
Wywiad

nie otwarcia centrum projektowego. Ofe- obejść. Powstaje też pytanie, jakie to bę- dzania sprzętu bądź dalszego wyjazdu.
rujemy usługi serwisowe, wdrożeniowe i dzie Data Center? Można bowiem myśleć Myślę, że daje to naszym klientom ogrom-
na nich głównie skupiamy naszą uwagę na o ofercie outsourcingu, a więc wynajęciu ne korzyści.
chwilę obecną. powierzchni, gdzie stawiamy swój wła-
sny sprzęt, albo o ofercie szerszej i bar- SDJ: Jakie jest w samej firmie EMC podej-
SDJ: Czy planujecie wprowadzenie takich dziej złożonej jak udostępnianie samej ście do bezpieczeństwa informacji? W ja-
usług jak otwarte szkolenia? Czy myślicie powierzchni dyskowej z gwarancją bez- ki sposób firma zabezpiecza się przed wy-
o przeprowadzaniu wykładów – czy to na pieczeństwa i odpowiednio wysokiej wy- pływem informacji oraz przed atakami z
uczelniach, czy za pośrednictwem jakie- dajności. zewnątrz?
goś centrum szkoleniowego? Taką usługę oferuje EMC – posiadamy du- BS: Oczywiście wdrożyliśmy odpowied-
BS: Tak mamy takie plany. Dotychczas że możliwości i wydajną infrastrukturę, z nie procedury, sprzęt i oprogramowanie
szkolenia były organizowane przez na- której korzysta klient. Sądzę, że właśnie w jak firewall czy antywirusy. Jednak przede
sze polskie biuro, ale istniała także moż- tym kierunku będzie zmierzać sektor Da- wszystkim staramy się uświadamiać użyt-
liwość skorzystania ze szkoleń zagranicz- ta Center. kowników, co należy robić, a czego nie w
nych. Jednak w związku z szybko rosną- zakresie bezpieczeństwa. Tu bowiem do-
cą liczbą klientów zamierzamy poszerzyć SDJ: Jakie rozwiązania związane z bez- strzegamy największe ryzyko. I myślę tu
ofertę szkoleń przede wszystkim dla użyt- pieczeństwem danych oferuje EMC? W ja- nawet o tak prostych rzeczach jak blo-
kowników naszych produktów. Ale chce- ki sposób archiwizowane i zabezpieczane kowanie komputera odchodząc od biur-
my również szerzej zaistnieć na uczel- są dane w oferowanych przez firmę roz- ka czy zmienianie haseł jak też nie pozo-
niach, gdzie specjaliści EMC mogliby prze- wiązaniach. Jakie gwarancje daje EMC, że stawianie na biurku ważnych dokumen-
kazywać swoją wiedzę studentom. Mamy świadczone przez firmę usługi są w pełni tów i korzystanie z niszczarki. Są to więc
nadzieję, że działania te przyniosą za kilka bezpieczne? kwestie często mniej związane z IT a bar-
lat korzyści nie tylko naszej firmie, ale też BS: Problem bezpieczeństwa widzimy bar- dziej z kulturą pracy. O IT troszczy się na-
całemu rynkowi. dzo szeroko, rozpatrujemy go na kilku po- sza korporacja.
Nasze podejście jest długoterminowe i ziomach – od płaszczyzny sprzętowej,
podejmujemy wyzwania, które nie są ob- gdzie same macierze są skonstruowane SDJ: A czy zanotowaliście Państwo kiedyś
liczone jedynie na szybki, natychmiasto- w sposób zapewniający ochronę danych i próby włamań hakerów np. na stronę in-
wy efekt. minimalizujący ryzyko ich utraty, poprzez ternetową korporacji?
przeniesienie danych do chronionej loka- BS: Obawiam się, że gdy odpowiem prze-
SDJ: Jak ocenia Pan udział produktów lizacji i ochronę dostępu do tych danych cząco, to takie próby się rozpoczną. Jednak
EMC w polskim rynku pamięci maso- (tutaj korzystamy z rozwiązań RSA), aż po dotychczas nie zanotowaliśmy takiego typu
wych ? fizyczne zabezpieczanie danych – czyli od- zdarzeń. Być może nikt nie uznał nas za fir-
BS: To zależy, o jakim segmencie tego rynku powiednio chroniony budynek. Dzięki te- mę będącą atrakcyjnym celem podobnych
mówimy. Na rynku dużych przedsiębiorstw mu powstaje w pełni bezpieczna infra- ataków.
jest to około 70%, a kilka procent w przypad- struktura, przechowująca zaszyfrowane
ku firm zaliczanych do SMB. dane i zapewniająca dostęp do nich tylko SDJ: A jak ocenia Pan pisma dla profesjo-
upoważnionym osobom. nalistów, takie jak Linux+ , SDJ, lub Ha-
SDJ: Czy w ramach swoich systemów ope- king9 – czy pisma te faktycznie dociera-
racyjnych korzystacie też z otwartego SDJ: Czy Państwa centrum danych jest ją do specjalistów i gwarantują podnosze-
oprogramowania? zlokalizowane gdzieś blisko czy korzysta- nie ich umiejętności?
BS: Z otwartego oprogramowania nie, acz- cie z zewnętrznej lokalizacji? BS: Znam doskonale wszystkie te pisma i
kolwiek naszą dewizą jest otwartość na- BS: Usługa, którą zaczęło świadczyć EMC nosi przyznam, że poziom szczegółowości zagad-
szych produktów na inne technologie. nazwę Mozy i dotyczy zarówno rynku konsu- nień tam poruszanych jest wysoki. Jest to
Oferowane przez nas rozwiązania współ- menckiego, jak i rynku dużych klientów, in- niewątpliwie świetne źródło informacji dla
pracują z różnymi systemami operacyjny- frastruktura na jej potrzeby, jest zlokalizowa- specjalistów.
mi, jak np. systemy firm IBM, HP, ale też na poza granicami Polski.
z systemem Linux – są to zatem systemy SDJ: Na koniec chcielibyśmy poznać Pana
otwarte. SDJ: Kilka tygodni temutemu miało spostrzeżenia na temat rozwoju rynku IT
miejsce otwarcie EMC Signature Solu- w Polsce. Czy polski rynek nie potrzebu-
SDJ: Proszę opowiedzieć o Państwa suk- tion Center w siedzibie firmy Wola In- je obecnie silnego impulsu? Czy nie zo-
cesach na obszarze Data Center. Jakie ma- fo. Jakie korzyści dla firmy EMC będzie stajemy gdzieś w tyle za rynkami euro-
cie osiągnięcia w tej materii. miało otwarcie takiego centrum w Pol- pejskimi?
BS: Oprócz tradycyjnej gałęzi storage'o- sce? BS: Polski rynek rozwija się i dojrzewa w
wej, gdzie – tak jak wspomniałem – jeste- BS: Wspólnie z firmą Wola Info tworzymy szybkim tempie. Ale nie jest też tak, że my
śmy obecni u większości dużych klientów, centrum testowe. To miejsce, gdzie klien- tylko staramy się dogonić innych, gdyż w
uczestniczyliśmy również w projektowa- ci mogą praktycznie zapoznać się z posia- wielu dziedzinach dorównujemy już bądź
niu oraz budowie kilku dużych centrów da- daną przez nas, bardzo bogatą infrastruk- nawet wyprzedzamy inne rozwinięte ryn-
nych w Polsce. Nie chciałbym jednak poda- turą, składającą się z serwerów firm trze- ki europejskie. Potencjał jest zatem ol-
wać ich nazw. cich, bibliotek taśmowych, macierzy dys- brzymi.
kowych, przełączników i jeszcze kilku in-
SDJ: Jak będzie wyglądać przyszłość w nych elementów. SDJ: Dziękujemy za rozmowę.
sektorze Data Center? To centrum daje klientom możliwość
BS: Myślę, że bez wykorzystania Data Cen- przetestowania funkcjonalności i wydaj-
ter już wkrótce ciężko będzie nam się ności aplikacji bez konieczności sprowa-

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

Skontaktuj się z nami:


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

Opera Software Architektury systemów IT


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

FRONTLINE STUDIOS Future Processing


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

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

Kei.pl
Kei.pl działa na rynku usług hostingowych od 2000
roku. Do naszych zadowolonych Klientów z du-
mą możemy zaliczyć wiele przedsiębiorstw sekto-
ra MSP, instytucji oraz osób prywatnych. W ofer-
cie Kei.pl znajdują się pakiety hostingowe, a także
usługi dla wymagających Użytkowników – platfor-
my e-Biznes oraz serwery fizyczne.

http://www.kei.pl
KLUB PRO

StatConsulting TTS Company Sp. z o.o.


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

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

Transition Technologies S.A. EPRO


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

IT SOLUTIONS Softline rozwiązania mobilne


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

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

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


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

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

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

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

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


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

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


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

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

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

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

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

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

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

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

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

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

□ automatyczne przedłużenie prenumeraty

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

l bezpieczna płatność Software Develope-


12
180*/

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


– dawniej Software 2.0
250
PLN

* cena prenumeraty rocznej dla osób prywatnych


W NASTĘPNYM NUMERZE SOFTWARE DEVELOPER’S JOURNAL 12/2008 168

SYSTEMY OPERACYJNE
Technologia Adobe Flash
w systemach wbudowanych

SZTUCZNA INTELIGENCJA
Miary entropii w sztucznej ewolucji programów komputerowych

PROGRAMOWANIE JAVA
Obliczenia numeryczne w programach komputerowych

PROGRAMOWANIE PHP
Zaawansowana obróbka grafiki w PHP

NOWE ARTYKUŁY W DZIAŁACH


Biblioteka miesiąca
Testowanie oprogramowania

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

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

82 11/2008

You might also like