30 maja 2010

68. spotkanie Warszawa JUG - Jakub Nabrdalik z "Ruch Software Craftsmanship i co z tego wynika dla zwykłego programisty"

2 komentarzy
Warszawska Grupa Użytkowników Technologii Java (Warszawa JUG)Warszawska Grupa Użytkowników Technologii Java (Warszawa JUG) zaprasza na 68. spotkanie, które odbędzie się we wtorek, 1 czerwca o godzinie 18:00 w sali 5440 Wydziału MIM UW przy ul. Banacha 2 w Warszawie.

Temat: Ruch Software Craftsmanship i co z tego wynika dla zwykłego programisty
Prelegent: Jakub Nabrdalik

Celem spotkania jest przedstawienie ruchu Software Craftsmanship. Przejdziemy przez jego genezę, idee, założenia, manifest, by następnie porozmawiać o efektach: programiście jako pisarzu, metodach i wzorcach rzemieślniczych, sposobie rozwoju (mentoringu), społeczności. Będzie też praktyczny przykład zastosowania wymienionych wytycznych w kodowaniu. Prezentacja bazuje na koncepcjach opisanych w książce "Clean Code: A Handbook of Agile Software Craftsmanship" Roberta C. Martina, wywiadach z nim, treściach poruszanych na googlowej grupie dyskusyjnej software_craftsmanship i doświadczeniach własnych.

Jakub Nabrdalik pracuje dla firmy TouK jako Solution Architect, co oznacza, że w zależności od sytuacji, zakłada czapeczkę projektanta, programisty, architekta, analityka, lidera zespołu, kierownika projektu i tak dalej. Od 2003 roku czerpie dużo radości z zawodowego tworzenia oprogramowania w różnych technologiach, językach i metodykach. Od 2005 praktykuje TDD i Pair Programming. Walczy ze stereotypem developera jako aspołecznego gnoma i z chaosem wkradającym się po cichu do projektów informatycznych.

Planowany czas prezentacji to 1,5h, po których planuje się 15-30-minutową dyskusję.

Wstęp wolny

Zapraszam w imieniu prelegenta i grupy Warszawa JUG!

28 maja 2010

Jestem IBM Certified Application Developer – WebSphere ILOG JRules V7.0

0 komentarzy
Dzisiaj dołączyłem do szanownego grona posiadaczy certyfikatu IBM Certified Application Developer – WebSphere ILOG JRules V7.0!

IBM Certified Application Developer – WebSphere ILOG JRules V7.0Jest to ten jeden z niewielu egzaminów, do którego przygotowywałem się przez ostatnie 2 miesiące i tym bardziej wynik nie zachwyca. Moje dokonania podczas nauki opisywałem na bieżąco na moim angielskojęzycznym blogu Experiencing BRMS...with ILOG JRules. Jeśli są chętni powtórzyć mój sukces (a najlepiej go podwoić), tam można znaleźć (prawie) wszystko kiedy, co i jak. Cel osiągnięty - certyfikat zdobyty, ale ILOG JRules ma to coś w sobie, co powoduje, że jeszcze popracuję nad tematem, a może i znajdzie się trochę czasu na skrinkasty. Zainteresowani?

Szczególne podziękowania dla mojego korporacyjnego kolegi Maćka, który mimo mojej porażki sprzed dwóch dni przy podejściu kontrolnym, namówił mnie na ten egzamin i się udało. "Udało" jest idealnym słowem opisującym mój wynik. Kolejne "udało" w mojej sadze certyfikacyjnej.

27 maja 2010

Rozdział 2. Koncepcje ze specyfikacji Java EE 6 Contexts and Dependency Injection (CDI)

7 komentarzy
Ciekaw jestem, jaki też sposób na poznanie specyfikacji Java EE 6 wybrały osoby zajmujące się nią. W jakiś przedziwny dla mnie sposób, mnie wzięło na poznanie specyfikacji od podstaw, czyli wziąłem się za JSR-299 Context and Dependency Injection for the Java EE platform i z każdym dniem idzie sprawniej, ale nie tak, jakbym sobie tego życzył. Najwyraźniej należało zacząć od początku, czyli zabrać się za samą specyfikację Java EE 6 - JSR 316 Java Platform, Enterprise Edition 6 (Java EE 6) Specification. Pewnie dlatego, że byłoby za prosto, zabrałem się za CDI :)

Tym razem streszczę mądrości z rozdziału 2. Concepts.

Zacznę od pytania: Co różni instancję klasy stworzoną przez new, a tymi, przekazanymi przez kontener? Odpowiedzi nie należy się spodziewać (chyba że na wyraźne życzenie), bo powinna nasunąć się m.in. po lekturze specyfikacji CDI, czy tym streszczeniu.

Ziarna i ich typy


Komponent Java EE jest ziarnem (ang. bean), jeśli cykl rozwojowy jego instancji jest zarządzany przez kontener zgodnie z zasadami specyfikacji CDI.

Ziarno może posiadać dodatkowe metadane opisujące jego zachowanie w systemie.

Instancje ziarna nazywane są kontekstowymi instancjami ziarna.

Możliwe jest przekazywanie kontekstowych instancji ziaren do innych (w ramach tego samego kontekstu). Wspomniane przekazywanie to nic innego jak wstrzeliwanie zależności (ang. dependency injection) - jedna z form Inversion of Control (IoC).

Ziarna kontekstowe mogą być wykorzystywane w wyrażeniach Unified Expression Language (Unified EL).

Ziarno opisywane jest przez:
  • niepusty zbiór typów
  • niepusty zbiór kwalifikatorów
  • zasięg
  • (opcjonalnie) nazwy EL
  • zbioru związanych interceptorów
  • implementacji
Rolą programisty JEE6 jest stworzenie implementacji ziarna w Javie i opatrzenie jej odpowiednimi adnotacjami lub też poleganie na domyślnych właściwościach.

Zwykła klasa javowa - POJO - jest ziarnem, ale może też nim być ziarno zarządzane w JavaServer Faces (JSF) czy ziarno Enterprise JavaBeans (EJB). To jest główna idea tej specyfikacji, jak opisano w specyfikacji Java EE - rozdział EE.6.30 Contexts and Dependency Injection for the Java EE Platform 1.0 Requirements (strona 163):

CDI (JSR-299) definiuje zbiór kontekstowych usług, dostarczanych przez kontenery Java EE, których celem jest uproszczenie aplikacji, które korzystają z technologii warstwy webowej i biznesowej.

Tymi usługami kontekstowymi mogą być wstrzeliwanie zależności, metody zwrotne cykli rozwojowych, interceptory czy dekoratory.

Rolą kontenera jest automagiczne zarządzanie (tworzenie i niszczenie) instancjami, związywanie ich z odpowiednim kontekstem, rozwiązywanie nazw po typie i kwalifikatorach lub samej nazwie EL, obsługa metod zwrotnych (a w zasadzie ich wywoływanie w odpowiednim momencie), przechwytywanie wykonywania metod przez interceptory i dekoratory oraz obsługa zdarzeń.

Typ ziarna to zbiór typów widocznych dla klienta. Typ zawsze zawiera java.lang.Object. Dla EJB typami będą interfejsy biznesowe i Object.

Ograniczenie zbioru typów ziarna możliwe jest przez adnotację @javax.enterprise.inject.Typed, której wartość przyjmuje tablicę typów (i zawsze z dodatkowym Object - bez względu, czy jest wymieniony, czy nie).

Typ wyznacza możliwości ziarna i klient może rzutować instancję ziarna kontekstowego jedynie na typy widoczne dla niego.

Kwalifikatory


Kwalifikator pozwala na przypisanie dodatkowych informacji (metadanych) do typu ziarna. Kwalifikator reprezentowany jest przez adnotację, którą tworzy programista. Typ może posiadać wiele kwalifikatorów, które tym samym specjalizują go (zawężają miejsca, w których może być wstrzeliwany przez konieczność wypisania wszystkich kwalifikatorów).

Punkt/miejsce wstrzeliwania to miejsce w dowolnej klasie, w którym dojdzie do wstrzeliwania zależności. Może być opisane przez wiele kwalifikatorów, co jednocześnie zawęża możliwe ziarna.

