Professional Documents
Culture Documents
7/2011 (199)
Miesięcznik Software Developer’s Journal (12 numerów w roku) ul. Bokserska 1, 02-682 Warszawa, Polska
jest wydawany przez tel. +48 22 427 36 91, fax +48 22 224 24 59
Software Press Sp. z o.o. SK
www.sdjournal.org
Prezes: Paweł Marciniak cooperation@software.com.pl
2 7/2011
Spis treści
Reklama
www.sdjournal.org 3
BIBLIOTEKA MIESIĄCA
Szybki start
Aby uruchomić przedstawione przykłady, nale-
ży mieć dostęp do kompilatora C++ oraz edyto-
ra tekstu. Przykłady wykorzystują biblioteki boost
(www.boost.org). Aby poprawnie je skompilować
należy dodać odpowiednie zależności wykorzysty-
wane podczas konsolidacji; dla konsolidatora g++
należy dodać opcje: -lboost _ graph; dla konsoli-
datora Visual Studio (program link) biblioteki bo-
ost są dodawane automatycznie. Na wydrukach
pominięto dołączanie odpowiednich nagłówków
oraz udostępnianie przestrzeni nazw, pełne źródła
umieszczono jako materiały pomocnicze.
Rysunek 1. Przykładowy graf
4 7/2011
Grafy i algorytmy grafowe
www.sdjournal.org 5
BIBLIOTEKA MIESIĄCA
6 7/2011
Grafy i algorytmy grafowe
typedef adjecency_list<
vecS,
vecS,
directedS,
no_property, // brak dodatkowych właściwości dla wierzchołków
property<edge_weight_t, unsigned int> // dodatkowa właściwość dla krawędzi
> Graph;
/* tutaj inicjacja tablicy EDGE_ARRAY tak jak pokazuje Listing 2 */
unsigned int weights[] = { /* tu podajemy wagi krawędzi */ };
Graph graph(
EDGE_ARRAY,
EDGE_ARRAY + NUM_EDGES,
weights, // tablica wag krawędzi
N);
Reklama
�����������������������������������������������������������������
�������������������������������������������������������������������������
BIBLIOTEKA MIESIĄCA
W Sieci
• http://www.boost.org – dokumentacja bibliotek boost, w tym boost::graph;
• http://home.agh.edu.pl/~horzyk/lectures/pi/ahdydpiwykl9.html – opis różnych rodzajów grafów;
• http://osl.iu.edu/~dgregor/bgl-python/ – interfejs do boost::graph z języka Python;
• http://jung.sourceforge.net/ – biblioteka do grafów w Javie.
Więcej w książce
Omówienie współcześnie stosowanych technik, wzorce projektowe, programowanie generyczne, prawidło-
we zarządzanie zasobami przy stosowaniu wyjątków, programowanie wielowątkowe, ilustrowane przykłada-
mi stosowanymi w bibliotece standardowej i bibliotekach boost, opisano w książce Robert Nowak, Andrzej
Pająk ,,Język C++: mechanizmy, wzorce, biblioteki'', BTC 2010.
8 7/2011
KLUB TECHNICZNY
Dowiesz się:
• Jak prężnym segmentem światowego rynku jest elektroniczna rozrywka;
• Jakie realne możliwości otwiera przed graczami praca przy produkcji gier;
• Dlaczego EAG i GSA są idealnym rozwiązaniem dla przyszłych developerów gier.
10 7/2011
Po drugiej stronie ekranu – czyli od kampera do game developera
goni za ideałami i realizacji własnych marzeń. Przyczy- jednokrotnie miała swój wkład w proces wychowaw-
ną zaniechania podążania własną ścieżką jest najczęściej czy młodych ludzi, niemniejszy niż sama telewizja. Pew-
brak wiary we własne siły, bezpodstawne pozbawianie nie każda osoba, zafascynowana tym tematem zdała so-
się szans już na samym początku, jeszcze w fazie plano- bie sprawę, że gry wideo dorastały razem ze swoimi
wania, bądź też fałszywe przekonanie o braku realnej odbiorcami, a ich fenomen był impulsem do chęci zre-
możliwości osiągnięcia celu. To kluczowe, aby właśnie alizowania marzenia o stworzeniu swojego własnego
w okresie największej elastyczności w wyborze swojej cybernetycznego świata. Wyprodukowany na począt-
przyszłości, czyli w czasie, gdy decydujemy o kierun- ku lat 80' film „TRON”, który dzisiaj należy już do kla-
ku naszych studiów, uzmysłowić sobie, że każda ścież- syki gatunku, był właśnie zobrazowaniem tych marzeń,
ka jest otwarta, a każde marzenie możliwe do spełnie- niestety wtedy jeszcze praktycznie nieosiągalnych. Każ-
nia, jeżeli tylko stoi za tym pragnienie podjęcia próby dy chciał być jak Kevin Flynn, przemierzający bezgra-
i przetestowania własnych sił. niczną planszę cyfrowego wszechświata, mogący nie
tylko go odkrywać, ale także brać czynny udział w ak-
Gra o „TRON” cie jego tworzenia. Wizja ta była wtedy tak nowator-
Żyjemy w czasach, gdy zawody dawniej uważane w Pol- ska, a zastosowane w jej realizacji efekty komputerowe
sce bardziej za ciekawostkę niż źródło zarobku, lub bę- wyprzedzały swoje czasy do tego stopnia, iż obraz zo-
dące całkowicie zdominowane przez kraje zachodnie, stał wykluczony z wyścigu o Oscara za efekty specjal-
dzisiaj są bardziej pożądane na naszym rynku pracy, ne, gdyż uważano, że „triki komputerowe” są sprzecz-
a kolejne uniwersytety umożliwiają zdobycie kwalifika- ne z regulaminem. Dzisiaj wszechobecne zastosowanie
cji do ich wykonywania. Przykładem tego jest właśnie narzędzi cyfrowych nie tylko w produkcji kinowych hi-
możliwość pracy przy produkcji gier komputerowych. tów stało się już standardem. Najwspanialsze jest jed-
Obecne pokolenie na stałe kojarzyć będzie swoje dzie- nak to, że teraz każdy ma możliwość zaspokoić pra-
ciństwo właśnie z elektroniczną rozrywką, która nie- gnienia rozbudzone przez film Steven'a Lisberger'a, sta-
jąc się nie tylko realnym gościem binarnego świata, ale
także jego twórcą. Sam proces tworzenia gier to czysty
akt twórczy, praktycznie niczym nieograniczony, dający
ogromne pole do popisu dla naszej wyobraźni. Możli-
wości te wykraczają daleko poza potencjał twórczy to-
warzyszący pisaniu książek, kręceniu filmów, malowa-
niu obrazów, czy nawet komponowaniu muzyki. Inter-
dyscyplinarność gier sprawia, iż wszystkie te dziedziny
tworzą w nich harmoniczną całość, dzięki czemu koń-
cowy efekt otrzymuje nieosiągalny nigdzie wcześniej
charakter wielowymiarowości.
Obecnie gry wideo pretendują nawet do zdobycia
miana sztuki, co w przypadku wielu wybitnych tytułów
jest wyraźnie uzasadnione. Istnieje jednak bardzo waż-
ny czynnik, który odróżnia gry komputerowe od wy-
mienionych wcześniej dzieł twórczych, a mianowicie
interaktywność. Pisząc książkę, lub kręcąc film z gó-
ry narzucamy odbiorcy jedną, jedyną ścieżkę odbioru
utworu, przez co treść w nim przedstawiona jest wy-
bitnie liniowa. Pozbawiając odbiorcę jakiejkolwiek moż-
liwości ingerencji w zawartość dzieła, ogranicza się go
wyłącznie do biernego odbioru prezentowanego utwo-
ru. Gry komputerowe są uosobieniem interaktywno-
ści, pozwalającej nie tylko na bardzo liczną, lecz cza-
sami wręcz nieskończoną ilość sposobów postrzega-
nia przedstawionego w niej świata. Twórcy otrzymują
ogromne możliwości w przenoszeniu na „cybernetycz-
ny papier” swoich pomysłów, a elastyczność i stopień
zaawansowania używanych narzędzi umożliwia cho-
ciażby tworzenie własnych zasad fizyki, obowiązujących
Rysunek 2. Powyżej grafika koncepcyjna z gry w stworzonej przez nas grze. Dodatkowo możliwość
Disturb wcielenia się w wirtualną postać i indywidualne pokie-
www.sdjournal.org 11
KLUB TECHNICZNY
rowanie jej losami, oferuje niespotykaną dotąd nigdzie salność, elastyczność, lub wręcz wszechobecność sto-
immersję w wykreowany świat, a sposób jego odbio- sowanych rozwiązań. Potencjał rozwojowy jest ogrom-
ru nabiera niezwykle osobistego charakteru. Jeszcze do ny, a ilość dostępnych narzędzi sprawia, że każdy bę-
niedawna drzwi do tych wszystkich możliwości znajdo- dzie mógł znaleźć odpowiednią dla siebie specjalizację,
wały się poza granicami naszego kraju. Dzisiaj stoją one bez względu na to czy zajmuje się informatyką, muzyką,
szeroko otworem dla każdego z nas. sztuką, czy naukami humanistycznymi. Gry komputero-
we nie ograniczają się wyłącznie do komputerów oso-
Realny pieniądz wirtualny bistych, lecz tworzą trzon potężnego rynku konsolo-
Przez wiele lat utrzymywało się bardzo błędne prze- wego, zarówno dla ich stacjonarnych odpowiedników
konanie, iż gry komputerowe są jedynie mało poważ- jak Xbox 360 i PlayStation 3, czy handheldów pokroju
ną formą rozrywki przeznaczoną głównie dla dzieci. Nintendo 3DS i PlayStation Portable. Gry wideo stały
Świat jednak niestrudzenie szedł do przodu, a osoby się także nieodłączną częścią telefonów komórkowych,
bagatelizujące elektroniczną rozrywkę zapewne nie- a gigantyczny sukces gry „Angry Birds” dowodzi tylko
jeden raz zakrztusiły się swoimi mylnymi poglądami. z jak potężnym gronem odbiorców mamy do czynienia.
Oficjalny przełom nastąpił kilka lat temu, gdy świato- Wszyscy szukający innowacyjnych rozwiązań i nowych
we media obiegła wiadomość, że rynek gier kompute- technologii zapewne zainteresują się nowymi trenda-
rowych zaczął w niektórych krajach przynosić docho- mi w branży wkraczającymi do domów zwykłych gra-
dy przekraczające zyski z produkcji filmów. Doskona- czy, jak chociażby stereoskopowe wyświetlanie obrazu
łym dowodem tego jest seria Call of Duty, której naj- dające złudzenie trójwymiarowości, czy kontrolery ru-
nowsze odsłony – Modern Warfare, Modern Warefa- chowe pokroju PS Move i Kinect.
re 2 i Black Ops, biją kolejne rekordy zarówno w wyni-
kach sprzedaży, jak i kwot przeznaczanych na ich kam- Polacy nie gęsi i swój joystick mają
panie reklamowe, przynosząc swojemu wydawcy, Ac- Jeżeli należysz do osób, które cechuje niestety dość
tivision, kosmiczne zyski. Każdy, kto nie widzi poten- powszechna w naszym kraju mentalność, nakazują-
cjału znajdującego się w rynku produkcji gier kompute- ca sądzić, iż wszystko co zagraniczne musi być lepsze,
rowych zapewne już został w tyle za pędzącym postę- to nawet nie zdajesz sobie sprawy, jak bardzo w przy-
pem technologicznym i jeszcze niejednokrotnie przega- padku gier komputerowych możesz się mylić. Dziedzi-
pi okazję, aby dostosować się do dzisiejszych standar- na ta niejednokrotnie dowiodła, że nie liczy się ilość
dów rynkowych. Wszyscy zainteresowani tą tematy- wydawanych gier, lecz ich jakość, a w ostatnich latach
ką, jako potencjalnym sposobem zarobku, powinni zda- rdzennie polskie produkcje mogą już świadczyć o roz-
wać sobie sprawę nie tylko ze złożoności procesu po- poczęciu podboju światowych rynków oraz zapewnie-
wstawania gier i jego wielowątkowości, o czym pisałem niu swojej marce uznania w licznych szeregach odbior-
wcześniej, ale także istotne jest, aby dostrzec uniwer- ców. Dla przykładu wystarczy podać reklamowaną, ja-
ko „największą polską produkcję”, multiplatfor-
mową grę Bulletstorm, powstałą przy współpra-
cy z Epic Games, które odpowiedzialne jest za
takie tuzy gatunku jak chociażby seria Gears of
War. Produkcja polskiego studia People Can Fly
dokonała tego, co tak bardzo potrzebne jest dzi-
12 7/2011
Po drugiej stronie ekranu – czyli od kampera do game developera
www.sdjournal.org 13
KLUB TECHNICZNY
14 7/2011
Po drugiej stronie ekranu – czyli od kampera do game developera
www.sdjournal.org 15
KLUB TECHNICZNY
dostęp do zestawów LEGO Mindstorms NXT 2.0, po- ny cel postawili sobie stworzenie wszystkich elementów
zwalających konstruować i w łatwy sposób programo- gry, od modeli po animacje, na muzyce kończąc.
wać własne roboty. Dzięki załączonym czujnikom odle- Sekcja Analizy Gier EAG (SAGE) to grupa pasjona-
głości, dotyku, koloru oraz napędowi w postaci serwo- tów gier wideo, którzy poszerzają swoją merytoryczną
motorów, a także możliwości sterowania za pośred- wiedzę o grach i aktualnych trendach w branży. Sekcja
nictwem komputera, każdy ma możliwość zbudowa- ma dostęp do ciągle poszerzanej biblioteki najnowszych
nia własnego unikatowego i zaawansowanego mode- tytułów, dzięki czemu ma możliwość realizacji jednego
lu robota. Sekcja ma za zadanie organizowanie Zawo- ze swych głównych celów, a więc analizy gier pod ką-
dów Robotów Walczących oraz formowanie reprezen- tem pisanych później recenzji. Zdolności nabyte przez
tacji GSA dla tego typu imprez. Zdolności inżynierskie członków SAGE wykorzystywane są chociażby podczas
członków LEGO Team z każdym miesiącem wzbogaca- tworzenia relacji z imprez o tematyce gier wideo. Jako
ją kolekcję skonstruowanych przez nich robotów o ko- najnowszy przykład można podać udział członków sek-
lejne modele. cji w krakowskim Game Fusion. Do zadań Sekcji Anali-
Sekcja Unreal Development Kit (UDK) rozwija swo- zy Gier należą także organizacje turniejów, SAGE ofe-
je zainteresowania obracające się wokół niezwykle dziś ruje również odbycie w jej ramach studenckich prak-
popularnego silnika gier Unreal Engine. Główny projekt tyk. Grupa planuje współpracę zarówno z prasą i por-
grupy opiera się na stworzeniu gry typu hack & slash talami internetowymi, jak i studiami developerskimi,
o nazwie GobWar – Weź dwa! Gra osadzona zostanie dlatego obecnie poszukuje partnerów medialnych.
w wykreowanym przez 6 osobowy zespół świecie fanta-
sy, a jej główny bohater, niezadowolony z polityki lokal- Jutro zaczyna się dzisiaj
nego możnowładcy postanawia wziąć sprawy w swoje Marzeniem twórców Gamedev Students Association
ręce. Przedstawiona historia będzie mieć charakter hu- jest tworzenie podobnych kół zainteresowań w szko-
morystyczny, a sam protagonista, lekko podpity, dzier- łach współpracujących z organizacją, co ma miejsce
żący tulipana w ręce Goblin, musi uważać, aby zbytnio w krajach będących pionierami elektronicznej rozrywki,
nie wytrzeźwieć, co może negatywnie odbić się na za- jak chociażby w Japonii, gdzie profesjonalna nauka two-
dawanych przez niego obrażeniach. Z tego też powodu
istotnym elementem gry będzie zdobywanie kolejnych
kufli „złotego napoju”, a sam bohater nie będzie miał
czasu ani na odpoczynek, ani na kaca. Autorzy za głów-
16 7/2011
Po drugiej stronie ekranu – czyli od kampera do game developera
rzenia gier rozpoczyna się już w szkołach średnich. GSA rów, którzy rozumiejąc potencjał drzemiący w organiza-
obecne też będzie na Europejskich Finałach World Cy- cji, będą gotowi przyłączyć się do zrewolucjonizowania
ber Games, największej światowej imprezie pretendu- polskiej sceny elektronicznej rozrywki. Przyszłość pol-
jącej do miana komputerowego odpowiednika igrzysk skich gier komputerowych zaczyna się w Krakowie.
olimpijskich. Na odbywającej się w Warszawie imprezie, Szanowny graczu, pamiętaj, że każdy cel i każde ma-
UDK zorganizuje warsztaty z tworzenia gier, natomiast rzenie jest możliwe do zrealizowania, jeżeli tylko tra-
SAGE przeprowadzi dziennikarską relację z cyberolim- fisz pod właściwy adres. Tak więc, gdy masz wątpliwo-
piady. W najbliższych planach na EAG ma powstać ba- ści i chcesz coś przemyśleć odwiedź Przemyśl, jeżeli
za nowoczesnych technologii z większością najpopular- szukasz ukrytego głęboko piękna natury, to zawitaj do
niejszych konsol stacjonarnych i przenośnych, oraz pra- Zakopanego, jeżeli pragniesz w życiu odmiany to jedź
cownia mobilnych urządzeń, posiadająca m.in. stół Mi- do Poznania, a wrócisz nie-do-poznania, natomiast, je-
crosoft Surface, rękawice cybernetyczne i najnowsze te- śli chcesz być w centrum społeczności graczy i szukasz
lefony komórkowe. Zaplecze to ma być dostępne także drogi do kariery w branży elektronicznej rozrywki, nie
dla członków GSA. W chwili obecnej za główny cel or- miej wątpliwości – wybierz Kraków.
ganizacja stawia sobie stworzenie corocznej konferen-
cji, na której członkowie będą mieli możliwość osobi-
stego spotkania się, oraz przedstawiania swoich projek-
ADRIAN ZAJĄC
Jest studentem III roku Informatyki na Wydzia-
tów. Dzięki obecności firm z branży gier, które już teraz
le Fizyki, Astronomii i Informatyki Stosowanej
wyraziły ogromne zainteresowanie projektem, uczestni- UJ. Oprócz gier komputerowych, pasjonuje się
cy będą mieli szanse zaprezentowania się swoim przy- również podróżami i dziennikarstwem. Jest re-
szłym pracodawcom, a sama konferencja ma szansę stać daktorem SAGE, organizacji GSA.
się jednym z największych wydarzeń branżowych roku. Kontakt z autorem: adrian.zajac@uj.edu.pl
Jednakże, aby było to możliwe GSA poszukuje partne-
www.sdjournal.org 17
PROGRAMOWANIE JAVA
Analiza wydajności
aplikacji Java dla opornych
Jak diagnozować i rozwiązywać problemy
z Garbage Collectorem w Javie?
Tabela 1.
Parametr Wartość
Jak analizować wydajność systemu? Czas trwania testu 180 minut
Bardzo często osoby odpowiedzialne za dostarczenie
Warm-up time 60 minut
systemu informatycznego nie przykładają odpowiedniej
wagi do różnego rodzaju testów wydajnościowych i ska- Liczba równoległych użytkowników 100
lowalnościowych. Wynika to przeważnie z braku czasu, Średni czas odpowiedzi < 1 sek
niedoszacowania zasobów lub błędnego określenia funk- 99 percentyl < 2 sek
cjonalności. O ile brak konkretnego przypadku użycia zo-
stanie wychwycony od razu, to określenie, czy aplikacja Tabela 2.
posiada odpowiednią wydajność jest dość trudne... do Parametr Wartość
czasu, gdy jest już za późno. Chcemy pokazać, jak moż- Liczba równoległych użytkowników 100
na szybko wykryć potencjalne problemy nawet wtedy,
Średni czas odpowiedzi 0,75 sek
gdy na przeprowadzenie testów wydajnościowych ma-
my mało czasu. Mediana czasów odpowiedzi 0,4 sek
18 7/2011
Analiza wydajności aplikacji Java dla opornych
www.sdjournal.org 19
PROGRAMOWANIE JAVA
JitterMeter (http://azulsystems.com/resources/tools/jittermeter)
Narzędzie open-source, udostępniane przez Azul Systems, które pozwala analizować wydajność i zachowa-
nie JVM pod kątem opóźnień widocznych z punktu widzenia klienta końcowego, często nazywanego też
użytkownikiem.
Fragger (http://azulsystems.com/resources/tools/fragger)
Narzędzie open-source, udostępniane przez Azul Systems, symulujące zużycie pamięci przez aplikacje, ana-
logicznie jak przy równoległej obsłudze wielu niezależnych użytkowników. Wykorzystanie tego narzędzie
umożliwia sprawdzenie zachowania systemu przy dużym (i możliwym do definicji) obciążeniu pamięci.
JMeter (http://jakarta.apache.org/jmeter/)
Narzędzie open-source, które umożliwia realizację testów funkcjonalnych i wydajnościowych w łatwy i
zautomatyzowany sposób. Udostępnia również WebProxy, które może nagrywać ruch w celu jego później-
szego odtworzenia.
• Serwer (przynajmniej 4 rdzenie oraz 16GB RAM; im zostaną na czterech wirtualnych maszynach Java, każda
więcej tym lepiej) od innego dostawcy i z inną implementacją procesu GC.
• VMWare ESX 4.x (do pobrania ze strony: http:// Przetestowany zostanie również nowy, eksperymental-
downloads.vmware.com/d/details/esx41u1/ZHcqYnRlQH- ny GC G1 stworzony przez SUN/Oracle.
BiZCpwdw==) Realizacja testu, w zależności od konfiguracji testowej
• Różne wersje JVM (różnej w zależności od wykorzystywanego sprzętu), po-
• Sun/Oracle JDK: http://www.oracle.com/ lega na odpowiednim dobraniu liczby równoległych wąt-
technetwork/java/javase/downloads/index.html ków, które wykonują zapytania do przykładów Tomca-
• Open JDK: http://openjdk.java.net ta, oraz przerw między każdym kolejnym wywołaniem.
• IBM JDK: http://www.ibm.com/developerworks/java/ Manipulacja tymi parametrami pozwala zmieniać równo-
jdk ległość przetwarzania po stronie Tomcata lub prędkość
• Zing JDK: http://www.azulsystems.com/products/ alokacji nowych obiektów. W celu zasymulowania pra-
zing/trial cy wielu użytkowników, wykorzystano open-source’o-
• Tomcat 6.x (http://tomcat.apache.org/download-60.cgi) we narzędzie Fragger. Dzięki temu możliwe było znaczne
• JMeter (http://jakarta.apache.org/jmeter/) zwiększenie wykorzystania pamięci przez aplikację i anali-
• Scenariusz testowy dla JMeter: http://wits.pl/scenariusz za jej zachowania w sytuacji, gdy system musi obsłużyć żą-
dania od wielu równoległych użytkowników. Przy wyeli-
Test polega na równoległym wy-
wołaniu standardowych przykła-
dów znajdujących się w każdej
dystrybucji Tomcata. Niestety,
przeważnie czas odpowiedzi bę-
dzie zbliżony do 1ms, jeżeli sys-
tem nie jest obciążony, bo przy-
kłady nie realizują żadnych funkcji
biznesowych. Jednakże nawet na
tak prostych przykładach można
zaobserwować fluktuacje czasów
odpowiedzi, w związku z działa-
niem procesu GC. W wersji do-
mowej można użyć jednego fi-
zycznego komputera do zasymu-
lowania całego środowiska, co
jest niewątpliwym plusem. Ar-
chitektura środowiska testowe-
go przedstawiona jest na diagra-
mie nr 2. Testy przeprowadzone Diagram 2.
20 7/2011
Analiza wydajności aplikacji Java dla opornych
Wyniki
W czasie tego testu analizo-
wano czas odpowiedzi sys-
temu, standardowe odchy-
lenie oraz maksymalny czas
odpowiedzi. O ile czasy od-
powiedzi są na porówny-
walnym poziomie, co by-
ło oczekiwanym rezultatem,
to wartości odchylenia stan-
dardowego różnią się znacz-
nie, nawet o dwa rzędy wiel-
kości. Z wykresów długo-
Wykres 3.
ści pauz GC na poszczegól-
nych JVM, widzimy, że pauzy
często były dłuższe niż 1 se-
kunda. Takie wyniki, przy ta-
kiej konstrukcji testu jaką za-
proponowaliśmy, oznaczają,
że czas odpowiedzi, (w sy-
tuacji, gdy trafimy na pauzę
GC) zwiększa się z 1 ms do
ponad 1000 ms. Porównując
maksymalne czasy odpowie-
dzi poruszamy się pomiędzy
127ms dla Zing JVM a po-
nad 3 000 ms (3 sekundy)
dla SUN oraz OPEN JDK,
z pozostałymi konfiguracja-
mi plasującymi się w oko-
licach 1 000 ms. Zestawie-
nie to pokazuje wykres nr 4. Wykres 4.
www.sdjournal.org 21
PROGRAMOWANIE JAVA
Narzędzia do analizy
JVM
• JDK (HotSpot)
• JVisualVM
• Jstat
• Jmap
• Jinfo
• Memory Analyzer (Eclipse)
Wykres 7.
22 7/2011
Analiza wydajności aplikacji Java dla opornych
DANIEL
WITKOWSKI
Lider Obszaru
St rategicz nego
w WORLDIT Sys-
tems. Zajmuje się rozwiąza-
niami optymalizacji syste-
mów IT i realizuje projekty au-
dytów technologicznych.
PAWEŁ
WOJTANKA
Pracuje w WORLDIT
Systems i specjalizu-
je się w technologii
Wykres 8. Azul Zing.
www.sdjournal.org 23
PROGRAMOWANIE TCL
Geneza problemu
Możemy śmiało postawić tezę, że niemal każdy twór- ni przenośny – możemy go skopiować i uruchomić na
ca oprogramowania – niezależnie od używanych techno- dowolnym komputerze z systemem Windows.
logii - pragnie by dotarło ono do jak najszerszego grona W przypadku wielu innych technologii wymagane jest
odbiorców, i było postrzegane jako przyjazne dla użyt- jednak posiadanie tzw. „środowiska uruchomieniowego”
kownika. Oprócz oczywistych cech – jak funkcjonalność – na przykład maszyny wirtualnej Javy, czy interpreterów
i przydatność - oznacza to również, że tworzona aplika- takich języków skryptowych jak Python, Tcl, Perl, Ruby.
cja musi być łatwa w dystrybucji. Nie przez przypadek O ile jednak rozmiar natywnej aplikacji nie jest zwykle
coraz większą popularnością cieszą się przenośne pro- zbyt duży, to niejednokrotnie rozmiar całego środowi-
gramy typu portable, gdzie cały proces instalacji sprowa- ska może skutecznie zniechęcić do wypróbowania danej
dza się do rozpakowania ściągniętego archiwum, zaś mi- aplikacji w ogóle (Tabela 1).
gracja czy odinstalowanie są tak proste jak przeniesienie Jak widzimy, uruchomienie „Hello world” w dowol-
lub skasowanie katalogu. nym z tych języków pociąga za sobą bagaż wielu mega-
Nie bez znaczenia są również rozmiary czy ilość pli- bajtów maszyny wirtualnej lub interpretera. Niewielkim
ków potrzebnych do pomyślnego używania danej apli- pocieszeniem jest fakt że raz zainstalowane środowisko
kacji. W przypadku języków takich jak C/C++ możliwe uruchomieniowe może służyć do uruchamiania więcej
jest zbudowanie „natywnego” pliku wykonywalnego nie niż jednej aplikacji, gdyż często użytkownik chce uży-
posiadającego żadnych zależności. Do pełnego korzysta- wać akurat tylko jedną, której aktualnie potrzebuje. Ta-
nia z jego funkcjonalności wystarczy wtedy że użytkow-
nik uruchomi dany program – bez potrzeby instalacji do- Tabela 1. Rozmiar i ilość plików w popularnych
datkowego oprogramowania. Przyjrzyjmy się nieśmier- środowiskach uruchomieniowych
telnemu „Hello world”: Środowisko Wersja Rozmiar (MB, Ilość plików
Windows XP)
#include <stdio.h> ActiveTcl 8.5.9 8.5.9 40,4 MB 1478
main() ActivePerl 5.12.3 5.12.3 107,5 MB 5630
{ printf ("Hello World!\n"); }
Ruby 1.9.2 1.9.2 30,2 MB 851
Java 1.6 (JRE) 1.6 (JRE) 96,1 MB 633
Po skompilowaniu poleceniem gcc hello.c -o
hello.exe plik wynikowy ma rozmiar 22kB i jest w peł- ActivePython 2.7.1 65,9 MB 3840
24 7/2011
Tcl: wirtualne systemy plików
Przykładowa aplikacja
Nasz przykładowy program będzie nieco bardziej uroz-
maicony niż standardowe „Hello world” i będzie to pro-
sty acz działający zegarek, przedstawiony na Rysunku 1.
Kod umieścimy w pakiecie clock, co pozwoli nam w dal-
szej części tekstu zademonstrować dostęp do pakietów
Tcl. Struktura tego pakietu to katalog clock zawierają-
cy 2 pliki:
proc tick {c h m s} {
foreach {hours minutes seconds} [clock format [clock seconds] -format "%H %M %S"] {
wm title . "$hours:$minutes:$seconds"
$c itemconfigure $s -extent 0 -start [expr -([scan $seconds %d]*6-90)%360]
$c itemconfigure $m -extent 0 -start [expr -([scan $minutes %d]*6-90)%360]
$c itemconfigure $h -extent 0 -start [expr -(([scan $hours %d]*30+[scan $minutes %d]/2)-90)%360]
}
after 1000 tick $c $h $m $s
}
package require Tk
canvas .c -height 220 -width 220 -bg white
for {set i 0} {$i <= 360} {incr i 6} {
.c create arc 10 10 210 210 -extent 0 -start $i -outline black -width [expr {1+4*((($i-1)%30)/29)}]
}
www.sdjournal.org 25
PROGRAMOWANIE TCL
26 7/2011
Tcl: wirtualne systemy plików
Słowniczek
• Metakit – baza danych o specyficznych właściwościach; wg autora „wypełnia lukę pomiędzy bazami
obiektowymi, relacyjnymi, drzewiastymi i typu flat-file”. Dzięki odpowiedniemu providerowi bazę danych
Metakit można traktować jak wirtualny kontener VFS.
• Tclkit – interpreter Tcl skompilowany do pojedynczego pliku; potrafi obsługiwać Starkity.
• Cookit – interpreter Tcl podobny do Tclkit, ale oparty na nowocześniejszej technologii cookfs (opisanej
szczegółowo w następnym artykule).
• Starkit – wirtualny kontener plików, najczęściej oparty na Metakit (dzięki providerowi TclVFS mk4) , stano-
wiący jednocześnie format dystrybucji oprogramowania. Do uruchomienia zawartego w nim programu
potrzebny jest Tclkit lub inny interpreter Tcl z obsługą Starkit. Zwyczajowo rozszerzeniem pliku jest .kit.
• Starpack – Tclkit + Starkit, czyli pojedynczy plik wykonywalny utworzony z interpretera Tcl i dołączonego
wirtualnego kontenera z plikami tworzącymi daną aplikację.
zwa pliku Tclkit jest zazwyczaj dość długa, dla uprosz- Starkity i Starpacki
czenia w dalszej części tekstu będziemy używać skró- – wszystko w jednym pliku
conej wersji: tclkit.exe. Tclkit jest tylko pierwszym krokiem zmierzającym do
Dużą zaletą jest zakres wspieranych platform; w końcu radykalnego uproszenia dystrybucji programów napisa-
to przenośność kodu stanowi jeden z mocnych atutów nych w Tclu. Jego dopełnieniem są Starkity. Jest to nic
języków skryptowych. Z istotniejszych platform są to: innego jak wirtualny kontener plików (VFS) zawierają-
cy w środku skrypty Tcl i inne pliki (zasoby) składające
• Windows się na naszą aplikację. Zwyczajowo pliki Starkit posiada-
• Linux ją rozszerzenie .kit. Jest to sposób dystrybucji podobny
• Mac OS X do archiwum zip zawierającego gotowy do uruchomie-
• Solaris nia program, ma jednak pewne różnice:
• AIX
• HP-UIX • Aby uruchomić aplikację, nie trzeba rozpakowywać
Starkita. Należy użyć Tclkita, np.: tclkit.exe moja _
Skąd można wziąć Tclkita ? Oczywiście – jak wszyst- aplikacja.kit . Ogólnie pliki .kit możemy traktować
ko dziś – z internetu. Wytrawnym użytkownikom wy- jak gotowe do uruchomienia aplikacje Tcl, lecz po-
szukiwarki odnalezienie go nie sprawi problemu, jednak zbawione kodu interpretera.
dla ułatwienia podajemy adres: http://code.google.com/p/ • Wystarczy tylko jeden Tclkit w systemie, by urucha-
tclkit/ (dawniej http://equi4.com/tclkit/). miać dowolną ilość Starkitów. Jest to analogiczne do
Komendy te są wykonywane przez interpreter Tcl aż do napotkania znaku Ctrl+z (\u001a) oznaczającego dlań
koniec pliku, i powodują zainicjalizowanie i uruchomienie danego pliku .kit już jako Starkit. W szczególności, po
lecenie starkit::header mk4 -readonly otwiera archiwum w obecnie czytanym pliku, korzystając z formatu
podanego jako 1szy argument - w tym przypadku mk4, a następnie czytany jest plik main.tcl z tego archiwum.
Po znaku \u0001a następuje binarny ciąg danych stanowiący kontener VFS. Więcej światła na tą strukturę mo-
że rzucić także Listing 5.
W jaki sposób Tcl jest w stanie poprawnie zidentyfikować początek obszaru danych w pliku będący wspo-
mnianym kontenerem? W przypadku baz danych Metakit, ich rozmiar umieszczony jest na samym końcu.
Dzięki temu plik z taką bazą może zawierać całkowicie dowolne dane pod warunkiem że po ciągu danych
będących bazą zawierająca strukturę VFS nie ma już nic więcej (a tak jest właśnie w przypadku plików Star-
kit czy Starpack). Wtedy używając jej rozmiar jako ujemny offset względem końca pliku możemy precyzyjnie
określić początek archiwum i odczytać dane z bazy (a w tym przypadku - pliki z wirtualnego kontenera).
W przypadku Starpacków, wspomniany nagłówek Tclowy zastąpiony jest kodem binarnym, jednak zasady
pozostają niezmienione.
www.sdjournal.org 27
PROGRAMOWANIE TCL
Rysunek 2. Wewnętrzna struktura plików Starpack. Obszar A odpowiada Tclkitowi, a obszar B - Starkitowi
scenariusza: jedna maszyna wirtualna Javy + wiele wcześniej wspomniano, aby uruchomić daną aplikację
programów w Javie. dostarczoną w formie Starkita, potrzebne są 2 pliki:
Specyfikacja Starkit określa kilka niezbędnych elemen- • plik wykonywalny (tclkit.exe) zawierający interpreter Tcl
tów, które musi zawierać dany VFS: • plik .kit zawierający kod Tcla i inne zasoby
• Zazwyczaj kontener VFS zbudowany jest na bazie Okazuje się, że te 2 pliki można „skleić” w pojedynczy
Metakit, z wykorzystaniem sterownika (providera
VFS) mk4vfs. Jak pokażemy w późniejszej części roz-
działu, możliwe jest wykorzystanie innego typu VFS,
na przykład zip.
• W katalogu głównym kontenera musi znajdować się
skrypt main.tcl. Jest on automatycznie wywoływany
jako pierwszy.
• Katalog lib (oczywiście znajdujący się w środku na-
szego kontenera VFS) zwyczajowo zawiera dodat-
kowe moduły potrzebne dla naszego kodu. Kata-
log ten nie jest jednak automatycznie dodawany do
zmiennej auto _ path , dlatego też w skrypcie main.tcl
wymagany jest następujący kod inicjalizacyjny:
package require starkit
starkit::startup
O Starkitach można by pisać jeszcze długo, prawdzi- Rysunek 3. Wewnętrzna struktura przykładowego
wie ciekawy temat jest jednak dopiero przed nami. Jak pliku clock.exe
28 7/2011
Tcl: wirtualne systemy plików
C:/tclkit-8.5.8-win32.upx.exe/lib/tcl8.5
C:/tclkit-8.5.8-win32.upx.exe/lib
C:/tclkit-8.5.8-win32.upx.exe/lib/tk8.5
C:/tclkit-8.5.8-win32.upx.exe/lib/tk8.5/ttk
Zgodnie z przyjętą konwencją, kontener VFS jest automatycznie podmontowany jako udział o tej samej nazwie
co plik w którym się znajduje – w tym przypadku jest to tclkit-8.5.8-win32.upx.exe.
Zbudowanie Starpacka z własną aplikacją oznacza de facto dogranie dodatkowych plików do wspomnia-
www.sdjournal.org 29
PROGRAMOWANIE TCL
waż clock.exe będzie składał się z tego właśnie pliku wraz Samodzielne budowanie pliku .kit
z „dodatkami”. Aby nie mnożyć „bytów”, przygotowali- Mówiąc o clock.kit, aż do tej chwili skrzętnie pomijaliśmy
śmy skrypt budujący w taki sposób, aby mógł być urucho- sposób budowania Starpacków. Ręczne tworzenie jest
miony z użyciem tego samego tclkit.exe (inne rozwiązania raczej kłopotliwe z powodu konieczności zadbania o od-
często wymagają osobnej kopii Tclkita przeznaczonej do powiedni nagłówek pliku, co ilustruje Listing 5. Znacznie
zapakowania w docelową aplikację), dlatego też proces lepiej wykorzystać do tego zadania narzędzie SDX.
budowania powinien być uruchomiony poleceniem:
Starkit oparty na kompresji ZIP
C:\>tclkit.exe build.tcl Do tego momentu jedynym używanym przez nas typem
wirtualnego kontenera VFS był mk4. Powód ku temu jest
Przyjrzyjmy się pobieżnie skryptowi budującemu. Na prosty – jest on praktycznie najlepszym rozwiązaniem
początku ustalana jest wartość 2 zmiennych. Pierwsza z istniejących. Specyfikacja Starkit jest jednak na tyle ela-
z nich – targetname – określa plik wynikowy. styczna, że teoretycznie możliwe jest użycie innego ro-
Zmienna exename zawierać będzie nazwę użytego Tcl-
kita (w naszym przykładzie – tclkit.exe). Zaraz po uru- Listing 5. Skrypt budujący plik clock.kit
chomieniu jest to punkt montowania (jak wspomnie-
liśmy, Tclkit również zawiera wewnętrzny VFS), dla- set target clock.kit
tego następne polecenie odmontowuje ten wirtual-
ny kontener. Dzięki temu $exename wskazuje teraz na #tworzy nagłówek Starkit
plik tclkit.exe, który możemy przekopiować pod nazwę set channel [open $target w]
clock.exe (próba skopiowania bez odmontowania udzia- fconfigure $channel -translation binary
łu spowodowałaby wykopiowanie zawartości kontene- puts $channel "package require starkit"
ra VFS). puts $channel "starkit::header mk4 -readonly"
W następnym kroku clock.exe jest podmontowany ja- puts $channel "\u001a"
ko kontener VFS typu mk4 , i „wzbogacony” poprzez close $channel
dokopiowanie zawartości katalogu clock.vfs.
Ostatnie polecenie odmontowuje ten kontener. Te- # mk4 dodaje bazę Metakit na końcu pliku
raz możemy już cieszyć oczy działającym programem vfs::mk4::Mount $target $target
clock.exe. file copy -force clock.vfs/main.tcl $target
Rozmiar pliku wynikowego to 1.2 MB i generalnie jest file copy -force clock.vfs/res $target
w całości podyktowany rozmiarem użytego Tclkita (roz- file copy -force clock.vfs/lib $target
miar pliku clock.kit to zaledwie 1.9 kB). vfs::unmount $target
30 7/2011
Tcl: wirtualne systemy plików
c:\temp>temp.exe
% vfs::mk4::Mount tclkitsh.exe tclkit
mk4vfs1
% file copy -force C:/temp/zipvfs.tcl tclkit/lib/vfs1.4
23292
% vfs::unmount tclkit
% exit
c:\temp>del temp.exe
Nagłówek „Shebang”
Terminem Shebang określana jest sekwencja znaków #! pozwalająca uruchomić dany plik jako skrypt na sys-
temach uniksopodobnych. W przypadku Starkitów często spotyka się następujący nagłówek:
#!/bin/sh
# \
exec tclkit "$0" ${1+"$@"}
package require starkit
starkit::header mk4 -readonly
(ctrl+z)
Pierwsza linijka jest typowa – jako interpreter pliku ustawiany jest /bin/sh. Dwie następne linijki stanowią swoistą
„magię”:
• interpreter sh zignoruje linijkę drugą i wykona trzecią, czyli uruchomi tclkit z nazwą bieżącego pliku jako
pierwszym argumentem i zakończy przetwarzanie tego pliku. Oczywiście tclkit nie musi byćtak na prawdę
Tclkitem – równie dobrze może to być dowiązanie symboliczne do tclsh czy Cookita. Warunkiem koniecz-
nym jest by tclkit miał atrybut wykonywalności i był dostępny w zakresie ścieżki systemowej PATH.
• interpreter Tcl ignoruje wszystkie linijki zaczynające się od znaku #. Ponieważ druga linijka kończy się zna-
kiem kontynuacji \, Tcl uzna trzecią linijkę za dokończenie poprzedniej, i w efekcie również zignoruje.
Kolejne wiersze to opisany wcześniej nagłówek pliku .kit, i są już wykonywane przez interpreter Tclw celu inicjali-
zacji i uruchomienia danego Starkita.
www.sdjournal.org 31
PROGRAMOWANIE TCL
C:\>tclkit.exe sdx.kit wrap clock.exe -runtime • Zbudowane pliki wykonywalne nie mają żadnych za-
tclkit.copy.exe leżności. Odbiorca docelowy nie musi instalować
żadnych dodatkowych programów czy bibliotek.
SDX nie jest tak sprytny jak nasz skrypt, przez co wy- Dla porównania, w przypadku niektórych rozwią-
maga utworzenia kopii Tclkita. W przypadku pominięcia zań dla Javy, pliki .exe wciąż wymagają zainstalowa-
opcji -runtime , wynikowy plik byłby zwykłym Starkitem: nej na dysku maszyny wirtualnej JRE.
• Mały rozmiar. Zbudowany przez nas clock.exe ma za-
C:\>tclkit.exe sdx.kit wrap clock.kit ledwie 1.2 MB, a zawiera w środku w pełni funkcjo-
nalny interpreter Tcl.
Zgodnie ze wspomnianą wcześniej konwencją, SDX • Wsparcie dla wielu platform i systemów operacyj-
oczekuje że pakowana aplikacja znajduje się w katalo- nych. Chociaż w artykule skupiamy się na środowi-
gu <nazwa_pliku_docelowego>.vfs. Pliki .kit wygenero- sku Windows, analogiczne pliki wykonywalne może-
wane tym narzędziem posiadają standardowy nagłówek my zbudować dla każdej z platform, dla której ist-
(tzw. Shebang – patrz ramka),pozwalający na urucha- nieją Tclkity (lub Cookity). Dzięki temu Linux, Sola-
mianie ich jak zwykłych programów na systemach unik- ris czy MacOS stoją przed nami otworem.
sopodobnych. Również sam SDX może być uruchomio- • Łatwość tworzenia. Do zbudowania wystarczy nam
ny w następującej formie: zaledwie TclKit, i nic więcej. Dodatkowo, nie musi-
my nawet dysponować platformą na którą piszemy
$ ./sdx.kit wrap clock.kit program – pliki pod Windows możemy tworzyć na
Linuxie, i tak dalej. Jedyne co musimy mieć, to Tcl-
SDX pozwala również na szereg innych operacji, jak na Kit na obie platformy (roboczą i docelową). Prze-
przykład rozpakowanie danego pliku. Szczegółową listę cież dobrego kodu nie trzeba testować :)
komend znajdziemy na stronie http://equi4.com/starkit/ • Plik wynikowy nie jest 'czarną skrzynką”. W każdej
sdx.html. chwili możemy uzyskać dostęp do jego wewnętrznej
struktury plików, chociażby w celu poprawek i ak-
Tcl Automated Build System tualizacji. Należy tu podkreślić że może być to po-
Na koniec pozostawiliśmy najbardziej użyteczne roz- strzegane jako wada w przypadku, gdy zależy nam na
wiązanie - Tcl Automated Build System (TABS) to narzę- całkowitym zabezpieczeniu kodu źródłowego przed
dzie do budowania archiwów oraz plików wykonywal- niepowołanym wzrokiem. Z drugiej zaś strony, do-
nych podobne do SDX. Założenia TABS są podobne do celowy odbiorca musiałby wiedzieć że dany plik zo-
rozwiązań typu ant oraz make – możliwość definiowa- stał akurat zbudowany z użyciem tej technologii.
nia i budowania celów, składających się z poszczegól-
nych zadań i zależności pomiędzy nimi. Z powodu złożo- Cookit – rzut oka
ności i mnogości oferowanych cech, system ten opisze- W tym artykule skoncentrowaliśmy się na rozwiązaniach
my w osobnym artykule. opartych o Tclkit. Już wkrótce opiszemy nieformalnego na-
stępcę, bardziej zaawansowany Cookit oparty o VFS cookfs.
Tcl a inne języki Cookit to przede wszystkim mniejsze rozmiary plików oraz
Pomijając ze zrozumiałych względów języki natywne, Tcl lepsza wydajność. To wszystko już w kolejnym artykule!
nie jest jedynym językiem, który pozwala na tworzenie
plików wykonywalnych. Przykładowo szereg rozwiązań PIOTR BEŁTOWSKI, WOJCIECH KOCJAN
istnieje dla Javy, zaś użytkownicy Pythona mogą skorzy- Autorzy książki „Tcl 8.5 Network Programming”
stać z narzędzia py2exe. Mimo to, w subiektywnej ocenie Piotr Bełtowski – od 5 lat pracuje dla IBM,
autorów żaden z pozostałych języków nie oferuje cho- wcześniejsze doświadczenie obejmuje m.in.
ciażby zbliżonego komfortu, prostoty, elegancji i elastycz- Ericsson España i Ericpol. Współautor kilku pa-
ności jak Tcl. Przemawiają za tym następujące fakty: tentów i publikacji.
Wojciech Kocjan jest programistą z ponad 10
letnim doświadczeniem z językiem Tcl. Pra-
Linki cował m.in. dla firm IBM, Motorola, obecnie
• http://equi4.com/tclkit współpracuje z firmą BitRock. Jego aktywność
i http://code.google.com/p/tclkit open source dotyczy m.in. tworzenia narzę-
• http://equi4.com/starkit dzi cookfs, cookit, tabs oraz współpracy przy
• http://equi4.com/metakit pierwszej wersji Tclkit na system Microsoft Win-
• http://www.endorser.org/cookit dows budowanej za pomocą narzędzi MinGW.
• http://www.endorser.org/tabs Kontakt z autorami: piotr.beltowski@gmail.com,
oraz http://sourceforge.net/projects/tabs
wojciech@kocjan.org
32 7/2011
�������������������������������������
����������������������������
����������
������������������������
�����������������
����������������������������������������������
������������������������������������������������
������������������������������������������������
������������������������������������������������
������������������������������������������������
�������������������������������������������������
���������������������������������������������
�������������������������������������������
���������������������������������
��������������������������������������������
�������������������������������������������
������������������������������������
PROGRAMOWANIE TCL
34 7/2011
Tcl: wirtualne systemy plików
www.sdjournal.org 35
PROGRAMOWANIE TCL
36 7/2011
Tcl: wirtualne systemy plików
$ tclkit tabs.tcl wrap -output clock.zip -driver zip Podobnie jak SDX, TABS może również tworzyć pli-
-starkit 1 \ ki wykonywalne. Wystarczy w tym celu podać opcję -
-copy "clock.vfs/*" binary, która wskazuje plik wykonywalny, w oparciu
o który chcemy stworzyć docelową aplikację. Na przy-
Podobnie jak w przypadku polecenia copy, możemy po- kład:
dawać wiele katalogów lub plików źródłowych oraz pa-
kiety do osadzenia w docelowym archiwum: C:\>tclkit.exe tabs.tcl wrap -binary tclkit.exe -
output clock.exe \
$ tclkit tabs.tcl wrap -output clock.mk4 -driver mk4 -copy "clock.vfs/*"
-starkit 1 \
-copy "{libraries/* lib} clock.vfs/*" \ Powyższy przykład stworzy plik wykonywalny w opar-
-packages "pkgs/tclx-8.4.cfspkg pkgs/sqlite3- ciu o tclkit.exe oraz skrypty w katalogu clock.vfs. W po-
3.7.2.zippkg" dobny sposób możemy stworzyć pliki wykonywal-
ne pod inne platformy – oczywiście możemy budować
Operacje wykonane w tym przykładzie są analogiczne aplikacje dla dowolnych systemów operacyjnych z każ-
do operacji w przykładzie z polecenia copy, kopiując je- dego innego systemu – np. programy pod Windows
dynie pliki do archiwum zamiast katalogu docelowego. można budować pod Linuxem lub Mac OS X.
Opcje -driver oraz -driveroptions pozwalają konfi- TABS oferuje możliwość modyfikacji plików wykony-
gurować rodzaj VFS oraz dodatkowe opcje. Jeśli nie po- walnych specyficznych dla systemu Windows. Opcja -
damy opcji -driver, TABS wybierze go automatycznie icons pozwala na podanie 1 lub więcej plików z ikona-
jeśli podamy opcję -binary – np. dodając pliki do Tcl- mi, które zastąpią standardowe ikony Tclkit/Cookit. Na
kit będzie to mk4, do Cookit – cookfs. Jeśli nie poda- przykład:
my opcji -binary, trzeba podać format VFS, który ma
zostać użyty. C:\> tclkit.exe tabs.tcl wrap -binary tclkit.exe
Opcja -driveroptions podaje parametry przekazywa- -output clock.exe -copy (...) -
ne podczas otwierania VFS. Obecnie jedynie cookfs po- icons "icons16.ico icons32.ico
zwala na konfigurowanie parametrów w ten sposób – na icons48.ico icons64.ico"
przykład możemy wyłączyć kompresję plików:
Wszystkie pliki wykonywalne Tclkit/Cookit zawierają
$ tclkit tabs.tcl wrap -output clock.tcl -starkit 1 \ ikony, które są wymagane wewnątrz archiwum na koń-
-driver cookfs -driveroptions "-compression none" cu pliku. W celu sprawdzenia jakich ikon należy dostar-
-copy (...) czyć dla danego pliku, należy rozpakować dany plik wy-
konywalny (np. za pomocą polecenia unwrap ) i spraw-
Dokładne informacje o akceptowanych opcjach może- dzić rozdzielczości oraz ilości kolorów wszystkich ikon
my znaleźć w dokumentacjach do poszczególnych mo- w pliku tclkit.ico lub cookit.ico.
dułów VFS – dla cookfs jest to http://www.endorser.org/ Opcja -fileinfo pozwala na zamianę informacji o apli-
cookit/cookfs/manpage. kacji – dostępnych np. we właściwościach pliku pod sys-
temem Microsoft Windows. Informacje te podawane są
Tabela 3. Atrybuty możliwe do skonfigurowania jako listy Tcl, w postaci dwuelementowej listy nazwa-
za pomocą -fileinfo wartość. Na przykład:
Właściwość Przykładowa wartość
C:\>tclkit.exe tabs.tcl wrap -binary clock.exe -
FileDescription Sample Clock
output app.exe -copy (...) -
FileVersion 1.2-bld14
fileinfo "FileDescription {Sample
OriginalFilename clock.exe Clock} FileVersion 1.2-bld14"
InternalName SampleClock
LegalCopyright © 2011 Jan Kowalski S.C. Tabela 3 przedstawia wszystkie informacje, które moż-
LegalTrademarks © 2011 Jan Kowalski S.C. na podać w opcji -fileinfo.
CompanyName Jan Kowalski S.C. Pole ProductVersionBinary definiuje wersję i należy
podać je w formie A.B.C.D, gdzie A, B, C i D to liczby
ProductName Clock
całkowite pomiędzy 0 a 65535. Pozostałe pola są polami
ProductVersion 1.2-bld14
tekstowymi i przyjmują dowolną informację – włącznie
ProductVersionBinary 1.2.0.14 z wszystkimi znakami Unicode.
Comments Sample clock application for artic- Dla plików wykonywalnych Cookit (od wersji 1.2),
le purporse możliwe jest zdefiniowanie trybu wykonywania (requ-
www.sdjournal.org 37
PROGRAMOWANIE TCL
38 7/2011
Tcl: wirtualne systemy plików
Listing 1.
www.sdjournal.org 39
PROGRAMOWANIE TCL
Typowym przykładem jest budowanie aplikacji, która runjob wrap -fail 0 -driver zip -output clock-
składa się z wielu komponentów. Na przykład jeśli chce- zip.tcl (...)
my budować aplikację klient-serwer, możemy osadzać runjob wrap -fail 0 -driver mk4 -output clock-
kod wspólny dla obu celów oraz specyficzny dla każde- mk4.tcl (...)
go z nich. }
Możemy wtedy budować wspólny plik początkowy
oraz poszczególne wersje końcowe (Listing 1). Powyższy przykład buduje aplikację dla wszystkich
Powyższy przykład wykorzystuje również flagę - obsługiwanych typów archiwum. W przypadku, gdy
checkuptodate, omówioną dokładniej później w tej część z nich nie jest dostępna, błąd zostanie zignoro-
sekcji. Pozwala ona uniknąć budowania plików po- wany.
nownie jeśli żaden z plików źródłowych nie zmienił Opcja -checkuptodate sprawia, że zadanie wykona się
się. jedynie jeśli jeden z plików źródłowych jest starszy niż
Metoda ta znacznie przyspiesza budowanie aplika- plik docelowy. Wróćmy na chwilę do pierwszego przy-
cji, zwłaszcza jeśli pliki wspólne i ewentualne biblioteki kładu:
są dużych rozmiarów – plik pośredni tclkit-common.exe
pozwala uniknąć kompresowania pakietów oraz plików target clock.exe -body {
z common.vfs przy każdym budowaniu projektu. runjob wrap -binary tclkit.exe -output clock.exe \
Możliwe jest również definiowanie celów wirtualnych -checkuptodate 1 -copy "clock.vfs/*"
– posiadających jedynie zależności, nie wykonujących sa- }
memu żadnych operacji. Na przykład:
Spowoduje to, że plik clock.exe zostanie zbudowany od
target all -depends {clock.tcl clock.exe} nowa jedynie w sytuacji, gdy jeden z plików w katalo-
gu clock.vfs zmieni się od ostatniego budowania aplika-
Powyższy przykład definiuje cel all, który spowodu- cji. Zmiany w plikach w podkatalogach – jak np. zmia-
je zbudowanie clock.tcl oraz clock.exe. Wtedy wystar- na w clock.vfs/lib/clock/clock.tcl – również powodują po-
czy uruchomić: nowne zbudowanie aplikacji.
40 7/2011
E-COMMERCE
W
dzisiejszych czasach internetowe serwisy sieci neuronowe, rozkład na wartości osobliwe (SVD)
oferują nam ogromne ilości różnych pro- lub różne techniki klasteryzacji. Drugie podejście wyko-
duktów. Znalezienie ciekawej książki, fajne- rzystywane w SR to metody pamięciowe (ang. memory
go filmu lub piosenki, która się nam spodoba może oka- based). Metody te przy predykcji polecanego produktu
zać się niełatwym zadaniem, na które trzeba będzie po- używają całej historycznej informacji zapisanej w syste-
święcić sporo czasu. Wiele serwisów internetowych mie. Trzecia grupa metod, to metody hybrydowe które
takich jak np. Amazon.com czy YouTube.com oferu- wykorzystują połączenie metod z modelem i metod pa-
je swoim użytkownikom listy polecanych produktów. mięciowych. W artykule przedstawię dwa algorytmy na-
W artykule tym opiszę dwa najpopularniejsze i najła- leżące do grupy drugiej. Oba algorytmy jako wynik dzia-
twiejsze algorytmy stosowane w systemach rekomen- łania zwracają listę N produktów, które będą intereso-
dacji produktów. Ich implementacja oraz używanie po- wać najbardziej użytkownika – takie algorytmy nazywają
zwoli zadowolić użytkowników, którym będą podsuwa- się ang. top-N recommendation.
ne ciekawe produkty oraz właścicieli, którzy będą osią-
gać większe zyski. Reprezentacja danych
W systemie przechowywane są dane opisujące prefe-
Systemy rekomendacji rencje użytkowników do produktów. Zakładamy, że
Systemy rekomendacji (SR), nazywane też ang. collabora-
tive filtering (CF), bazując na zebranych danych historycz-
Tablica 1. Przykładowa macierz R z oddanymi
nych potrafią zasugerować z dużym prawdopodobień-
głosami – wiersze opisują użytkowników,
stwem jakie produkty mogą podobać się zalogowane-
a kolumny oznaczją produkty w systemie.
mu użytkownikowi (ang. active user). Bazują one na ob- Wartości w macierzy to oddane głosy.
serwacji, iż użytkownicy którzy kupili podobne produkty
mają zbliżone gusta, co za tym idzie w przyszłości będą P1 P2 P3 P4 P5
dokonywać podobnych zakupów. Algorytmy stosowane U1 - 3 7 8 8
w systemach rekomendacji można podzielić na trzy gru- U2 2 3 - 7 9
py. Pierwsza z nich, to metody modelowe (ang. model ba- U3 8 9 3 5 2
sed), które opierają się na budowaniu modeli użytkow-
U4 9 - - 3 3
nika i produktu w postaci wektora wag. Wagi te opisu-
ją wzajemne zależności pomiędzy bytami występujący- U5 1 4 9 7 ?
42 7/2011
Wiem czego chcesz – systemy rekomendacji produktów
użytkownik może wyrazić swoją opinię o produkcie gło- Natomiast odległość wykorzystująca korelację Pearso-
sując na niego. Załóżmy również, iż głosy są liczbami na- na podana jest poniżej:
turalnymi z zakresu [0, 10], gdzie 0 oznacza “nienawidzę
tego produktu”, a 10 - “uwielbiam ten produkt”. Odda-
ne głosy możemy przedstawić jako macierz R - (tablicę
dwuwymiarową). Wiersze macierzy będą opisywać nu-
mer użytkownika, a kolumny będą przedstawić numer
produktu. Wartość w macierzy będzie określać odda-
ny głos. Przyjmijmy również, że macierz ma M wierszy
(liczba użytkowników), oraz L kolumn (liczba produk- [2]
tów). Oznaczmy użytkowników indeksami p, q nato- Odległość Pearsona jest trochę bardziej skompli-
miast produkty jako i, j. Zmienna Rpi przedstawiać będzie kowana od odległości cosinusowej, i do jej oblicze-
notę wystawioną produktowi numer i przez użytkowni- nia potrzebna jest znajomość średniej głosów od-
ka o indeksie p. W tablicy nr 1 przedstawiono przykła- danej przez użytkownika o indeksie p – rp i średniej
dową macierz oddanych głosów. Dla przykładu, z tabli- głosów użytkownika q - rq. To, którą definicję me-
cy nr 1 widzimy, że R11='-' co znaczy, że użytkownik U1 tryki podobieństwa wybrać najlepiej sprawdzić em-
nie głosował na produkt P1 i np. że R34=5 co znaczy że pirycznie. Wiedząc, jak obliczyć podobieństwo po-
użytkownik U3 zagłosował na produkt P4, wystawiając mu między użytkownikami, szukamy K najbliższych użyt-
notę o wyskości 5. Natomiast R55='?' znaczy, że chcemy kowników do aktywnego użytkownika Ua (zalogowa-
wyznaczyć przewidywaną notę jaką odda użytkownik U5 nego). Zbiór K najbliższych użytkowników oznaczmy
na produkt P5. jako K(Ua). Następnie dla każdego produktu, na który
Warto zwrócić uwagę, że użytkownik nie musi zagło- nie zagłosował użytkownik Ua, przewidujemy ocenę na
sować na każdy produkt w systemie. W rzeczywistych podstawie równania:
systemach rekomendacji macierz R jest w około 99%
pusta. Trafność proponowanych produktów w dużej
mierze zależy od tego, na ile produktów użytkownik za-
głosował. Im więcej użytkownik oddał głosów, tym traf-
niejsze okażą się zaproponowane później produkty.
W artykule opiszę dwa podejścia w wyznaczaniu prze-
widywanej liczby głosów. Pierwsze podejście bazuje na
podobieństwie pomiędzy użytkownikami (ang. user ba- [3]
sed). Polega ono na znalezieniu w systemie użytkowni- Gdzie rj oznacza średnią ocenę jaką dostał produkt
ków, którzy podobnie głosowali w przeszłości. Opiera j. Wzór [3] można interpretować jako średnią wa-
się na obserwacji, iż skoro użytkownicy głosowali po- żoną głosów oddanych przez K sąsiadów. Następnym
dobnie w przeszłości to ich głosy w przyszłości powin- krokiem w algorytmie jest wybranie N produktów,
ny również być podobne. Drugie podejście, opiera się które dostały najwyższe noty. Wskazanych N pro-
na wyszukaniu podobnych do siebie produktów (ang. duktów jest wynikiem działania algorytmu. Wartość
item based). I tak, jak w pierwszym podejściu, zakłada, K najbliższych sąsiadów potrzebna w tym algorytmie
że produkty które były oceniane podobnie w przeszłości wyznaczana jest eksperymentalnie. Sprawdzając róż-
otrzymają przybliżone noty w przyszłości. ne wartości K wybieramy taką, dla której wartość błę-
du predykcji na zbiorze testowym będzie najmniej-
Algorytm bazujący na podobieństwie sza. Typowe wartości dla K zawierają się w przedzia-
użytkowników le [30, 50].
Do oceny podobieństwa pomiędzy dwoma użytkow- Podsumowując kroki algorytmu, można zapisać nastę-
nikami potrzebna jest metryka odległości między nimi. pująco:
Dwa najczęściej stosowane to odległość cosinusowa
i korelacja Pearsona. Odległość cosinusowa zdefiniowa- 1. Wyznacz odległość między aktywnym użytkowni-
na jest następująco: kiem, a wszystkimi użytkownikami w systemie.
2. Wybierz K użytkowników najbliższych do aktywne-
go użytkownika.
3. Korzystając ze zbioru K najbliższych użytkowników
wyznacz przewidywaną ocenę produktów na które
nie zagłosował aktywny użytkownik.
4. Wybierz N produktów z najwyższymi przewidywa-
[1] nymi ocenami.
www.sdjournal.org 43
E-COMMERCE
Algorytm bazujący
na podobieństwie produktów
Algorytm bazujący na podobieństwie produktów jest
bardzo podobny do wcześniejszego algorytmu, z tą róż-
nicą, że szukane są najbardziej pdobne produkty. Odle-
głość cosinusowa w tym podejściu zdefiniowana jest na-
stępująco:
[4]
Natomiast odległość wykorzystująca korelację Pearso- • problem nowego użytkownika lub produktu (ang.
na podana jest poniżej: cold star problem) – wprowadzając do systemu nowy
byt, nie mamy żadnej informacji o jego głosach;
• problem czarnej owcy (ang. black sheep problem)
– użytkownik oddaje specjalnie głosy inaczej niż
większość ludzi;
• problem sprawiedliwego oceniania – wiele użytkow-
ników ma tendencje do dawania tylko minimalnej
lub maksymalnej oceny.
Podsumowanie
W artykule zostały przedstawione dwa podejścia wy-
korzystujące algorytm najbliższych sąsiadów do reko-
mendacji N produktów. Opisane metody są intuicyjne,
stosunkowo proste w implementacji i dają dobre wyni-
ki. Stosowanie systemów rekomendacji pozwala dostać
[6] dwie pieczenie na jednym ogniu – zadowolony użytkow-
Podobnie jak poprzednio po wyznaczeniu przewidy- nik, ponieważ podsuwane mu są ciekawe produkty tra-
wanych ocen dla produktów na które nie zagłosował za- fiające w jego gust oraz zadowolony właściciel serwisu,
logowany użytkownik wybierana jest lista N produktów gdyż potencjalnie wzrasta sprzedaż oferowanych przez
o największych estymowanych ocenach. niego produktów.
Problemy w systemch
rekomendacji
W rzeczywistych systemach rekomendacji często moż-
na spotkać się z następującymi problemami:
PIOTR PŁOŃSKI
• duża liczba użytkowników i produktów, przez co do Doktorant na Politechnice Warszawskiej, Wy-
działu Elektroniki i Technik Informacyjnych.
przechowywania ich potrzebna jest duża pojemność
Autor interesuje się sztuczną inteligencją,
pamięci RAM;
metodami analizy danych i bioinformaty-
• użytkownicy głosują tylko na małą część wszystkich ką. Ulubionym językiem programowania jest
produktów (ang. sparsity problem), a jakość przewi- C++.
dywanej oceny zależy od liczby oddanych głosów Kontakt: pplonski86@gmail.com
w systemie;
44 7/2011
�����
���������������������������
����������
�����������������������������������������������������
�������������������������������������������������
�������������������������������������������
������������������������������������������������
���������������� ����������������������������������������������
������������������������������������������ ����������������������������������������������
������������������������������������ ����������������������������
����������������������������������������������� �����������������������
������������������ ���������������������������������������
����������������� ���������������������������������������
������������������������������������������ ���������������������������������������
������������������������������������������������������� ������������������������������������������
�������������������������������������������������� ���������������������������������������
��������������������� ������������������������������������
���������������������������������������������� ���������������������������������������
�������������������������������������������������� �����������������������
����������������������������������������� ���������������������������������������������
��������������������� ������������������������������������������������
������������������������������������� �������������������������������������������������
�������������������������������������������
��������������������������������������������
���������������������
���������������������������������������������
������������������������������������ ���������������������������������������
�������������������������������������������� ������������������������������������������
�������������������������������������� ���������������������������������������
���������������������������������������� ������������������������������������������
����������������������������������������������� �������������������������������
��������� ����������������������
���������������������
���������������������������������������� ��������������������������������������
����������������������������������������������� �������������������������������������
��������� ������������������������
������������������������������� �������������������
�������������������������������� ����������������������������������
�������������������������������������������������� �����������
���������������������������������������������������� ��������������
�������������� �������������������������������������
����������������������� �����������������������������������������������������
INŻYNIERIA OPROGRAMOWANIA
Dług techniczny
Dług techniczny jest metaforą opracowaną przez Warda Cunninghama
Metafora ta oparta jest na idei długu finansowego, który jest korzystny jedynie w krótkim okresie czasu:
46 7/2011
Naturalny porządek refaktoryzacji
www.sdjournal.org 47
INŻYNIERIA OPROGRAMOWANIA
result = result2;
result = Regex.Replace(result, @"[\?!-\.,:;'\(\)]", "", RegexOptions.CultureInvariant);
48 7/2011
Naturalny porządek refaktoryzacji
result = result
.Replace("ą", "a")
.Replace("ł", "l")
.Replace("ę", "e")
.Replace("ń", "n")
.Replace("ż", "z")
.Replace("ź", "z")
.Replace("ó", "o")
.Replace("ś", "s")
.Replace("ć", "c")
.Replace("Ą", "A")
.Replace("Ł", "L")
.Replace("Ę", "E")
.Replace("Ń", "N")
.Replace("Ż", "Z")
.Replace("Ź", "Z")
.Replace("Ó", "O")
.Replace("Ś", "S");
result3 += newCh;
}
else
{
result3 += ch;
}
}
result = result3.Replace(" ", "");
return result;
}
}
www.sdjournal.org 49
INŻYNIERIA OPROGRAMOWANIA
Strategia refaktoryzacji
Jednak najczęściej nie wystarczy po prostu refaktory- Prywatne metody
Jeśli w klasie są znaczące prywatne metody, które
zać, bo łatwo wpaść w szał refaktoryzacji, który pole- mają długość więcej niż kilka wierszy, to prawdo-
ga na refaktoryzowaniu wszystkiego i za wszelką cenę. podobnie metoda ta powinna znaleźć się w innej
Przedstawimy poniżej strategię refaktoryzacji, która klasie – już istniejącej lub nowej.
w sposób systemowy pozwala podejść do tego często
niewdzięcznego zadania, jednocześnie przyczyniając
się do ewolucyjnego rozwoju projektu i architektury.
Podpowiada też, jak się zabrać za kod odziedziczony ność klasy. Przesuń metody, które realizują inne
i zacząć go refaktoryzować. Oto magiczne punkty: odpowiedzialności do bardziej odpowiednich dla
nich klas.
1. Zacznij od prostego rozwiązania, zgodnie zasadą 4. Z czasem zaczynasz dostrzegać, że w Twoich roz-
Keep it simple stupid. Nie myśl zbyt dużo o wzor- wiązaniach potrzeba elastyczności – zacznij wpro-
cach, o wprowadzaniu wszelkiej możliwej ela- wadzać wzorce projektowe, tam gdzie potrzeba.
styczności. 5. Raz na jakiś czas (raz na kilka miesięcy przy więk-
2. Z dużych metod zaczynaj wyodrębniać mniej- szych projektach), analizuj to, co dzieje się z Two-
sze składowe metody (refaktoryzacja Extract Me- im projektem. Architektura wymaga regularnego
thod). Dąż do realizacji wzorca Compose Method odświeżania i wprowadzania zmian, aby przysta-
– niech Twoja główna metoda składa się z serii wała do pojawiających się wymagań.
wywołań mniejszych metod.
3. Kiedy Twoje klasy będą składały się z dużej ilości Przyjrzymy się kolejnym krokom procesu na przykła-
małych metod, zacznij analizować odpowiedzial- dzie fragmentu kodu (Rysunek 1).
Compose Method
Analiza metod takich jak przedstawiona na Listingu
1 najczęściej prowadzi nas do zrozumienia, jakie są
główne punkty algorytmu zawartego w metodzie. I to
jest właśnie kolejny krok – postaraj się podzielić dużą
metodę na mniejsze kroki wyodrębniając je do osob-
nym metod (refaktoryzacja Extract Method). Tym sa-
mym pierwotna metoda będzie się składać z sekwen-
cji wywołań metod składowych. Przy odpowiedniej
konwencji nazewniczej uzyskamy kod, który czyta się
jak książkę.
Przy okazji warto co nieco posprzątać – głównie
Rysunek 2. TextObfuscator po zastosowaniu wprowadzić zmiany w mało intuicyjnych nazwach.
Compose Method. Przykład znajdziesz na Listingu 2.
50 7/2011
Naturalny porządek refaktoryzacji
www.sdjournal.org 51
INŻYNIERIA OPROGRAMOWANIA
52 7/2011
Naturalny porządek refaktoryzacji
bardziej kształtne rozwiązanie, jednak głównie to co Wersja z Budowniczym wyglądałaby jak na Listin-
otrzymujemy to metody pogrupowane w klasy. Nad- gu 4.
szedł czas na zastosowanie zasad obiektowych (np.
zebranych w SOLID). Analizujemy kod pod kątem po- Ewolucja architektury
wtarzalności, potrzeby elastyczności, zapachów ko- Dalszym krokiem, na dużo wyższym poziomie abs-
du i wprowadzamy wzorce projektowe. Często tam trakcji i wymagającym dogłębnego zrozumienia sys-
gdzie mamy wiele metod o zbliżonym schemacie bę- temu. Na bazie pojawiających się wzorców, rozwija-
dzie można zastosować Template Method lub Strate- jących się obiektów dziedzinowych po pewnym cza-
gy. Tam gdzie tworzymy złożone struktury, tam sto- sie dostrzegamy konieczność modyfikacji architektu-
sujemy wzorzec Builder. Tam gdzie mamy do czynienia ry. Z pomocą mogą nam przyjść wzorce architekto-
z nieskomplikowaną maszyną stanową wprowadzamy niczne lub wprowadzenie innych mechanizmów archi-
State. Tam gdzie potrzebujemy polimorficznego two- tektonicznych. Na tego typu przekształcenia może się
rzenia obiektów używamy Abstract Factory lub jej zde- składać m. in.:
generowanej postaci Simple Factory.
Jeśli przyjrzymy się klasie TextObfuscatorMethods • wprowadzanie warstw;
z przykładu, możemy zauważyć, że większość me- • wprowadzenie lub zmiana O/RM;
tod przyjmuje jako parametr przetwarzany tekst. • zmiana organizacji logiki biznesowej;
Jest to sygnał, że te metody powinny być w kla- • wprowadzenie lub zmiana szkieletu aplikacji.
sie, która ma pole zawierające przetwarzany tekst.
W zasadzie możemy odwrócić sytuację i w klasie Często w systemach przyjmuje się, że stworzo-
TextObfuscatorMethods umieścić pole typu przetwa- na raz architektura będzie doskonale spełniać swo-
rzany tekst, wtedy metody staną się praktycznie bez- je zadanie przez cały cykl życia produktu. Tymcza-
parametrowe. Tym samym klasa nabiera charakteru sem zmienność wymagań oraz trudność stworzenia
wzorca Builder. optymalnej architektury od samego początku powo-
Inną opcją, pod warunkiem, że chcielibyśmy uzy- duje, że założenia architektoniczne należy cały czas
skać możliwość dowolnego składania przekształceń monitorować oraz wprowadzać ewolucyjne zmiany,
zaciemniających tekst (stosować je wybiórczo, w do- tak aby powstające rozwiązania były proste. Sztyw-
wolnej kolejności, o czym chcielibyśmy decydować na, nie zmieniana architektura najczęściej prowadzi
w czasie wykonania), wtedy można by zastosować do powstawania rozwiązań trudnych w zrozumieniu,
wzorzec Decorator. naszpikowanych obejściami.
www.sdjournal.org 53
INŻYNIERIA OPROGRAMOWANIA
builder.ChangeWordsOrderRandomly();
builder.AddMeaninglessWordsRandomly();
builder.RemoveSeparators();
builder.AddSeparatorsRandomly();
builder.RemoveSpaces();
builder.ReplacePolishCharactersWithNonPolish();
builder.ReplaceUpperAndLowercase();
return builder.ToString();
}
}
public class ObfuscatedTextBuilder
{
// ...
private List<TextPart> textParts = new List<TextPart>();
public virtual void NewText(string text)
{
this.textParts = ParseTextForWordsAndNonWords(text);
}
// ...
public virtual void RemoveSpaces()
{
for (int i = 0; i < textParts.Count; i++)
{
RemoveSpacesFromTextPart(textParts, i);
RemoveTextPartIfEmpty(textParts, i);
}
}
54 7/2011
Naturalny porządek refaktoryzacji
www.sdjournal.org 55
INŻYNIERIA OPROGRAMOWANIA
56 7/2011
Skuteczne wdrażanie w projekt
Nowy projekt, nowe możliwości... ludzi i muszę zostać wdrożony w projekt maksymal-
Wyobraźmy sobie, że właśnie zmieniam pracę. Z ob- nie szybko.
szarów dobrze poznanych, muszę wkroczyć w niezna- Po przedstawieniu powyższego zarysu przechodzi
ne rejony, być może w całkiem nowe technologie. Dla ów kolega do listowania wszystkich istotnych techno-
ułatwienia przyjmijmy, że jest to projekt webowy. Po- logii używanych zarówno w starym, jak i nowym stac-
wszechnie wiadomo bowiem, że webowe projekty są ku. Okazuje się, że aplikacja siedzi na bazie danych
najciekawsze, zaś podawanie ich jako przykład w rozwa- Oracle i korzysta z JPA. Jako providera używa Hiber-
żaniach daje nieskończone wręcz możliwości. nate w wersji 4.x, jednak nie wszędzie, bo starsza część
Załóżmy ponadto, że rzecz toczy się w krainie Ja- bazuje na układanych „na piechotę” zapytaniach reali-
vy Enterprise, a ja sam dysponuję doświadczeniem zowanych przez warstwę JDBC. Jako, że baza do naj-
dość dobrym, by radzić sobie śpiewająco z większo- mniejszych nie należy, mapowań encji po obydwu stro-
ścią trzy- i więcej-literowych skrótów rozpoczynają- nach ci u nas dostatek. Dochodzą do tego hordy klas
cych się od „J”. DAO i DTO. Żeby było bardziej zielono, obracamy się
Przybliżmy w kilku słowach charakterystyczne cechy w Springu w wersji 3.x. Warstwę UI realizuje nam to-
projektu. na widoków JSP osadzonych w Tiles'owych szablonach.
Projekt jest duży, rozwijany od X lat. Przez ten czas Nad bezpieczeństwem czuwa nieśmiertelne Spring Se-
przewinęło się przezeń masę kodu. Spora jego część curity ze swymi nieskończonej długości łańcuchami fil-
nadal istnieje i nazywa się legacy stuff, że się tak wyra- trów. Jako, że nie wszystko da się bądź opłaca się ob-
żę. Nikt nie chce tego oglądać z bliska, bo później śnią sługiwać w MVC, mamy jeszcze garść serwletów, ser-
się koszmary. Czasami jednak nie ma wyjścia. Ale jest wujących bardziej wymagające zasoby. Całości obrazu
też promyk światła w ciemności – oto heroicznym wy- dopełnia kilka pomniejszych aplikacji pomocniczych ko-
siłkiem zastępów programistów udało się zrefaktory- rzystających z innych baz danych, innych frameworków
zować część starych modułów i stworzyć nowe, ko- i pozostałych, znanych i lubianych specyfikacji na lite-
rzystające z bardziej cywilizowanych technologii. Te rę „J”, jak na przykład JSF, JMS, JMX czy nawet zmo-
nowe są rozwijane pod nazwą new stack. Dąży się do ra najwytrwalszych – JAAS. Na okrasę otrzymuję prze-
przeniesienia tam całej archaicznej, zardzewiałej funk- gląd wszystkich wersji wykorzystywanych kontenerów
cjonalności, ale biznes mówi, że jeszcze nie teraz, bo są serwletów i serwerów aplikacji razem z ciekawszymi
ważniejsze priorytety. Priorytety bywają zwykle waż- przykładami ich konfiguracji.
ne i ważniejsze, a biznes wie co mówi. Dowiedziałem Kolejny krok wprowadzenia to zaprezentowanie mi
się tego w rozmowie ze starszym (stażem i być może zasad biznesowych obowiązujących w tym zagmatwa-
wiekiem) kolegą. Wygląda na obeznanego w temacie, nym świecie. Z zasadami powiązane są pryncypia ar-
poza tym chyba lubi to co robi, bo wszystko opowia- chitektury, które muszę poznać wraz z obowiązującymi
da mi z niehamowanym, chaotycznym entuzjazmem. standardami kodowania, pracy w zespole, używania na-
Wyznaje widać zasadę, że jeśli nie powie mi wszyst- rzędzi, etc.
kiego naraz, wiedza ta najpewniej przepadnie wkrót- Na pierwszy rzut oka całkiem tego sporo. Samo zesta-
ce na wieki. wienie technologii mogłoby przyprawić o ból głowy, ale
Powód tegoż postępowania nie daje się nazbyt dłu- miałem to szczęście, że ze sporą częścią z nich zetkną-
go ukrywać. Zatrudniono mnie, bo firma potrzebuje łem się już wcześniej. Powiedzmy, że w Springu nie pisa-
• Novice – całkowite podporządkowanie regułom, bez znajomości kontekstu, w którym są one umiejsco-
wione razem z rozpatrywanym zagadnieniem. Nie czuje się częścią systemu.
• Advanced beginner – nadal stosuje reguły, lecz posiada już ograniczoną zdolność do znajdowania no-
wych miejsc ich zastosowania. Nie potrzebuje szerszego oglądu na zagadnienie, nad którym pracuje.
• Competent – posiada już całkiem pokaźny zestaw reguł. Potrafi je kategoryzować, by wiedzieć, kiedy któ-
rą należy stosować. Umie rozwiązywać problemy. Dostrzega kontekst problemu.
• Proficient – potrzebuje szerszego oglądu sytuacji. Potrafi samodzielnie poprawiać swoje błędy i doskona-
lić się. Działa w kontekście dziedziny.
• Expert – nie potrzebuje reguł. Działa intuicyjnie w kontekście dziedziny, udzielając od razu odpowiedzi na
stawiane pytanie. Czuje się częścią systemu, czuje się za niego odpowiedzialny.
www.sdjournal.org 57
INŻYNIERIA OPROGRAMOWANIA
Wydajność pair-programming
Programowania w parach to metoda zaczerpnięta z metodyki XP. Jest ona na tyle uniwersalna, że dopraw-
dy ciężko wyobrazić sobie przykład, gdzie mogłaby nie przynieść zauważalnego zysku. Oczywistym jest, że
gdy na ten sam fragment kodu patrzy często więcej niż jedna osoba jednocześnie, przepływ wiedzy o pro-
jekcie między członkami zespołu zauważalnie się zwiększa. Nie zawsze jednak oczywistym jest, że jeśli jest
przez wszystkich stosowana na porządku dziennym, zwiększa się także wydajność całego zespołu. Wyjaśnie-
nie tego fenomenu jest całkiem proste: co dwie głowy, to nie jedna. Dwóch programistów pracujących nad
tym samym kodem jest w stanie lepiej mobilizować się nawzajem do pracy niż gdy pracują osobno. Ponad-
to zmniejsza się ich wypadkowe „rozproszenie”, co implikuje mniej przypadkowego „błądzenia” w okolicach
poszukiwanego rozwiązania. Dzięki temu poprawia się też oczywiście jakość kodu.
Programujmy w parach codziennie!
Więcej informacji można znaleźć w [5].
58 7/2011
Skuteczne wdrażanie w projekt
Jeśli chcemy nauczyć, róbmy to z głową matem i powiększy pewność siebie. Zadanie nierozwią-
Powyższy przykład został wyolbrzymiony celowo. Wia- zywalne są całkowicie zabronione. Brak zadowalających
domo, że nikt rozsądny nie zatrudni zupełnego nowicju- rezultatów potrafi, jak powszechnie wiadomo, nad wy-
sza, kiedy spodziewa się szybkiego zwrotu z inwestycji. raz skutecznie demotywować.
Zwykle mamy do czynienia z przypadkami umiejscowio- Pamiętamy, że szybka informacja zwrotna to przecież
nymi gdzieś pomiędzy obydwoma przytoczonymi przy- kluczowy aspekt Deliberate Practice.
kładami. Skupmy się teraz na początkujących kandyda-
tach jako najbardziej wymagających. Oto kilka spostrze- Stosujmy jak najczęściej programowanie
żeń, które mogą pomóc w tym względzie potencjalnym w parach
mentorom. Nie dość, że jest to podejście zwiększające jakość kodu
i wydajność całego zespołu (patrz ramka), to jeszcze zna-
Dostosowujmy poziom komicie ułatwia dzielenie się wiedzą. Zaleca się stosowa-
Już po kilku minutach rozmowy z nowym członkiem ze- nie go jak najczęściej, niezależnie od poziomu posiadane-
społu widać jak na dłoni poziom jego umiejętności. Po- go doświadczenia.
starajmy się umiejscowić go w modelu Dreyfusa, a bę- Tych kilka prostych wytycznych rozwiązuje większość
dzie nam łatwiej się z nim komunikować. napotykanych przez początkujących członków zespo-
łu trudności. Przy odpowiednim zrozumieniu po oby-
Cierpliwe odpowiedzi na głupie pytania dwu stronach na pewno przyniosą one oczekiwane re-
Ktoś kiedyś powiedział, że nie ma głupich pytań – są tyl- zultaty. Największe korzyści możemy osiągnąć wyzwala-
ko głupie odpowiedzi. Bądźmy przygotowani na dziesiąt- jąc u młodszych stażem kolegów odpowiednią motywa-
ki pytań, począwszy od tych najbardziej elementarnych. cję. Jeśli podarujemy im cierpliwą pomoc, odpłacą zaan-
Wkrótce okaże się, że ilość pytań się zmniejsza, a zaufa- gażowaniem w projekt.
nie do zespołu rośnie. Wystarczy tylko pamiętać, że dla każdego z nas każdy
projekt, przy którym przyszło nam prawować, był kie-
Uczmy poprzez przykłady dyś nowy.
Pamiętajmy, że człowiek bardzo szybko przyswaja to,
co jest w stanie sam powtórzyć. Proste ćwiczenia re-
alizowane w trybie pair-programming są tu nieocenio-
ną pomocą. Można zacząć na przykład od demonstro-
wania stosowanych praktyk na przykładzie refaktoryza- MICHAŁ KAPŁON
Absolwent Kierunku Informatyka na Wydziałe
cji fragmentów określonych jako legacy code. Całkiem
Elektroniki Politechniki Wrocławskiej. Od roku
dobrze działa też rozwiązywanie Bug-ów. Idealnie, je- związany z firmą Tieto Poland Sp. z o. o., gdzie
śli da się to przeprowadzić z wykorzystaniem meto- pracuje na stanowisku Senior Java Developer
dyki TDD. przy ciekawym, lecz wymagającym projekcie
wykorzystującym technologie JEE. Posiada
Nie zasypujmy nowicjuszy zbędnymi szczegółami sześć lat doświadczenia w wytwarzaniu opro-
Nadmierna szczegółowość nie jest na początku potrzeb- gramowania, w większości w Javie. Przedsta-
na. Skupmy się na jednym prostym problemie za jednym wione wyżej idee stara się, w miarę możliwo-
razem, a efekt będzie o wiele lepszy. ści, wcielać w życie, by czerpać na co dzień
przyjemność ze swojej pracy i nie utrudniać
Rezultat musi być widoczny bardzo szybko życia innym, zwłaszcza młodszym kolegom,
Dobierajmy początkującym zadania tak, by widzieli ich których przyjdzie mu wdrażać w projekt.
efekt możliwie najszybciej. Zmniejszy to ich znużenie te-
Literatura
1. Pragmatic Thinking and Learning. Refactor Your “Wetware”, Andy Hunt, 2008, Pragmatic Bookshelf
2. What is Deliberate Practice? Mastering the Art of Intelligent Practice, Pervin Shaikh, 2009 [http://
www.suite101.com/content/deliberate-practice-a132437]
3. Secrets of Greatness. What it takes to be great, Geoffrey Colvin, 2006 [http://money.cnn.com/
magazines/fortune/fortune_archive/2006/10/30/8391794/index.htm]
4. Dreyfus model of skill acquisition, Wikipedia [http://en.wikipedia.org/wiki/Dreyfus_model_of_skill_acqu-
isition]
5. Pair Programming [http://www.extremeprogramming.org/rules/pair.html]
www.sdjournal.org 59