SDJ_12_2008_PL_Symbian OS

84

Transcript of SDJ_12_2008_PL_Symbian OS

Page 1: SDJ_12_2008_PL_Symbian OS
Page 2: SDJ_12_2008_PL_Symbian OS
Page 3: SDJ_12_2008_PL_Symbian OS
Page 4: SDJ_12_2008_PL_Symbian OS

12/20084 www.sdjournal.org 5

12/2008 (168)

Le périodique hakin9 est publié par Software-Wydawnictwo Sp. z o.o.Bokserska, 02-682 Varsovie, PologneTél. +48 22 887 10 10, Fax. +48 22 887 10 11www.phpsolmag.org

Directeur de la publication : Jarosław Szumski

Imprimerie, photogravure : 101 Studio, Firma Tęgi Ekonomiczna 30/36, 93-426 ŁódźImprimé en Pologne/Printed in Poland

Abonnement (France métropolitaine, DOM/TOM) : 1 an (soit 6 numéros) 38 €

Dépôt légal : à parutionISSN : 1731-7037Distribution : MLP Parc d’activités de Chesnes, 55 bd de la Noirée BP 59 F - 38291 SAINT-QUENTIN-FALLAVIER CEDEX(c) 2005 Software-Wydawnictwo, tous les droits réservés

SPIS TREŚCItuł na coś, co nie wymaga zbyt dużo myślenia, ale daje dużo rozrywki. Taki jest właśnie Duke Nukem: Manhattan Project. Zapraszamy do lektury.

36 Red FactionŁukasz OlenderRed Faction – to właśnie ta gra jest tematem niniejszego artykułu. Czy pomimo upływu ponad siedmiu lat od daty premiery jest ona warta poświęconego jej czasu?

40 HedgewarsMaciej MrozińskiHedgewars to gra mająca na celu stworzenie otwartego odpowied-nika legendarnych Wormsów. Prawdę mówiąc wręcz zaskakujące jest podobieństwo do oryginału, tak wygląd interfejsu jak i przebieg rozgrywki, na fizyce gry kończąc do złudzenia przypominają Worm-sy. Warto jednak powiedzieć jeszcze kilka słów.

SZTUCZNA INTELIGENCJA42 Porozmawiaj z komputeremMariusz JasnogórskiKomputerowe rozpoznawanie i synteza mowy (ang. Speech Tech-nology) były niegdyś uważane za technologię dalece futury-styczną, która z pewnością nigdy nie opuści sfery fantastyki na-ukowej. Tymczasem, przez ostatnie 50 lat technologia ta była stale rozwijana i obecnie jest coraz częściej stosowana, zyskując coraz większą popularność.

ECOMMERCE44 Wydajny, elastyczny i przyjazny CMS – Textpattern część II Krystian RajskiCelem niniejszego artykułu jest rozwinięcie pierwszej części po-przez wyjaśnianie i zaprezentowanie sposobu budowy witryny w oparciu o własny szkic struktury HTML. Przedstawiony sposób

06 AKTUALNOŚCIRafał Kocisz

12 TAM BYLIŚMY

16 OPIS CD

BIBLIOTEKA MIESIĄCA18 Django – Python w zastosowaniach webowychTomasz KropiewnickiTworzenie aplikacji internetowych to chleb powszedni wielu współ-czesnych programistów, co w większości przypadków wiąże się z ciężką oraz mozolną pracą. W niniejszym artykule przedstawione jest Django – rozwiązanie stworzone w języku Python, którego ce-lem jest uczynić pracę programisty aplikacji webowych prostszą, bardziej efektywną oraz przyjemniejszą.

PROGRAMOWANIE W LINUKSIE26 Mirrorowanie dysku w LinuksieRadosław KorzeniewskiMirrorowanie dysku nie jest operacją łatwą i wymaga minimalnej wie-dzy dotyczącej partycjonowania, konfiguracji systemu czy samej tech-nologii RAID. Niestety jak do tej pory dystrybucje Linuksa doczekały się co najwyżej możliwości instalacji systemu na mirrorowaniej parze dys-ków. Wciąż brakuje mechanizmów prostego i łatwego włączenia mirro-ru w taki sposób aby z procesem tym poradził sobie każdy użytkownik komputera. Na szczęście system Linuks ciągle się rozwija.

ROZRYWKA W LINUKSIE32 Duke NukemŁukasz OlenderAnarchy Online i Red Faction to gry niewątpliwie złożone. W życiu gracza są jednak takie chwile, w których zamieniłby on każdy skomplikowany ty-

Miesięcznik Software Developer’s Journal (12 numerów w roku)jest wydawany przez Software-Wydawnictwo Sp. z o.o.

Dyrektor wydawniczy: Sylwia Małecka

Junior Market Manager: Anna Adamczyk

Senior Product Manager: Katarzyna Juszczyńska

Redaktor naczelny: Iwona Chwedoruk [email protected]

Kierownik produkcji: Marta Kurpiewska [email protected]

Projekt okładki: Agnieszka Marchocka

Skład i łamanie: Grzegorz Laskowski [email protected]

Wyróżnieni betatesterzy: Ł. Lechert, S. Nieszwiec, R. Zacharczyk

Nakład: 6 000 egz.

Adres korespondencyjny:Software-Wydawnictwo Sp. z o.o., ul. Bokserska 1, 02-682 Warszawa, Polskatel. +48 22 427 36 91, fax +48 22 224 24 59www.phpsolmag.org [email protected]

Dział reklamy: [email protected]: Marzena Dmowska [email protected], tel. +48 22 427 36 79; +48 22 427 36 53

Dołączoną do magazynu płytę CD przetestowano programem AntiVirenKit firmy G DATA Software Sp. z o.o.

Redakcja dokłada wszelkich starań, by publikowane w piśmie i na towarzyszących mu nośnikach informacje i programy były poprawne, jednakże nie bierze odpowiedzialności za efekty wykorzystania ich; nie gwarantuje także poprawnego działania programów shareware, freeware i public domain.

Uszkodzone podczas wysyłki płyty wymienia redakcja.

Page 5: SDJ_12_2008_PL_Symbian OS

12/20084 www.sdjournal.org 5

Rédacteur en chef : Marek Bettman [email protected]édacteurs : Aneta Cejmańska [email protected] Dudzic [email protected]éparation du CD : Aurox Core TeamMaquette : Anna Osiecka [email protected] : Agnieszka MarchockaTraduction : Iwona Czarnota, Aneta Lasota, Marie-Laure Perrotey, Grazyna WełnaBêta-testeurs : Thomas Bores, Tony Boucheau, Pascal Foulon, Pascal Miquet, Romain Lévy, Augustin Pascual, Julien Poulalion, Alain Ribault

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

Abonnement : [email protected] : Marta Kurpiewska [email protected] : Monika Godlewska [email protected]é : [email protected]

Si vous êtes intéressé par l’achat de licence de publication de revues merci de contacter : Monika Godlewska [email protected] , tél : +48 (22) 887 12 66 fax : +48 (22) 887 10 11

La rédaction fait tout son possible pour s’assurer que les logiciels sont à jour, pourtant elle décline toute responsabilité pour leur utilisation. Elle ne fournit pas de support technique lié à l’installation ou l’utilisation des logiciels enregistrés sur le CD-ROM. Tous les logos et marques déposés sont la propriété de leurs propriétaires respectifs.

La rédaction utilise le système PAO Pour créer les diagrammes on a utilisé le programme

Le CD-ROM joint au magazine a été testé avec AntiVirenKit de la société G Data Software Sp. z o.o

AVERTISSEMENTLes techniques présentées dans les articles ne peuvent être utilisées qu'au sein des réseaux internes.La rédaction du magazine n'est pas responsable de l'utilisation incorrecte des techniques présentées.L'utilisation des techniques présentées peut provoquer la perte des données !

tworzenia szablonu nie jest jednym właściwym podejściem. Ma-my nadzieję, że zaprezentowane informacje zachęcą do dalszej pracy z Textpattern.

TESTOWANIE OPROGRAMOWANIA48 Adobe Flash – wykorzystanie w urządzeniach wbudowanych Randy MartinWprowadzenie technologii Adobe Flash do urządzeń wbudowa-nych jest jednym z najbardziej ekscytujących osiągnięć ostatnich kilku lat. To, co zaczęło się od potrzeby stworzenia możliwości gra-nia w gry w technologii Flash na telefonach komórkowych, rozwi-nęło się w chęć budowania całych wbudowanych interfejsów gra-ficznych wykonanych w technologii Flash i technologiach pokrew-nych, takich jak Flex. Użycie technologii Flash w systemach wbu-dowanych wymaga jednak od projektantów rozwiązania kilku pro-blemów. Niniejsze opracowanie skupia się na wyborach, których musi dokonać projektant podczas spełniania różnego rodzaju wy-magań.

52 Podstawy bezpieczeństwa OracleCezary G. CerekwickiPrawie każdy system informatyczny zawiera w sobie bazę danych, a Oracle wśród nich zajmuje miejsce szczególne. Jest to system o ol-brzymiej liczbie wdrożeń, działa na nim wiele istotnych usług, m.in. bankowych. Dlatego warto znać zastosowane w nim mechanizmy bezpieczeństwa.

56 Emulacja systemuMS Windows CE 5.0 na platformie x86Artur KorneuszUrządzenia mobilne (np. Pocket PC, Smatrfon) stają się coraz bar-dziej popularne. Przyczynia się do tego zarówno wzrost funkcjonal-ności jak i coraz bardziej przystępna cena. Duża ilość tychże urzą-dzeń wyposażona jest przez producenta w system operacyjny klasy MS Windows CE oraz dedykowane oprogramowanie, związane z je-go przeznaczeniem.

PROGRAMOWANIE PHP

58 Grafika w PHPAdam BlokJednym z kluczowych elementów każdego serwisu internetowe-go jest grafika. Dzięki PHP w dynamiczny sposób możemy ją bez niczyjej ingerencji uatrakcyjnić lub dostosować do naszych po-trzeb.

62 Własny słup ogłoszeniowyPiotr PlenikGdy już zadbaliśmy o przygotowanie działającej aplikacji, czas na dopracowanie kilku detali, dzięki którym naszą aplikację można uznać za profesjonalnie wykończoną. W drugiej części zaprezentu-jemy, w jaki sposób możemy zamieścić aplikację na serwerze oraz w sprawny sposób ją aktualizować.

PROGRAMOWANIE URZĄDZEŃ MOBILNYCH64 Programowanie gier dla Symbian OS – rozwijamy gręRafał KociszW dwóch pierwszych odcinkach serii Programowanie gier dla Sym-bian OS Czytelnicy mogli zapoznać się ze szkieletem aplikacji i prze-konać się, jak można wykorzystać ten szkielet w celu zbudowania stosunkowo prostej – aczkolwiek niebanalnej – gry logiczno-zręcz-nościowej. Poprzedni odcinek cyklu, zatytułowany Budujemy grę!, zakończył się uruchomieniem pierwszej, grywalnej wersji projektu LaserQuest. W niniejszym odcinku skupimy się na rozszerzeniu funk-cjonalności wspomnianej gry, analizując przy tym takie kluczowe składniki warsztatu programisty Symbian OS jak deskryptory oraz operacje wejścia/wyjścia na plikach.

WYWIAD76 Wywiad z Ludovic Neveu – Dyrektorem ds. Sprzedaży w Embarcadero Technologies

Wszystkie znaki firmowe zawarte w piśmie są własności odpowiednich firm.Zostały użyte wyłącznie w celach informacyjnych.

Redakcja używa systemu automatycznego składu

Osoby zainteresowane współpracą prosimy o kontakt:[email protected]

Druk: PlusMedia

Wysokość nakładu obejmuje również dodruki. Redakcja nie udziela pomocy technicznej w instalowaniu i użytkowaniu programów zamieszczonych na płycie CD-ROM dostarczonej razem z pismem.

Sprzedaż aktualnych lub archiwalnych numerów pisma po innej cenie niż wydrukowana na okładce – bez zgody wydawcy – jest działaniem na jego szkodę i skutkuje odpowiedzialnością sądową.

Page 6: SDJ_12_2008_PL_Symbian OS

Aktualności

6 12/2008

Aktualności

7www.sdjournal.org

YouTube zaczyna sprzedawać muzykę i gryYouTube, najpopularniejszy na świecie serwis umożliwiający użytkownikom dzielenie się materiałami wideo, rozpoczyna sprzedaż gier oraz muzyki. Według właścicieli serwisu to dopiero pierwszy z szeregu planowanych ruchów, których celem ma być uczynienie z YouTube możliwie najobszerniejszej komer-cyjnej usługi internetowej. Docelowo użyt-kownicy mają otrzymać możliwość zakupie-nia gier, muzyki, filmów, seriali telewizyjnych, książek, czy biletów na koncerty. Już w tej chwili odwiedzający YouTube.com mogą stać się nabywcami utworów z oglądanych teledy-sków, a to dzięki przekierowywaniu do sklepu Amazon.com albo iTunes. W niedługim czasie podobnie będzie można kupować gry. Sklepy internetowe będą dzieliły się procentami z zysków z serwisem YouTube w przypadku, kiedy użytkownik zdecyduje się na zakup za pośrednictwem tego serwisu.http://www.gamikaze.pl/

Fuzja pomiędzy AOL i Yahoo! bliska finałowi?Coraz więcej faktów wskazuje na to, że fuzja pomiędzy AOL-em a Yahoo!, może w końcu dojść do skutku. Fuzja polegająca na przejęciu AOLa przez Yahoo!, pozwoli-łaby drugiemu z nich na znaczne zwięk-szenie zysków poprzez wykorzystanie plat-formy reklamowej portalu Jerry'ego Yanga – jednego z elementów, obok treści i usług, które obejmuje transakcja. Obecne zyski z emitowanych bannerów nie są bowiem zadowalające dla AOLa i wynoszą 2,4 mld USD rocznie. Połączenie usług poczto-wych, skutkowałoby natomiast obsługiwa-niem łącznie 48% internetowych skrzynek pocztowych na świecie, z czego 39% doty-czy rynku komunikatorowego. Fuzja mia-łaby też spory wpływ na trwającą w tym zakresie walkę pomiędzy Google, a Micro-softem. Posunięcie takie stwarzałoby rów-nież gigantowi z Redmond poważny pro-blem z urzędami kontrolującymi, w wypad-ku próby kupna połączonych firm.http://www.techcrunch.com/

Windows Strata?Trudno nie uśmiechnąć się, czytając tę nazwę, ale całkiem prawdopodobne, że wła-śnie tak – Windows Strata – będzie nazywał się nowy system Microsoftu hostowany w chmurze. Będzie to ekspansja korporacji w zakresie tzw. cloud computing, czyli wyko-rzystywaniu przez firmy (a w przyszłości zapewne także i użytkowników indywidual-nych) systemów i aplikacji zainstalowanych i utrzymywanych na zewnętrznych serwe-rach w Internecie, a nie na własnych maszy-nach. Windows Strata to nazwa, która wypły-nęła przy okazji prezentacji listy sesji na zbli-żającej się konferencji Professional Develo-pers Conference 2008. Nazwa oryginalnie pochodzi prawdopodobnie od stratosfery (warstwy atmosfery umiejscowionej ponad większością chmur) lub stratusów – nazwy jednego z rodzajów chmur.http://www.istartedsomething.com/

M – nowy język programowania od Microsoft

Microsoft ogłosił opracowanie nowe-go języka programowania – M. Ję-zyk ten jest częścią Oslo, wielowar-

stwowej, zorientowanej na usługi technologii, która ma pomagać w projektowaniu, tworzeniu, wdrażaniu i zarządzaniu złożonymi aplikacjami. Język M jest bazującym na XMLu językiem mo-delującym, który służy do integracji modeli po-między różnymi domenami. Dzięki M możliwe jest tłumaczenie języków zorientowanych dzie-dzinowo, takich jak BPNM, BPEL czy UML na formaty niższego poziomu, które mogą być zro-zumiane przez środowisko wykonawcze. We-dług niektórych źródeł M będzie zbliżony do języka D. Będzie go też można używać do mo-delowania w dziedzinach, które nie są wykony-walne, np. do opisu budynku. W skład technolo-gii Oslo wchodzi również Quadrant, narzędzie do modelowania wizualnego dla pakietu Visual Studio. Pozwoli on konfigurować widoki mode-li, specyficzne dla poszczególnych dziedzin. Mi-crosoft dostarczy widoki dla baz danych, serwi-sów webowych oraz przepływów. Dodatki firm

zewnętrznych zapewnią obsługę wertykalnych języków dziedzinowych. Modele będą przecho-wywane w repozytorium opartym o SQL Se-rver. Stamtąd będą serializowane do XAML, który będzie mógł być wykonywany na platfor-mie .NET. Wykonywanie na Windows Server będzie możliwe dzięki aktualizacji o kodowej nazwie Dublin. Microsoft zamierza przedstawić zarówno M i Quadrant jako Community Tech-nology Preview (CTP) podczas Professional De-velopers Conference.http://www.sdtimes.com/link/32957

Apple warte więcej niż Google

Rynkową wartość Google szacuje się obecnie na 156 392 862 560 dolarów (czyli 156,4 miliarda). Tymczasem Ap-

ple jest już warte więcej – bo aż 157 012 662 240 (ponad 157 miliardów) dolarów. Prezes Della, Michael Dell, zadeklarował kiedyś, że kie-dy Apple dogoni jego firmę pod względem war-tości, zwinie interes i odda pieniądze udziałow-com. Dziś Dell wart jest zaledwie 50,5 miliarda dolarów. Apple natomiast warte jest ponad trzy razy więcej, bo aż 157 miliardów dolarów. Na rynku IT korporację z Cupertino wyprzedza już tylko IBM i Microsoft. Rynkowa wartość Błękit-nego Giganta to około 170 miliardów dolarów (169 964 678 000). Na czele stawki znajduje się producent Windows, którego wartość określana jest na 255,6 miliarda dolarów (255 648 204 000). Czwartą pozycję zajmuje Google warte 156,4 miliarda dolarów, piątą Cisco (142,1 mld. USD), szóstą Intel (135,7 mld. USD). Co więcej, analitycy z firmy Gartner ogłosili, że Apple stał się szóstym co do wielkości producentem kom-puterów na świecie. Osiągnął to dzięki wzrosto-wi sprzedaży sięgającemu blisko 60% w trzecim kwartale ubiegłego i pierwszym tego roku. O ile w pierwszym kwartale b.r. Apple zajmowa-

ło czwarte miejsce wśród największych produ-centów komputerów w USA, o tyle na świato-wym rynku nie szło mu już tak dobrze. Główny prym wiedli tu HP, Dell i Acer, którzy rywalizo-wali pomiędzy sobą sprzedając niskobudżetowe netbooki. O ile skok na szóste miejsce może być korzystny dla Apple i jego akcjonariuszy, o tyle przyszłość koncernu może już nie być tak obie-cująca. Powodem tego mają być tanie notebooki oraz jeszcze tańsze netbooki oferowane przez konkurentów, a których Apple nie ma jak dotąd w swojej ofercie. Chociaż patrząc na poczynania Apple z perspektywy ostatnich kilku lat można się spodziewać, że producent Jabłuszek szykuje kolejne asy w rękawie.http://komputery.idg.pl

Page 7: SDJ_12_2008_PL_Symbian OS

Aktualności

6 12/2008

Aktualności

7www.sdjournal.org

BSA ma 12 nowych członkówBusiness Software Alliance (BSA), orga-nizacja zrzeszająca producentów opro-gramowania, chroniąca ich prawa oraz walcząca z piractwem komputerowym, ogłosiła przystąpienie do organizacji 12 nowych członków. Altium, Babylon, Cen-tennial Software, Corel, CyberLink, Fama-tech, LINKService, Materialise Softwa-re, Quark, Quest Software, Ringler-Infor-matik i Scalable Software przyłączyły się do grupy dostawców oprogramowania i sprzętu komputerowego zrzeszonych w BSA. Nowi członkowie mają włączyć się we wszelkie inicjatywy podejmowane przez BSA globalnie i lokalnie w zakre-sie promowania rozwoju innowacyjno-ści i wzrostu konkurencyjności poprzez działania edukacyjne, ochronę praw oraz udział w pracach legislacyjnych. Dodat-kowo, CNC Software, SolidWorks i The MathWorks rozszerzyły swoje członko-stwo w BSA o partycypowanie w dzia-łaniach na obszarze Europy, Bliskiego Wschodu oraz Afryki.http://www.bsa.org/

Microsoft płaci za używanie Live SearchMicrosoft próbuje wszelkich sposo-bów w walce z przygniatającą konku-rencją Google na rynku wyszukiwa-rek. W momencie, gdy ostatnie bada-nia comScore lokują Live Search dopie-ro na trzecim miejscu z wynikiem 8,3% (Google jest pierwszy i posiada udział na poziomie 63%) firma z Redmond sięga po kolejną broń i postanawia po prostu wynagradzać użytkowników wyszuki-warki za korzystanie z niej. SearchPerks to nowy program lojalnościowy urucho-miony w celu podniesienia popularności wyszukiwarki Live Search, dostępny – jak na razie – tylko dla użytkowników w Sta-nach Zjednoczonych. Po zainstalowaniu aplikacji kontrolnej za każde wyszukiwa-nie system przyznaje jeden punkt. Mak-symalnie w jednym dniu można uzyskać 25 punktów. Jest też ograniczenie liczby uczestników – tylko milion osób może zapisać się i zbierać punkty za szukanie. Promocja potrwa do kwietnia przyszłe-go roku, kiedy to punkty będzie można wymienić na nagrody – na przykład pięć piosenek (525 punktów), zestaw do tenisa (750 punktów), tysiąc mil lotni-czych (1800 punktów) czy pad do gier (5500 punktów). To nie pierwsza tego typu inicjatywa Microsoftu, jeśli chodzi o Live Search. Już wcześniej podejmowane były rozmaite próby popularyzacji wyszu-kiwarki – na przykład w ramach takich akcji jak Live Search Cashback czy Live Search Club. Rezultaty w niektórych przy-padkach były faktycznie całkiem niezłe. Statystyki są jednak nieubłagane, a przed Microsoftem wciąż sporo pracy, by poważnie myśleć o rywalizacji z potenta-tem na rynku wyszukiwania, Google, czy nawet z wiceliderem Yahoo!.http://www.cnet.com/

Microsoft Technology Summit 2008

W dniach 8-9 października 2008 roku, w Pałacu Kultury i Na-uki w Warszawie, odbyła się

największa technologiczna impreza Micro-softu w Polsce – trzecia już edycja konfe-rencji Microsoft Technology Summit 2008. Przez dwa dni specjaliści IT i programiści mieli okazję bliżej zapoznać się z techno-logiami giganta z Redmond. Tematy kon-ferencji to między innymi bezpieczeństwo, komunikacja, wirtualizacja, projektowanie aplikacji, urządzenia mobilne i zarządza-nie treścią oraz praktyczne wykorzystanie technik i narzędzi Microsoftu w tych ob-szarach. Podczas głównej sesji, otwierają-cej konferencję, wskazywano między inny-mi na główne czynniki, które będą określa-ły rozwój branży IT w najbliższej przyszło-ści. To przede wszystkim usługi typu cloud computing, wirtualizacja oraz oszczędzanie energii – tzw. green IT. W pierwszym dniu imprezy ciekawa była prezentacja Mariusza Jarzębowskiego z polskiego oddziału Micro-softu, objaśniająca ewolucję interfejsu pa-kietu biurowego Microsoft Office, który, jak się okazuje, w wersji 2003 osiągnął ta-ki poziom komplikacji, że zaczął utrudniać pracę z tą aplikacją, co zdecydowało o ko-nieczności jego zmiany w najnowszej wer-sji pakietu (Office 2007). Według prelegen-ta, interfejs wstążki (ribbon) to przykład in-nowacji wynikającej ze szczegółowych ana-liz potrzeb użytkowników. System menu ograniczał rozwój interfejsu, ponieważ osią-gnął kres swojej skalowalności. Podczas spe-cjalnej sesji demonstrowano projekty reali-zowane w laboratoriach firmy, między inny-mi aplikację Photosynth, która jest produk-tem opracowanym przez specjalistów z Live Labs, pozwalającym na sklejanie zwykłych zdjęć w celu utworzenia trójwymiarowych modeli obiektów. Omówiono również Live Mesh – nową usługę Microsoftu, pozwala-jącą na wymianę danych między kompute-rami z różnymi systemami operacyjnymi, a także innymi urządzeniami – na przykład telefonami komórkowymi. Podczas prezen-tacji Internet Explorer 8 można było do-wiedzieć się o wysiłkach zespołu projektan-tów tej przeglądarki zmierzających do do-prowadzenia do zgodności IE 8 z CSS 2.1. (firma prowadzi także prace nad doprowa-dzeniem do zgodności z CSS 3.0). Kolej-ną zmianą w IE 8 jest zwiększenie zakre-su informacji przechowywanych lokalnie,

dotyczących przeglądanych stron. Micro-soft nawiązał współpracę z grupą roboczą HTML5, między innymi w zakresie mecha-nizmów przechowywania informacji o sesji. W tematyce centrów danych nowej genera-cji, prelegent Intela przedstawił technologie wprowadzane w procesorach Intel Nehalem – VT-x, VT-d i VT-c, które mają sprzętowo wspierać hyperwisor. Podkreślił też znacze-nie sprzętowego wsparcia wirtualizacji wy-korzystywanego przez Hyper-V, jak np. wir-tualizacja kart sieciowych, zapełniająca od-wzorowanie fizycznych adresów kart siecio-wych bezpośrednio na maszyny wirtualne. W drugim dniu konferencji pokazano spo-soby rozwiązywania problemów, z którymi często mają do czynienia programiści pra-cujący z Microsoft Office SharePoint Servi-ces, oraz zaprezentowano metody przygoto-wywania stron internetowych z zachowa-niem standardów bezpieczeństwa. Prezen-towano również możliwości wykorzystania SQL 2008 w tworzeniu systemów infor-matycznych. Uczestnikom zaprezentowa-no też sposób budowania dynamicznej apli-kacji sieciowej dla środowiska Silverlight, z wykorzystaniem Visual Studio i Microsoft Expression Blend. Ciekawostką była także prezentacja Microsoftu od środka. Według podanych informacji, koncern zatrudnia 120 tysięcy pracowników i dysponuje trze-ma głównymi centrami danych, podobno odpornymi na trzęsienia ziemi o sile 8 stop-ni w skali Richtera. W centrach danych fir-my pracuje blisko 10 tysięcy serwerów pro-dukcyjnych oraz ponad 100 tysięcy serwe-rów obsługujących witryny MSN. Struktura IT Microsoftu obsługuje 140 tysięcy użyt-kowników końcowych zlokalizowanych w 89 krajach, do dyspozycji których jest 260 tysięcy komputerów. Microsoft udostępnił na witrynie MTS2008 materiały konferen-cyjne i prezentacje z sesji.http://www.networld.plhttp://www.mts2008.pl

Page 8: SDJ_12_2008_PL_Symbian OS

Aktualności

8 12/2008

Aktualności

9www.sdjournal.org

Polacy zgarniają nagrody w konkursie CUDAJakiś czas temu firma NVidia ogłosiła kon-kurs CUDA Challenge, czyli zawody dla programistów do których zgłosić można było wszelkiego rodzaju popularne opro-gramowanie w formie osobnych aplika-cji lub plug-inów, działające w systemach operacyjnych Windows, Linux lub Mac OS – oczywiście – stworzone przy wykorzy-staniu środowiska CUDA. Aplikacje oce-niane były zarówno pod kątem innowacyj-ności jak i pożyteczności. Konkurs został rozstrzygnięty, a polscy programiści spisali się znakomicie. Nagrodzono cztery osoby, w tym dwie rodem z Polski. Pierwsze miej-sce przyznano niemieckiemu programi-ście za plug-in do Gimpa, drugą pozy-cję zdobył również Niemiec za Symulację przepływu płynów, trzecie miejsce zdobył natomiast nasz rodak – Janusz Będkowski za program Robot Range Finder, czwar-ta lokata przypadła również Polakowi – otrzymał ją Jacek Naruniec za program do wykrywania i śledzenia twarzy. Robot range finder, symuluje wykrywanie ruchu obiektów i reagowanie na niego w czasie rzeczywistym. Sednem aplikacji jest algo-rytm, którego wykonanie jest akcelero-wane przez GPU, co skutkuje nieporów-nanie krótszym czasem reakcji od tego, który byłby generowany przez CPU. Druga nagrodzona aplikacja polskiego pocho-dzenia identyfikuje twarz na podstawie jej cech charakterystycznych i śledzi jej zmiany na podstawie obrazu przekazy-wanego przez zwykłą kamerkę interneto-wą. Jej niezwykłość tkwi w 2 razy krótszym czasie obróbki obrazu i reakcji na niego w porównaniu do tego generowanego przez CPU, co wynika z wykorzystania mocy GPU przez omawianą aplikację. Przyszłość tego rozwiązania to szereg zastosowań w dzie-dzinie bezpieczeństwa i biometrycznych metodach identyfikacji osób.http://nvidia.pl/

Złe czasy dla eBayW związku z problemami przez jakie prze-chodzi serwis aukcyjny eBay, podjęto decy-zję o redukcji w zakresie działalności oraz przejęciach. Wyniki finansowe za trzeci kwartał potwierdziły najbardziej negatyw-ne szacunki. Wymusiło to decyzję o cięciu kosztów. W tym celu nastąpi centraliza-cja przez likwidację lokalnych oddziałów, w tym polskiego. Same lokalne serwisy, w tym eBay.pl będą nadal działać, zarządza-nie nimi odbywać się będzie jednak z Berna i Londynu. Nadal działać będzie obsługa klienta w Polsce. W ramach oszczędności zwolnionych zostanie także około tysiąca pracowników, co stanowi 10% zatrudnio-nych. Pracę straci także kilkuset pracowni-ków tymczasowych. Jednak plan eBay'a to nie tylko redukcja kosztów ale także inwe-stycje. Za 945 milionów dolarów, zakupio-ny zostanie serwis płatności Bill Me Later. Ponadto za 390 mln kupione zostaną ser-wisy Den Bla Avis i BilBasen.http://www.eweek.com/

Nokia 5800 Xpress Music – pogromca iPhone'a?

Fiński potentat telefonii komórkowej za-prezentował zapowiadany od pewne-go czasu telefon wyposażony w doty-

kowy wyświetlacz. Oficjalna nazwa urządze-nia, w zapowiedziach określanego mianem Tube brzmi 5800 Xpress Music. Telefon pra-cuje pod kontrolą systemu operacyjnego Sym-bian S60 piątej generacji, który – jak informu-je Nokia – nieco zmodyfikowano, aby był bar-dziej przyjazny użytkownikowi. Finowie zapo-wiadają rychłe wydanie zestawu narzędzi pro-gramistycznych (SDK), umożliwiającego two-rzenie aplikacji dla nowego telefonu.Telefon można obsługiwać za pośrednictwem rysika oraz wirtualnej klawiatury QWERTY na ekranie. Zastosowany w aparacie wyświetlacz to 3,2-calowy ekran panoramiczny o rozdzielczości 640x360 pikseli, zdolny do wyświetlenia obra-zu o 24-bitowej głębi kolorów. Podobnie jak w produkcie Apple nowa Nokia wyposażona jest w automatyczny czujnik orientacji (akcelero-metr), odpowiedzialny za obrót obrazu. Urzą-dzenie posiada moduł łączności Wi-Fi w stan-dardzie 802.11 b/g oraz moduł Bluetooth 2.0, dysponuje też odbiornikiem GPS współpracu-jącym z programem Nokia Maps 2.0. W obu-dowie znaleźć zaś można złącze Micro-USB, gniazdo AV 3,5mm oraz slot na karty MicroSD i gniazdo prądu stałego typu jack oraz wyjście tv. Wbudowana pamięć telefonu to 81 MB, ale w zestawie z urządzeniem znajduje się karta Mi-croSD o pojemności 8 GB.Obsługiwane częstotliwości to WCDMA 900/2100 i GSM/EDGE 850/900/1800/1900 (w państwach Ameryki Łacińskiej telefon może działać także w sieciach WCDMA 850/1900). Urządzenie zasilane jest akumulatorem litowo-jonowym, który wedle zapewnień producenta, pozwala na 8,8 godzin rozmów w sieci GSM i 5 godzin w sieci WCDMA (deklarowany mak-symalny czas czuwania wynosi odpowiednio 406,2 oraz 400 godzin). Na wyposażeniu komórki znalazł się też cyfro-wy aparat fotograficzny z optyką firmy Carl Zeiss, umożliwiający wykonywanie zdjęć w rozdzielczości 3,2 megapiksela (format zdjęć – JPEG) oraz nagrywanie wideo w maksymal-nej jakości 640x480 pikseli przy 30 fps w for-matach MP4 lub 3GPP. Dodatkowa kamera służy do wykonywania połączeń wideo. Apa-rat umożliwia nagrywanie dźwięku w forma-tach WAV, AMR i AAC/MP4. Odtwarzanie audio odbywa się dzięki pokładowemu odtwa-rzaczowi z 8-pasmowym korektorem graficz-nym i obsługą formatów MP3, SP-MIDI, AAC,

AAC+, eAAC+ oraz WMA. Wbudowane apli-kacje zapewniają podstawowe funkcje edycji wideo i zdjęć, między innymi montaż, doda-wanie tytułów, kadrowanie i obracanie. Tele-fon posiada też wbudowany tuner radia FM i głośniki stereo. Za pośrednictwem nowej Nokii można łączyć się ze sklepem Nokia Music Sto-re, zaopatrującym użytkowników w pliki mu-zyczne. Sugerowana przez producenta cena ko-mórki to 279 euro netto, ale należy pamiętać o kosztach dodatkowych – planach taryfowych, w jakich urządzenie będzie rozpowszechnia-ne. Telefon będzie dostępny w trzech wersjach kolorystycznych obudowy, czarnej, czerwonej i niebieskiej. Warto dodać, że urządzenie obsłu-guje technologię Adobe Flash, czego wciąż brak w iPhone (zobacz artykuł – iPhone z obsługą Flash? Zdecyduje Steve Jobs). Inne jego przewa-gi nad produktem Apple, to – poza wspomnia-nym nagrywaniem wideo – także możliwość wysyłania wiadomości MMS oraz wymienny akumulator. Warto podkreślić, iż 5800 Xpress Music nie jest pierwszym telefonem z dotyko-wym wyświetlaczem w ofercie fińskiej spółki – w 2004 r. zaprezentowała ona smartfon 7710, działający pod kontrolą Symbiana S90.http://www.idg.pl

Page 9: SDJ_12_2008_PL_Symbian OS

Aktualności

8 12/2008

Aktualności

9www.sdjournal.org

Łamanie haseł WiFi kartą graficznąMożliwości współczesnych kart graficznych są już na tyle duże, że można je wykorzy-stywać w zastosowaniach wymagających dużych mocy obliczeniowych. Wśród takich zastosowań znalazło się łamanie haseł sieci bezprzewodowych. Rosyjska firma Elcom-soft, znana z produkcji licznych łamaczy haseł, wypuściła najnowszą wersję oprogra-mowania ElcomSoft Distributed Password Recovery, które pozwala wielokrotnie przy-spieszyć łamanie haseł do sieci WiFi zabez-pieczonych protokołami WPA i WPA2. Jest to możliwe dzięki procesorom graficznym kart Nvidia, które mogą wykonać setki miliardów stałoprzecinkowych operacji na sekundę. W przypadku zwykłego laptopa z GeForce 8800M lub 9800M przyspieszenie jest 10-15 krotne a przy użyciu w desktopie dwóch lub więcej kart GTX 280 nawet 100 krotne. Przy tym do złamania hasła wymagane jest prze-chwycenie zaledwie kilku pakietów. Dodat-kowo oprogramowanie umożliwia przepro-wadzenie łamania na tysiącach kompute-rów jednocześnie, co czyni sieci bezprze-wodowe łatwymi do włamania, szczególnie jeśli są używane łatwe, statyczne hasła.http://dobreprogramy.pl/

WebKit przeszedł test Acid3 w 100%WebKit jest silnikiem przeglądarki stron WWW dostępnym na licencji OpenSource, rozwiniętym głównie przez Apple w opar-ciu o znane z Konquerora KHTML oraz KJS. Jest również pierwszym takim silnikiem, który przeszedł test Acid3 z idealnym wyni-kiem 100/100. Silnik ten wbudowany jest w przeglądarki Safari oraz OmniWeb. Wersja WebKit, która zdała egzamin, na razie jest w fazie rozwojowej i będzie dostępna dla użytkowników wraz z Safari 4. Silnikiem, który ma szanse przejść test jako drugi, jest wbudowany w Operę Presto. Na dzień dzisiejszy jego oficjalny wynik to 99/100. Kolejne dobre wyniki uzyskały Gecko (Fi-refox, Flock) – 87/100, KHTML (Konqueror) – 78/100, oraz WebKit z V8 (Chrome) rozwi-nięty przez Google – 79/100. Najgorzej radzi sobie Trident, wokół którego zbudowany jest Internet Explorer, uzyskując wynik 21/100. Wyniki wszystkich wymienionych silni-ków są lepsze z każdą wersją. Acid3 to test sprawdzający szybkość oraz poprawność wyświetlania strony. Skupia się głównie na Document Object Model (DOM) oraz Java-Script, ale sprawdza również płynność ani-macji, obsługę UTF, działanie formularzy itd. Testy Acid to rygorystyczny zestaw testów opracowany przez Web Standards Project. Organizacja ta od 1998 roku stara się prze-konać producentów przeglądarek do pro-jektowania produktów zgodnie ze standar-dami. Zgodność przeglądarki ze standarda-mi przekłada się na zwiększenie dostępno-ści stron, łatwiejsze i tańsze rozwijanie stron, które nie będą musiały dostosowywać się do kilku przeglądarek, oraz przedłużenie czasu w jakim strona może być oglądana, ponie-waż za kilka lat nadal będzie poprawnie ren-derowana.http://webkit.org/

Spada zainteresowanie Google Chrome

We wrześniu br., gdy pojawiła się przeglądarka Google Chrome, wy-wołała ona duże poruszenie. Szyb-

ko zdobyła 3,1% rynku, co było całkiem do-brym wynikiem w świecie opanowanym przez Internet Explorera, Firefoksa i Operę. Chwalo-no jej szybkość działania i bezpieczeństwo. En-tuzjazm jednak nie trwał długo. Szybko wykry-to luki w bezpieczeństwie, a stosunkowo wąski zakres funkcjonalności sprawił, że nowa prze-glądarka stała się jedynie ciekawostką, a nie na-rzędziem do codziennej pracy. Obecnie udział Chrome wynosi 1,5% i zapewne nie będzie się już wiele zmieniać. W tym czasie udział Inter-net Explorera utrzymywał się na praktycznie

niezmiennym poziomie 57,2%. Przeglądarka Google ma potencjał i możliwości aby zagrozić Internet Explorerowi oraz Firefoksowi. Przed programistami Chrome jednak jeszcze sporo pracy aby ten cel został zrealizowany.http://www.newscientist.com/

OpenOffice.org 3.0 dostępny!

Dnia 13 października br. opubliko-wano długo oczekiwaną, finalną wersję pakietu biurowego OpenOf-

fice.org 3.0. Nowy OpenOffice zawiera bar-dzo dużo zmian, poprawek i nowych funk-cji. To co od razu rzuca się w oczy to nowe Start Center, odświeżone ikonki oraz kontrol-ka zoomu na pasku stanu. Edytor tekstu, Wri-ter, umożliwia wyświetlanie wielu stron pod-czas edycji oraz udoskonalone tworzenie no-tatek. Calc posiada nowy komponent, pozwa-lający wybrać optymalną wartość komórki, bazując na wartościach innych komórek. Do-dano możliwość pracy grupowej nad arkusza-mi, w tym obsługę do 1024 kolumn. Udosko-nalono opcje optymalizacji przy użyciu na-rzędzia Solver, umożliwiającego rozwiązywa-nie równań z wieloma nieznanymi zmienny-mi. Wprowadzono nowe słowniki dystrybu-owane w postaci rozszerzeń, dzięki czemu, w przypadku pojawienia się ich nowych wydań w repozytoriach, użytkownik zostaje automa-tycznie poinformowany stosownym komu-nikatem. Zaktualizowano menadżera dodat-ków, upraszczając instalację nowych. Dodano nową opcję importu makr VBA z Excela, kon-solowe narzędzie cwsattach, służące do dołą-czania plików w obszarze roboczym i usunię-to pkgchk. Nowy OpenOffice pozwala także tworzyć i edytować formularze XML, zgod-ne z modelami XForm. Udoskonalono funk-cje przycinania, rozszerzono też wsparcie dla XML i filtrów napisanych w oparciu o XSLT. Funkcja INDEX() obsługuje zwrot wektora na tablicę 2D, COUNT() ignoruje błąd wyni-ków wyrażenia i formuły komórki, INDEX()

zwraca teraz też element wektora, bez wzglę-du na swoje położenie, jeżeli tylko dwa para-metry zostały podane. Program został wypo-sażony w mechanizm automatycznego defi-niowania operatorów oznaczonych wykrzyk-nikiem do przecięcia. Zaimplementowano wsparcie dla notacji A1/R1C1 w ADDRESS i INDIRECT, a dane pochodzące ze specyficz-nej w Calcu funkcji – ERRORTYPE, służącej do określania interoperacyjności z innymi ar-kuszami kalkulacyjnymi – są przechowywa-ne w zmiennej ORG.OPENOFFICE.ERROR-TYPE. Pakiet otrzymał wsparcie dla formatu OpenDocument (ODF) 1.2, jak również .oxt oraz mdb w wydaniu dla Windows. Może on otwierać dokumenty MS Office 2007 i Of-fice 2008 for Mac OS X (.docx, .xlsx, .pptx, etc.). OpenOffice.org 3.0 jest pierwszą wer-sją działającą na Mac OS X bez X11, mając wygląd taki jak inne aplikacje Aqua. Wpro-wadzono też częściową obsługę VBA na tej platformie. Dzięki wykorzystaniu interfejsu API ułatwień dostępu jaki oferuje Mac OS X, OpenOffice.org 3.0 jest bardziej przyja-zny osobom słabo widzącym. Sporo nowości znajdziemy także w programach Draw oraz Impress. Najnowszą, angielską wersję pakie-tu OpenOffice.org 3.0 można pobrać z ser-werów producenta.http://dobreprogramy.pl

Page 10: SDJ_12_2008_PL_Symbian OS

Aktualności

10 12/2008

Aktualności

11www.sdjournal.org

Mozilla dla programistówMozilla Labs ogłosiło utworzenie nowej grupy, Developer Tools Lab, która ma się skupić na badaniach oraz tworzeniu narzę-dzi dla programistów piszących aplikacje webowe. Narzędzia te mają zwiększyć pro-duktywność, pomóc tworzyć lepsze wraże-nie dla użytkownika a przede wszystkim promować otwarte standardy. Nie wiado-mo jeszcze dokładnie czym miałoby się zaj-mować Developer Tools Lab. Mozilla ogłosi-ła jednak, że zatrudniła do swojego nowego zespołu Diona Almaera i Bena Galbraitha, współzałożycieli Ajaxian i Ajax Experience, aby przewodniczyli inicjatywie.http://labs.mozilla.com/

Wikimedia migruje na Ubuntu ServerFundacja Wikimedia ogłosiła plan migra-cji wszystkich swoich serwerów na plat-formę Ubuntu Server. Proces migracji będzie obejmował 400 serwerów, które dotychczas chodziły na konkurencyj-nych dystrybucjach – Fedora i Red Hat Linux. Obsługują one takie serwisy jak Wikipedia, Wikibooks czy Wikiquote. Ser-wisy Wikimedii obsługują ok. 10 miliar-dów zapytań miesięcznie, co jest wyzwa-niem dla administratorów, którzy opieku-ją się serwerami. Zróżnicowanie w konfi-guracjach serwerów wzięło się z szybkie-go przyrostu maszyn – w ciągu pierw-szych 18 miesięcy istnienia projektu ilość maszyn wzrosła z 15 do 200 sztuk. Wiki-media argumentuje migrację konieczno-ścią uproszczenia procesów administra-cji i aktualizacji oprogramowania, co przy poprzedniej konfiguracji, z racji jej zróż-nicowania było znacznie utrudnione. Jak dotychczas Ubuntu zdobyło popular-ność wśród użytkowników domowych. Niewątpliwie migracja, przeprowadzo-na przez Fundację, oznacza uznanie Ubuntu Server za produkt równorzędny wobec konkurencji firm Novell i Red Hat – dotychczasowych liderów na rynku sys-temów serwerowych.http://arstechnica.com/

Oracle przejmuje Advanced Visual TechnologyOracle poinformowało o zakupie firmy Advanced Visual Technology (AVT), zaj-mującej się tworzeniem oprogramowa-nia aranżacyjnego. Nie podano warunków finansowych kontraktu. Advanced Visual Technology specjalizuje się w detalicznej sprzedaży własnej aplikacji Facus, pozwa-lającej na planowanie przestrzeni sklepo-wych. Za pomocą dodatku o nazwie Retail Focus Merchandiser, na każdym etapie pro-jektowania istnieje natomiast możliwość podglądu 3D, dzięki czemu użytkownik jest w stanie na bieżąco wprowadzać poprawki do swojego projektu. Firma zamierza połą-czyć produkty spółki z konkurencyjnym dotąd pakietem ze stajni Oracle – Oracle Retail, w nadziei na wzrost zysków ze sprze-daży detalicznej. Sfinalizowanie zakupu przewidywane jest na koniec tego roku. http://news.zdnet.co.uk/

Windows na dyskach SSD wielokrotnie szybszy

Pracujący w irlandzkim oddziale Mi-crosoft Dave Northey opisał na swo-im blogu ciekawe doświadczenia ze

zwiększaniem wydajności systemu oraz uży-wanych często podczas demonstracji maszyn wirtualnych na swoich notebookach. Jak wia-domo, wąskie gardło wydajności laptopów stanowią dyski twarde – przeważnie znacz-nie wolniejsze niż w komputerach stacjo-narnych. Dopiero stosunkowo niedawno nie-którzy producenci, by zaadresować ten pro-blem, zaczęli montować w niektórych mode-lach dyski pracujące z prędkością 7200rpm. Taką właśnie maszynę Dave przyjął za wzor-cową – Windows Server 2008 skonfigurowa-ny z funkcją Desktop Experience i Hyper-V uruchamiał się na niej 1 minutę i 32 sekun-dy. Tyle czasu mijało od włączenia notebooka do pojawienia się okna logowania. Co cieka-we, skonfigurowana podobnie w oparciu o obraz VHD maszyna wirtualna potrzebowa-

ła do tej samej operacji nieco mniej czasu, 1 minutę i 7 sekund. Dave postanowił wymie-nić swój dysk – i tak znacznie szybszy niż w wielu powszechnie wykorzystywanych lap-topach – na dysk SSD. To nowa technolo-gia urządzeń wytwarzanych w oparciu o pa-mięci Flash. Ich główne zalety to brak rucho-mych części (i co za tym idzie, cicha praca, odporność na uszkodzenia i mniejszy pobór mocy) oraz fenomenalnie krótki czas dostę-pu i imponujące prędkości odczytu danych (powyżej 200 MB/s, podczas gdy obecne ni-skoobrotowe dyski montowane w laptopach nie przekraczają 50 MB/s). Okazało się, że po wymianie dysku na SSD, instalacji i konfi-guracji systemu jak w poprzednim scenariu-szu, start systemu skrócił się do 36 sekund (z 92!), natomiast start maszyny wirtualnej do 25 sekund (z 67). To mniej więcej trzy razy szybciej – wynik imponujący.http://dobreprogramy.pl

Google News teraz także w Polsce

Firma Google uruchomiła zlokalizowa-ną wersję usługi Google News. Przypo-mina ona wyszukiwarkę Google – gro-

madzi znalezione w sieci informacje, tworzy ich indeks i wyświetla użytkownikom wyniki wyszukiwania sieci pod kątem wszelkiego ro-dzaju aktualności. Tak jak w przypadku wy-szukiwarki, celem jest podawanie najtrafniej-szych wyników, dlatego też wyniki generowa-ne są całkowicie automatycznie – za pomocą robotów indeksujących. Nagłówki wyświetla-ne na stronie głównej Google News są wybie-rane przez algorytm komputerowy, oparty na wielu czynnikach, takich jak popularność po-szczególnych wiadomości i liczba witryn in-ternetowych, w których są one publikowa-ne. Przede wszystkim uwzględniana jest licz-ba oryginalnych artykułów napisanych i opu-blikowanych przez redakcje w celu określenia wagi tematu, na którą ma również wpływ je-go aktualność. W Google News pochodzące z ponad 300 polskojęzycznych źródeł mate-riały na ten sam temat są umieszczane w jed-nej grupie wiadomości. Serwis Google News w pełni przestrzega międzynarodowych praw autorskich i praw miejscowych w każdym regionie, w którym jest dostępny. Jeśli użyt-kownik chce przeczytać cały artykuł lub zo-

baczyć zdjęcie w pełnych rozmiarach, musi kliknąć link i przejść do witryny wydawcy. Krótkie fragmenty są wyświetlane wyłącz-nie w celu udostępnienia linków do tych wi-tryn. Jest to w pełni zgodne z prawami autor-skimi, które zezwalają na wykorzystywanie treści w ograniczonym zakresie bez zezwo-lenia właściciela praw. Dzięki temu zapiso-wi gazetom wolno np. podawać w recenzjach krótkie cytaty z książek chronionych prawa-mi autorskimi. Polska wersja językowa serwi-su Google News jest dostępna pod adresem news.google.pl. Na świecie funkcjonuje już po-nad 40 wersji regionalnych Google News, do-stępnych w 23 różnych językach.http://www.google.com/

Page 11: SDJ_12_2008_PL_Symbian OS

Aktualności

10 12/2008

Aktualności

11www.sdjournal.org

Google rocznik 2001W tym roku firma Google obchodziła swoje dziesiąte urodziny. Z tej okazji udostępni-ła Internautom swego rodzaju prezent – wyszukiwarkę Google rocznik 2001. Wyszu-kiwarka została udostępniona z pełną bazą wyników ze stycznia 2001 roku. Zindekso-wanych stron było wówczas 1,326,920,000. Google zaprasza wszystkich do niezwykle interesującej zabawy z archiwalną wersją swojej wyszukiwarki. Zabawa taka uzmy-słowić może jak wielki skok w rozwoju glo-balnej sieci dokonał się przez niespełna 8 lat. Dla przykładu, w 2001 roku na hasło Polska Google prezentował 693 tys. wyni-ków, dziś pod tym samym hasłem kryje się 180 mln wyników – różnica niewątpliwie robi wrażenie.http://www.lexy.com.pl/blog

Apple patentuje DockaFirma Apple otrzymała patent opisujący Dock – uniwersalny pasek narzędziowy, pozwalający na szybki dostęp do wybra-nych aplikacji, poprzez znajdujące się na nim skróty. Stało się tak niespełna dzie-sięć lat po jego oficjalnym debiucie w sys-temie Mac OS X. Korporacja złożyła wnio-sek o patent 20 grudnia 1999 roku, ale dopiero teraz Amerykańskie Biuro Paten-towe, przyznało go firmie. Kładzie on szczególny nacisk na możliwości dostoso-wywania paska według preferencji użyt-kownika. Dotyczy to między innymi moż-liwości zmiany rozmiaru ikon, po tym, jak kursor znajdzie się w okolicach jednej z nich, pojawiania się informacji opisujących je, wyświetlanych po najechaniu na nie myszką, a także dostosowywania elemen-tów znajdujących się na Docku za pomocą metody przeciągnij i upuść. Nie wiado-mo, jakie działania Apple zamierza podjąć w stosunku do osób, względem których stwierdzi naruszenie patentu. Tym samym pod znakiem zapytania pozostaje los apli-kacji, dających możliwość osiągnięcia iden-tycznych efektów pod innymi systemami operacyjnymi.http://www.theregister.com/

Siódme urodziny polskiej Wikipedii26 września br. polska edycja najpopular-niejszej encyklopedii internetowej Wiki-pedia ukończyła 7 lat. Wikipedia w Polsce założona została dokładnie 26 września 2001 roku przez Pawła Jochyma i Krzysztofa Jasiutowicza. Pierwszym materiałem opu-blikowanym na jej łamach była tzw. reguła Titiusa-Bodego. Projekt bardzo szybko się rozwijał, aż w roku 2003 w bazie zapisa-nych było ponad 15 tys. artykułów, rok póź-niej 50 tys., w 2006 – 200 tys., a obecnie jest to przeszło 500 tys. wpisów. Początko-wo Wikipedia w Polsce funkcjonowała jako samodzielny projekt, dopiero 12 stycznia 2002 została przyłączona do projektu mię-dzynarodowego i od tego czasu dostępna była pod adresem pl.wikipedia.com, a od 22 listopada 2002 funkcjonuje pod aktualnym adresem: http://pl.wikipedia.org.http://pl.wikipedia.org/

Co nowego w Visual Studio 10?

Microsoft udostępnił garść informa-cji na temat dziesiątej wersji popu-larnego pakietu programistyczne-

go Visual Studio. Korporacja chce, aby dziesiąt-ka stała się nową szóstką, czyli odniosła podobny sukces jak wersja 6.0 w roku 1998. Nowe Visual Studio ma być bardziej kompaktowe, oszczędne i skalowalne. Microsoft obiecuje, że będzie dzia-łać szybciej niż Visual Studio 2008, niestety nie będzie się uruchamiać tak szybko jak Notatnik. Osiągnięte będzie to między innymi dzięki lep-szemu wykorzystaniu procesorów wielordzenio-wych. Jak już pisaliśmy, dodane zostaną ułatwie-nia dla osób lubiących pracować na kilku moni-torach. Pojawi się nowy, rozszerzalny edytor ko-

du źródłowego oparty o Windows Presentation Foundation (WPF). Dodana zostanie obsłu-ga Microsoft Extensibility Framework (MEF), który jest odpowiednikiem Component Object Model (COM) dla kodu zarządzanego. Pojawią się też funkcje Visual Studio Tools for Applica-tions (VSTA) obsługujące makra i rozszerzenia. Wprowadzone zostaną poprawki w MSBuild zwiększające wydajność i skalowalność dla Visu-al C++. System pomocy będzie korzystać z Live Search, a użytkownicy będą mogli dodawać oce-ny. Pełniejszą listę planowanych zmian można znaleźć w keynote Paramesha Vaidyanathana i Rico Marianiego z konferencji VSX.http://www.eweek.com/

SQL Server Kilimanjaro w 2010 roku

Zespół pracujący nad SQL Serverem najwidoczniej nie podziela polityki innych zespołów i chętnie dzieli się

informacjami co do przyszłej wersji oprogra-mowania bazodanowego. Stąd właśnie wia-domo, że kolejna wersja SQL Server ozna-czona będzie kodową nazwą Kilimanjaro i zadebiutuje w pierwszej połowie 2010 roku. Pierwsza publiczna wersja beta ma się poja-wić rok wcześniej. Jest to wiadomość intere-sująca nie tylko dla administratorów – war-to pamiętać, że Microsoft jeszcze od wersji 2005 udostępnia bezpłatną edycję Express, także do zastosowań komercyjnych. W zupeł-ności wystarcza ona do celów edukacyjnych, przyda się również małym firmom. Kiliman-

jaro ma zawierać narzędzia do przeprowa-dzania samodzielnych analiz przez użytkow-ników (nazwa kodowa projektu toGemini), które będą umożliwiały tworzenie aplikacji Business Intelligence bezpośrednio przy uży-ciu dobrze znanego pakietu Office. Gemi-ni nie będzie osobnym modułem analitycz-nym, ale następcą SQL Server Analysis Se-rvices, dodatkowo rozszerzającym jego funk-cjonalność. Jeszcze jedna ciekawa informa-cja na temat SQL Server – Microsoft zapew-nił, że zamierza wydawać kolejne wersje SQL Server co 24-36 miesięcy. Obiecano również dokładne i wczesne informowanie użytkow-ników o planowanych nowościach.http://www.techit.pl/

Windows XP z nowymi komputerami pół roku dłużej

Firmy OEM sprzedające preinstalowa-ne systemy Windows z nowymi kom-puterami otrzymały dodatkowe sześć

miesięcy, podczas których mogą dodawać do zestawów komputerowych z Windows Vista Business lub Ultimate dodatkowy nośnik od-zyskiwania zawierający system Windows XP Professional. Dzięki temu użytkownik korzy-stając z prawa do downgrade'u może sam usu-nąć Vistę i zainstalować Windows XP – tyle, że nie musi już szukać nośnika, otrzymuje bo-wiem system w wersji przygotowanej przez

producenta, czyli dopasowany do zakupione-go komputera. Początkowo termin zakończe-nia dystrybucji podwójnych nośników przy-padał na 31 stycznia 2009 – po przedłużeniu Windows XP można dodawać do zestawów do 31 lipca 2009. Mówi się jednak, że trwają pra-ce nad kolejnym przesunięciem tego terminu. Chodzi o to, by dla użytkowników OEM nie-chętnie patrzących w stronę Visty wypraco-wać strategię migracji z Windows XP bezpo-średnio do Windows 7. http://www.theregister.com/

Page 12: SDJ_12_2008_PL_Symbian OS

12/200812

Tam byliśmyKu Londynowi i Euro

www.sdjournal.org 13

Po raz pierwszy przedstawiamy relację z tego wydarzenia na łamach miesięczni-ka Software Developer’s Journal. Ten

rok, był rokiem, który na IBC 2008 stał pod znakiem IPTV, telewizji mobilnej oraz Olim-piady.

Świat nadawców telewizyjnych oraz progra-mistów, to dwa różne światy, które z każdym rokiem coraz bardziej zbliżają się ku sobie. Warto więc przyjrzeć się bliżej telewizji cyfro-wej oraz możliwościom jakie udostępnia pro-gramistom na tym nowym rynku.

Tegoroczne targi okazały się być rekordo-we pod względem liczby odwiedzających, zarejestrowanych uczestników, jak i wystaw-ców. Targi IBC mają swoje korzenie w konfe-rencji nadawców naziemnych i stały się wio-dącym wydarzeniem profesjonalistów zaan-gażowanych w tworzenie, zarządzanie i do-starczanie rozrywki czy informacji na ca-łym świecie.

Wystawa ta przyciągnęła ponad 1400 wy-stawców oraz prawie 50 000 odwiedzających z ponad 130 krajów.

John Holton, przewodniczący wystawy stwierdził – Wszelkie badania pokazują, iż rynek nadawców i mediów elektronicznych po prostu kwitnie, dzieje się to także dzięki wysta-wie IBC. Nasi wystawcy są absolutnie zachwy-ceni, nie tylko liczbą odwiedzających, ale tak-że z tego powodu, iż rozmawiają o poważnym biznesie.

Sport i OlimpiadaSiłą napędową rozwoju telewizji cyfrowej są przede wszystkim wydarzenia sportowe. Wy-

nika to z prostego faktu, iż większość z tych, którzy nie mogą obejrzeć zmagań sportowców na żywo, chce doświadczyć jak najbardziej tre-ściwej relacji telewizyjnej, w jak najlepszej ja-kości. Dlatego z półek sklepów w okresie przed Olimpiadą znikał przede wszystkim sprzęt High Definition.

Tę zasadę było wyraźnie widać podczas te-gorocznej konferencji, na której podkreślano osiągnięcia techniczne i innowacje wprowa-dzone w branży telewizyjnej przy okazji od-bywającej się kilka tygodni wcześniej Olim-piady.

Teraz, gdy igrzyska już się skończyły, mi-liony konsumentów, jak i nadawców, zaczy-nają odkrywać inne możliwości płynące z sprzętu i oprogramowania dostarczonego na fali igrzysk telewidzom niemal na całym świecie.

Wydaje się więc niemal pewnym, iż kolejna Olimpiada, tym razem w Londynie, będzie kolejnym silnym impulsem rozwoju możli-wości współczesnej telewizji oraz kolejnym globalnym wyzwaniem dla nadawców.

Myśląc o Polskim EuroPolska i Ukraina stojąc przed organizacją Eu-ro 2012, powinny zdawać sobie sprawę, także z tego aspektu, który może tchnąć nowe życie, w obecne w każdym domu, telewizyjne szkieł-ko. Polska może także w tym wymiarze stać się prawdziwym pionierem i z całą pewnością stanowić będzie swoisty telewizyjny poligon i sprawdzian, tuż przed Olimpiadą.

Cieszy więc tym bardziej obecność polskich firm na IBC 2008. Jedna z nich, Multimedia

Polska, otrzymała nawet wyróżnienie podczas gali honorowej za uruchomienie pierwszej w Polsce komercyjnej instalacji kablowej IPTV (telewizji internetowej).

Do konkursu zgłoszonych zostało 100 projek-tów, spośród których do walki o nagrody w trzech kategoriach nominowano zaledwie 9 – w tym usługę VOD Multimedia Polska! Już ten fakt był ogromnym wyróżnieniem dla firmy, satysfakcja i ukoronowaniem całej pracy przy projekcie VOD – mówi Bartłomiej Kasiński, Dyrektor Pionu Strategii i Rozwoju.

Dla programistów Java instalacja ta dzię-ki zastosowaniu przystawek z technologią MHP otwiera drogę do 50 000 polskich te-lewizorów. Inne wdrożenia tej technologi w Polsce przeprowadziły dotychczas ogólno-polska telewizja kablowa Vectra, poznańska INEA oraz Telewizja N.

Innym wystawcą z Polski był ATM S.A. pre-zentująca rozwiązania ATM BankingTV oraz ATM InternetTV, a także przedstawiła swoja regionalną sieć dystrybucji kontentu multime-dialnego, opartą na infrastrukturze sieci AT-MAN. Sieć ta oferuje użytkownikom ponad-przeciętną funkcjonalność i integrację wielu dotychczas rozproszonych funkcjonalności w jednej spójnej i skalowalnej platformie.

ATM zamierza dalej rozwijać platformę multimedialną, czemu pomogły nowe kontak-ty i kontrakty zawarte podczas IBC. Także Ślą-ska Grupa Telekomunikacyjna, operator kablo-wy, zakupił podczas targów sprzęt do retrans-misji telewizji w standardzie HD.

Na targach wystawiało się także Poznańskie Centrum Superkomputerowo-Sieciowe PSCN

Ku Londynowi i Euro

W dniach 11-17 września w amsterdamskim centrum kongresowym RAI po raz 41 odbyła się Międzynarodowa Konferencja Nadawców – IBC 2008. Wystawa, targi i konferencja, które stworzone zostały z myślą o nadawcach radiowo-telewizyjnych oraz firmach świadczących dla nich usługi lub dostarczających im narzędzia.

Relacja z Międzynarodowej Konferencji Nadawców – IBC 2008

Page 13: SDJ_12_2008_PL_Symbian OS

12/200812

Tam byliśmyKu Londynowi i Euro

www.sdjournal.org 13

wspólnie z innymi uczelniami współtworzące Europejską Inicjatywę Mediów Sieciowych, czyli wspierany przez UE projekt dostosowa-nia infrastruktury sieciowej i archiwizacyjnej do przesyłu obrazu w wysokiej rozdzielczości na terenie Krajów Członkowskich.

Multimedia Home PlatformW instalacji operatora Multimedia Polska wykorzystano między innymi dekodery fir-my ADB, która swoje centrum rozwoju ulo-kowała w Zielonej Górze i od lat sprzeda-je nowoczesny sprzęt umożliwiający odbiór cyfrowej telewizji internetowej i to w wersji DVB/MHP.

Firma ta miała swoje stoisko na targach IBC, gdzie pokazywała projektowany w Polsce sprzęt i oprogramowanie (middleware), które dostar-czane jest na całym świecie. Powoli, także w na-szym kraju.

Temat telewizji cyfrowej i płynącej z niej możliwości, dla twórców oprogramowania oraz dostawców usług IT, jest z pewnością te-matem nowym, lecz szczególnie interesują-cym dla programistów platformy Java. Dzie-je się to dzięki jednemu ze standardów DVB – (MHP) Multimedia Home Platform. Nie oznacza to jednak, iż nie istnieją inne plat-formy, a firma Microsoft zasypuje gruszki w popiele.

Od wielu lat toczy się w Polsce i na świe-cie specyficzna wojna pomiędzy standarda-mi, która szczególnie widoczna jest na ryn-kach Stanów Zjednoczonych, gdzie dominują rozwiązania Microsoft oraz na rynkach Euro-pejskich, gdzie zwycięzcą pozostaje standard DVB/MHP. Zarówno w Europie jak i w czę-ści Azji jest to de facto ustanowiony standard, który z każdym rokiem zdobywa coraz więk-szą liczbę odbiorców.

Jest to bez znaczenia, którym kanałem docie-ra do nas telewizja. Czy jest to nadawanie na-ziemne (DVB-T/T2), satelitarne (DVB-S/S2), kablowe (DVB-C), mobilne-naziemne (DVB-H), mobilne-satelitarne (DVB-SH) lub interne-towe (IPTV), coraz częściej jest to telewizja in-teraktywna w standardzie DVB/MHP, oferują-ca pełnię możliwości dla programistów Java.

Wojny standardówMimo tych batalii, czy to pomiędzy światem Javy, a Microsoftem, czy też innymi produ-

centami tak zwanego middlewaru (będące-go odpowiednikiem systemu operacyjnego w komputerach osobistych) oferującymi prost-sze, lecz nie standardowe i często bardzo za-mknięte rozwiązania. Wszystko wskazuje na to, iż ostatecznym zwycięzcą zostanie stan-dard DVB/MHP, mający nie tylko poparcie ta-kich ciał jak Komisja Europejska, ale przede wszystkim rosnącej liczby nadawców rozu-miejących, iż po wygraniu przez Blue-Raya schedy po DVD, to właśnie Java stanie się do-minującym standardem w świecie wideo.

W takiej branży jak telewizja, jednolity, lecz otwarty standard jest czymś wielce po-żądanym. Wszyscy pamiętamy ile problemów wynikło z prostego konfliktu między standar-dami kodowania obrazu PAL i SECAM. Tym razem poziom skomplikowania materii jest wprost olbrzymi.

Jest kwestią czasu, choć może kilkulet-nią, ujednolicenie standardów w tym obsza-rze. Nie można zapomnieć o znaczeniu zwy-cięstwa Blue-Raya w walce o schedę po DVD. Standard ten zawiera technologię Blue-Ray BD-J, będącą pomostem pomiędzy odtwarza-czami wideo, a DVB/MHP.

Dzięki temu Java ma zapewnioną świe-tlaną przyszłość w tym sektorze, który już wkrótce, tak jak kiedyś telefon, internet i komórki, zrewolucjonizuje życie zarówno zwykłych zjadaczy chleba, jak i rekinów biz-nesu.

O tym, że to właśnie standard DVB/MHP będzie ostatecznym zwycięzcą toczącej się od lat batalii jest przekonany Paul Bristow z Osmosys, jednego z głównych twórców MHP. W zeszłym roku mieliśmy mnóstwo ludzi od HTML w sektorze IPTV, lecz teraz odchodzą

Rysunek 2. IBC 2008

Rysunek 1. Olimpiada 2008 Rysunek 3. Obrady i wystąpienia na IBC 2008

Page 14: SDJ_12_2008_PL_Symbian OS

12/200814

Tam byliśmyKu Londynowi i Euro

www.sdjournal.org 15

oni na boczne tory. U nich nic się nie zmieniło, nie zrobili nic nowego. Teraz obserwujemy ludzi od MPEG, mówiących, iż jest to przyszłością dla IPTV. Ale oni zaledwie odkrywają jak dodać głę-bię koloru do MPEG. Oni utknęli w zawiłej pętli czasu – mówi Bristow.

MHP jest tak dobre, ponieważ jest oparte na Javie, więc jest standardem ogólnego przezna-czenia. Po wygraniu bitwy przez Blue-raya, każ-dy dysk tłoczony jest z interaktywną treścią na-pisaną w Javie. Na zachodzie, współczesna bran-ża wideo używa Javy, a nie uczy się jej. Java pozo-stanie w przestrzeni telewizyjnej, a tamci ludzie, tylko wprowadzają zamieszanie – kończy swo-ją wypowiedź.

Przełączając telewizjęO ile kolejnym istotnym impulsem dla roz-woju branży, będzie Olimpiada i nasze Eu-ro, to jednak punkt przełomowy dla rozwo-

ju nowoczesnej telewizji w naszym kraju bę-dzie zapewne wcześniej. Taką graniczną da-tą jest na całym świecie moment całkowite-go wyłączenia analogowego nadawania na-ziemnego i przejście na naziemne nadawa-nie cyfrowe.

Jest to operacja wymagająca zaangażowa-nia olbrzymich sił oraz stworzenia długolet-niej kampanii wzrostu wiedzy o telewizji cyfro-wej wśród konsumentów i odpowiednich dzia-łań. Takie kampanie już trwają na całym świe-cie, kilka przykładów poznać można było pod-czas IBC 2008.

W Stanach Zjednoczonych taką graniczną datą ma być początek przyszłego roku – co jest bardzo optymistyczne. Rząd, aby zapew-nić wszystkim, także tym najuboższym, do-stęp do telewizji po wyłączeniu analogowego nadawania – rozdaje 50$ kupony na konwer-tery sygnału cyfrowego na wyświetlanie ana-

logowe. Jednakże kuponów tych nie można użyć jako zniżek na lepszy sprzęt, a z powo-du braku prostego sprzętu większość z tych kuponów straciło ważność.

We Włoszech zastosowano znacznie lep-szy model subwencji i dzięki temu do wło-skich domów trafiły przystawki z technolo-gią MHP. Wytworzyło to nowy, gwałtownie rosnący sektor usług programistycznych w branży telewizyjnej – de facto – nową gałąź e-gospodarki.

Warto, by nasi decydenci poważnie zasta-nowili się, czy podobnie nie zainwestować części pieniędzy z abonamentu i na gwiazd-kę 2010 wesprzeć telewidzów i w ten spo-sób dofinansować rozwój tej technologii w naszym kraju.

Przy wyłączeniu telewizji analogowej, szczególnie będzie trzeba zadbać o ludzi starszych, latami opłacających abonament, dla których szklany ekran jest często jedy-ną rozrywką.

Jeśli zdecydujemy się na inne strategie, po-wstanie bałagan wśród nadawców, podwójny zakup sprzętu przez odbiorców. A standary-zacja jest nieunikniona. Działając strategicz-nie, można więc uniknąć niepotrzebnych kło-potów w przyszłości i przyśpieszyć rozwój tej dziedziny gospodarki.

Telewizję analogową trzeba będzie wyłą-czyć. Im wcześniej i mądrzej to zrobimy, tym lepiej dla wszystkich. Euro 2012 to świetna do tego okazja. Polska w tej dziedzinie jest nie tylko daleko za krajami zachodu, niektó-rymi krajami Azji, ale także Rosją i światem arabskim.

Rysunek 5. Wystawcy na IBC 2008

Rysunek 6. Krok na przód w rozwoju nowoczesnej telewizji

Rysunek 7. Emiraty Arabskie swoistą doliną multimedialną

Rysunek 4. Wystawcy na IBC 2008

Page 15: SDJ_12_2008_PL_Symbian OS

12/200814

Tam byliśmyKu Londynowi i Euro

www.sdjournal.org 15

Dla przykładu, przedsawiony podczas konferencji IBC stan rozwoju telewizji cy-frowej oraz MHP w świecie arabskim, mógł-by zaskoczyć czytelnika. Dzięki stworzeniu między innymi w Zjedoczonych Emiratach Arabskich swoistej doliny multimedialnej – strefy zwolnionej od podatków, Dubai był w stanie przyciągnąć z powrotem islamskich specjalistów, którzy zdobywali swoje szlify na zachodzie.

Wraz z kwitnącą ekonomią, w przeciwień-stwie do zachodu (co było słychać także pod-czas targów, gdy producenci telewizyjni plot-kowali o nadchodzących cięciach budżeto-wych), pozwoliło to na szybki rozwój telewi-zji cyfrowej w tym regionie świata. Tak przy-najmniej dzieje się w krajach nie dotkniętych przez amerykański proces stabilizacyjny, ta-kich jak Arabia Saudyjska, Bahrain, Katar czy Emiraty.

Obserwować tam możemy prawdziwą eks-plozję telewizji interaktywnej. Dla przykładu, uchodząca w Polsce za zacofaną, Arabia Sau-dyjska od pewnego czasu oferuje naziemną te-lewizję cyfrową DTT (5 kanałów) oraz kanał interkatywny w technologii MHP. W przyszło-ści planuje się uruchomienie satelitarnych ka-nałów, standardu High Definition oraz wpro-wadzenie między innymi rozwiązań e-gover-ment i innych. Także sąsiedni Iran przygoto-wuje się do wystrzelenia swojego pierwszego satelity telekomunikacyjnego 1 Hope.

W Europie DTT powoli staje się powszech-ne, a w każdym kraju toczą się poważne przy-gotowania do wyłączenia naziemnego nada-wania cyfrowego. Podczas IBC 2008 brytyjska stacja BCC prezentowała jeszcze pojemniejszy i wydajniejszy standard DTT-2.

Nie zasypujmy gruszek w popiele. Euro 2012 i zachodni nadawcy wymuszą na nas najwyższe standardy. Choć tym razem, bądz-my do tego gotowi i na tym polu!

Z OSTATNIEJ CHWILI16 Października 2008 w serii głosowań Parlament Europejski zdecydował się utworzyć specjalne ciało łączące narodowych regulatorów, tak by firmy telekomunikacyjne w spójny sposób operowały wewnątrz Unii Europejskiej. Pryncypialna intencją tego działania jest wsparcie, tych którzy chcą wykorzystać uwolnioną, przez przejście z telewizji analogowej na cyfrową, przestrzeń dla nowych usług i że usługi te będą przenaszalne wewnątrz Unii Europejskiej.

Parlament Europejski wsparł Hiszpańskiego Euro-deputowanego Pilara del Castillo i tym samym utworzył Ciało Europejskich Regulatorów Telekomu-nikacyjnych (BERT).

Rysunek 8. Dyplom zdobyty przez Multimedia Polska

Rysunek 10. Wyróżnienie dla Multimedia Polska za uruchomienie pierwszej w Polsce komercyjnej usługi VOD w sieciach CATV i IPTV

Rysunek 9. A. Rogowski

Page 16: SDJ_12_2008_PL_Symbian OS

12/200816 www.sdjournal.org 17

Opis CD

ModelMaker Code Explorer 6ModelMaker Code Explorer 6 – narzędzie do zastępowania standar-dowego CodeExplorer w IDE Delphi. Podobnie jak CodeExplorer, program ten pozwala przeglądać i edytować klasy, użytkowników, wła-ściwości, metody, funkcje, ale jego funkcjonalność jest o wiele szersza. Jako edytor refaktoringu, ModelMaker Code Explorer sprawia, że kod można zmieniać szybko i łatwo – można tworzyć i modyfikować klasy i użytkowników przez wybranie opcji w odpowiednich dialogach. Ist-niejące klasy i użytkowników równie łatwo edytować, korygować i usu-wać, jak tworzyć. Obsługa parametryzowanych szablonów kodu, wy-znaczanych przez użytkownika. Możliwe jest kopiowanie elementów z jednej klasy do drugiej. Dodatkowo, odwzorowywane są lokalne pro-cedury, widoczne dla wszystkich elementów klasy. Możliwość różnego rodzaju sortowania i filtrowania odwzorowywanych elementów. Wie-le funkcji programu, jak na przykład edytory metod, pól i właściwości, zaczerpniętych jest z ModelMaker. Ogólne funkcje:

• Przeglądarka i Refaktoryzacje są w pełni zgodne z Projektantem Formularzy;

• IntelliReplace (opcjonalnie) propaguje identyfikatory o zmienio-nej nazwie w module, klasie, itp. Opcjonalnie zamienia komenta-rze, ciągi itd.;

• Komentarze i Atrybuty są kopiowane/przenoszone/przegrupowywane z jednostkami kodu;

• Akcesory własności i pól stanu są tworzone, zachowywane i usu-wane gdzie jest to niezbędne;

• Refaktoryzacje współpracują bezpośrednio z buforami edycji IDE, zmiany mogą być cofnięte za pomocą standardowych ko-mend Cofnij/Powtórz;

• Nowi członkowie są (opcjonalnie) wstawiani zgodnie ze schema-tem sortowania określonym przez użytkownika. Dodatkowo, Metody mogą być wstawiane przed lub po aktualnej metodzie;

• Refaktoryzacje edytora IDE dostępne przez menu MMX lub skróty klawiaturowe stosują refaktoryzację do jednostki w pozy-cji kursora;

• dobrze dobrany zestaw opcji pozwoli dostosować przeglądarkę ModelMaker Code Explorer do własnych potrzeb.

ModelMakerModelMaker – narzędzie przeznaczone do modelowania własne-go Delphi UML i refactoringu. Istnieją dwie wersje – dla Pascal i dla C#. Obie wersje wchodzą w skład ModelMaker. Klienci którzy ku-pują narzędzie ModelMaker wykorzystują je do tworzenia aplikacji technicznych, baz danych, a wszystko w czasie rzeczywistym.

Edycja PascalaEdycja Pascala jest zaprojektowana specjalnie do generowania kodu Delhi native. Język obiektu Delhi Pascal jest w pełni obsługiwany, włą-czając większość składni Delphi for .NET (v1 oraz v2). Edycja Pascala ModelMaker posiada pełne możliwości inżynierii wstecznej i importo-wania istniejącego kodu Delhi. Eksperci od integracji Delphi IDE dbają o synchronizację ModelMaker oraz edytorów Delphi IDE.

Edycja C#Edycja C# jest zaprojektowana specjalnie do generowania kodu C# native. Składnia ramowa C# 1.1, 2.0 oraz 3.0 for the .NET jest w pełni obsługiwana. Edycja ModelMaker C# posiada pełną możli-wość inżynierii wstecznej i importowania istniejącego kodu C#. Eksperci od integracji Delphi IDE i Visual Studio dbają o synchro-nizację ModelMaker oraz edytorów Delphi IDE lub Visual Studio IDE. Zarówno integracja Borland jak i Visual Studio IDE są częścią licencji ModelMaker.

Klienci używają ModelMaker dla całego zakresu rozbudowy opro-gramowania – aplikacje w czasie rzeczywistym, aplikacje typu tech-nicznego i bazy danych.

Total Network InventoryProgram Total Network Inventory jest przeznaczony do ewidencji komputerów w sieci. Nie wymaga instalacji klienta. Przy pomocy To-tal Network Inventory poznacie wszystkie informacje o stanie – pro-cesorów, pamięci, zainstalowanych HDD, programach, karcie video, uruchomionych procesach i serwisach wszystkich komputerów w sie-ci. Także będzie zebrana informacja o urządzeniach sieciowych, usta-wieniach aktualizacji i antywirusach, zasobach całego dostępu i wielu innych rzeczy. Przy pomocy generatora raportów, będziecie mogli spo-rządzić oddzielne raporty dla poszczególnych komputerów, grup i ro-dzajów urządzeń. Wygodna Opcja skanowania umożliwia skanowanie komputerów znajdujących się w domenie lub roboczej grupie, a tak-że ustawianie zasięgu IP adresów dla skanowania. Program posiada al-ternatywny sposób skanowania, umożliwia to login script, po zainsta-lowaniu którego, aktualizacja bazy danych będzie dokonywana przy każdym uruchomieniu komputera. Oprócz tego program Total Ne-twork Inventory wygeneruje dla każdego komputera oddzielny numer i wprowadzi go do karty, która zawiera wszelkie informacje o danym komputerze i jego użytkowniku. Dodatkowym atutem programu są wygodne ustawienia interfejsu i opcji skanowania.

Cała sieć pod kontroląZautomatyzowane sporządzanie listy komputerów w sieci bez konieczności odchodzenia od stanowiska roboczego! Total Ne-twork Inventory skanuje wszystkie zdalne komputery i zachowu-je wszystkie zebrane informacje w centralnej bazie danych. Każdy komputer posiada swój paszport. Zawiera on następujące informa-cje – Nazwa komputera, Zarejestrowany użytkownik, Organizacja, Grupa robocza/domena, Adres IP, Data instalacji, Czas ostatniego skanowania, Nazwa użytkownika. W uzupełnieniu do zebranych informacji, można dodać dodatkową informację o każdym kom-puterze i jego użytkowniku. Można również dodawać informacje o użytkowniku komputera i wskazać rzeczywiste dane personalne, dział, stanowisko, telefon, e-mail itd.

Page 17: SDJ_12_2008_PL_Symbian OS

12/200816 www.sdjournal.org 17

Opis CD

Wygodny interfejs użytkownikaInterfejs Total Network Inventory został opracowany tak, aby mógł być dostosowany do danego użytkownika. Zapewnia szybką i ła-twą nawigację. Rozpoczyna się w oknie powitania, które pozwala jednym naciśnięciem aktywować podstawowe funkcje programu. Główne okno programu składa się z trzech osobnych części. W le-wej części znajduje się spis wszystkich przeskanowanych kompute-rów w sieci w widoku drzewa. Po wybraniu komputera ze spisu zo-baczymy informacje o tym komputerze. Nawigację po uzyskanych informacjach o komputerze uzyskuje się za pomocą opcji Katego-rie. Główne okno nie zawiera żadnych niepotrzebnych funkcji, dla-tego łatwo się w nim pracuje.

Kreator skanowaniaPo wybraniu Uruchom kreator skanowania w oknie powitalnym lub w panelu narzędzi, szybko przejdziemy przez 5 kroków konfigura-cji skanowania. Total Network Inventory wspiera 2 rodzaje skanowa-nia – proste skanowanie on-line i skanowanie przez skrypt logowania. Drugi rodzaj daje możliwość dodania uruchamiania danego modułu, skanowania do domenowego skryptu logowania użytkowników, w ten sposób pozwala zebrać informacje o każdym komputerze, który pod-łączany jest do domeny, przy użyciu specjalnego skryptu logowania. Kreator umożliwia również wybranie sposobu wykrywania kompu-terów – przeglądanie miejsc sieciowych lub wskazywanie zakresu ad-resów IP do skanowania. Proces skanowania jest dosyć szybki i zajmu-je kilka minut.

Kreator raportów Total Network Inventory Umożliwia tworzenie raportów za pomocą kilku kliknięć! Tworzy głównie raporty dla poszczególnych komputerów i skrócone rapor-ty dla wszystkich wybranych komputerów. Kreator raportów po-zwala tworzyć raporty dla wszystkich interesujących Państwa ka-tegorii. Co więcej, w Trybie multikategorii można tworzyć skrócone raporty z dowolną kombinacją kategorii dla dowolnej ilości kom-puterów. Niekiedy raporty zajmują wiele stron, dlatego trudno jest znaleźć niektóre specyficzne dane. Aby to rozwiązać, Kreator ra-portów posiada funkcję wyszukiwania. Raporty można wydruko-wać lub przeglądać w widoku elektronicznym. Kreator raportów obsługuje następujące formaty eksportu – TXT, RTF, CSV, lub HTML dla dalszej analizy. Dzięki raportom utworzonym w To-tal Network Inventory, otrzymamy błyskawiczny przegląd wszyst-kich komputerów w sieci i ich zawartości właśnie w chwili, kiedy tego potrzebujemy.

Aplikacja Ramzes – zintegrowany sys-tem dla MSPAplikacja Ramzes to najwyższej jakości zintegrowany system wspoma-gający zarządzanie dla MSP. Funkcjonujący na platformie Windows wyróżnia się przyjaznym interfejsem przy zachowaniu bogatej funk-cjonalności posiada przyjazny interfejs, intuicyjną obsługę. Składa się ze ściśle współpracujących ze sobą modułów odpowiadających za pra-cę wszystkich działów firmy. Ścisła łączność pomiędzy modułami czy-

ni pracę łatwą i efektywną. Powstały z myślą o klientach system pozwa-la dostosować program do potrzeb nawet najbardziej wymagającego użytkownika, nawet w takim detalu jak kolorystyka.

Ramzes Faktura – moduł przeznaczony do obsługi sprzedaży we wszystkich rodzajach przedsiębiorstw. W intuicyjny sposób pozwala wystawiać dokumenty sprzedażowe, rozliczać przyjęcie i wydanie gotówki oraz pilnować zobowiązań. Współpracuje z urzą-dzeniami fiskalnymi. Jako program sieciowy pozwala na obsługę sprzedaży z wielu stanowisk. Wchodząc w skład Aplikacji Ramzes, gwarantuje bezpośredni eksport danych do systemów finansowo-księgowych. Podstawowe funkcje programu:

• pełna obsługa sprzedaży – tworzenie i wydruk dokumentów handlowych; obsługa maski numeru wszystkich typów numeru dokumentów (indywidualny wzór numeru); możliwość wyboru numeracji miesięcznej lub rocznej (przy rozpoczęciu pracy z pro-gramem lub na przełomie roku kalendarzowego); tworzenie sys-temu cenników, rabatów i upustów przypisanych grupie kontra-hentów lub towarów; obsługa drukarek fiskalnych; druk parago-nów fiskalnych oraz raportów fiskalnych;

• pełna obsługa kasy – tworzenie dokumentów KP, KW, raportów kasowych; automatyczny wydruk dokumentów kasowych do faktur gotówkowych;

• całkowita kontrola należności – rozliczenie dokumentów w oparciu o kasę i bank; generowanie wezwań do zapłaty wraz z od-setkami; przeglądanie i wydruk list nierozliczonych faktur;• rejestracja przelewów obcych oraz ewidencjonowanie wpłat i

wypłat bankowych; • możliwość tworzenia szeregu raportów i zestawień;• możliwość poszerzenia uprawnień o funkcję Zamówień,

umożliwiającą ewidencję zamówień złotówkowych i waluto-wych od odbiorców;

• brak ograniczeń w zakresie ilości wprowadzanych kontra-hentów, towarów oraz wystawianych dokumentów.

Pozostałe programy wchodzące w skład Aplikacji Ramzes to: Ramzes – Magazyn, Ramzes – Produkcja, Ramzes – Księgi Handlowe, Ram-zes – PKPiR, Ramzes – Ryczałt, Ramzes – Amortyzacja, Ramzes – Płace, Ramzes – SuperAdmin.Minimalne wymagania sprzętowe:

• Komputer z Procesorem Pentium 133 MHz • Pamięć operacyjna – 64 MB RAM • Napęd CD-ROM • System Operacyjny – Microsoft Windows 98 SE, 2000, ME, XP,

Vista • Karta graficzna – VGA 800x600 • Drukarka – pracująca w systemie Microsoft Windows

Aplikacja Ramzes jest tworzona przez Ramzes Sp. z o. o. – jednego z wiodących producentów systemów dla MSP. Długoletnie doświad-czenie firmy pozwoliło skrupulatnie zdefiniować wymagania Klien-ta i przełożyć je na funkcjonalność programów. Dzięki temu produk-ty firmy Ramzes cieszą się dużym uznaniem wśród stałych Klientów z całego kraju, regularnie zaopatrujących się w najnowsze wersje opro-gramowania.

Page 18: SDJ_12_2008_PL_Symbian OS

12/200818

Biblioteka miesiącaDjango

www.sdjournal.org 19

Odpowiadając na pytanie Co to jest Django? zespół odpowiedzialny za tę technologię przedstawia marketin-

gowy slogan The Web framework for perfectioni-sts with deadlines. Z punktu widzenia progra-misty, Django to wysokopoziomowa bibliote-ka napisana w języku Python, oferująca szkielet (ang. framework) pozwalający na szybkie two-rzenie aplikacji internetowych. Historia Djan-go rozpoczęła się w 2003 roku od dwóch pro-gramistów – Adriana Holovatyego oraz Simo-na Willisona – pracujących dla wydawcy gazety Lawrence Journal-World, stawianych przed co-raz to nowymi wyzwaniami szybszego tworze-nia nowych modułów internetowej strony gaze-ty. Postanowili oni zrezygnować z popularnego standardu LAMP (skrót od słów: Linux Apa-che MySQL PHP) i stworzyć coś bardziej dopa-sowanego do ich potrzeb.

Po dwóch latach pracy, w grudniu 2005 roku światło dzienne ujrzała pierwsza stabilna wersja Django oznaczona numerem 0.90. Od tego mo-mentu Django zyskiwało coraz większą popular-ność. 3 września 2008 team developerski uznał produkt za gotowy i wypuścił wersję 1.0. Z tej okazji chciałbym przekonać Czytelników do za-interesowania się tą ciekawą technologią oraz jej możliwościami.

Przypuszczam, że niewielu współczesnych pro-gramistów nie miało do czynienia z PHP. Znam

nawet wielu amatorów, którym ten język przy-padł do gustu tak mocno, iż używają go jako ję-zyka ogólnego zastosowania, rozwiązując przy je-go pomocy problemy nie mające wiele wspólnego z aplikacjami internetowymi. Znam również kil-ku zawodowych programistów PHP i z rozmów z nimi można wyciągnąć jeden wniosek – im dłu-żej pracuje się z tą technologią (a co za tym idzie, im bardziej skomplikowane stają problemy do rozwiązania), tym bardziej staje się ona uciążli-wą, eksponując swoje wady na niemalże każdym kroku prac programistycznych. Ja osobiście, bio-rąc pod uwagę specyfikę mojej pracy zawodowej, znajduję się na przeciwnym biegunie tego zakątka technologii, zajmując się skomplikowanymi syste-mami korporacyjnymi bazującymi na JEE i naje-żonymi różnego rodzaju buzz word’ami. Często daje mi się we znaki ogromna ilość pracy, potrzeb-na do wdrożenia nawet najprostszych rozwiązań tworzonych w oparciu o tę technologię. Złotym środkiem, jeśli chodzi o szkielety do budowania aplikacji internetowych, są właśnie takie techno-logie jak Django czy Ruby on Rails. Jako, że osobi-ście nie lubię wywodzącego się z Perla języka Ru-by, a Pythona darzę sporą sympatią postanowiłem skupić się właśnie na Django. W niniejszym arty-kule postaram się udowodnić, że duża i ciągle ro-snąca popularność Django nie jest przypadkiem oraz to, że przy pomocy tej technologii tworze-nie aplikacji webowych może być nie tylko łatwe i szybkie, ale także przyjemne.

Filozofia budowy aplikacji za pomocą DjangoJak większość szkieletów aplikacji Django, aby ułatwić tworzenie systemów, posługuje się ze-

stawem wskazówek przy stosowaniu których istnieje pewność, że technologia będzie stała po stronie programisty. Ogólną, dobrze przyj-mowaną zasadą jest to, aby przed rozpoczęciem projektu usiąść z zespołem i omówić te punkty stawiając je jako podstawowe wskazówki przy tworzeniu aplikacji.

Podstawowe postulaty, które zaleca się przy projektowaniu i tworzeniu aplikacji opartych o Django to:

• luźne powiązanie komponentów – Djan-go samo w sobie nie wspiera paradygma-tu odwrócenia sterowania (ang. Inversion of Control, IoC); technologia oferuje nato-miast swój wariant wzorca MVC; mimo wszystko przy tworzeniu aplikacji w opar-ciu o Django powinno się pamiętać o tej zasadzie;

• Don’t repeat yourself (DRY) – ten postu-lat oznacza, że każda informacja w syste-mie jest zdefiniowana w jednym, konkret-nie określonym miejscu. Django ze swoim wspomaganiem mapowania obiektowo re-lacyjnego (ORM) potrafi wtedy w pełni ko-rzystać z mechanizmów optymalizacji za-pytań do bazy oraz pamięci podręcznej w celu zachowania odpowiedniej wydajności aplikacji w tym krytycznym obszarze;

• Explicit is better than implicit (ja tłumaczę to jako brak automagiczności) – ten postu-lat wynika właściwie z filozofii samego Pytona, u podstaw której leży łatwość czy-tania i rozumienia kodu. Oczywiście, wie-le rzeczy w Django dzieje się w sposób au-tomatyczny, jednakże zwykle programista jest tego świadomy i może w tym procesie uczestniczyć;

• Rich Domain Model czyli logika aplikacji zmieszana z modelem danych – na tym etapie trudno jest wytłumaczyć czym konkretnie objawia się takie podejście w Django, jednak będzie to widoczne w dal-szych częściach artykułu.

Django

Tworzenie aplikacji internetowych to chleb powszedni wielu współczesnych programistów, co w większości przypadków wiąże się z ciężką, mozolną pracą. W niniejszym artykule przedstawione jest Django – rozwiązanie stworzone w języku Python, którego celem jest uczynić pracę programisty aplikacji webowych prostszą, bardziej efektywną oraz przyjemniejszą.

Dowiesz się:• Jak budować aplikacje internetowe w oparciu

o Django;

• Jakie zalety oferuje Django w odniesieniu do

podobnych, konkurencyjnych rozwiązań.

Powinieneś wiedzieć:• Podstawy programowania w języku Python;

• Podstawowe informacje na temat protokołu

HTTP.

Poziom trudności

Python w zastosowaniach webowych

Page 19: SDJ_12_2008_PL_Symbian OS

12/200818

Biblioteka miesiącaDjango

www.sdjournal.org 19

Środowisko developerskieZakładam, że Czytelnicy niniejszego artyku-łu znają podstawy języka Python. W przypad-ku gdyby ktoś wiedzy takowej nie posiadał, a chciałby mimo wszystko przebrnąć przez ni-niejszy tekst, polecam jeden z wielu kursów do-stępnych on-line. Mój osobisty rekord naucza-nia podstaw języka Python, w celu przygoto-wania do pracy z Django wynosi niecałe 2 go-dziny, dlatego nie ma się czego obawiać – oczy-wiście przy założeniu, że znamy ogólne zasady programowania komputerów. Wracając do śro-dowiska developerskiego, przygodę z Django rozpoczniemy od obciążenia naszego łącza in-ternetowego kilkoma pozycjami, które wymie-niam poniżej:

• Python 2.5+• Django 1.0+• baza danych – w tym artykule będę bazo-

wać na PostgreSQL w wersji 8, którą po-lecam. Django współpracuje oczywiście z wieloma silnikami baz danych; szczegóły na ten temat można znaleźć w dokumen-tacji biblioteki;

• sterownik bazy danych dla języka Python. Dla PostgreSQL jest to psycopg2.

Oprogramowanie z powyższej listy dostępne jest za darmo w Internecie. W celu jego znale-zienia sugeruję wykorzystanie najpopularniej-szej wyszukiwarki internetowej.

Szczegóły instalacji dla rozmaitych syste-mów różnią się nieco od siebie. Ja osobiście instalowałem opisany wyżej pakiet pod Win-dows XP, Windows Vista, Linux Debian, Linux Ubuntu, MacOS X Tiger oraz MacOS Leopard nigdzie nie napotykając większych problemów.

Instalację należy zacząć od Pythona, psy-copg2 oraz samego Django.

Jeśli proces ten został przeprowadzony pra-widłowo, to wydane w interaktywnym inter-preterze polecenia:

import django

import psycopg2

powinny zakończyć się bezbłędnie. Następ-nym krokiem jest umieszczenie pliku django-admin.py znajdującego się w katalogu Scripts/ instalacji Pythona na ścieżce uruchomieniowej systemu, tak aby w odpowiedzi na polecenie

django-admin.py

otrzymać komunikat:

Type 'django-admin.py help' for usage.

Kolejnym krokiem jest instalacja bazy danych. Podczas instalacji należy pamiętać o ustawie-niu haseł oraz kodowania w standardzie UTF-8. Za pomocą instalującego się domyślnie z ba-zą programu pgAdmin III proponuję utwo-

rzyć użytkownika i bazę danych, której będzie on właścicielem (w moim przypadku użytkow-nik i baza).

Tutaj właściwie kończy się przygotowa-nie środowiska, pomijając oczywiście ulubio-ny edytor tekstu przeznaczony do pracy z ko-dem. Ja pracuję w Eclipse IDE z zainstalowa-ną wtyczką Pydev.

W pracy z Django istotnym elementem jest wspomniany wcześniej skrypt django-admin. Za pomocą tego utworzymy teraz pierwszą aplikację i uruchomimy serwer developerski.

Rozpoczniemy od stworzenia katalogu robo-czego, w którym wykonamy następujące pole-cenie:

django-admin.py startproject projekt

W katalogu powinien utworzyć się podkata-log projekt, po wejściu do którego należy wyko-nać polecenie:

manage.py runserver

W wyniku wykonania tego polecenia na ekra-nie powinny się ukazać następujące komuni-katy:

Validating models...

0 errors found

Django version 1.0-final-SVN-unknown,

using settings 'projekt.settings'

Development server is running at http:

//127.0.0.1:8000/

Quit the server with CTRL-BREAK.

Nie da się ukryć że Django zachęca do wejścia na podany adres, gdzie – jeśli wszystko poszło bez problemu – przywita nas gratulacjami z okazji uruchomienia serwera.

Teraz, żeby uchylić nieco rąbka tajemnicy, objaśnię co właściwie się stało. Po pierwsze, zo-stał wykorzystany skrypt django-admin w ce-lu założenia nowego projektu. Takie wywo-łanie tworzy podstawową strukturę projektu gotową do rozpoczęcia pracy. Kolejne polece-

nie uruchomiło wewnętrzny serwer developer-ski. W odróżnieniu od pracy z PHP, w przypad-ku Django nie istnieje konieczność stawiania skomplikowanych serwerów webowych na po-trzeby tworzenia aplikacji. Serwer developer-ski ma rzecz jasna sporo ograniczeń, z których najważniejszym jest możliwość obsłużenia tyl-ko jednego zapytania jednocześnie. Jednak na-wet przy budowaniu dużych projektów jest on doskonałym narzędziem pracy.

Struktura aplikacjiJako, że stworzyliśmy właśnie pierwszy projekt Django, warto się bliżej przyjrzeć jakie pliki zo-stały wygenerowane i do czego służą. Po wej-ściu do katalogu projektu powinny znajdować się tam cztery pliki:

• __init__.py – plik ten jest wymagany przez Pythona aby projekt był traktowany jako pakiet w rozumieniu języka;

• manage.py – plik który został użyty do uruchomienia serwera developerskiego. Jest to pomocniczy plik tworzony przez Django w celu ułatwienia czynności deve-loperskich takich jak uruchamianie serwe-ra, synchronizacja bazy, walidacja modeli danych i inne;

• settings.py – zgodnie z nazwą jest to plik w którym przechowywane są ustawienia projektu. Tutaj definiuje się szczegóły po-łączenia z bazą i konfiguracje wszystkich opcji oferowanych przez szkielet aplika-cji. Tutaj zwykle umieszcza się też własne ustawienia globalne;

• urls.py – plik mapowania kontekstów apli-kacji (adresów wpisywanych w przeglą-darce) do konkretnych widoków aplika-cji. Plik ten działa na prostej zasadzie wy-rażeń regularnych gdzie pierwszym argu-mentem krotki jest wyrażenie dotyczące adresu, a drugim widok, do którego odno-si się mapowanie.

Jeśli chodzi o projekt, to tyle – jednak na tym nie kończy się kwestia struktury. Django za-kłada podział na projekt (tj. bazę zawierającą

Listing 1. Dodanie aplikacji „witaj” do listy zainstalowanych aplikacji

INSTALLED_APPS = (

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.sites',

'projekt.witaj',

)

Listing 2. Widok „Hello world” w Django

from django.http import HttpResponse

def hello(request):

return HttpResponse("Hello world.")

Page 20: SDJ_12_2008_PL_Symbian OS

12/200820

Biblioteka miesiącaDjango

www.sdjournal.org 21

globalną konfigurację i mapowanie) oraz sze-reg podpiętych pod ten projekt aplikacji. Od-zwierciedla to architekturę większych sys-temów (chociażby rozwiązań bazujących na SOA – przynajmniej w kontekście organiza-cji projektu), gdzie istnieje wiele aplikacji ko-rzystających z tego samego systemu użytkow-ników, sesji itd. Podział ten nie zawsze jest po-trzebny. W rzeczywistości, przy większości zastosowań będzie istniała potrzeba utworze-nia tylko jednej aplikacji.

Aby takową aplikację stworzyć w katalogu projektu należy wpisać następujące polecenie:

manage.py startapp witaj

Po wykonaniu tego polecenia w katalogu pro-jektu utworzony zostanie katalog aplikacji z następującą zawartością:

• __init__.py – podobnie jak wyżej jest to plik pakietu Pythona;

• views.py – plik w którym definiuje się wi-doki aplikacji;

• models.py – plik w którym definiuje się modele danych używane w aplikacji au-tomatycznie przetwarzane przez mecha-nizm ORM.

Po utworzeniu aplikacji należy poinformować projekt o przypisaniu do niego nowej aplikacji.

W pliku settings.py w krotce INSTALLED _ APPS znajdującej się na końcu pliku należy dopisać kolejną aplikację czyli witaj. Całość powinna wyglądać w sposób widoczny na Listingu 1.

Jak widać projekt i aplikacja są pakietami w rozumieniu języka Python, należy pamię-tać by trzymać się tej zasady przy podawaniu klas i metod.

Teraz można zacząć pisać zawartość aplika-cji. Proponuję tutaj zacząć od klasycznego Hel-lo World. W pliku views.py aplikacji należy wpi-sać treść widoczną na Listingu 2.

Znając podstawy języka Python, od razu wi-dać, co dzieje się w tym widoku. W pierwszej li-nijce importowana jest klasa z biblioteki Djan-go, odpowiedzialna za wygenerowanie odpo-wiedzi na zapytanie HTTP. Dalej zdefiniowa-na jest metoda, która zakłada otrzymanie ar-gumentu request. Jak nietrudno się domyślić request to zapytanie HTTP ze wszystkimi do-stępnymi parametrami. Metoda w swoim ciele zwraca obiekt HttpResponse skonstruowany z łańcucha znaków „Hello world.”. Tutaj za-czyna się wyłaniać idea sposobu działania apli-kacji opartej na Django, czyli zbioru widoków przyjmujących żądanie (ang. request) i zwraca-jących odpowiedź (ang. response). Idea ta będzie dokładniej opisana w następnym rozdziale. Po utworzeniu widoku wypadałoby go podpiąć pod jakiś kontekst, tak aby można było wywo-łać go z przeglądarki.

Robione jest to we wspomnianym pliku urls.py. Do krotki urlpatterns należy dodać odpowiedni wpis, tak aby całość wyglądała tak, jak to pokazano na Listingu 3 (komentarze ja-kie wstawił Django oczywiście nie przeszkadza-ją i mogą zostać).

Jak wspomniałem wcześniej pierwsza część reprezentuje wyrażenie regularne, za pomocą którego Django zidentyfikuje widok z drugiego argumentu. Jeśli strona ma pokazywać się na głównym kontekście należy użyć zapisu:

(r'^$', 'projekt.witaj.views.hello'),

Po uruchomieniu serwera developerskiego po-zostaje wejść na adres http://127.0.0.1:8000/witaj/ (lub bez kontekstu jeśli tak zostało usta-wione) i obejrzeć efekty.

W tym miejscu warto wspomnieć o domyśl-nie włączonym trybie DEBUG. Zachęcam Czy-telników do wprowadzenia jakiejś celowej po-myłki, np. w adresie, bądź do zrobienia literów-ki w nazwie zwracanej klasy HttpResponse. Po-zwoli to przekonać się w praktyce jak Django reaguje na błędy. Ekran informujący o błędzie zawiera bardzo dokładne informacje co i gdzie się stało, jest on na pewno mocną stroną Djan-go i przy okazji dość często oglądanym ekranem podczas prac developerskich.

Oczywiście Django nie wprowadza ograni-czeń co do możliwości używania innych biblio-tek i funkcjonalności języka Python. Na przy-kład, aby uzyskać efekt podobny do uzyskane-go na stronie isitfriday.biz powinno się napisać widok widoczny na Listingu 4.

Będąc w temacie podstawowych widoków warto poruszyć sprawę przekazywania argu-mentów. Mechanizm ten może być bardzo przy-datny kiedy trzeba np. pokazać profil konkretne-go użytkownika czy konkretny wpis na blogu. W Django jest to bardzo proste. W mapowaniu i wi-doku zapisujemy treść widoczną na Listingu 5.

Znając wyrażenia regularne nie jest to nic skomplikowanego, istnieje oczywiście możli-wość imiennego przydzielania argumentów.

Wywołanie http://127.0.0.1:8000/dodawanie/2/2/ da wiadomy wynik.

Przetwarzanie zapytaniaW poprzednich przykładach można było zo-baczyć mechanizm przetwarzania zapytania w akcji, teraz pora na odrobinę teorii. W prawi-dłowo działającej aplikacji (wystąpienie obsłu-żonego błędu też jest w tym rozumieniu pra-widłowym działaniem) dla każdego zapytania HTTP przychodzącego od klienta system po-winien wygenerować odpowiedź. W przypad-ku Django cały proces wygląda w sposób na-stępujący:

• zapytanie przechwytywane jest przez śro-dowisko uruchomieniowe (najczęściej mod_python albo FastCGI) i przekazywa-ne do przetwarzania w Django;

Listing 3. Mapowanie dla widoku Hello World

urlpatterns = patterns('',

(r'^witaj/$', 'projekt.witaj.views.hello'),

)

Listing 4. Przykład widoku Is it Friday ?

from django.http import HttpResponse

import time

def friday(request):

friday = "No"

if time.localtime()[6]==4:

friday = "Yes"

return HttpResponse("Is it Friday ? <BR/> %s" % friday)

Listing 5. Mapowanie widoku dla przykładu argumentów kontekstowych

# wpis w mapowaniu

(r'^dodawanie/(\d+)/(\d+)/$', 'projekt.witaj.views.dodawanie'),

# wpis w widoku

def dodawanie(request,a,b):

return HttpResponse(int(a)+int(b))

Listing 6. Przykładowa konfiguracja bazy w Django

DATABASE_ENGINE = 'postgresql_psycopg2'

DATABASE_NAME = 'baza'

DATABASE_USER = 'uzytkownik'

DATABASE_PASSWORD = 'qwe'

DATABASE_HOST = ''

DATABASE_PORT = ''

Page 21: SDJ_12_2008_PL_Symbian OS

12/200820

Biblioteka miesiącaDjango

www.sdjournal.org 21

• zapytanie trafia na początku do warstwy pośredniej Request Middleware, która mo-że je zwrócić w niezmienionej lub zmody-fikowanej postaci albo stwierdzić, że nale-ży zakończyć przetwarzanie i zwrócić od-powiedź. Ta warstwa odpowiedzialna jest za zapewnienie bezpieczeństwa, wspoma-ganie sesji itd.;

• zapytanie przechwytywane jest przez kon-troler mapowania adresów i następuje do-pasowanie kontekstu do widoku, w przy-padku braku możliwości dopasowania kontroler odpowiada statusem 404 i zwra-ca odpowiedź;

• po wykonaniu dopasowania do pracy za-biera się warstwa View Middleware, która działa podobnie jak warstwa Request Mid-dleware, jednak tym razem jest pewność, że zadziałały wszystkie poprzednie war-stwy i np. istnieje utworzona bezpieczna sesja użytkownika;

• do pracy przystępuje widok zwracając od-powiedź;

• zwrócona odpowiedź trafia do jeszcze jed-nej warstwy pośredniej czyli Response Mid-dleware, która może wykonać swoje opera-cje np. zamknięcie transakcji w bazie da-nych;

• odpowiedź wędruje do klienta.

Istnieje jeszcze warstwa pośrednia – Exception Middleware. Jeśli na którymkolwiek etapie przetwarzania, za który odpowiedzialne jest Django, nastąpi rzucenie (w slangu użytkow-ników języka Pytonie używa się zwrotu pod-niesienie) wyjątku, wtedy do akcji wkroczy ta warstwa, odpowiednio reagując. Oczywiście w trakcie tworzenia systemu można pisać wła-sne elementy warstw pośrednich i ustalać ich kolejność wywołania.

Modele i dostęp do danychW momencie gdy proste aplikacje nie stanowią już dla Czytelników większej tajemnicy, czas na zapoznanie się z mechanizmami oferowany-mi przez warstwę persystencji. Django oferuje programistom szereg dobrodziejstw w ramach techniki ORM (mapowanie obiektowo-relacyj-ne). W skrócie oznacza to, że programista de-finiuje w aplikacji obiekty danych, a Django sa-mo robi następujące czynności:

• sprawdza poprawność modeli;• tworzy strukturę bazy;• manipuluje danymi w tabeli, gdy zmienia-

na jest wartości pól obiektu;• pilnuje transakcyjności;• optymalizuje i buforuje zapytania.

Zanim Django zacznie wykonywać jakiekol-wiek operacje na bazie danych, musi wie-dzieć jak się do niej podłączyć. Definiuje się to w odpowiedniej sekcji pliku settings.py. – Listing 6.

Oczywiście wcześniej należy się upewnić czy serwer bazy działa oraz czy baza i użytkownik zostali stworzeni z odpowiednimi uprawnie-niami.

Jeśli wszystko przebiegło pomyślnie, pole-cam użycie wcześniej utworzonej aplikacji wi-taj jako poligonu doświadczalnego do tworze-nia modeli i wpisać treść widoczną na Listin-gu 7 do pliku models.py w katalogu wspomnia-nej aplikacji.

W pierwszej linijce importowany jest moduł models, w którym znajduje się wszystko czego potrzeba w związku z dostępem do bazy da-nych w Django.

Dalej zdefiniowana jest klasa dziedzicząca po models. Model i zdefiniowane w niej pola z przypisanymi im wartościami xxxField. Jak widać, wszystko to wydaje się dość oczywiste. Jeśli chodzi o same typy pól to w bibliotece jest ich o wiele więcej niż pokazałem tutaj i wszyst-kie są solidnie udokumentowane.

W momencie ujrzenia tego modelu specja-liści od projektowania baz danych zapewne za-czną węszyć spisek i będą bardzo chętni aby zo-baczyć jak wygląda tabela generowana przez Django z takiej klasy. Nic prostszego, wystarczy w tym celu wywołać polecenie:

manage.py sqlall witajby w wyniku otrzymać schemat widoczny

na Listingu 8.Jak widać na Listingu 8, wygenerowany kod

SQL wygląda przyzwoicie. Django jeśli ma taką możliwość, będzie tak układać tabele, aby wali-dacja zachodziła na poziomie bazy. Jednak po-nieważ nie zawsze jest to możliwe, dlatego sam też jest w stanie sprawdzić poprawność danych zanim wyda polecenie zapisu do bazy.

Tutaj warto zwrócić także uwagę na na-zwę tabeli. Django stosuje w tym przypad-ku nomenklaturę nazewnictwa o postaci aplikacja_obiekt, dzięki której łatwo ziden-tyfikować przynależność danej tabeli – szcze-gólnie gdy wiele aplikacji korzysta z jednej ba-zy. Oczywiście Django pozwala na własne nazy-wanie tabel i kolumn tak aby można było ma-pować istniejące już tabele (np. z innych aplika-cji) na modele Django.

Na tym etapie można pozwolić Django, aby automatycznie zainicjalizował bazę wydając polecenie:

manage.py syncdbPrzy wykonywaniu tego polecenia okazu-

je się, że Django robi trochę więcej niż użyt-kownik mógłby się spodziewać. W praktyce jednak wcale tak nie jest. Jeśli spojrzeć na listę INSTALLED_APPS w pliku ustawień, łatwo moż-na zauważyć, że Django robi dokładnie to, co powinien, gdyż aplikacja witaj jest tylko jedną z wielu (reszta aplikacji umieszczonych na wspo-mnianej liście jest bardzo przydatna przy reali-zacji usług Django). Na pytanie o utworzenie użytkownika administracyjnego polecam od-powiedzieć przecząco.

Polecenie syncdb jest wygodne, jednak osobiście zalecam aby w procesie tworze-nia i eksperymentowania z modelami, przed każdym synchronizowaniem czyścić struk-turę bazy.

W momencie, gdy model jest już zaimporto-wany do bazy można najlepiej go przetestować za pomocą interaktywnej konsoli Pythona wy-konując następujące polecenie:

manage.py shell

Listing 7. Przykładowy, prosty model danych w Django

from django.db import models

class Osoba(models.Model):

imie = models.CharField(max_length=200)

nazwisko = models.CharField(max_length=200)

czytelnik_sdj = models.BooleanField(default=True)

rocznik = models.PositiveIntegerField(default=1980)

Listing 8. Wygenerowany przez Django schemat tabeli

BEGIN;

CREATE TABLE "witaj_osoba" (

"id" serial NOT NULL PRIMARY KEY,

"imie" varchar(200) NOT NULL,

"nazwisko" varchar(200) NOT NULL,

"czytelnik_sdj" boolean NOT NULL,

"rocznik" integer CHECK ("rocznik" >= 0) NOT NULL

)

;

COMMIT;

Listing 9. Metoda reprezentacji klasy Osoba def _ _ unicode _ _ (self):

return self.imie + ' ' + self.nazwisko

Page 22: SDJ_12_2008_PL_Symbian OS

12/200822

Biblioteka miesiącaDjango

www.sdjournal.org 23

Najpierw należy zacząć od zaimportowania naszego modelu poleceniem:

>>> from witaj.models import Osoba

po czym posługując się zwykłą znajomością języ-ka Python można stworzyć i uzupełnić obiekt.

>>> autor = Osoba()

>>> autor.imie = 'Tomasz'

>>> autor.nazwisko = 'Kropiewnicki'

>>> autor.rocznik = 1982

W tym momencie w pamięci istnieje obiekt autor z wypełnionymi polami. Aby zapisać go do bazy wystarczy wywołać polecenie:

>>> autor.save()

Polecam stworzyć i zapisać jeszcze ze dwa obiekty w podobny sposób – przyda się to do późniejszych eksperymentów. Przy okazji moż-na zobaczyć jak działa walidacja parametrów.

W momencie gdy została zgromadzona pew-na porcja informacji czas uzyskać dostęp do za-pisanych danych.

Przed przystąpieniem do tego proponuję do-dać jeszcze do klasy Osoba drobny element logi-

ki, a mianowicie poinstruować ją jak powinna się prezentować, dodając do niej prostą metodę widoczną na Listingu 9.

Po dokonaniu takiej modyfikacji w modelu nie trzeba ponownie synchronizować aplikacji z bazą danych, gdyż w jego polach nic nie zo-stało zmienione. Najprostszym sposobem na uzyskanie danych z bazy jest uzyskanie listy wszystkich rekordów danego typu. W naszym przypadku można to zrealizować następująco:

>>> Osoba.objects.all()

Po wywołaniu powyższego polecenia otrzyma-my wynik jak poniżej:

[<Osoba: Tomasz Kropiewnicki>, <Osoba:

Janek Kowalski>, <Osoba: Piotr Nowak>]

Jak widać, dostęp do bazy otrzymuje się po-przez pole objects, które otrzymujemy w pre-zencie od django.db.models.Model.

Oczywiście nie najlepszym pomysłem jest itero-wanie po tej kolekcji w poszukiwaniu np. wszyst-kich Tomaszów, gdy baza może zrobić to sama:

>>> Osoba.objects.filter(imie='Tomasz')

[<Osoba: Tomasz Kropiewnicki>]

Jeśli dla przykładu w wyniku nie powinny znaleźć się osoby o imieniu "Tomasz" to nale-żałoby wpisać.

>>> Osoba.objects.exclude(imie='Tomasz')

[<Osoba: Janek Kowalski>, <Osoba: Nowak >]

Jak widać, przedstawione wyżej mechanizmy dostępu do danych są stosunkowo proste – jest to dobry moment do eksperymentowa-nia. Warto też w przyszłości zajrzeć do doku-mentacji Django aby zgłębić ten temat. Czy-telników zapraszam teraz do zapoznania się z tym, co się dzieje „pod maską” przedstawio-nych wyżej operacji.

Gdy zostanie wykonane następujące pole-cenie:

>>> lista = Osoba.objects.all()

>>> type(lista)

<class 'django.db.models.query.QuerySet'>

Django jak widać wcale nie zwraca listy, ale swoją klasę QuerySet. Otóż ORM zaimple-mentowany w Django działa w trybie leniwym (ang. lazy) czyli nie pobiera obiektów z bazy do momentu do którego są potrzebne. Dlatego sa-mo wykonanie polecenia

>>> lista = Osoba.objects.all()

nie powoduje wywołania zapytania do bazy. Czynność fizycznego pobierania danych z ba-zy nazywa się materializacją i występuje do-piero gdy z QuerySet pobieramy konkretne obiekty czyli zwykle w najpóźniejszym moż-liwym momencie aby oszczędzić czasochłon-nych odwołań do bazy danych.

QuerySet ma też inną właściwość, miano-wicie na obiekcie takim można użyć metod filter czy exclude aby kaskadowo doprecyzo-wać warunki wyszukiwania. Oczywiście samo odwołanie do bazy nastąpi dopiero w momen-cie materializacji.

Często występuje sytuacja gdy należy pobrać tylko jeden obiekt danego typu (np. użytkow-nika przy logowaniu) można to zrobić w nastę-pujący sposób:

>>> Osoba.objects.get(imie='Tomasz')

<Osoba: Tomasz Kropiewnicki>

Jeśli przedstawione wyżej kryterium byłoby spełnione przez więcej niż jeden rekord, to Django podniosłoby wyjątek.

Możliwości Django nie kończą się oczywiście na mapowaniu prostych obiektów. Biblioteka zapewnia możliwość tworzenia i obsługi roz-budowanych relacji pomiędzy obiektami.

Aby to zobrazować zmodyfikujemy plik mo-delu tak, aby miał on postać widoczną na Li-stingu 10.

Na Listingu 10 utworzona została nowa kla-sa – Miasto. W klasie Osoba dołączono z kolei

Listing 10. Przykład modelu danych z relacją

from django.db import models

class Miasto(models.Model):

nazwa = models.CharField(max_length=200)

def __unicode__(self):

return self.nazwa

class Osoba(models.Model):

imie = models.CharField(max_length=200)

nazwisko = models.CharField(max_length=200)

czytelnik_sdj = models.BooleanField(default=True)

rocznik=models.PositiveIntegerField(default=1980)

miasto = models.ForeignKey(Miasto)

def __unicode__(self):

return self.imie + ' ' + self.nazwisko

Listing 11. Eksperymenty ze złożonym modelem danych

>>> from witaj.models import *

>>> szczecin = Miasto()

>>> szczecin.nazwa = 'Szczecin'

>>> szczecin.save()

>>> autor = Osoba()

>>> autor.imie = 'Tomasz'

>>> autor.nazwisko = 'Kropiewnicki'

>>> autor.miasto = szczecin

>>> autor.save()

Page 23: SDJ_12_2008_PL_Symbian OS

12/200822

Biblioteka miesiącaDjango

www.sdjournal.org 23

relację jeden-do-wielu (1-*) do klasy Miasto. Po zsynchronizowaniu tego modelu z bazą pole-cam przejść do interaktywnego interpretera i postępować dokładnie tak jak podpowiada w tym przypadku intuicja. Na Listingu 11 poka-zane jest jak może wyglądać taki eksperyment.

Co logiczne, do relacji zdefiniowanej w ta-kiej postaci istnieje prosty dostęp poprzez skła-dową obiektu, w związku z czym naturalnym jest wywołanie:

>>> autor.miasto

<Miasto: Szczecin>

Podsumowując niniejszą część artykułu moż-na stwierdzić, że warstwa obsługi oraz dostę-pu do danych w Django jest bardzo rozbudo-wana i szczersze polecam zapoznać się z jej do-kumentacją w celu wykorzystania jej pełnych możliwości. Aczkolwiek, to co warto w tym miejscu podkreślić, to fakt, iż pomimo całej tej złożoności rozwiązanie ORM dostarczone w ramach Django zachowuje bardzo natural-ny i intuicyjny charakter.

Panel administratoraTworząc systemy internetowe zwykle staje się przed koniecznością robienia serii standardo-wych rzeczy, które powtarzają się z projektu na projekt. Są to między innymi:

• zarządzanie użytkownikami;• zarządzanie uprawnieniami;• wprowadzanie i modyfikacja danych.

Zwykle do tych czynności tworzy się panel ad-ministratora, w którym mozolnie to wszyst-ko trzeba zakodować. W tym momencie z po-mocą przychodzi Django ze swoim modułem admin. Aby zobaczyć jak działa ten moduł na-leży włączyć go do aplikacji postępując w na-stępujący sposób. Na początek trzeba dodać wpis django.contrib.admin do listy zainsta-lowanych aplikacji w pliku settings.py. Następ-nie należy zsynchronizować bazę danych (tym razem trzeba utworzyć użytkownika admini-stracyjnego). W pliku urls.py trzeba ściągnąć znaki komentarzy z linii:

from django.contrib import admin

admin.autodiscover()

oraz

(r'^admin/(.*)', admin.site.root)

Wreszcie, w katalogu aplikacji można utwo-rzyć plik admin.py z treścią przedstawioną na Listingu 12.

Jeśli wszystkie opisane wyżej kroki zostaną wykonane i po włączeniu serwera developer-skiego zostanie odpytany adres http://127.0.0.1/admin, to powinien się ukazać ekran logowa-nia. Po zalogowaniu się danymi użytkowni-

ka administracyjnego, który został założony przy synchronizacji bazy można uzyskać peł-ne uprawnienia do korzystania z panelu admi-nistratora.

Na głównym ekranie mamy do dyspozycji szereg aplikacji zainstalowanych w projekcie.

Aplikacje wbudowane w Django, takie jak Auth czy Sites, pozwalają na konfigurację swo-ich właściwości z poziomu tego panelu. Bardzo interesująca jest możliwość zarządzania aplika-cją Auth, czyli tak naprawdę możliwość wygod-nego zarządzania użytkownikami i grupami.

Oczywiście poprzez utworzenie pliku ad-min.py panel administratora zarządza też apli-kacją witaj. Tutaj mamy możliwości zarządza-nia zawartością danych w modelu aplikacji. Pa-nel administratora jest ogromną zaletą Django. Konkurencyjne technologie nie posiadają takie-go rozwiązania, a z doświadczenia mogę powie-dzieć że funkcjonalność, którą oferuje panel ad-ministratora często stanowi około 30% funk-

cjonalności całej aplikacji. Oczywiście panel umożliwia szerokie możliwości rozszerzania i konfiguracji opisane dokładnie w dokumenta-cji jednak już w swojej podstawowej wersji po-zwala praktycznie natychmiastowo rozpocząć prace osobom wprowadzającym dane (np. po-zycje do cennika czy klientów do bazy).

Mechanizm szablonówKiedy już umiemy zarządzać logiką i danymi w aplikacji przychodzi pora na obsługę warstwy prezentacji. Tutaj Django również potrafi po-móc, oferując zaawansowany mechanizm sza-blonów. Co ciekawe Django pozostawia moż-liwość korzystania z alternatywnych mechani-zmów szablonowania, jednak osobiście uwa-żam, iż ten wbudowany oferuje bardzo dobry kompromis pomiędzy wydajnością, a stopniem zaawansowania możliwości. W przykładzie „Is it Friday?” przekazany został bezpośrednio łańcuch znaków do konstruktora odpowie-

Listing 12. Zawartość pliku admin.py

from witaj.models import Osoba, Miasto

from django.contrib import admin

admin.site.register(Osoba)

admin.site.register(Miasto)

Listing 13. Przykład widoku wykorzystującego mechanizm szablonów

from django.shortcuts import render_to_response

import time

def friday(request):

friday = "No"

if time.localtime()[6]==4:

friday = "Yes"

return render_to_response('friday.html', {'friday': friday})

Listing 14. Plik szablonu wykorzystanego w przykładzie Is it Friday ?

<html>

<head>

<title>Is it Friday ?</title>

</head>

<body>

<p>Is it Friday ?<br/>{{friday}}</p>

</body>

</html>

Listing 15. Plik szablonu do przykładu obsługi formularza

<html>

<head>

<title>Nowe miasto</title>

</head>

<body>

<form method="post" action=".">

{{form}}</p>

<input type="submit" class="button" value="Nowe"/>

</form>

<p>{{msg}}</p>

</body>

</html>

Page 24: SDJ_12_2008_PL_Symbian OS

12/200824

Biblioteka miesiąca

dzi HTTP. Gdyby miało by być to zrealizowa-ne przy użyciu szablonu, widok wyglądałby tak jak pokazano to na Listingu 13.

Zanim aplikacja zostanie uruchomiona trze-ba jeszcze napisać sam szablon, a jeszcze wcze-śniej – poinformować Django gdzie są przecho-wywane pliki szablonów.

Robi się to za pomocą pola TEMPLATE_DIRS w pliku settings.py, gdzie znajduje się lista bez-względnych lokalizacji katalogów z plikami sza-blonów. Szablon użyty na potrzeby naszego przykładu pokazany jest na Listingu 14.

Jak widać główną zmianą w widoku jest funkcja skrótu render_to_response. Pierw-szym jej argumentem jest nazwa szablonu, któ-rego Django poszukuje w zdefiniowanych kata-logach a drugim jest słownik kontekstu. Kon-tekst to mapowanie nazw do dowolnych obiek-tów języka Python, w tym momencie jest to łańcuch znaków, ale nic nie stoi na przeszko-dzie by był to własny obiekt lub QuerySet. Do-stęp do elementów kontekstu uzyskuje się po-przez operator kropki służący do wywoływa-nia metod czy uzyskiwania dostępów do list czy słowników. Tak na przykład dostęp do me-tody w 10 elemencie listy można uzyskać za po-mocą składni:

{{lista.10.metoda}}

Mechanizm szablonów nie przewiduje w tej składni wywoływania metod z argumentami.

Jak łatwo zauważyć, dzięki wcześniejszej wiedzy z zakresu modelu danych, można zbu-dować kontekst z elementów modelu, zaś w kontekście właściwie dowolnie poruszać się po jego strukturze np.:

{{osoby.1.imie}} {{osoby.1.miasto.nazwa}}

Django oferuje możliwość definiowania pę-tli, instrukcji warunkowych innych instruk-

cji sterujących za pomocą których wyświetla-nie dowolnych danych na stronie staje się na-prawdę łatwe.

Szablony Django oferują też inną użyteczną właściwość, a mianowicie możliwość dziedzi-czenia szablonów. Jest to doskonałe narzędzie pozwalające na edycje tylko tych elementów strony które są konieczne, co doskonale wpisu-je się w architekturę współczesnych witryn in-ternetowych.

Ogólnie dzięki stosowaniu mechanizmu sza-blonów istnieje możliwość bardzo szybkiego tworzenia widoków przy minimalnym nakła-dzie ze strony programisty, zostawiając osobom zajmującym się interfejsem użytkownika pełną swobodę dotyczącą wyboru stylów i rozmiesz-czenia elementów na stronie.

FormularzeNieodłącznym elementem aplikacji interneto-wych jest wprowadzanie danych we wszelkiego rodzaju formularzach. Tutaj Django również przychodzi z pomocą w ramach swojego za-awansowanego mechanizmu obsługi formula-rzy. W kolejnym przykładzie pokazane jest jak prosto można zbudować formularz w oparciu o istniejący już model. Na początek należy stwo-rzyć nowy plik szablonu, którego treść widocz-na jest na Listingu 15 – ja zapisałem go w pliku miastoform.html.

W następnym kroku należy dodać kod logiki przedstawiony na Listingu 16.

Tutaj mamy trochę więcej kodu więc przeana-lizujmy krok po kroku co się dzieje. Najpierw im-portowane są potrzebne moduły. Następnie two-rzymy klasę formularza – jedyne co należy tutaj zrobić, to poinformować Django, aby za pomocą mechanizmów meta-programowania wygenero-wał nam klasę formularza dla modelu Miasto.

Następnie budowany jest widok przekazują-cy formularz wprost jako element kontekstu. Je-śli widok zostanie wywołany zapytaniem GET

(normalne wejście przeglądarką) to wyświetli się pusty formularz do wypełnienia. Jeśli zaś aplika-cja otrzyma żądanie wysłane metodą POST, wte-dy Django przypisze dane do formularza, a po-nieważ jest to formularz pochodzący od mode-lu, wywołanie metodą save() stworzy odpo-wiedni obiekt w bazie. Cały ten mechanizm bę-dzie działał nawet dla skomplikowanych formu-larzy, zaś w szablonie wystarczy podać proste od-niesienie w postaci {{form}}.

Jeśli arkusze stylów aplikacji są dobrze za-projektowane, to oferowany przez Django me-chanizm obsługi formularzy wydatnie zmniej-sza nakład pracy potrzebny na sfinalizowanie projektu.

Środowisko produkcyjneKiedy aplikacja jest gotowa, czas przekazać ją użytkownikom. Dysponując własnym środowi-skiem serwerowym mamy do rozważenia kilka możliwych konfiguracji. Najpopularniejszą jest mod_python działający pod kontrolą Apache, jednak ta konfiguracja nie jest najbardziej opty-malna – patrząc pod kątem wydajności. Aby aplikacja mogła rozwinąć pełne skrzydła pole-cam zastosować serwer Nginix i FastCGI, oczy-wiście jeśli uzyskamy wsparcie dla takich roz-wiązań ze strony administratora serwera.

Jeśli chodzi o Django to istnieje w Polsce kil-ka hostingów oferujących tą platformę. Firmy hostingowe oferują nie tylko podstawowy ser-wer WWW i bazę, ale często też usługę pamięci podręcznej, a wszystko to za niewiele większą opłatą w porównaniu do zwykłego LAMP.

PodsumowanieMam nadzieję, że po lekturze niniejszego ar-tykułu Czytelnicy będą w stanie wyrobić so-bie opinię na temat procesu tworzenia apli-kacji internetowych w oparciu o Django. Mo-im zdaniem przewaga Django nad konkuren-cyjnymi technologiami wynika z faktu, iż po-zwala on tworzyć aplikacje internetowe szyb-ko i bez konieczności poświęcania elegancji ko-du oraz spójności architektury, a dodatkowo nie zamyka programistów w klatce swoich wła-snych konwencji, jak to czynią niektórzy z jego konkurentów.

Listing 16. Definicja widoku w przykładzie zastosowania formularza

from django.forms import ModelForm

from witaj.models import Miasto

class MiastoForm(ModelForm):

class Meta:

model = Miasto

def new_citty(request):

form = MiastoForm()

msg = ''

if request.method == 'POST':

new_data = request.POST.copy()

form = MiastoForm(new_data)

if form.is_valid():

form.save()

msg = 'Gratulacje, mamy nowe miasto'

return render_to_response('miastoform.html', {'form': form, 'msg' : msg })

TOMASZ KROPIEWNICKITomasz Kropiewnicki pracuje w szczecińskim od-

dziale firmy BLStream (http://www.blstream.pl).

Jego doświadczenia zawodowe obejmują głównie

budowanie systemów klasy Enterprise, systemów

wbudowanych, oraz programowanie aplikacji mo-

bilnych. Firma BLStream wchodzi w skład Grupy

BLStream, powstałej by efektywniej wykorzystywać

potencjał dwóch, szybko rozwijających się produ-

centów oprogramowania – BLStream i Gamelion.

Firmy wchodzące w skład grupy specjalizują się w

wytwarzaniu oprogramowania dla klientów kor-

poracyjnych, w rozwiązaniach mobilnych oraz pro-

dukcji i testowaniu gier.

Kontakt z autorem: [email protected]

Page 25: SDJ_12_2008_PL_Symbian OS

Redakcja nie udziela pomocy technicznej w instalowaniu i użytkowaniu programów

zamieszczonych na płytach CD-ROM dostarczonych razem z pismem.

Jeśli nie możesz odczytać zawartości płyty CD, a nie jest ona uszkodzona mechanicznie, sprawdź ją na co najmniej dwóch napędach CD. W razie problemów z

płytą, prosimy pisać pod adres:

[email protected]

Page 26: SDJ_12_2008_PL_Symbian OS

12/200826

Programowanie w LinuksieMirrorowanie dysku w Linuksie

www.sdjournal.org 27

W tym poradniku opiszę jak naj-efektywniej zrealizować to za-danie na przykładzie popular-

nej dystrybucji systemu Linuks – Ubuntu. Jako że poniższe działania modyfikują kon-figurację naszego systemu, silnie zalecane (a wręcz wymagane!) jest wykonanie kopii bez-pieczeństwa naszych danych. Jak coś się nie uda, będzie mniej płaczu i zgrzytania zęba-mi. Przed przystąpieniem do zadania po-trzebne będą następujące narzędzia – ter-minal (TTY/Konsola znakowa) lub dowolny emulator terminala (np. gnome-terminal); dysk twardy z niezaalokowaną przestrzenią dyskową – podłączony w komputerze, najle-piej jakby miał taką samą pojemność jak dysk którego obecnie używamy; dostęp do konta administratora – albo poprzez mechanizm sudo albo su.

Rozeznanie w aktualnej sytuacji i stan docelowyZanim przystąpimy do pracy musimy roze-znać się w aktualnej sytuacji konfiguracyj-nej naszego systemu oraz przygotować się do dalszych działań. Na początku sprawdza-my następujące informacje – jakie posiada-my filesystemy, jak wyglądają tablice party-cji naszych dysków oraz jakie są wykorzysty-wane obszary wymiany (ang. swap). Infor-macje te możemy zebrać korzystając z termi-

nala i wydawania poleceń z klawiatury albo korzystając z programów graficznych opisu-jących konfigurację naszego komputera. Ja-ko że w dalszej części konfigurację będziemy musieli wykonać za pomocą poleceń w ter-minalu to skupimy się na tej drodze do ce-lu. Otwieramy więc emulator terminala (do-stępny w menu Aplikacje->Akcesoria->Termi-nal; alternatywnie w systemie Ubuntu mo-żemy skorzystać z terminala użytkownika root – Aplikacje->Narzędzia systemowe->Ter-

minal użytkownika root) i wpisujemy na-stępujące polecenia – df -k, swapon -s oraz sudo sfdisk -l. W naszym przypad-ku mamy jeden główny filesystem / (Listing 1) umiejscowiony na partycji /dev/sda1. Po-zostałe filesystemy są wirtualne (w ogólno-ści nie odwołują się do urządzeń w katalogu /dev/) i nie musimy się nimi zajmować. Ob-szar wymiany (swap) umiejscowiony jest na partycji /dev/sda5 (Listing 3). Podział na po-szczególne partycje uwidoczniony jest na Li-stingu 2. Drugi dysk (/dev/sdb) który wyko-rzystamy do mirrorowania jest całkowicie pusty (Listing 2).

Przygotowanie drugiego dyskuPrzystępujemy więc do działań. Na począ-tek musimy poprawnie spartycjonować dru-

Mirrorowanie dysku w LinuksieMirrorowanie (RAID1) jest jedną z możliwości uchronienia się przed utratą danych w przypadku awarii dysku twardego komputera. Aby skorzystać z tej możliwości wymagane jest posiadanie drugiego niewykorzystywanego dysku twardego o pojemności nie mniejszej niż dysk na którym mamy zapisane nasze dane.

Dowiesz się:• Jak najefektywniej zrealizować to zadanie na

przykładzie popularnej dystrybucji systemu

Linuks – Uubuntu.

Powinieneś wiedzieć:• Jak wykonać kopię bezpieczeństwa danych.

Poziom trudności

Listing 1. Informacja o zamontowanych filesystemach

radekk@raidtest:~$ df -k

System plików bl. 1K B użyte dostępne %uż. zamont. na

/dev/sda1 3920768 2858404 864768 77% /

varrun 256016 104 255912 1% /var/run

varlock 256016 0 256016 0% /var/lock

udev 256016 52 255964 1% /dev

devshm 256016 12 256004 1% /dev/shm

lrm 256016 45040 210976 18% /lib/modules/2.6.24-19-

generic/volatile

gvfs-fuse-daemon 3920768 2858404 864768 77% /home/radekk/.gvfs

Listing 2. Informacja o tablicy partycji dysku głównego

radekk@raidtest:~$ sudo sfdisk -l

(...)

Device Boot Start End #cyls #blocks Id System

/dev/sda1 * 0+ 491 492- 3951958+ 83 Linux

/dev/sda2 492 521 30 240975 5 Extended

/dev/sda3 0 - 0 0 0 Empty

/dev/sda4 0 - 0 0 0 Empty

/dev/sda5 492+ 521 30- 240943+ 82 Linux swap / Solaris

(...)

Disk /dev/sdb doesn't contain a valid partition table

Page 27: SDJ_12_2008_PL_Symbian OS

12/200826

Programowanie w LinuksieMirrorowanie dysku w Linuksie

www.sdjournal.org 27

gi, chwilowo całkowicie pusty dysk. Partycjo-nowania możemy dokonać dowolnym zna-nym nam narzędziem pamiętając aby ilość partycji oraz ich wielkość odpowiadała na-szym wymaganiom. W naszym przypadku będziemy mieli dwie podstawowe partycje (sdb1 i sdb2) oraz jedną partycję rozszerzo-ną (sdb5). W przypadku partycji sdb1 oraz sdb5 musimy zmienić typ tworzonych par-tycji z Linux/83 oraz Linux swap/82 na Li-nux raid autodetect/FD. Możemy to zro-bić np. za pomocą poniższego polecenia (Li-sting 4) albo całkowicie ręcznie w przypad-ku osób chcących mieć pełnię władzy nad ca-łym procesem. UWAGA!: partycjonowanie dysków jest bardzo niebezpieczną czynno-ścią i jeśli jest wykonywana nieostrożnie (po-myłki w nazwach dysków) może doprowa-dzić do utraty danych! Na zakończenie tego kroku powinniśmy zweryfikować nasze dzie-ło poleceniem sudo sfdisk -l. (Listing 5). Poszczególne wartości początku, końca oraz wielkości każdej z nowych partycji powin-

ny odpowiadać dotychczasowym partycjom z Listingu 2. Osoby bardziej zaawansowane mogą wykorzystać ten krok w celu zmiany wielkości lub rozłożenia dotychczasowych partycji. Może to być szczególnie pomocne w przypadku kiedy ustawione podczas insta-lacji wielkości partycji nie są obecnie opty-malne (np. za duży lub za mały swap) lub kiedy chcemy podzielić większy filesystem na kilka mniejszych (np. rozdzielenie /var lub /usr od /) lub połączyć rozdzielone wcze-śniej filesystemy w większą całość.

Instalacja oprogramowania mdadm i modułów kernelaAby móc skonfigurować w Linuksie (Ubun-tu) RAIDa powinniśmy zaopatrzyć się w program mdadm. W większości dystrybu-cji (w tym i Ubuntu) jest on dostępny w re-pozytoriach i bez problemu można go doin-stalować za pomocą przykładowego polece-nia (o ile nie jest już zainstalowany) – sudo apt-get install mdadm (Listing 6). Two-

rzenie macierzy RAID1 wymaga obecności w systemie odpowiednich modułów kernela. Możemy to zweryfikować na różne sposoby, np. poleceniami – lsmod | grep raid czy cat /proc/mdstat (Listing 7). Jeśli w obu przypad-kach wyświetlona zostanie informacja o do-stępności raid1, to wszystko jest ok, w prze-ciwnym wypadku do pliku /etc/modules nale-ży dopisać moduł raid1 i ręcznie załadować moduł poleceniem sudo modprobe raid1.

Tworzenie macierzy raid1Aby jak najbardziej uprościć sobie konfigu-rację proponuję stworzenie macierzy raid o numerach urządzeń odpowiadających obec-nym partycjom. Oczywiście nic nie stoi na przeszkodzie aby numeracja nowych urzą-dzeń była dowolna, np. sekwencyjna liczo-na od 0. Będziemy tworzyli więc macierze –/dev/md1 – dla filesystemu głównego / oraz /dev/md5 – dla obszaru wymiany (swap). Niestety nie jesteśmy w stanie wykorzystać dotychczasowych urządzeń, z których ko-

Listing 3. Informacja o obszarze wymiany

radekk@raidtest:~$ swapon -s

Filename Type Size Used Priority

/dev/sda5 partition 240932 208 -1

Listing 4. Partycjonowanie drugiego dysku

radekk@raidtest:~$ sudo -s

radekk@raidtest:~# sfdisk -d /dev/sda|sed 's/Id=82/Id=fd/g'|sed 's/Id=83/Id=fd/g'| sfdisk /dev/sdb

Listing 5. Weryfikacja nowych partycji

radekk@raidtest:~$ sudo sfdisk -l /dev/sdb

(...)

Device Boot Start End #cyls #blocks Id System

/dev/sdb1 * 0+ 491 492- 3951958+ fd Linux raid autodetect

/dev/sdb2 492 521 30 240975 5 Extended

/dev/sdb3 0 - 0 0 0 Empty

/dev/sdb4 0 - 0 0 0 Empty

/dev/sdb5 492+ 521 30- 240943+ fd Linux raid autodetect

Listing 6. Instalacja pakietu mdadm

radekk@raidtest:~$ sudo apt-get install mdadm

Czytanie list pakietów... Gotowe

Budowanie drzewa zależności

Odczyt informacji o stanie... Gotowe

Zostaną zainstalowane następujące NOWE pakiety:

mdadm

0 aktualizowanych, 1 nowo instalowanych, 0 usuwanych i 0 nieaktualizowanych.

Konieczne pobranie 225kB archiwów.

Po tej operacji zostanie dodatkowo użyte 639kB miejsca na dysku.

(...)

Generating array device nodes... done.

Generating mdadm.conf... done.

Removing any system startup links for /etc/init.d/mdadm-raid ...

update-initramfs: deferring update (trigger activated)

* Starting MD monitoring service mdadm --monitor

[ OK ]

Processing triggers for initramfs-tools ...

update-initramfs: Generating /boot/initrd.img-2.6.24-19-generic

Page 28: SDJ_12_2008_PL_Symbian OS

12/200828

Programowanie w LinuksieMirrorowanie dysku w Linuksie

www.sdjournal.org 29

rzysta nasz system, jako części tworzonej macierzy raid. Z tego powodu musimy sto-sować pewne obejście które finalnie wydłu-ży nam czas potrzebny na pełne zbudowa-nie raid1 oraz trochę skomplikuje pewne kroki. Tak więc nasza macierz będzie skła-dać się po części z partycji drugiego dysku

oraz składowej oznaczonej jako missing. W dalszej części składowa missing zostanie za-stąpiona partycjami pierwszego dysku. Two-rzymy macierz za pomocą polecenia – sudo mdadm --create /dev/md1 --level=1 --

raid-disks=2 missing /dev/sdb1 i analo-gicznie dla kolejnych partycji (Listing 8). Po

tej operacji weryfikujemy stan naszych ma-cierzy za pomocą polecenia – cat /proc/

mdstat (Listing 9). Nasze macierze powin-ny mieć status active i, zgodnie z wcześniej-szymi założeniami, informować nas o braku jednego z dysków następującym zapisem: [_U]. Gdzie znak _ oznacza brak zdefiniowa-

Listing 7. Weryfikacja dostępności modułu raid1

radekk@raidtest:~$ cat /proc/mdstat

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]

unused devices: <none>

Listing 8. Tworzenie macierzy raid1

radekk@raidtest:~$ sudo mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb1

mdadm: array /dev/md1 started.

radekk@raidtest:~$ sudo mdadm --create /dev/md5 --level=1 --raid-disks=2 missing /dev/sdb5

mdadm: array /dev/md5 started.

Listing 9. Weryfikacja statusu utworzonej macierzy raid1

radekk@raidtest:~$ cat /proc/mdstat

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]

md5 : active raid1 sdb5[1]

240832 blocks [2/1] [_U]

md1 : active raid1 sdb1[1]

3951872 blocks [2/1] [_U]

unused devices: <none>

Listing 10. Aktualizacja konfiguracji

radekk@raidtest:~$ sudo -s

radekk@raidtest:~# mdadm --examine –scan >> /etc/mdadm/mdadm.conf

Listing 11. Modyfikacja zawartości pliku konfiguracyjnego /etc/fstab

# /etc/fstab: static file system information.

#

# <file system> <mount point> <type> <options> <dump> <pass>

proc /proc proc defaults 0 0

# /dev/sda1

#UUID=5737e525-abcb-4f56-a833-117ef7e963a0 / ext3 relatime,errors=remount-ro 0 1

/dev/md1 / ext3 relatime,errors=remount-ro 0 1

# /dev/sda5

#UUID=67b80de0-2466-49ba-b33c-2367a73c017d none swap sw 0 0

/dev/md5 none swap sw 0 0

/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto,exec,utf8 0 0

Listing 12. Modyfikacja zawartości pliku konfiguracyjnego /boot/grub/menu.lst

(...)

title Ubuntu 8.04.1, kernel 2.6.24-19-generic RAID1 HD0

root (hd0,0)

kernel /boot/vmlinuz-2.6.24-19-generic root=/dev/md1 ro quiet splash

initrd /boot/initrd.img-2.6.24-19-generic

quiet

title Ubuntu 8.04.1, kernel 2.6.24-19-generic RAID1 HD1

root (hd1,0)

kernel /boot/vmlinuz-2.6.24-19-generic root=/dev/md1 ro quiet splash

initrd /boot/initrd.img-2.6.24-19-generic

Page 29: SDJ_12_2008_PL_Symbian OS

12/200828

Programowanie w LinuksieMirrorowanie dysku w Linuksie

www.sdjournal.org 29

nego dysku. Po zdefiniowaniu macierzy ak-tualizujemy informacje konfiguracyjne za pomocą polecenia – sudo -s a następnie mdadm --examine --scan >> /etc/mdadm/

mdadm.conf (Listing 10). Lokalizacja pliku mdadm.conf w innych dystrybucjach może być trochę inna.

Dostosowywanie systemu do obsługi raid1Zanim rozpoczniemy przenoszenie nasze-go systemu na macierz raid musimy go tro-chę dostosować. Na początek edytujemy plik: /etc/fstab dowolnym edytorem teksto-wym, np. sudo gedit /etc/fstab. W pliku za-mieniamy informację o montowaniu na-szych filesystemów oraz obszaru wymiany na nowe urządzenia /dev/md1 i /dev/md5 (Li-sting 11). W przypadku systemu Ubuntu li-nie odpowiadające filesystemom oraz obsza-rowi wymiany zazwyczaj oznaczone są iden-tyfikatorami UUID zamiast przykładowych /dev/sda1 i /dev/sda5. Wartości UUID dopie-ro na etapie uruchamiania systemu zamie-niane są przez skrypty startujące na odpo-wiadające im urządzenia dyskowe. Plik za-pisujemy i zabieramy się za aktualizację pro-gramu uruchomieniowego grub. W tym ce-lu edytujemy plik: /boot/grub/menu.lst do-wolnym edytorem tekstowym, np. sudo ge-dit /boot/grub/menu.lst i dodajemy nowe wpi-sy umożliwiające startowanie naszego syste-mu z macierzy raid1 (Listing 12). WAŻNE: należy pozostawić i nie modyfikować istnie-jących wpisów, które umożliwią nam powrót do dotychczasowego systemu jeśli w trakcie prac konfiguracyjnych popełniliśmy gdzieś błąd. Plik zapisujemy. Uruchamiamy aktu-alizację zawartości ram-dysku poleceniem: sudo update-initramfs -u; w innych dys-trybucjach może być to polecenie update-initrd (Listing 13).

Tworzenie nowych filesystemów i przenoszenie danychJak mamy już uruchomione macierze raid (jeszcze nie pełne) i przygotowany system to nadszedł czas na przeniesienie go do nowej lokalizacji. Na początek należy stworzyć wy-magane filesystemy oraz obszary wymiany. W tym miejscu bardziej zaawansowane osoby mogą stosownie do swoich wymagań dobrać parametry tworzonych filesystemów, w szcze-gólności wielkość bloku filesystemu, wielkość tablicy i-węzłów, itp. Pamiętać należy aby z rozwagą stosować możliwe opcje. Wymaga-ny filesystem tworzymy za pomocą polecenia – sudo mkfs.ext3 /dev/md1 (Listing 14). Natomiast obszar wymiany za pomoca pole-cenia – sudo mkswap /dev/md5 (Listing 15). Następnie montujemy filesystem(y) w jakiejś nieużywanej lokalizacji, np. /mnt (/mnt/root, /mnt/boot, itp.) za pomocą poleceń – sudo mo-unt /dev/md1 /mnt i przekopiować dane każde-

go z filesystemów poleceniem – sudo cp -dpRx / /mnt (Listing 16). Operacja kopiowania da-nych zazwyczaj trwa chwilkę, więc w tym cza-sie możemy sobie wypić kawę. Kiedy opera-cja się zakończy na nowym filesystemie two-rzymy dodatkowe, wymagane przez system katalogi, poleceniem – sudo mkdir /mnt/proc /mnt/sys /mnt/dev.

Aktualizacja programu uruchomieniowego grubPrzed zakończeniem kolejnego kroku konfi-guracyjnego powinniśmy przygotować głów-ny rekord startowy (MBR) na nowym dysku. Realizujemy to za pomocą następujących po-leceń – sudo grub i w ramach grub'a: root (hd1,0) i setup (hd1) (Listing 18). Po tej

Listing 13. Przebudowanie obrazu ramdysku

radekk@raidtest:~$ sudo update-initramfs -u

update-initramfs: Generating /boot/initrd.img-2.6.24-19-generic

Listing 14. Tworzenie nowego filesystemu na macierzy raid1

radekk@raidtest:~$ sudo mkfs.ext3 -L root -m 1 /dev/md1

mke2fs 1.40.8 (13-Mar-2008)

Etykieta systemu plików=root

Typ OS: Linux

Rozmiar bloku=4096 (log=2)

Rozmiar fragmentu=4096 (log=2)

(...)

Zapis superbloków i podsumowania systemu plików: wykonano

Listing 15. Tworzenie nowego obszaru wymiany (swap) na macierzy raid1

radekk@raidtest:~$ sudo mkswap /dev/md5

Setting up swapspace version 1, size = 246607 kB

Listing 16. Kopiowanie danych na macierz raid1

radekk@raidtest:~$ sudo mount /dev/md1 /mnt

radekk@raidtest:~$ sudo cp -dpRx / /mnt

Listing 17. Tworzenie wymaganych katalogów na macierzy raid1

radekk@raidtest:~$ sudo mkdir /mnt/proc /mnt/sys /mnt/dev

Listing 18. Konfiguracja i aktualizacja rekordu startowego dysków składowych macierzy raid1

radekk@raidtest:~$ sudo grub

Probing devices to guess BIOS drives. This may take a long time.

Unknown partition table signature

Unknown partition table signature

[ Minimal BASH-like line editing is supported. For

the first word, TAB lists possible command

completions. Anywhere else TAB lists the possible

completions of a device/filename. ]

grub> root (hd1,0)

root (hd1,0)

grub> setup (hd1)

setup (hd1)

Checking if "/boot/grub/stage1" exists... yes

Checking if "/boot/grub/stage2" exists... yes

Checking if "/boot/grub/e2fs_stage1_5" exists... yes

Running "embed /boot/grub/e2fs_stage1_5 (hd1)"... 16 sectors are embedded.

succeeded

Running "install /boot/grub/stage1 (hd1) (hd1)1+16 p (hd1,0)/boot/grub/stage2 /boot/

grub/menu.lst"... succeeded

Done.

Page 30: SDJ_12_2008_PL_Symbian OS

12/200830

Programowanie w LinuksieMirrorowanie dysku w Linuksie

www.sdjournal.org 31

Listing 19. Uruchomienie menu programu uruchomieniowego grub

GRUB loading, please wait...

Press `ESC' to enter the menu... 3

Listing 20. Weryfikacja konfiguracji systemu z macierzą raid1

radekk@raidtest:~$ df -k

System plików bl. 1K B użyte dostępne %uż. zamont. na

/dev/md1 3920684 3010660 870508 78% /

(...)

radekk@raidtest:~$ swapon -s

Filename Type Size Used Priority

/dev/md5 partition 240824 0 -1

Listing 21. Repartycjonowanie pierwszego dysku pod macierz raid1

radekk@raidtest:~$ sudo -s

radekk@raidtest:~# sfdisk -d /dev/sdb | sfdisk /dev/sdb

Disk /dev/sda: 522 cylinders, 255 heads, 63 sectors/track

Old situation:

Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

Device Boot Start End #cyls #blocks Id System

/dev/sda1 * 0+ 491 492- 3951958+ 83 Linux

/dev/sda2 492 521 30 240975 5 Extended

/dev/sda3 0 - 0 0 0 Empty

/dev/sda4 0 - 0 0 0 Empty

/dev/sda5 492+ 521 30- 240943+ 82 Linux swap / Solaris

New situation:

Units = sectors of 512 bytes, counting from 0

Device Boot Start End #sectors Id System

/dev/sda1 * 63 7903979 7903917 fd Linux raid autodetect

/dev/sda2 7903980 8385929 481950 5 Extended

/dev/sda3 0 - 0 0 Empty

/dev/sda4 0 - 0 0 Empty

/dev/sda5 7904043 8385929 481887 fd Linux raid autodetect

Successfully wrote the new partition table

Listing 22. Finalne złożenie macierzy raid1 – remirrorowanie

radekk@raidtest:~$ sudo mdadm --add /dev/md5 /dev/sda5

mdadm: added /dev/sda5

radekk@raidtest:~$ cat /proc/mdstat

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]

md5 : active raid1 sda5[2] sdb5[1]

240832 blocks [2/1] [_U]

[=========>...........] recovery = 45.3% (110400/240832) finish=0.0min speed=22080K/sec

md1 : active raid1 sdb1[1]

3951872 blocks [2/1] [_U]

unused devices: <none>

Listing 23. Weryfikacja numerów uuid urządzeń raid1

radekk@raidtest:~$ ls -l /dev/disk/by-uuid/

razem 0

lrwxrwxrwx 1 root root 9 2008-09-03 18:33 968ac04c-d1bb-448a-bab4-ff5ca00d3d82 -> ../../md1

lrwxrwxrwx 1 root root 9 2008-09-03 18:33 bf27dcfa-12d9-47a2-9985-b4581457d835 -> ../../md5

Page 31: SDJ_12_2008_PL_Symbian OS

12/200830

Programowanie w LinuksieMirrorowanie dysku w Linuksie

www.sdjournal.org 31

operacji gotowi jesteśmy do wykonania re-startu systemu z nowo zbudowanej macie-rzy raid1. Jako że w kroku 5 przygotowa-liśmy nowe opcje do uruchamiania syste-mu z macierzy raid ale nie modyfikowali-śmy domyślnie wybieranej opcji to musi-my pamiętać o wybraniu nowej opcji star-tu systemu z menu grub'a. Aby tego doko-nać to podczas uruchamiania komputera w trakcie wyświetlania komunikatu: Press `ESC to enter the menu... (Listing 19) musi-my nacisnąć klawisz ESC i z wyświetlanych w ramce opcji wybrać wcześniej zdefiniowa-ną: Ubuntu 8.04.1, kernel 2.6.24-19-gene-ric RAID1 HD1.

Ponowne uruchomienie systemu i weryfikacjaJeśli po ponownym uruchomieniu systemu nie pojawiły się błędy, w szczególności ko-munikat o niemożliwości znalezienia filesys-temu głównego (ang. root filesystem) zakoń-czonego klasycznym: kernel panic, to może-my przystąpić do dalszych działań. W przy-padku kiedy jednak błędy takie się pojawią to ponownie restartujemy komputer i tym razem wybieramy domyślną opcję urucho-mienia systemu. W tym momencie system powinien uruchomić się bez macierzy raid z dotychczasowego dysku. Po uruchomieniu systemu wracamy do kroku 5 i weryfikuje-my modyfikowane przez nas pliki (w szcze-gólności na tym etapie popularne są literów-ki). Po zalogowaniu się do systemu z macie-rzy raid za pomocą poleceń: df -k oraz swa-pon -s (Listing 20) weryfikujemy czy nasze dotychczasowe działania są zgodne z ocze-kiwaniami. Jeśli tak to w miejscu wcześniej-szych /dev/sda1 i /dev/sda5 powinniśmy wi-dzieć /dev/md1 oraz /dev/md5. Dla przyzwo-itości proponuję jeszcze sprawdzić czy dane w katalogach domowych naszych użytkow-ników gdzieś się nie zapodziały – oczywiście przed przystąpieniem do konfiguracji dane zostały zapisane na kopię bezpieczeństwa,

prawda? Jeśli wszystko jest w porządku przy-stępujemy do faktycznego mirrorowania na-szych zasobów w kroku następnym.

Dołączenie pierwszego dysku do macierzy - mirrorowaniePrzed dołączeniem partycji pierwszego dys-ku do naszej macierzy należy je przygoto-wać w sposób analogiczny jak to robiliśmy dla drugiego (obecnie aktywnego) dysku. Zadanie realizujemy za pomocą dowolnego programu do partycjonowania, np. takim poleceniem: sudo -s potem sfdisk -d /dev/sdb | sfdisk /dev/sda (Listing 21). Po tej opera-cji oba dyski powinny mieć takie same par-tycje typu Linux raid autodetect/FD. Jeśli we wcześniejszych krokach założyliśmy porząd-kowanie naszej konfiguracji lub chcieliby-śmy dokonać mirrorowania nowego dysku o większej pojemności niż dotychczasowy dysk, to będziemy musieli ręcznie pousta-wiać wszystkie wymagane partycje. Następ-nie za pomocą polecenia: sudo mdadm –add /dev/md5 /dev/sda5 składamy w całość ma-cierzy raid partycje na obu dyskach. Propo-nuję zacząć od partycji swap, ale kolejność jest dowolna. Po dodaniu brakującej partycji do poszczególnych urządzeń md za pomocą polecenia: cat /proc/mdstat możemy zweryfi-kować proces remirrorowania naszej macie-rzy (Listing 22).

Ostatnie porządkiPo zakończeniu mirrorowania dysków pozosta-je nam jeszcze jeden obowiązkowy i jeden nie-obowiązkowy punkt programu. Aby zapewnić automatyczne uruchamianie naszego systemu z nową macierzą raid należy w pliku: /boot/grub/menu.lst odpowiednio ustawić wartość parame-tru: default albo odpowiednio poprzestawiać dopisane opcje uruchamiania tak aby domyśl-ną opcją było uruchamianie z naszej macierzy. Oczywiście możemy chcieć sami za każdym ra-zem ręcznie wybierać odpowiednią opcję uru-chamiania ale na dłuższa metę nie jest to dobre

rozwiązanie. W tym momencie moglibyśmy zakończyć nasze działania gdyby nie opcjonal-ny punkt programu, czyli poprawienie wpisów w /etc/fstab do odwołań UUID. Na początek sprawdzamy mapowanie UUID na urządzenia za pomocą polecenia: ls -l /dev/disk/by-uuid (Li-sting 23). Następnie edytujemy plik /etc/fstab i ponownie zamieniamy wpisy z /dev/md1 czy /dev/md5 na odpowiednie wartości UUID wy-świetlone w poleceniu ls (Listing 24). Na za-kończenie aktualizujemy initramfs poleceniem: sudo update-initramfs -u (lub analogicz-nym - Listing 25). I dla weryfikacji całości mo-żemy jeszcze raz zrestartować nasz komputer.

PodsumowanieMirrorowanie dysku nie jest operacją łatwą i wymaga minimalnej wiedzy dotyczącej par-tycjonowania, konfiguracji systemu czy sa-mej technologii RAID. Jakkolwiek dzięki suk-cesywnie spadającym cenom samych dysków twardych zabezpieczenie się przed utratą da-nych jest coraz dostępniejsze. Niestety jak do tej pory dystrybucje Linuksa doczekały się co najwyżej możliwości instalacji systemu na mir-rorowaniej parze dysków (Ubuntu jak do tej po-ry jeszcze na to czeka). Wciąż brakuje mechani-zmów prostego i łatwego włączenia mirroru w taki sposób aby z procesem tym poradził sobie każdy użytkownik komputera. Na szczęście sys-tem Linuks ciągle się rozwija i miejmy nadzieję niedługo zobaczyć stosowne mechanizmy.

Listing 24. Modyfikacja zawartości pliku konfiguracyjnego /etc/fstab

# /etc/fstab: static file system information.

#

# <file system> <mount point> <type> <options> <dump> <pass>

proc /proc proc defaults 0 0

# /dev/sda1

UUID=968ac04c-d1bb-448a-bab4-ff5ca00d3d82 / ext3 relatime,errors=remount-ro 0 1

#/dev/md1 / ext3 relatime,errors=remount-ro 0 1

# /dev/sda5

UUID=bf27dcfa-12d9-47a2-9985-b4581457d835 none swap sw 0 0

#/dev/md5 none swap sw 0 0

/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto,exec,utf8 0 0

Listing 25. Przebudowanie obrazu ramdysku

radekk@raidtest:~$ sudo update-initramfs -u

update-initramfs: Generating /boot/initrd.img-2.6.24-19-generic

RADOSŁAW KORZENIEWSKIAutor od kilkunastu lat zajmuje się wysokodostęp-

ną infrastrukturą z systemami Linuks oraz Uniks z

czego od ponad dziesięciu lat w pełni profesjonal-

nie pracując na stanowiskach administratora syste-

mów, specjalisty systemów oraz eksperta systemów

informacyjnych w firmie PTK Centertel. Obecnie od-

powiedzialny jest za rozwój, projektowanie i wdra-

żanie systemów krytycznych w Grupie Kapitałowej

TP w obszarze systemów Linuks i Uniks. Z autorem

można skontaktować się poprzez email/jabber: ra-

[email protected]

Page 32: SDJ_12_2008_PL_Symbian OS

12/200832

Rozrywka w LinuksieDuke Nukem

www.sdjournal.org 33

Gra ta, wydana w 2002 roku, jest dziełem firmy Sunstorm Interacti-ve. Na rynku pojawiła się w momen-

cie, w którym każdy zapalony gracz oczekiwał na nieukończonego do tej pory Duke Nukem Forever.

Weszła na rynek bez większego echa, i do dziś niewielu graczy o niej pamięta. Gdyby spojrzeć na to z technicznego punktu widze-nia, to nie ma się czemu dziwić – Duke Nu-kem: Manhattan Project nie wniósł do świa-ta gier niczego innowacyjnego. Posiadał za to coś, czego brakuje wielu tytułom – świetną grywalność.

Na początku była fabułaManhattan Project przenosi nas do współ-czesnego Nowego Jorku, do tytułowego Manhattanu. To właśnie od tej dzielnicy ta-jemniczy Mech Morphix zaczyna podbijanie świata. Jego największą bronią jest toksyczna substancja, która przemienia wszystkie orga-nizmy żywe w krwiożercze bestie, których głównym i właściwie jedynym celem jest za-bicie naszego bohatera.

Wynik tej walki wcale nie jest przesądzony – postać, w którą się wcielamy, to Duke Nu-kem. A to wiele wyjaśnia. Ten uzbrojony po zęby, jasnowłosy mężczyzna, który zapew-ne cały wolny czas spędzał na siłowni, nie za-mierza się poddawać. Czy mu się uda? To za-leży od nas.

Sprawy organizacyjneManhattan Project jest grą komercyjną. Nie-stety, w chwili obecnej, jedynym legalnym sposobem nabycia jej są aukcje – gry nie zna-lazłem w żadnym polskim sklepie interneto-wym.

Jako, że ma ona już przeszło 6 lat, ce-ny nie są wygórowane i oscylują maksymal-nie w granicach 10-20zł. Zakupić możemy wersje anglo- oraz polskojęzyczną, w zależ-ności od sprzedawcy. Wymagania sprzęto-we są niskie. Pod Windows gra chodzi płyn-nie już na komputerze z procesorem Pen-tium III 500MHz, 64MB pamięci RAM oraz kartą graficzną z akceleratorem 3D. Na sys-temie spod znaku pingwina wymagania są wyższe. Najsłabszy komputer z Linuksem, na którym miałem okazję przetestować grę, był wyposażony w procesor Athlon 1GHZ, 384MB pamięci RAM oraz kartę graficzną GeForce 2 MX. Manhattan Project chodził na nim znakomicie w najwyższej rozdziel-czości – 1024x768.

Cedega czy Wine?Zdecydowanie Wine. Pomimo, że na stronie Cedegi jest napisane, iż gra działa bezproble-mowo, to podczas testów nie udało mi się jej w pełni uruchomić pod tą platformą. Testowa-ne wersje silników to – 5.2.7, 5.2.9, 6.0.2 oraz 6.0.5. Z kolei pod Wine (wersji 1.0 oraz 1.1.5) instalacja, jak i samo uruchamianie przebie-ga bezproblemowo. Płynność gry nie pozosta-wiała nic do życzenia, nie występowały żadne przekłamania w wyświetlanej grafice. Słowem – wszystko perfekcyjnie. No, może poza jedną rzeczą – niedziałającym Force Feedbackiem, ale to zmora niemalże wszystkich linukso-

wych graczy używających joypada. Być może w przyszłych wersjach jądra i Wine wsparcie chociaż większości urządzeń zostanie wpro-wadzone. Miejmy nadzieję, bo gra z wykorzy-staniem tej technologii byłaby z całą pewno-ścią przyjemniejsza.

Przedstawienie świataW całym Manhattan Project wątek fabular-ny jest mocno ograniczony. Można zaryzy-kować stwierdzenie, że w założeniu był on jedynie pretekstem do zabijania hordy prze-ciwników, czymś, czym gracz nie będzie się przejmował w ogóle. I tak jest w rzeczywisto-ści. Podczas gry zupełnie nie obchodził mnie los ratowanego świata, czy historia samego Duke'a. Tu liczy się tylko sprawność palców i szybki refleks.

Świat gry przedstawiony jest z perspektywy trzeciej osoby. Kamera nie jest jednak umiesz-czona za bohaterem, ale obok niego w sposób, który możemy zaobserwować na Rysunku 1, 2 lub 3. Ruchy Duke'a są ograniczone głównie do poruszania się w lewo bądź w prawo; rzadko będziemy mogli wejść wgłąb ekranu lub w dru-gą stronę. Takie czynności możemy wykony-wać jedynie w miejscach ściśle zaplanowanych przez twórców. Podobieństwo do klasycznego Mario, Super Tuksa, czy Jazz Jackrabbit (swoją drogą znakomita platformówka) jest tu jak naj-bardziej wskazane. Manhattan Project jest od tych gier bardziej dynamiczny, ma o wiele lep-szą, trójwymiarową grafikę, dźwięk oraz znako-mitego bohatera, którego zadaniem (oprócz ra-towania świata) jest uwalnianie pięknych ko-biet z rąk obcych. Wszystkie te elementy two-rzą niepowtarzalny, błogi klimat, który sprawia, że każdy, kto lubi platformówki, będzie mógł z przyjemnością i bez zaangażowania zatopić się w ponure dzielnice Nowego Jorku.

RozgrywkaGra jest bardzo dynamiczna. Już kilkanaście sekund po jej rozpoczęciu natkniemy się na

Duke Nukem

Anarchy Online i Red Faction to gry niewątpliwie złożone. W życiu gracza są jednak takie chwile, w których zamieniłby on każdy skomplikowany tytuł na coś, co nie wymaga zbyt dużo myślenia, ale daje dużo rozrywki. Taki jest właśnie Duke Nukem: Manhattan Project.

Dowiesz się:• Jak zapewnić sobie kilka godzin dobrej roz-

grywki.

Powinieneś wiedzieć:• Jeżeli grałeś w poprzednie wersje to dobrze,

jeżeli nie to wszystko przed Tobą.

Poziom trudności

Manhattan Project

Page 33: SDJ_12_2008_PL_Symbian OS

12/200832

Rozrywka w LinuksieDuke Nukem

www.sdjournal.org 33

pierwszych przeciwników. Na początku wal-czyć będziemy ze zmutowanymi, prostymi do pokonania świniami, jednak wraz z rosną-cym postępem w grze, przeciwnicy będą co-raz trudniejsi do pokonania. Łącznie natknie-my się na 25 typów wrogo nastawionych po-tworów. Na ich zróżnicowanie nie powin-niśmy narzekać – część z nich strzela, inni walczą wręcz, jeszcze inni stosują elementy sztuk walki, czy plują toksycznym kwasem. Niekiedy napotkamy się na zwykłe zwierzę-ta, czy owady. Zwykle po jakimś czasie wcho-dzą one do kałuży zielonkawej substancji, po czym zmieniają się w dobrze znane nam po-twory. Do walki z nimi Duke ma do dyspo-zycji siedem, luźno wzorowanych na uzbro-jeniu z Duke Nukem 3D, typów broni – pi-stolet, shotgun, karabin maszynowy, Glopp Gun, wyrzutnia rakiet, granaty oraz miotacz plazmy. Najciekawszą z nich jest Glopp Gun posiadająca działanie odwrotne do działania kałuż kwasu; zamienia potwory w bezbron-ne, nieatakujące nas zwierzęta. Te z kolei mo-żemy potraktować butem, który jest ostatnią, ósmą możliwością ataku. I choć uzbrojenie zapowiada się zachęcająco, bronią najczęściej używaną jest shotgun. Nie zużywa on wie-le amunicji, a zwykle wystarczą dwa, może trzy strzały, by rozprawić się z większą ilością przeciwników. Aby ukończyć grę, musimy przejść przez 9 rozdziałów, przy czym każdy rozdział dzieli się na cztery poziomy. Głów-nym celem każdego poziomu jest rozbrojenie

bomby, uwolnienie pięknej dziewczyny, zna-lezienie klucza do drzwi i opuszczenie loka-cji. Proste jak konstrukcja cepa. Wyjątek sta-nowią ostatnie poziomy poszczególnych roz-działów, w których to czeka na nas pokonanie bossa. Ponadto, w każdej lokacji czeka na nas znalezienie 10 znaczków Nuke. Dzięki nim bohater ma między innymi więcej życia, mo-że nieść więcej amunicji oraz zadawać więk-sze obrażenia. Na odnalezienie czekają tak-że tzn. secret area, czyli bonusowe, trudne do odkrycia miejsca, w których zwykle jest sporo amunicji oraz apteczek. Gracze lubiący odnajdywanie sekretnych lokacji oraz przed-miotów podczas gry z pewnością nie będą za-wiedzeni.

Niestety, w Manhattan Project zabrakło try-bu multiplayer, który mógłby pozwolić grze dłużej przetrwać w naszej pamięci. Szczególnie ciekawie grałoby się w trybie cooperative, gdzie wspólnie ze znajomym przy jednym kompu-terze bądź przez Internet przemierzalibyśmy świat Nowego Jorku.

Grafika & udźwiękowienieGrafika w grze prezentuje się dobrze. Cho-ciaż odstaje od nowych produkcji, jak na plat-formówkę jest wystarczająca. Wybuchy, efek-

ty działania broni, potwory czy wygląd same-go Duke'a cieszą oko. Na monotonność loka-cji także nie powinniśmy narzekać – miejsca, które przyjdzie nam odwiedzić są zróżnico-wane. Zwiedzimy między innymi podziem-ne, zniszczone stacje metra, dachy wieżow-ców, chińską dzielnicę, kosmiczne laborato-rium Morphixa z obniżoną grawitacją, a na-wet nocny klub. I choć tekstury nie są zbyt szczegółowe, a postacie w największym przy-bliżeniu kanciaste, to grafika sprawia wraże-nie dopracowanej. Szczególnie jak na tytuł, którego akcja dzieje się generalnie w środo-wisku dwuwymiarowym. Tak, poruszać bę-dziemy się w dwóch wymiarach, jednak sa-ma grafika jest jak najbardziej trójwymiaro-wa. Kamera dynamicznie zmienia swe poło-żenie, dzięki czemu Manhattan Project pre-zentuje się bardziej okazale, jednak nie zmie-nia to faktu, że grając mamy wrażenie, cho-dzenia po wyznaczonym przez twórców, nie-widzialnym, dwuwymiarowym sznurku.

Muzyka i dźwięki ani nie grzeją, ani nie ziębią. W tle słyszymy dynamiczne, gitaro-we, zagrzewające do walki utwory. Do ich wykonania nie można się przyczepić, ale żad-nych rewelacji tutaj nie znajdziemy – po pro-stu kawał dobrej roboty. Dźwięki wydawane

Duke Nukem – historiaWśród dziesiątki najpopularniejszych komputerowych bohaterów znalazłoby się z pewnością miejsce dla Duke'a. Jest on legendą, głównie za sprawą wydanej w 1996 roku trójwymiarowej strzelaniny Duke Nukem 3D oraz Duke Nukem Forever – gry, która według oficjalnych informacji jest w produkcji już dziesiąty rok. Nie każdy wie, że historia Księcia (ang. Duke} sięga roku 1991. Wtedy to została wydana gra Duke Nukem: Shrapnel City, platformówka z Dukem w roli głównej. Na PC ukazała się jeszcze w 1993 roku kontynuacja nazwana po prostu Duke Nukem 2. Do roku 2005 ukazało się aż 11 gier opowiadających o przygodach jasnowłosego superbohatera. Nieste-ty, wszystkie na platformy inne, niż komputer.

Rysunek 1. Glopp Gun podczas działania

Rysunek 2. A tu miotacz plazmy

TipsyA tutaj coś dla tych, którym gra sprawia za dużo trudności – garść tipsów. Wpisujemy je po naciśnięciu tyldy: [~].

• toggle g_p_god – nieśmiertelność• give all – wszystkie przedmioty• give ammo – amunicja • give jetpack – jetpack • give forcefield – forcefield • give keys – wszystkie klucze• give nuke – 10 nuke• kill – samobójstwo• camera camera – pozwala sterować ka-

merą• camera player – domyślne ustawienie

kamery

Page 34: SDJ_12_2008_PL_Symbian OS

12/200834

Rozrywka w Linuksie

przez otoczenie również trzymają klasę. Są takie, jakie być powinny. Bardzo miłym do-datkiem jest za to głos głównego bohatera. Usłyszeć go możemy zwykle podczas zabija-nia przeciwników oraz przy wejściach do no-wych lokacji, gdzie Duke komentuje to, co się w danym momencie dzieje. Cięte teksty w stylu: Rest in pieces, Half man, half animal. All dead, czy My gun is bigger then yours zna-komicie wpasowują się w klimat gry. Jon St. John odpowiedzialny za nie, znów pokazał, że wśród komputerowych mięśniaków Duke Nukem rządzi.

Minusy, minusy...Największą bolączką Manhattan Project jest wspomniany wcześniej brak trybu multi-player oraz długość gry. Przejście całej wraz z pokonaniem ostatecznego bossa zajęło mi niecałe 6 godzin. Aż chciałoby się grać. Zmiana poziomu trudności na wyższy i przechodzenie gry od nowa teoretycznie jest połowicznym rozwiązaniem do czasu, gdy zauważymy, że poziom Hard wcale nie jest taki trudny. Bardziej doświadczonym gra-czom polecam od razu ten poziom trudno-ści. Na normalnym oraz łatwym gra nie sta-

nowi większego wyzwania, a fakt, że Duke w rękach bardziej wprawnej osoby staje się prawie nie do zabicia (nawet podczas walki z bossami) może powodować szybkie znuże-nie grą. Grywalności nie dodaje także linio-wość rozgrywki. Cały czas poruszamy się w miejscach ściśle zaplanowanych przez twór-ców. Nie istnieją także różne drogi prowa-dzące do celu, szczególnie w późniejszych, zamkniętych pomieszczeniach (w niektó-rych otwartych lokacjach istnieje wątpliwa możliwość przejścia po ziemi bądź przeska-kiwania po umieszczonych niewiele wyżej balkonach). Zapewne ogranicza to w jakiś sposób możliwość zgubienia się w grze, jed-nak na tym polu również nie jest różowo; kil-ka razy zdarzyło mi się, że ominąłem niepo-zorną drabinę bądź nie zauważyłem drzwi i musiałem wracać do opustoszałych miejsc w ich poszukiwaniu. Takie momenty były bardzo irytujące, bo miałem ochotę iść dalej, zabijać zmutowane potwory, a nie błądzić w poszukiwaniu niezbędnego do przejścia da-lej Blue Keya.

PodsumowanieTak, zabijanie zmutowanych potworów to nie-wątpliwie rzecz, która w całej grze jest najlep-sza. Pozostaje pytanie, czy warto fatygować się dla tych kilku godzin rozrywki? Myślę, że tak. Rozrywka jest niewątpliwie przednia i da-je graczowi dużo radości. Duke Nukem: Man-hattan Project jest także niewątpliwie swe-go rodzaju perełką na rynku gier. Stanowi on znakomitą odskocznię od złożonych strategii, gier MMORPG, czy symulacji powracając do korzeni, do czasów, gdy zadaniem niemalże wszystkich gier było zrelaksowanie gracza w sposób prosty i przyjemny. Czas nieskompli-kowanych, dwuwymiarowych gier platformo-wych zdecydowanie minął. Czy Ty także uwa-żasz, że niesłusznie?

ŁUKASZ OLENDERAutor zajmuje się Linuksem od 4 lat rozpowszech-

niając go w lokalnych szkołach. Hobby to wszelkie

aspekty związane z Debianem, Linuksem w ogól-

ności oraz gra na klarnecie.

Kontakt z autorem: [email protected]

Rysunek 3. Wyrzutnia rakiet też daje rade

Rysunek 4. No wychodź! Dalej! Rysunek 5. Gdybyś tylko była mniej kanciasta...

Page 35: SDJ_12_2008_PL_Symbian OS
Page 36: SDJ_12_2008_PL_Symbian OS

12/200836

Rozrywka w LinuksieRed Faction

www.sdjournal.org 37

Odpowiedź na to pytanie zależeć bę-dzie jedynie od tego, jaki gatunek gier preferujemy. Jeżeli choć trochę lubi-

my grać w FPS-y, a gra ta jest nam znana jedy-nie ze słyszenia, bez obaw o jakość rozrywki możemy po nią sięgnąć, Red Faction jest bo-wiem FPS-em.

Bardzo dobrym FPS-em, na swój sposób od-krywczym i przełomowym, głównie dzięki technologi Geo-Mod, która pozwala na niszcze-nie elementów świata gry. Ale od początku.

FabułaFabuła gry przenosi nas w odległą przyszłość. Mars został skolonizowany przez ludzkość, a obecnie znajduje się tam kompleks kopalń megakorporacji Ultor, zajmującej się wydo-bywaniem cennego minerału zwanego No-achitem. Gra opowiada historię Parkera, młodego i ambitnego górnika, który wyleciał na Marsa w poszukiwaniu przygody i chęci usamodzielnienia się. Wkrótce po przybyciu okazało się jednak, że nie wszystko jest tak, jak obiecywano. Wysokie pensje wcale nie są tak wysokie, a standard życia każdego z gór-ników jest bardzo niski. Spanie w obskur-nych, śmierdzących barakach, minimalne racje żywnościowe a także traktowanie pra-cowników przez przełożonych zupełnie od-biega od tego, czego Parker się spodziewał le-

cąc tutaj. Co więcej – możliwość powrotu na Ziemię w zasadzie nie istnieje od czasu, gdy swoje działania na szeroką skalę rozpo-częła tytułowa Czerwona Frakcja –ugrupo-wanie rebeliantów walczących z Ultorem, w skład której wchodzi także Parker. Czer-wona Frakcja, na której czele stoi tajemnicza EOS, miała być wyzwoleniem dla górników oraz zapewnić im wzajemne wsparcie w wal-ce z szeregami najemników Ultoru. Tak jed-nak się nie stało – tysiące pracowników Ulto-ru zostało uwięzionych w marsjańskich wię-zieniach, zaś część z nich podczas walk stra-ciła życie. Jednym z nielicznych, którzy prze-trwali jest właśnie Parker. Jak nietrudno się domyśleć, my wcielimy się w niego, by za-silić szeregi Czerwonej Frakcji, rozwikłać zagadkę tajemniczej choroby szerzącej się wśród górników i ostatecznie uwolnić się z Marsa. Ale najpierw musimy zaopatrzyć się w samą grę.

Skąd wziąć?Na to pytanie nie ma prostej odpowiedzi. Red Faction nie dostaniemy już w zwykłych skle-pach, za wyjątkiem sieci różnych supermarke-tów, gdzie od czasu do czasu pojawia się ona na półkach kosztując w granicy 20zł. W chwi-li premiery gra kosztowała 49zł i w takiej ce-nie występuje do chwili obecnej w interneto-wym sklepie firmy LEM – polskiego dystry-butora gry. Niestety nie jest już ona dostępna tam w sprzedaży, występuje jedynie jako pro-dukt archiwalny. Zamówić możemy ją za to na stronie http://www.mediago.pl , gdzie kosztuje 37zł. Po dużo niższej cenie możemy zakupić

oryginał na różnorodnych aukcjach interneto-wych – w chwili pisania tego tekstu, Red Fac-tion jest dostępny do kupienia na jednej z nich za 15zł. Doliczając koszty przesyłki wynoszą-ce 6,50zł otrzymujemy śmiesznie niską cenę wynoszącą 21,50zł.

Kilka spraw technicznychRed Faction uruchamiane pod Windows do działania potrzebuje minimum komputera z procesorem 400MHZ, kartą graficzną z 8 MB pamięci RAM oraz 64MB zwykłej pa-mięci RAM. Wymagania linuksowe, z racji tego, że jest to gra projektowana pod Win-dows są nieco wyższe, ale nadal niewygóro-wane, nawet wśród posiadaczy starych kom-puterów.

Red Faction chodzi poprawnie już na pro-cesorze taktowanym z zegarem 600MHZ, 128MB pamięci RAM oraz na karcie gra-ficznej GeForce mającej na pokładzie 32 MB RAM. Z kolei by móc w pełni cieszyć się grą w wyższej rozdzielczości – optymalnie 1280x1024, potrzebować będziemy kom-putera z procesorem minimum 1GHZ, 256 MB RAM i kartę graficzną minimum GeFor-ce 2 z 64 MB RAM. W zestawieniu z wyma-ganiami nowszych tytułów nikt nie powi-nien mieć wątpliwości, że wymagania Czer-wonej Frakcji są naprawdę niewielkie.

Wine Czy Cedega?Przed tym wyborem staniemy będąc już szczęśliwym posiadaczem gry. Testowałem grę na obu platformach i gra chodzi zdecy-dowanie lepiej pod Cedegą. Testowane wer-sje Cedegi to 5.29 oraz 6.05. Różnice między nimi są niezauważalne, prędkość działania gry jest zawsze bardzo dobra. Stabilność nie pozostawia nic do życzenia, ogółem mówiąc – gra chodzi bezbłędnie.

Natknąć się możemy jedynie na proble-my z niepełnym wyświetlaniem intra oraz reklam producenta w grze, ale są to drob-

Red Faction

Red Faction – to właśnie ta gra jest tematem niniejszego artykułu. Czy pomimo upływu ponad siedmiu lat od daty premiery, jest ona warta poświęconego jej czasu?

Dowiesz się:• Co gra zawiera;

• Gdzie można ją kupić;

• O wadach i zaletach gry;

• O wymaganiach systemowych.

Poziom trudności

Druga odsłona

Page 37: SDJ_12_2008_PL_Symbian OS

12/200836

Rozrywka w LinuksieRed Faction

www.sdjournal.org 37

nostki nie wpływające absolutnie na ogólne wrażenie. Z kolei pod Wine gra działa rów-nie szybko, ale nie udało mi się sprawić, by podczas rozgrywki z głośników wydobył się jakikolwiek dźwięk. Powodów takiego sta-nu rzeczy może być mnóstwo, lecz faktem jest, że poświęcając kilka cennych godzin na rozwiązanie problemu nadal pozostałem w punkcie wyjścia. Niestety, podobnie wyglą-da sprawa u innych graczy. Zadeklarowanym użytkownikom Wine pozostaje tylko cze-kać i mieć nadzieję, że problem ten zosta-nie rozwiązany w przyszłych wersjach tego nie-emulatora.

Witamy na MarsieInstalacja Red Faction przebiega bezproble-mowo. Po uruchomieniu gry i przejściu tre-ningu lądujemy w marsjańskiej kopalni. Tam będąc świadkiem brutalnego pobicia jed-nego z górników chwytamy za broń. Od tej chwili rozpoczyna się trwająca przez kilka początkowych poziomów nieco monotonna rozgrywka, która polegać będzie na zabija-niu szeregów ochroniarzy Ultoru. Urozma-icenia całej grze dodaje rozsławiony, autor-ski silnik Geo-Mod, który, jak już wspomnia-łem, pozwala na modyfikację rzeźby otacza-jącego nas terenu.

W praktyce największe wrażenie robi on właśnie w początkowych poziomach, gdy je-steśmy w kopalniach. Korzystając z ładun-ków wybuchowych możemy przedostać się przez niektóre lokacje na skróty omijając znaczną liczbę przeciwników. Innym razem służy do odnalezienia dodatkowego ekwi-punku, a wszystko to jest zrobione tak umie-jętnie, że korzystanie z dobrodziejstw Geo-Moda daje sporą satysfakcje i frajdę. Cza-sem trzeba chwilkę pomyśleć nad tym, w ja-ki sposób można wykorzystać otoczenie, by walczyło się łatwiej.

Niszczenie mostów po których przecho-dzą właśnie wrogowie, przebijanie się przez beton wokoło pancernych, zablokowanych drzwi, czy burzenie ogromnych skalnych ścian z pomocą specjalistycznego pojazdu to tutaj codzienność. Po przejściu przez kilka początkowych etapów zaczniemy wkraczać w coraz bardziej odmienne lokacje – biu-ra, laboratoria oraz apartamenty pracowni-ków Ultoru.

Sama rozgrywka jest zróżnicowana. Wprawdzie większą część gry spędzimy na konsekwentnym zabijaniu coraz to silniej-szych wrogów, jednak znajdują się też mi-sje, do których podejść będziemy musie-li w zupełnie inny sposób. Przekradanie się przez zapełnione ludźmi biura Ultoru, pły-wanie łodzią podwodną, przemieszczanie się pod ostrzałem snajperów czy też uciecz-ka jeepem to zaledwie czubek góry lodowej wyzwań, które na nas czekają. Niestety, ca-ła rozgrywka prowadzona jest liniowo; gracz

praktycznie nie ma możliwości wyboru róż-nych ścieżek. Geo-mod sytuacji nie ratuje – stanowi jedynie ciekawe urozmaicenie i sposób na łatwiejsze pokonywanie przeciw-ników, ale sensownie wykorzystany może być tylko w miejscach zaplanowanych przez autorów.

Chciałoby się rzec – drzemie w nim nie-wykorzystany potencjał. Bolączką jest tak-że sztuczna inteligencja przeciwników. Ni-by chowają się tu i ówdzie, jednak po chwili grania widać, że jest to bardzo schematycz-ne; niekiedy dochodzi nawet do momen-tów, w których wiemy, jak dokładnie zacho-wa się nasz oponent. I nie jest to tylko cecha przypisana jednemu z typów przeciwników. Wszyscy z nich, no może z wyjątkiem nie-których potworów, z którymi także przyj-dzie nam powalczyć, zachowują się iden-

tycznie. Różnią się jedynie posiadaną bro-nią, wyglądem, rodzajem opancerzenia oraz ilością życia.

UzbrojenieZapewne przyznacie, że niczym byłby FPS bez zestawu śmiercionośnych broni. Na tym polu Red Faction wypada całkiem nieźle. Do dyspozycji mamy piętnaście standardowych, lekko stylizowanych na klimaty science-fic-tion broni. Najczęściej przyjdzie nam wal-czyć za pomocą strzelby automatycznej, cięż-kiego karabinu maszynowego oraz pistole-tu. Jest także snajperka, miotacz płomieni oraz miny, granaty, paralizator, a nawet tar-cza – i to nie wszystko. Ogromną satysfakcję daje używanie dwóch rodzajów wyrzutni ra-kiet oraz wspomnianych wcześniej ładun-ków wybuchowych – słowem wszystkiego,

Rysunek 1. 3... 2... 1.... booom!:)

Red Faction 2W kwietniu 2003 roku światło dzienne ujrzał sequel Red Faction, nazwany po prostu Red Faction 2. Gra, w przeciwieństwie do poprzednika, okazała się być zupełnym niewypałem. Wydana najpierw na PlayStation 2, na PC była tylko zwykłą konwersją z konsoli. Co gorsze – wyczekiwany tryb multiplayer został usunięty i zastąpiony możliwością rozegrania me-czu z botami, a Geo-mod jaki był, taki pozostał. Krokiem naprzód była jedynie ciut ładniej-sza grafika.

Red Faction: GuerrillaObecnie w produkcji jest trzecia część serii Red Faction, której akcja dziać się będzie 50 lat po wydarzeniach przedstawionych w pierwszej odsłonie. Z planowanych innowacji wymie-niane są:

• widok akcji z perspektywy z trzeciej osoby;• praktycznie nieograniczona możliwość deformacji środowiska;• otwarte przestrzenie walk;• bardziej rozbudowany tryb multiplayer.

Gra powinna się ukazać już przed końcem marca 2009.

Page 38: SDJ_12_2008_PL_Symbian OS

12/200838

Rozrywka w Linuksie

czym możemy choć trochę zniszczyć zapa-dające się sufity, ściany czy podłogę. Jednak królem wśród broni dostępnych w grze jest z pewnością Rail Driver – miotacz magnetycz-ny. Wystrzela on pociski z ogromną siłą, któ-re są zdolne przebić ściany. Do Rail Drivera dołączone jest także luneta, która przy po-mocy podczerwieni potrafi namierzyć prze-ciwnika będącego na przykład za drzwiami. Jak to wygląda w praktyce możemy zobaczyć na Rysunku 2.

PojazdyW Red Faction mamy do dyspozycji pięć po-jazdów zmechanizowanych: uniwersalny po-jazd terenowy (przypominający nieco Jeepa), myśliwiec, transporter opancerzony, kom-bajn górniczy oraz okręt podwodny. Zwykle ich użycie będzie konieczne do przejścia mi-sji, lecz czasem będzie jedynie opcjonalne. Same pojazdy występują w grze niezbyt czę-sto, a tereny są na tyle ograniczone, że korzy-stanie z nich przypomina najczęściej przeje-chanie jednym z tuneli z punktu A do punk-tu B. Mimo to są one bardzo miłym dodat-kiem, szczególnie myśliwiec oraz okręt pod-wodny.

Niesmak pozostawia fizyka gry. To, że gra-witacja na Marsie jest nieco niższa i Parker potrafi biegać bardzo szybko i wykonywać ogromne skoki jest jeszcze do zaakceptowa-

nia, ale sposób poruszania się którymś z po-jazdów wygląda śmiesznie, szczególnie pod-czas skręcania.

Problemem są także różnorakie przeszko-dy, z którymi interakcja jest dość słaba. Nie raz zdarza się, że rozpędzony pojazd zatrzymuje się w miejscu z powodu niewielkiego kamie-nia leżącego na drodze. Nie są to błędy szcze-gólnie rażące, aczkolwiek warto o nich wspo-mnieć.

Grafika i DźwiękGrafika, porównując Red Faction z nowymi tytułami, prezentuje się słabo. Gdyby cof-nąć się jednak do roku 2001, dostalibyśmy tytuł z bardzo dobrą oprawą graficzną. Po prostu co jak co, ale grafika w grach kompu-terowych traci swą jakość w zasadzie z dnia na dzień.

Jednak – wracając z powrotem do końców-ki roku 2008 – w zestawieniu z popularnymi grami FPS dostępnymi na licencji Open So-urce, Red Faction wciąż trzyma klasę. Mno-gość zróżnicowanych wyglądem przeciwni-ków, dopracowane (większość, ale nieste-ty nie wszystkie) poziomy, pojazdy, bronie czy same tekstury nadal mogą się podobać. Przyczepić się można do zróżnicowania lo-kacji. Większą część czasu spędzimy w kopal-niach oraz marsjańskich podziemiach, tune-lach i jaskiniach. Pozostałe miejsca stanowią

co najwyżej 40% gry. No tak, w końcu jakby nie patrzeć jesteśmy w marsjańskich kopal-niach. Osobne słowa należy poświęcić opra-wie dźwiękowej.

Odgłosy i efekty dźwiękowe są takie, jakie być powinny: naturalne, porządnie wykona-ne. Słowem – kawał dobrej roboty. Muzyka również trzyma poziom umiejętnie podsy-cając emocje podczas grania. Szkoda tylko, że w większości czasu jest nieobecna; poja-wia się zwykle jedynie w kluczowych mo-mentach.

MultiplayerOprócz standardowego trybu dla jednego gracza, producent gry dał nam możliwość pojedynkowania się z innymi graczami w trybie multiplayer. Biorąc pod uwagę tech-nologię Geo-mod, powinniśmy dostać coś re-wolucyjnego.

I niewiele brakuje, by tak właśnie było! Co prawda dostajemy tylko trzy najbardziej zna-ne tryby – Deadmatch, Team Deadmatch i Capture the flag, ale możliwość niszczenia ścian, mostów i robienia dziur w podłodze nadaje rozgrywce całkiem inny wymiar. Po-dobnie jak możliwość używania Rail Drive-ra, co w zasadzie eliminuje kamperów czyha-jących na nas za ścianą czy skrzynią. Multi-player w Red Faction to coś, w co każdy sza-nujący się fan gier FPS powinien zagrać. Roz-rywka jest naprawdę przednia. Żadne sło-wa nie oddadzą emocji, które towarzyszyć nam będą w momencie zawalania się grun-tu pod nogami pod wpływem rakiet przeciw-nika, lub radości, jaka daje wykopanie sobie małego tunelu z jednej części mapy do dru-giej. To trzeba spróbować, tym bardziej, że w chwili obecnej wciąż możemy bez większych problemów znaleźć w Internecie ludzi chęt-nych do gry.

PodsumowanieGrę jak najbardziej polecam. I choć z powyż-szego tekstu wynikać może, że ma ona mnó-stwo błędów, to są to błędy na tyle niewiel-kie, że przymykając na nie oko możemy bar-dzo miło spędzić czas.

Tytuł ten warto odświeżyć także dlatego, że w zaawansowanej produkcji jest trzecia część gry i niebawem wejdzie na sklepowe pół-ki. Czy okaże się hitem, tak jak swego czasu pierwsza część Red Faction, czy średniej klasy produktem, jak jego kontynuacja? Czas poka-że. Ja tymczasem żegnam się z Wami, drodzy Czytelnicy; do usłyszenia za miesiąc!

ŁUKASZ OLENDERAutor zajmuje się Linuksem od 4 lat rozpowszech-

niając go w lokalnych szkołach. Hobby to wszelkie

aspekty związane z Debianem, Linuksem w ogól-

ności oraz gra na klarnecie.

Kontakt z autorem: [email protected]

W Sieci

• http://www.lem.com.pl/pc-fpp/red-faction.html?cPage=0&k• http://www.mediago.pl/• http://appdb.winehq.org/objectManager.php?sClass=version&iId=4716

Rysunek 2. Rail Driver w akcji

Page 39: SDJ_12_2008_PL_Symbian OS
Page 40: SDJ_12_2008_PL_Symbian OS

12/200840

Rozrywka w LinuksieHedgewars – recenzja

www.sdjournal.org 41

Dla osób nie znających Wormsów krótkie wyjaśnienie odnośnie samej rozgrywki. Otóż Hedgewars jest grą

po części strategiczną, po części zręcznościo-wą i chociaż zdania są podzielone, nie sposób powiedzieć, który z tych gatunków ma w grze większy udział. Wynika to z faktu, iż nie pla-nując własnych posunięć i nie przewidując ru-chów przeciwnika trudno myśleć o wygranej. Z drugiej jednak strony, mając problemy w od-dawaniem celnych strzałów również nie ma co liczyć na zwycięstwo. W grze sterujemy sym-patycznie wyglądającymi jeżami, które z nie-znanych powodów postanowiły podzielić się na drużyny i stanąć przeciw sobie. Na plan-szy może się ich znajdować aż 18 sztuk. Roz-grywka podzielona jest na tury, każda druży-na w czasie swojej tury może wykonać ruch jednym jeżem. Nasi dzielni podopieczni po-trafią chodzić, skakać, korzystać z liny do zdo-bywania niedostępnych szczytów i oczywiście strzelać. Jeśli zaś mowa o strzelaniu, to podob-nie jak w Wormsach mamy do dyspozycji po-kaźny arsenał, a w nim m.in. bazookę, pistolet, strzelbę, moździerz, rozmaite granaty, dwa ro-dzaje nalotów, zrzucające na przeciwnika zwy-kłe bomby albo miny, a nawet UFO. Oprócz tego możemy korzystać z całej masy narzędzi ułatwiających przemieszczanie się po planszy,

w tym liny, spadochronu, teleportacji, mło-tu pneumatycznego czy palnika. Nie zabra-kło również tak znanych z pierwowzoru sytu-acji jak tzw. nagła śmierć (ang. sudden death), to znaczy stopniowego zatapiania się pod wo-dę całej planszy po upływie określonego cza-su. Nie muszę chyba dodawać o ile bardziej emocjonująca staje się gra, jeśli poza planowa-niem rozmieszczenia własnych jeży i celnym celowaniu musimy się dodatkowo skupić na tym, aby stopniowo przemieszczać się na co-raz to wyższe miejsca na mapie, unikając tym samym zatopienia.

Jeśli znudzi nas klasyczna rozgrywka, mo-żemy zdecydować się na tryb fortów. Różni się on tym od zwyczajnej rozgrywki, że miej-sce plansz zajmują forty, po jednym dla każdej z drużyn. Co za tym idzie liczba drużyn w tym trybie jest ograniczona do dwóch, trudno się te-mu dziwić jeśli wyobrazimy sobie sytuację trze-ciego gracza którego fort znajdowałby się przy-padkiem pośrodku planszy, pomiędzy fortami przeciwników.

Dużą zaletą gry jest jej wysoka konfigurowal-ność. Gracz może samodzielnie tworzyć sche-maty uzbrojenia, dając graczom do dyspozy-cji np. tylko niektóre bronie, możemy także zdecydować ile razy będzie można użyć każ-dej z nich. Bardzo przyjemnym zaskoczeniem jest możliwość samodzielnego zdefiniowania używanych w grze klawiszy, dodatkowo, każ-da drużyna może posiadać własne ustawiania sterowania. Kolejnym ciekawym pomysłem jest automatyczne nagrywanie przebiegu ostatnie-go pojedynku. Przygotowując się do walki mo-

żemy oczywiście zmienić takie cechy rozgryw-ki jak ilość punktów życia jeży, czy czas trwa-nia tur.

Wybierając planszę możemy zdecydować się na losowo wygenerowany teren, który później może stać się wyspą skarbów, zimnym miej-skim centrum, czy też soczyście zieloną łąką; zależnie od tego jaki wystrój wybierze dla nas program. Gdy znudzą nam się już powtarzające się dekoracje możemy pokusić się o pojedynek na specjalnych mapach, które są niczym innym jak obrazkami na których toczy się rozgrywka, każda mapa wyglądać będzie zawsze tak samo przez co jednak wcale nie staje się mniej cieka-wa. Możemy tutaj walczyć na pędach bambusa czy też kaczuszkach pływających w wannie peł-nej piany. Autorzy umieścili w grze dwie misje treningowe pozwalające nam bardziej wprawić się w posługiwaniu takim broniami jak strzelba i bazooka. W Hedgewars możemy grać z kom-puterem i przyjacielem przy jednym kompute-rze, jak również za pośrednictwem sieci LAN lub Internet. Obsługa programu jest dość in-tuicyjna i nie powinna stwarzać problemów. Na chwilę obecną Hedgewars dostępny jest w ośmiu językach, w tym po polsku.

Pragnę zaznaczyć, znając termin publika-cji tejże recenzji, iż do czasu jej pojawienia się w gazecie, opisywana gra najprawdopodobniej znacząco się zmieni. Nie mam tutaj na myśli je-

Hedgewars

Hedgewars to gra mająca na celu stworzenie otwartego odpowiednika legendarnych Wormsów. Prawdę mówiąc wręcz zaskakujące jest podobieństwo do oryginału, tak wygląd interfejsu jak i przebieg rozgrywki, na fizyce gry kończąc do złudzenia przypominają Wormsy. Warto jednak powiedzieć jeszcze kilka słów.

Dowiesz się:• Wiele na temat jednego z bardziej interesują-

cych otwartych klonów Wormsów.

Powinieneś wiedzieć:• Jak uruchamiać programy w systemach z ro-

dziny GNU/Linux;

• Jak poruszać się po systemie za pomocą termi-

nala (dla użytkowników zamierzających kompi-

lować program ze źródeł).

Poziom trudności

Recenzja

Rysunek 1. Hedgewars – okno gry

Page 41: SDJ_12_2008_PL_Symbian OS

12/200840

Rozrywka w LinuksieHedgewars – recenzja

www.sdjournal.org 41

dynie poprawek błędów, a nowe rzeczy które mogą się w grze pojawić. Aby trochę nakreślić ewentualne zmiany, przedstawię najważniej-sze. Przede wszystkim nowe menu, od wersji 0.9.7, autorzy planują wprowadzić do gry nie-malże całkowicie przebudowane menu. Znacz-nie przyjemniejsze dla oka, o bardziej koloro-wym, kreskówkowym wyglądzie. Jednak nie tylko wygląd będzie jego atutem, ponieważ ma ono być również znacznie bardziej konfi-gurowalne. Wśród planowanych zmian znajdu-je się m.in. możliwość ustawienia czasu wybu-chu znajdujących się na planszy min. Będziemy mieli możliwość ustawienia np. wybuchu na-tychmiastowego, znanego z pierwszych, oficjal-nie wydanych Wormsów dla systemu operacyj-nego DOS (miny wybuchające po pewnym cza-sie pojawiły się w Worms+/Worms Reinforce-ments). Kolejną konfigurowalną opcją będzie czas po którym zaistnieje wspomniana wcze-śniej tzw. nagła śmierć (ang. sudden death).

Do zmian graficznych można zaliczyć rów-nież wprowadzenie przez autorów rozmaitych nakryć głowy dla naszych jeży. Przypomina to trochę sytuację, której mogliśmy doświadczyć grając w oryginalne Worms Armageddon/World Party, gdzie, po wybraniu określonych broni, np. topora, nasz podopieczny zakładał na głowę rogaty hełm wikinga. W Hedgewars twórcy idą, można powiedzieć, o krok dalej.

Otóż tworząc nową drużynę (lub edytując już istniejącą) będziemy mieli możliwości nałoże-nia na nasze jeże dowolnych czapeczek, dla wy-jaśnienia dodam, że na każdego członka naszej drużyny może przypadać inne nakrycie gło-wy. Biorąc pod uwagę fakt, że w wersji 0.9.7 ma, według wstępnych planów, znaleźć się 60 różnych nakryć głowy, jest to naprawdę spo-ra zmiana, a przy okazji świetny pomysł, któ-ry z pewnością znacznie urozmaici rozgrywkę. Obecnie, jako że temat nakryć głowy, jest jed-nym z goręcej omawianych pomysłów na forum projektu, a graficy prześcigają się w pomysłach, niewykluczone, że liczba czapeczek przekroczy planowane 60 sztuk. Z przygotowanych już te-raz co ciekawszych pomysłów wymienić należy np. nakrycie głowy Robin Hooda, spartańskie-go wojownika, clowna (z charakterystycznym, czerwonym nosem), Lorda Vadera, wikinga, czarodzieja, wszystkich członków znanej rocko-wej kapeli KISS (w tym wypadku zmieniają się całe głowy jeży), błazna, czy też bohatera znanej serii gier video, Megamana.

Bardzo istotne dla rozwoju Hedgewars jest forum internetowe na którym użytkownicy i twórcy wymieniają się pomysłami. Propozy-cje zmian przyjmowane są z entuzjazmem, i prawie wszystkie są komentowane przez twór-ców projektu. Nic nie stoi na przeszkodzie aby np. samemu stworzyć nową planszę do gry.

Wystarczy średnia znajomość np. programu In-kscape i trochę pracy. Jeśli plansza będzie za sła-ba, bardzo możliwe, że jeden z grafików zasu-geruje co należy w niej zmienić aby znalazła się ona w grze.

Gra dostępna jest w wersjach na systemy GNU/Linux oraz Windows, toteż nic nie stoi na przeszkodzie aby użytkownicy tych dwóch systemów operacyjnych grali razem w sieci In-ternet lub LAN, musimy tylko zadbać aby mie-li oni zainstalowaną taką samą wersję gry. Nale-ży to rozumieć w następujący sposób, jeśli kilka osób chciałoby zagrać w Hedgewars za pośred-nictwem sieci LAN lub Internet, nie stanowi to problemu, nie gra roli posiadamy system opera-cyjny (zakładając, że istnieje wersja gry dla tego systemu), istotne jest aby numerycznie zgadza-ła się wersja gry, to znaczy aby wszyscy gracze mieli, dajmy na to wersję 0.9.6. Program znaj-dziemy także wśród portów dla FreeBSD, a na forum projektu poważnie mówi się też o wer-sji dla iPhone. Strona domowa umożliwia nam pobranie źródeł, jednak znajdziemy na niej również odsyłacze do stron z informacjami o paczkach dla Gentoo, Debiana i Archa; oso-by korzystające z Ubuntu również nie powin-ny mieć problemów z instalacją gry. Jeśli zdecy-dujemy się na samodzielną kompilację, będzie-my musieli, jak podaje strona domowa projek-tu, spełnić następujące zależności: QT >= 4.2, FreePascal >= 1.9.4, SDL >= 1.2.5, SDL_net >= 1.2.5, SDL_mixer >= 1.2, SDL_image >= 1.2, SDL_ttf >= 2.0, CMake >= 2.4.4. Aby skompi-lować źródła wydajemy polecenie:

cmake -DCMAKE _ INSTALL _ PREFIX=”/

ścieżka/do _ katalogu _ w _ którym _

chcemy _ zainstalować _ grę”,

a następnie make. Natomiast aby zainstalować grę, make install. Warto zauważyć, że w wy-padku Hedgewars polecenie make uninstall nie odinstaluje gry, dlatego tym bardziej war-to już na samym początku wskazać programo-wi gdzie chcemy aby program został zainstalo-wany. Korzystając z gotowych paczek dla na-szej dystrybucji nie musimy spełniać dwóch zależności, czyli FreePascal i CMake, są one bowiem potrzebne jedynie w czasie kompilacji źródeł. Program możemy pobrać z:

http://www.hedgewars.org/download.html

Rozmiar pliku ze źródłami, czyli obecnie hedge-wars-src-0.9.6.tar.bz2 wynosi 19,2mb.

Ocena: 5/5

Rysunek 2. Nakrycia głowy, planowane w następnej wersji programu

Za i przeciwZa:

• urzekające podobieństwo do pierwowzoru• świetny silnik (ang. engine) gry• miła dla oka grafika• brak krwi i wyraźnie widocznej przemocy• stały, dynamiczny rozwój projektu

Przeciw:

• brak lub niewielka ilość serwerów do gry w internecie

MACIEJ MROZIŃSKIOd kilku lat codzienny, domowy użytkownik syste-

mów z rodziny GNU/Linux. Entuzjasta rozwiązań

alternatywnych i wolnego oprogramowania.

Kontakt z autorem: [email protected]

Page 42: SDJ_12_2008_PL_Symbian OS

12/200842

Sztuczna inteligencjaRozpoznawanie i synteza mowy

www.sdjournal.org 43

Rozpoznawanie mowy (SR) spełnia dwie podstawowe funkcje. Pierwsza to gło-sowe sterowanie pracą komputera (np.

wywoływanie poleceń w rodzaju otwórz bazę da-nych lub wyłącz mikrofon). Druga funkcja polega na przekształcaniu wypowiadanych słów na tekst – podczas gdy użytkownik mówi do mikrofonu, oprogramowanie przekształca odbierane dźwię-ki na pełne słowa, które następnie wprowadzane są do edytora tekstów (np. Microsoft Word lub Windows Mail). W praktyce oznacza to możliwość tworzenia dokumentów tekstowych bez użycia klawiatury. Synteza mowy (TTS) spełnia dokład-nie odwrotną funkcję. Jej zadaniem jest przekształ-cenie informacji tekstowej na komputerowo gene-rowaną mowę.

ZastosowanieProgramy rozpoznające mowę są najbardziej uży-teczne dla ludzi, których praca wymaga jedno-czesnego wykorzystywania obu rąk, jak również tych którzy tymczasowo lub permanentnie utra-cili zdolność posługiwania się klawiaturą i mysz-ką. SR może mieć również zastosowanie dla osób, które z różnych powodów nie mogą podczas pra-cy obserwować ekranu monitora lub dla uspraw-nienia pracy z programami o bardzo rozbudowa-nej strukturze menu, oferując szybszy dostęp do głęboko zagnieżdżonych funkcji. Jeszcze inną kategorię zastosowań mogą stanowić programy sprawdzające poprawność wymowy w logopedii

lub nauce języków obcych. Technologia rozpo-znawania mowy jest nadal niedoskonała. Szcze-gólną trudność stanowi precyzyjne odwzorowa-nie płynnego ciągu wypowiedzi na odpowiadają-cy jej tekst. Programy starszej generacji wymaga-ły stosowania pauz, aby komputer mógł rozróżnić wypowiadane słowa. Najnowsza generacja nie wy-maga żadnych przerw w wypowiedzi. Umożliwia to bardziej naturalną komunikację, jednak więk-szość użytkowników przyznaje, że czasami ko-nieczne są znaczne poprawki generowanego tek-stu. Pomimo tych niedoskonałości wszyscy uwa-żają, że głosowe wprowadzanie tekstu jest szyb-sze niż przy użyciu klawiatury. Jeden z najpopu-larniejszych na rynku programów SR (Dragon Na-turallySpeaking 9) potrafi rozpoznać do 160 słów na minutę.

Prawie wszystkie programy rozpoznawania mo-wy, zanim zostaną użyte, wymagają tzw. treningu. Proces ten pozwala na dostosowanie się programu do stylu mówienia konkretnej osoby i polega na głośnym czytaniu zadanego tekstu do mikrofonu. W trakcie późniejszego użytkowania, oprogramo-wanie uczy się już samodzielnie na własnych błę-dach, stopniowo udoskonalając swoje działanie.

Dragon NaturallySpeaking jest zdaniem więk-szości ekspertów najlepszym komercyjnie dostęp-nym oprogramowaniem do rozpoznawania mowy. Jego skuteczność jest szacowana na poziomie 95 do 99%. Jego konkurent, IBM ViaVoice 10 osiąga zale-dwie 70% sprawność w prawidłowym rozpozna-waniu słów. Pierwszy z nich również znacznie le-piej integruje się z aplikacjami Windows.

Pomimo zdecydowanej wyższości NaturallySpe-aking nad ViaVoice, przy wyborze najodpowied-niejszego z nich trzeba wziąć pod uwagę moc posia-danego komputera oraz zainstalowany system ope-racyjny. NaturallySpeaking wymaga Windows XP, większej ilości pamięci i szybszego procesora. Dla starszych systemów operacyjnych i słabszych kom-puterów, bardziej odpowiedni jest IBM ViaVoice.

Porozmawiaj z komputeremKomputerowe rozpoznawanie i synteza mowy (ang. Speech Technology) były niegdyś uważane za technologię dalece futurystyczną, która z pewnością nigdy nie opuści sfery fantastyki naukowej. Tymczasem, przez ostatnie 50 lat technologia ta była stale rozwijana i obecnie jest coraz częściej stosowana, zyskując coraz większą popularność.

Dowiesz się:• O oprogramowaniu do rozpoznawania mowy;

• O rozpoznawaniu i syntezie mowy z użyciem

SAPI SDK.

Powinieneś wiedzieć:• Znajomość podstaw .NET/C;

• Windows Vista lub SAPI SDK 5.1.

Poziom trudności

Rysunek 1. Sposób dostępu do SAPI za pośrednictwem interfejsów

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

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

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

����������

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

��������

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

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

��������

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

Page 43: SDJ_12_2008_PL_Symbian OS

12/200842

Sztuczna inteligencjaRozpoznawanie i synteza mowy

www.sdjournal.org 43

Dla posiadaczy Windows Vista, najlepszym roz-wiązaniem może okazać się wykorzystanie rozpo-znawania mowy wbudowanego w ten system ope-racyjny (Windows Speech Recognition – WSR). W przeprowadzonych testach wypada ono równie do-brze jak najnowsze wersje NaturallySpeaking. Opi-nie recenzentów nie wskazują jednak zdecydo-wanego lidera. Część z nich uważa, że Naturally-Speaking jest bardziej wyrafinowany i uniwersal-ny niż WSR. Z kolei inni podkreślają, że WSR jest bardziej nowatorski, gdyż nie został zaprojektowa-ny wyłącznie dla ludzi niepełnosprawnych lecz jest zupełnie nowym sposobem komunikacji, z które-go każdy będzie chciał korzystać na co dzień.

SAPIWindows Vista umożliwia włączenie trybu auto-matycznego sterowania głosem dla każdej zain-stalowanej aplikacji. To fantastyczne rozwiązanie

pozwala użytkownikom na kontrolowanie progra-mów przy użyciu prostych komend głosowych. Dotyczy to jednak wyłącznie funkcji dostępnych poprzez menu programu, jego paski narzędziowe oraz przyciski. Co jednak można zrobić, jeśli ko-nieczne jest stworzenie bardziej wyrafinowanego interfejsu głosowego, dostosowanego do potrzeb konkretnej aplikacji? Microsoft oferuje tutaj dwa różne interfejsy programistyczne (APIs):

• SAPI 5.1 dla programów kompilowanych do kodu maszynowego (Vista wykorzystuje wer-sję 5.3 tej biblioteki);

• Biblioteki .NET o nazwach System.Speech.Re-cognition i System.Speech.Synthesis (WinFX).

SAPI 5.3 jest wbudowane w Vistę. Wcześniejsze systemy operacyjne wymagają zainstalowania SA-PI SDK 5.1. Listing 1 prezentuje najprostszy spo-

sób użycia biblioteki System.Speech.Synthesis. Aplikacja ta, jest jedynie prostym programikiem wypowiadającym tradycyjne Hello, world!.

Klasa syntezatora mowy nie wymaga żadnej do-datkowej inicjalizacji. Aby uruchomić syntezę mo-wy, wystarczy tylko wywołać funkcję SpeakText() z zadanym tekstem. Domyślnie, klasa ta wykorzystu-je syntezator wybrany w panelu sterowania syntezy mowy. Może ona jednak używać dowolnego synte-zatora, pod warunkiem, że jego interfejs jest zgod-ny z interfejsem sterownika SAPI DDI.

Biblioteka System.Speech.Recognition jest zgodna ze standardem W3C Speech Recognition Gram-mar Specification (SRGS), którego dokumentację można znaleźć na stronie http://www.w3.org/TR/speech-grammar. Dostarcza ona nawet klas do two-rzenia i wykorzystywania dokumentów SRGS XML. W większości przypadków wykorzystanie tych klas jest niepotrzebne. Do tworzenia gramatyk w zupełności wystarcza klasa GrammarBuilder.

Listing 2 pokazuje wykorzystanie biblioteki Sys-tem.Speech.Recognition do stworzenia aplikacji zmieniającej kolor tła okienka w wyniku wypowie-dzenia nazwy koloru zdefiniowanej przez typ Sys-tem.Drawing.KnownColor.

Listing 2 zawiera tylko najistotniejsze, z punk-tu widzenia użycia System.Speech.Recognition, fragmenty kodu. Wykorzystany zostaje obiekt kla-sy GrammarBuilder do stworzenia nowej grama-tyki zawierającej nazwy wszystkich znanych ko-lorów. Obiekt klasy rozpoznawania mowy (Spe-echRecognitionEngine) definiuje zdarzenie o nazwie SpeechRecognized. Jest ono wywoływane każdo-razowo, gdy SAPI rozpozna jedno ze słów wpro-wadzonych wcześniej do gramatyki obiektu. Roz-poznane słowo wyświetlane jest w tytule okienka i dodatkowo zmieniony zostaje kolor tła okienka na odpowiadający wypowiedzianemu słowu.

Funkcja RecognizeAsync() powoduje wprowa-dzenie programu w tryb asynchronicznego nasłu-chiwania, czyli ciągłego oczekiwania na wypowia-dane słowa.

PodsumowanieTechnologia rozpoznawania i syntezy mowy doj-rzewała przez ostatnie 50 lat i obecnie zaczyna wchodzić w fazę pełnej użyteczności oraz coraz większej popularności. Istnieje już wiele gotowych rozwiązań umożliwiających efektywną komuni-kację głosową z komputerami i zainstalowanym na nich oprogramowaniem. Technologia ta coraz częściej staje się po prostu kolejnym, bardziej na-turalnym sposobem komunikacji. Wraz z jej stan-daryzacją, dostrzeżeniem zalet i lepszym pozna-niem, powinna wkrótce stać się stałym elementem współczesnej informatyki.

Listing 1. Najprostszy sposób użycia biblioteki System.Speech.Synthesis

using System;

using System.Speech.Synthesis;

namespace TTS_Console_Sample

{

class Program

{

static void Main(string[] args)

{

SpeechSynthesizer synth = new SpeechSynthesizer();

synth.SpeakText(„Hello, world!”);

}

}

}

Listing 2. Wykorzystanie biblioteki System.Speech.Recognition do stworzenia aplikacji zmieniającej

kolor tła okienka

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Windows.Forms;

using System.Speech.Recognition;

private void SRThread()

{

SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine();

recognizer.SetInputToDefaultAudioDevice();

Array colorsArray = Enum.GetValues(typeof(KnownColor));

KnownColor[] allColors = new KnownColor[colorsArray.Length];

Array.Copy(colorsArray, allColors, colorsArray.Length);

GrammarBuilder gb = new GrammarBuilder();

Choices ch = new Choices();

foreach (KnownColor kc in colorsArray) ch.Add(kc.ToString());

Grammar grammar = new Grammar(gb);

recognizer.UnloadAllGrammars();

recognizer.LoadGrammar(grammar);

recognizer.SpeechRecognized += OnSpeechRecognized;

recognizer.RecognizeAsync(RecognizeMode.Multiple);

}

private void OnSpeechRecognized(object sender,

SpeechRecognizedEventArgs e)

{

string newColorName = e.Result.Text;

Text = newColorName;

foreach (KnownColor kc in colorsArray)

if (kc.ToString() == newColorName)

BackColor = Color.FromKnownColor(kc);

}

MARIUSZ JASNOGÓRSKIAutor jest absolwentem Informatyki na Politechnice

Wrocławskiej. Od 8 lat pracuje w USA jako konsul-

tant d/s oprogramowania. Specjalizuje się w pro-

jektowaniu i implementowaniu rozwiązań opar-

tych na technologiach .NET.

Kontakt z autorem: [email protected]

Page 44: SDJ_12_2008_PL_Symbian OS

12/200844

E-commerceWydajny, elastyczny i przyjazny CMS

www.sdjournal.org 45

W pełni zgadzam się ze stwierdzeniem iż znacz-nie łatwiej przygotować witrynę budując jej ro-boczą wersję poza CMS (Textpattern Solutions: PHP-Based Content Management Made Easy). Początkowo może budzi to pewne opory zwią-zane ze zwiększeniem nakładów pracy potrzeb-nych na zbudowanie surowego projektu przy uży-ciu HTML i CSS oraz rodzić pytanie o zasad-ność wyboru TXP. Jednak poświęcony czas jest nieproporcjonalnie mniejszy w stosunku do za-oszczędzonego podczas osadzania witryny w Te-xtpattern i każdym innym rozwiązaniu CMS.

Zalecam stworzenie layoutu w postaci gra-ficznej, a następnie stworzenie roboczej wersji struktury HTML wraz z zewnętrznym arku-szem stylów CSS.

Podczas etapu prac przygotowawczych warto wziąć pod uwagę kilka czynników:

• jakie artykuły będziemy prezentować?;• jakiego rodzaju witrynę budujemy –

blog, portal firmowy, wizytówkę itd;

• jak chcemy rozwiązać kwestię nawigacji – wygląd i układ menu.

Im więcej aspektów weźmiemy pod uwagę tym łatwiejsza będzie nasza praca. Oczywiście nie jest to jedyne właściwe podejście. Jak wie-my z poprzedniej części, po zainstalowaniu TXP mamy gotowy szkielet funkcjonującej witryny, także nawet zwolennicy gotowych i szybkich rozwiązań będą usatysfakcjonowani.

Na potrzeby naszej dalszej pracy stworzy-my prostą strukturę HTML, która posłuży nam jako wzorzec.

PresentationPo zalogowaniu do panelu administracyjnego przechodzimy do jednej z głównych zakładek – Presentation. Zakładka pełni rolę swoistego centrum zarządzania warstwą prezentacji. Jest to główny obszar dokonywania zmian szablonu witryny i miejsce w których definiujemy spo-sób w jaki zawartość naszego serwisu jest rende-rowana do postaci finalnego kodu HTML wysy-łanego do przeglądarki odwiedzającego. W obrębie panelu zorganizowane są cztery za-kładki – Sections, Pages, Forms, Style z którymi będziemy pracować nad finalną postacią serwi-su WWW.

Tworzymy sekcjeDodawane artykuły możemy podzielić na sek-cje Sections i kategorie Categories. Zrozumienie różnicy pomiędzy sekcją i kategorią początko-wo nastręcza nieco trudności.

Sekcja pełni rolę folderu, katalogu. Każdy stworzony artykuł musi być umieszczony w odpowiedniej sekcji. Sekcje tworzą strukturę w której umieszczane są poszczególne fragmenty treści witryny. W odróżnieniu kategorie nie są wymagane, a ich przeznaczeniem jest organiza-cja witryny w logiczną całość.

Wyobraźmy sobie stronę o zwierzętach w której treść w postaci artykułów zorganizo-wana jest w ramach sekcji – ssaki, ptaki itd. Strona o kotach przypisana jest do przynależ-nej jej sekcji ssaki, natomiast jej struktura po-dzielona jest na kategorie – koty długowłose i krótkowłose.

Kategorie mogą również kwalifikować ar-tykuły różnych sekcji w ramach jednego ty-pu tematycznego np. pielęgnacja, która od-nosi się zarówno do artykułów z sekcji pta-ki jak i ssaki.

Należy podkreślić, że każdy artykuł może należeć tylko do jednej sekcji.

Załóżmy że tworzymy firmową witrynę. Musimy podzieli treść witryny w ramach od-powiednich sekcji. Podział uwzględniający docelową strukturę witryny mógłby wyglą-dać tak jak przedstawia to Tabela 1.

Przejdźmy do zakładki Sections. Widzi-my dwie domyślnie dodane sekcje – Article i About. Zostawiamy je bez zmian i dodaje-my nasze sekcje zgodnie z zaproponowanym podziałem. Aby stworzyć nową sekcję należy podać jej nazwę w odpowiednim polu i klik-nąć Craete.

Po utworzeniu przechodzimy nieco niżej. Na ekranie widoczne są dodatkowe opcje

Wydajny, elastyczny i przyjazny CMSW poprzedniej części omówiłem sposób instalacji Textpattern. Dokonałem wprowadzenia do podstawowych i bardziej zaawansowanych zagadnień związanych z konfiguracją CMS'a. Mam nadzieję Drogi Czytelniku, że przyswoiłeś sobie zdobyte informacje i przećwiczyłeś zaprezentowane czynności instalacyjno – konfiguracyjne. Nie ma nic lepszego niż nauka poprzez praktykę. Zabieramy się do pracy.

Dowiesz się:• Rozszerzysz zdobytą wiedzę na temat Textpat-

tern;

• Dowiesz się jak spersonalizować warstwę pre-

zentacji – sekcje, artykuły, arkusz stylów CSS.

Powinieneś wiedzieć:• Znać podstawy Textpattern. Posiadać wiedzę

o tym jak zainstalować i przygotować TXP do

pracy, skonfigurować podstawowe i zaawan-

sowane opcje;

• Znać XHTML, CSS i PHP oraz posiadać prak-

tyczną wiedzę na temat budowy stron WWW;

• Zapoznać się z oficjalną dokumentacją pro-

jektu.

Poziom trudności

Poznajemy Textpattern cz.2

Page 45: SDJ_12_2008_PL_Symbian OS

12/200844

E-commerceWydajny, elastyczny i przyjazny CMS

www.sdjournal.org 45

konfiguracyjne dotyczące sekcji. W Section name znajduje się nazwa sekcji,

w Section title tytuł sekcji. Nazwa wykorzysty-wana jest podczas tworzenia odnośników, ty-tuł jest czytelną postacią nazwy sekcji prze-znaczoną dla odwiedzających naszą witrynę.

Poniżej znajduje się pole typu combo Use page, za pomocą którego wybieramy szablon struktu-ry z którym ma zostać powiązana sekcja.

W następnym polu Uses style wiążemy sek-cję z odpowiednim arkuszem stylów.

Budując witrynę możemy stosować wiele rożnych szablonów oraz wiele różnych arku-szy stylów, każda sekcja może należeć do od-rębnego szablonu i arkusza stylów.

Zaznaczenie opcji Selected default? spowo-duje iż każdy nowo dodany artykuł będzie do-myślnie przypisywany do utworzonej sekcji.

Opcja On front page? definiuje czy artyku-ły z sekcji mają pojawiać się na pierwszej stro-nie. Zaznaczenie opcji Syndicate? spowoduje, iż tworzone artykuły będą zasilać kanał RSS lub Atom.

Include in site search? Zaznaczenie opcji Yes spowoduje, że zawartość sekcji będzie moż-na przeszukiwać za pomocą wyszukiwarki wi-tryny.

Istniejącym domyślnie oraz dodanym sek-cjom – kontakt, oferta, aktualności włączamy jedynie opcje Include in site search?. Sekcji o nas włączamy dodatkowo opcję Selected default?, On front page?.

Po dokonaniu niezbędnych modyfikacji za-pisujemy zmiany.

Tworzenie form i edycja stronyProponuję w wybranym notatniku otworzyć przygotowany wcześniej szablon struktury HTML. Listing przykładowego, prostego ko-du został umieszczony w listingu 1Dokonaj-my teraz analizy kodu źródłowego identyfi-kując kilka ważnych obszarów. Zastanówmy się jak możemy podzielić strukturę biorąc pod uwagę:

• fragmenty w których zawartość zmie-niana jest dynamicznie tj. artykuły, lin-ki, zdjęcia, właściwa treść, witryna jak np. oferta, aktualności należą do tej grupy;

• fragmenty kodu pozostające statyczne np. nagłówek, stopka, menu.

W tym miejscu należy się kilka słów wyja-śnienia. W dużym uproszczeniu można po-wiedzieć że witrynę opartą na Textpattern budują strony (Pages) zorganizowane w obrę-bie sekcji (Sections). Każda strona posiada ar-kusz stylów (domyślny dla całej witryny lub dedykowany) i składa się z tzw. form (Forms) pełniących rolę kontenerów dla dodawanej treści jak linki, artykuły, formularze kon-taktowe itd.

Celowo pominąłem omawianie szczegółów dotyczących renderowania witryny przez Te-xtpattern. Model semantyczny Textpattern w postaci graficznej i dokładny opis znajduje się na pod adresem http://textbook.textpattern.net/wiki/index.php?title=Image:Symantic-mo-del_fig1.gif

Gorąco zachęcam do zapoznania się z ma-teriałem.

Przechodzimy do zakładki Pages. Zdefiniu-jemy nagłówek korzystając z fragmentu do-myślnie istniejącego kodu, a menu nawigacyj-ne i stopkę umieścimy w oddzielnych formach o typie misc.

Jak wspomniałem w pierwszej części artyku-łu, Textpattern wykorzystuje specjalne tagi, któ-re dynamicznie renderuje do postaci właściwe-go kodu HTML.

Na ekranie widzimy domyślnie utworzony nagłówek naszej witryny. Proponuję zostawić kod w postaci takiej jak jest to pokazane na Li-stingu 2.

Jak widać mamy tutaj kilka znaczników TXP:

• <txp:page _ title> – wyświetlenie zde-finiowanej w opcjach konfiguracyjnych tytułu witryny wraz z tytułem wyświetla-nej zawartości;

• <txp:site _ url /> – wyświetla pełny ad-res URL naszej witryny;

• <txp:css /> – wstawia link do powiąza-nego arkusza stylów CSS.

Dodajmy jeszcze fragment kodu z Listingu 2a

• <txp:link _ to _ home> – tworzy link do strony domowej;

• <txp:site _ name /> – nazwa witryny;• <txp:output_form /> – służy do wywołania form typu misc czyli menu i stopki.

Natomiast za pomocą

• <txp:article /> wywołamy treść dyna-miczną.

Atrybut form definiuje nazwę wywoływa-nej formy. Do utworzenia menu wykorzysta-my plugin cbs_navigation_menu, który pobrać możemy ze strony http://textpattern.org/plugins/636/cbsnavigationmenu.

Po zainstalowaniu i aktywowaniu (patrz Po-znajemy Textpattern cz.1 ) możemy korzystać z odpowiedniego znacznika. Dodajemy nową formę Menu i nasze menu w postaci HTML zmieniamy na kod z Listingu 3, który dyna-micznie wygeneruje właściwy kod.

Następnie tworzymy nową formę Footer i wkle-jamy cały kod stopki – <div id=”footer”/>.

Czas zająć się zawartością, która będzie zmie-niać się dynamicznie. Załóżmy że pojawiać się będzie tam treść poszczególnych podstron. W naszym przypadku będzie to blok przedstawio-ny na Listingu 4.

Tworzymy formę Content o typie Article. Przyglądając się źródłowej postaci kodu mo-żemy wskazać tytuł – Witamy serdecznie. Za-mieńmy zatem jej statyczną postać na wywoły-waną za pomocą znacznika <txp:title />.

Zawartość pierwszego paragrafu możemy potraktować jako skrót większej całości tekstu. Listę usług wraz z tytułem potraktujemy jako tekst właściwy. Użyjemy tutaj dwóch znaczni-

Rysunek 1. Tworzenie nowej sekcji

Rysunek 2. Opcje konfiguracyjne sekcji

Rysunek 3. Widok zakładki Write – wstawianie treści

Tabela 1. Przykładowy podział witryny na sekcje

Nazwa sekcji Zawartość sekcji – treść, artykuły

o nas Historia firmy

Profil działalności

kontakt Dane teleadresowe

Formularz kontaktowy

oferta Produkty

Usługi

aktualności Z życia firmy

Ogłoszenia dla partnerów

Page 46: SDJ_12_2008_PL_Symbian OS

12/200846

E-commerceWydajny, elastyczny i przyjazny CMS

www.sdjournal.org 47

Listing 1. Szablon przykładowej struktury HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>Nasza</title>

<link rel="home" href="http://localhost/cms/" />

<link rel="stylesheet" type="text/css" media="screen" href="styl.css" />

</head>

<body>

<div id="container">

<h1>Nasza</h1>

<div id="menu">

<ul>

<li><a href="#" title="O nas">O nas</a></li>

<li><a href="#" title="Kontakt">Kontakt</a></li>

<li><a href="#" title="Oferta">Oferta</a></li>

<li><a href="#" title="Aktulaności">Aktulaności</a></li>

</ul></div>

<div id="content">

<h4>Witamy serdecznie</h4><br />

<p>Firma "Nasza" Spółka z ograniczoną odpowiedzialnością z siedzibą w Tralalewo świadczy kompleksową obsługę w zakresie

budowy, remontu i wykańczania obiektów. Podstawowym celem usług świadczonych przez naszą firmę jest zadowolenie

i bezpieczeństwo naszych Klientów. &nbsp;

<h4>Oferujemy kompleksowe usługi:</h4><br />

<ul>

<li> budowlane, w tym mi.in.:

<ol>

<li> budowa domów i obiektów pod klucz</li>

<li> budowa do stanu surowego</li>

<li> kontynuowanie budowy nieukończonej</li>

</ol>

</li>

<li> wykończeniowe, w tym mi.in.:

<ol>

<li> tynki, sufity</li>

<li> malowanie, tapetowanie</li>

<li> układanie podłogi</li>

</ol>

</li>

</ul>

</div>

<div id="footer">

<p>Sąd Rejonowy Gdańsk-Północ w Gdańsku Wydział VIII Gospodarczy KRS nr 00000000, NIP 1111111111, Kapitał zakładowy: 50 000

PLN <br />Nasza Sp. z o.o. 84-200 Tralalewo, Wesoła 227 tel./fax. +48 058 88 08 56, email: krystian_

[email protected]</p>

</div>

</div>

</body>

</html>

Listing 2. Fragment zmodyfikowanego kodu HTML nagłówka wraz ze znacznikami TXP

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title><txp:page_title />

</title>

<link rel="home" href="<txp:site_url />" />

<txp:css format="link" />

</head>

<body>

Page 47: SDJ_12_2008_PL_Symbian OS

12/200846

E-commerceWydajny, elastyczny i przyjazny CMS

www.sdjournal.org 47

ków <txp:excerpt /> dla skrótu, tzw. zajawki oraz <txp:body /> dla tekstu.

Nasz kod po zmianach będzie wyglądał jak na Listingu 5. W ten sposób przeniesiemy treść z formy statycznej na dynamicznie renderowa-ną z bazy danych.

Przechodzimy do panelu Content, a następ-nie do zakładki Write.

Podajemy tytuł artykułu Witamy serdecznie i wpisujemy skrót artykułu w polu Excerpt.

Wklejmy zawartość kodu HTML w głów-nym polu tekstowym. Dużym udogodnieniem Textpattren jest możliwość wpisywania surowe-go tekstu jak i kodu HTML jednocześnie bez obawy, że znaczniki HTML zostaną nieprawi-dłowo zinterpretowane.

Z pola combo box Section wybieramy o-nas i zapisujemy.

Modyfikacja arkusza stylów Zmiana domyślnego wyglądu odbywa się w bardzo prosty i intuicyjny sposób. Po przejściu do zakładki style skorzystamy z wbudowanego, graficznego edytora CSS (Edit in CSS editor).

W polu Add new selector wpisujemy nazwę selektora #content i klikamy przycisk Submit. Korzystając z przycisku + dodajemy nowe wiersze w których wpisujemy nazwę właściwo-ści (Property) i odpowiednią wartość (Value) np. Background-color.

Proponuję poeksperymentować z poszcze-gólnymi wartościami. Jeśli zaadoptowanie do-myślnego arkusza stylów sprawi nam zbyt dużo kłopotu możemy spróbować edytować style w trybie tekstowym (Edit raw CSS) lub załadować własny wcześniej przygotowany arkusz. Po wy-konaniu niezbędnych zmian klikamy przycisk Save. Pozostaje jedynie sprawdzić wygląd naszej witryny klikając zakładkę View site.

PodsumowanieCelem niniejszego artykułu było rozwinięcie pierwszej części poprzez wyjaśnianie i zapre-zentowanie sposobu budowy witryny w oparciu o własny szkic struktury HTML. Przedstawiony sposób tworzenia szablonu nie jest jedynym wła-ściwym podejściem. Oczywiście, trudno nawet w ramach dwóch artykułów omówić całą funk-cjonalność TXP i przedstawić wszystkie szczegó-ły dotyczące edycji zawartości i struktury.

Mam nadzieję, że zaprezentowane informa-cje zachęcą do dalszej pracy z Textpattern. Życzę powodzenia w budowaniu własnych serwisów i blogów. Miłej zabawy.

Listing 2a. Ciąg dalszy kodu

<div id="container">

<h1 id="site-name"><txp:link_to_home><txp:site_name />

</txp:link_to_home>

</h1>

<txp:output_form form="menu"/>

<txp:article form="content"/>

<txp:output_form form="footer"/>

</div>

</body></html>

Listing 3. cbs_navigation_menu wraz z atrybutami

<txp:cbs_navigation_menu

sections="default,kontakt,oferta,aktualnosci"

titles="o nas,kontakt,oferta,aktualności"

break="li"

class="menu"

activeclass="active"

wraptag="ul" />

Listing 4. Dynamicznie zmieniająca się zawartość

<div id="content">

<h3>Witamy serdecznie</h3>

<br />

<p>Firma "Nasza" Spółka z ograniczoną odpowiedzialnością z siedzibą w Tralalewo

świadczy kompleksową obsługę w zakresie budowy, remontu i

wykańczania obiektów. Podstawowym celem usług świadczonych przez

naszą firmę jest zadowolenie i bezpieczeństwo naszych Klientów.

&nbsp; <a href="#" title="onas_wiecej">[wiecej]</a></p>

<h4>Oferujemy kompleksowe usługi:</h4>

<br />

<ul>

<li> budowlane, w tym mi.in.:

<ol>

<li> budowa domów i obiektów pod klucz<

/li>

<li> budowa do stanu surowego

</li>

<li> kontynuowanie budowy nieukończonej

</li>

</ol>

</li>

<li> wykończeniowe, w tym mi.in.:

<ol>

<li> tynki, sufity

</li>

<li> malowanie, tapetowanie

</li>

<li> układanie podłogi

</li>

</ol>

</li>

</ul></div>

Listing 5. Zawartość formy Content

<div id="content">

<h3><txp:title />

</h3>

<p><txp:excerpt />

</p>

<p><txp:body />

</p></div>

W Sieci

• http://www.textpattern.com – strona domowa projektu• http://textpattern.org/ – potężna i bardzo pomocna baza dodatków, plugin'ów, szablonów i

tutoriali

KRYSTIAN RAJSKIAutor interesuje się tworzeniem aplikacji i serwi-

sów webowych oraz technologiami internetowymi.

Związany z grupą ProgInn. Na co dzień pracuje jako

Software Test Engineer w firmie ADVA Optical Ne-

tworking. Prywatnie pasjonat muzyki elektronicz-

nej i kultury klubowej.

Kontakt z autorem: [email protected],

www.p-innovations.com

Page 48: SDJ_12_2008_PL_Symbian OS

12/200848

Systemy operacyjneAdobe Flash w urządzeniach wbudowanych

www.sdjournal.org 49

W przeszłości, zespoły programi-stów musiały tłumaczyć prototy-py GUI na język C, C++ lub Java,

co było żmudnym procesem, zajmującym całe tygodnie lub miesiące. Zespoły otrzymują te-raz możliwość budowania GUI za pomocą za-awansowanych narzędzi Flash i uruchamiania zbudowanych interfejsów na wbudowanych odtwarzaczach Flash, bez konieczności pisa-nia kodu grafiki.

Flash nabiera rozpędu wśród projektantów systemów wbudowanych z wielu powodów:

• ponad milion grafików na całym świecie korzysta z narzędzi Flash, co daje im do-stęp do ogromnych zasobów wiedzy na te-mat grafiki, z których mogą korzystać. Co więcej, projektanci mają możliwość pro-stego zintegrowania tysięcy elementów Flash już stworzonych dla urządzeń prze-nośnych i stacjonarnych;

• w porównaniu z odtwarzaczami Flash dla platform stacjonarnych, wbudowane od-twarzacze Flash od Adobe (takie jak Flash Lite 3) wymagają mniej pamięci operacyj-nej i zapewniają szybsze działanie przy mniejszym obciążeniu procesora;

• procesory i układy graficzne dla systemów wbudowanych pozwalają na osiągnięcie częstotliwości odświeżania grafiki zapew-

niające odpowiednie działanie technolo-gii Flash na wyświetlaczach o rozdzielczo-ści VGA i wyższej. Dla przykładu, w celu uzyskania płynnej animacji dziesięciu kla-tek na sekundę, system wymaga proceso-ra o minimalnej wydajności 100 MIPS, o wiele niższej od tej oferowanej przez więk-szość dzisiejszych procesorów, która prze-kracza 300 MIPS.

W odróżnieniu od uniwersalnych języków programowania i narzędzi, Flash to środowi-sko graficzne i multimedialne dla określone-go obszaru zastosowań, oferujące nieskończe-nie wiele możliwości budowania interfejsów użytkownika. Pozwala to projektantom sys-temów wbudowanych na tworzenie anima-cji i efektów specjalnych o wiele szybciej niż tradycyjnymi metodami. Co więcej, certyfi-kacja odtwarzaczy Flash przez Adobe zapew-nia, że aplikacje oparte na Flash działają tak sa-mo niezależnie od platformy sprzętowej. Dzię-ki temu, projektanci mogą stworzyć elementy interfejsu tylko raz i używać ich w systemach przeznaczonych dla różnych rynków lub za-kresów cenowych.

Implementacja Flash musi jednak rozwiązać wiele problemów, by spełnić wymagania pro-jektanta. Oto niektóre z nich:

• jak połączyć zawartość Flash z inny-mi programami graficznymi, takimi jak przeglądarki internetowe lub trójwymia-rowa nawigacja? Czy jeden wyświetlacz jest w stanie pokazać jednocześnie grafi-kę opartą na Flash i natywną grafikę 2D/

3D, nawet gdy korzystają one z różnych modeli rysowania?;

• jak zapewnić stałą wydajność interfejsów graficznych opartych na Flash przy róż-nych obciążeniach? Interfejsy graficzne większości systemów wbudowanych mu-szą zawsze szybko reagować na dane wpro-wadzane przez użytkownika, co wymaga pewnego poziomu kontroli ważności pro-cesów i wydajności;

• jak zapewnić niezawodność interfejsu opartego na Flash? Czy istnieje możliwość monitorowania problemów i łagodnego wychodzenia z nich? Czy zawartość Flash może współdziałać z krytycznymi proce-sami systemowymi?;

• jak kontrolować interakcje zawartości Flash z usługami systemowymi, takimi jak wyjście audio-wideo, wejście mikrofonu, ekrany dotykowe, systemy plików i stosy sieciowe?

Zobaczmy jak te problemy mogą zostać roz-wiązane.

Integracja programów Flash z innymi aplikacjami graficznymiTradycyjny odtwarzacz Flash działa w prze-glądarce internetowej lub jest uruchamiany w oknie. Projektowanie interfejsów może jednak zostać bardzo uproszczone, gdy postawimy ten model na głowie i uczynimy z technologii Flash główne środowisko, z którego uruchamiane są pozostałe aplikacje graficzne, niezależnie od te-go czy korzystają z tej samej technologii. Flash sprawdza się świetnie jako system zarządzania ekranem, pozwalając projektantowi na pełną kontrolę nad przejściami pomiędzy menu i efek-tami dźwiękowymi. Ułatwia również modyfika-cje interfejsu, umożliwiając projektantom i pro-gramistom na dowolne zmiany pozycji, rozmia-ru i ustawień elementów graficznych.

Rysunek 1 prezentuje przykład użycia ele-mentu Flash jako menedżera ekranu. Program

Adobe Flash

Według Adobe Systems, ponad 300 milionów urządzeń przenośnych posiada graficzne interfejsy użytkownika (GUI) oparte na technologii Adobe Flash, a liczba ta ma przekroczyć 1 miliard w 2010 roku. Projektanci systemów wbudowanych dla różnych gałęzi przemysłu w tym medycznego, także przechodzą na technologię Flash, z prostego powodu – pozwala to na skrócenie czasu budowy GUI nawet o 50%.

Dowiesz się:• Czym jest Adobe Flash;

• Co to jest system wbudowany;

• Co to jest HMI.

Powinieneś wiedzieć:• Jak wykorzystać potencjał technologii Adobe

Flash przy zachowaniu czasu rzeczywistego

i niezawodności systemu wbudowanego.

Poziom trudności

Wykorzystanie w urządzeniach wbudowanych

Page 49: SDJ_12_2008_PL_Symbian OS

12/200848

Systemy operacyjneAdobe Flash w urządzeniach wbudowanych

www.sdjournal.org 49

po lewej stronie rysuje trójwymiarową mapę w OpenGL ES, standardowym API dla grafiki trójwymiarowej w systemach wbudowanych. Program załadował trzy elementy wprost do swojej przestrzeni:

• bibliotekę grafiki dwuwymiarowej, • bibliotekę OpenGL ES grafiki 3D, oraz • sterownik grafiki kontrolujący hardware.

Ładowanie sterownika tym sposobem pozwa-la programowi na bezpośrednią kontrolę nad układem graficznym, tym samym zwiększając wydajność. Program po prawej to odtwarzacz Flash. Podobnie jak program OpenGL ES, tak-że ten bezpośrednio kontroluje układ grafiki, zapewniając wysoką wydajność.

Wiele układów graficznych dla systemów wbudowanych wspiera grafikę wielowarstwo-wą, co pozwala programom w technologii Flash na bezproblemową integrację z innymi aplika-cjami graficznymi na tym samym ekranie. Na Rysunku 1, odtwarzacz Flash rysuje na pierw-szym planie i kontroluje rysowanie mapy trój-wymiarowej w tle. By trójwymiarowa mapa była widoczna, projektant użył techniki chro-ma key na przedniej warstwie. Ponieważ grafi-ka 3D i Flash są wyświetlane na niezależnych warstwach, kontroler grafiki może odświeżyć mapę bez konieczności odświeżania zawartości Flash, co eliminuje migotanie i zmniejsza obcią-żenie procesora.

Projektant mógł również użyć techniki mie-szania kanału alfa w połączeniu z chroma key, by uzyskać półprzezroczyste przyciski lub in-ne elementy Flash. Projektant może następ-nie umieścić półprzezroczyste przyciski bez-pośrednio nad mapą 3D lub inną zawartością, a nie obok nich. Rysunek 3 pokazuje w jaki spo-sób umożliwia to zmieszczenie większej ilości informacji na małym ekranie.

Idealnie, system operacyjny lub szkielet gra-ficzny zapewniają API wysokiego poziomu, które pozwala projektantowi na zastosowanie grafiki wielowarstwowej niezależnej od plat-

formy sprzętowej. Aplikacje mogą dzięki te-mu działać, bez zmian kodu, na układach gra-ficznych wspierających inną liczbę warstw. API powinien również pozwalać projektantowi na określenie, czy każda aplikacja sama zarządza swoją warstwą, czy istnieje centralny program, który zarządza tym, jak wiele aplikacji-klien-tów dynamicznie współdzieli warstwy.

Zapewnienie przewidywalnych czasów reakcjiWbudowany GUI powinien szybko reagować na komendy użytkownika, nawet jeśli system wykonuje obciążające procesor czynności. Nie-możliwe jest odtworzenie działania znanego z komputerów stacjonarnych. Zadanie staje się jeszcze trudniejsze, gdy wiele programów gra-ficznych konkuruje o czas procesora. Jednym z rozwiązań jest stworzenie centralnego me-nedżera ekranu, który korzysta z priorytetów wątków przy określaniu który program graficz-ny powinien przejąć kontrolę nad procesorem.

Przy tym podejściu, program (na przy-kład oparty na Flash odtwarzacz DVD), któ-ry chce dołączyć do środowiska graficznego, wysyła żądanie do menedżera ekranu. Mene-dżer wyraża zgodę lub nie, zależnie od tego, czy program ma wystarczające uprawnienia. Po dołączeniu, program uzyskuje dostęp do wzajemnego wykluczenia (mutex). Gdy pro-gram chce wyświetlić grafikę na ekranie, za-czeka na mutex, uzyska go, wyrysuje grafikę bezpośrednio do jednostki graficznej, a na-stępnie zwolni mutex. Każdy program gra-ficzny konkuruje o ten mutex na podstawie własnego priorytetu. Ponieważ program gra-ficzny o najwyższym priorytecie zawsze uzy-ska mutex pierwszy, metoda ta zapewnia wy-soką wydajność oraz stałą wysoką szybkość działania interfejsu.

Przy dużym obciążeniu procesora, np. pod-czas wyliczania trasy przez system w samo-chodzie lub synchronizacji dużych ilości da-nych z iPoda, wydajność interfejsu może spaść do poziomu niedopuszczalnego dla użytkow-

nika. Okoliczność taka oznacza błąd systemu. W przypadku systemu zamkniętego, w którym wszystkie przypadki użycia mogą być kontrolo-wane, projektanci mogą uniknąć takich błędów systemu. Zapobieganie takim przypadkom sta-je się jednak o wiele trudniejsze w systemach, które muszą dynamicznie obsługiwać nowe da-ne lub aplikacje.

Podział czasu pozwala na rozwiązanie te-go problemu. Za pomocą tej techniki, projek-tant systemu umieszcza elementy oprogramo-wania w osobnych partycjach i przydziela każ-dej z nich gwarantowaną część czasu proce-sora. Projektant może na przykład przydzie-lić 20% czasu procesora interfejsowi graficz-nemu, 20% odtwarzaniu MP3, 30% telema-tyce systemu głośnomówiącego, itd. Dzię-ki temu interfejs może reagować na działania użytkownika szybko, niezależnie od tego, jak intensywnie działają procesy w innych party-cjach, nawet jeśli procesy te będą miały wyż-szy priorytet. Wynikiem jest zwiększenie sa-tysfakcji użytkownika.

Często zdarza się, że procesy w danej party-cji nie używają wszystkich cykli procesora przy-dzielonych dla tej partycji. Niektóre algorytmy szeregowania są w stanie to wykorzystać i dyna-micznie przydzielać nieużywany czas proceso-ra partycjom, które potrzebują dodatkowej mo-cy. Podejście takie pozwala interfejsowi oparte-mu na Flash na szybsze i bardziej płynne dzia-łanie, gdy dostępne jest więcej czasu procesora. Pozwala również innym podsystemom oprogra-mowania na szybsze działanie, gdy GUI nie po-chłania całego czasu procesora, który został mu przydzielony. Podział czasu procesora wspiera wiele komercyjnych systemów operacyjnych, co umożliwia korzystanie z tej metody podczas projektowania.

Zarządzanie błędamiBy minimalizować przestoje systemu, wiele wbudowanych systemów wymaga dynamicz-nego odzyskiwania stabilności w przypadku błędu. Opisany powyżej menedżer ekranu

Rysunek 1. Integracja aplikacji Flash z aplikacjami graficznymi nie wykorzystującymi technologii Flash. W tym przykładzie, program Flash kontroluje program nawigacji trójwymiarowej opartej na API 3D OpenGL ES

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

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

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

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

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

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

��������������� Rysunek 2. Interfejs wykorzystujący kanał alfa do wyświetlenia półprzezroczystego ostrzeżenia na ruchomej mapie. Ostrzeżenie i mapa znajdują się na osobnych warstwach, więc kontroler grafiki może odświeżyć mapę bez konieczności odświeżania ostrzeżenia

Page 50: SDJ_12_2008_PL_Symbian OS

12/200850

Systemy operacyjne

mógłby dowiadywać się o błędach, które wy-stąpiły w aplikacjach graficznych, za pomo-cą systemu informowania o błędach, dostęp-nego z poziomu systemu operacyjnego, na którym działa. W przypadku błędu progra-mu Flash lub graficznego podczas rezerwa-cji muteksu, menedżer ekranu mógłby zwal-niać taki mutex i przekazywać go następne-mu programowi w kolejce priorytetu. Mene-dżer mógłby również odzyskiwać zasoby, któ-re zajmował zawieszony program, oraz restar-tować taki program. Omówiliśmy sposób, w jaki podział czasu procesora może pomóc in-terfejsowi graficznemu na szybkie i konse-kwentne reagowanie na działania użytkow-nika. Może również zapewnić szybkie infor-mowanie o błędach i wykonywanie funkcji naprawczych, nawet podczas pracy z niskim priorytetem. Im szybciej funkcje takie zosta-ną uruchomione, tym łatwiej będzie im za-pobiec rozwijaniu się błędów oprogramowa-nia w poważne awarie.

Interakcje z FlashBy poprawnie zintegrować zawartość opartą na Flash, projektanci systemów wbudowanych mu-szą wziąć pod uwagę dwa rodzaje interakcji:

• wykorzystanie zawartości Flash do uru-chomienia i kontroli innej zawartości Flash – wymaga to mechanizmów, któ-re pozwolą nadrzędnej aplikacji Flash na ładowanie, pozycjonowanie, urucha-mianie i zwalnianie podrzędnych apli-kacji Flash;

• umożliwienie komunikacji pomiędzy za-wartością Flash i usługami systemu ope-racyjnego – wymaga mechanizmu przeka-zywania zapytań o dane.

Rysunek 3 przedstawia przykład zarządza-nia tymi interakcjami. Silnik HMI pozwa-la nadrzędnym aplikacjom Flash na zarządza-nie podrzędnymi aplikacjami Flash (odtwa-rzaczem multimedialnym, przeglądarką zdjęć, itp.), podczas gdy serwer HMI tworzy bramę dostępu do usług systemowych.

Zobaczmy, jak ten system może się sprawdzić w odtwarzaczu DVD. Na Rysunku 4 przedsta-wiony jest interfejs składający się z:

• obszaru wyświetlającego film (górna poło-wa ekranu);

• wykonanej w technologii Flash aplikacji kontrolującej odgrywanie, pauzę, przejście

do następnego lub poprzedniego rozdzia-łu, itp. (środek ekranu);

• silnika HMI (napisanego w technologii Flash), który kontroluje przyciski menu głównego (dół ekranu).

W tym przykładzie, silnik HMI uruchamia i kontroluje wykonany w technologii Flash od-twarzacz DVD (Flash kontroluje Flash). Fla-showy odtwarzacz DVD komunikuje się na-stępnie z usługą systemową odtwarzającą DVD za pomocą serwera HMI (zawartość Flash komunikuje się z natywną usługą syste-mu operacyjnego).

Serwer HMI powinien zapewniać asynchro-niczną komunikację z usługami systemowymi. Metoda ta powstrzymuje silnik HMI, działają-cy w kontekście odtwarzacza Flash, przed po-wodowaniem braku reakcji lub odświeżania in-terfejsu Flash.

PodsumowaniePowyższe przykłady pokazują, w jaki sposób możliwe jest zachowanie czasu rzeczywiste-go i niezawodności systemu wbudowanego, przy jednoczesnym udostępnieniu projektan-tom potencjału technologii Adobe Flash. Moż-liwe stają się oparte na komponentach szkielety HMI, zdolne do łączenia aplikacji 2D i 3D, apli-kacji Flash i multimediów.

RANDY MARTINPracuje w firmie QNX Software Systems

Kontakt z autorem: [email protected]

Rysunek 3. Architektura zarządzania interakcjami pomiędzy wieloma aplikacjami Flash, oraz pomiędzy aplikacjami Flash i pozostałymi aplikacjami

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

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

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

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

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

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

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

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

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

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

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

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

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

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

����������

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

Rysunek 4. W tym przykładzie, odtwarzacz Flash uruchamia przyciski sterowania DVD, przyciski menu oraz pozostałą zawartość Flash, podczas gdy sam odtwarzacz DVD uruchamiany jest na warstwie wideo znajdującej się za odtwarzaczem Flash

O QNX Software SystemsQNX Software Systems, firma z grupy Harman International, to czołowy dostawca innowacyj-nych technologii wbudowanych, w tym middleware, narzędzi programistycznych i systemów operacyjnych. Oparte na komponentach architektury Systemu Operacyjnego Czasu Rzeczywi-stego QNX Neutrino, pakiet programistyczny QNX Momentics oraz rodzina middleware QNX Aviage tworzą razem najbardziej niezawodny i skalowalny szkielet do budowy systemów wbu-dowanych. Wiodące firmy, takie jak Cisco, Daimler, General Electric, Lockheed Martin, i Siemens polegają na technologii QNX w produkcji routerów sieciowych, instrumentów medycznych, sa-mochodowych systemów telematycznych, systemów zabezpieczeń i obrony, robotów przemy-słowych oraz w innych zastosowaniach o krytycznym znaczeniu. Siedziba firmy mieści się w Ot-tawie, w Kanadzie, i dystrybuuje swoje produkty w ponad 100 krajach.

Page 51: SDJ_12_2008_PL_Symbian OS
Page 52: SDJ_12_2008_PL_Symbian OS

12/200852

Testowanie oprogramowaniaMechanizmy kontroli dostępu

www.sdjournal.org 53

Tworzenie użytkowników w Oracle, po-dobnie jak w innych systemach zarządza-nia bazami danych, odbywa się poprzez po-lecenie CREATE USER, a zmiany – poprzez ALTER USER. Tworząc użytkownika, trzeba przynajmniej określić jego login oraz meto-dę uwierzytelnienia. W przypadku użytkow-nika uwierzytelnianego hasłem posługujemy się następującym wyrażeniem:

CREATE USER stefan IDENTIFIED BY

TajneHaslo123;

Hasło TajneHasło123 zostanie zapisane w tabelach słownikowych Oracle w posta-ci zaszyfrowanej. Użytkownicy uwierzy-telniani hasłami to nie jedyna możliwość kontroli dostępu do bazy. Możemy stwo-rzyć użytkownika uwierzytelnianego jed-nokrotnie, poprzez system operacyjny. Ma to na przykład zastosowanie w przypadku skryptów bazodanowych uruchamianych automatycznie z poziomu systemu opera-cyjnego. Jeśli nie chcemy zapisywać w nich haseł w postaci jawnej, możemy się posłu-żyć właśnie tą możliwością. Począwszy od Oracle w wersji 6, w której ta funkcjonal-ność została wprowadzona, użytkowni-

cy uwierzytelniani zewnętrznie musieli mieć loginy poprzedzone prefiksem OPS$. W kolejnych wersjach wprowadzono para-metr OS _ AUTHENT _ PREFIX, który pozwa-la zdefiniować inny prefiks dla tego ty-pu kont. Użytkownika uwierzytelniane-go jednokrotnie tworzymy w następują-cy sposób:

CREATE USER marcin IDENTIFIED EXTERNALLY;

Kolejną metodą uwierzytelniania w Oracle jest posłużenie się protokołem LDAP w ce-lu uwierzytelnienia użytkownika w jakimś zewnętrznym serwisie do tego celu prze-znaczonym, np. Kerberos. Konto tego typu tworzy się następująco:

CREATE USER roman IDENTIFIED GLOBALLY AS

'CN=firma, OU=tierX,

O=security, C=PL';

PrzywilejePrzywileje określają, jakie operacje na jakich obiektach dany użytkownik może wykonać. Przywileje nadajemy poleceniem GRANT, a odbieramy je poleceniem REVOKE. W Oracle wyróżniamy trzy kategorie przywilejów:

• przywileje do obiektów, określające do-stęp do obiektów bazodanowych (ta-bel, widoków, pakietów, funkcji, proce-dur, sekwencji itd.) należących do inne-go użytkownika;

• przywileje systemowe, takie jak możli-wość łączenia się do bazy, quota na zaso-by przestrzeni tabel, możliwość tworze-nia innych użytkowników itd.;

• przywileje pochodzące z ról – to przy-wileje należące do dwóch poprzednich kategorii, ale nadane nie bezpośrednio, ale poprzez przypisanie użytkownikowi danej roli.

W Tabeli 1 zamieszczono przywileje dostę-pu do tabeli, które można nadać danemu użytkownikowi następującym wyrażeniem:

GRANT INSERT, UPDATE, DELETE ON

stefan.dane_osobowe

TO marcin;

Użytkownik marcin uzyskał tym samym możliwość wykonywania wszystkich ope-racji DML na tabeli dane _ osobowe w sche-macie stefan.

Jeśli dany przywilej powinien być dostęp-ny dla wszystkich, to zamiast wykonywać GRANT dla każdego użytkownika z osobna, można przypisać ten przywilej do specjal-nego użytkownika PUBLIC. Wydając poniż-sze polecenie dajemy wszystkim użytkow-nikom bazy (także przyszłym) możliwość wykonywania instrukcji SELECT na tabeli dane_osobowe ze schematu stefan.

GRANT SELECT ON stefan.dane_osobowe TO

PUBLIC;

Należy jednak zachować wstrzemięźliwość w nadawaniu uprawnień użytkownikowi PUBLIC i wykonywać to tylko wtedy, gdy jest to konieczne.

Przekazywanie przywilejówJeśli dajemy konkretnemu użytkownikowi możliwość wykonywania określonych opera-cji na którymś z naszych obiektów, możemy

Podstawy bezpieczeństwa OraclePrawie każdy system informatyczny zawiera w sobie bazę danych, a Oracle wśród nich zajmuje miejsce szczególne. Jest to system o olbrzymiej liczbie wdrożeń, działa na nim wiele istotnych usług, m.in. bankowych. Dlatego warto znać zastosowane w nim mechanizmy bezpieczeństwa.

Dowiesz się:• Jakie sposoby uwierzytelnienia oferuje Oracle?

• Jakie mamy dostępne możliwości zarządzania

kontrolą dostępu?

• W jaki sposób możemy określać polityki haseł?

• Jak możemy audytować działalność w bazie

danych?

Powinieneś wiedzieć:• Wskazana jest elementarna znajomość syste-

mów zarządzania bazami danych oraz Oracle.

Poziom trudności

Page 53: SDJ_12_2008_PL_Symbian OS

12/200852

Testowanie oprogramowaniaMechanizmy kontroli dostępu

www.sdjournal.org 53

też pozwolić mu na przekazanie tego przy-wileju innym użytkownikom. Rozważmy za-tem następujące wyrażenie:

GRANT SELECT ON stefan.dane_osobowe TO

marcin WITH GRANT

OPTION;

Ta komenda nada Marcinowi przywilej czy-tania tabeli dane _ osobowe, ale także prze-kazania tej możliwości innemu użytkowni-kowi. Marcin może teraz wykonać takie po-lecenie:

GRANT SELECT ON stefan.dane_osobowe TO

anna;

To polecenie wykona się poprawnie tylko dlatego, że Marcin dostał jawne przyzwole-nie na tego typu operacje (poprzez klauzulę WITH GRANT OPTION). Zauważmy, że Marcin jednocześnie poskąpił takiej klauzuli An-nie, zatem ona już nie będzie mogła dalej przekazać tego uprawnienia.

Cóż się jednak stanie, jeśli Marcin zosta-nie usunięty z bazy? Otóż Anna utraci przy-wilej do tabeli stefan.dane_osobowe! To bardzo ważna cecha przywilejów do obiek-tów – Oracle pamięta nie tylko, kto jakie ma prawa dostępu do jakich danych, ale też kto mu je przypisał. W czasie usuwania z ba-zy użytkownika, usuwane są także przywi-leje do obiektów nadane przez niego innym użytkownikom.

Gdyby Anna otrzymała ten sam przywi-lej od więcej niż jednego użytkownika i przy-najmniej jeden z nich nie zostałby skasowa-ny, to Anna zachowałaby swój przywilej.

W przypadku przywilejów systemowych działa to trochę inaczej. Po pierwsze, uży-wamy innej klauzuli. Aby nadać uprawnie-nia do, powiedzmy, tworzenia indeksów na dowolnej tabeli oraz możliwość przekazywa-nia tego przywileju dalej, wydajemy następu-jące polecenie:

GRANT index any table TO marcin WITH ADMIN

OPTION;

Marcin może teraz stworzyć dowolny in-deks w bazie oraz podzielić się tą możliwo-ścią z innymi. Załóżmy, analogicznie jak w poprzednim przykładzie, że przekazał tę możliwość Annie. Jeśli teraz Marcin zosta-nie zdropowany (tzn. zostanie wykonana operacja DROP USER marcin;), to Anna za-chowa swój przywilej. Przywileje systemo-we nie podlegają kaskadowemu kasowaniu, jak to ma miejsce w przypadku przywilejów obiektowych.

RolePrzywileje możemy grupować w role. Ro-le możemy przypisywać użytkownikom, ale

także innym rolom. Rolę tworzymy nastę-pująco:

CREATE ROLE straznik_teksasu;

Przypisywanie przywilejów do ról odbywa się tak samo, jak do użytkowników. Po prostu w miejsce loginu użytkownika wpisujemy na-zwę roli. Uważny Czytelnik od razu powie: Hej! Zatem jest ograniczenie na nazwy ról, a mianowicie nie mogą się one konfliktować z na-zwami użytkowników. Uważny Czytelnik ma rację. Nie mogą. Jeśli spróbujemy stworzyć rolę o nazwie takiej, jaką ma istniejący użyt-kownik, Oracle zaprotestuje. Nadajmy teraz naszemu strażnikowi Teksasu jakieś prawa:

GRANT SELECT, INSERT, UPDATE, DELETE ON

stefan.dane_osobowe

TO straznik_teksasu;

W przypadku ról również możemy użyć klauzuli WITH ADMIN OPTION w kontekście uprawnień systemowych i będzie miała ona dokładnie takie samo znaczenie, jak w przy-padku użytkowników.

Role mają ciekawą cechę – możemy two-rzyć role chronione hasłem. Robi się to na-stępująco:

CREATE ROLE potezny_user IDENTIFIED BY

tajne_haselko;

Role można włączać i wyłączać. Ten sam użytkownik może mieć kilka sesji na tej sa-mej bazie i w każdej z nich inne uprawnie-nia. Ta niezwykle interesująca własność da-je się wykorzystywać do bardziej precyzyj-nej realizacji zasady minimalnych przywi-lejów. Nawet jeśli danemu użytkownikowi potrzebne są dość silne przywileje, to z re-

Listing 1. Przykładowa funkcja weryfikująca długość hasła

CREATE OR REPLACE FUNCTION moja_funkcja

(username VARCHAR2

,password VARCHAR2

,old_password VARCHAR2

) RETURN BOOLEAN

IS

BEGIN

-- Sprawdz minimalna dlugosc hasla

IF LENGTH(password) < 8 THEN

raise_application_error(-20001,'Haslo powinno miec co najmniej 8 znakow');

END IF;

-- Sprawdz, czy haslo nie jest podobne do loginu

-- z dokladnoscia do wielkosci liter

IF regexp_like(password,username,'i') THEN

raise_application_error(-20002,'Haslo nie moze byc podobne do loginu');

END IF;

-- Sprawdz, czy haslo zawiera co najmniej jedna cyfre,

-- jedna litere i jeden znak przestankowy

IF NOT( regexp_like(password,'[[:digit:]]')

AND regexp_like(password,'[[:alpha:]]')

AND regexp_like(password,'[[:punct:]]')

) THEN

raise_application_error(-20003,'Haslo musi zawierac co najmniej jedna cyfre '||

'jedna litere i jeden znak przestankowy');

END IF;

-- haslo zdalo egzamin

RETURN(TRUE);

END;

/

Page 54: SDJ_12_2008_PL_Symbian OS

12/200854

Testowanie oprogramowania

www.sdjournal.org 55

guły nie są mu niezbędne przez cały czas. Możemy więc wykorzystać możliwość se-lektywnego włączania i wyłączania ról tak, aby właściwe uprawnienia były włączane tuż przed wykonaniem krytycznej operacji i wyłączane tuż po. Włączanie roli wykonu-je się następującą komendą:

SET ROLE straznik_teksasu;

W przypadku ról zabezpieczonych hasłami należy naturalnie podać hasło:

SET ROLE potezny_user IDENTIFIED BY tajne_

haselko;

Jedną komendą możemy włączyć wiele ról naraz. Kolejne role oddzielamy przecinka-mi. Każda z ról na liście, którą trzeba włą-czyć hasłem, musi mieć klauzulę z hasłem podaną od razu. A więc włączając jednocze-śnie obie wymieniane wcześniej role, wyda-jemy następującą komendę:

SET ROLE potezny_user IDENTIFIED BY tajne_

haselko, straznik_

teksasu;

Ról nie można wprost wyłączać. Można jed-nak osiągnąć coś takiego poprzez użycie wa-riantu komendy SET ROLE. Wydajemy taką komendę:

SET ROLE ALL EXCEPT potezny_user,

straznik_teksasu;

Spowoduje ona włączenie wszystkich ról poza wymienionymi. Jeśli więc któraś z wy-mienionych ról była włączona, to powyższa komenda ją wyłącza. Możemy przypisać da-nemu użytkownikowi listę ról domyślnych. Będą one nadane automatycznie zaraz po zalogowaniu. Jeśli na tej liście znajdzie się rola zabezpieczona hasłem, to przy logowa-niu użytkownik nie będzie musiał podawać tego hasła.

Polityki zarządzania hasłamiMożemy wymusić na użytkownikach okre-śloną złożoność hasła, częstotliwość jego zmiany oraz zachowanie systemu w przy-padku, gdy kilkukrotnie podawane jest nie-prawidłowe hasło. Wszystkie te operacje możemy wykonać przy pomocy profili. Na-stępująca komenda tworzy profil blokują-

cy konto na 10 minut po pięciu nieudanych próbach zalogowania się:

CREATE PROFILE prod LIMIT

FAILED_LOGIN_ATTEMPTS 5

PASSWORD_LOCK_TIME 10/1440;

Wartości parametru PASSWORD _ LOCK _

TIME podajemy w dniach. Zamiast liczby dni, po których blokada zostanie automa-tycznie zniesiona, możemy podać słowo kluczowe UNLIMITED. W takiej sytuacji je-dyną metodą odblokowania konta będzie interwencja administratora i wydanie przez niego polecenia ALTER USER xxxx ACCOUNT UNLOCK;

Zasady ponownego wykorzystania hasła również określamy w profilu. Poniższa ko-menda spowoduje, że użytkownicy posiada-jący profil prod będą mogli ponownie nadać sobie to samo hasło po upłynięciu 365 dni i w międzyczasie hasło będzie musiało być zmienione 3 razy:

CREATE PROFILE prod LIMIT

PASSWORD_REUSE_TIME 365

PASSWORD_REUSE_MAX 3;

Jeśli chcemy wymusić określoną częstotli-wość zmiany hasła w już stworzonym pro-filu prod, posłużymy się następującą ko-mendą:

ALTER PROFILE prod LIMIT

PASSWORD_LIFE_TIME 60

PASSWORD_GRACE_TIME 20;

Parametr PASSWORD _ LIFE _ TIME określa licz-bę dni życia hasła, natomiast PASSWORD _

GRACE _ TIME oznacza liczbę dni, w trakcie których użytkownik będzie upominany, aby zmienił swoje hasło. Po upłynięciu liczby dni będącej sumą tych parametrów, użytkownik zostanie zmuszony do zmiany hasła.

Możemy także określić wymogi złożoności hasła. W tym celu musimy stworzyć funkcję weryfikującą o następującym nagłówku:

CREATE OR REPLACE FUNCTION moja_funkcja

( username varchar2,

password varchar2,

old_password varchar2

) RETURN boolean

Nazwa funkcji może być dowolna, funk-cja jednak musi mieć trzy parametry typu VARCHAR2 oraz zwracać wartość boolow-ską (równą TRUE, jeśli wszystkie reguły two-rzenia hasła zostały spełnione). Funkcja musi być stworzona w schemacie SYS. Przykładowa funkcja weryfikująca jest umieszczona w pli-ku rdbms/admin/utlpwdmg.sql. Dzięki takiemu poziomowi elastyczności jesteśmy w stanie na-pisać praktycznie dowolny kod weryfikujący.

W Sieci

• http://www.oracle.com/technology/deploy/security/index.html –centrum bezpieczeństwa Oracle

• http://www.oracle.com/technology/deploy/security/alerts.htm –Krytyczne aktualizacje

• http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/nanda_fga.html –tekst wprowadzający do audytu drobnoziarnistego

• http://www.oracle.com/technology/deploy/security/database-security/advanced-security/index.html –tekst wprowadzający do zaawansowanych technik ochrony danych w Oracle

• http://www.oracle.com/technology/deploy/security/database-security/database-vault/index.html –opis technologii Oracle Database Vault

• http://www.oracle.com/technology/deploy/security/database-security/backup-encryption/index.html –artykuł o szyfrowaniu backupów

• http://www.oracle.com/technology/deploy/security/database-security/virtual-private- database/index.html –

technologia Oracle Virtual Database

Tabela 1. Przywileje dostępu do tabeli

Nazwa przywileju Znaczenie

SELECT Prawo do odczytywania danych z tabeli

INSERT Prawo do dodawania krotek do tabeli

UPDATE Prawo do zmieniania danych tabeli

DELETE Prawo do kasowania elementów tabeli

ALTER Prawo do zmiany struktury tabeli

DEBUG Prawo do debugowania kodu PL/SQL triggerów określonych na tabeli

INDEX Prawdo do tworzenia indeksów dla tabeli

REFERENCES Prawo do tworzenia kluczy obcych odwołują-cych się do tabeli

Page 55: SDJ_12_2008_PL_Symbian OS

12/200854

Testowanie oprogramowania

www.sdjournal.org 55

Możemy m.in. umieścić w bazie słownik języ-ka polskiego (albo dowolny inny słownik uży-wany przy atakach słownikowych) i spraw-dzać, czy hasło się w nim nie znajduje. Doda-nie do profilu funkcji weryfikującej wykonuje się następująco:

ALTER PROFILE prod LIMIT PASSWORD_VERIFY_

FUNCTION moja_

funkcja;

W przypadku, gdy chcemy wyłączyć tę opcję, wykonujemy komendę:

ALTER PROFILE prod LIMIT PASSWORD_VERIFY_

FUNCTION DEFAULT;

OK, stworzyliśmy nasz wymarzony profil i chcemy go przypisać danemu użytkowniko-wi. Robimy to w następujący sposób:

ALTER USER stefan PROFILE prod;

W systemie istnieje też domyślny profil dla wszystkich użytkowników o nazwie DEFAULT. Jeśli więc chcemy pewną regułę za-szczepianą przez profil wymusić na wszyst-kich użytkownikach, możemy w tym celu zmodyfikować profil DEFAULT.

AudytOracle pozwala na monitorowanie i logowa-nie wybranych zdarzeń bazodanowych. Wy-niki audytu mogą być przechowywane w ba-zie danych lub gdzieś w pliku. Następująca komenda poleca Oracle przechowywać wy-niki audytu w bazie danych w postaci roz-szerzonej (tzn. z wartościami zmiennych bindowanych):

ALTER SYSTEM SET audit_trail=EXTENDED

SCOPE=SPFILE;

Inne możliwe wartości parametru audit _

trail to DB (składowanie informacji w bazie w postaci domyślnej), NONE (brak składowania) oraz OS (składowanie w pliku). Po zmianie te-go parametru należy zrestartować instancję. W przypadku systemów uniksowych zapis do pliku będzie się odbywał domyślnie w ka-talogu $ORACLE_HOME/rdbms/audit. Moż-na zmienić katalog przy pomocy parametru audit _ file _ dest. W przypadku zapisu do bazy danych zapisy są przechowywane w ta-beli SYS.AUD$.

Przy pomocy audytu możemy monitoro-wać wykonywanie określonych komend SQL, zarówno pod kątem dostępu do określonych obiektów, jak i poleceń wymagających określo-nego poziomu uprawnień. W wersji 10g poja-wiła się też nowa możliwość audytowania drob-noziarnistego.

Audytowanie włączamy poleceniem AUDIT, a wyłączamy analogicznie skonfigurowanym po-

leceniem NOAUDIT. Na przykład rozważmy na-stępującą komendę:

AUDIT select ON hr.employee_salary;

Spowoduje ono logowanie każdego zdarze-nia odczytu tabeli employee _ salary z przy-kładowego schematu hr. Możemy też zadecy-dować, czy chcemy logować po jednym zda-rzeniu dla każdej serii dostępów (BY ACCESS), czy każdy dostęp z osobna (BY SESSION). Mo-żemy też ograniczyć regułę tylko do dostępów udanych (WHENEVER SUCCESSFUL) lub tylko nie-udanych (WHENEVER NOT SUCCESSFUL). Pozwa-la to np. monitorować, czy ktoś nie próbuje od-czytać zawartości jakiejś ważnej tabeli, nie ma-jąc do tego uprawnień. Poniższe zapytanie jest rozszerzeniem poprzedniego o ograniczenie do wpisów udanych, po jednym dla każdej sesji:

AUDIT select ON hr.employee_salary BY

ACCESS WHENEVER

SUCCESSFUL;

Listę założonych audytów możemy obej-rzeć, uruchamiając następujące polecenie:

SELECT audit_option, failure, success,

user_name

FROM dba_stmt_audit_opts

ORDER BY audit_option, user_name;

Wynik tego zapytania przydaje się, gdy chce-my selektywnie wyłączać reguły audytu. Wy-niki audytu (jeśli są przechowywane w bazie danych) można obejrzeć nie tylko poprzez ta-belę SYS.AUD$, ale i poprzez łatwiejsze w lek-turze zapytanie:

SELECT username, timestamp, action_name

FROM dba_audit_

trail;

PodsumowanieWyżej wymienione techniki kontroli dostępu to zaledwie wierzchołek góry lodowej w boga-tym arsenale narzędzi Oracle. Zapoznanie się z nimi jest jednak niezbędne przed zabraniem się za studiowanie bardziej zaawansowanych me-chanizmów, do czego wszystkich bardzo zachę-cam. W Ramce zamieszczono linki do artyku-łów opisujących wybrane technologie związane z bezpieczeństwem w systemie Oracle.

CEZARY G. CEREKWICKIAutor jest z wykształcenia informatykiem i polito-

logiem. Pracował jako projektant, programista, ad-

ministrator, konsultant, tłumacz, koordynator mię-

dzynarodowych projektów, dziennikarz i publicy-

sta. Pisał programy w dziesięciu językach progra-

mowania (od asemblerów po języki skryptowe), w

czterech systemach operacyjnych, na dwóch plat-

formach sprzętowych.

Kontakt z autorem: [email protected]

Page 56: SDJ_12_2008_PL_Symbian OS

12/200856

Testowanie oprogramowaniaSystemy konwersacyjne

www.sdjournal.org 57

Znaczna większość oferowanych na rynku urządzeń posiada zewnętrzne interfej-sy komunikacyjne, poprzez które można

się komunikować z PC-tem. Taki interfejs umoż-liwia także wgrywanie własnych aplikacji. Jest to ciekawe o tyle, że można tym sposobem znacznie zwiększyć funkcjonalność posiadanego przez nas urządzenia. W przypadku jednak, gdy postanowi-my sami zostać autorami oprogramowania, sprawa się komplikuje o tyle, że napisane przez nas opro-gramowanie może posiadać błędy i przed wgra-niem jego na docelowe urządzenie wypada je wcze-śniej przetestować. Dzięki udostępnianemu przez Microsoft oprogramowaniu można skonfiguro-wać i emulować na stacjach PC w pełni funkcjo-nalne i wydajne środowisko Windows CE 5.0. Śro-dowisko to jak już wcześniej wspomniano, zdaje się być przydatnym narzędziem dla programistów pi-szących aplikacje lub testerów oprogramowania dla urządzeń mobilnych wyposażonych właśnie w Windows CE. Środowisko można skonfigurować tak aby wizualnie i funkcjonalnie przypominało i działało jak np. Pocket PC. Taka konfiguracja zosta-nie opisana w dalszej części artykułu.

Wymagania systemoweW celu zapewnienia poprawnej emulacji środowi-ska MS Windows CE 5.0 w oparciu o udostępnia-ne przez Microsoft narzędzia należy spełnić wy-mienione niżej wymagania:

• 500-MHz processor – zalecany!;• Microsoft Windows 2000 Professional SP4

lub Windows XP Professional SP1;

• Microsoft .NET Framework, version 1.1;• połączenie z Internetem.

Ostatni z punktów tj. połączenie z internetem teoretycznie nie jest wymagane do instalacji MS Windows CE 5.0 Device Emulator lecz próba in-stalacji bez dostępu do sieci Internet kończyła się najczęściej niepowodzeniem.

InstalacjaPrzed rozpoczęciem prac instalacyjnych należy pobrać ze stron Microsoftu następujące składniki oprogramowania:

• Microsoft Windows CE 5.0 Device Emula-tor – http://www.microsoft.com/downloads/details.aspx?familyid=A120E012-CA31-4BE9-A3BF-B9BF4F64CE72&displaylan-g=en;

• Microsoft Pocket PC 2003 SDK – http://www.microsoft.com/downloads/details.aspx?fa-milyid=9996B314-0364-4623-9EDE-0B5FB-B133652&displaylang=en;

• Emulator Images for Windows Mobile 2003 Second Edition – http://www.microsoft.com/downloads/details.aspx?FamilyID=5c53e3b5-f2a2-47d7-a41d-825fd68ebb6c&displaylan-g=en.

Instalację rozpoczynamy od uruchomienia pierw-szego ze ściągniętych programów.

W celu poprawnego przebiegu instalacji pro-gram potrzebuje połączenia z Internetem, gdyż podczas kopiowania składników ściąga ze stron Mi-crosoftu potrzebne do uruchomienia oprogramo-wania biblioteki.

Teoretycznie instalacja bez połączenia z Inter-netem też powinna być możliwa, jednak próba jej przeprowadzenia kończyła się niepowodze-niem.

Program domyślnie instaluje się w katalogu: C:\Program Files\Windows CE 5.0 Emulator\Emulator_500.exe

Po uruchomieniu z menu: Start–>Programy--> Microsoft Windows CE 5.0–>CE 5.0 Emulator–> Sample CE Device ukazuje się domyślne okno z sys-temem operacyjnym emulowanego urządzenia. Otrzymaliśmy zatem w pełni funkcjonalny sys-tem, na którym można rozpocząć pracę. System ten jeszcze można dostroić co będzie podane w na-stępnych krokach.

Kolejnym (opcjonalnym) krokiem jest instala-cja pozostałych dwóch składników tj. Microsoft Po-cket PC 2003 SDK oraz Emulator Images for Win-dows Mobile 2003 Second Edition. Składniki te za-wierają dodatkowe obrazy emulowanego systemu.

KonfiguracjaDzięki możliwości parametryzacji podczas uru-chamiania emulowanego środowiska możemy personalizować ustawienia, ustawić sieć, port sze-regowy i równoległy itp. Uruchomienie z parame-trem polega na wyedytowaniu skrótu do programu emulatora np.: Emulator_500.exe /CEImage Nk.bin /Video 800x600x16 /Ethernet virtualswitch W Tabe-li 1, przedstawione zostały przykładowe, możliwe parametry uruchomienia aplikacji.

Dzięki wymienionym opcjom można dowol-nie sterować uruchomieniem emulatora. W ko-lejnej części zostaną omówione przykładowe kon-figuracje.

Konfiguracja emulatora 1Należy wyedytować właściwości skrótu do urucho-mienia programu emulatora. W polu element doce-lowy wpisujemy:

"C:\Program Files\Windows CE 5.0 Emulator\

Emulator_500.exe" nk.cem /vmname

"CE 5.0 (CF 1.0)" /sharedfolder c:\

det /video 240x320x16

Wtedy otrzymamy przykładowe okno urucho-mionego emulatora ze zmienioną rozdzielczo-ścią (parametr /video) oraz zmapowanym udo-stępnionym, współdzielonym folderem c:\det

MS Windows CE 5.0

Urządzenia mobilne (np. Pocket PC, Smatrfon) stają się coraz bardziej popularne. Przyczynia się do tego zarówno wzrost funkcjonalności jak i coraz bardziej przystępna cena. Duża ilość tychże urządzeń wyposażona jest przez producenta w system operacyjny klasy MS Windows CE oraz dedykowane oprogramowanie, związane z jego przeznaczeniem.

Dowiesz się:• O niezbędnych wymaganiach systemowych;

• Jak zainstalować programy.

Powinieneś wiedzieć:• Podstawy konfiguracji programów.

Poziom trudności

Emulacja na platformie x86

Page 57: SDJ_12_2008_PL_Symbian OS

12/200856

Testowanie oprogramowaniaSystemy konwersacyjne

www.sdjournal.org 57

ze stacją PC (parametr/sharefolder). Jak już wspomniano wcześniej folder, który ma być współdzielony należy wcześniej utworzyć.

Konfiguracja emulatora 2Tym razem zmodyfikowane pole element docelowy w skrócie do emulatora będzie miało postać tak jak na Listingu2.

Tym razem w emulatorze uruchomiono obraz urządzenia Poczet PC.

Konfiguracja emulatora 3Tym razem w celu uruchomienia emulatora użyj-my skryptu WSH napisanego w języku Visual Ba-sic Script. Zawartość Listingu 1 należy skopiować i zapisać w pliku z rozszerzeniem .vbs.

W efekcie uruchomienia skryptu otrzymujemy kompletny emulator urządzenia Pocket PC 2003 z działającymi klawiszami sterującymi. Jest to w peł-ni funkcjonalne narzędzie dla programisty i teste-ra aplikacji.

PodsumowanieW artykule przedstawiono jak sprawnie i skutecz-nie można na domowym PC skonfigurować w peł-ni funkcjonalne i wydajne środowisko Windows CE. Dodatkowym atutem emulowanego systemu jest fakt, iż posiada on zainstalowany .NET Com-pact Framework w wersji 1.0 z dodatkiem Service Pack 2 (1.0.3316.0). Jest to szczególnie potrzebna informacja dla osób pragnących uruchamiać apli-kacje napisane na platformie .NET. Wersję .NET

Compact Framework zainstalowaną w emula-torze sprawdzamy wpisując polecenie cgacutil w Start–>Run. W odpowiedzi otrzymamy komuni-kat z numerem wersji. Najprawdopodobniej bę-dzie to wersja 1.0.3316.0 czyli kod odpowiadają-cy .NET CF 1.0 SP2.

Tabela 1. Zestawienie możliwych wartości parametrów uruchomienia emulatora

Parametr Opis

/help Wyświetlenie informacji o możliwych parametrach uruchomienia emulatora.

/video <width>x<height>x<depth>" Ustawienie parametrów rozdzielczości w pikselach <dł>x<szer>x<kolor>

/memorysize <number> Ilość przydzielonej emulatorowi pamięci RAM, standardowo 48Mb.

/ethernet <mode> Ustawienie połączeń sieciowych. Parametr może przyjmować poniższe wartości: · none (brak sieci) · shared (połączenie przez NAT)· virtualswitch (emulator używa pierwszego fizycznego interfejsu sieciowego)· <MAC adres karty sieciowej> (Wyszczególniamy adres MAC interfejsu sieciowego, który chcemy przypisać emulatorowi w formacie XX-XX-XX-XX-XX-XX)

/serialport1 <mapping> Ustawienie pierwszego portu szeregowego. Możliwe wartości: · COM1 · COM2 · COM3 · COM4 · file:<filename>

/serialport2 <mapping> Ustawienie drugiego portu szeregowego. Możliwe wartości: · COM1 · COM2 · COM3 · COM4 · file:<filename>

/parallelport <mapping> Ustawienie drugiego portu równoległego. Możliwe wartości: · LPT1 · LPT2 · none

/skin <path> Skórka dla emulatora

/sharedfolder <path> Folder współdzielony ze stacją fizyczną. Wcześniej musi być utworzony na dysku lokalnym

/ceimage <path> Obraz, który ma zostać uruchomiony w emulatorze

/vmname <name> Nazwa emulatora, wyświetlana na pasku tytułowym okna

Listing 1. Przykładowy skrypt uruchamiający emulator start.vbs

Dim WshShell

Set WshShell = CreateObject("WScript.Shell")

q = Chr(34)

strCommandLine = q & "C:\Program Files\Windows CE 5.0 Emulator\Emulator_500.exe" & q & " " & q & "C:\Program Files\Windows CE

Tools\wce420\POCKET PC 2003\Emulation\PPC_2003_WWE.bin" & q & " /sharedfolder " & q & "C:\det" & q & " /video

240x320x16" & " /ethernet shared"& " /skin " & q & "C:\Program Files\Windows CE Tools\wce420\POCKET PC 2003\

Emulation\Pocket_PC_Emulator_Skin.xml" & q

WshShell.Exec(strCommandLine)

Listing 2. Skonfigurowane pole element docelowy

"C:\Program Files\Windows CE 5.0 Emulator\Emulator_500.exe" "C:\Program Files\Windows CE Tools\wce420\POCKET PC 2003\Emulation\PPC_

2003_WWE.bin" /sharedfolder c:\det /video 240x320x16

ARTUR KORNEUSZAutor jest z wykształcenia informatykiem-progra-

mistą pracującym w dziale IT dużego przedsiębior-

stwa produkcyjnego (ponad 200 stacji PC). W wol-

nym czasie autor zajmuje się rozwiązaniami z za-

kresu zdalnego sterowania, systemów wbudowa-

nych oraz rozwojem aplikacji webowych (PHP 4/5).

Kontakt z autorem: [email protected]

Page 58: SDJ_12_2008_PL_Symbian OS

12/200858

Programowanie PHPGrafika w PHP

www.sdjournal.org 59

PHP oferuje dostęp do bardzo intere-sujących bibliotek operujących na pli-kach graficznych. Jedną z nich jest po-

pularna GD i to na niej będziemy bazować ze względu na jej powszechną dostępność i du-że możliwości.Jest zainstalowana na niemal każdym serwerze, jednak dla pewności po-winniśmy to sprawdzić wywołując funkcję gd_info() oraz wyświetlając jej wynik.

var _ dump(gd _ info());

Osobiście pisząc ten artykuł dysponowałem wersją 2.0.34. Używać jednak będziemy jedy-nie podstawowych funkcji dlatego z pewno-ścią wszystkie przykłady będą działały rów-nież i na starszych wersjach tej biblioteki.

Zanim przejdziemy do części praktycz-nej chciałbym napisać jeszcze dwa zdania o sposobie reprezentacji kolorów w forma-tach cyfrowych. Rozróżniamy kilka modeli przestrzeni barw, najpopularniejszą i najczę-ściej stosowaną jest RGB której skrót pocho-dzi od zestawienia angielskich nazw trzech kolorów podstawowych zwanych też kanała-mi – Red, Green oraz Blue. Połączone ze so-bą kanały tworzą jeden piksel. Odpowiednio dobierając ich wartości możemy w rezultacie uzyskać każdy kolor. Model ten stosowany jest od wielu lat praktycznie we wszystkich

ekranach, począwszy od pierwszych telewi-zorów kolorowych a skończywszy na ogrom-nych telebimach reklamowych. W technice cyfrowej każdy z kanałów może przyjmować wartości od 0 do 255. Łatwo policzyć, że do dyspozycji mamy paletę składającą się z po-nad 16 milionów różnych kolorów.

Skala szarościPierwszym przykładem jaki wykonamy jest prosty efekt zamiany kolorowego zdjęcia do zdjęcia w skali szarości. Jedną z prostszych i najczęściej stosowanych metod na tę ope-rację jest uśrednienie wszystkich trzech ka-nałów RGB. Operacja ta polega na pobraniu wartości koloru każdego piksela z osobna, rozbiciu jego na trzy składowe, uśrednieniu ich oraz zapisaniu nowej wartości. Przykład takiego programu przedstawiony jest na Li-stingu 1. W pierwszej linijce kodu do zmien-nej $image wczytujemy plik z naszym zdję-

ciem w formacie JPEG – nic nie stoi na prze-szkodzie, aby pracować na innych forma-tach, ale pamiętaj o dobraniu odpowiedniej funkcji do danego pliku ponieważ funkcją imagecreatefromjpeg() otworzymy jedynie pliki z rozszerzeniem .jpeg lub .jpg. Następ-nie do zmiennych $width i $height zapisu-jemy szerokość i wysokość wcześniej wczyta-nego obrazu.

Kod choć wydaje się być prosty ma jednak jedną bardzo istotną wadę. Zwróć uwagę w jaki sposób pobieramy piksele obrazu – po-przez zagnieżdżoną pętle wykonującą swo-ją zawartość dokładnie tyle razy z ilu pik-seli składa się dany obraz. Dla niewielkie-go zdjęcia o rozdzielczości 800x600 daje to prawie pół miliona pikseli, w rezultacie in-terpreter PHP ma niemało pracy bo 3,5 mi-liona linijek kodu do przeczytania. Wyobraź sobie taki skrypt w jednym pliku zajmujący prawie 140MB na serwerze. Ponieważ skryp-ty PHP nie są kompilowane tylko interpre-towane znacząco odbija się to na ich wydaj-ności. Z tego powodu powinniśmy więc jak najwięcej używać funkcji już skompilowa-nych i zapisanych w bibliotekach PHP które są zdecydowanie wydajniejsze od tych inter-pretowanych. W przypadku operacji na pli-kach graficznych szczególnie polecam funk-

Grafika w PHP

Jednym z kluczowych elementów każdego serwisu internetowego jest grafika. Dzięki PHP w dynamiczny sposób możemy ją bez niczyjej ingerencji uatrakcyjnić lub dostosować do naszych potrzeb.

Dowiesz się:• Jak wykonać interesujące efekty graficzne

przy użyciu PHP;

• Na jakiej zasadzie działają takie operacje jak

szum czy rozmycie.

Powinieneś wiedzieć:• Konieczne są podstawy PHP;

• Przydatne będzie doświadczenie w obsłudze

biblioteki GD.

Poziom trudności

Wstęp do zaawansowanej obróbki grafiki w PHP

Rysunek 1. Przykład rozmycia

Page 59: SDJ_12_2008_PL_Symbian OS

12/200858

Programowanie PHPGrafika w PHP

www.sdjournal.org 59

cję imagefilter z której pomocą wykona-my różne interesujące operacje – w tym właśnie zamiana kolorowego obrazu do skali szarości. Nasz program w przykładzie pierwszym jest kilkadziesiąt razy wolniej-szy od funkcji imagefilter wykonującej tę samą czynność. W praktyce jednak nie za-wsze ta funkcja jest dostępna dlatego powin-niśmy to przewidzieć i w razie potrzeby wy-korzystać swój odpowiednik. Na Listingu 2 możesz zobaczyć proste rozwiązanie.

Dodam, że aby zwiększyć wydajność na-szego algorytmu powinniśmy maksymalnie zoptymalizować kod. Proponowałbym za-cząć od zwolnienia niepotrzebnie zajmowa-nej pamięci serwera przez usunięcie wszyst-kich zbędnych zmiennych. Zauważmy, że zmienne $red, $green oraz $blue nie są tak naprawdę nikomu potrzebne i lepiej jeśli by-śmy ich w ogóle nie deklarowali tylko bezpo-średnio wpisali ich wartości podczas oblicza-nia $bwcolor. W ten sposób zyskamy nawet do kilku procent wydajności a to bardzo wie-le. Ze względu na czytelność Listingu zdecy-dowałem się nie optymalizować kodu w ten sposób.

Szum monochromatycznyKolejnym ciekawym przykładem operacji na plikach graficznych jaki wykonamy będzie efekt szumu monochromatycznego. Przed przystąpieniem do programowania powinni-śmy zastanowić się nad odpowiednim algoryt-mem takiej operacji. Szum to nic innego jak lo-sowe drgania wartości kolorów poszczególnych pikseli. W przypadku szumu monochroma-tycznego jednakowej zmianie ulegają wszystkie trzy składowe koloru.

Jest to już nieco bardziej rozbudowana operacja od tej z którą zapoznaliśmy się w przykładzie pierwszym. Początek jest typo-wy, wczytujemy zdjęcie oraz pobieramy je-go szerokość i wysokość. Następnie deklaru-jemy zmienną $intensive od której głównie zależy końcowy efekt. Odpowiada ona za si-łę wcześniej wspominanych drgań o czym za-raz się przekonamy. Dwie zagnieżdżone w sobie pętle oraz sposób rozbicia pikseli na trzy składowe są już Tobie znane z poprzed-niego przykładu. Dłużej przyjrzyjmy się ko-lejnym linijkom kodu. Zmienna $rand za-wiera wylosowaną liczbę całkowitą w prze-dziale od -$intensive do +$intensive. Na-stępnie za jej pomocą w prosty sposób reali-zujemy idee drgań kolorów pikseli. Przykła-dowo dla $intensive = 30 końcowa wartość każdego z kanału może wzrosnąć lub zma-leć o 30. Pamiętajmy, że wartość koloru nie może być mniejsza od 0 ani większa od 255 dlatego wprowadziliśmy po dwa wyjątki dla każdego z kanału. Spróbuj teraz samodziel-nie tak zmienić program, aby uzyskać efekt szumu kolorowego. Przypomnę, że w prze-ciwieństwie do szumu monochromatycz-

Rysunek 2. Zdjęcie przed efektem rozmycia poziomego

Rysunek 3. Zdjęcie po efekcie rozmycia poziomego

Page 60: SDJ_12_2008_PL_Symbian OS

12/200860

Programowanie PHPGrafika w PHP

www.sdjournal.org 61

nego w którym takiej samej zmianie ulega-ją wszystkie kanały koloru efekt szumu kolo-rowego wymaga niezależnych drgań każdego kanału z osobna.

Rozmycie poziomeOstatnim efektem jaki wykonamy jest roz-mycie poziome. Jeżeli popatrzysz przez za-parowane szkiełko zobaczysz, że obraz za nim staje się niewyraźny. W jaki sposób jed-nak zinterpretować taki efekt żeby był on zrozumiały dla komputera dla którego każ-dy obraz to tylko ciąg pikseli i nic więcej? Spójrz na Rysunek 1. Ukazuje on rezultat działania typowego efektu rozmycia. Po le-wej stronie widzimy, że kod kreskowy jest dokładnie wyraźny. Zauważmy co dzieje się z nim po przepuszczeniu go przez filtry roz-mywające o różnych mocach. Obraz staje się coraz bardziej nieczytelny, zanika tło przez co trudniej jest nam dostrzec sam kod. Czar-ne kreski wtapiają się w białe tło zmniejsza-jąc pomiędzy sobą kontrast. Widzimy, że ob-raz staje się jednolity, piksele upodobnia-ją się wzajemnie do siebie. Rozmycie jest to nic innego jak zbliżanie się do siebie warto-ści kolorów sąsiednich pikseli.

Przeanalizujmy teraz Listing 4. Większość fragmentów z pewnością znasz z poprzed-nich przykładów dlatego skupimy się tyl-ko na sercu całej operacji. Zaczyna się ono wraz ze sprawdzeniem przy pomocy funkcji isset() czy został zdefiniowany kolor po-przedniego piksela. Po co w ogóle to spraw-dzamy? To dość istotne ponieważ pierwszy piksel obrazu nie posiada swojego poprzed-nika. Pozbawiając kodu tego warunku jed-nocześnie uznalibyśmy tym samym, że po-przednik pierwszego piksela który nie ist-nieje ma kolor czarny (wartości wszystkich składowych koloru wynosiłby 0). W rezulta-cie przykładowo na błękitnym niebie otrzy-malibyśmy w lewym górnym rogu delikat-ną, czarną kreskę co chyba nie wyglądałoby za dobrze. Dlaczego jednak sprawdzamy tyl-ko kanał czerwony a nie wszystkie trzy? Nie warto sprawdzać wszystkich składowych ko-loru bo jeżeli zdefiniowany jest jeden to zde-finiowane też są pozostałe. W ten prosty sposób zwiększymy wydajność całej opera-cji. Następnie tworzymy pętlę w której cie-le uśredniamy wartości kolorów aktualne-go piksela oraz poprzedniego. Pętla ta wyko-na się dokładnie tyle razy ile wynosi zmien-na $intensive. Nietrudno zauważyć, że im większa wartość tej zmiennej tym piksele są do siebie bardziej upodobniane co w re-zultacie przekłada się na siłę rozmycia. Po tej czynności modyfikujemy aktualny pik-sel, zapamiętujemy jego kolor i przechodzi-my do operacji na kolejnym pikselu. Końco-wy efekt dla $intensive = 6 możesz zoba-czyć na Rysunku 2 oraz 3. Opierając się o ten przykład zastanów się w jaki sposób wyko-

Listing 1. Zamiana kolorowego zdjęcia do skali szarości

$image = imagecreatefromjpeg('photo.jpg');

// Pobieramy wymiary zdjęcia

$width = imagesx($image);

$height = imagesy($image);

// Pętla dzięki której pobierzemy każdy piksel i wykonamy na nim operacje

for ($x=0 ; $x < $width ; $x++) {

for ($y=0 ; $y < $height ; $y++) {

$rgb = imagecolorat($image, $x, $y);

// Rozbijamy kolor na jego trzy kanały

$red = ($rgb >> 16) & 0xFF;

$green = ($rgb >> 8) & 0xFF;

$blue = $rgb & 0xFF;

// Uśredniamy wszystkie składowe koloru

$bwcolor = round(($red + $green + $blue) / 3);

// Zamieniamy kolorowy piksel do skali szarości

$color = imagecolorallocate($image, $bwcolor, $bwcolor, $bwcolor);

imagesetpixel($image, $x, $y, $color);

}

}

// Zapisujemy gotowe zdjęcie w skali szarości

imagejpeg($image, 'grayscale.jpg', 80);

Listing 2. Sprawdzanie dostępności funkcji imagefilter

if (function_exists('imagefilter')) {

// Nakładamy na zdjęcie filtr jeżeli serwer obsługuje funkcję imagefilter

imagefilter($image, IMG_FILTER_GRAYSCALE);

} else {

// Tutaj nasza alternatywna funkcja dla serwerów z brakiem funkcji imagefilter

}

Listing 3a. Efekt szumu monochromatycznego

$image = imagecreatefromjpeg('photo.jpg');

$width = imagesx($image);

$height = imagesy($image);

$intensive = 25;

for ($x=0 ; $x < $width ; $x++) {

for ($y=0 ; $y < $height ; $y++) {

$rgb = imagecolorat($image, $x, $y);

$red = ($rgb >> 16) & 0xFF;

$green = ($rgb >> 8) & 0xFF;

$blue = $rgb & 0xFF;

// Losujemy wartość zmiennej odpowiadającej za drgania

$rand = rand(-1 * $intensive, $intensive);

// Obliczamy nową wartość koloru dla kanału czerwonego

$red = $red + $rand;

// Realizujemy wyjątki dla kanału czerwonego

if ($red > 255) $red = 255;

if ($red < 0) $red = 0;

// Obliczamy nową wartość koloru dla kanału zielonego

$green = $green + $rand;

// Realizujemy wyjątki dla kanału zielonego

if ($green > 255) $green = 255;

if ($green < 0) $green = 0;

Page 61: SDJ_12_2008_PL_Symbian OS

12/200860

Programowanie PHPGrafika w PHP

www.sdjournal.org 61

nać efekt rozmycia pionowego. Podpowiem, że nie musisz wcale zmieniać ciała pętli, wy-starczy, że odpowiednio zmodyfikujesz spo-sób pobierania poszczególnych pikseli. Spró-buj również połączyć oba te programy, aby

w rezultacie uzyskać rozmycie na całej po-wierzchni. Pamiętaj też, że efekt ten mo-żesz uzyskać również przez użycie funkcji imagefilter. Staraj się korzystać z niej jak najczęściej a zyskasz na wydajności.

Co dalej po wstępie do zaawansowanej ob-róbki grafiki w PHP? Dalsza zabawa. Wy-zwaniem może być napisanie algorytmu wy-ostrzającego zdjęcie który bardzo ogólnie uj-mując jest odwrotną operacją do procesu rozmycia – kolory pikseli zamiast zbliżać, oddalają się od siebie. Przed tym warto jed-nak na rozgrzewkę spróbować czegoś prost-szego, na przykład negacji kolorów czy filtru typu sepia. Dla najbardziej ambitnych za-proponować mogę automatyczne usuwanie efektu czerwonych oczu.

PodsumowanieMam nadzieje, że zachęciłem choć część czy-telników do dalszej zabawy z obróbką gra-fiki używając PHP. Artykuł jest zaledwie wstępem do tego zagadnienia o którym moż-na by pisać wielotomowe książki. Jednak na-wet najbardziej opasłe księgi nigdy nie zastą-pią doświadczenia i własnych prób. Oczywi-ste jest też, że największe ilości wiedzy przy-chodzą drogą zabawy, a w tematyce obrób-ki grafiki można przypomnieć sobie radość minionego dzieciństwa. Jeśli ono jeszcze To-bie nie minęło to radości nigdy za wiele. Je-żeli masz tylko jakieś problemy z urucho-mieniem przedstawionych przykładów, py-tania lub propozycje to napisz do mnie na [email protected].

Na zakończenie chciałbym jeszcze udzie-lić jednej prostej lecz istotnej rady. Operując na plikach graficznych używając PHP pamię-taj, że zdecydowana większość takich pro-gramów jak przedstawione w tym artyku-le bazuje na dwóch zagnieżdżonych w sobie pętlach, które umożliwiają nam na łatwy do-stęp do każdego piksela. Dla zwiększenia wy-dajności staraj się maksymalnie ograniczyć ich ilość. Dobrym przykładem może być pe-wien serwis społecznościowy który umożli-wia swoim użytkownikom przesłanie zdjęcia które następnie zostanie zmniejszone do od-powiednich rozmiarów i zamienione do ska-li szarości. Bardzo istotne jest tutaj zachowa-nie kolejności. Wyobraź sobie, że ktoś prze-syła formularzem zdjęcie o rozdzielczości dziesięciu megapikseli. Jaka byłaby odpo-wiedź jeżeli w pierwszej kolejności wyko-nalibyśmy operacje konwertowania zdjęcia do skali szarości? To zależy od serwera, ale najprawdopodobniej po kilkudziesięciu se-kundach oczekiwania na jakiś wynik użyt-kownik otrzymałby niezbyt miły komunikat od przeglądarki. Dlatego tak ważna jest ko-lejność wykonywanych operacji – najpierw skalowanie do żądanych rozmiarów a dopie-ro potem wszelkie efekty.

Listing 3b. Efekt szumu monochromatycznego

// Obliczamy nową wartość koloru dla kanału niebieskiego

$blue = $blue + $rand;

// Realizujemy wyjątki dla kanału niebieskiego

if ($blue > 255) $blue = 255;

if ($blue < 0) $blue = 0;

$color = imagecolorallocate($image, $red, $green, $blue);

imagesetpixel($image, $x, $y, $color);

}

}

imagejpeg($image, 'noised.jpg', 80);

Listing 4. Rozmycie poziome

$image = imagecreatefromjpeg('photo.jpg');

$width = imagesx($image);

$height = imagesy($image);

$intensive = 6;

for ($y=0 ; $y < $height ; $y++) {

for ($x=0 ; $x < $width ; $x++) {

$rgb = imagecolorat($image, $x, $y);

$red = ($rgb >> 16) & 0xFF;

$green = ($rgb >> 8) & 0xFF;

$blue = $rgb & 0xFF;

// Sprawdzamy czy zdefiniowany jest kolor poprzedniego piksela

if (isset($p_red)) {

for ($i = 0 ; $i < $intensive ; $i++) {

// Uśrednij kolor aktualnego piksela oraz poprzedniego

$red = ($red + $p_red) / 2;

$green = ($green + $p_green) / 2;

$blue = ($blue + $p_blue) / 2;

}

}

$color = imagecolorallocate($image, $red, $green, $blue);

imagesetpixel($image, $x, $y, $color);

// Zapamiętaj kolor piksela

$p_red = $red;

$p_green = $green;

$p_blue = $blue;

}

}

imagejpeg($image, 'blurred.jpg', 80);

ADAM BLOKAutor jest studentem informatyki na Uniwersytecie

Gdańskim, freelancerem oraz programistą w gdań-

skiej agencji interaktywnej br-design.pl.

Kontakt z autorem: [email protected]

Page 62: SDJ_12_2008_PL_Symbian OS

12/200862

Programowanie PHPWłasny słup ogłoszeniowy

www.sdjournal.org 63

W poprzednich artykułach przygoto-waliśmy dobrze działającą aplikację. Ale czy na prawdę możemy powie-

dzieć, że nasza aplikacja jest skończona?

Metainformacje naszej aplikacjiDo tej pory nasza aplikacja posiadała tytuł symfo-ny project. Zarówno konfigurację tytułu, jak i in-nych metainformacji możemy dokonać w pliku view.yml znajdującym się w katalogu postup/apps/postup/config/. Zdefiniujemy tam:

• title – tytuł aplikacji widoczny w tytule okna przeglądarki lub wynikach wyszukiwa-nia; ustawmy Serwis ogłoszeniowy;

• robots – informacja dla robotów wyszu-kiwarek; domyślnie ustawione jest index, follow zezwalające na zapamiętywanie stron;

• description – opis strony; widoczny w wy-nikach wyszukiwania; ustawmy Serwis ogło-szeniowy stworzony na potrzeby PHP Starterkit o frameworku symfony;

• keywords – słowa kluczowe; ustawmy ogło-szenia, serwis, symfony;

• language – zdefiniowanie domyślnego języ-ka; ustawmy pl;

• author – informacje o twórcy strony.

Metainformacje możemy również zmieniać dla określonej akcji. Dla przykładu możemy ustawić, aby w konkretnym ogłoszeniu po-kazywany był jego tytuł jako tytuł całej stro-ny. Wystarczy wtedy dopisać na końcu akcji executeShow():

$this->getContext()->getResponse()-

>setTitle($this->ad-

>getTitle());

Strony błędów Przed opublikowaniem aplikacji warto spraw-dzić, czy wszystko wygląda i działa tak, jak się tego spodziewamy.

Domyślny modułW sytuacji gdy nie posiadamy skonfigurowa-nego pliku reguł rutowania, symfony urucha-mia domyślny moduł i akcję zdefiniowaną pod parametrami default_module oraz default_action w pliku settings.yml (w katalogu postup/apps/postup/config/).

W związku z tym, że posiadamy skonfigu-rowany plik routing.yml ta sytuacja nas nie do-tyczy. Zachęcamy jednak do uporządkowania ekranu i wprowadzenia poprawnych informa-cji o domyślnym module i akcji:

all:

.actions:

default_module: advertisement

default_action: list

Strona błędu 404Strona błędu 404 pokazuje się w sytuacji, gdy wprowadzany przez użytkownika adres nie ist-nieje. Symfony posiada zdefiniowany domyśl-ny moduł default, pokazujący komunikat błędu 404. Jednak wygląd ten z całą pewnością różni się od wyglądu naszej aplikacji i może zdezorien-tować niejednego użytkownika albo – co ważniej-sze – nie świadczyć zbyt korzystnie o profesjonal-nym wykonaniu aplikacji.

Zacznijmy od wyłączenia domyślnych komu-nikatów błędów. Otwórzmy plik settings.yml, a na-stępnie wykasujmy w atrybucie enabled_modules moduł default. Utworzymy swój własny domyśl-ny moduł, wprowadzając w katalogu projektu ko-mendę:

> symfony init-module postup default

Przyjrzyjmy się jeszcze plikowi settings.yml. Gdy nie mamy zdefiniowanych parametrów error _

404 _ module oraz error _ 404 _ action, Symfo-ny wywołuje domyślnie moduł default oraz ak-cję error404. Korzystając z tej wiedzy, utworzy-my akcję error404 w pliku actions.class.php, na-szego domyślnego modułu (w katalogu postup/apps/postup/modules/default/actions/).

class defaultActions extends sfActions

{

public function executeError404()

{

}

}

Następnie utworzymy szablon wyglądu erro-r404Success.php z odpowiednim komunikatem (Listing 1).

Strona dla wyłączonej aplikacji oraz przypadki pojawienia się krytycznego błęduPrzed uruchomieniem naszej aplikacji na ser-werze, powinniśmy zadbać jeszcze o odpowied-

Własny słup ogłoszeniowyGdy już zadbaliśmy o przygotowanie działającej aplikacji, czas na dopracowanie kilku detali, dzięki którym naszą aplikację można uznać za profesjonalnie wykończoną. W drugiej części zaprezentuję, w jaki sposób możemy zamieścić aplikację na serwerze oraz w sprawny sposób ją aktualizować.

Dowiesz się:• W jaki sposób przygotować przyjazne komu-

nikaty błędów;

• Jak zadbać o zadeklarowanie odpowiednich

meta-informacji w nagłówku aplikacji;

• W jaki sposób na bieżąco aktualizować aplika-

cję na serwerze.

Powinieneś wiedzieć:• W jaki sposób stworzyć aplikację z symfony;

• Jak zbudowana jest aplikacja w symfony;

• Jak korzytać z protokołów FTP oraz SSH.

Poziom trudności

Przygotowanie oraz publikacja aplikacji na serwerze

Page 63: SDJ_12_2008_PL_Symbian OS

12/200862

Programowanie PHPWłasny słup ogłoszeniowy

www.sdjournal.org 63

nie wyglądy dwóch ekranów – ekranu wyłą-czonej aplikacji oraz w przypadku pojawienia się problemu z poprawnym otwarciem stro-ny. W związku z tym, że oba te ekrany urucha-miane są w sytuacji, gdy uruchomienie symfo-ny nie jest zakończone poprawnie, ich wyglądy nie są załadowywane z żadnego modułu w na-szej aplikacji, tylko z katalogu web/errors/. Defi-niujemy tam:

• plik error500.php: w którym zamieszczamy informacje, która ma się pojawić w przypad-ku wystąpienia wewnętrznego błędu serwera (z ang. internal server error);

• plik unavailable.php: który pojawia się w przypadku wyłączenia aplikacji lub gdy trwa czyszczenie cache'a

Wysyłanie gotowej aplikacji na serwer

Zamrażanie aplikacjiPrzygotowana przez nas aplikacja, aby popraw-nie działała na serwerze musi posiadać bibliote-ki symfony lib/ oraz data/ w katalogu naszego

projektu. Aby szybko to zrobić, wystarczy za-mrozić (z ang. freeze) aplikację komendą:

> symfony freeze

która automatycznie przeniesie zawartość kata-logi lib/ oraz data/ w odpowiednie miejsce, doda potrzebne pliki do katalogu web/ oraz odpowied-nio ustawi plik konfiguracyjny. Po zamrożeniu, można zamieszczać bibliotekę na serwerze, bez dbania o bibliotekę PEAR na serwerze, czy zdefi-niowane inne wersje biblioteki, również symfony, na serwerze. W przypadku konieczności odmroże-nia, możemy podać komendę:

> symfony unfreeze

która usunie poprzednio dokonane zmiany.

Zdalna synchronizacja rsync Gotową zamrożoną aplikację, nareszcie bez pro-blemów możemy wrzucić na serwer. Przy wy-syłaniu, możemy oczywiście skorzystać z trady-cyjnej metody przesyłania przez FTP. Jednak jest ona przyjemna tylko za pierwszym razem, w przy-

padku kolejnego przesłania marnujemy czas na po-nownym przesłaniu całego projektu lub na prze-glądaniu które pliki się zmieniły od poprzedniej aktualizacji. Przesyłanie selektywne zmienionych plików może również rodzić problemy z pojawia-jącymi się błędami w trakcie przesyłania niekom-pletnego projektu.

Z pomocą przychodzi przygotowana w symfo-ny, zdalna synchronizacja rsync, wykorzystująca protokół SSH. Rsync odpowiada za wydajną przy-rostową metodę przesyłania plików na serwer, któ-ra w odróżnieniu do FTP przesyła jedynie zmie-nione pliki na serwer. Samą synchronizację z ser-werem można dokonać prostą komendą:

> symfony sync produkcyjny

Jednak aby ta komenda zadziałała poprawnie, na-leży odpowiednio skonfigurować połączenie, w pliku w pliku config/properties.ini naszego projek-tu. Przykładową konfigurację zamieszczamy na Listingu 2. Samo wywołanie komendy symfony rsync spowoduje wyświetlenie listy plików, któ-re wymagają synchronizacji, bez kopiowania. Je-żeli chcemy dokonać synchronizacji, potwierdza-my nasz wybór, dopisując na końcu go:

> symfony sync produkcyjny go

Po dokonanej synchronizacji, bezwzględnie mu-simy pamiętać o wyczyszczeniu pamięci pod-ręcznej, komendą:

> symfony cc

PodsumowanieNa przykładzie naszego słupa ogłoszeniowego przedstawiłem jeden skrawek potęgi w funkcjo-nalności symfony w budowaniu profesjonalnych aplikacji internetowych. W ciągu wielu lat pra-cy w tym frameworku w firmie TeamLab, mogę śmiało polecić go wszystkim tym, którzy planują zbudować szybko i profesjonalnie program, któ-ry może sięgać dużych oglądalności i być tworzo-ny przez spore zespoły programistów. Na koniec pozostaje mi tylko życzyć sukcesów w pracy. W ra-zie pytań, odsyłam do serwisu polskiej społeczno-ści symfony: http://www.symfony.pl.

Czy aplikacja jest gotowa?

• Nadaj aplikacji odpowiednie metainformacje w pliku konfiguracji view.yml (takie jak tytuł, in-formacje dla robotów, opis, słowa kluczowe czy język);

• Zadbaj o odpowiedni wygląd błędów typu 404, 500 czy stron bezpieczeństwa. Po usta-wieniu tych stron należy wyłączyć w enabled _ modules moduł default z konfiguracji settings.yml;

• Sesje korzystające z ciasteczek (ang. cookies) w przeglądarce oraz same ciasteczka nazywa-ją się domyślnie symfony. Przed opublikowaniem aplikacji powinno się ukryć informację, że aplikacja korzysta z Symfony;

• Plik robots.txt znajdujący się w katalogu web/ domyślnie jest pusty. Należy zdefiniować, jakie informacje roboty indeksujące z wyszukiwarek powinny zapamiętywać, a jakie nie;

• Przeglądarki internetowe przy ładowaniu twojej strony będą chciały pobrać plik favicon.ico przy pierwszym otwarciu strony. Zadbaj o reprezentacyjną ikonę dla aplikacji, widoczną w pasku adresu lub po dodaniu do Ulubionych. Sprawia to wrażenie nie tylko kompletnej apli-kacji, ale również zapobiega pojawianiu się dużej liczby błędów 404 w logo serwera.

Listing 1. Strona szablonu wyglądu dla nieistniejących stron.

<h3 class="red">Strona o podanym adresie nie istnieje.</h3>

<p>Strona, której szukasz, mogła zostać usunięta, zmieniono jej nazwę lub jest

tymczasowo niedostępna.</p>

<p><?php echo link_to('Strona główna', '@homepage') ?></p>

Listing 2. Odpowiednio skonfigurowane połączenie

name=postup

[produkcyjny]

host=postup.symfony.pl

port=22

user=uzytkownik

dir=/home/kowalski/postup/

Rsync dla WindowsaWindowsowi użytkownicy mogą wykorzystywać alternatywne oprogramowanie do wykorzystu-jące metodę rsync, zwanej cwRsync. Strona programu: www.itefix.no/cwrsync/

PIOTR PLENIKWspółzałożyciel firmy TeamLab.pl, specjalizującej się

w wytwarzaniu oprogramowania klasy enterprise. Re-

daktor serwisu www.symfony.pl. Programista PHP od

ośmiu lat, od dwóch lat tworzący biznesowe aplikacje

w Symfony. Programista Stowarzyszenia Klon/Jawor

przy największym Ogólnopolskim Portalu dla Organi-

zacji Pozarządowych www.ngo.pl. Student ostatniego

roku Polsko-Japońskiej Wyższej Szkoły Technik Kom-

puterowych. Interesuje się zarządzaniem projekta-

mi biznesowymi oraz open source, programowaniem

(PHP, ASP.NET, Java), a także bazami danych (MS SQL,

Postgres, MySQL).

Kontakt z autorem: [email protected]

Page 64: SDJ_12_2008_PL_Symbian OS

12/200864

Programowanie urządzeń mobilnychProgramowanie gier dla Symbian OS

www.sdjournal.org 65

Rozwijamy grę!Mam nadzieję, że wszyscy Czytelnicy niniejsze-go cyklu artykułów mieli okazję uruchomić ro-boczy projekt LaserQuest, opracowany w ramach poprzedniego odcinka. Ci którzy zadali sobie ten trud muszą przyznać, że sama rozgrywka daje co prawda wiele radości i satysfakcji, aczkolwiek pro-gram jako całość, trudno nazwać pełną grą. W dzi-siejszym odcinku skupimy się na rozszerzeniu ist-niejącej postaci LaserQuest o elementy typowe grom o podobnym gatunku. Przy tej okazji na-uczymy się obsługi operacji wejścia/wyjścia i po-znamy mechanizm deskryptorów w Symbian OS.

Warstwa logiki gry – koncepcjaTym razem na warsztat weźmiemy przede wszyst-kim warstwę logiki gry. Pojęcie logika gry często mylone jest z takimi pojęciami jak silnik gry, bądź logika silnika gry. Aby dobrze zrozumieć różni-ce pomiędzy tymi pojęciami posłużę się następu-jącym przykładem. Rozważmy grę piłkarską – w której sterując wybraną drużyną – odbywamy ko-lejne rozgrywki, pnąc się po szczeblach hierarchii ligowej bądź walcząc o Puchar Mistrzostw Świata. W tym przypadku głównym silnikiem gry będzie ta część programu, która odpowiada za przepro-

wadzanie rozgrywki – sterowanie ruchami prze-ciwników, obsługa fizyki piłki oraz graczy itd. Z kolei logika gry, to pojęcie szczersze – obejmujące aplikację całościowo. Na poziomie logiki gry silnik meczu jest tylko pojedynczym klockiem. W war-stwie logiki aplikacji musimy oprogramować za-sady wszystkich możliwych trybów gry – Puchar Świata, rozgrywki ligowe, mecze towarzyskie itd. Tutaj podejmujemy decyzje czy gra – jako całość – zakończyła się sukcesem czy porażką. Na pozio-mie warstwy logiki zarządza się też zazwyczaj pro-cesem zapisywania i odczytywania stanu gry.

Warto zastanowić się, jak powyższe rozważa-nia odnoszą się do LaserQuest? Sprawa jest pro-sta – w naszym projekcie potrzebujemy warstwy, w której umieścimy kod odpowiedzialny za podej-mowanie decyzji w stylu, który poziom wczytać ja-ko kolejny?, lub czy ukończenie aktualnego poziomu równoważne jest z zakończeniem całej gry?. Ta wła-śnie warstwa definiować będzie logikę gry Lase-rQuest. Co uważniejsi Czytelnicy pamiętają za-pewne, że przy projektowaniu architektury na-szej aplikacji przewidzieliśmy tę ewentualność i przygotowaliśmy sobie miejsce, w którym doce-lowo miał się znaleźć kod odpowiedzialny za tego typu funkcjonalność. Mowa oczywiście o klasach CLaserQuestGame, CLaserQuestGamePlayMode oraz CLaserQuestGameMenuMode.

Skoro na poziomie koncepcyjnym wiemy już co chcemy zrobić i mamy wpasowaną tę koncep-cję w całokształt architektury aplikacji – pora za-dać sobie pytanie: jak ma wyglądać logika Lase-

rQuest? Sprawa może wydawać się banalna, ale nie jest to do końca zgodne z prawdą. Pierwszy pomysł, który mi przyszedł do głowy był następu-jący – skoro LaserQuest bazuje na pomyśle Laser-manii, to być może warto przyjrzeć się jak kwestia logiki gry została rozwiązana w oryginale. Orygi-nalna wersja gry (wydana na małe Atari) była ty-tułem dość ambitnym – gracz miał do pokona-nia 53 etapy, przy czym dysponował pięcioma ży-ciami. Co prawa w grze nie występowały wrogie jednostki atakujące nasz pojazd, aczkolwiek sto-sunkowo łatwo można było zapędzić się w przy-słowiowy kozi róg, czyli poprzez błędne i nieod-wracalne ustawienie elementów planszy – zna-leźć się w sytuacji kiedy dany poziom stawał się niemożliwy do ukończenia. W takim przypadku pozostawało jedynie wcisnąć klawisz Esc i rozpo-cząć dany etap od początku – oczywiście z liczni-kiem żyć pomniejszonym o jeden. Teoretycznie,

Programowanie gier dla Symbian OSW poprzedniej odsłonie cyklu zbudowaliśmy pierwszą, grywalną wersję projektu LaserQuest. W niniejszym odcinku skupimy się na rozszerzeniu funkcjonalności wspomnianej gry, analizując przy tym takie kluczowe składniki warsztatu programisty Symbian OS jak deskryptory oraz operacje wejścia/wyjścia na plikach.

Dowiesz się:• Na co zwrócić uwagę przy projektowaniu gier

dla urządzeń mobilnych;

• Jak obsługiwać napisy w aplikacjach pod Sym-

bian OS korzystając z deskryptorów;

• Jak oprogramować operacje wejścia/wyjścia

na plikach pisząc aplikacje dla Symbian OS.

Powinieneś wiedzieć:• Jak się programuje w języku C++;

• W jaki sposób zbudowana jest bazowa wersja

LaserQuest, opisana w poprzednim odcinku

cyklu.

Poziom trudności

Rozwijamy grę

Rysunek 1. Wyrenderowany poziom gry odpowiadający danym zapisanym w pliku konfiguracyjnym z Listingu 2

Page 65: SDJ_12_2008_PL_Symbian OS

12/200864

Programowanie urządzeń mobilnychProgramowanie gier dla Symbian OS

www.sdjournal.org 65

można by podobny mechanizm zaimplemento-wać w LaserQuest, ale zastanówmy się czy rze-czywiście będzie to najlepsze z możliwych roz-wiązań. Ja dla przykładu jestem w stanie wyobra-zić sobie całkiem realistyczną sytuację kiedy to – pozbawiony przez moją uroczą małżonkę stan-dardowego środka lokomocji (czytaj samochodu) – zmuszony jestem udać się do pracy za pośred-nictwem środków komunikacji miejskiej. Załóż-my, że w trakcie tej – około 30 minutowej – po-dróży, dla zabicia czasu gram w LaserQuest, prze-chodząc powiedzmy – 5 etapów. Dojeżdżam do pracy – i co dalej? Mógłbym teoretycznie pozo-stawić aplikację działającą w tle – Symbian jest przecież systemem obsługującym wiele aplika-cji działających jednocześnie (pilni Czytelnicy pierwszego docinka niniejszego cyklu pamięta-ją zapewne, że w sytuacji utraty focus'a pętla na-szej gry zostanie wstrzymana) – i kontynuować zabawę wracając do domu. Aczkolwiek istnie-je niebezpieczeństwo, iż w międzyczasie (np. w trakcie przerwy obiadowej) chciałbym pochwa-lić się koledze swoją nową grą i dać mu do przej-ścia pierwszy etap – na próbę. W tej sytuacji mu-siałbym przerwać swoją grę. Oczywiste jest z ko-lei, że wracając po południu do domu chciałbym kontynuować grę od miejsca, w którym ją zakoń-czyłem. Esencję opisanej wyżej sytuacji można streścić w jednym zdaniu – większość (o ile nie wszystkie) gry mobilne mają charakter dorywczy (ang. casual). Gramy w nie na przystanku – cze-kając na autobus, stojąc w kolejce do kasy albo nu-dząc się na zebraniu (oczywiście tak, aby nikt nie widział:)). Projektowanie dobrych gier typu casu-al to wielka sztuka i jednocześnie olbrzymie wy-zwanie dla projektantów gier. Chciałbym wszyst-kich Czytelników mojego cyklu uczulić bardzo

Listing 1. Implementacja funkcji wczytującej dane określonego poziomu gry z pliku

void CLaserQuestGameBoardEngine::LoadGridDataAndResetL(

const TDesC& aFileName )

{

RFs fs;

User::LeaveIfError( fs.Connect() );

CleanupClosePushL( fs );

RFileReadStream reader;

reader.PushL();

User::LeaveIfError( reader.Open( fs,

aFileName,

EFileRead ) );

TBuf8< KLaserQuestCoreGridMaxWidth > gridLine;

for ( TInt y = 0;

y < KLaserQuestCoreGridMaxHeight; ++y )

{

reader.ReadL( gridLine );

for ( TInt x = 0;

x < KLaserQuestCoreGridMaxWidth; ++x )

{

if ( '+' == gridLine[ x ] )

{

iOriginalVehiclePosX =

x + KGuardRingWidth;

iOriginalVehiclePosY =

y + KGuardRingWidth;

iOriginalGridData

[ x + KGuardRingWidth ]

[ y + KGuardRingWidth ] =

EEmpty;

}

else

{

iOriginalGridData

[ x + KGuardRingWidth ]

[ y + KGuardRingWidth ] =

Field2Tile( gridLine[ x ] );

}

}

reader.ReadInt16L(); // Skips \r\n sequence.

}

const TInt numChar2ValOffset = '0';

iVehicleDir =

static_cast< TDirection >(

reader.ReadInt8L() - numChar2ValOffset );

iBeamEmmiterActiveSide =

static_cast< TTileSide >(

reader.ReadInt8L() - numChar2ValOffset );

iBeamOrientation =

static_cast< TBeamOrientation >(

reader.ReadInt8L() - numChar2ValOffset );

CleanupStack::PopAndDestroy(); // reader

CleanupStack::PopAndDestroy(); // fs

Reset();

}

Rysunek 2. Efekt działania funkcji CLaserQuestGamePlayMode::DrawOptionsAndLevelCounter: informacje o numerze etapu i opcjach użytkownika w czasie rozgrywki

Page 66: SDJ_12_2008_PL_Symbian OS

12/200866

Programowanie urządzeń mobilnychProgramowanie gier dla Symbian OS

www.sdjournal.org 67

mocno na ten problem – szczególnie tyczy się to osób, które planują pisać własne gry na urządze-nia mobilne. Moja propozycja odnośnie logiki gry LaserQuest wygląda następująco:

• gracz ma do pokonania określoną ilość eta-pów następujących po sobie sekwencyjnie;

• rezygnujemy z koncepcji wprowadzania takich mechanizmów jak licznik żyć czy ograniczenie czasu gry;

• użytkownik może w każdej chwil prze-rwać grę – w takiej sytuacji program auto-matycznie sprawdza numer etapu na któ-rym zakończyła się gra i jeśli etap ten nig-dy nie został osiągnięty, zapisuje numer te-go poziomu w pamięci stałej telefonu;

• przy każdym kolejnym uruchomianiu apli-kacji, gracz może rozpocząć rozgrywkę od etapu, który został wcześniej zapamiętany.

Przy tak zaprojektowanej logice gry mamy pewność, że użytkownik będzie chętnie po-wracał do gry w naszą mobilną przeróbkę La-sermanii. Wypada przy tym nadmienić, iż – ze względu na ewidentne obniżenie poziomu trudności rozgrywki – warto zadbać o dużą liczbę, ciekawych i stopniowo coraz trudniej-szych etapów do pokonania.

Czas zakasać rękawy......i zająć się kodowaniem. Zastanówmy się, cze-go brakuje nam do uzyskania opisanej wyżej funkcjonalności. Przede wszystkim – musimy zaimplementować mechanizm wczytywania danych kolejnych poziomów. W pierwotnej wersji LaserQuest dane etapu zostały zakodo-wane na stałe w pliku źródłowym z implemen-tacją silnika planszy (plik LaserQuestGameBo-ardEngine.cpp, funkcja ResetGridData()). Oczywistym jest, że zaszywanie tego rodza-ju informacji w kodzie nie jest dobrą prak-tyką. W naszym przypadku o wiele lepszym

rozwiązaniem byłoby dynamiczne wczytywa-nie danych planszy z zewnętrznego pliku. Po-dejście takie ma szereg zalet – przede wszyst-kim grubą kreską rozgranicza pracę programi-sty od pracy projektanta poziomów. Definicja funkcji implementującej wspomniany mecha-nizmu znajduje się na Listingu 1.

Jak widać, nowa funkcjonalność dodana zo-stała w klasie CLaserQuestGameBoardEngine. Ktoś mógłby w tym momencie zapytać – sko-ro cały czas mówimy o implementacji warstwy logiki, to czemu nie dodaliśmy tej funkcjonal-ności w klasie CLaserQuestGamePlayMode.? Odpowiedź jest prosta – rozwiązanie takie by-łoby pogwałceniem zasady ukrywania infor-macji, jako że funkcja przedstawiona na Listin-gu 1 musi mieć dostęp do prywatnych składo-wych silnika planszy. Warto jednak zauważyć pewien interesujący fakt – otóż przedstawio-na wyżej funkcja jest absolutnie niezależna od warstwy logiki – nie określamy tutaj, który etap będzie wczytywany; ta decyzja będzie po-dejmowana na wyższym poziomie. Przeanali-zujmy krok po kroku implementację funkcji z Listingu 1 – zacznijmy od jej sygnatury. Już sama nazwa, LoadGridDataAndResetL, niesie ze sobą dwie cenne informacje. Po pierwsze – postfix L mówi nam, że funkcja może rzu-cić symbianowy wyjątek (korzystając ze slan-gu polskich programistów symbianowych można też powiedzieć, że ta funkcja może zle-aveować). Po drugie – nazwa funkcji sugeru-je, że odpowiada ona za dwie operacje – wczy-tanie danych planszy oraz zresetowanie silni-ka. Podejście takie – pomimo tego, iż łamie za-sadę przypisywania danej funkcji jednego, ja-sno określonego zadania – ma w tym przypad-ku rację bytu, gdyż wspomniane operacje są ze sobą ściśle powiązane. Jako argument funkcji otrzymujemy deskryptor (czytaj: napis) re-prezentujący ścieżkę, wskazującą na plik za-wierający interesujące nas dane. O deskryp-torach będę pisał w dalszej części niniejszego artykułu. To, na czym chciałbym skupić teraz uwagę to Operacje wejścia-wyjścia na plikach w Symbian OS.

Operacje wejścia-wyjścia na plikach w Symbian OSCiało przedstawionej na Listingu 1 funkcji LoadGridDataAndResetL rozpoczyna się od trzech niewiele mówiących linii kodu:

RFs fs;

User::LeaveIfError( fs.Connect() );

CleanupClosePushL( fs );

Dla programistów nieobeznanych z tajnikami programowania systemowego pod Symbian OS, przedstawiony urywek kodu wygląda nieco eg-zotycznie. Już spieszę z wyjaśnieniami. Otóż u podstaw filozofii Symbian OS leży założenie, iż wszystkie kluczowe usługi systemu operacyjne-go są bardzo intensywnie chronione. Aby uzy-skać ten efekt, projektanci Symbiana wbudowa-li w swój system specyficzne rozwiązanie znane jako infrastruktura klient/serwer (ang. Client-Server Framework). Rozwiązanie jest o tyle spe-cyficzne, iż wspomniana infrastruktura stano-wi część systemu operacyjnego i nie ma abso-lutnie nic wspólnego z Internetem czy siecia-mi komputerowymi. Mówiąc w dużym uprosz-czeniu – serwer reprezentuje usługę systemo-wą, zaś klient – kod, który z tej usługi korzysta. Klient i serwer komunikują się ze sobą jedynie w ramach ściśle określonego protokołu, zaś in-formacje są przesyłane przy pomocy bezpiecz-nych mechanizmów komunikacji międzypro-cesowej (ang. Inter Porcess Communication, IPC) – jako, że klient i serwer działają w odrębnych procesach systemu operacyjnego. Takie podej-ście ma w założeniu twórców Symbian OS za-pobiegać nadużywaniu i gubieniu zasobów sys-temowych.

Po przeczytaniu powyższego wywodu nie-trudno zgadnąć, iż operacje na plikach w Sym-bian OS są zaimplementowane właśnie w taki sposób. Klasa RFs reprezentuje tzw. sesję komu-nikacji z serwerem plików (według konwencji symbianowej klasy, których nazwa poprzedzo-na jest prefixem R reprezentują uchwyty do zasobów; w tym konkretnym przypadku mó-wimy o uchwycie od sesji komunikacji z ser-

Listing 2. Przykładowa specyfikacja poziomu gry LaserQuest

.#..###@....

#.#.......#.

......#.#...

..#.....#%##

....#*......

+......#...#

.....##.....

#%#.%..#.##.

.....#@.....

....#..#.##.

..#.........

...#%.#.#...

$#....#..@#.

#.....#..#..

#..#..%....#

#..@..#.....

130

Rysunek 3. Klatki animacji efektu wsuwania się planszy

Page 67: SDJ_12_2008_PL_Symbian OS

12/200866

Programowanie urządzeń mobilnychProgramowanie gier dla Symbian OS

www.sdjournal.org 67

werem zaalokowanej gdzieś po stronie syste-mu operacyjnego). Wywołanie fs.Connect() skutkuje podłączeniem do serwera plików (ja-ko, że operacja ta może się nie udać, korzysta-my z funkcji User::LeaveIfError, która rzu-ci symbianowy wyjątek gdy przekazany do niej kod błędu jest inny niż KErrNone). Jako, że pro-gramista jest zobowiązany do zamknięcia sesji po zakończeniu pracy z nią – w kolejnej linij-ce wkładamy sesję na stos czyszczenia, przy po-

mocy operacji CleanupClosePushL(). Dzięki temu, przy automatycznym zwijaniu stosu (np. w sytuacji gdy funkcja zleaveuje), na wskaźniku do sesji wywołana będzie operacja Close().

Kolejne trzy operacje w funkcji LoadGridDataAndResetL są koncepcyjnie bar-dzo podobne do tych opisanych powyżej – tyle, że tym razem otwieramy za pośrednictwem se-sji (fs) – strumień do konkretnego pliku. War-to zauważyć, że przy otwieraniu strumienia

przekazywana jest flaga EFileRead, co oznacza – tylko do odczytu.

Zanim przejdziemy do opisu kolejnego fragmentu kodu, warto spojrzeć na Listing 2, na którym zaprezentowana jest przykłado-wa specyfikacja poziomu LaserQuest; pomo-że ona zrozumieć co się dalej dzieje w funkcji LoadGridDataAndResetL.

Zastosowana reprezentacja jest bardzo pro-sta – poszczególnym elementom na planszy odpowiadają określone znaki, np. kropka (.) re-prezentuje puste pole, zaś gwiazdka (*) określa pozycję emitera wiązki lasera. Wygląd planszy opisanej na Listingu 2 przedstawiony jest na Rysunku 1. Taka, a nie inna reprezentacja wy-brana została głównie ze względu na prostotę edycji – znając odpowiednie zasady, każdy mo-że sobie stworzyć własną planszę przy pomocy zwykłego edytora tekstu. Warto w tym miej-scu zauważyć, że przy produkcji prawdziwych gier stosuje się zazwyczaj binarne formaty po-ziomów, generowane automatycznie przez edy-tory zaimplementowane jako narzędzia wspo-magające produkcję danego tytułu. Edytory takie odpowiadają zazwyczaj również za wali-dację generowanych danych – w celu odciąże-nia samej gry. W naszym przypadku – zarówno za edycję, jak i za walidację, odpowiada osobi-ście twórca gry – na kwestię tę uczulam szcze-gólnie tych Czytelników, którzy zdecydują się eksperymentować i tworzyć własne plansze do LaserQuest (do czego oczywiście serdecznie za-praszam!).

Znając postać pliku z opisem planszy łatwo odgadnąć jak działa dalsza część naszej funkcji wczytującej. Zewnętrzna pętla for odpowiada za czytanie linii przedstawionego pliku. War-to zauważyć, że przy wczytywaniu danych do deskryptora (tj. obiektu reprezentującego na-

Listing 3. Implementacja metody CLaserQuestGameBoardEngine::Field2Tile()

CLaserQuestGameBoardEngine::TTile

CLaserQuestGameBoardEngine::Field2Tile( TText8 aField )

{

switch ( aField )

{

case '.': return EEmpty;

case '#': return EMirrorWall;

case '@': return ESensor;

case '%': return EMirrorBlock;

case '$': return EExit;

case '*': return EBeamEmmiter;

case 'X': return EWall;

default: return EEmpty;

}

}

Listing 4. Implementacja metody CLaserQuestGamePlayMode::UpdateL()

void CLaserQuestGamePlayMode::UpdateL( TInt64 aDt )

{

iBoardEngine->Update( aDt );

if ( iKeyState & KKeySoftRight )

{

iMenuKeyPressed = ETrue;

}

else if ( iBoardEngine->IsSolved() )

{

++iLevel;

if ( iLevel > iMaxAchievedLevel )

{

++iMaxAchievedLevel;

}

if ( iLevel > KLevelCounter )

{

iMenuKeyPressed = ETrue;

iLevel = 1;

iMaxAchievedLevel = 1;

}

else

{

ReloadLevelL();

}

}

else if ( iKeyState & KKeySoftLeft )

{

iBoardEngine->Reset();

}

} Rysunek 4. Menu gry LaserQuest z aktywną opcją Restart

Page 68: SDJ_12_2008_PL_Symbian OS

12/200868

Programowanie urządzeń mobilnychProgramowanie gier dla Symbian OS

www.sdjournal.org 69

pis), nie podajemy w sposób bezpośredni ilo-ści bajtów do przeczytania – funkcja ta od-czyta tyle danych ile deskryptor jest w stanie pomieścić (w naszym przypadku – KLaserQuestCoreGridMaxWidth znaków). Wewnętrz-na pętla odpowiedzialna jest za rozkodowanie zawartości odczytanej linii i ustawienie odpo-wiednich wartości planszy. Warto też zwrócić uwagę na pomocniczą funkcję Field2Tile(), która tłumaczy przekazywany znak na odpo-wiednią wartość enumeracji reprezentującej składniki planszy. Do zapoznania się z zawar-tością tej funkcji (Listing 3), zachęcam przede wszystkim te osoby, które chciałyby pobawić się w projektowanie własnych planszy – sta-nowi ona swoistą ściągawkę. Nieco groźnie przedstawiający się typ argumentu przekazy-wanego do tej funkcji (TText8), to odpowied-nik zwyczajnego typu char wbudowanego w język C++.

To, o czym warto pamiętać dodatkowo, to fakt, iż poszczególne linie w pliku opisującym poziom gry LaserQuest odseparowane są dwu znakową sekwencją \r\n, stąd na końcu każdej iteracji pętli zewnętrznej pojawia się wywoła-nie reader.ReadInt16L();, powodujące przej-ście na początek kolejnego wiersza.Poza główną pętlą funkcji

LoadGridDataAndResetL()

pozostały nam jeszcze trzy rzeczy do zrobie-nia. Najpierw trzeba wczytać wartości opi-

sujące kierunek pojazdu oraz konfigurację emitera wiązki. Wartości te są enumeracja-mi przyjmującymi jedną z czterech możli-wych wartości – dlatego też w pliku są one opisane wartościami całkowitymi z zakresu 0 do 3. Rozważmy przykładowy odczyt ta-kiej wartości:

iVehicleDir =

static_cast< TDirection >(

reader.ReadInt8L() -

numChar2ValOffset );

Warto tu zwrócić uwagę na rzutowanie prze-kształcające odczytaną wartość na typ enu-meracji. Trzeba też pamiętać, że odczytana z pliku wartość to tak naprawdę kod ASCII znaku – dlatego trzeba ją przekonwertować na liczbę z zakresu <0, 3> odejmując od niej wartość znaku 0 (zapisanej w postaci stałej numChar2ValOffset).

Kolejna kwestia tyczy się zdjęcia ze stosu i zwolnienia zasobów zaalokowanych przez ser-wer plików – strumienia do pliku oraz sesji ko-munikacyjnej. Odpowiadają za to następujące dwie linie kodu:

CleanupStack::PopAndDestroy(); // reader

CleanupStack::PopAndDestroy(); // fs

Obydwa wyrażenia są tożsame ze zdjęciem danego obiektu ze stosu czyszczenia i z wy-wołaniem na nim metody Close().

Na samym końcu pozostaje zresetować sil-nik planszy – na szczęście do tego celu mamy już gotową funkcję – Reset(), więc możemy ją spokojnie wykorzystać.

Warstwa logiki gry – implementacja – podejście #1Tak oto mamy gotowy pierwszy klocek po-trzebny do implementacji warstwy logi-ki naszej gry. Spróbujmy zastosować funkcję LoadGridDataAndResetL() w praktyce. Na począ-tek dodajmy w klasie CLaserQuestGamePlayMode dwie składowe:

TInt iLevel;

TInt iMaxAchievedLevel;

Składowa iLevel przechowywać będzie war-tość poziomu, który jest aktualnie rozgrywa-ny, zaś w zmiennej iMaxAchievedLevel pro-gram będzie pamiętał największą wartość etapu, do którego udało się dotrzeć graczo-wi. Warto tu zwrócić uwagę na sposób inicja-cji tych składowych w ich macierzystej klasie. Pierwsza z nich zawsze będzie miała w trakcie tworzenia obiektu klasy przypisaną wartość 1, zaś druga będzie przekazywana z zewnątrz. Dlaczego jest to rozwiązane tak, a nie inaczej – opiszę nieco później.

Logika zarządzająca nowymi składowymi ukrywa się w metodzie

CLaserQuestGamePlayMode::UpdateL() (Listing 4).

Kluczowe zmiany w tej metodzie wią-żą się z uaktualnianiem wartości składowych iLevel oraz iMaxAchievedLevel w momen-cie przechodzenia pomiędzy etapami. W tej sytuacji należałoby również wczytać zawar-tość kolejnego poziomu – wydaje się, że zna-leźliśmy właściwe miejsce w którym moż-na zastosować funkcję opisaną w poprzednim punkcie. Spójrzmy na implementację metody ReloadLevelL(), przedstawionej na Listingu 5. Tutaj właśnie znajdziemy wywołanie meto-dy LoadGridDataAndResetL().

To co potrzebne nam do szczęścia – w przy-padku tej metody, to ścieżka do pliku z danymi odpowiedniego etapu. Tutaj pojawia się ważkie pytanie – gdzie powinniśmy przechowywać te-go rodzaju informacje. Ja zdecydowałem się umieścić je w tzw. prywatnym katalogu aplika-cji. Katalog taki opisany jest następującą ścież-ką w systemie plików urządzenia: !:\private\. Uważnych Czytelników zastanawia zapewne fakt użycia znaku ! w powyższej ścieżce. Wią-że się on z tym, iż miejsce pobytu aplikacji po zainstalowaniu na urządzeniu nie zawsze jest identyczne. Zależy to przede wszystkim od te-go, gdzie naszą aplikację zainstalujemy. W po-przednim odcinku cyklu – aby nie gmatwać te-matu – przyjąłem ograniczenie polegające na tym, iż zakładamy, że aplikacja będzie zawsze instalowana w głównej pamięci urządzenia. Osoby, które zadały sobie trud instalacji pierw-

Listing 5. Implementacja metody CLaserQuestGamePlayMode::ReloadLevelL()

void CLaserQuestGamePlayMode::ReloadLevelL()

{

TFileName levelFilePath;

#ifdef __WINS__

_LIT( KAppDrive, "c:" );

levelFilePath.Format( KLaserQuestLevelFilePathFormat,

&KAppDrive,

iLevel );

#else

levelFilePath.Format( KLaserQuestLevelFilePathFormat,

&iAppDrive,

iLevel );

#endif // __WINS__

iBoardEngine->LoadGridDataAndResetL( levelFilePath );

}

Listing 6. Konstruktor klasy CLaserQuestDocument: pobieranie informacji o miejscu instalacji programu

CLaserQuestDocument::CLaserQuestDocument(

CEikApplication& aApp )

: CAknDocument( aApp )

{

TParse fp;

fp.Set( Application()->AppFullName(), NULL, NULL );

TPtrC drivePtr = fp.Drive();

iAppDrive.Copy( drivePtr );

}

Page 69: SDJ_12_2008_PL_Symbian OS

12/200868

Programowanie urządzeń mobilnychProgramowanie gier dla Symbian OS

www.sdjournal.org 69

szej odsłony LaserQuest na telefonie, zauważy-ły być może, że po zainstalowaniu na karcie pa-mięci, aplikacja nie uruchamia się. Jest to zwią-zane właśnie z niepoprawnym ustawieniem ścieżek. Tym razem rozwiążemy problem kom-pleksowo – budując dynamicznie ścieżki dostę-pu do plików. Dzięki temu będziemy w stanie obsłużyć ścieżki specyficzne dla emulatora oraz dla urządzenia – zarówno w przypadku instala-cji w pamięci głównej jak i na zewnętrznej kar-cie pamięci.

Obsługa zewnętrznej karty pamięci i deskryptoryTo co jest nam niezbędne do poprawnego bu-dowania ścieżek do plików z zasobami apli-kacji, to nazwa napędu opisująca nośnik, na którym zainstalowania została aplikacja. Aby uzyskać tę informację musimy sięgnąć aż do klasy CLaserQuestDocument. Spójrzmy na zmodyfikowany konstruktor tejże klasy (Li-sting 6).

Kluczową rolę pełni w tym przypadku funk-cja Application()->AppFullName(), która zwraca pełną nazwę aplikacji, wraz ze ścieżką zawierającą interesującą nas nazwę napędu. Po-wstaje pytanie – jak wydobyć tę nazwę i prze-kazać ją dalej do aplikacji? Odpowiedzią są de-skryptory, tj. obiekty przeznaczone w Symbian OS do manipulacji napisami.

Dużo można by pisać o deskryptorach – two-rzących dość skomplikowaną hierarchię kilku-nastu powiązanych klas. Mówiąc w bardzo du-żym skrócie, rozwiązanie to w zamyśle twór-ców Symbian OS miało stanowić złoty środek pomiędzy efektywnością operacji na napisach (porównywanej z efektywnością funkcji mani-pulujących łańcuchami znaków ze standardo-wej biblioteki języka C) oraz bezpieczeństwa (głównie w kontekście występowania błędów przepełnienia bufora). Ceną za ten kompromis jest wysoki poziom komplikacji oraz stosunko-wo duża niewygoda w użyciu. W tym miejscu nawet nie będę podejmował próby przedstawie-nia kompleksowego opisu tematu; przeanalizu-jemy za to konkretne use-case'y wykorzystujące ten mechanizm w LaserQuest.

Zacznijmy od składowej iAppDrive, w kla-sie CLaserQuestDocument. Składowa ta jest ty-pu TBuf. Szablon TBuf reprezentuje modyfiko-walny napis o z góry określonej wielkości, prze-kazanej jako parametr szablonowy. W naszym przypadku mamy:

TBuf< KDriveNameMaxLength > iAppDrive;

gdzie stała KDriveNameMaxLength ma wartość 2. Spójrzmy ponownie na zawartość konstruk-tora CLaserQuestDocument. W pierwszej li-nijce konstruowany jest obiekt typu TParse. Obiekt ten służy do parsowania ścieżek pli-ków. Za jego pomocą możemy wyekstrahować ze ścieżki interesujące nas komponenty; mię-dzy innymi nazwę napędu. Aby to zrobić, mu-

simy powiązać deskryptor opisujący ścieżkę z obiektem parsera:

fp.Set( Application()->AppFullName(), NULL,

NULL );

W kolejnym kroku pobieramy interesującą nas informację:

TPtrC drivePtr = fp.Drive();

Listing 7. Zmodyfikowana implementacja funkcji wczytującej bitmapy z pliku mbm w klasie CLaserQuestGameMenuMode

void CLaserQuestGameMenuMode::ConstructL()

{

TFileName laserQuestMenuMbmFilePath;

laserQuestMenuMbmFilePath.Format(

KLaserQuestMenuMbmFilePathFormat,

&iAppDrive );

iTitle = new ( ELeave ) CFbsBitmap();

User::LeaveIfError(

iTitle->Load(

laserQuestMenuMbmFilePath,

EMbmLaserquestmenuLaserquestmenutitle ) );

iRestart = new ( ELeave ) CFbsBitmap();

User::LeaveIfError(

iRestart->Load(

laserQuestMenuMbmFilePath,

EMbmLaserquestmenuLaserquestmenurestart ) );

iActiveRestart = new ( ELeave ) CFbsBitmap();

User::LeaveIfError(

iActiveRestart->Load(

laserQuestMenuMbmFilePath,

EMbmLaserquestmenuLaserquestmenurestartactive ) );

iStart = new ( ELeave ) CFbsBitmap();

User::LeaveIfError(

iStart->Load(

laserQuestMenuMbmFilePath,

EMbmLaserquestmenuLaserquestmenustart ) );

iActiveStart = new ( ELeave ) CFbsBitmap();

User::LeaveIfError(

iActiveStart->Load(

laserQuestMenuMbmFilePath,

EMbmLaserquestmenuLaserquestmenustartactive ) );

iExit = new ( ELeave ) CFbsBitmap();

User::LeaveIfError(

iExit->Load(

laserQuestMenuMbmFilePath,

EMbmLaserquestmenuLaserquestmenuexit ) );

iActiveExit = new ( ELeave ) CFbsBitmap();

User::LeaveIfError(

iActiveExit->Load(

laserQuestMenuMbmFilePath,

EMbmLaserquestmenuLaserquestmenuexitactive ) );

Reset();

}

Page 70: SDJ_12_2008_PL_Symbian OS

12/200870

Programowanie urządzeń mobilnychProgramowanie gier dla Symbian OS

www.sdjournal.org 71

Tutaj warto zwrócić uwagę na obiekt typu TPtrC. Obiekt ten reprezentuje stały wskaź-nik na napis. Ważne jest to, aby zrozumieć, że TPtrC nie przechowuje własnej kopii danych napisu. Ponieważ chcemy mieć pewność, że nasze dane nie ulegną zniszczeniu – tworzy-my sobie własną kopię, przepisując napis opi-sany przez obiekt drivePtr do bufora iAppDrive:

iAppDrive.Copy( drivePtr );

Dwie ostatnie linijki można by zapisać w spo-sób jeszcze bardziej skondensowany:

iAppDrive.Copy( fp.Drive() );

Warto zauważyć, że w powyższym przykła-dzie nie przekazujemy nigdzie wielkości napi-sów. Wynika to z faktu, iż deskryptory prze-chowują informacje o wielkości reprezento-wanych napisów jako swoje składowe (stąd też wzięła się ich nazwa).

Kiedy mamy już bezpiecznie zachowa-ną nazwę napędu, wypadałoby przekazać ją do kolejnych warstw aplikacji. Aż się prosi aby zastosować w tym miejscu wzorzec Sin-gelton. Niestety, ze względu na pewne ogra-niczenia co do stosowania zmiennych sta-tycznych w Symbian OS, implementacja te-go wzorca jest nietrywialna i wybiega nie-co poza ramy niniejszego tekstu. W Lase-rQuest zastosujemy podobne podejście jak w przypadku statusu klawiatury i – jeśli zaj-dzie taka potrzeba – będziemy przekazy-wać interesującą nas informację do dalszych warstw aplikacji jako argument konstrukto-ra. Prześledźmy jak informacja o nazwie na-pędu trafia do funkcji wczytującej dane plan-szy. Wskaźnik do nazwy napędu jest przeka-zywany kolejno do klas: CLaserQuestAppUi, CLaserQuestContainer, CLaserQuestGame i wreszcie: CLaserQuestGamePlayMode. W tym miejscu warto zainteresować się jesz-cze, jak konstruowany jest wskaźnik TPtrC do bufora iAppDrive. Dzieje się to w funkcji CLaserQuestDocument::CreateAppUiL():

return ( static_cast< CEikAppUi* >(

new ( ELeave ) CLaserQuestAppUi(

TPtrC( iAppDrive ) ) ) );

Możemy ponownie przyjrzeć się teraz za-wartości metody ReloadLevelL() w klasie CLaserQuestGamePlayMode. Mamy tutaj do czynienia z formatowaniem deskryptora. Każ-dy modyfikowalny deskryptor wyposażony jest w metodę Format(), pozwalającą budować jego zwartość na bazie zadanego napisu forma-tującego – na podobnej zasadzie jak czyni to funkcja sprintf(). Napis formatujący w tym konkretnym przypadku ma postać:

_LIT( KLaserQuestLevelFilePathFormat,

"%S\private\a0009591\level%d.txt" );

Listing 8. Implementacja metody CLaserQuestGamePlayMode::DrawOptionsAndLevelCounter

void CLaserQuestGamePlayMode::DrawOptionsAndLevelCounter(

CBitmapContext& aGc ) const

{

_LIT( KResetOption, "RESET" );

_LIT( KMenuOption, "MENU" );

_LIT( KLevelCounterFormat, "LEVEL: %d" );

const TInt KLevelCounterMsgMaxLength = 16;

TBuf< KLevelCounterMsgMaxLength > levelCounterMsg;

levelCounterMsg.Format( KLevelCounterFormat, iLevel );

const TPoint KResetOptionPos( 5, 315 );

const TPoint KMenuOptionPos( 183, 315 );

const TPoint KLevelCounterMsgPos( 82, 20 );

aGc.UseFont( CEikonEnv::Static()->NormalFont() );

aGc.SetPenColor( KRgbWhite );

aGc.DrawText( KResetOption, KResetOptionPos );

aGc.DrawText( KMenuOption, KMenuOptionPos );

aGc.DrawText( levelCounterMsg, KLevelCounterMsgPos );

aGc.DiscardFont();

}

Listing 9. Implementacja metody ClaserQuestGameBoardEngine::DrawFadeIn()

void CLaserQuestGameBoardEngine::DrawFadeIn(

CBitmapContext& aGc ) const

{

for ( TInt x = KGridMinX; x < KGridMaxX; ++x )

{

for ( TInt y = KGridMinY; y < KGridMaxY; ++y )

{

if ( iCurrentGridData[ x ][ y ] < EGuard )

{

if ( y % 2 )

{

DrawTile( aGc,

x,

y,

iTileBitmaps[

TILE_ENUM_VAL_2_TILE_BITMAP_INDEX(

iCurrentGridData[ x ][ y ] ) ],

iFadeInX1,

0 );

}

else

{

DrawTile( aGc,

x,

y,

iTileBitmaps[

TILE_ENUM_VAL_2_TILE_BITMAP_INDEX(

iCurrentGridData[ x ][ y ] ) ],

iFadeInX2,

0 );

}

}

}

}

}

Page 71: SDJ_12_2008_PL_Symbian OS

12/200870

Programowanie urządzeń mobilnychProgramowanie gier dla Symbian OS

www.sdjournal.org 71

Znacznik %S jest wskazówką dla funkcji Format(), że w tym miejscu ma być wstawiona zawartość deskryptora przekazanego jako wskaź-nik, zaś znacznik %d służy do wstrzykiwania w tekst wartości całkowitych. Warto też przypo-mnieć, iż wartość a0009591 stanowi unikalny identyfikator (UID) naszej aplikacji. Spójrzmy jak zrealizowane jest formatowanie ścieżki:

levelFilePath.Format( KLaserQuestLevelFileP

athFormat,

&iAppDrive,

iLevel );

Zastosowane podejście przypomina roz-wiązanie wykorzystane w rodzinie funkcji printf(). Do funkcji przekazywany jest de-skryptor formatujący, a bezpośrednio po nim – lista argumentów odpowiadających poszcze-gólnym znacznikom. Warto zwrócić uwagę na zastosowanie operatora wyłuskania adresu przy przekazywaniu argumentu iAppDrive. Wielu początkujących programistów Symbia-nOS myli się, zapominając dodać ten opera-tor – szczególnie przy przekazywaniu obiek-tów typu TPtrC. Funkcja Format() nie rzuca co prawda wyjątków, jednakże w sytuacji kie-dy przekazane argumenty nie zgadzają się z napisem formującym, bądź formowany bufor zostanie przepełniony – wystąpi tzw. panika (ang. Panic), czyli symbianowy odpowiednik asercji. Jeśli operacja formatowania powiodła się – to wynikową ścieżkę przekazujemy do funkcji wczytującej dane. Voila!

Trzeba w tym miejscu podkreślić, że podobne podejście powinno być konsekwentnie stosowa-ne w całym projekcie. W naszym przypadku to samo odnosi się do funkcji wczytujących dane z plików mbm. Wszystkie te funkcje zostały zmo-dyfikowane w nowej odsłonie LaserQuest. Jedna z nich przedstawiona jest na Listingu 7.

Typ TFileName to zwyczajny, modyfikowal-ny bufor o długości 256 znaków (taką maksy-malną długość ścieżki obsługuje system plików Symbian OS).

Dociekliwych Czytelników zainteresu-je zapewne fakt, iż w przypadku funkcji ReloadLevelL() zastosowana jest instrukcja warunkowa preprocesora i w przypadku bu-dowania aplikacji pod emulator nazwa napędu podawana jest w sposób explicit (makro _LIT służy do definiowania literałów napisowych):

_LIT( KAppDrive, "c:" );

Rozwiązanie takie wynika z faktu, iż w przy-padku uruchamiania aplikacji pod emulatorem, funkcja Application()->AppFullName() zwraca ścieżkę odnosząca się do napędu z: (ROM). Pro-blem leży w tym, że pliki załadowane w tym na-pędzie mają status tylko do odczytu (read-only). Z tego względu katalog private oraz rezydujące w nim pliki umieszczone są w napędzie c:, który oferuje możliwość zapisu. W strukturze plików

emulatora, ścieżka do tego katalogu jest następu-jąca: \epoc32\winscw\c\private\a0009591; w tym właśnie miejscu należy umieścić pliku z podkata-logu levels w projekcie LaserQuest, aby gra zadzia-łała pod emulatorem.

Na tym zakończymy omawianie tematu de-skryptorów. To, czego ewidentnie zabrakło w naszych rozważaniach, to kilka słów na temat deskryptorów reprezentujących napisy alo-kowane dynamicznie (np. HBufC badź RBuf). Żądnych wiedzy Czytelników odsyłam do do-kumentacji dołączonej do SDK bądź do dobrej książki o Symbian OS (np. Symbian OS Expla-ined autorstwa Jo Stichbury).

Warstwa logiki gry –implementacja – podejście #2Jak na razie, oprogramowaliśmy warstwę logiki na poziomie klasy CLaserQuestGamePlayMode. Okazuje się jednak, że to nie wszystko – trzeba

jeszcze zmodyfikować zachowanie menu i za-implementować mechanizm zapamiętywania składowej iMaxAchievedLevel. W niniejszym punkcie przeanalizujemy jak zaimplemento-wać te brakujące elementy funkcjonalności lo-giki gry. Na początek rozważymy jak uprzyjem-nić życie gracza poprzez wyświetlanie informa-cji o numerze aktualnego etapu gry. Przy oka-zji oprogramujemy również wyświetlanie nazw opcji podpiętych w trakcie gry pod softbutton'y. Całą tę funkcjonalność umieściłem w metodzie CLaserQuestGamePlayMode::DrawOptionsAnd

LevelCounter (Listing 8).Operacje przedstawione w tej metodzie powin-

ny być znajome dla Czytelników. Są one na tyle oczywiste, że podaruję sobie opis. Efekt działania wspomnianej funkcji pokazany jest na Rysunku 2.

Kolejny, miły ukłon w stronę użytkownika, to mechanizm animowanego przejścia pomię-dzy etapami. Mechanizm ten polega na tym, że linie planszy wsuwają się poziomami w trak-

Listing 10. Implementacja metody CLaserQuestGameBoardEngine::UpdateFadeIn()

void CLaserQuestGameBoardEngine::UpdateFadeIn( TInt64 /*aDt*/ )

{

if ( iIsFadeIn )

{

iFadeInX1 += KFadeSpeed;

iFadeInX2 -= KFadeSpeed;

if ( iFadeInX1 > iFadeInX2 )

{

iIsFadeIn = EFalse;

}

}

}

Listing 11. Implementacja metody CLaserQuestGameMenuMode::Draw

void CLaserQuestGameMenuMode::Draw(

CBitmapContext& aGc ) const

{

if ( iIsRestartActive )

{

DrawWithRestart( aGc );

}

else

{

DrawWithoutRestart( aGc );

}

}

Listing 12. Implementacja metody CLaserQuestGameMenuMode::UpdateL()

void CLaserQuestGameMenuMode::Update( TInt64 aDt )

{

if ( iIsRestartActive )

{

UpdateWithRestart( aDt );

}

else

{

UpdateWithoutRestart( aDt );

}

}

Page 72: SDJ_12_2008_PL_Symbian OS

12/200872

Programowanie urządzeń mobilnychProgramowanie gier dla Symbian OS

www.sdjournal.org 73

cie rozpoczęcia nowego etapu, oraz wysuwa-ją się pionami kiedy etap się kończy. Tworzy to przyjemny dla oka efekt i uatrakcyjnia nie-co rozgrywkę. Implementacja tego mechani-

zmu wymaga modyfikacji na poziomie klasy CLaserQuestGameBoardEngine. Obsługa wsu-wania się planszy zrealizowana jest w dwóch metodach: CLaserQuestGameBoardEngine::

DrawFadeIn() oraz ClaserQuestGameBoardEngine::UpdateFadeIn() (Listingi 9 i 10).

To na co warto zwrócić uwagę we wspomnia-nych funkcjach, to wykorzystanie operatora mo-dulo (%) w celu przebierania parzystych i nieparzy-stych linii planszy. Na Rysunku 3 pokazane są trzy klatki animacji efektu wsuwania się planszy.

Czas na modyfikację menu. Generalnie po-mysł jest taki, aby – w momencie kiedy gracz przeszedł więcej niż jeden poziom – aktywo-wana była opcja Restart, pozwalająca rozpocząć grę od ostatnio osiągniętego etapu. Aby zaim-plementować tę funkcjonalność, musimy dodać w klasie CLaserQuestGameMenuMode zróżnico-wanie stanu. Posłuży nam do tego zmienna bo-olowska iIsRestartActive. Po modyfikacji, me-tody CLaserQuestGameMenuMode::Draw() oraz CLaserQuestGameMenuMode::UpdateL() mają po-stać taką jak przedstawiono na Listingach 11 i 12.

Jak widać na zaprezentowanych Listingach, rze-czywista funkcjonalność odpowiadająca poszcze-gólnym stanom została oddelegowana do me-tod pomocniczych. Zawartość tych metod moż-na przeanalizować w kodzie źródłowym pro-jektu – tradycyjnie dostępnym na witrynie SDJ (www.sdjournal.org). Efekty działania powyższych funkcji można za to obejrzeć sobie na Rysunku 4.

Na koniec rozważymy implementację mecha-nizmu zapamiętywania punktu restartu. Mecha-nizm ten zaimplementowany jest w dwóch funk-cjach: CLaserQuestGame::ReadRestartFileL() oraz CLaserQuestGame::WriteRestartFileL(). Zawartość pierwszej z wymienionych funkcji przedstawiona jest na Listingu 13.

Koncepcyjnie, działanie funkcji jest bardzo pro-ste. Na początku – zgodnie z Symbianowymi kon-wencjami, musimy otworzyć sesję komunikacyjną z serwerem plików. Dalej – przy użyciu pomocni-czej klasy BaflUtils sprawdzamy, czy interesują-cy nas plik istnieje (nazwa wspomnianego pliku jest konstruowana przy tworzeniu instancji obiek-tu klasy CLaserQuestGame i przechowywana w składowej iRestartFileName). Jeśli nie, to funkcja zwraca domyślną wartość (KDefaultMaxAchieve-dLevel). Jeśli plik był już wcześniej stworzony, to wartość jest z niego odczytywana. Fragment ko-du odpowiedzialny za tę funkcjonalność jest kon-cepcyjnie identyczny z podejściem opisywanym w przypadku metody LoadGridDataAndResetL.

To z czym wcześniej nie mieliśmy jeszcze do czynienia, to zapis do pliku. Realizacja tego za-dania w kontekście metody CLaserQuestGame::WriteRestartFileL() przedstawiona jest na Listingu 14.

Początkowa część zawartości wspomnianej metody jest niemalże identyczna jak w przypad-ku CLaserQuestGame::ReadRestartFileL(). Różnicę stanowi fakt, iż w sytuacji kiedy inte-resujący nas plik nie istnieje, tworzymy go wy-wołując na obiekcie RFile metodę Create(). W dalszej kolejności, otwieramy strumień do nowo utworzonego pliku (warto zwrócić uwa-gę na flagę EFileWrite) i przy pomocy funk-cji WriteInt16L() zapisujemy zawartość skła-

Listing 13. Implementacja metody CLaserQuestGame::ReadRestartFileL(): odczyt danych z pliku

TInt CLaserQuestGame::ReadRestartFileL()

{

const TInt KDefaultMaxAchievedLevel = 1;

RFs fs;

User::LeaveIfError( fs.Connect() );

CleanupClosePushL( fs );

if ( !BaflUtils::FileExists( fs, iRestartFileName ) )

{

CleanupStack::PopAndDestroy(); // fs

return KDefaultMaxAchievedLevel;

}

RFileReadStream reader;

reader.PushL();

User::LeaveIfError( reader.Open( fs,

iRestartFileName,

EFileRead ) );

TInt maxAchievedLevel = reader.ReadInt16L();

CleanupStack::PopAndDestroy(); // reader

CleanupStack::PopAndDestroy(); // fs

return maxAchievedLevel;

}

Listing 14. Implementacja metody CLaserQuestGame::WriteRestartFileL(): zapis danych do pliku

void CLaserQuestGame::WriteRestartFileL() const

{

RFs fs;

User::LeaveIfError( fs.Connect() );

CleanupClosePushL( fs );

if ( !BaflUtils::FileExists( fs, iRestartFileName ) )

{

RFile file;

User::LeaveIfError( file.Create( fs,

iRestartFileName,

EFileWrite ) );

file.Close();

}

RFileWriteStream writer;

writer.PushL();

User::LeaveIfError( writer.Open( fs,

iRestartFileName,

EFileWrite ) );

writer.WriteInt16L( iPlayMode->MaxAchievedLevel() );

writer.CommitL();

CleanupStack::PopAndDestroy() ; // writer

CleanupStack::PopAndDestroy() ; // fs

}

Page 73: SDJ_12_2008_PL_Symbian OS

12/200872

Programowanie urządzeń mobilnychProgramowanie gier dla Symbian OS

www.sdjournal.org 73

dowej iMaxAchievedLevel pobranej z obiek-tu iPlayMode za pośrednictwem dedykowane-go akcesora. Przy pracy ze strumieniem działa-jącym w trybie zapisu dobrze jest na końcu wy-wołać metodę CommitL(). Mamy wtedy pew-ność, że cała zawartość bufora strumienia zo-stanie z miejsca zapisana w docelowym pliku.

Na koniec warto zbadać to, w jaki sposób i gdzie wykorzystywane są opisane wyżej me-tody. Pierwsza z nich – CLaserQuestGame::ReadRestartFileL() – wywoływana jest

w konstruktorze klasy CLaserQuestGame, jako że zawartość pliku restart.txt po-trzebna jest do utworzenia obiektu klasy CLaserQuestGamePlayMode (Listing 15).

Druga interesująca nas funkcja – CLaserQuestGame::WriteRestartFileL() – wykorzystana jest w dwóch miejscach. Pierw-sze z nich to funkcja CLaserQuestContainer::UpdateL (Listing 16).

Drugie, to CLaserQuestAppUi::HandleCommandL (Listing 17).

Warto podkreślić, iż to drugie miejsce – cho-ciaż mniej intuicyjne – jest bardzo istotne. Gdybyśmy je pominęli, to wszystkie niekontro-lowane wyjścia z aplikacji (np. poprzez użycie klawisza czerwonej słuchawki) pozostałby nie-obsłużone.

PodsumowanieKończymy trzeci odcinek cyklu artykułów o programowaniu gier przeznaczonych dla Sym-bian OS. W powyższym tekście wykorzystali-śmy warstwę logiki gry jako pole doświadczal-ne dla badania takich mechanizmów jak opera-cje wejścia/wyjścia czy deskryptory. Przy okazji starałem się przemycić szczyptę treści zahacza-jących o temat projektowania gier na urządze-nia mobilne. Zgodnie z tradycją – na koniec od-cinka przygotowałem zadania dla Czytelników. Pierwsze ze wspomnianych zadań niewiele ma wspólnego z programowaniem i polega na za-projektowaniu nowych poziomów gry (w za-łączonej wersji aplikacji jest tylko 5 etapów). Osoby, które zaprojektują jakieś ciekawe plan-sze zachęcam od wysłania ich do mnie – z przy-jemnością umieszczę je w finalnej wersji apli-kacji. Drugie zadanie polega na implementa-cji mechanizmu wyboru planszy przy starcie gry. Dlaczego akurat tak? Otóż istniejące za-kończenie gry jest mało atrakcyjne. O ileż cie-kawiej byłoby, gdyby po pomyślnym ukończe-niu LaserQuest – w ramach nagrody – poja-wiała się na stałe nowa opcja pozwalająca roz-począć grę od dowolnego etapu (ot, chociażby po to, aby potrenować rozwiązywanie poszcze-gólnych poziomów, lub pochwalić się przed znajomymi:))?

W następnej – czwartej (i najprawdopo-dobniej ostatniej odsłonie cyklu) – pokażę jak oprogramować dźwiękową warstwę gry, a tak-że kilka innych ciekawostek. Na samym koń-cu chciałbym podziękować wszystkim Czy-telnikom, którzy napisali do mnie po przeczy-taniu pierwszej części cyklu artykułów o pro-gramowaniu gier dla Symbian OS – Wasze cie-płe słowa stanowiły dla mnie dużą motywację do dalszej pracy. Pragnę również podziękować mojej ukochanej żonie, Oli – za cierpliwość i wsparcie.

Listing 15. Konstruktor klasy CLaserQuestGame

void CLaserQuestGame::ConstructL( TPtrC aAppDrive )

{

iMenuMode = CLaserQuestGameMenuMode::NewL(

iKeyState,

aAppDrive );

TInt maxAchievedLevel = ReadRestartFileL();

iPlayMode = CLaserQuestGamePlayMode::NewL(

iKeyState,

aAppDrive,

maxAchievedLevel );

}

Listing 16. Implementacja metody CLaserQuestContainer::UpdateL

void CLaserQuestContainer::UpdateL( TInt64 aDt )

{

iGame->Update( aDt );

if ( iGame->ExitFlag() )

{

if ( iAppUi != NULL )

{

iGame->WriteRestartFileL();

iAppUi->Exit();

}

}

}

Listing 17. Implementacja metody CLaserQuestContainer::UpdateL

void CLaserQuestAppUi::HandleCommandL( TInt aCommand )

{

switch ( aCommand )

{

case EEikCmdExit:

{

iAppContainer->Game()->WriteRestartFileL();

Exit();

break;

}

default: break;

}

}

ErratraKolejny błąd, który znalazłem po opublikowaniu drugiego odcinka cyklu, to niezgodność w kon-wencji nazewnictwa funkcji. Chodzi o to, że wszystkie funkcje Update w projekcie powinny mieć w nazwie postfiks L – ze względu na to, że mogą one potencjalnie wywoływać operacje leave’u-jące (np. wczytywanie danych z plików). W najnowszej wersji LaserQuest usterka ta została usu-nięta.

RAFAŁ KOCISZ Pracuje na stanowisku Dyrektora Technicznego w

firmie Gamelion, wchodzącej w skład Grupy BLStre-

am. Rafał specjalizuje się w technologiach zwią-

zanych z produkcją oprogramowania na platfor-

my mobilne, ze szczególnym naciskiem na tworze-

nie gier. Grupa BLStream powstała, by efektywniej

wykorzystywać potencjał dwóch szybko rozwijają-

cych się producentów oprogramowania – BLStre-

am i Gamelion. Firmy wchodzące w skład grupy

specjalizują się w wytwarzaniu oprogramowania

dla klientów korporacyjnych, w rozwiązaniach mo-

bilnych oraz produkcji i testowaniu gier.

Kontakt z autorem: [email protected]

Page 74: SDJ_12_2008_PL_Symbian OS

Wywiad

12/200874

Wywiad

www.sdjournal.org 75

Software Developer's Journal: Ostatnio wiele mówiono o zamiarze sprzedaży przez firmę Borland części firmy odpo-wiedzialnej za rozwój narzędzi progra-mistycznych (CodeGear). Transakcja zo-stała przeprowadzona. Proszę powie-dzieć naszym czytelnikom więcej na te-mat firmy, która przejęła Delphi, C++Bu-ilder i inne rozwiązania RAD?Ludovic Neveu: Firma Embarcadero Tech-nologies powstała w 1993 roku. Po prze-jęciu grupy CodeGear (czerwiec 2008) sta-ła się największym, niezależnym dostawcą narzędzi wspierających programistów i ad-ministratorów baz danych oraz programi-stów aplikacji. Obecnie z rozwiązań Embar-cadero korzysta ponad trzy miliony użyt-kowników wykorzystujących różnorodne platformy i języki programowania.

SDJ: Dlaczego Embarcadero zdecydo-wało się na zakup CodeGear? LN: Ta transakcja pozwoliła na połącze-nie firm charakteryzujących się zbliżony-mi modelami biznesowymi oraz posiada-jących komplementarne względem sie-bie linie produktów. Przejęcie CodeGear umożliwiło Embarcadero stworzenie peł-nego portfolio produktów do modelowa-nia, tworzenia, zarządzania i optymalizo-wania zarówno baz danych, jak też aplika-cji. Nasi klienci mogą teraz korzystać z bo-gatszej oferty narzędziowej oraz rozsze-rzonego wsparcia technicznego.

SDJ: Musi się Pan zgodzić, że firma Em-barcadero nie jest tak dobrze rozpozna-wana w Europie jak Borland. Nie oba-wia się Pan, że może mieć to negatyw-ny wpływ na wizerunek nowo przeję-tych narzędzi?LN: Nie obawiamy się tego. Embarcade-ro jest firmą dobrze rozpoznawaną wśród społeczności związanej z bazami danych. Działamy w tej branży od ponad 15 lat. Embarcadero koncentruje się na obsza-rze programowania – przeznaczamy 100% naszej energii na działania mające na ce-lu uczynienie programowania jeszcze bar-

dziej wydajnym. Programowanie to prze-cież także obszar działania firmy CodeGe-ar. Przez ostatnie 3 miesiące wprowadzili-śmy na rynek nowe wersje Delphi i C++Bu-ilder oraz bazę danych InterBase. Zinte-growaliśmy Delphi i C++Builder z rozwią-zaniem ER/Studio – czołowym produktem Embarcadero dla architektów baz danych. To dopiero początek naszych działań.

SDJ: Czy i w jakim stopniu obecni i przy-szli klienci firmy odczują przejęcie Co-deGear? LN: Po przejęciu CodeGear będziemy do-starczać pełne spektrum narzędzi do two-rzenia baz danych oraz aplikacji w ramach jednej firmy. Pozwoli to naszym klien-tom na łatwiejszy wybór rozwiązań do projektowania (narzędzia do wizualizacji danych i kodu), tworzenia (narzędzia do programowania, optymalizowania i wdra-żania kodu) oraz zarządzania i administro-wania (narzędzia do zarządzania systema-mi) projektami i bazami.

SDJ: Mówi Pan o Embarcadero Techno-logies jako całości. Jak wygląda podział pomiędzy rozwiązaniami bazodanowy-mi i nowo zakupionymi rozwiązaniami programistycznymi?LN: W wyniku przejęcia grupy CodeGe-ar Embarcadero Technology wzbogaci-ło swoją ofertę o rozwiązania dla progra-mistów aplikacji. Podjęliśmy decyzję o za-chowaniu nazwy CodeGear dla tej linii produktów. Stworzyliśmy jednocześnie nową nazwę dla istniejących produktów bazodanowych – DatabaseGear. Obecnie Embarcadero dostarcza narzędzia wspie-rające programistów korzystających z róż-nych języków programowania i platform bazodanowych. Rodzina rozwiązań Data-baseGear wspiera największe i najpopu-larniejsze platformy bazodanowe, w tym: Oracle, SQL Server, DB2, Sybase, a narzę-dzia CodeGear programistów wykorzy-stujących w swojej pracy najbardziej wy-dajne języki: Java, C++, Delphi, PHP, Ru-by on Rails.

Wywiad z Ludovic NeveuDyrektorem ds. Sprzedaży w Embarcadero Technologies

Ludovic NeveuDyrektor ds. Sprzedaży obszaru EMEA w Embarca-

dero Technologies (Europa, Bliski Wschód, Afryka),

odpowiedzialny za realizowanie działań bizneso-

wych firmy poza obszarem Ameryki. Neveu posia-

da bogatą wiedzę i doświadczenie zdobyte pod-

czas 15 lat pracy w czołowych firmach z branży IT,

w tym Borland i Symantec. W czasie pracy w firmie

Borland był odpowiedzialny między innymi za kie-

rowanie grupą zajmującą się narzędziami progra-

mistycznymi (CodeGear) w regionie EMEA. Dwu-

krotnie otrzymał nagrodę za najlepszego Dyrekto-

ra ds. Sprzedaży.

Page 75: SDJ_12_2008_PL_Symbian OS

Wywiad

12/200874

Wywiad

www.sdjournal.org 75

SDJ: Czy nie obawia się Pan, że produkty z grupy CodeGear mogą stracić na zna-czeniu w firmie Embarcadero, która po-siada znacznie większe doświadczenie w narzędziach bazodanowych?LN: Nie. Jak wspomniałem Embarcadero działa wyłącznie w obszarze programowa-nia. Przed przejęciem zarówno Embarca-dero, jak i CodeGear miały zbliżone obro-ty, strategie sprzedaży oraz politykę pro-duktową. Nie zdecydowaliśmy się na za-kup wyłącznie dobrze znanych marek jak Delphi i C++Builder, ale podjęliśmy decy-zję o zatrudnieniu całego zespołu Badaw-czo-Rozwojowego (R&D) CodeGear. Obec-nie te same osoby, które pracowały w Co-deGear w strukturze firmy Borland, pracują nad nowymi wersjami narzędzi w Embarca-dero. Zgodnie z badaniami IDC liczba pro-gramistów na świecie wzrośnie z 13 milio-nów w 2007 roku do 17 milionów w 2011. To świetna perspektywa dla nas – musimy równocześnie rozwijać obie linie produkto-we CodeGear i DatabaseGear, aby zaspoko-ić przyszły popyt i nowe potrzeby rosnącej społeczności programistów.

SDJ: Dla kogo przeznaczone są rozwią-zania DatabaseGear? Proszę powiedzieć o nich kila słów. LN: Wykorzystując produkty w rodziny Data-baseGear możemy wesprzeć główne obsza-ry całego cyklu tworzenia i administrowania bazami danych. Pierwszym, bardzo ważnym etapem jest projektowanie baz danych. Roz-wiązanie ER/Studio pozwala architektom na modelowanie i dokładne poznanie struktur baz danych działających w przedsiębiorstwie oraz dostarcza wsparcie podczas przenosze-nia danych, ich migracji oraz integracji. Pro-gramiści baz danych mogą korzystać ze zin-tegrowanego, międzyplatformowego środo-wiska, powalającego na zwiększenie wydaj-ności programowanych baz – DB Optimizer. Nie zapominamy także o programistach apli-kacji, którzy potrzebują narzędzi do tworze-nia wydajnego kodu SQL – dla nich stworzy-liśmy RapidSQL. DBArtisan wspiera admini-stratorów baz danych w administrowaniu nimi oraz zagwarantowaniu obsługiwanym bazom ich maksymalnej dostępności, wydaj-ności i bezpieczeństwa. Rozwiązanie Chan-ge Manager jest zestawem narzędzi ułatwia-jących i automatyzujących cykl zarządzania zmianą w obrębie baz danych. Narzędzie to współpracuje z pozostałymi rozwiązania-mi zapewniając wersjonowanie tworzonych produktów oraz wygodną i efektywną pra-cę zespołową.

SDJ: Jakie są plany odnośnie nowych na-rzędzi w obszarze rozwiązań CodeGear? LN: We wrześniu wprowadziliśmy nowe wersje naszych czołowych narzędzi pro-

gramistycznych dla platformy Win32 – Del-phi 2009 i C++Builder 2009. Obydwa śro-dowiska wspierają obsługę Unicode, dzię-ki czemu stworzone w nich aplikacje wy-glądają i działają poprawnie niezależnie od wersji językowej platformy Windows, na której zostały uruchomione. Nowością śro-dowisk są także zintegrowane narzędzia do tłumaczenia aplikacji oraz zarządzania projektami tłumaczeń. Delphi zyskało ob-sługę generycznych typów danych oraz metod anonimowych. C++Builder nato-miast jest zgodny ze standardami C++0x, które zostaną oficjalnie wprowadzone do-piero w przyszłym roku. W ostatnich tygo-dniach na rynku pojawiła się nowa wersja bazy danych InterBase SMP 2009, charak-teryzującą się zwiększoną funkcjonalno-ścią w obszarze bezpieczeństwa (szyfro-wanie transmisji over the wire i obsługa szyfrowania całych tablic albo poszczegól-nych kolumn) oraz wbudowanym wspar-ciem dla architektury wieloprocesorowej (do 8 CPU). Jesteśmy bardzo zdetermino-wani, aby zintensyfikować nasze działania i zwiększyć naszą obecność w szkołach i uczelniach. Na początku 2009 roku wpro-wadzimy nowe produkty, które będą do-pasowane do potrzeb studentów i oczeki-wań placówek edukacyjnych – Turbo Pas-cal i Turbo C++.

SDJ: Wspomina Pan o planach CodeGear w obszarze rozwiązań wspierających do-starczanie natywnych aplikacji Win32. Co z produktami wspierającymi inne platfor-my, w tym .NET i Java?LN: Jako niezależny dostawca narzędzi pro-gramistycznych wspieramy programistów wykorzystujących różne platformy i różne ję-zyki (kompilowane, zarządzane, dynamicz-ne). Dla programistów Java mamy oparte na platformie Eclipse narzędzie JBuilder oraz moduły JGear – specjalne wtyczki dla pro-gramistów Eclipse rozszerzające wydajność tego środowiska oraz dodające nowe moż-liwości pracy zespołowej. Ostatnio wpro-

wadziliśmy nowe, wydajne środowisko dla programistów .NET, które jest także częścią pakietu RAD Studio (razem z Delphi 2009 i C++Builder 2009). Dla programistów PHP przygotowaliśmy środowisko Delphi for PHP wykorzystujące bibliotekę wizualnych kom-ponentów PHP5 wzorowaną na VCL z Delphi, a dla programistów Ruby pierwsze narzędzie RAD wspierające platformę Ruby on Rails – 3rdRail. Oprócz bazy InterBase mamy także bazę BlackfishSQL – zgodną ze standardem SQL, przenośną bazę danych dla programi-stów .NET oraz Java.

SDJ: Czy planujecie zintegrować narzę-dzia CodeGear i DatabaseGear w jedno rozwiązanie? LN: Tak, planujemy taką integrację. Już te-raz dostarczamy narzędzia Delphi i C++Bu-ilder w wersji Architect razem z rozwią-zaniem do modelowania baz danych ER/Studio. Stawiamy na integrację produk-tów, pod warunkiem, że ta integracja przy-czyni się do zwiększenia wydajności pra-cy użytkowników naszych rozwiązań oraz ułatwi im realizowanie zadań.

SDJ: Po przejęciu CodeGear firma mu-si zweryfikować dotychczasowe kana-ły sprzedaży w wielu krajach. Czy pla-nujecie oddzielną sieć partnerów zaj-mujących się rozwiązaniami Database-Gear i CodeGear? Jak sytuacja wygląda w Polsce?LN: Działamy obecnie w 29 krajach na całym świecie poprzez sieć własnych oddziałów, jak też sieć naszych Partnerów. Biorąc pod uwa-gę zaszłości historyczne część naszych part-nerów może mieć większe doświadczenie w sprzedaży i wsparciu narzędzi bazodano-wych, a część narzędzi do tworzenia aplika-cji. Docelowo będą jednak wspierać wszyst-kie rozwiązania dostarczane przez Embar-cadero – z linii CodeGear oraz DatabaseGe-ar. W Polsce naszym Partnerem jest BSC Pol-ska, która już teraz oferuje wsparcie wszyst-kich produktów.

Jarosław Kania, Prezes BSC Polska BSC Polska jest wyłącznym Partnerem firmy Borland w Polsce od 1996 roku. Obecnie tak-że jako Partner Embarcadero Technologies do portfela oferowanych rozwiązań i usług z ob-szaru wsparcia zarządzania cyklem produkcji oprogramowania (Borland ALM) oraz narzędzi programistycznych (CodeGear) wprowadzili-śmy kompletny zestaw rozwiązań do progra-mowania i zarządzania bazami danych (Data-baseGear). Z przyjemnością podjęliśmy decy-zję o rozszerzeniu naszej oferty, dzięki której możemy zapewnić naszym klientom optymal-nie wykorzystanie baz danych oraz przecho-wywanych w nich informacji.

Page 76: SDJ_12_2008_PL_Symbian OS

12/200876

Recenzja programuRecenzja programu WinZip 12.0

www.sdjournal.org 77

WinZip jest jednym z najpopularniej-szych kompresorów plików na ryn-ku. Jego niedawno opublikowana

12 wersja przyniosła wiele ciekawych nowości i udoskonaleń w zakresie kompresji i zarządza-nia plikami graficznymi, wydajniejszej metody kompresji zip, obsługi alternatywnych forma-tów kompresji czy szyfrowania AES.

Po instalacji i rejestracji (za opłatą – do wersji pro – inaczej korzystamy z wersji ewaluacyjnej) wita nas przejrzysty interfejs użytkownika lub kre-ator (wizard) zależnie od tego, co wybraliśmy w czasie konfiguracji podczas pierwszego urucho-mienia programu. Interfejs zawiera szereg cieka-wych rozwiązań. Pierwszym z nich jest wprowa-dzenie Smart View. Przeglądarka archiwów sa-ma rozpoznaje jakie pliki stanowią większość ar-chiwum i dostosowuje tak okno przeglądania, by pliki najwygodniej było oglądać. Jeżeli mamy plik zip ze zdjęciami, to jego zawartość ukaże się w po-staci miniaturek obrazków, a jeżeli zbiór stanowią foldery, to będziemy je mogli przeglądać w wygod-nym drzewie katalogów, znacznie ułatwiającym poruszanie się pomiędzy nimi. Jeśli zaś nasze ar-chiwum nie zawiera plików graficznych ani kata-logów, to zawartość zostanie przedstawiona w po-staci widoku klasycznego. Kolejną bardzo przydat-ną nowością jest możliwość zmiany nazwy plików

i folderów wewnątrz skompresowanych zbiorów bez ich uprzedniej dekompresji. Mało tego, może-my bezpośrednio w pliku zip dowolnie reorgani-zować strukturę plików i katalogów metodą prze-ciągnij i upuść. Bardzo brakowało tej możliwości w poprzednich edycjach WinZipa i jest to niewąt-pliwie jedna z najważniejszych nowości wprowa-dzona w 12 odsłonie tego programu. Do naszych usług oddano też nowe okno informacyjne zawie-rające dane o zbiorze, np. ilość miejsca zajmowa-nego przez zbiór przed i po kompresji oraz wyni-kłą z tego ilość zaoszczędzonego miejsca (podaną dodatkowo w procentach). Kolejne udane drob-ne udogodnienie, które znacznie uprzyjemnia-ją proces kompresowania plików. Dla posiadaczy wersji Pro zostało także oddane do użytku narzę-dzie automatyzujące pracę z archiwami WinZip Job Wizard. Zasada jego działania polega na stwo-rzeniu szablonów postępowania z plikami .zip w przypadku ich tworzenia lub zmian. Są to typowe makra znacznie skracające czas pracy ze skompre-sowanymi zbiorami, ale są pomocne użytkowni-kom, dla których praca na archiwach jest chlebem powszednim (backup'y, archiwizacja, przygotowa-nie do częstego przesyłania plików, np. tygodnio-wych raportów, itp.).

Kreator wygodnie przeprowadza użytkowni-ka poprzez cały proces kompresowania danych.

Wybieramy pliki/foldery, które będą się składać na zbiór, rodzaj kompresji (obsługiwane forma-ty to m.in. zip, rar, gz, tar, lha, 7z, iso, img i jesz-cze wiele innych) i na końcu stopień kompresji (proces wydajniejszego kompresowania używa bardziej skomplikowanych algorytmów przez co czas kompresji jest dłuższy i vice versa – mniej wydajna kompresja trwa krócej).

Podczas instalacji mamy też możliwość inte-gracji aplikacji z systemem. Dzięki temu poja-wia nam się nowa pozycja w menu konteksto-wym (prawy przycisk myszy) – WinZip, po roz-winięciu której mamy szybki dostęp do najczę-ściej używanych opcji kompresji lub dekompre-sji. Funkcjonalność ta jest znana z poprzednich wersji i bardzo ułatwia pracę ze zbiorami.

Największa część nowości skierowana jest do użytkowników aparatów cyfrowych. Znajdzie-my wśród nich m.in. wprowadzenie wydajniej-szej kompresji plików JPEG oszczędzających w po-równaniu z poprzednią wersją WinZipa od 20 do 25% miejsca zajmowanego przez skompresowany zbiór. Pakowanie oczywiście odbywa się bez utra-ty jakości zdjęcia. Przydaje się to szczególnie oso-bom trzymającym swoje zbiory na nośnikach przenośnych. Ukłon, jaki producenci tego archi-wizera zrobili w stronę miłośników cyfrowego pstrykania, staje się jeszcze widoczniejszy, po od-

Recenzja programu WinZip 12.0

Page 77: SDJ_12_2008_PL_Symbian OS

12/200876

Recenzja programuRecenzja programu WinZip 12.0

www.sdjournal.org 77

kryciu opcji selektywnego wyodrębniania plików ze zbioru zip i tworzenia z nich następnego zbio-ru. Możliwa jest również zmiana rozmiarów obra-zów w nowo powstałym zbiorze bez modyfikacji rozmiaru oryginalnych obrazków. Ułatwia to dzie-lenie się galeriami ze znajomymi, gdy potrzeba nam wysłać część zdjęć z archiwum poprzez pocz-tę elektroniczną jako załącznik zip. Użytkownicy wersji Pro Winzipa mają także możliwość bezpo-średniego wysłania wyselekcjonowanych plików jako archiwum zip na wybrany serwer ftp. Uła-twienie edycji zdjęć zapewnia obsługa miniatu-rek, dzięki czemu możemy podejrzeć zdjęcia z ar-chiwum. Możemy również przeglądać je w trybie pokazu slajdów za pomocą wbudowanej w WinZi-pa przeglądarki plików graficznych i bezpośrednio w niej modyfikować wymiary obrazków, obracać je oraz usuwać bez potrzeby wyodrębniania ich z archiwum. Szczególnie ta funkcjonalność zwięk-sza efektywność pracy na naszych zbiorach i po-winna się spodobać wszystkim wykonującym wie-le podstawowych operacji na dużych ilościach pli-ków graficznych.

Efektywność archiwizowania WinZipa 12 w po-równaniu z największymi konkurentami na rynku przedstawia wykres. Najbardziej przykuwa uwa-gę wydajność pakowania obrazów. Okazuje się, iż producenci WinZipa nie kłamali i rzeczywiście je-żeli posiadamy duże zbiory fotografii, to przy uży-ciu najwydajniejszej metody kompresji można uzy-skać o wiele więcej miejsca na dysku lub innym no-śniku. Zaznaczyć jednak należy, że testowane foto-grafie były w postaci plików .jpeg. W przypadku in-nych zbiorów najnowszy WinZip jest niezauważal-nie wydajniejszy od swoich konkurentów. Prawdo-podobnie jest to spowodowane zastosowaniem no-wej technologii kompresji LZMA.

Zadbano także o zabezpieczenie naszych zbio-rów poufnych. Certyfikowane szyfrowanie AES stało już się znakiem rozpoznawczym WinZipa. Do wyboru mamy 128- lub 256-bitowe szyfrowa-nie co całkowicie zabezpiecza nasze zbiory przed nieuprawnionym dostępem (oczywiście tylko w przypadku, gdy włamywacz nie zna hasła lub to hasło nie jest oczywiste do odgadnięcia). Wersja Pro zawiera wiele interesujących dodatków rozsze-rzających opcje szyfrowania, m.in.

nowe okno pozwalające administratorowi wy-brać wymagania co do tworzonego hasła (jego mi-nimalna długość oraz rodzaje znaków, które mają być w nim użyte) oraz dodatkowe menu kontro-la szyfrowania, które administratorzy mogą użyć do kontroli uprawnień użytkowników do szyfro-wania zbiorów (np. ograniczyć im ilość metod szy-frowania lub zabronić całkowicie szyfrować archi-wa). Rozwiązania te są przeznaczone raczej dla za-stosowań komercyjnych i nie będą używane w do-mowych zastosowaniach. Kolejną z nowości jest wprowadzenie dodatkowej kolumny w przeglą-darce archiwum, która opisuje czy plik jest zaszy-frowany czy nie oraz kiedy plik jest zabezpieczony przed odczytem oraz kiedy dostępny.

Co do wad tego programu, to jedynym manka-mentem, do którego można się przyczepić, jest w

WinZipie jego złożona funkcjonalność, która mo-że być z drugiej strony jego największą zaletą. Otóż z wersji na wersję z prostego narzędzia do kompre-sji powstaje wielki kombajn wykonujący różne za-dania, które nijak się mają do kompresji i zarządza-nia archiwami. Przeglądarka oraz prosty edytor plików graficznych, klient email wysyłający archi-wa bezpośrednio jako załączniki czy klient ftp wy-syłający je protokołem ftp. Powoli z WinZipem sta-je się to samo co z programami typu Nero Burning Rom czy WinAmp – następuje tworzenie ogrom-nego kombajnu, gdzie na drugi plan schodzi kom-presja danych, a pojawia się masa wodotrysków. Kolejne wersje być może będą zawierać podręcz-ny odtwarzacz multimedialny audio/video lub prostą przeglądarkę internetową, a może nawet i proste gierki. Ta wada na szczęście jest zniwelowa-na przez fakt, że aplikacja ma przejrzysty interfejs i jej złożoności po prostu nie widać. Kto będzie ko-rzystał w domowych zastosowaniach tylko z pod-stawowych opcji, pozostałych nie będzie widział, a jak mu będą potrzebne, to je bardzo szybko znaj-dzie za sprawą dużej intuicyjności interfejsu.

Podsumowując, WinZip 12 jest naprawdę cie-kawą aplikacją, jedną z podstawowych, które insta-lujemy tuż po instalacji systemu, gdyż bez archiwi-zera ani rusz. Bez niego nie otworzymy skompre-sowanych archiwów zawierających ściągnięte ste-rowniki z internetu, ani nie wyślemy zbioru pli-ków w załączniku wiadomości email (wyobraźmy sobie np. 50 plików do dodania w polu załączni-ków). Z nowej wersji programu powinni się ucie-szyć miłośnicy cyfrowej fotografii, gdyż to dla nich przygotowano najwięcej udoskonaleń. Pozostali użytkownicy z pewnością docenią wiele wymie-nionych wyżej ułatwień, które ta wersja wprowa-dziła. Z tego też względu polecamy, by WinZip w swojej 12 odsłonie zagościł na waszych dyskach.

Metodologia wykonanego testu: Celem testu było sprawdzenie i porównanie wy-dajności archiwizowania aplikacji przeznaczo-nych do tego zadania z wyjątkowym uwzględ-nieniem w nich efektywności pracy WinZipa 12. Test objął 4 aplikacje – WinZip 12, WinZip 11, zintegrowany packer w środowisku Gnome (Linux) oraz WinRar 3.61 PL. Testy dla WinZip 11 i 12 wykonano przy użyciu metody normal-nej i najwydajniejszej.

Poszczególne zbiory zawierały: Filmy: jeden zwykły film – 700Mb [kopia ro-biona z oryginału];Audio: 22 pliki .mp3;Aplikacje: dwie gry, których trzon stanowiły pliki .exe;Fotki: 151 elementów – obrazki .jpeg 2080x1544 px;Dokumenty: pokaźny mix zbiorów .odt,.do-c,.pdf,.ppt i .xls.

MIROSŁAW WDOWIAKKontakt z autorem: [email protected]

Page 78: SDJ_12_2008_PL_Symbian OS

KLUB PROOferta 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.

FRONTLINE STUDIOSFrontline Studios – amerykańsko-polski twórca gier konsolowych oraz PC – szuka utalentowanych ko-derów (bardzo dobra znajomość C/C++; Java, Del-phi, UML), doświadczonych grafików (2D, 3D) oraz zespołów developerskich. Oferujemy długotermi-nową pracę nad poważnymi projektami. Nie prze-gap tej okazji!

[email protected]

Future ProcessingFuture Processing to dynamiczna firma techno-logiczna działająca na globalnym rynku opro-gramowania. Jesteśmy zespołem wysokiej klasy specjalistów posiadających wiedzę i doświadcze-nie niezbędne do realizacji ambitnych projektów informatycznych. Jeśli programowanie to Twoja pasja dołącz do nas! (możliwość pracy zdalnej).

http://www.future-processing.pl

Skontaktuj się z nami:[email protected] tel. 22 427 36 91

[email protected] http://buyitpress.com

Kei.plKei.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

Opera SoftwareOpera Software’s vision is to deliver the best In-ternet experience on any device. We are offering browser for PC/desktops and embedded pro-ducts that operates across devices, platforms and operating systems. Our browser can deliver a faster, more stable and flexible Internet expe-rience than its competitors.

http://www.opera.com

Architektury systemów ITTwórca frameworków JUVE i serwera aplikacji AVAX oferuje usługi, doradztwo, rozwiązania do tworzenia nowoczesnych, dużych systemów i roz-wiązań informatycznych/internetowych, integrują-ce architektury ery post-J2EE/.NET, wykorzystu-jące MDD/MDA dla dziedzin – bankowość, teleko-munikacja, handel, e-commerce, ERP/Workflow/CRM, rozwiązania internetowe, portalowe.www.mpsystem.com [email protected]

Page 79: SDJ_12_2008_PL_Symbian OS

KLUB PRO

SWD Software Sp. z o.oSystem operacyjny czasu rzeczywistego RTOS QNX. Oficjalny dystybutor w Polsce.Zakres działalności: lokalizacja produktów QNX, dostawy sprzętu i oprogramowania, doradztwo przedsprzedażowe, wsparcie techniczne, certyfi-kowane szkolenia, opracowania na zamówienie.

http://www.swdsoft.pl

StatConsultingStatConsulting to firma o znaczącej pozycji na ryn-ku usług analitycznych oraz Data Mining. Nasza oferta obejmuje m.in. modele scoringowe, rozwią-zania Fraud Detection oraz modelowanie ryzyka. Tworzymy także własne rozwiązania informatycz-ne na potrzeby projektów Data Mining, Data Quali-ty, zarządzania ryzykiem itd.

http://www.statconsulting.com.pl

TTS Company Sp. z o.o.Sprzedaż i dystrybucja oprogramowania komputero-wego. Import programów na zamówienie. Ponad 200 producentów w standardowej ofercie. Chcesz kupić oprogramowanie i nie możesz znaleźć polskiego do-stawcy? Skontaktuj się z nami – sprowadzimy nawet pojedyncze licencje.

http://www.OprogramowanieKomputerowe.pl

IT SOLUTIONSWdrożenia i szkolenia z zakresu:• SQL Server• SharePoint Services• MS Project / Server• Tworzenie aplikacji w technologii .NET

http://[email protected]

IT SOLUTIONS

Softline rozwiązania mobilneWiodący producent systemów mobilnych, do-stawca aplikacji użytkowych dla biznesu (Sym-bian OS, Windows Mobile, J2ME ) zaprasza do współpracy. Zostań naszym partnerem. Dołącz do zespołu.

http://www.softline.com.pl

Transition Technologies S.A.Firma w branży high-tech od 1991. Producent opro-gramowania dla przemysłu (ponad 350 referencji z instalacji na całym świecie). Usługi z zakresu: hur-townie danych i Business Intelligence, rozwiązania eBusiness, optymalizacja, integracja danych, aplika-cji oraz procesów biznesowych, portale korporacyj-ne, consulting i outsourcing usług IT, zaawansowa-na automatyka cyfrowa.http://www.tt.com.pl

EPRONaszą misją jest projektowanie najwyższej jako-ści dedykowanych systemów IT, które cechuje wysoka niezawodność, wydajność, ergonomicz-ność i intuicyjność w obsłudze oraz administracji.Głównym elementem oferty EPRO jest oprogra-mowanie sklepu internetowego oraz identyfika-cja wizualna.tel. 085 743 66 38http://www.epro.com.pl

Proximetry Poland Sp. z o.o.Proximetry Poland Sp. z o.o. jest polskim od-działem amerykańskiej firmy Proximetry Inc. – dostawcy systemów zarządzania sieciami bez-przewodowymi opartymi na technologiach WiFi i WiMAX. Naszą misją jest dostarczenie klientom rozwiązań poprawiających jakość usług (QoS) dostarczanych drogą radiową. Dołącz do najlep-szych i zostań członkiem naszej ekipy!

http://www.proximetry.com

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

Page 80: SDJ_12_2008_PL_Symbian OS

v

Kontakt 1. Telefon+48 22 427 36 91+48 22 427 36 79+48 22 427 36 50

2. Fax+48 22 244 24 59

2. [email protected]

3. AdresBokserska 102-682 WarszawaPolska

Roczna prenumerata

tylko250

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.

,-

Page 81: SDJ_12_2008_PL_Symbian OS

v 1

Zamówienie prenumeraty

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

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

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

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

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

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

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

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

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

Prosimy wypełniać czytelnie i przesyłać faksem na numer: 00 48 22 244 24 59lub listownie na adres: Software-Wydawnictwo Sp. z o. o.ul. Bokserska 102-682 WarszawaPolskaE-Mail: [email protected] też zamównienia telefoniczne:0048 22 427 36 910048 22 427 36 790048 22 427 36 50

Jeżeli chcesz zapłacić kartą kredytową, wejdź na stronę naszego sklepu internetowego www.buyitpress.com.

Prenumerujesz – zyskujeszl oszczędność pieniędzy l szybka dostawa l prezentyl bezpieczna płatność ność on–line

TytułIlość

nume-rów

Ilość zama-

wianych prenume-

rat

Od numeru pisma

lub mie-siąca

Cena

Software Develope-r’s Journal (1 płyta CD) – dawniej Software 2.0

12 180*/250PLN

□ automatyczne przedłużenie prenumeraty

* cena prenumeraty rocznej dla osób prywatnych

Page 82: SDJ_12_2008_PL_Symbian OS

W NASTĘPNYM NUMERZE SOFTWARE DEVELOPER’S JOURNAL 1/2009 169

TESTOWANIE OPROGRAMOWANIAGNU Linear Programming Kit

Testowanie metod statycznych

Porównanie wydajności obliczeniowych i bazodanowych technologii JSF, PHP oraz ASP.NET

PROGRAMOWANIE JAVAJava 3D

NOWE ARTYKUŁY W DZIAŁACHBiblioteka miesiąca

Systemy operacyjne

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

W sprzedaży od 18 grudniaRedakcja zastrzega sobie możliwość zmiany zawartości pisma.

Page 83: SDJ_12_2008_PL_Symbian OS
Page 84: SDJ_12_2008_PL_Symbian OS