Wyznaczenie instancji ziarna, która będzie wstrzelona, następuje przez porównanie typów i kwalifikatorów ziarna. W ten sposób możliwe jest udostępnienie różnych implementacji tego samego interfejsu i przez różne kwalifikatory wskazanie ich różnic (zamiast korzystać z ich typów implementacji). Jedynie zgodność typu i wszystkich kwalifikatorów punktu wstrzeliwania umożliwia przypisanie instancji ziarna.

Kwalifikatory mogą również służyć do filtrowania zdarzeń przez klasy nasłuchujące na zdarzenie.

Wbudowane kwalifikatory należą do pakietu javax.enterprise.inject wraz z @javax.inject.Named.

Każde ziarno ma domyślnie przypisany kwalifikator @Any (poza ziarnami stworzonymi przez @New).

Jeśli ziarno nie ma jawnie przypisanego kwalifikatora, poza @Named, ziarno ma dodatkowy kwalifikator @Default zwany kwalifikatorem domyślnym.

Kwalifikator to adnotacja Javy zdefiniowana jako @Target({METHOD, FIELD, PARAMETER, TYPE}) z @Retention(RUNTIME), ale także zawiera meta-adnotację @javax.inject.Qualifier i zwykle @java.lang.annotation.Documented. Kwalifikator może posiadać atrybuty.

Kwalifikatory ziarna są wyznaczone przez udekorowanie klasy ziarna lub metody/pola producenta typem kwalifikatora.

Kwalifikatory mogą być przypisane do metod, pól, parametrów i typu (zgodnie z deklaracją @Target), a przekładając to na język CDI będą to m.in. parametry metod produkujących (ang. producer methods), inicjujących (ang. initializer methods), rozgłaszających (ang. disposer methods), obserwujących (ang. observer methods) i konstruktorów.

Przestrzenie aktywności


Ziarna CDI istnieją w dobrze określonej przestrzeni, której cykl rozwojowy jest kontrolowany przez kontener. Wszystkie mają przestrzeń aktywności/zasięg działania (ang. scope).

Przestrzeń określona jest przez adnotację, np. @javax.enterprise.context.SessionScoped.

Istnieje 5 standardowych przestrzeni (wszystkie zdefiniowane w javax.enterprise.context):
  • @RequestScoped
  • @SessionScoped
  • @ApplicationScoped
  • @ConversationScoped
  • @Dependent
3 pierwsze reprezentują standardowe przestrzenie ze specyfikacji Java Servlets. Kolejny, @ConversationScoped to nowość w CDI, a ostatni podobnie, ale jest jeszcze dodatkowo specjalnego traktowania.

Można definiować własne przestrzenie. Tworzymy adnotację z @Target({TYPE, METHOD, FIELD}) i @Retention(RUNTIME). Dodatkowo obowiązkowo należy dodać @javax.inject.Scope lub @javax.enterprise.context.NormalScope.

Określenie przestrzeni ziarna to przypisanie adnotacji do jego typu lub metody/pola produkującego.

Brak jawnie określonej przestrzeni ziarna oznacza, że jest ona domyślna i zależy od stereotypów - ich brak to zasięg @Dependent, wspólna przestrzeń stereotypów to przestrzeń ziarna, a w przeciwnym przypadku musi być jawnie podana przestrzeń.

Jawne określenie przestrzeni, to przestrzeń obowiązująca (bez względu na przestrzenie deklarowane przez stereotypy).

Reszta rozdziału w kolejnej relacji, bo zaczyna się robić przydługo (i pewnie nudno).

Gdyby tylko jeszcze znaleźć ciekawe tłumaczenie dla angielskiego bean. Używam ziarno, ale coraz bardziej nie pasuje mi, jak i jego angielski protoplasta. Pomysły?

26 maja 2010

Lektura specyfikacji CDI (JSR-299) za mną, NetBeans 6.9 RC1 wydane i JSR-330 Dependency Injection for Java

1 komentarzy
Właśnie ukończyłem lekturę specyfikacji JSR-299: Contexts and Dependency Injection for the Java EE platform. Jeśliby spojrzeć na nią pod kątem liczby stron, to nie należy ona do najbardziej rozległych i jedynie 92 stron można przeczytać w jeden wieczór. Co jednak mnie spowalniało w tym zamiarze, to niezwykle suche podawanie pojęć i zasad działania specyfikacji, której zrozumienie zabrało mi bodajże 2 tygodnie.

Zacząłem od wpisu Nauka Java EE 6 CDI (JSR-299) - relacja z lektury pierwszych dwóch rozdziałów specyfikacji, w którym przedstawiłem pierwszy rozdział z dwóch zakładanych. Miałem wrażenie, że możnaby opisać jednym wpisem całość, a wyszło jak wyszło - przydługi wpis dotyczący jedynie pierwszego rozdziału 1. Architecture.

W tym samym czasie, kiedy ukończyłem czytanie specyfikacji CDI, pojawiła się kolejna wersja NetBeans 6.9 RC1, która udostępnia jej wsparcie. Niewiele jeszcze mogę napisać na ten temat, ale sądzę, że lepiej będzie, jeśli moje próby zrelacjonuję w postaci skrinkastów. W tym tygodniu nie ma co się ich spodziewać, a z kolei w przyszłym jestem na urlopie, więc pewnie dopiero w czwartek, 10 czerwca. Możecie już regulować kalendarze (parafrazując powiedzenie o regulowaniu zegarków).

Sprawę środowiska programistycznego mam więc za sobą i NetBeans IDE 6.9 RC1 będzie moim podstawowym narzędziem, a środowisko uruchomieniowe to GlassFish 3.0.1 (dostarczany z NetBeans IDE), a docelowo IBM WebSphere Application Server V8.0 Alpha.

Co przykuło moją uwagę dzisiaj, to specyfikacja JSR-330 Dependency Injection for Java, która, przynajmniej z nazwy, przypomina CDI. Zaczęło się od wizyty na stronie Apache OpenWebBeans, gdzie w menu po lewej pojawiają się obie specyfikacje JSR299 oraz JSR330. Trochę mnie to zastanowiło, jaka jest różnica między nimi, więc zajrzałem na stronę tej drugiej. Z nazwy wyglądają łudząco podobnie, a prowadzącym specyfikację JSR-330 jest Rod Johnson (z projektu Spring Framework) oraz Bob Lee (z Google Guice), a za JSR-299 odpowiada Gavin King (z JBoss Seam i Hibernate). Mam wrażenie, jakby obie specyfikacje oferowały podobne funkcjonalności?! Poszukując dalej, ciekawe jest zestawienie implementacji JSR-330 na stronie Technology Compatibility Kit (TCK) - atinject:
Jak widać są wszyscy - Guice, OpenWebBeans, Spring Framework i Weld, z nieznanym mi piątym KouInject. Zdaje się, że pora na to, abym zabrał się za lekturę The Java EE 6 Tutorial, Volume I, bo inaczej pogubię się w gąszczu specyfikacji Korporacyjnej 6tki. Coś mi jednak mówi, że do zrozumienia całości, nie ma innego sposobu, jak po prostu zajrzeć do samej specyfikacji JSR 316: Java Platform, Enterprise Edition 6 (Java EE 6), bo inaczej się pogubię. Tak też zrobię, bo w specyfikacji JSR299 pełno wzmianek o specyfikacjach i o wielu nie mam bladego pojęcia (albo określa się je nowymi terminami), np. "The Managed Beans specification" (strona 2) - jakby o JSF, ale później pojawia się oddzielna sekcja 1.2.6. Relationship to JSF, więc to raczej nie JSF - i wspomniana "The Dependency Injection for Java specification" (strona 3). Ach, teraz jasne po co DI for Java! :-) Przecież wyraźnie napisano w sekcji 1.2.4. Relationship to Dependency Injection for Java (w wolnym tłumaczeniu):

"Specyfikacja Dependency Injection for Java określa zbiór adnotacji, którymi oznacza się pola, metody i konstruktory ziaren (ang. bean), które podlegają mechanizmowi DI. Usługa DI [w CDI - mój przypisek] korzysta z tychże."

Na zakończenie chciałbym przywołać opis JSR-299 Contexts and Dependency Injection for the Java EE platform ze strony Apache OpenWebBeans (w wolnym tłumaczeniu):

"Celem specyfikacji CDI [dawniej WebBeans - mój przypisek] jest ujednolicenie modeli komponentowych JSF i EJB, aby znacząco uprościć model programowania aplikacji webowych."

