wtorek, 21 grudnia 2010

DB2 9.7 Bootcamp and Oracle to DB2 9.7 Migration Clinic

Wraz z kolegami z uczelni postanowiłem wziąć udział
w organizowanym w Krakowie (13.12 - 16.12) przez IBM Polska czterodniowym szkoleniu "DB2 9.7 Bootcamp and Oracle to DB2 9.7 Migration Clinic". Podejmując decyzję o wyjeździe liczyłem,
że podczas pobytu w Krakowie poza uzyskaniem solidnej dawki nowej wiedzy, będę miał również możliwość spotkać się ze studentami
z innych uczelni. Jednak zainteresowanie ze strony studentów było niewielkie, poza naszą piątką pojawił się wyłącznie jeden student
z Uniwersytetu Adama Mickiewicza w Poznaniu.

Istotną zaletę szkolenia w moim odczuciu stanowił fakt,
iż w przypadku omawianych tematów, z którymi miałem okazję zapoznać się już wcześniej podczas "DB2 Academic Associate Workshop", poziom wiedzy zawarty w prezentacjach oraz
w przygotowanych laboratoriach był rozszerzony o nieomawiane wcześniej zagadnienia. W ten sposób my studenci mieliśmy możliwość nie tylko utrwalić swoją wiedzę, ale również dowiedzieć się czegoś nowego. Na szczęście tematów całkowicie nam wcześniej nieznanych nie brakowało, dzięki czemu każdy z nas wrócił do Zielonej Góry
z wiedzą znacznie większą od tej, z którą ją opuszczał.

Trzeciego dnia otrzymaliśmy możliwość przystąpienia do testu
"M45 IBM Information Management DB2 Technical Mastery",
który sprawdzał naszą ogólną wiedzę odnośnie DB2. W moim przypadku test potrwał 20 minut a pytania nie sprawiły większego problemu. Uzyskany wynik - 78%.

Test Title: M45 IBM Information Management DB2 Technical Mastery v2
Start time: 12/15/2010 2:07:57 PM (GMT+0:00) (cst)
End time: 12/15/2010 2:27:35 PM (GMT+0:00) (cst)
Passing Score: 62%
Your Score: Pass (78.12%)


Kolejnego dnia wręczono nam certyfikaty poświadczające ukończenie szkolenia oraz otrzymaliśmy możliwość przystąpienia do egzaminu na certyfikat "IBM Certified Database Associate - DB2 9 Fundamentals", który jest już trudniejszy od egzaminu zdawanego w ramach "DB2 Academic Associate Workshop". Trudniejszy z pewnością ze względu na wymóg jeszcze bardziej wnikliwszej analizy pytań - a może to stres, że zabraknie czasu na udzielenie wszystkich odpowiedzi również zrobił swoje? Na szczęście z konfrontacji z egzaminem o numerze 730 wyszedłem obronną ręką. Wynik - 68% klasyfikuję jako zadowalający, zwłaszcza biorąc pod uwagę, że bazy danych nie wzbudzają we mnie aż takiej pasji jaka towarzyszy programowaniu :)

Test Title: 000-730, DB2 9 Fundamentals
Start time: 12/16/2010 2:33:05 PM (GMT+0:00) (cst)
End time: 12/16/2010 3:52:57 PM (GMT+0:00) (cst)
Passing Score: 59%
Your Score: Pass - 68.75% (44 earned out of 64 possible)


Pobyt w Krakowie wspominać będę bardzo miło, przede wszystkim za sprawą przyjaznej atmosfery podczas szkolenia, za co podziękowania należą się szczególnie organizatorom. Dzięki PKP atrakcji podczas samej podróży również nie brakowało, co tylko nadaje niezapomniany charakter wyprawie. Swoją drogą ciekawe jak długo jeszcze PKP będzie nas zaskakiwać :)

