poniedziałek, 10 stycznia 2011

Wrażenia po lekturze specyfikacji "Contexts and Dependency Injection" (JSR-299)

Chęć przystąpienia do lektury specyfikacji "Contexts and Dependency Injection" stanowiła dla mnie doskonałą motywację, aby dowiedzieć się czegoś więcej na temat samego wstrzykiwania zależności (Dependency Injection), dotychczas zdawałem sobie jedynie sprawę
z faktu istnienia takiego wzorca. Szukając dobrego źródła wiedzy odnośnie DI natrafiłem na artykuł Martina Fowlera pt. "Inversion of Control Containers and the Dependency Injection pattern", dzięki któremu bardzo szybko pojąłem, z czym mam do czynienia.

Z zamiarem przygotowania się do zgłębienia tajników JSR-299
(już uzbrojony w wiedzę na temat DI) przeszedłem do lektury
"The Java EE 6 Tutorial"
, a mianowicie rozdziału 18 pt. "Introduction to Contexts and Dependency Injection for the Java EE Platform",
który był na tyle krótki, że zdecydowałem się sięgnąć jeszcze po artykuł Michała Ormana pt. "Kontekstowe komponenty w J2EE 6 - Wstrzykiwanie zależności". Posiadając elementarną wiedzę na temat poruszanych przez specyfikację CDI zagadnień, wraz z optymistycznym nastawieniem postanowiłem wydrukować omawiany dokument.

Lekturę specyfikacji JSR-299 ukończyłem wczoraj, zatem moje przemyślenia są jeszcze bardzo świeże, aczkolwiek przyznam,
że jestem pod wrażeniem możliwości prezentowanych przez CDI. Analizując zdobywaną wiedzę wielokrotnie starałem się wyobrazić sobie praktyczne zastosowania prezentowanych przez specyfikację rozwiązań, co skłoniło mnie do sformułowania tezy, że kluczem do poznania prawdziwych możliwości CDI jest przede wszystkim praktyka. Liczę, że moje entuzjastyczne nastawienie pogłębi się
wraz z przyszłym doświadczeniem praktycznym a spojrzenie na całość z perspektywy czasu przyniesie ze sobą kilka interesujących spostrzeżeń.

Możliwości CDI interesują mnie (zwłaszcza teraz po lekturze specyfikacji) szczególnie w odniesieniu do technologii JavaServer Faces w wersji 2.0. Mam zamiar przyjrzeć się temu duetowi nieco bliżej w ramach odskoczni od codziennych obowiązków, zwłaszcza tych akademickich w jakże niekomfortowym dla nas, studentów okresie zbliżającej się sesji.

Przydatne odnośniki:
  • Martin Fowler - Inversion of Control Containers and the Dependency Injection pattern
  • The Java EE 6 Tutorial - Chapter 18. Introduction to Contexts and Dependency Injection for the Java EE Platform
  • Michał Orman - Kontekstowe komponenty w J2EE 6 - Wstrzykiwanie zależności
  • JSR-299: Contexts and Dependency Injection for the Java EE platform
  • 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.