Bardzo trafne podsumowanie specyfikacji CDI, aczkolwiek dotyczy to szerszego spektrum technologicznego i wykracza poza JSF i EJB, gdzie POJO gra również pierwsze skrzypce. Mimo tych niedomówień, wydaje się być bardziej przystępne niż to w samej specyfikacji.

Późno już, ale na przykładzik z servlecikiem z przekazanym ziarnem CDI jeszcze się znajdzie chwilka. Zdecydowanie zbyt wiele teorii, a za mało praktyki. Odmóżdża mnie to.

24 maja 2010

Tak mnie natchnęło podczas powrotu - CDI, Spring Framework, JBoss Seam i in.

2 komentarzy
W oczekiwaniu na samolot do Pragi, na lotnisku w Bratysławie, trafiłem do restauracji, która przypominała mi lata 80-te zeszłego wieku. Kiedy wreszcie podano mi kartę (ludzi było sporo i widać było, że kelnerzy biegają jak w ukropie) jeszcze bardziej byłem przerażony - strona graficzna karty przypominała mi moje nieśmiałe próby zabawy z grafiką, a nie mam złudzeń, że nie znam się na temacie. Mimo wszystko dałem się namówić samemu sobie, abym jednak spróbował. Zamówiłem danie, którego wygląd w karcie przypominał lata jak sama restauracja i aż do momentu podania wciąż walczyłem ze swoimi myślami, czy dobrze zrobiłem (co później okazało się bardzo pozytywnym zaskoczeniem!). Czekałem i patrzyłem przez okno na lotnisko, aż zacząłem zastanawiać się nad celem...specyfikacji JSR-299 Contexts and Dependency Injection (CDI) i, jakkolwiek wciąż przede mną część praktyczna, to wydaje mi się, że zrozumiałem jego istotę.

Jak sama nazwa specyfikacji CDI mówi (wręcz narzuca się ze swoim celem przez nią, ale najwyraźniej niezbyt nachalnie, bo dla mnie nie było to jasne, aż do tego momentu) sprawa dotyczy realizacji koncepcji zarządzania kontekstami (znamy przynajmniej 3, które istnieją w Java EE od wieków, ale i tych, które możnaby stworzyć, które pojawiły się w JSF2 conversation i potencjalnie dostępne z rozwiązaniami BPM - businessprocess) oraz obiektami, które podlegają mechanizmowi Dependency Injection (DI) w ramach kontekstu, który tym samym pełni rolę przestrzeni ich widoczności.

Jeśli miałbym szukać odpowiednika CDI w świecie poza JEE6, aby choć nieznacznie nawiązać kontakt myślowy z szerszą częścią czytelników, to byłby to na pewno Spring Framework (i nie mam na myśli jego rozszerzeń tylko sam "czysty" - bez dodatków - kontener DI). Bardziej idealnym odpowiednikiem byłby Guice, albo PicoContainer, albo jeszcze HiveMind, ale ich rozpoznanie nie należy do najszerszych, a to pewnie dlatego, że są bardzo specjalizowanymi rozwiązaniami, które nie doczekały się szerszego wsparcia gotowych rozwiązań "stosowych" (o nich za moment).

Skoro w temat tworzenia CDI zaangażowani byli autorzy JBoss Seam, to możnaby również mniemać, że i w nim coś już było, albo jest dopasowywane. I faktycznie tak jest. Pamiętam moment, kiedy dowiedziałem się o postrzeganiu JBoss Seam jako...kontenera DI, którego porównywano do...Spring Framework (!) Nie mogłem po prostu w to uwierzyć. Dla mnie Seam był i wciąż jest szkieletem webowym opartym na JEE, który był o tyle rewolucyjny, że połączył dwie technologie, które jakkolwiek pod parasolem JEE, to wciąż grały do innej bramki. Mowa o EJB3 i JSF 1.2. Dzięki Seam oba rozwiązania były jakby ukryte pod przykrywką warstwy komponentów i to właśnie stanowiło trzon, aby wprowadzić jako standard do JEE. Teraz to jasne (czasami warto znaleźć się w miejscu, w którym lepiej, aby nas nie było, np. kawiarnia na lotnisku, bo nieoczekiwane prowadzi do ciekawych chwil, których trudno by szukać w znanym i opanowanym mentalnie świecie).

Teraz wiem, dlaczego kiedy przeglądałem materiały do CDI, gdzieś na niskim pułapie wciąż przelatywał JSP i JSF2. Samo CDI to jedynie, albo aż, kontener DI, podobnie jak Spring Framework. Jednak do zbudowania aplikacji korporacyjnej potrzebujemy szkieletu webowego czy Web Services, czy innej obsługi protokołu do komunikacji z użytkownikiem końcowym. Tu jest miejsce dla JavaServer Faces 2.0 jako kompletnego szkieletu webowego, zintegrowanego z CDI. Kiedy dodamy do tego EJB3.1 mamy cały obraz najnowszego wydania Java Enterprise Edition 6.0. Teraz już jest łatwiej zrozumieć ich zmiany i powiązania między nimi.

Tak mnie natchęło, aby pochwalić się swoim znaleziskiem :-) Wracam do lektury specyfikacji. Jeszcze tylko kilka stron i teoretycznie będę "uzbrojony".

21 maja 2010

Skrinkast o Java EE 6 z @WebServlet, NetBeans IDE 6.9 i IBM WebSphere AS V8 w HD 720p na YouTube

8 komentarzy
Slajd tytułowy skrinkastaW końcu się udało! Po bodajże miesiącu przygotowań - tworzeniu scenariusza i kilkakrotnym nagrywaniu, aby później wszystko wrzucić do kosza i testowe publikacje na YouTube - mogę w końcu nagłośnić, że moja najnowsza produkcja filmowa trafiła pod strzechy YT w wersji HD 720p - Skrinkast o Java EE 6 z @WebServlet, NetBeans IDE 6.9 i IBM WebSphere AS V8!