Więcej informacji odnośnie szkolenia oraz testów:
  • DB2 9.7 Bootcamp and Oracle to DB2 9.7 Migration Clinic
  • Test M45: IBM Information Management DB2 Technical Mastery v2
  • Test 000-730: DB2 9 Family Fundamentals
  • poniedziałek, 6 grudnia 2010

    DB2 Academic Associate Workshop

    W ubiegłym tygodniu (29.11 - 1.12) miałem przyjemność wziąć udział w szkoleniu organizowanym przez IBM Polska, którego celem było zapoznanie słuchaczy (wyłącznie społeczność akademicką) z DB2 9.7 dla systemów Linux, UNIX i Windows.

    Podczas trzydniowego szkolenia, na które składały się tematyczne laboratoria powiązane z poprzedzającymi je prezentacjami, mieliśmy możliwość odświeżyć swoją wiedzę na temat np. relacyjnego modelu danych czy języka SQL oraz dowiedzieć się o zupełnie nowych rozwiązaniach np. o technologii pureXML.

    Całość zwieńczona była egzaminem na certyfikat "DB2 9 Database and Application Fundamentals", jedynym egzaminem jak dotąd, który zdawałem na uczelni drogą elektroniczną i bez przysługującej poprawki :) Jak wynik? Myślę, że nie mam powodów, aby się wstydzić aczkolwiek mogło być lepiej - 73% co przy 60% progu zdawalności stanowi nienajgorszy rezultat.

    Test Title: 000-302 DB2 9 Database and Application Fundamentals
    Start time: 12/1/2010 1:53:26 PM (GMT+0:00) (cst)
    End time: 12/1/2010 2:51:47 PM (GMT+0:00) (cst)
    Passing Score: 60%
    Your Score: Pass - 73.33% (44 earned out of 60 possible)


    Na szczególne uznanie zasługuje wspaniała integracja między uczestnikami szkolenia, która miała miejsce przede wszystkim podczas dłuższych przerw obiadowych, gdzie organizacja smacznego posiłku w sympatycznym towarzystwie przybierała formę codziennego rytuału.

    Wspomnieć należałoby również, że w Zielonej Górze ogólna zdawalność egzaminu wg nieoficjalnego źródła (czyli wg zaawansowanych obliczeń mających miejsce zaraz po egzaminie, polegających na zliczaniu uśmiechniętych uczestników) wyniosła ponad 80% - moim zdaniem wynik również nienajgorszy.

    Dodam jeszcze, że osoby zainteresowane tematyką szkolenia mają możliwość uzyskać więcej informacji odwiedzając następującą witrynę: DB2 Academic Associate Workshop

    piątek, 3 grudnia 2010

    Pierwszy kontakt z technologią JavaServer Faces

    Jeżeli miałbym rozpatrywać ubiegły miesiąc pod względem skuteczności zdobywania przeze mnie wiedzy, śmiało zakwalifikowałbym listopad jako bardzo udany. Swoją aktywność przede wszystkim (ale nie tylko!) skupiłem wokoło technologii JavaServer Faces.

    Przygoda z JSF rozpoczęła się w moim przypadku od lektury podręcznika pt. "JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW". Wybór książki mającej na celu wprowadzić mnie w świat technologii JSF nie był zupełnie przypadkowy, autor w/w pozycji dr inż. Andrzej Marciniak jest pracownikiem naukowo-dydaktycznym Uniwersytetu Zielonogórskiego
    a co ważniejsze, szczególnie dla mnie, promotorem mojej przyszłej pracy inżynierskiej.

    Pozostając w zgodzie z samym sobą, jestem w stanie szczerze przyznać, że lektura podręcznika była dla mnie połączeniem przyjemnego z pożytecznym, ponieważ zdobyta wiedza z pewnością znajdzie swoje zastosowanie również przy projektach realizowanych na uczelni, np. w ramach przedmiotu "Zaawansowane technologie usług sieciowych".

    Istotna informacja - wiedza zawarta w podręczniku opiera się na technologii JSF w wersji 1.2 , natomiast wybrane różnice pomiędzy wersją 1.2 a 2.0 zostały wypunktowane w Dodatku B. Osobom chcącym bardziej przyjrzeć się nowym rozwiązaniom wprowadzonym przez JSF2 mogę polecić przegląd nowości, którego forma bardzo przypadła mi do gustu:

    What’s New in JSF 2?

    Wiedzę dotyczącą JSF2 zamierzam poszerzać regularnie, drobnymi kroczkami tak, aby nie zaniedbać przy tym innych aktywności,
    o których również, mam nadzieję napiszę już niebawem.

    czwartek, 18 listopada 2010

    Wzorce projektowe - Prezentacja w ramach przedmiotu "Komunikacja interpersonalna"

    Przedmiot "Komunikacja interpersonalna", który ma za zadanie przygotować nas, studentów do przyszłej pracy - a co za tym idzie, obcowania nie tylko ze sprzętem, stanowi przyjemną odskocznię
    od typowo technicznych zajęć, w których bierzemy udział na uczelni.

    W ramach omawianego przedmiotu miałem ostatnio przyjemność wygłosić prezentację na wybrany przez siebie temat. Zgodzę się,
    że temat wzorców projektowych nie stanowił dużej odskoczni od codziennych zajęć, ale wybór był świadomy, zatem czułem się o niebo lepiej niż w przypadku prezentacji z odgórnie narzuconym tematem.

    Moje przygotowania ograniczyły się wyłącznie do stworzenia prezentacji multimedialnej, odnośnie samego wystąpienia postanowiłem zupełnie improwizować. Na szczęście obrana przeze mnie taktyka była jak najbardziej słuszna, obyło się bez potknięć merytorycznych a forma przekazu wiedzy nie pozwoliła nikomu usnąć.

    Podczas swojego wystąpienia przedstawiłem kolejno:
    - krótki zarys historyczny (istotne publikacje);
    - podział wzorców ze względu na ich przeznaczenie;
    - wzorce Strategia, Kompozyt oraz Obserwator;
    - wzorzec Model-Widok-Kontroler oraz jego adaptację do środowiska WWW, mianowicie Model 2.

    W ramach krótkiego podsumowania przedstawiłem podstawowe zalety oraz wady stosowania wzorców w swoich projektach. Mam nadzieję, że kolegom prezentacja przypadła do gustu oraz czekają razem ze mną na kolejne wystąpienia. Jak zwykle ewentualnych zainteresowanych tematem zapraszam do dyskusji.

    niedziela, 31 października 2010

    Wrażenia po lekturze książki "Java. Efektywne programowanie. Wydanie II"

    Joshua Bloch stworzył podręcznik, w którym każdy programista powinien znaleźć coś dla siebie, zawarte w nim informacje odnośnie efektywnego wykorzystania Javy przede wszystkim znajdują swoje zastosowanie
    w codziennej pracy.

    Poza zawartością merytoryczną książki powinniśmy docenić również formę przekazu wiedzy, która moim zdaniem mogłaby zadowolić nawet najbardziej wybrednego czytelnika. Dobrze przemyślana, przejrzysta struktura podręcznika umożliwia niemalże natychmiastowy powrót do wybranego zagadnienia oraz sprawia,
    że całość czyta się bardzo przyjemnie.

    Większość tematów poruszanych przez podręcznik posiada zakończenie w postaci krótkiego podsumowania, które uwypukla najistotniejsze informacje oraz stanowi doskonały punkt przypomnienia omawianych przez autora zagadnień.
    Ostatni rozdział dotyczący serializacji obiektów przypadł mi do gustu szczególnie, dzięki niemu decyzje związane z implementacją interfejsu Serializable będę podejmować całkowicie świadomie.

    Do "Java. Efektywne programowanie. Wydanie II" zajrzę zapewne jeszcze niejednokrotnie - tego typu książkę warto mieć na swojej półce.

    środa, 25 sierpnia 2010

    Wrażenia po lekturze książki "Head First Design Patterns. Edycja polska"

    Trzymając w ręku "Head First Design Patterns. Edycja polska" można odnieść wrażenie, że czeka nas ciężka przeprawa przez ponad 600 stron pełnych wiedzy.
    Myślę, że każdy kto miał styczność
    z omawianą pozycją może się ze mną zgodzić, że w rzeczywistości książkę czyta się szybko i co najważniejsze
    z przyjemnością. Wykorzystane przez autorów metody nauczania faktycznie przyśpieszają proces poznawania wzorców projektowych.

    Niestety minus należy się dla wydawnictwa za znaczną ilość popełnionych błędów przy tworzeniu edycji polskiej. Całe szczęście, że błędy nie są na tyle poważne aby wpłynąć negatywnie na wartość merytoryczną podręcznika.

    Miły dodatek z pewnością stanowi wstęp do Java RMI (moim zdaniem bardzo dobry) zawarty w rozdziale 11 przy okazji omawiania wzorca Proxy. Szkoda, że nie miałem go pod ręką gdy sam poznawałem RMI.

    Wracając jeszcze do wspomnianych metod nauczania, zastosowanie powtórzeń wiadomości budzi we mnie mieszane uczucia - przedstawienie tej samej informacji na różne sposoby niekiedy może być przydatne ale w przypadku omawianych wzorców wywoływało
    u mnie chęć przeskoczenia kilka stron dalej. Czyżby forma przekazywania wiedzy towarzysząca podręcznikowi była tak skuteczna, że powtórzenia informacji nawet w dobrej wierze stały się zbędne?

    Zwieńczenie dzieła stanowi rozdział 13 pt. "Wzorce projektowe
    w praktyce: Nowe życie z wzorcami"
    gdzie autorzy m.in. zwracają uwagę na skłonność początkujących programistów do nadmiernego wykorzystywania wzorców oraz wskazują słuszną drogę dalszego rozwoju.

    Dla mnie podręcznik okazał się bardzo przydatny, wszystkim zainteresowanym poznaniem wzorców projektowych mogę polecić "Head First Design Patterns" z czystym sumieniem.

    niedziela, 25 lipca 2010

    Wrażenia po lekturze książki "Hibernate w akcji"

    Sięgając po "Hibernate w akcji" (Christian Bauer, Gavin King) nie spodziewałem się,
    że lektura podręcznika potrwa ponad miesiąc, przyczyn takiego przebiegu zdarzeń daleko szukać nie trzeba – najpierw zakończenie roku akademickiego oraz sesja, później słoneczny początek wakacji.



    Po takim wstępie można śmiało odnieść wrażenie, że staram się znaleźć usprawiedliwienie dla własnego lenistwa – tak jednak nie jest! :)

    Długo zastanawiałem się dlaczego "Hibernate w akcji" budził moje mieszane uczucia podczas lektury. Pomimo przekazu wiedzy na temat odwzorowania obiektowo-relacyjnego oraz Hibernate, z czego w moim odczuciu podręcznik wywiązał się przyzwoicie, zabrakło mi w nim akcji - nie tej tytułowej, w książce możemy znaleźć m.in. rozdział
    pt. "Tworzenie aplikacji stosujących Hibernate", ale odrobiny dynamizmu, który powinien przykuć uwagę czytelnika nieco skuteczniej oraz wzbudzić w nim chęć do dalszej lektury.

    Pomijając już fakt, że książkę czytałem w ślimaczym tempie, chciałbym wspomnieć o pewnej istotnej obserwacji. Podczas lektury podręcznika w mojej głowie zrodziło się wiele pytań i wątpliwości względem przyswajanej wiedzy, odpowiedzi na pytania w większości przypadków pojawiały się podczas dalszej lektury danego rozdziału, aczkolwiek na część z nich albo nie uzyskałem odpowiedzi albo po prostu o nich zapomniałem.

    Biorąc pod uwagę powyższy fakt, wysnuć mogę następujący wniosek - sama lektura "Hibernate w akcji" nie sprawi, że posiądziemy umiejętność najefektywniejszego wykorzystania Hibernate w naszych projektach, zdobędziemy natomiast wiedzę, która pozwoli nam
    w pełni świadomie podejmować decyzje związane z wykorzystaniem odwzorowania obiektowo-relacyjnego w praktyce.

    sobota, 17 lipca 2010

    Moje pierwsze kroki z Hibernate oraz PostgreSQL

    Zastosowanie odwzorowania obiektowo-relacyjnego w przykładowych projektach planowałem poprzedzić zdobyciem wiedzy teoretycznej
    z zakresu tematów ORM oraz Hibernate. Biorąc pod uwagę fakt,
    iż do ukończenia lektury podręcznika "Hibernate w akcji" pozostało naprawdę niewiele, postanowiłem wykonać swój pierwszy krok w kierunku praktycznego wykorzystania Hibernate.

    Przyznam się, że Jacek Laskowski publikując swój nowy artykuł pt. "Tworzenie samodzielnej aplikacji z Hibernate w NetBeans IDE 6.9" trafił dokładnie w moje potrzeby - dzięki Jacek. Nie spodziewałem się, że przy pomocy NetBeans można tak sprawnie (i szybko!) stworzyć przykładowy projekt z Hibernate.

    Pierwsza myśl po poprawnym uruchomieniu aplikacji była następująca: "Chcę zobaczyć zawartość tabeli klient". W przykładzie została wykorzystana domyślna dla NetBeans IDE 6.9 baza danych Apache Derby, zatem przeszedłem do widoku Services, odszukałem tabelę klient oraz niejawnie wykonałem dla niej zapytanie select * from APP.KLIENT poprzez wybranie "View Data..." z menu tabeli.


    Kolejna myśl dotyczyła uruchomienia aplikacji w oparciu o bazę danych PostgreSQL. Czynności mające na celu realizację tego zadania opisałem poniżej.

    Instalacja serwera bazy danych PostgreSQL nie stanowi jakiegokolwiek problemu, podczas jej trwania użytkownik proszony jest o ustalenie hasła dostępowego do konta postgres pełniącego rolę administratora.

    Wszystkie wymagane informacje do stworzenia nowego pliku konfiguracyjnego Hibernate uzyskamy uruchamiając aplikację pgAdmin III. Dodatkowo za jej pomocą jesteśmy w stanie np. utworzyć nową bazę danych oraz zdefiniować nowe role (konta użytkowników). Na potrzeby przykładowej aplikacji możemy wykorzystać istniejącą już bazę danych oraz zdefiniowaną rolę
    (dla obu przypadków nazwą jest postgres).

    Mając na celu stworzenie nowego dokumentu hibernate.cfg.xml (aktualny kasujemy) posłużymy się kreatorem pliku konfiguracyjnego dla Hibernate w NetBeans (File -> New File : kategoria Hibernate,
    typ pliku Hibernate Configuration Wizard).

    W trzecim kroku kreatora pt. "Select Data Source" jako Database Connection wybieramy "New Database Connection...". Następnie definiujemy nowe połączenie z bazą danych: wybieramy odpowiedni sterownik oraz podajemy wymagane informacje.




    Do utworzonego pliku hibernate.cfg.xml pomiędzy <session-factory>
    a </session-factory> dodajemy następujące linijki:

    <property name="current_session_context_class">
    thread</property>
    <property name="show_sql">true</property>
    <property name="hbm2ddl.auto">update</property>
    <mapping resource="hibernate.hbm.xml"/>
    Aplikacja jest gotowa. Uruchamiamy ją kilka razy, następnie
    łączymy się z bazą danych za pomocą pgAdmin III, odszukujemy oraz zaznaczamy tabelę klient.


    Ctrl + d wyświetli pełną zawartość tabeli.


    Jak widzimy informacje przekazane za pomocą przykładowej aplikacji zostały utrwalone w bazie danych PostgreSQL.

    środa, 30 czerwca 2010

    Hibernate oraz Java 4-Ever

    Zdobywanie wiedzy w okresie letnim nie jest zadaniem prostym - słoneczna pogoda wygrywa dzień po dniu z moją chęcią do dalszej lektury książki "Hibernate w akcji" (Christian Bauer, Gavin King). Czysto teoretyczne rozpoznanie tematu jakim jest odwzorowanie obiektowo-relacyjne (ORM) zatrzymało się w moim przypadku na czwartym rozdziale pt. "Stosowanie obiektów trwałych".

    Zdobyte dotychczas wiadomości utrwaliłem w następujący sposób: zapoznałem się z oficjalną dokumentacją Hibernate oraz przeczytałem artykuł Jacka Laskowskiego pt. Hibernate - tniemy koszty dostępu do danych relacyjnych.

    Do ukończenia lektury pozostało sześć rozdziałów oraz kilka dodatków, zatem już jutro ponownie sięgam po książkę licząc
    na zwielokrotnienie tempa pozyskiwania istotnych informacji.

    Nie sposób również nie wspomnieć o bijącym ostatnio rekordy popularności zwiastunie "Java 4-Ever". Obserwatorzy kanału #java
    na blip.pl chyba znają już na pamięć każde wypowiadane w nim zdanie - komentować tego zjawiska nie będę, wszyscy odczuliśmy popularność zwiastuna na własnej skórze.

    poniedziałek, 14 czerwca 2010

    Wrażenia po lekturze książki "Czysty kod. Podręcznik dobrego programisty"

    Rozpoczynając lekturę "Podręcznika dobrego programisty" poinformowany zostałem,
    że "Nauka pisania czystego kodu jest ciężką pracą" - po takim wstępie spodziewałem się czegoś więcej niż wspomnianego przez autora lejącego się potu.




    "Czysty kod" rozczarował mnie pod tym względem - całe szczęście,
    że pozytywnie. Lektura nie była na tyle ciężka, abym mógł poczuć potrzebę odłożenia książki "na później", nawet spore wymogi czasowe jak na niewiele ponad 400 stron nie zdołały mnie skutecznie zniechęcić.

    Po rozdziale 14 pt. "Udane oczyszczanie kodu" liczącym 53 strony spodziewałem się najgorszego, wiele linijek kodu a jednak z lekturą poradziłem sobie całkiem sprawnie.

    Dopiero rozdział 16 pt. "Przebudowa klasy SerialDate" uzmysłowił mi, co miał na myśli autor pisząc "Musisz się przy tym spocić". Nieustanne śledzenie zmian w kodzie klasy z Dodatku B oraz sprawdzanie
    w rozdziale 17 pt. "Zapachy kodu i heurystyki" znaczenia tajemniczych [G6] lub [N2] może zmęczyć nawet najbardziej wytrwałego czytelnika.

    Lektura tego rozdziału przypadła mi w całości na podróż do rodzinnego Zgorzelca. Ciekawe co myśleli pasażerowie siedzący obok, widząc mnie energicznie "skaczącego" po rozdziałach przez ponad dwie godziny jazdy. Widok musiał być obłędny. Ktoś mógłby nawet pomyśleć, że w takich warunkach (podróż autobusem nie rozpieszcza czytelników), tak wymagającego rozdziału po prostu nie da się czytać - ja natomiast udowodniłem, że jest to możliwe! :)

    Pomimo faktu, iż nie pamiętam już szczegółowych modyfikacji kodu oraz celu ich wprowadzenia, mogę z pełną świadomością powiedzieć, że czas poświęcony na ten rozdział nie był stracony. Sądzę,
    że intensywne śledzenie postępujących zmian w kodzie miało za zadanie uzmysłowić czytelnikowi jak istotny jest proces pielęgnacji, pokazać jak bardzo można zmodyfikować czysty kod, tak aby był jeszcze czyściejszy oraz w jaki sposób tego dokonać.

    Wpływ "Czystego kodu" na moje nawyki programistyczne dostrzegam już teraz, a "ciężka praca" o której wspominał Robert C. Martin
    z pewnością pozwoli wraz z biegiem czasu, przekuć zdobytą wiedzę
    w umiejętności.

    sobota, 12 czerwca 2010

    Oficjalne zakończenie praktyk w IBM Poland

    Wraz z początkiem marca informowałem za pośrednictwem bloga
    o moim udziale w programie praktyk edukacyjnych organizowanym przez firmę IBM. Przez trzy miesiące poznawałem system Kerberos, produkt IBM WebSphere Application Server V7 oraz technologię Web Services.

    Oficjalne zakończenie pracy nad projektem odbyło się wczoraj
    w siedzibie IBM w Warszawie. Podczas spotkania mieliśmy możliwość wysłuchać kilkunastu prezentacji przygotowanych przez studentów
    z Wrocławia, Warszawy oraz Zielonej Góry.

    Nie brakowało technicznych tematów, odrobiny humoru oraz interesujących spostrzeżeń odnośnie praktyk. Żałuję, że nie mogłem zostać do samego końca - straciłem w ten sposób (jeżeli dobrze liczę) dwie prezentacje kolegów z Warszawy.


    Swoje wystąpienie zapewne będę wspominać z uśmiechem na twarzy.
    O wewnętrznym spokoju podczas prezentacji mogłem zapomnieć już na jej samym początku, gdy zamiast kolejnego slajdu pojawił się czarny ekran. Sądząc po głośnych brawach oraz uśmiechach publiczności na koniec, nie wypadłem aż tak źle jak mogłem się spodziewać.


    Certyfikaty potwierdzające odbycie praktyk zostały wręczone nam przez Justynę Rachwalską, która (cytując jednego z praktykantów) "naprawdę żyje i nie jest robotem odpowiadającym na listy" :) Zabawne, że po trzech miesiącach intensywnej korespondencji pojawiły się głosy "Czy ktoś wie jak wygląda Justyna?". Przyznam się dobrowolnie, że też nie wiedziałem :) Nawet pomimo tego, że zdjęcia wszystkich pracowników były dostępne poprzez komunikator Sametime oraz BluePages.

    Sama podróż do Warszawy również była przygodą - w tym przypadku zafundowaną przez PKP. Jadąc pociągiem z Zielonej Góry do Poznania można było odnieść wrażenie, że gorzej już być nie może - pomimo godzin porannych warunki w pociągu przypominały te ze szklarni, temperatura oraz zaduch niemalże nie do zniesienia.

    Wybawieniem okazał się pociąg regionalny z Poznania do Warszawy - wygodne siedzenia oraz upragniona klimatyzacja! W takich warunkach podróż stanowiła samą przyjemność. Nie mógłbym nie wspomnieć
    o solidnym opóźnieniu, ale do tego już chyba wszyscy zdążyliśmy się przyzwyczaić.

    Chcąc wrócić do Zielonej Góry jeszcze tego samego dnia, zdecydowałem się na podróż powrotną pociągiem InterCity. Niemalże trzykrotnie większy koszt biletu upewnił mnie w przekonaniu, że tym razem nie będę miał możliwości narzekać na temperaturę oraz zaduch. Natychmiast po zajęciu swojego miejsca otrzymałem "soczek z rurką" oraz ciasteczko firmowane marką InterCity, wszystko w cenie biletu oczywiście.

    Kontrola biletów również była nietypowa, pierwszy raz spotkałem się
    z tak sympatyczną obsługą klienta - "Rybko, a gdzie masz rezerwację miejsca?". Szkoda jedynie, że klimatyzacja bardzo szybko zawiodła moje oczekiwania, dalszą podróż kontynuowaliśmy z uchylonymi oknami w całym wagonie.

    Po niemalże osiemnastu godzinach wróciłem do domu - zmęczony
    i zadowolony, że w końcu mogę położyć się w swoim łóżku.

    poniedziałek, 24 maja 2010

    Laboratorium z Remote Method Invocation

    Tematem ostatnich zajęć laboratoryjnych realizowanych w ramach przedmiotu "Programowanie współbieżne i rozproszone" był pakiet Remote Method Invocation, w skrócie RMI. Wykonane ćwiczenie miało na celu, jak czytamy w instrukcji, "zapoznanie z modelem tworzenia aplikacji rozproszonych (...)", a główny nacisk położono na "naukę abstrakcyjnego projektowania usług rozproszonych".

    Czasu na wykonanie zadania było dość sporo, ale do pracy postanowiłem zabrać się na tydzień przed ostatecznym terminem oddania projektu. "Bankomat w RMI" - tak brzmiał temat ćwiczenia, który w moim odczuciu nie najlepiej oddawał charakter realizowanego zadania, aczkolwiek przyznam, że dobrze prezentował główne założenia projektu.

    Pracę podzieliłem na trzy etapy:
    - implementację zdalnego obiektu realizującego zadeklarowane
    w interfejsie metody;
    - przygotowanie aplikacji służącej do zakładania nowych kont oraz wyświetlania o nich przydatnych informacji;
    - przygotowanie aplikacji klienckiej umożliwiającej zalogowanie się na konto w celu wykonania operacji wpłaty/wypłaty środków.

    Moim celem podczas realizacji zadania nie było zapewnienie systemowi pełnej funkcjonalności, a jedynie zademonstrowanie umiejętności sprawnego wykorzystania RMI w praktyce.

    Poniżej znajduje się opis poszczególnych części zrealizowanego projektu:

    1. Program serwera

    Jedyna kwestia na jaką chciałbym zwrócić uwagę w odniesieniu do zdalnego obiektu dotyczy udostępnianych metod. Program serwera zarządza kontami, stąd każda metoda powinna weryfikować uprawnienia użytkownika do wykonania danej czynności. Zarówno właściciel konta jak i osoba korzystająca z aplikacji umożliwiającej wgląd we wszystkie konta oraz tworzenie nowych, są poddawani uwierzytelnianiu oraz autoryzacji.

    2. Aplikacja RMI-Konta

    Poza tworzeniem nowych kont aplikacja umożliwia wyświetlenie przydatnych (zwłaszcza podczas prezentacji wykonanej pracy na laboratorium :) informacji w trzech stopniach szczegółowości :
    - identyfikatory wraz z imieniem oraz nazwiskiem właściciela konta;
    - identyfikatory wraz ze stanem konta;
    - identyfikatory wraz z imieniem i nazwiskiem właściciela konta,
    jego stan oraz lista wszystkich wykonanych operacji.



    3. Aplikacja kliencka

    Klient po zalogowaniu otrzymuje informację dotyczącą stanu swojego konta, dodatkowo zostaje poinformowany o maksymalnie pięciu ostatnio wykonanych operacjach na koncie. Po przyznaniu dostępu do konta, klient uzyskuje możliwość dokonania wpłaty lub wypłaty środków.



    Jak się dowiedziałem podczas prezentacji projektu, aby otrzymać za wykonaną pracę zadowalającą mnie ocenę, powinienem zaimplementować dodatkową funkcjonalność, mianowicie umożliwić klientowi przelanie środków na inne konto. Biorąc pod uwagę fakt,
    iż zadanie to nie stanowi jakiegokolwiek wyzwania, już dziś mogę cieszyć się zaliczeniem przedmiotu na ocenę bardzo dobrą :)

    czwartek, 13 maja 2010

    Wrażenia po lekturze książki "JUnit. Pragmatyczne testy jednostkowe w Javie"

    Od książki "JUnit. Pragmatyczne testy jednostkowe w Javie" oczekiwałem, że będzie dobrym wprowadzeniem do tematyki testów jednostkowych i nie zawiodłem się.
    Tak jak w przypadku "Pragmatycznego programisty", autorzy Andrew Hunt oraz David Thomas wykazali się umiejętnością przekazywania wiedzy w sposób lekki, przyjazny dla czytelnika.


    "JUnit. Pragmatyczne (...)" z pewnością należy do grupy książek pisanych z myślą o czytelniku. Celem autorów nie jest samo zapoznanie czytelnika z tematyką testów jednostkowych, ale i również przekonanie do słuszności ich właściwego stosowania. Bezpośrednim tego dowodem mogą być zamieszczone historie, opisujące efekty nieodpowiedniego wykorzystania testów jednostkowych lub kompletnego pominięcia ich podczas realizacji projektów.

    Nie zabrakło również sporej ilości kodu źródłowego, demonstrującego wykorzystanie JUnit podczas implementacji testów oraz rozdziałów poświęconych obiektom imitacji czy zagadnieniom projektowania.

    Podsumowując, książkę oceniam bardzo dobrze, z pewnością stanowi wartościowe wprowadzenie do tematyki testów jednostkowych.
    Z czystym sumieniem mogę polecić lekturę każdemu, mając przy tym (tak jak i autorzy w przedmowie) nadzieję, że nie będzie ostatnią na ten temat.

    piątek, 7 maja 2010

    "JUnit. Pragmatyczne testy jednostkowe w Javie" oraz "Czysty kod. Podręcznik dobrego programisty"

    Moja domowa biblioteczka jeszcze nie imponuje swoją obszernością, aczkolwiek cieszy mnie fakt, że stale się powiększa, a interesujących pozycji do przeczytania nie brakuje.

    Nowo pozyskana pozycja "JUnit. Pragmatyczne testy jednostkowe w Javie" mile zaskoczyła mnie już na samym początku - autorzy Andrew Hunt oraz David Thomas napisali również "Pragmatycznego programistę", którego miałem przyjemność przeczytać w zeszłym roku.




    Rozdziały "Wprowadzenie", "Najprostsze testy jednostkowe" oraz "Implementacja testów JUnit", z którymi zdążyłem się zapoznać, jedynie wzmogły mój apetyt na dalszą lekturę. W dodatku rozbawiła mnie przykładowa wymówka od testowania, której mógłby użyć programista, tj. "Testowanie nie należy do moich obowiązków" oraz komentarz autorów "To rzeczywiście interesujące wytłumaczenie.
    W takim razie na czym polega Twoja praca?"
    .

    Na półce czeka również kolejna nowa zdobycz, mianowicie "Czysty kod. Podręcznik dobrego programisty", którego lektury także nie mogę się doczekać. Swoimi wrażeniami po przeczytaniu książek podzielę się za pośrednictwem bloga, zachęcam również do komentowania - może jest jakaś godna uwagi pozycja, którą właśnie czytacie lub przeczytaliście?

    środa, 28 kwietnia 2010

    Przystosowywanie aplikacji klienckiej do współpracy z usługą sieciową, której lokalizacja uległa zmianie

    Modyfikacja wnętrza archiwum jar klienta usługi sieciowej może być szybkim sposobem na przystosowanie aplikacji do współpracy z usługą, której lokalizacja uległa zmianie. Klient stworzony w oparciu
    o dokument WSDL usługi działającej w obrębie serwera aplikacji GlassFish, posłuży nam przy budowie swojego odpowiednika współpracującego z identyczną usługą, uruchomioną pod WebSphere Application Server 7.

    1. Wcześniejsze wpisy bezpośrednio korespondujące z bieżącym

    Tworzenie usługi sieciowej z wykorzystaniem JAX-WS i NetBeans IDE 6.8
    Instalacja oraz uruchomienie usługi sieciowej pod WebSphere Application Server 7

    2. Tworzenie aplikacji klienckiej

    Rozpakowujemy archiwum MyWsClient.jar do folderu MyWsClient .

    Pliki wewnątrz MyWsClient/myfirstws/ nie będą nam dłużej potrzebne - usuwamy wszystkie.

    W celu wygenerowania nowej zawartości folderu myfirstws wykorzystamy narzędzie wsimport. Jeżeli dokument WSDL usługi jest aktualnie dostępny pod adresem http://localhost:9080/mywebapp/MyFirstWsService/MyFirstWsService.wsdl możemy przejść dalej,
    w przeciwnym wypadku powinniśmy najpierw uruchomić usługę.

    Domyślna lokalizacja wsimport.sh to /opt/IBM/WebSphere/AppServer/bin/ . Znajdując się wewnątrz MyWsClient wykonujemy polecenie /opt/IBM/WebSphere/AppServer/bin/wsimport.sh -verbose http://localhost:9080/mywebapp/MyFirstWsService/MyFirstWsService.wsdl .
    Pliki wygenerowane w oparciu o dokument WSDL umożliwią nam komunikację pomiędzy klientem a dostawcą usługi.

    Kolejnym krokiem jest modyfikacja zawartości folderu MyWsClient/meta-inf/. Plik jax-ws-catalog.xml
    edytujemy do postaci:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog" prefer="system">

    <system systemId="http://localhost:9080/mywebapp/MyFirstWsService/MyFirstWsService?WSDL" uri="wsdl/localhost_9080/mywebapp/MyFirstWsService/MyFirstWsService.wsdl"/>

    <system systemId="http://localhost:9080/mywebapp/MyFirstWsService/MyFirstWsService?xsd=1" uri="wsdl/localhost_9080/mywebapp/MyFirstWsService/MyFirstWsService.xsd_1.xsd"/>

    </catalog>
    Następnie nadpisujemy plik MyFirstWsService.wsdl aktualną wersją dokumentu znajdującą się pod adresem http://localhost:9080/mywebapp/MyFirstWsService/MyFirstWsService.wsdl

    Dokument WSDL wraz z pozostawionym bez zmian plikiem MyFirstWsService.xsd_1.xsd powinien znaleźć się w folderze MyWsClient/meta-inf/wsdl/localhost_9080/mywebapp/MyFirstWsService/. Po przeniesieniu dokumentów należy usunąć podfoldery localhost_30074/MyWebApplication/ .

    Wymagana jest również zmiana nazwy folderu meta-inf oraz pliku manifest.mf na odpowiednio META-INF oraz MANIFEST.MF .

    Pozostało nam jedynie podmienić w archiwum jar foldery meta-inf oraz myfirstws na ich, przygotowane przez nas odpowiedniki.

    Stworzoną aplikację uruchamiamy poleceniem
    java -jar MyWsClient.jar 15 3
    . Otrzymany wynik świadczy
    o przeprowadzeniu poprawnych modyfikacji.

    sobota, 24 kwietnia 2010

    Instalacja oraz uruchomienie usługi sieciowej pod WebSphere Application Server 7

    Uruchomienie usługi sieciowej pod WAS'em nie jest rzeczą skomplikowaną, przekonałem się o tym, wykorzystując do tego celu stworzoną wcześniej przykładową usługę (Tworzenie usługi sieciowej z wykorzystaniem JAX-WS i NetBeans IDE 6.8). Poniżej znajduje się krótki opis z serii "Zrób to sam" :)

    1. Instalacja aplikacji


    Logujemy się do konsoli administracyjnej. Z menu wybieramy Applications -> New Application . Interesuje nas tylko jeden typ aplikacji do zainstalowania: New Enterprise Application.

    Podajemy ścieżkę do archiwum war zawierającego usługę (Local file system -> Browse) . Następnie wciskamy przycisk "Next".

    Opcja instalacji "na skróty" (Fast Path) w zupełności nas zadowala. Przechodzimy dalej wciskając "Next".

    Przed nami pięć kroków umożliwiających skonfigurowanie instalacji.


    W kroku pierwszym możemy określić m.in. miejsce docelowe instalowanej aplikacji, jej nazwę, prawa dostępu do plików oraz wersję (Build ID). Jeżeli chcemy pozostawić wartości domyślne, możemy śmiało przejść dalej.

    Krok drugi i trzeci również możemy pominąć, domyślne wartości pozwolą nam uruchomić usługę na naszym serwerze aplikacji.

    W kroku czwartym określamy context root dla aplikacji. Podając /mywebapp sprawimy, że wszystkie wywołania dla http://localhost:9080/mywebapp oraz http://localhost:9080/mywebapp/* będą kierowane do instalowanej usługi (o ile nie zdefiniujemy później bardziej szczegółowego context root dla innej usługi np. /mywebapp/service).

    Ostatni krok to podsumowanie dokonanej konfiguracji, wciskamy przycisk "Finish". Jeżeli wszystko zrobiliśmy poprawnie, powinien pojawić się ekran potwierdzający pomyślną instalację. Nie zapominamy zapisać dokonanych zmian, "Save".



    2. Uruchomienie usługi

    W konsoli administracyjnej przechodzimy do Applications -> Application types -> WebSphere enterprise applications . Zaznaczamy naszą aplikację oraz wciskamy przycisk "Start".


    Otrzymany komunikat świadczy o poprawnym uruchomieniu aplikacji.


    Dokument WSDL usługi możemy znaleźć pod adresem http://localhost:9080/mywebapp/MyFirstWsService/MyFirstWsService.wsdl . Plik ten wykorzystamy podczas tworzenia aplikacji klienckiej, bazującej na tej stworzonej wcześniej przy pomocy środowiska NetBeans 6.8 . Archiwum jar klienta będziemy modyfikować własnoręcznie (bez wykorzystania IDE), ale o tym już następnym razem.

    piątek, 23 kwietnia 2010

    Tworzenie usługi sieciowej z wykorzystaniem JAX-WS i NetBeans IDE 6.8

    Jak już wcześniej napisałem, czytanie wszelkiej maści dokumentacji dotyczących technologii Web Services umilało mi wolny czas przez ostatni tydzień. Biorąc pod uwagę, że nie samą teorią człowiek żyje, postanowiłem przejść do praktyki. Stworzenie przy pomocy JAX-WS przykładowej usługi sieciowej oraz jej klienta okazało się być bardzo proste. Wykorzystując środowisko programistyczne NetBeans 6.8 możemy napisać nasz własny Web Service w szybki i przejrzysty sposób.

    1. Tworzenie przykładowej usługi

    Pierwszym krokiem jest stworzenie nowego projektu: File -> New Project . Wybieramy kategorię Java Web oraz typ projektu Web Application. Przechodzimy dalej wciskając "Next". Jako Project Name podajemy MyWebApplication oraz klikamy myszką "Next", "Next" i "Finish".

    Do stworzonego projektu dodajemy nowy plik: File -> New File . Wybieramy kategorię Web Services oraz typ pliku Web Service. Zatwierdzamy poprzez "Next". Jako Web Service Name podajemy MyFirstWs, w pole Package wpisujemy myfirstws. "Finish".

    Edytujemy kod powstałego pliku MyFirstWs.java :

    package myfirstws;

    import javax.jws.WebService;

    @WebService()
    public class MyFirstWs {
    public int func(int a, int b) {
    return a * b;
    }
    }
    Stworzoną usługę uruchamiamy poprzez Run -> Run Main Project . Jeżeli zrobiliśmy wszystko jak należy powinniśmy otrzymać komunikat:
    "(...)
    Personal GlassFish v3 Domain is running.
    In-place deployment at D:\MyWebApplication\build\web
    Initializing...
    run-deploy:
    Browsing: http://localhost:30074/MyWebApplication/
    run-display-browser:
    run:
    BUILD SUCCESSFUL (total time: 34 seconds)"


    2. Tworzenie aplikacji klienckiej

    Ponownie rozpoczynamy od stworzenia nowego projektu, tym razem jednak wybieramy kategorię Java oraz typ projektu Java Application. Jako Project Name podajemy MyWsClient oraz odznaczamy pole Create Main Class.

    Do stworzonego projektu dodajemy nowy plik wybierając kategorię Web Services oraz typ Web Service Client. Następnie wskazujemy ścieżkę do pliku WSDL uruchomionej usługi (WSDL URL): http://localhost:30074/MyWebApplication/MyFirstWsService?WSDL oraz wpisujemy w pole Package: myfirstws (tak jak poprzednio).

    Jeżeli ukazał się nam komunikat "(...) BUILD SUCCESSFUL (total time: 2 seconds)" możemy przejść dalej. Wygenerowane pliki umożliwią nam połączenie się z usługą poprzez aplikację kliencką.

    Do projektu dodajemy nową klasę (kategoria Java, typ Java Class) nadając jej nazwę MyFirstWsClient oraz wpisując w pole Package: mywsclient . Edytujemy kod powstałego pliku MyFirstWsClient.java :

    package mywsclient;

    import myfirstws.MyFirstWs;
    import myfirstws.MyFirstWsService;

    public class MyFirstWsClient {
    public static void main(String[] args) {
    try {
    MyFirstWsService service = new MyFirstWsService();
    MyFirstWs myws = service.getMyFirstWsPort();
    if(args.length >= 2) {
    int a = Integer.parseInt(args[0]);
    int b = Integer.parseInt(args[1]);
    System.out.println(a + " * " + b + " = " + myws.func(a, b));
    }
    else {
    System.out.println("java -jar MyWsClient.jar integer1 integer2");
    }
    }
    catch(Exception e) {
    e.printStackTrace();
    }
    }
    }
    Archiwum jar z aplikacją tworzymy poprzez Run -> Clean and Build Main Project (jeżeli jest głównym projektem) lub Clean and Build wybrane na projekcie. Jeżeli zobaczyliśmy komunikat "(...) BUILD SUCCESSFUL (...)", w podfolderze dist projektu znajdziemy plik jar z gotową do uruchomienia aplikacją kliencką.

    Kolejny wpis będzie dotyczył uruchamiania usługi sieciowej pod IBM WebSphere Application Server 7.

    poniedziałek, 19 kwietnia 2010

    Integracja systemu Kerberos z WebSphere Application Server 7

    Poznawanie technologii Web Services zapewniało mi niemałą rozrywkę przez ostatnich kilka dni, a to dopiero początek mojej przygody z SOAP, WSDL i JAX-WS. Temat pochłonął mnie tak bardzo, że zupełnie zapomniałem opisać w jaki sposób dokonałem integracji poprawnie skonfigurowanego systemu Kerberos z WAS'em. Jak wspomniałem konfigurację Kerberos'a mam już za sobą, stąd wykonanie poniższych czynności było jedynie formalnością, dopełnieniem wykonanej wcześniej pracy.

    Po zalogowaniu się do konsoli administracyjnej WAS'a przechodzimy do Security -> Global Security -> Kerberos configuration.


    Biorąc pod uwagę, że w bazie danych systemu Kerberos istnieje principal WAS/linux-fi5z.site@SITE, który został dodatkowo wyeksportowany do pliku kt.keytab, nasz realm nosi nazwę SITE
    a plik konfiguracyjny Kerberos'a znajduje się w /etc pod nazwą krb5.conf, konfiguracja w konsoli administracyjnej powinna wyglądać następująco:


    Klikamy myszką "OK" oraz zapisujemy wprowadzone dane "Save".
    Od tej chwili domyślnym mechanizmem autoryzacji dla WAS'a jest Kerberos. Należy o tym pamiętać przy kolejnej próbie zalogowania się do konsoli administracyjnej. Komunikat "Login failed. Check the user ID and password and try again." z pewnością pojawi się jeżeli zapomnieliśmy dodać do kerberosowej bazy danych odpowiedniego wpisu.

    Dla konta administratora o nazwie admin wymagany principal wprowadzamy następująco:


    Podane hasło należy zapamiętać, będziemy używać go podczas logowania się do konsoli administracyjnej.

    wtorek, 13 kwietnia 2010

    Troubleshooting - ciąg dalszy

    Błędne było przyjęte założenie, że źródłem problemów podczas prób wykorzystania systemu Kerberos jako mechanizmu autoryzacji jest WAS. Pomysły jak rozwiązać zagadkę kończyły się wraz z upływem czasu - może dlatego coś mnie podkusiło aby jeszcze raz zainteresować się plikami Kerberos'a.

    Po chwili zastanowienia wpadłem na pomysł aby jeszcze raz wyeksportować principal "WAS/linux-fi5z.site@SITE" do pliku keytab, który miał posłużyć WAS'owi. Użyłem w tym celu kadmin.local wydając za jego pomocą polecenie
    ktadd -k /usr/local/var/krb5kdc/kt.keytab WAS/linux-fi5z.site@SITE.
    Chcąc sprawdzić czy faktycznie plik kt.keytab zawiera pożądane pola posłużyłem się narzędziem klist.


    Jak można zauważyć powyżej, wszystko się zgadza. Użyłem więc tego pliku przy konfiguracji - tym razem obyło się bez problemu.

    Jak się okazało kością niezgody był tutaj plik keytab, do którego ścieżkę podawałem w konsoli administracyjnej WAS'a. Niedopatrzenie kosztowało mnie sporo czasu, lekcja nie poszła jednak na marne - teraz z pewnością będę zwracać większą uwagę na zawartość plików, których używam korzystając z zewnętrznych aplikacji.

    WAS7 Troubleshooting: Tracing CreateKrbAuthMechanism

    Od kilku dni próbuję wykorzystać system Kerberos jako mechanizm autoryzacji w IBM WebSphere Application Server 7 . Wszelkie próby skonfigurowania WAS'a tak aby współpracował z Kerberosem kończą się niepowodzeniem. Za każdym razem pojawia się komunikat:

    "org.ietf.jgss.GSSException, major code: 13, minor code: 0 major string: Invalid credentials minor string: Cannot get credential from JAAS Subject for principal: WAS/linux-fi5z.site@SITE".

    Zakładam, że konfiguracja systemu Kerberos jest poprawna i "wina" leży w tym przypadku po stronie WAS'a. Podążając dalej tym tropem postanowiłem sprawdzić dokładniej jak przebiega proces tworzenia konfiguracji. Opis jak to zrobić zamieściłem poniżej.

    1. Logujemy się do konsoli administracyjnej, w menu wybieramy Troubleshooting -> Logs and trace. Następnie wybieramy server1.


    2. Wybieramy Diagnostic Trace.


    3. W tym miejscu możemy dokładnie określić plik wyjściowy dla danych. Przechodzimy do Change Log Detail Levels.


    4. Następnie mamy możliwość sprecyzowania, które komponenty lub grupy komponentów nas interesują. CreateKrbAuthMechanism odnajdziemy w Groups. Klikamy myszką na znak "+" przy nazwie listy "All Groups" w celu jej rozwinięcia.


    5. Klikamy myszką na odnaleziony na liście CreateKrbAuthMechanism. Z menu wybieramy Message and Trace Levels -> finest.


    6. Klikamy myszką na przycisk "OK". Następnie potwierdzamy operację zapisu - "Save".


    7. Domyślna lokalizacja pliku trace.log to /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/server1/. Tam odnajdziemy uzyskane informacje.

    piątek, 9 kwietnia 2010

    Instalacja Robocode

    Zaplanowane w ramach poniedziałkowych zajęć z PWiR zmagania czołgów zbliżają się wielkimi krokami. Czasu pozostało niewiele dlatego zabieram się do pracy już teraz. Poza "buszowaniem" na stronach RoboWiki i poznawaniem opracowanych strategi walki udało mi się zainstalować najnowszą wersję Robocode oraz przeprowadzić kilka walk pomiędzy przykładowymi robotami.

    Chcąc rozpocząć przygodę z Robocode warto upewnić się, że system posiada zainstalowany Java Development Kit.

    Wymagane jest również dodanie do zmiennej środowiskowej Path pełnej ścieżki do java.exe. W moim przypadku pod win7 polecenie realizujące daną czynność wyglądało następująco:
    set Path=%Path%;C:\Program Files (x86)\Java\jdk1.6.0_16\bin\ . Należy jednak pamiętać, że użycie narzędzia set nie spowoduje trwałego dodania ścieżki do zmiennej Path.
    W celu zaktualizowania zmiennej na stałe możemy posłużyć się narzędziem setx, wydając polecenie:
    setx Path "%Path%;C:\Program Files (x86)\Java\jdk1.6.0_16\bin\" .

    Pobrane archiwum jar robocode-1.7.2.0-Beta-2-setup.jar instalujemy w systemie poprzez wydanie polecenia java -jar robocode-1.7.2.0-Beta-2-setup.jar . Na pulpicie powinien znaleźć się skrót do aplikacji Robocode.

    Ciekawostką jest fakt, iż wykonanie powyższych czynności zmieniło
    u mnie domyślny rozmiar okna i czcionki dla konsoli, o czym przekonałem się uruchamiając cmd przy okazji ponownego zalogowania do systemu.

    środa, 7 kwietnia 2010

    IBM Update Installer for WebSphere Software

    Ponieważ podstawowa instalacja IBM WebSphere Application Server 7 nie wspiera systemu Kerberos jako mechanizmu autoryzacji ("This function is currently disabled") postanowiłem uaktualnić oprogramowanie do nowszej wersji. Wykorzystałem do tego celu narzędzie IBM Update Installer for WebSphere Software. Poniżej znajduje się opis czynności wykonanych przy realizacji tego zadania.

    1. Pliki do pobrania

    IBM Update Installer V7.0.0.9 for WebSphere Software for Linux: link
    WebSphere Application Server V7.0 Fix Pack 7 for Linux: link
    Java SDK 1.6 SR6 Cumulative Fix for WebSphere Application Server: link

    2. Instalacja

    Znajdując się wewnątrz rozpakowanego archwium narzędzia IBM Update Installer ( w moim przypadku wewnątrz 7.0.0.9-WS-UPDI-LinuxIA32/UpdateInstaller/ ) wydajemy polecenie install.
    Po przeprowadzonej pomyślnie instalacji, automatycznie uruchomione zostanie narzędzie umożliwiające wskazanie ścieżki do plików WAS Fix Pack 7 oraz Java SDK 1.6 SR6 Cumulative Fix . Jak widać poniżej oba pliki umieściłem w /root.

    Jeżeli wskazana ścieżka do plików jest poprawna program automatycznie odszuka gotowe do instalacji uaktualnienia.

    Ostatnim krokiem jest uruchomienie procesu aktualizacji, którego poprawne ukończenie zaowocuje w pełni działającym WAS'em w wersji 7.0.0.7 .

    wtorek, 30 marca 2010

    Programowanie współbieżne - ciąg dalszy

    Kolejnym zadaniem do zrealizowania w ramach przedmiotu "Programowanie współbieżne i rozproszone" było napisanie aplikacji wielowątkowej synchronizującej pracę barmana obsługującego klientów przy barze. Aplikacja powinna posiadać interfejs graficzny w celu wprowadzenia ilości stołków i klientów oraz wizualizacji jego działania. Realizacja zadania trwała dwa tygodnie dlatego pracę rozłożyłem na dwa etapy: tworzenie GUI oraz dobudowywanie funkcjonalności. Wykonane ćwiczenie zostało ocenione na ocenę bardzo dobrą a wynik pracy (z punktu widzenia użytkownika) można zobaczyć poniżej.

    Synchronizacja wątków-klientów z wątkiem odpowiedzialnym za wizualizację została przeprowadzona poprzez połączenie klasy CountDownLatch z semaforami. Wywołanie metody await() klasy CountDownLatch zostało umieszczone przed kodem odpowiedzialnym za wyświetlenie aktualnego stanu stołków w barze. Kazdy klient po pojedyńczym wykonaniu pętli (określeniu swojego stanu, np. pije piwo lub odszedł od baru) wykonuje metodę countDown() (CountDownLatch) i acquire() (Semaphore). Metoda await() czeka tak długo aż wszyscy klienci określą swój stan, po czym w następnej kolejności wyświetlona na ekranie zostaje aktualna sytuacja mająca miejsce w barze. Przy kolejnym wykonaniu pętli obsługującej wizualizację wszystkie wątki-klienci dostają pozwolenie na dalsze działanie za pomocą metody release() (Semaphore). Funkcja barmana została zrealizowana poprzez metodę synchronizowaną zwracającą wartość logiczną - true jeżeli barman zamierza obsłużyć danego klienta oraz false w przeciwnym przypadku. Do metod synchronizowanych zalicza się również próba uzyskania miejsca przy barze, która w przypadku zajęcia stołka zwraca jego numer.

    Osoby zainteresowane poznaniem większej ilości szczegółów lub porównaniem kodu powstałych aplikacji zachęcam do rozmowy - nawet podczas przerwy między zajęciami na uczelni.

    piątek, 26 marca 2010

    Instalacja i konfiguracja systemu Kerberos

    Zaczynając swoją przygodę z oprogramowaniem Kerberos 5 Release 1.8 nie rozstawałem się z dokumentacją nawet na chwilę. Ku mojemu zdziwieniu, już przy pierwszej napotkanej przeszkodzie okazało się, że wszelkie zgromadzone przeze mnie informacje sprawiają wrażenie niewystarczających do rozwiązania problemu. Zanim jednak przedstawię więcej szczegółów na ten temat chciałbym opisać krok po kroku czynności niezbędne do wykonania przy instalacji i konfiguracji systemu kerberos.

    1. Instalacja

    Źródła do pobrania: krb-1.8-signed

    Przed przystąpieniem do instalacji należy upewnić się, że system zawiera kompilator gcc oraz narzędzie yacc, co można sprawdzić poleceniem which, które zwraca pełną ścieżkę do programu (np. which yacc). U mnie na SUSE Enterprise Server 11 domyślnie zainstalowane oprogramowanie nie zawierało ani jednego ani drugiego, dlatego zmuszony byłem uzupełnić system o paczki rpm:
    gcc oraz bison (które przeważnie można znaleźć na dvd z linuxem).

    Po rozpakowaniu archiwum ze źródłami systemu kerberos powinniśmy przejść do wnętrza folderu krb5-1.8/src/ oraz wykonać następujące komendy:
    ./configure
    make
    make check (jeżeli chcemy przetestować skompilowany system)
    make install

    2. Konfiguracja

    Przykładowa zawartość pliku /etc/krb5.conf dla hosta o nazwie linux-fi5z znajdującego się w domenie site wygląda następująco:


    Realm wg obowiązującej konwencji powinien nosić taką samą nazwę jak domena i składać się wyłącznie z wielkich liter. Jak można zauważyć usługa Key Distribution Center oraz serwer administratora znajdują się pod adresem linux-fi5z.site a ich pliki log mieszczą się w /var/log/krb5/ .

    Przykładowy plik konfiguracyjny usługi KDC /usr/local/var/krb5kdc/kdc.conf :


    Tutaj staramy się nie zmieniać zbyt wiele bez wyraźnej potrzeby, pozostawiamy większość domyślnych wartości.

    Informację o usługach kerberosa działających na danych portach powinniśmy umieścić w pliku /etc/services dodając do niego poniższe linie:


    Kolejnym krokiem jest stworzenie bazy danych dla usługi KDC za pomocą polecenia /usr/local/sbin/kdb5_util create -r SITE -s

    Dodawać administratorów będziemy za pomocą narzędzia /usr/local/sbin/kadmin.local . Polecenie mające na celu dodanie uzytkownika root do grupy administratorów wyglądać będzie następująco addprinc root/admin

    Natomiast dodanie użytkownika, który będzie korzystać z usług za pomocą systemu kerberos przeprowadzamy poleceniem addprinc user_name

    Dla nowo utworzonych użytkowników powinniśmy stworzyć listę uprawnień /usr/local/var/krb5kdc/kadm5.acl , w której na potrzeby przykładu nadamy każdemu administratorowi wszelkie dostępne uprawnienia: */admin@SITE *

    Utworzenie pliku keytab umożliwi demonowi kadmind dekodowanie biletów Kerberosa w celu przyznania lub nie dostępu do bazy danych. Po uruchomieniu narzędzia /usr/local/sbin/kadmin.local wydajemy polecenie ktadd -k /usr/local/var/krb5kdc/kadmin5.keytab kadmin/admin kadmin/changepw

    Po wykonaniu podstawowej konfiguracji systemu Kerberos możemy uruchomić usługi krb5kdc i kadmind (/usr/local/sbin/).

    3. Napotkana przeszkoda

    Chcąc sprawdzić czy system Kerberos działa poprawnie postanowiłem skorzystać z dołączonych przykładowych aplikacji. W tym celu dodałem do bazy danych pozycję sample/linux-fi5z.site@SITE oraz linijkę sample 13135/tcp do pliku /etc/services . Następnie uruchomiłem przykładowy serwer komendą sserver -p 13135 -S /usr/local/var/krb5kdc/kt.keytab .
    Po uzyskaniu za pomocą kinit biletu TGT umożliwiającego dalsze działania postanowiłem połączyć się z serwerem komendą sclient linux-fi5z . Jak można zauważyć poniżej test zakończył się niepowodzeniem.


    "Wrong principal in request" - nie jestem w stanie odgadnąć, co jest przyczyną błędu, za wszelkie pomysły na rozwiązanie zagadki będę bardzo wdzięczny.

    sobota, 20 marca 2010

    Podsumowanie ubiegłego tygodnia

    Wreszcie nadszedł upragniony weekend! Teoretycznie powinienem przewracać się z boku na bok ciesząc się chwilą odpoczynku, ale dobrze wiem, że tym razem nie będę leniuchować. Mam zamiar opracować interfejs graficzny do kolejnego z ćwiczeń dotyczących wielowątkowości oraz bliżej zapoznać się z MIT Kerberos 5 Release 1.8.

    Całe szczęście, że ubiegły tydzień mogę zaliczyć do udanych - utwierdziło mnie w tym przekonaniu przeprowadzone z Jackiem Laskowskim podsumowanie wykonanej pracy. Instalacja oprogramowania WebSphere Application Server 7 była równie intuicyjna co instalacja systemu SUSE Linux Enterprise Server 11, aczkolwiek nie obyło się bez drobnych przeszkód. Z pierwszą
    - was7 nie rozpoznał SUSE, jako wspieranego systemu operacyjnego - poradziłem sobie bez problemu. Przed przystąpieniem do instalacji zapoznałem się z dokumentacją produktu stąd wiedziałem,
    że wystarczy jedynie podmienić plik WAS/was.primary.pak/maintenance.xml na nowszą wersję, w tym przypadku dla architektury IA32. Plik służący do nadpisania maintenance.xml można pobrać tutaj.

    Mniej zrozumiałym problemem okazał się być komunikat narzędzia IVT, uruchomionego przeze mnie po instalacji w celu zweryfikowania czy wszystko przebiegło zgodnie z planem. IVT nieczule poinformował mnie, że "IVTL0170I: Cannot find profile home. IVT cannot continue.". Dość mocno się zdziwiłem - przecież stworzyłem profil podczas instalacji, która zakończyła się sukcesem. Próba dodania profilu za pomocą Profile Management Tool nie przyniosła zamierzonego efektu. Rozwiązania problemu szukałem w InfoCenter dla was7, nie odnalazłem jednak żadnej istotnej z mojego punktu widzenia informacji.

    Błędem, jaki popełniłem było szukanie odpowiedzi na nurtujące mnie pytanie z dala od źródła - wszystko, czego potrzebowałem znajdowało się w pliku /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/wsadmin.traceout zawierającym informację o zaistniałym wyjątku (java.net.UnknownHostException). Okazało się, że przyczyną kłopotów był brakujący wpis w /etc/hosts, którego brak istnienia zawdzięczam narzędziu YaST (oraz poniekąd swojej spostrzegawczości :), które domyślnie odznaczyło polecenie "Write Hostname to /etc/hosts" przy konfiguracji ustawień sieciowych.

    Poprawnie utworzony profil dał mi możliwość uruchomienia przykładowej witryny sklepu internetowego "Plants by WebSphere"
    co ostatecznie upewniło mnie, że tym razem wszystkie czynności zostały wykonane należycie.

    Praca w korporacji ma swoje mocne dobre strony. Na początku tygodnia zwróciłem się z prośbą o przydział komputera z większą ilością pamięci RAM na pokładzie a już w piątek podczas kilkuminutowej rozmowy telefonicznej zostałem zapewniony,
    że maszyna zostanie wysłana z Warszawy w poniedziałek. Podoba mi się podejście, które można krótko opisać w następujący sposób: "Damy Ci wszystko, czego potrzebujesz tylko przekonaj nas, że to,
    co otrzymamy w zamian jest warte tego, o co prosisz"
    . Gorzej, gdy nie wiesz, w jaki sposób uzasadnić swoje potrzeby, tutaj nie ma zmiłuj się - liczą się konkrety. Sprzęt to podstawa, ale jeszcze większe znaczenie mają narzędzia, którymi IBM nas obdarowuje. Łatwość komunikacji i dostęp do ogromnej bazy informacji
    to z pewnością jedne z głównych zalet, które zrobiły na mnie wrażenie. Dostrzegam, że wraz z czasem coraz lepiej wykorzystuję dane mi narzędzia, co ma bezpośrednie przełożenie na fakt, iż coraz lepiej wykonuję swoją pracę.

    wtorek, 16 marca 2010

    Programowanie współbieżne

    Poniedziałkowe laboratorium z przedmiotu "Programowanie współbieżne i rozproszone" zawsze zostawia w mojej głowie pewien mętlik. Zazwyczaj staram się wykonać jak najwięcej w czasie trwania zajęć, aby mieć mniej pracy w domu, fakt, iż jest to ostatnie laboratorium w danym dniu sprawia, że jedyną rzeczą na jakiej potrafię się skupić, jest myśl o powrocie do domowego zacisza. Ta czasowa nieprzydatność do pracy sprawia, że o wiele trudniej jest mi wpaść na prawidłowe rozwiązanie postawionego zadania, choć po dłuższej chwili namysłu okazuje się ono być całkiem banalne. Sytuacja zazwyczaj komplikuje się, gdy w głowie zaczynają pojawiać się dziesiątki pomysłów, a nie mam pewności, który jest tym właściwym.

    Zabawne może wydawać się, że nie tylko ja mam wspomniany mętlik w głowie - cała grupa pozostaje z pracą do wykonania w domu. Co więcej, jeszcze ciekawiej robi się, gdy niejasności pojawiają się tuż przed terminem oddania pracy, a treść zadania mimo swojej prostoty opisu dopuszcza pozornie mnogość interpretacji. Doskonale zdaję sobie sprawę z faktu, iż sam proces planowania trwa znacznie dłużej niż kodowanie, dlatego zawsze próbuję zrobić małą burzę mózgów, w celu wyłonienia kilku najlepszych koncepcji oraz odrzucenia tych całkiem skrajnych, ale po chwili rozmowy odzywa się zmęczenie spowodowane niewyspaniem i wszystkie chęci zgłębienia tematu wnet gdzieś znikają. Wychodząc z założenia, że w programowaniu tak jak w życiu, nie zawsze liczy się fakt osiągnięcia celu, ale styl w jakim się tego dokonało, na weekend ponownie podchodzę do zadania tym razem wypoczęty i z otwartym umysłem.

    Wyżej opisana historia powtarza się, co tydzień i wiem, że nie tylko ja zostawiam sobie pracę na jego koniec. Dla osób, które mimo szczerych chęci nie znalazły jednak czasu na dopracowanie swojego kodu, zamieszczam krótki opis moich pomysłów na realizację dwóch ostatnich ćwiczeń laboratoryjnych. Zaznaczam, że programy powstałe na ich bazie, zostały ocenione na ocenę bardzo dobrą, co świadczy o fakcie, iż koncepcja i wykonanie są co najmniej poprawne.

    Pozornie skomplikowane zadanie, które byliśmy zobligowani wykonać na pierwszym laboratorium dotyczącym współbieżności, polegało na odwzorowaniu sytuacji mającej miejsce na parkingu. Samo rozwiązanie jest bardzo krótkie i proste, tym bardziej, że mogliśmy dopuścić do sytuacji, gdzie klienci nie honorują kolejki - najmniej zuchwały klient parkuje/wyjeżdża jako ostatni. Zuchwałość, o której piszę, to nic innego jak przydział czasu procesora, miejsce na parkingu oraz dwie bramy to zasoby, do których każdy wątek-samochód chce mieć dostęp. Jedyne wymagane na starcie programu wartości to ilość pojazdów oraz miejsc na parkingu, czas jazdy potencjalnego klienta poza parkingiem i czas jego postoju. Postanowiłem również założyć odpowiednią ilość zmian stanu pojazdów, aby generowany ruch nie był zbyt wielki, a jedynie przedstawiał mechanizm działania programu. Prostotę wykonania najważniejszych elementów tj. samochodu i obu bram ilustruje kod poniżej, na którym można dostrzec, że instrukcje informujące o zmianie stanu samochodów zawarte są w sekcjach krytycznych - w przeciwnym razie wyświetlane komunikaty nie odzwierciedlałyby chronologicznej kolejności zachodzących zdarzeń.

    Klasa Parking:

    Wątek:

    Kolejne laboratorium było już bardziej wymagające. Tym razem zadanie polegało na odwzorowaniu sytuacji mającej miejsce na stacji benzynowej z trzema dystrybutorami. O zagłodzeniu wątków nie może być tutaj mowy - gra toczy się o dużą stawkę, brak benzyny w baku oznacza wyeliminowanie danego samochodu. Wartości liczbowe wymagane na starcie programu to maksymalna długość kolejek, ilość samochodów, ich czas tankowania oraz czas jazdy poza stacją. W przypadku zapełnienia wszystkich kolejek na stacji klient zmuszony jest do dalszej jazdy przez czas równy dwukrotności czasu tankowania, następnie może spróbować ponownie dostać się do kolejki. Samochody powinny dążyć do maksymalnego wykorzystania paliwa, dlatego założyłem, że z każdym kolejnym tankowaniem maksymalny poziom paliwa w baku się zmniejsza. Nie chciałem przecież dopuścić do sytuacji, gdzie w ruchu pozostają np. dwa samochody mające do dyspozycji całą stację dla siebie - mogłyby jeździć wtedy bez końca. Wybór do realizacji tego zadania struktury wyższego poziomu, jaką jest kolejka blokująca (w tym przypadku ArrayBlockingQueue), był dla mnie oczywisty, aczkolwiek do intensywniejszego myślenia zmusił mnie fakt, iż samochód wjeżdżający na stację, powinien wybrać najkrótszą kolejkę. Pierwszym pomysłem było wykorzystanie metod kolejek blokujących w sekcji krytycznej, która zlicza poziom ich zapełnienia i na żądanie klienta wybiera najkrótszą. Następnym krokiem przy założeniu, że pojazd został już przyporządkowany do jednej z kolejek, jest sprawdzenie, czy samochód zgłaszający chęć skorzystania z dystrybutora, jest pojazdem znajdującym się na czele kolejki - tu przychodzi z pomocą metoda peek(), która zwraca element z kolejki bez usuwania go. W przypadku zgodności wykonana zostaje metoda poll() (usuwa samochód z kolejki), po czym dany samochód uzyskuje dostęp do dystrybutora blokując go jednocześnie na czas użytkowania. W przeciwnym przypadku - stwierdzenia niezgodności - zostaje ponowiona weryfikacja, czy samochód zgłaszający chęć skorzystania z dystrybutora, jest pojazdem znajdującym się na czele kolejki. Pomysł ten sprawia wrażenie akceptowalnego, ale czy nie dałoby się zrobić tego subtelniej? Jestem otwarty na wszelkie sugestie.