Professional Documents
Culture Documents
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
ECOMMERCE 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-
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
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
6 11/2008
Aktualności
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/
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
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
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
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
10 11/2008
Aktualności
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
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.
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
Jericho HTML
Parser i biblioteka narzędziowa HTML
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ę
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.
<?php
include 'config.php';
<?php
$sqlitePath = './sklep2.sqlite';
session_start();
function __autoload($class_name) {
require_once './class/'.$class_name . '.php';
}
?>
www.sdjournal.org 21
E-commerce
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
www.sdjournal.org 23
E-commerce
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';
���
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
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
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
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...
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
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
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:
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ą:
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
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
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
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
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ą
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:
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
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
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;
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-
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ę!
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
www.sdjournal.org 65
Programowanie urządzeń mobilnych
66 11/2008
Programowanie gier dla Symbian OS
www.sdjournal.org 67
Programowanie urządzeń mobilnych
• 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...
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:
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;
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:
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
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.
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
http://www.statconsulting.com.pl http://www.OprogramowanieKomputerowe.pl
http://www.itsolutions.biz.pl
marcin.pytlik@itsolutions.biz.pl http://www.softline.com.pl
http://www.proximetry.com http://www.swdsoft.pl
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
Nazwa firmy.....................................................................................
.........................................................................................................
Telefon ............................................................................................
E–mail .............................................................................................
ID kontrahenta ................................................................................
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
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
W spr
zedaż
y od 18
listop
ada
Redakcja zastrzega sobie możliwość zmiany zawartości pisma.
82 11/2008