Największym wyzwaniem było nagranie głosu, jednocześnie z wykonywanymi czynnościami podczas nagrania oraz utrzymanie czasu, który z planowanych 3-5 minut rozciągnął się do 6 minut i 4 sekund. Później postprodukcja - obróbka i nauka trików w ScreenFlow (dobrym źródłem okazała się sama dokumentacja oraz ScreenFlow's Product Demos & Tutorials, lektura o formatach do exportu i materiał był gotowy do publikacji.

Myliłby się ten, kto sądziłby, że publikacja na YT to koniec wytężonej pracy. Teraz pewnie tak będzie, ale kiedy napiszę, że skrinkast miał ujrzeć światło dzienne około 22giej wczoraj, a ujrzał dopiero po północy i jeszcze nie byłem pewien, czy wszystko jest dobrze, wszystko będzie jasne. Sam export może trać i w moim przypadku trwał około 30 minut, później zapis na YT chwila (około 5 minut), ale dopiero po tym zabawa zaczyna się na dobre - przetwarzanie filmiku przez samego YT. Do końca nie wiadomo, czy wersja skrinkastu będzie w rozdzielczości HD (próbowałem się z 1080p, ale ostatecznie skończyłem na 720p).

Co znajdziemy w skrinkaście? Jest to skrinkast-zagadka, w którym dzielę się doświadczeniami z pierwszych chwil z Java EE 6, NetBeans IDE 6.9 i IBM WebSphere Application Server V8. Utworzyłem projekt aplikacji webowej z servletem, który nie ma definicji w deskryptorze WEB-INF/web.xml oraz korzysta z adnotacji @WebServlet. Na koniec nagrania okazało się jednak, że popełniłem błąd i pomyślałem sobie, że zamiast poprawić, zostawię nagranie w postaci skrinkasta-zagadki.

I teraz najlepsze - pora rozpocząć zabawę. Zapraszam do obejrzenia mojego skrinkastu o platformie Java EE 6, NetBeans IDE 6.9 i WAS8 w akcji. Uwagi mile widziane, szczególnie o elementach nagrania, jak głos, tempo, głośność i inne takie. Szukam dobrego materiału dźwiękowego, aby podłożyć w tło, więc tutaj liczę również na Twoją pomoc. Pamiętaj, aby obejrzeć nagranie w wysokiej rozdzielczości!

19 maja 2010

Recenzja "Growing Object-Oriented Software, Guided by Tests"

2 komentarzy
Growing Object-Oriented Software, Guided by TestsJeszcze niedawno byłem w Turcji, gdzie wylądowałem w pokoju 722, aby w tym tygodniu poprowadzić szkolenie WB722 Administration of IBM WebSphere Process Server V7 w Bratysławie, Słowacja. Chodzą przypadki po ludziach, a mnie nawiedziła liczba 722 (!)

Siedzę sobie w hotelu i korzystam z czasu na czytanie książek. Na tapecie było kilka, ale zdecydowałem się dokończyć jedną, szczególną - Growing Object-Oriented Software, Guided by Tests. Wciąż nie mogę uwierzyć, jak można mieć tyle wiedzy technicznej, a jednocześnie umiejętnie przedstawić temat w postaci książki?! Niekrótka "wycieczka" w stronę Test-Driven Development (TDD) trwała dobrych kilka tygodni i wczoraj udało się ją zakończyć recenzją.

To była lektura, która na długo pozostanie mi w pamięci. Była to z pewnością jedna z tych nielicznych, jeśli nie jedyna, która nie traktowała o produkcie lub specyfikacji, ale o sposobie postępowania podczas rozwoju oprogramowania (możnaby powiedzieć, że faktycznie przedstawiała jMock, ale zorientowałem się dopiero przy końcowych rozdziałach, więc nie to mną kierowało). Niby wiele rzeczy oczywistych, a mimo wszystko niezwykle zwięźle i treściwie przedstawione. Najbardziej podobała mi się część Part III: "Working Example", w której mogłem poczuć na własnej skórze, co autorzy mieli na myśli w poprzedzających ją 2 częściach - Part I: "Introduction" oraz Part II: "The Process of Test-Driven Development". Pamiętam jak dziś, kiedy powiedziałem sobie "STOP, więcej nie mogę!", kiedy czytanie zaczęło mi zabierać coraz więcej czasu, bo...po prostu analizowanie treści angażowało mnie w trakcie, jak i po skończonym czytaniu. Nie minął miesiąc, kiedy zdecydowałem się powrócić do lektury. Jednym słowem warto było i tylko szukać miejsca, aby rozpocząć wdrażanie tych mądrości w życiu. Zdecydowany numer 1 na mojej półce czytelniczej.

W międzyczasie, całkiem przypadkiem trafiłem na prezentację Sustainable Test-Driven Development autora wspomnianej książki Steve'a Freemana, który w ciągu 50 minut przedstawił kwintesencję zawartości książki z części Part IV: Sustainable Test-Driven Development. Odsłuchanie prezentacji zajęło mi dokładnie tyle czasu, ile potrzebowałem na...odprasowanie rzeczy na mój słowacki wyjazd (!) :) Doskonały przykład łączenia przyjemnego z pożytecznym. Warto wysłuchać, aby wzmocnić przekaz książki, albo wręcz ocenić jej zawartość przez pryzmat prezentacji.

Zainteresowanych moją angielskojęzyczną recenzją kieruję do Book review: Growing Object-Oriented Software, Guided by Tests, a samą lekturą książki o kontakt na priv. Książka jest w zbiorach Biblioteki Warszawskiego JUGa i dostępna na żądanie dla każdego, szczególnie tym, którym leży na sercu podniesienie jakości tworzonego oprogramowania i przyjaźń współtowarzyszy na projektach :-)

Natychmiast pochwaliłem się wydawnictwu o moim wyczynie - opublikowaniu recenzji na Amazonie i nieśmiało poprosiłem o kolejną:

With the review published would I qualify for one more? I wish I could review "Clean Code: A Handbook of Agile Software Craftsmanship" [2] if possible.

[2] http://www.informit.com/store/product.aspx?isbn=0132350882

Odpowiedź nadeszła następnego dnia, a w niej:

Jacek,

Thank you for this review and we will be pleased to ship you "Clean Code".

Heather Fox


Od razu świat wydał mi się przyjaźniejszy :-) Czekam cierpliwie na przesyłkę, a nim nadejdzie urozmaicam sobie czas innymi aktywnościami. Pozwoliłem sobie między innymi na chwilkę z WebSphere Application Server Administration Using Jython, ale albo zmęczonym i do mnie nie dociera, albo nie przystaje do moich oczekiwań i nie pozostanie mi nic innego, jak ocenić ją jako bezwartościową. Odkładam na bok, bo szkoda urazić autorów zawczasu. Wypocznę, ona odleży swoje i może się dogadamy.

Tym samym wracam do lektury specyfikacji JSR-299: Context and Dependency Injection for the Java EE platform, bo po zakończonym 1 rozdziale czekała na mnie cierpliwie i pora zrewanżować się chociażby niewielkim zainteresowaniem :-)

p.s. Jak widzę po liczbie wpisów z ostatniego tygodnia, to chyba nici z moich publicznych deklaracji Wygaszam bloga na rzecz innych aktywności - głównie skrinkasty i wtyczka NetBeans do WAS8. Faktycznie zająłem się intensywniej skrinkastami (mam scenariusz i kilka podejść próbnych) oraz wtyczką NetBeans do WAS8 (już można zarejestrować WAS8 i pojawia się pozycja w Servers), więc poza wygaszaniem, wszystko zgodnie z planem.

15 maja 2010

67. spotkanie Warszawa JUG - Damian Szczepanik z "Multimedia Home Platform, czyli Java na małym ekranie"

0 komentarzy
Warszawska Grupa Użytkowników Technologii Java (Warszawa JUG)Warszawska Grupa Użytkowników Technologii Java (Warszawa JUG) zaprasza na 67. spotkanie, które odbędzie się we wtorek, 18 maja o godzinie 18:00 w sali 5440 Wydziału MIM UW przy ul. Banacha 2 w Warszawie.

Temat: Multimedia Home Platform, czyli Java na małym ekranie
Prelegent: Damian Szczepanik

Celem spotkania są przedstawienie głównych założeń platformy Multimedia Home Platform (MHP) oraz charakterystyka aplikacji w porównaniu z appletem czy midletem. W dalszej części omówiony zostanie sposób dostarczania aplikacji na telewizor oraz jej uruchamianie. Podjęte zostaną tematy związane z wytwarzaniem oprogramowania na platformie sprzętowej MHP, implementacją maszyny wirtualnej oraz sposobem testowania. Nie zabraknie omówienia możliwości telewizora, który posiada platformę MHP. Na koniec krótka wizualizacja przykładowych aplikacji.

Damian Szczepanik pracuje w firmie Samsung Electronics, gdzie jako programista C++/Java zajmuje się rozwojem oprogramowania dla telewizorów cyfrowych. W szczególności umożliwieniem aplikacjom Xlet uruchamiania się na platformie MHP oraz integrowaniem ficzerów i tępieniem robactwa tak, by się nic nie wylęgło na taśmie produkcyjnej - co wspólnymi siłami się udaje. W wolnym czasie udziela się jako tester projektu Mozilla Calendar.

Planowany czas prezentacji to 45 minut, po których planuje się 15-30-minutową dyskusję.

Wstęp wolny

Zapraszam w imieniu prelegenta i grupy Warszawa JUG!

14 maja 2010

Skrinkast #1: Pozdrowienia z GeeCONa

6 komentarzy
GeeCON - Let's move the Java worldMiało być rzadziej, ale sytuacja nadzwyczajna, więc...nie mogłem się powstrzymać.

Wczoraj pozdrawiałem uczestników
GeeCONa (dla niewtajemniczonych: 2-dniowa konferencja javowa w Poznaniu, która, gdyby nie Javarsovia, byłaby z pewnością najlepszą w Polsce), aby dzisiaj rano w skrzynce znaleźć...pozdrowienia z GeeCONa!

Wszystkich serdecznie pozdrawiam ze słonecznego Stambułu i życzę równie udanego poranka, co i nocno-wczesnoporannej zabawy. Jeśli atmosfera konferencji jest choć trochę, jak na nagraniu, to...może i dobrze, że siedzę tutaj, a nie tam. Wrażeń jest zdecydowanie mniej i daję radę :-)

A teraz konkurs: Kto występuje w nagraniu? Nagrody idą do tych, którzy wymienią osoby występujące w nagraniu (nimi nie będąc, oczywiście). Nagroda główna - udział w konferencji Javarsovia 2010 26 czerwca!

13 maja 2010

Siedzę w Turcji i przetwarzam sygnały zewsząd, trochę o NetBeans i WAS8 również

2 komentarzy
Siedzę w Turcji i mnie trochę zdusił cały ten zgiełk wokół. Pisałem o moich poprzednich wizytach w Stambule i mimo, że wiele rzeczy już doświadczyłem poprzednio, teraz nie są wcale znajome. Uczę się pilnie tureckiego i potrafię nawiązać komunikację - skorzystać z "protokołu komunikacyjnego" jakim jest język turecki. Mieszają mi się te pojęcia z IT z życiem codziennym i gdzie nie spojrzę, czego nie doświadczę, to właśnie jakby reminiscencja doświadczeń z IT :)

A działo się przez ostatni tydzień sporo. W Turcji moim zadaniem jest namierzenie problemów wydajnościowych w kodzie pisanym jeszcze na początku tego wieku, w czasach wszechobecnej Java 1.4 i z niedoświadczonym (takie odnoszę wrażenie) zespołem, który o automatycznym budowaniu aplikacji, testowaniu i całym tym "zgiełku" utrzymywania wysokiej jakości oprogramowania, obawiam się, że nawet nie słyszał. Nie jest to w żaden sposób zarzut, ale przestroga, że tworzenie czegokolwiek wymaga wiedzy, a nauka jedynie na projektach, to równia pochyła i krótkowzroczna perspektywa wolnego czasu. Wierzę, że czytelnicy tego bloga biorą sobie do serca wytyczne "Growing Object-Oriented Software, Guided by Tests". Jest wiele książek, które należą do kategorii "Obowiązkowa lektura" i ta z pewnością tam jest, ale wstrzymam się z rekomendacją do końca jej lektury, bo skończyłoby się na znanym i (nie)lubianym, strywializowanym "obowiązkowa lektura dla każdego". Potrzebuję bardziej efektownych recenzji, bo tego typu mi się przejadły. Co książka, to obowiązkowa lektura i wszystko zależy od punktu widzenia.

A skoro o nim, to mój punkt widzenia dwukrotnie w ciągu dnia sprowadza się do 30-minutowej "wycieczki" taksówką z hotelu w Taksim, aż do prawie przy lotnisku i spowrotem. Jazda przy 120 km/h na zatłoczonej otoban zderzak w zderzak daje się odczuć. Gdyby nie te widoki wokół, pewnie osiwiałbym już dawno. A tak urzeczony panoramą z zatłoczonymi parterówkami z gdzieniegdzie wystającymi meczetami z 2 minaretami i hotelami wysokimi na 30 pięter zapominam o bożym świecie. I filmuję, aby móc później pokazać rodzince. Pomyślałem sobie, czy dałoby radę przenieść ten typ jazdy do nas, do Warszawy chociażby, gdzie też czasami doświadczam podobnego uczucia, ale mimo wprawy taksówkarza, sądzę, że liczba kolizji nauczyłaby go manier, bo...jak to mówią "Do tanga trzeba dwojga" i to, że taksówkarz pędzi setką zderzak w zderzak, to tylko i dlatego, że inny kierowca robi podobnie. Tym samym nastąpiło "uwspólnienie interfejsów" i można się dopasować. W Warszawie o to trudniej.

Nauczyłem się w międzyczasie kilku sztuczek przydatnych tu i ówdzie, np. wyłączenie wszystkich katalogów z obsługi repozytorium Mercurial (hg), począwszy od katalogu bieżącego w dół, to po prostu:
$ cat .hgignore
syntax: regexp
^build.xml$
^build/
^nbproject/build-impl.xml$
^nbproject/private/platform-private.properties$
^nbproject/private/private.xml$
Włączamy sytax: regexp i bawimy się wyrażeniami regularnymi. Możemy mieszać konfigurację z wyrażeniami powłoki uniksowej przez syntax: glob. I tak naprzemiennie. Więcej można przeczytać w dokumentacji hgignore. Proste i przyjemne.

Siedząc wieczorami w hotelu, kiedy wracam ze spacerów po Taksim, zabrałem się za rozwój wtyczki NetBeans dla serwera aplikacyjnego WAS V8. Tak w ramach (samo)rozwoju programistycznego. Na razie udało mi się wyświetlić WAS V8 jako jeden z wielu serwerów w okienku Add Server..., więc idzie powoli, ale postępy zauważalne. Przydaje się znajomość skrótów klawiszowych i jak na razie przywykłem do Cmd+O (odszukanie typu) oraz Cmd+Shift+I (uprządkowanie importów). Po niedługich doświadczeniach z bardzo rozbudowanym klawiszowo edytorze javowym w Eclipse IDE, kiedykolwiek muszę usiąść przy NetBeans IDE, pod kątem skrótów klawiszowych odczuwa się jego niedojrzałość. Brakuje mi bardziej strawnych podpowiedzi i kombinacji z Eclipse. Cóż, przyzwyczajenie drugą naturą człowieka, więc przygryzam wargi i moje narzekania zrzucam na barki moich przyzwyczajeń, z którymi wiemy, że trzeba walczyć. Co też czynię sumiennie i z pokorą.

Jeju, po 4 dniach upalnych, przy temperaturze koło 30tki, zaczęło właśnie padać! Będzie znośniej, bo kiedy wychodzę z klimatyzowanego budynku do taksówki od razu daje się odczuć zmęczenie upałem i przenikliwym słońcem. Idzie się wykończyć, a to jedynie przez 30 minut w taksówce około 18tej (!)

Przeglądając kody źródłowe wtyczek do serwerów w NetBeans zauważyłem, że pewne konstrukcje są udokumentowane. Chyba zaczyna mi się udzielać "dobro" książki "Growing OO Software...", bo u mnie komentarzy niewiele, a raczej skłaniam się ku umieszczaniu ich w ramach dedykowanej metody o nazwie, która odpowiada komentarzowi, a tym samym mówi czytelnikowi, co robi. Zastanawiam się, czy to krok w dobrym kierunku? Doszło wręcz do tego, że cała metoda sprawdzająca, domyślnie wywoływana przez NetBeans IDE - valid() - jest jedynie wywołującą metodę docelową (zamiast umieszczania jej kodu bezpośrednio w ciele metody). Odnotowuję to jako krok ku mojemu, lepszemu warsztatowi programistycznemu i nie mam złudzeń, pod wpływem której książki jestem. Uzależnia. Sama metoda valid() mówi, a przynajmniej stara się wskazać swoją potrzebę istnienia, ale moja metoda mówi, co to znaczy być valid() i jakie warunki muszą zostać spełnione. Każde ze swoją metodą.

W trakcie pisania wtyczki przyszło mi stworzyć kawałek funkcjonalności wizualnej z GUI, co okazało się trywialne przez użycie asystenta New > Wizard.

Poszło gładko, aczkolwiek wizualne programowanie jakoś mnie ogranicza. Opierając się na tym asystencie, wiele jest wyłączone i zamiast dłubać w klasie muszę przestawić się na programowanie wizualnie, przez definiowanie właściwości w różnych widokach.

W pewnym momencie miałem nawet problem z zaznaczeniem komponentu, którego właściwości chciałem zmienić, ale na pomoc przyszedł mi klawisz TAB, dzięki któremu mogłem przeskakiwać między komponentami w GUI - w ten sposób dotarłem do JPanel, który był niewidoczny, bo z takimi rozmiarami na nic więcej nie mógł się porwać. Do zapamiętania: Cmd+Backspace kasuje wybrany komponent

Na zakończenie mojego tygodnia poza domem, w Turcji, zabrałem się za nagrywanie skrinkasta o NetBeans IDE 6.9, WAS V8 i @WebServlet, czyli filmiku o platformie do nauki Java EE 6. I tak się przygotowuję powolutku do niego. Mam już scenariusz i pierwsze próby już poszły do kosza. Dzisiaj spróbuję ponownie. Kupiłem nawet książkę o profesjonalnym nagrywaniu skrinkastów The Screencasting Handbook i próbuję swoich reżyserskich sił. Książka pełna rad, których wizualizację powinniście poczuć niedługo. Nagranie w trakcie realizacji. I będzie z głosem! Co mnie niezwykle przyciąga do tych nagrań, to możliwość wyuczenia się prowadzenia krótkich sesji warsztatowych, gdzie mam niewiele ponad 5-8 minut i prezentuję pewną funkcjonalność. Pozwala mi to wybrać tylko jeden element w danej sesji nagraniowej i przygotować się do ich zbiorczego odtworzenia w postaci 45minutówki podczas konferencji czy spotkania. Sama praca niełatwa, ale końcowy efekt...bezcenne! W końcu nauczę się nie przekraczać danego mi czasu antenowego i sesje będą ciekawsze, bo wyłącznie z kodem.

Ciekawe doświadczenie z przekazywaniem informacji nowoprzybyłym w postaci nagrania-skrinkastu doświadczyłem całkiem niedawno. Zostałem zaproszony do udziału w międzynarodowym przedsięwzięciu i strefy czasowe były tak rozbiegane, że jedynym sposobem na przekazanie mowy powitalnej był...skrinkast. Gość nagrał go i rozdał do zapoznania się. Zainteresowanych zaprosił do udziału w sesji jeden-na-jeden. Cel zrealizowany i w jaki nowatorski sposób. Ach, powinienem był napisać, że celem projektu jest właśnie stworzenie kursu do samodzielnego prowadzenia przez uczestników, tj. self-paced online course, więc była to swego rodzaju przygrywka do pracy, którą w podobnym stylu każdy będzie musiał zrealizować.

Na zakończenie, spostrzeżenie porównujące społeczności stojące za Twitterem i Facebookiem - "Facebook is the people you went to school with. Twitter is the people you wished you went to school with." ~@twittelator. Dla mnie rewelacja!

Pozdrowienia dla uczestników GeeCONa. Bawią się, a my musimy charować! Odkujemy się podczas Javarsovia 2010. Będzie rewelacyjnie. Już sama obsada sponsorska to gwarantuje, a liczba tematów z naszej, polskiej społeczności javowej jeszcze bardziej upewnia mnie w tym przekonaniu. Agenda właśnie się tworzy i z 4 ścieżkami po 6 wystąpień każda...co tu dużo pisać - 26 czerwca macie przecież już zarezerwowane i przegadamy temat w bezpośrednim starciu. Do zobaczenia!

07 maja 2010

Wygaszam bloga na rzecz innych aktywności - głównie skrinkasty i wtyczka NetBeans do WAS8

8 komentarzy
Czytając Farewell Blog, Hello POMA zorientowałem się, że wiele czasu poświęcam na wpisy na moim blogu, które...nie przynoszą mi już tyle satysfakcji, co poprzednio. Jakby wymuszały na mnie pewien ciąg, ale produktywność wciąż pozostaje na tym samym poziomie. Potrzebuję zmian i mimo, że mam je wokół, blog wciąż pozostaje numerem JEDEN moich aktywności. Tym samym naszło mnie na wdrożenie pewnego pomysłu, który chodził za mną od pewnego czasu - wygaszenia bloga, aby zwolnić czas na inne projekty.

Wielu zauważyło, że próbuję się z innymi aktywnościami (angielskojęzycznymi) na twitterze czy blogu Experiencing BRMS…with ILOG JRules. Utrzymywanie ich ma swoją cenę, a doliczając do tego recenzowanie książek czy inne, niepubliczne aktywności nie czuję się wcale bardziej produktywny niż gdybym nie robił nic. Nie o takiej produktywności marzyłem.

Zacząłem 13 stycznia 2006 roku wpisem W końcu się zdecydowałem! i obecnie z 592 wpisami osiągnąłem poziom ponad 1100 subskrybentów. Liczby zobowiązują i jestem na prawdę wdzięczny, że dzięki temu miałem okazję nauczyć się wiele jednocześnie przekazując wiedzę dalej (jakby w ramach spłaty długu wdzięczności za utrzymywanie mnie w ciągu). Dziękuję za zaufanie (i łaskotanie mojego ego rosnącą popularnością).

Jeśli chciałbym cokolwiek zmienić w moim rozwoju technologicznym, to większa koncentracja na mniejszej liczbie rzeczach, które sprawiają mi prawdziwą radochę - skrinkasty i większa aktywność jako programista w światku otwartego oprogramowania i prywatnie, nie pozostawiając recenzji książek z boku.

Tym samym zmniejszam ruch na blogu, do powiedzmy 1 wpisu na tydzień, nawet dwa, mierząc się z czymś bardziej ekstremalnym dla mnie - nagrywaniem skrinkastów o moich doświadczeniach z technologiami. Wspominałem już o zadaniu Nauka JEE6 z WAS8 w NetBeans 6.9, które jest kwintesencją moich planów - nauki Java EE 6 począwszy od specyfikacji Context and Dependency Injection (CDI), przez ewaluację IBM WebSphere Application Server V8 i zbudowaniem wtyczki dla NetBeans 6.9 obsługującej WAS8, nieprzypadkowo nazwanej NetBeans plugin for WebSphere AS V8 (poszuję lepszej nazwy dla tego tworu, więc pomysły mile widziane). Utrwalając wszystko w postaci skrinkastów zrealizuję swój plan na ten rok w 100%. Skrinkasty przede wszystkim i na tym skoncentruję swoje wysiłki przez kolejne tygodnie. Chciałbym dotrzeć, a później utrzymać regularne tempo 1 skrinkasta w ciągu 2 tygodni. W międzyczasie aktywność wokół moich prywatnych inicjatyw projektowych powinna wypełnić lukę i uwolnić myśli od wstrzymanego blogowania (przez te lata nauczyłem się patrzeć na problemy jako potencjalne tematy na bloga i często było to irytujące).

Chętnie wysłucham komentarzy, a zainteresowanych moją codzienną aktywnością zapraszam do śledzenia kanału na twitterze jako jaceklaskowski.

Jeśli jest potrzeba na bardziej interaktywny kontakt można rozważyć kanał na IRC, o którym myślałem swego czasu jako sposób na aktywizację polskiej społeczności javowej, której nota bene jesteśmy wszyscy członkami.

Do usłyszenia na twitterze, czy rzadziej tutaj, na blogu Notatnik Projektanta Java EE.

05 maja 2010

Konkurs wydawnictwa Manning na najbardziej ześwirowaną grupę

3 komentarzy
Właśnie się rozpoczął! Jakkolwiek widziałbym wskazanie na Warszawa Java User Group (WJUG), to nie będę miał za złe, jeśli czytelnicy wybiorą swój JUG jako wiodący w konkursie wydawnictwa Manning na najbardziej ześwirowaną grupę użytkowników (ang. Manning's Geekiest User Group Challenge) . Nawet nie musi być to JUG. Do wygrania cenne nagrody - książki, a to wiemy, że w naszej profesji jest bezcenne...do pewnego czasu, oczywiście. Śpieszmy się, bo czas upływa 11 maja.

Zasady są proste: klikamy poniższy obrazek, który przenosi nas do zestawu pytań, w którym z kolei wpisujemy Warszawa JUG w polu What User Group do you belong to? (jeśli jeszcze nie należysz, pora to zmienić). Zatwierdzamy odpowiedzi i (opcjonalnie) zostawiamy ślad w komentarzu do tego wpisu. Do roboty!

Manning's Geekiest User Group Challenge

03 maja 2010

Nauka Java EE 6 CDI (JSR-299) - relacja z lektury pierwszych dwóch rozdziałów specyfikacji

6 komentarzy
Od jakiegoś czasu przymierzam się do Java EE 6 (JEE6), ale ogrom zmian i nowości sprawia mi trochę problemów od czego zacząć. Mam już środowisko programistyczne - NetBeans IDE 6.9 i mam już środowisko uruchomieniowe (wykonawcze) - IBM WebSphere Application Server V8. Możnaby zatem powiedzieć, że mam wszystko, ale baczne oko zauważy, że nie mam najważniejszego - planu rozpoznania zestawu technologicznego, który kryje się pod niewinnie brzmiącym akronimem JEE6. Śmiało można powiedzieć, że nie ma specyfikacji w JEE6, która nie zostałaby zmieniona przez ciało standaryzujące, choćby nieznacznie. A pojawiły się również nowe, chociażby Contexts and Dependency Injection for the Java EE platform (dawniej znanej jako Web Beans, co już po tym kątem może wprowadzać w zakłopotanie). I właśnie od niej postanowiłem zacząć moją naukę, chyba przede wszystkim dlatego, że całkowicie nowa.

Specyfikacja Contexts and Dependency Injection for the Java EE platform (w skrócie CDI) miała swój początek w entuzjastycznym przyjęciu szkieletu webowego JBoss Seam, który stał się jakby domyślnie domem dla implementacji referencyjnej Weld (nota bene doskonale dobrana nazwa związana semantycznie z Seam, bo oba oznaczają mniej więcej "złączanie").

Mam za sobą pierwsze 2 rozdziały specyfikacji - 1. Architecture i 2. Concepts - i raczej, więcej pytań niż odpowiedzi. Mam wrażenie, jakby strona Weld była bardziej składnie pisana niż sama specyfikacja.

Lektura specyfikacji uzmysłowiła mi powód, dla którego warto poznawać nowe specyfikacje bez konieczności ich "odwzorowywania" na zastosowania biznesowe. Przynajmniej nie na etapie jej rozpoznawania. Jeszcze nie tak dawno, pisałem o potrzebie własnego rozwoju technologicznego pod kątem zastosowań biznesowych, w projekcie i dopasowywać rozwiązanie do problemu, a nie odwrotnie. Pamiętam jednak, że ktoś przypominał mi, że jak można dopasowywać coś, czego się jeszcze nie zna?! I tu jest pies pogrzebany. Uczenie się nowych technologii, to nauka technik, których potrzeby moglibyśmy nie być nawet w stanie określić i sprecyzować. Biorąc na warsztat CDI nie mam pojęcia, po co mi alternatives czy stereotypes (pojęcia z CDI), więc jak miałbym przedstawiać je w świetle potencjalnych zastosowań?! W ten sposób znalazłem uzasadnienie dla prezentacji stricte technologicznych, gdzie uczę się samej technologii, po których przyjdzie zastosowanie biznesowe. Pewnie, że możnaby postrzegać listę problem-rozwiązanie jako ułatwienie, ale czy wtedy nasze projekty nie straciłyby na swojej unikalności, gdyby wiadomo było, że skoro mamy projekt X to będzie technologia Y. Nuda. Zresztą mogłoby to wstrzymać postęp, gdyby nie próbować naginać rozwiązań do realizacji swoich wizji. To jest różnica między specyfikacją a książkami, które zwykle prezentują specyfikację przez zastosowania biznesowe, realizując konkretny projekt. Znalazłem tym samym sens istnienia artykułów i prezentacji czysto technicznych jako pierwszy krok wtajemniczenia oraz artykułów i prezentacji będących mieszanką technologii i zastosowania biznesowego jako kolejny etap. Najwyższym etapem wtajemniczenia widzę w świadomym wybraniu tego jednego rozwiązania z wielu dostępnych, często całkowicie niezwiązanych ze sobą. Denerwowało mnie to podczas dotychczasowej lektury specyfikacji CDI, gdzie przedstawiano "jak użyć" bez "po co", ale mając to wyjaśnienie jest mi dużo lżej na duszy :-)

Pierwsze 2 rozdziały specyfikacji CDI, które zajmują niecałe 20 stron, to w zasadzie górnolotne wprowadzenie w temat, które upstrzone jest odnośnikami do kolejnych rozdziałów. Jako podsumowanie rozdziału 1. Architecture możnaby napisać, że nie warto go czytać i od razu można przejść do kolejnego 2. Concepts, który de facto też nie wypada lepiej. Pierwszy rozdział raczej kłopotliwy w zrozumieniu i podpierając się odnośnikami do kolejnych nie zasługuje nawet na miano wprowadzającego. A tyle się mówi o tym, aby nie mieć zbyt dużych oczekiwań, bo można się niemile rozczarować, całkiem niepotrzebnie.

Ważne do zapamiętania jest, aby rozpatrywać CDI jako zbioru uzupełniających się usług, które razem tworzą platformę DI (ang. dependency injection). Brakujące 'C' w nazwie specyfikacji nadaje przestrzeń, w której żyją zarządzane byty - kontekst. Ktoś mógłby powiedzieć, że to Spring Framework i pewnie niewiele by się pomylił (na stan obecnej mojej wiedzy o CDI). Nie potrafię umiejscowić Spring Framework (SF) i Guice w świetle CDI, ale komuś najwyraźniej zamarzyło się posiadanie ich cech na platformie Java EE i skoro znalazł się chętny (zespół JBoss Seam), którego niewielu postrzegało jako konkurent SF, to z CDI zmieni się to zauważalnie.

Mamy więc dobrze określone przestrzenie (ang. context) działania naszych zarządzanych bytów (ang. managed beans) i ot całe CDI. Reszta jest jedynie spisaniem praw i obowiązków programisty oraz środowiska realizującego specyfikację, co biorąc pod uwagę obowiązkowość w Java EE 6, a nawet jej podzbioru Web profile znaczy, że wszyscy muszą realizować tę specyfikację chcąć się mienić zgodnością z JEE6.

Zbiór kontekstów jest rozszerzalny, czyli mamy 3 znane z Java EE obszary - żądanie (ang. request), sesja (ang. session) i aplikacja (ang. application), a z CDI dochodzi kolejny konwersacja (ang. conversation). Chcemy kolejny, np. wspomniany w specyfikacji proces biznesowy, mamy prawo go utworzyć i oczekiwać działania na dowolnym kontenerze CDI.

Zależności są przekazywane (wstrzeliwane) ze względu na tryb uruchomienia aplikacji - rozwojowy czy produkcyjny bez, jak to ujęto, wyrafinowanej konfiguracji.

Integracja z Unified Expression Language (EL) umożliwia użycie CDI z JSF czy JSP, co wyznacza ścieżkę dalszej nauki JEE6 - po CDI warto zajrzeć do zmian w JSF 2.0.

CDI udostępnia również możliwość dekorowania przekazywanych obiektów, definiowania interceptorów i użycia modelu zdarzeń.

Obiekty, które podlegają zarządzaniu przez kontener CDI zawierają ziarna sesyjne EJB3, ziarna zarządzane JSF oraz zasoby JEE. Nazywane są ogólnie ziarnami (ang. beans), a ich instancje związane z kontekstem - instancjami kontekstowymi (ang. contextual instances). Programista określa co i gdzie będzie przekazane przez usługę DI w postaci adnotacji lub deskryptora XML.

Tym samym, dzięki CDI ziarna sesyjne EJB3 mogą być ziarnami zarządzanymi JSF (coś co było możliwe w JBoss Seam, jak i Spring Framework z jego rozszerzeniami).

Aplikacja korzystająca z CDI może działać na platformie Java EE oraz...Java SE. Użycie usług typu transakcje czy utrwalanie (ang. persistence) w CDI na Java SE jest co najwyżej takie, jak dostępne we wbudowanym trybie EJB 3.1. Kolejna specyfikacja na ścieżce poznawania JEE6, po JSF 2.0.

Wszystkie klasy podlegające mechanizmowi wstrzeliwania zależności w JEE6 są możliwe do użycia z ziarnami CDI. W ten sposób, CDI rozszerza dotychczasowe specyfikacje JEE, np. EJB3 o pojęcie kontekstu, spajając specyfikacje prezentacyjne z biznesowymi.

Kontekst wyznacza obszar działania i widoczności. Kontener tworzy instancje obiektów, kiedy są potrzebne, a niszczy, kiedy kontekst kończy swój żywot (pachnie literaturą, więc powinienem był napisać "swoje istnienie").

Adnotacja @Inject określa pole instancji zwane injected field (pole injekcji?), które jest inicjowane przez CDI podczas inicjowania ziarna CDI lub metodę początkową/inicjalną (ang. initializer method) uruchamianą po zainicjowaniu ziarna CDI z wstrzelonymi parametrami (zaraz wysiądę przez te tłumaczenia). Warto zajrzeć do specyfikacji, do sekcji 1.3 Introductory examples, aby przez przykłady poczuć sens specyfikacji. Wyjaśnienia są lakoniczne i raczej technologiczne niż po co i dlaczego.

Rozdział 2. Concepts omawia...następnym razem :-)

02 maja 2010

CleanMyMac oddał 2,6GB i iPlus z Mobile Partner na Snow Leopard

2 komentarzy
To już 5. miesiąc, odkąd siedzę wyłącznie na Mac OS X Snow Leopard i dobrze się bawię, tzn. praca systemu przy 8GB RAMu robi swoje i kiedy chcę uruchomić wirtualny obraz z RHEL z ILOG JRules czy WAS8, to po prostu to robię. Do tego jeszcze kilka innych użytecznych bajerów i mamy kolejnego zadowolonego użytkownika Mac OS (pomijam kwestię ceny, której udało mi się nie odczuć...pracując na firmowym sprzęcie). Nie mam złudzeń, że te wszystkie bajery kosztują i to nie mało. Marzy mi się praca na 27-calowym iMac na i7 z 8GB RAM - tylko ta cena (10k PLN) trochę przygniatająca. Dzisiaj, niedziela, w Warszawie w autoryzowanych salonach Apple w MediaMarkt mamy możliwość jej zbicia przez niepłacenie 22% VAT, więc...

Ostatnio trafiłem na ciekawą funkcjonalność narzędzia Preview (dostępny z systemem), które pozwala na rysowanie strzałek i ramek po prostu tak, jak sobie życzyłem. Od razu skorzystałem z tego "ustrojstwa", kiedy zgłaszałem problem związany z WAS8 i jego obsługą bezdeskryptorowego WARa z Java Servlets 3.0 (część JEE6) - EARless WAR with version="6.0" and application_5.xsd in application.xml.

Brakowało mi tego przez długi czas i jakkolwiek nie kwalifikowałem tego, jako istotna funkcjonalność, teraz jest niezbędna :-) Od teraz będzie tego więcej, bo skoro mam i wiem, jak używać, to dlaczego nie?!

A skoro o moich doświadczeniach z WAS8 i Java EE 6, to zgłosiłem już 3 problemy na forum IBM WebSphere Application Server V8.0 Alpha, co jak na krótki okres ewaluacji mogłoby nie świadczyć dobrze o produkcie. Z drugiej strony, WAS8 jest w fazie ALPHA i odpowiedzi z obejściami nadeszły w przeciągu godzin, więc ogólnie jestem zadowolony. W ten sposób udało mi się uruchomić servlet udekorowany adnotacją @WebServlet (prawie) bez deskryptora web.xml (niestety, ze względu na błąd podczas wdrażania aplikacji webowej minimalny deskryptor jest konieczny). Możliwość połączenia przyjemnego (nauka JEE6) z pożytecznym (praca z WAS8 - produktem mojego pracodawcy) daje mi wiele radości - zawsze tego poszukiwałem i teraz mam do woli. Kiedy przyjdzie do wydania produkcyjnego WAS8, będę wystarczająco przygotowany (wierzę, że przez moje wpisy na blogu, nie tylko ja, więc wdrażanie WASa u klientów będzie sprawniejsze). Jeszcze w czwartek, podczas ostatniego dnia w Turcji, ewaluowałem NetBeans 6.9 i tworzenie aplikacji webowych JEE6 z WAS8, i tak mnie to wciągnęło, że całkowicie przez przypadek zorientowałem się, że mam 1,5h do odlotu samolotu (!) Szybka ewakuacja i trafiłem na lotnisko na chwilę przed zamknięciem stanowiska odpraw. Prawie się spóźniłem na samolot przez tego WASa :} O samych doświadczeniach z WAS8 i JEE6 z NetBeans 6.9 będzie jeszcze niebawem (planuję skrinkasty, ale wiadomo, jak to u mnie bywa z planami - są i nic poza tym najczęściej).

Po powrocie do Polski, w piątek pojawiłem się na chwilę w biurze, aby odebrać modem iPlusa USB Huawei E1750. Jeśli do tej pory mój dostęp do Sieci było ograniczany przez dostępność sieci bezprzewodowych, to teraz obszar i czas dostępu się znacznie zwiększył (ograniczony zasięgiem sieci widocznych dla iPlusa). Brakuje jeszcze, abym miał dostęp do Sieci cały czas, bez względu, gdzie się znajduję, np. zagranicą. W Turcji było z tym znośnie - dostęp był (24h za 10 tureckich lir = około 20 PLN), ale ograniczany prawem tureckim (niedostępność YouTube) i często miałem problemy z podłączeniem. Zamiast udostępnić zabezpieczony punkt dostępowy i po jego konfiguracji byłby spokój, to trzeba było bawić się z uwierzytelnianiem przez przeglądarkę. Ukłon w stronę adminów z hoteli, aby postarali się bardziej (na pewno tych z Holiday Inn Istanbul City).

Wracając do tego nowego cudeńka - modemu iPlusa - na opakowaniu napisano:

Modem USB Huawei E1750 przeznaczony jest zarówno do komputerów stacjonarnych, jak i do laptopów, które spełniają poniższe wymagania:
  • system operacyjny Windows XP lub Windows Vista (w wersji 32 i 64 bity)
  • ...
Idzie się załamać. Pierwsza myśl, to że wtopiłem. I jak tu żyć z takimi dostawcami, którzy nie uszanują woli swoich klientów i wesprą ich w dążeniu do zwiększenia produktywności na jedynych słusznych systemach operacyjnych - Linux czy Mac OS X?! :-)

Zabrałem się za poszukiwania odpowiedzi, czy da się to uruchomić na Mac OS X Snow Leopard. Na oficjalnej stronie dostawcy iPlus na MACu sterowniki są nieaktualne, a opis wystarczająco lakoniczny, aby zniechęcić do skorzystania z usługi. Gdyby ode mnie zależało, to nie poleciłbym jej nikomu, właśnie z powodu ilości informacji. Często zastanawiam się, czy lepsza jest byle jaka wiadomość niż żadna. Zacząłem swoje poszukiwania na sieci i po całym dniu poszukiwań (przerwanym wyjazdem do rodziny na Kujawy) trafiłem na rozwiązanie o...3-ciej na ranem! Wystarczy skorzystać ze sterowników na stronie For Mac OS X 10.6 i zainstalować paczkę MobileConnectDriver(4.16.00.00).zip, aby po chwili cieszyć się pracą w Sieci z iPlusem. Wartościowym był dokument Instrukcja instalacji modemów na MAC OS X Leopard w wersji polskiej (.pdf) ze wspomnianej strony iPlusa mimo, że dotyczył poprzednich wersji. Łącząc sterowniki z Huawei i dokumentację z iPlusa dało oczekiwany efekt.

Dlaczego nie można było zebrać tych wszystkich informacji w jednym miejscu na stronie iPlusa?! Wielokrotnie doświadczam zachowań dostawców, które przekraczają moje możliwości mentalne.

Kiedy udało mi się rozwiązać temat z iPlusem, zabrałem się za inny. Przeglądając dokumentację do modemu Huawei E1750 zauważyłem na jednym ze zrzutów ekranu narzędzie o nazwie CleanMyMac. Narządko do czyszczenia dysku z pozostałości lub nadmiaru zainstalowanego oprogramowania, które już nie jest do użycia (pozostałość), albo nigdy nie będzie, bo oprogramowanie przychodzi z wieloma skompilowanymi bibliotekami na różne platformy (nadmiar). Po kilku próbach zdecydowałem się zakupić licencję i cieszyć się dodatkowymi 2,6 GB wolnej przestrzeni dyskowej dzięki CleanMyMac za 120 PLN (z 22% podatkiem VAT).

Kolejne legalne oprogramowanie, które kupiłem na MacOS, a o którym nie przyszłoby mi do głowy na MS Windows. W zależności od podejścia możnaby to uznać za wadę Maka, albo wręcz przeciwnie jego zaletę, że uczy płacić za używane oprogramowanie, co w przypadku mojej profesji - programista z wyboru, specjalista z rozsądku - jest niebagatelne - w końcu ja sam chciałbym, aby moje produkty były kupowane zamiast jedynie używane. Bądźmy realistami - za coś trzeba żyć. Trzeba płacić, jak się korzysta, bo inni tego nie zrobią za i dla nas.

Mówi się, że nie ma nic za darmo, ale nadchodząca konferencja Javarsovia 2010 26.czerwca w Warszawie taka jednak będzie. Całkowicie bezpłatnie, przy "akompaniamencie" sponsorów, których liczba rośnie z każdym tygodniem. W temat weszły już TouK, Sages, Adobe, Atlassian, SoftwareMill, DobreProgramy.pl, a jeszcze kilku w trakcie negocjacji. Choćby ich obecność będzie gwarantem dobrej zabawy, a kiedy dodać prelegentów z naszej polskiej społeczności javowej będzie cudnie. Planujcie pobyt na wieczór z soboty na niedzielę, a ochotnicy do wystąpienia w roli prelegentów namawiam do zgłaszania tematów - wtedy pobyt w hotelu wliczony (tak przynajmniej jest planowane). Przyszłych prelegentów zapraszam do Call for papers, zakończenie już 8 maja.