29 listopada 2011

85 spotkanie Warszawa JUG o zmianach w Java 7 - Adam z JVM i ja z j.u.c.Phaser

0 komentarzy
Warszawska Grupa Użytkowników Technologii Java (Warszawa JUG)
Zwykłem zapowiadać spotkania Warszawskiej Grupy Użytkowników Javy (Warszawa JUG), ale tym razem było inaczej - zapowiedzi nie było, a spotkanie i tak się odbyło. Jedynym źródłem informacji o spotkaniu, w którym Adam Michalik przedstawił temat "Zmiany JVM w Java 7", a ja wystąpiłem z "java.util.concurrent.Phaser praktycznie", była strona i forum grupy. Okazało się, że wystarczyło, aby przyciągnąć blisko 30 osób, wśród których dało się dostrzec osoby, których dawno nie widziałem. To może być dowodem na to, że grupa (ponownie) przeżywa okres rozwoju i ma się całkiem dobrze. Dodając do tego plany spotkaniowe na kolejne 3 edycje i możnaby wyciągać wnioski o jej (ponownym) rozkwicie. Coraz bardziej skłaniam się ku tezie, że bez niej wiele rzeczy nie byłoby mi dane poznać, a tak 2 godziny i mam podsumowanie - chociażby dzisiaj o Java 7 i invokedynamic.

Chciałbym wierzyć, że moja, dzisiejsza prezentacja była równie dobra merytorycznie i prezentacyjnie jak Adama, który stał się moim wzorem do naśladowania. Znalazłem w jego prezentacji kilka ciekawych elementów, które zamierzam wprowadzić do własnych, publicznych wystąpień. Przede wszystkim slajdy, które zawierały dużą dawkę rysunków. To już nie pierwszy raz, kiedy dostrzegam siłę wyrazu obrazków, rysunków, diagramów, itp. Wszystko, co nie jest tekstem warto rozważyć jako element uzupełniający i uatrakcyjniający prezentację. Dobrym rozwiązaniem byłą agenda w postaci diagramu. I ten stoicki spokój w głosie. Jest z czego, a raczej od kogo, czerpać pomysły. Dzięki Adam!

Gdyby ktoś jeszcze zechciał wyjawić, jak JRuby wykorzystuje invokedynamic, o którym Adam wspomniał, że pojawia się z generowaniem klas, aby było szybciej, byłoby jeszcze cudniej. Albo lepiej - niech to przedstawi na naszym spotkaniu. Dla przyjezdnych mogę zorganizować fundusze związane z przyjazdem.

Około 7 wszedłem na scenę z przedstawieniem java.util.concurrent.Phaser z Java 7. Sądziłem, że od ostatniego razu temat jest już mi bliżej znany na tyle wystarczająco, aby nikt mi nie "podskoczył", ale czy to styl, w którym przedstawiałem podstawy, którym łatwo dotarłem do publiczności, czy to błyskotliwość zebranych, ale nie trwało długo, kiedy moja pewność została mocno nadszarpnięta. W przyjemnej atmosferze padło kilka pytań uzupełniających, które położyły się cieniem na kilka wcześniejszych, moich stwierdzeń o Phaser. Bardzo podobała mi się ta dociekliwość uczestników, którzy jedynie w niewielkim stopniu używali java.util.concurrent - klasy Executor i współbieżne struktury. Zdziwiłem się, że nikt nie korzystał z CountDownLatch czy CyclicBarrier. Zabrakło mi mojego "mentora" z poprzedniego spotkania, który podjął się trudu nakreślenia różnic między CountDownLatch, CyclicBarrier i Phaser, kiedy dało się zauważyć moje braki. Takich ludzi cenię najbardziej. Chciałoby się mieć do nich dostęp częściej.

Jako sukces dzisiejszego spotkania traktuję rozmowę na temat przyszłych wystąpień z osobami, których parkiet WJUGa jeszcze nie gościł. Pozdrowienia dla Michała i Piotra, których zapisałem sobie jako kandydatów. Od razu wziąłem ich adresy mailowe, aby mi nie "uciekli" :)

Prezentacja z mojego dzisiejszego spotkania dostępna jest jako JacekLaskowski-WJUG-j.u.concurrent.Phaser-2011.11.29.pdf.

Zachęcam do dzielenia się swoimi doświadczeniami z poznawania czegoś nowego. Nie trzeba być geek'em, aby prezentacja poszła gładko, a częściej była przyczynkiem do dokładniejszego zgłębiania tematu. Czego mogłem dzisiaj doświadczyć. Daleko mi do znawcy tematu java.util.concurrent, a jednak kilku z uczestników dzisiejszego spotkania pozwoliło mi sądzić, że było to dla nich wartościowe. Wystarczy, abym kontynuował temat. Kolejne odsłony tematu współbieżności w Javie 7 już niebawem.

A teraz pora na Androida i podsumowywanie myśli w temacie mojej prezentacji "RESTful Android - aplikacja androidowa jako klient REST" podczas cracow.mobi w Krakowie. Będzie to moje pierwsze wystąpienie w temacie aplikacji mobilnych na Androida i bardzo chciałbym, aby nie było ostatnim. Jeśli jest coś, co wartoby zaprezentować, rozpracować, czy podobnie, napisz mi na priv. Szczególnie ciekawi mnie, czy jako uczestnik wolał(a)byś więcej kodu czy teorii? I ile to znaczy "więcej"? Niech to będzie przymiarka do najlepszej prezentacji o Androidzie, jaką udało Ci się kiedykolwiek zobaczyć! :)

27 listopada 2011

Łącząc przyjemności - o TDD i spacerze "nagraniowym" z Maksymem

2 komentarzy
Warto czasami przystanąć, zastanowić się i po prostu pomyśleć bez jakichkolwiek zewnętrznych "przeszkadzaczy". Doświadczyłem błogosławieństwa takich chwil niedawno dwukrotnie i nie mogłem uwierzyć, jak niewiele trzeba, aby mieć ich więcej.

Podczas konferencji JDD w Krakowie (czytaj Wrażenia pokonferencyjne - zacznijmy od JDD w Krakowie) miałem przyjemność uczestniczyć w sesji "TDD Coding Dojo" z Krzyśkiem Jelskim i Marcinem Zajączkowskim. Kiedy wracałem do domu pociągiem, a może jeszcze wcześniej, w taksówce, zacząłem zastanawiać się nad słowami Jakuba Nabrdalika, który kiedyś stanowczym tonem stwierdził, że nie da się robić TDD z już gotową aplikacją. Miałem wtedy wrażenie, że Kuba jest tak etycznie upośledzony przez TDD, że jedyną, słuszną drogą dla TDD jest zacząć od testów. Ja jednak bardzo nalegałem na możliwość dopisywania testów do gotowej aplikacji (projekt Apache OpenEJB), aby stworzyć siatkę bezpieczeństwa dla późniejszych prac przy zmianie kodu. Nie pomagał nawet mój wrodzony wdzięk. Po prostu, Kuba kończył taki pomysł stanowczym: "To nie będzie TDD" i tyle mi było z nim rozmawiać. Oj, jaki ja byłem na niego zły za takie potraktowanie. Nie żebym czuł jakąś zadrę do niego za to, ale po prostu nie mogłem zrozumieć, dlaczego to nie przejdzie.

I właśnie podczas powrotu do Warszawy, po sesji z Krzyśkiem i Marcinem, olśniło mnie! Wydaje mi się, że zrozumiałem ideę TDD. Wreszcie połączyłem teorię z praktyką i jakkolwiek nie było tego drugiego wiele, to wystarczyło, abym usnął tezę, która wydaje się zgodna z myśleniem Kuby (!) Nie zapomnę tej chwili, kiedy prawie wykrzyknąłem "Eureka!"

TDD stosujemy jako "zapalnik" zmian w aplikacji. Pojawia się test, nie przechodzi (czerwono), piszemy minimalistyczną implementację, taką, aby jedynie pozwoliła przejść testowi (pojawia się zielone), refaktoring i tak w kółko. Kiedy zastanowić się nad kolejnością zmian w aplikacji - najpierw test, później minimalnistyczna implementacja i tak, aż do znudzenia, to łatwo zrozumieć, że aplikacja ma tyle, aby jedynie/aż przeszły testy. Nic więcej. Jeśli jest więcej, to prawdopodobnie możemy liczyć się z miejscami niepokrytymi testami. Całkiem zrozumiałe, jeśli para programistów jest więcej niż początkująca w temacie programowania i TDD w ogólności.

Weźmy teraz działającą aplikację. Skoro działa, to każdy kawałek kodu, który mógłby wyglądać na potencjalny błąd...NIE jest błędem! Na pewno nie jest nim jeszcze. Gdyby już był, to pojawiłaby się poprawka i...po błędzie. I teraz pora na moje olśnienie - wręcz niemożliwym jest pisanie testów, które objęłyby wszystkie możliwe przypadki do przetestowania dla działającej aplikacji. Słyszałem o narzędziach automatyzujących, które prześwietlając kod wykrywają "zakręty" na if'ach i temu podobnych konstrukcji "rozgałęziających", ale, właśnie, to są automaty. Gdyby pisać je ręcznie, to nigdy nie wiadomo, czy jest ich wystarczająco wiele, aby powiedzieć, że jest ich wystarczająco wiele. Właśnie to odwrócenie zależności między testami a aplikacją jest problemem. Nie można mówić o odwróceniu zależności w przypadku TDD, gdzie zależnością aplikacji są testy. A może na odwrót? Tak czy inaczej, jeśli zakładamy, że dla testu sprawdzającego, czy zwrócono liczbę 5 piszemy kod, który po prostu zwraca 5, to nie ma szansy na pomyłkę. Kod może być dalej pod kątem zaawansowania funkcjonalnego, ale należałoby to odznaczyć jako...nadgorliwość. Oczekujemy 5, to nie ma potrzeby wywoływać usługi RESTowej, która zwraca 5, bo wystarczy zwrócić 5. Proste i oczywiste.

Czy moje zrozumienie TDD jest właściwe? Czy takiego myślenia oczekuje się od praktyków TDD? Chętnie poznam Twoją opinię. W komentarzach jest duuuużo miejsca na dywagacje.

Kolejnym momentem, w którym doświadczyłem momentu olśnienia był dzisiejszy spacer z Maksymem. Kolejny samotny spacer przez 1,5-2h to nie przelewki. Łazisz po utartych ścieżkach Lasu Kabackiego i tak idziesz, i idziesz, i idziesz. Można kota dostać.

Z drugiej strony, kilka dni temu odznaczyłem sobie kilka nagrań z konferencji do odsłuchania i wcale mi się nie uśmiechało odsłuchiwanie ich podczas siedzenia w domu. Każdorazowo, kiedy próbowałem usiąść nad nimi w domu, zawsze pojawiało się zniecierpliwienie i w ogóle ogólna niechęć do ślęczenia przed kompem i gapienia się w monitor z założonymi rękoma. Nuda. Nosiło mnie moje wewnętrzne ADHD. 30 minut jeszcze dam radę słuchać, ale więcej?! Nie ma mowy! No i jeszcze mógłbym nie usłyszeć Maksyma, kiedy się obudzi i daje znać o tym wszem i wobec!

I tak dzisiaj przypomniałem sobie o tych nagraniach i idąc Lasem Kabackim włączyłem Language Panel o językach programowania. Byłem ciekaw, co też tam Ci myśliciele mówią o językach. Skoro i tak miałem ponad godzinę czasu na spacer, to przecież mogłem go spędzić łącząć przyjemne z pożytecznym.

I tak ze słuchawkami na uszach (głos) i smartfonem w nogach Maksyma (wizja) zeszło mi przyjemnie 40 minut. Las gwarantował spokój, brak zewnętrznych przeszkadzaczy i wiatru, który szalejąc na osiedlu tutaj zanikł kompletnie. Przyjemna sprawa.

Początkowo planowałem godzinny spacer, ale kiedy minęło mi 40 minut, stwierdziłem, że pozwolę sobie na dłuższy spacer i...ponad godzinne nagranie Clojure and the Web. Nie polecam tego nagrania, ale dla napaleńców może być ciekawym podsumowaniem zalet Clojure (przez pierwsze 20 minut) oraz przegląd szkieletów webowych w Clojure z praktycznym przeglądem Ring w drugiej części.

Po 2,5 godzinach wróciłem do domu wyjątkowo zadowolony (!) Maksym przez całą drogę spał smacznie, ja przejrzałem 2 nagrania, co dało nam obu sporą dawkę świeżego (?) powietrza, a reszta rodzinki odetchnęła na jakiś czas od Maksyma. Już nie mogę doczekać się kolejnego spaceru! Co proponujecie do obejrzenia? Może coś w tematyce TDD? Zastanawiam się, czy pomysł odsłuchiwania na mrozie wypali. Ale w końcu i w Norwegii używają Galaxy S2, a tam ciągle zimno.

25 listopada 2011

Wrażenia pokonferencyjne - zacznijmy od JDD w Krakowie

3 komentarzy
Właśnie mija tydzień, w którym miałem przyjemność uczestniczyć w dwóch konferencjach - JDD w Krakowie, w dniach 21-22.11 oraz Eclipse DemoCamp w Poznaniu późnym wieczorem 24.11, żeby nie napisać w nocy.

Obie pozwoliły mi zorientować się w znaczeniu budowania społeczności i konieczności dzielenia się wiedzą. Obawiam się jednak, że to podsumowanie w minimalny tylko sposób będzie odzwierciedleniem moich wrażeń, ochów i echów dla formuły i osób w nich uczestniczących. Klimat obu był wspaniały, aczkolwiek jeden niepodobny do drugiej.

Zacznijmy od JDD 2011...

Do Krakowa zajechałem około 11:00 w poniedziałek. Na hotelu, gdzie odbywała się konferencja, rozwieszono banery konferencyjne (ważna rzecz i do wdrożenia przy kolejnych konferencjach). Wpadłem na Krzyśka Jelskiego, z którym zamieniłem więcej niż trochę słów, aby po kilku kwadransach spotkać Grześka Dudę i Andrzeja Targosza. Później przygotowania do panelu dyskusyjnego ze Sławkiem Sobótką, Andrzejem Grzesikiem i świeżo poznanym Piotrkiem Buckim. Ach, zapomniałbym o Ani Kołodziejczyk. Wybacz Aniu. Na początku rozmowa szła niemrawo, aby, po chwili, przygotowania do panelu przerodziły się w aktywną dyskusję, w której z łatwością można było wskazywać strony, które zajmują rozmówcy. W pewnym momencie wręcz wszyscy "usiedli" na Piotrze. Myliłby się ten, kto pomyślałby, że ciężko jemu było - wyglądało wręcz, jakby większa liczba oponentów tylko go podsycała do dyskusji.

Panel przebiegł...rozmownie. Trochę zabawnie, trochę niemrawo, ale na pewno tłumnie. Sala wypełniona była po brzegi. Czasami dało się odczuć pewne zakłopotanie brakiem aktywności po stronie uczestników, ale zasługą moderatora - Andrzeja Targosza - towarzystwo się rozgrzało i kiedy panel dobiegał końca bez trudu można było zauważyć większe niż przeciętne zaangażowanie wszystkich w dyskusję. Uważam, że ułatwieniem przy pokonywaniu barier publicznego przemawiania było wprowadzenie metody na przedstawienie się, aby w odpowiedzi usłyszeć przedstawienie się rozmówcy i czasami gromki śmiech sali - coś w deseń: "Jak się nazywasz?", na co rozmówca odpowiadał swoim imieniem, np. "Cześć, jestem Maksym", aby po chwili usłyszeć w odpowiedzi "Cześć Maksym, jestem Jacek", co on kwitował "Cześć Jacek!" Coś w ten deseń. Uważam, że te wprowadzające gierki słowne znacząco rozluźniały atmosferę i pomagały rozmówcom. Wiele osób później wyraziły swój zachyt połączony ze zdumieniem, że zorganizowano panel i że interesują nas potrzeby uczestników odnośnie kolejnych edycji konferencji w Polsce. W międzyczasie padało kilka pytań, na które publika proszona była odpowiadać podniesieniem ręki w górę i co najbardziej utkwiło mi w pamięci, to moment, kiedy na pytanie o powód uczestniczenia w konferencji, kiedy padło "Czy poznanie nowego było powodem udziału?" wszyscy, jak jeden mąż, podnieśli do góry rękę. Na naszych twarzach musiało wymalować się ogromne zdziwienie reakcją publiczności. Wcześniejsze pytania kończyły się zwykle kilkoma rękoma w górze, a tu pytanie i...zrobiło się tłoczno w górze. Niezwykłe doświadczenie móc to zobaczyć.

Później obiad, który przeciągnął się przez cały następny wykład, który przegadałem z dopiero co poznanymi osobami.

Na wykład Erika Jan de Wit'a "Scrum – następca modelu kaskadowego" wszedłem z lekkim spóźnieniem. Podobały mi się slajdy, które zwracały uwagę swoją skromnością, a w połączeniu z ostrym światłem projektora, przykuwały oko wyrazistością i dużym kontrastem bieli z odpowiednio dobranym czerwonym (gość pracuje w Canoo, co powinno tłumaczyć dobór kolorów). Muszę wdrożyć ten szablon u siebie w jakieś formie. Dowiedziałem się, że Scrum jest "quick response to change" (co zwykle jednak wiązałem z Kanbanem, o którym za moment, ale teraz sądzę, że to domena każdej z praktyk wytwarzania oprogramowania). Prelegent nie musiał zachęcać do dyskusji i było jej znacznie więcej niż przewidywał. Często wyczuć można było pewne zagubienie we własnych slajdach. 30 minut byłoby jednak bardziej właściwym czasem na to wystąpienie, bo ostatni kwadrans przesiedziałem jak na szpilkach nie mogąc doczekać się końca. Zbyt monotonne i wyłącznie tekstowe prezentacje nie spełniają moich oczekiwań i szybko tracę skupienie.

Kolejny wykład to prezentacyjna porażka. Miałem dosyć po Eriku tego siedzenia i słuchania o Scrumie, kiedy to Paweł Brodziński rozpoczął "Scrum, Kanban i inne opowieści". Pierwsze 15 minut - nic do zarzucenia. Czytam regularnie wpisy Pawła na jego blogu, więc te 15 minut wynikają z dużej dozy zaufania, że cokolwiek nie powie, prezentacja musi być dobra. I w zasadzie była, ale sposób mówienia po angielsku był dobijający. Spokojny ton, prawie senny, z perfekcyjnie dobieranymi i wymawianymi słowami sprawiały, że ledwo dawałem radę utrzymać się na krześle. Paweł dobrze wpasowywał się w kolejne slajdy tak, że nie widać było, czy tak dobrze je zna, czy zerka na nie ukratkiem nie dając tego po sobie poznać. Jako prezenter znający tematykę i przygotowane materiały Paweł dostaje najwyższe noty. Jednak ton przekazania i to chodzenie w kółko - kompletne fiasko. Zbyt wiele gadania, za mało zachęt do angażowania publiki w dyskusję i to oddzielanie każdego słowa. Ledwo wytrwałem do końca. Ucieszyłem się, kiedy padło "Thanks!" Ja jemu też very "Thanks!" i klaskałem bodaj najgłośniej (w końcu koniec!)

Za cel podczas przerw wziąłem sobie poznawanie uczestników. Próbowałem minimalizować rozmowy w grupie, którą znam, aby móc pogadać z nieznajomymi. Tak dowiedziałem się o oczekiwaniach uczestników do wystąpienia Moniki Koniecznej. Kogokolwiek nie zapytałem, wszyscy wskazywali na jej wykład jako kolejny, w który po prostu nie można nie być. Okazało się później, że myliłem Monikę z Patrycją Węgrzynowicz i Holly Cummins. I dobrze, że mnie poprawiono. Jak później z nią rozmawiałem, dowiedziałem się, że nosiła dredy, więc faktycznie mogłem ją pomylić z Holly bez problemu. W ten sposób zrezygnowałem z Andrew Rubingera "Testowanie w środowisku Java Enterprise". Duża interakcja z publiką, gry i zabawy, slajdy w postaci zdjęć z niewielką dawką tekstu sprawiły, że wciągnąłem się. Jednak i tu straciłem cierpliwość, bo ostatnie 15 minut patrzyłem na zegarek, kiedy to lekki merytorycznie temat zaczął mnie nużyć. Monika, co przyznała później w rozmowie, wytraciła poczucie czasu i ostatni kwadrans był bolesną walką z czasem.

Na prezentację Venkata Subramaniama znowu nie dotarłem, bo kolidowała z innymi, ciekawymi (?) wykładami. Z perspektywy żałuję, ale i tak nie odmówiłem sobie zamienić z nim kilku słów na temat prezentacji. Planowałem wręcz zagadnąć go podczas przerw, na co zgodził się z pewnym zachwytem, ale nie dane mi było. Postanowiłem jednak, że po tylu zachwytach publiczności jego wystąpieniami, kolejnym razem obowiązkowo muszę wziąć udział w jednym. Podobnie ze Sławkiem Sobótką. Wszyscy jacyś nawiedzeni z Venkatem i Sławkiem?! Jakieś ogólne pranie mózgu?! Gdzie, kogo by nie zapytać, bez wahania wskazują na ich wystąpienia jako takie, których nie można nie odwiedzić. A ja właśnie pchnąłem się ku temu występkowi. Jakaś mania uwielbienia dla Sławka i Venkata?! Oszaleli, czy co?!

Wieczorem, wspólnie z Jackiem Lisem i Tomkiem zjedliśmy pizzę, aby na 21:00 trafić do klubu na Kazimierzu, w którym odbywała się impreza konferencyjna. Miejsce ciekawe, ale zdecydowanie odradzałbym tam organizowanie pogadanek. Za głośno. Podczas panelu dyskusyjnego padła propozycja, aby omawiać pewne tematy z większą uwagą - ciągła integracja, Scala, NoSQL i środowiska automatycznego budowania. Tematy zostały przypisane do miejsc w klubie i kiedy zobaczyłem salę VIP Room z napisem "Scala", nie miałem złudzeń, które drzwi otworzyć. Niestety, rozmów tam o Scali jak na lekarstwo i jedynym połączeniem między miejscem a Scalą była...nazwa miejsca. Pokój przypominał miejsce schadzek - czerwony, z niedużą leżanką-tapczanem, stacjami z plejakami i dużym telewizorem. Ludzie grali, rozmawiali i widać było, że można było w tym miejscu faktycznie składnie porozmawiać - muzyka nie była tak uciążliwa, jak w innych częściach klubu. Tam przegadałem cały wieczór, aby o północy zwinąć się do hotelu. Pozdrowienia dla studenta z Wrocławia oraz programistek od EJB 2.1 i JBoss 5 z TeleU :-) Bardzo ciekawa rozmowa!

Drugi dzień to "TDD Coding Dojo" z Krzyśkiem Jelskim i Marcinem Zajączkowskim. Dzień wcześniej rozmawiałem z Krzyśkiem, jak będzie przebiegało Dojo i kiedy dowiedziałem się o publicznym programowaniu trochę mnie zmroziło. Przekonanie, że nie jestem gotów do publicznych prezentacji programowania na żywo, jakoś znacząco zaczęło wpływać na moją decyzję, ale ciekawość wzięła górę. Mimo wszystko nie mogłem doczekać się, aby doświadczyć tego na własnej skórze. Niezwykle żywe programowanie w tłumie, gdzie dwie osoby siedząc przed kompem programowało minesweeper'a przy akompaniamencie gapiów z sali. Co 7 minut zmiana jednego "parzysty" i tak do południa. Cudo! Obiecuję sobie więcej tego typu wydarzeń z moim udziałem.

Konferencja pierwsza klasa i życzę każdemu tak owocnych wyjazdów. Nagrodą jest możliwość poznania ludzi z branży i zawsze, ale to zawsze, zwiększenie wiedzy w temacie - niechby nawet niekoniecznie javowym, ale wciąż z obszaru wytwarzania oprogramowania.

17 listopada 2011

Przyszły tydzień konferencyjnie - JDD 2011 w Krakowie i Eclipse DemoCamp w Poznaniu

0 komentarzy
Maksym rozwija się znakomicie. Stuknęło mu 6 tygodni i nie tylko, że zaczął przekręcać głowę z lewa na prawo (z przewagą skierowania na lewo), to zaczął się uśmiechać i reaguje na znajome głosy i zachowania (dorosłych, głównie rodziców, którzy wierzą i brną w zaparte, że te milusie słówka są przyjemniejsze dla ucha malca).


Maksym uśmiecha się, regularnie ogłasza pobudkę około 6:45 (z przewagą godzin wcześniejszych - akurat na ranne bicie dzwonów o 6:30!) i kiedy się złości bardzo intensywnie rusza nogami - najpierw lewą, aby przy udziale prawej być na prawdę zły. Doskonała zabawa to rozpoznawanie jego zachowań - podobne do rozpoznawania działającego oprogramowania bez dokumentacji :)

JDD w Krakowie - 21-22 listopada 2011


Poniedziałek i wtorek jestem w Krakowie na konferencji JDD 2011, w której biorę udział jako uczestnik panelu dyskusyjnego Welcome to Javaland. Za stroną konferencji:
"W czasie konferencji JDD odbędzie się panel dyskusyjny, w trakcie którego zaproszeni goście: Jacek Laskowski, Grzesiek Duda, Andrzej Grzesik, Anna Kołodziejczyk i Andrzej Targosz rozmawiać będą na temat historii rozwoju konferencji i społeczności Java w Polsce. Opowiemy o tym jak doszło do zorganizowania pierwszej imprezy, jak się rozwijały kolejne inicjatywy oraz jaka jest przyszłość spotkań Javy w naszym kraju.

Odpowiemy na pytania dlaczego ważne jest organizowanie w Polsce technicznych konferencji, jak to się stało, ze bez wsparcia jednej mocnej firmy udało się doprowadzić do tak dynamicznego rozrostu społeczności Java w Polsce oraz dlaczego istnienie kilku podobnych eventów równolegle ma sens. Wspólnie zastanowimy się co zrobić, aby zwiększyć ilość uczestników zagranicznych w kolejnych konferencjach oraz co wyróżnia nasze imprezy na mapie Europy."
Trudno mi powiedzieć, czy na miejscu uczestników konferencji cieszyłbym się z takiego "wypełniacza" (szczególnie, że alternatywy nie ma), ale zapytany o udział, od razu się zgodziłem, bo uważam, że wciąż zbyt mało osób udziela się publicznie pro publico bono. Liczę na aktywny udział uczestników konferencji.

Później już w roli uczestnika konferencji zamierzam wziąć udział w prezentacji Tomasza Kowalczewskiego z "Domknięcia w Javie", Erika Jan de Wit'a "Scrum – następca modelu kaskadowego", Pawła Brodzińskiego, którego wpisy na blogu czytam z zapałem, z "Scrum, Kanban i inne opowieści", aby na koniec usiedzieć przy Andrew Rubinger'ze z "Testowanie w środowisku Java Enterprise". Jakoś tak wyszło, że wszystkie z prezentacji będą po angielsku, a tematy są po polsku :)

Drugi dzień chciałbym poświęcić na dokształcanie w temacie TDD z udziałem Krzysztofa Jelskiego i Marcina Zajączkowskiego, którzy poprowadzą "TDD Coding Dojo".

Eclipse DemoCamp w Poznaniu - 24 listopada 2011



W czwartek, 24 listopada, pojawię się wieczorem z tematem "Java EE 6 with WebSphere AS 8 and Rational Application Developer 8" w Poznaniu na Eclipse DemoCamp. Kto jednak chciałby słuchać o Java EE 6, od kiedy stała się wręcz trywialna w użyciu?! Dla wytrwałych będę miał więc niespodziankę w postaci...OSGi Blueprint. Zobaczymy, co WAS8 potrafi uruchomić, a RAD8 stworzyć w tym obszarze. Będzie to dla mnie świetna okazja, aby odświeżyć sobie temat Enterprise OSGi z OSGi Blueprint z Apache Aries w IBM WebSphere Application Server V8.

Zastanawiam się, czy całkowicie zaniechać slajdów na rzecz prezentacji aplikacji, które omówię korzystając z RAD V8 i uruchomię na WAS V8?! Godzina na tego typu cyrki nigdy nie kończy się na godzinie i zostaje tylko niesmak niedopowiedzenia. Przy godzinie uważam, że nie ma co liczyć na wiele, więc pewnie skończy się na slajdach, aby po 45 minutach zachęcić do pytań. Obym nie zapomniał, że moje wystąpienie zaplanowane jest na 9 w nocy!

15 listopada 2011

Enterprise OSGi? OSGi Blueprint? To może Karaf z Aries?

7 komentarzy
Trzeba mi było dyskusji z Łukaszem Dywickim (@ldywicki) na twitterze, abym zrozumiał, jak niewiele trzeba, aby OSGi zrzuciło z siebie czar tajemniczości. Całkowicie. Dzięki Łukasz!

Ostatnio, jeśli mówi się o OSGi to raczej w jego wydaniu korporacyjnym, której celem jest połączenie ze standardami spod sztandaru Java EE, tj. Enterprise OSGi. Pisałem o tym niejednokrotnie na blogu. Niejednokrotnie mówiłem o tym na konferencjach oraz "popełniłem" jeden artykuł w temacie - Enterprise OSGi runtime setup with Apache Aries Blueprint.

Teraz jednak okazuje się, że sprawa jest jeszcze bardziej prosta niż mi się poprzednio wydawało. Nie trzeba specjalnych kwalifikacji do zestawienia środowiska Enterprise OSGi. Wystarczy Apache Karaf i sprawa staje się niezwykle trywialna (jeśli założyć, że nauczenie się jego specyficznych poleceń wpasowuje się w to określenie).

Instalacja Karaf sprowadza się do rozpakowania odpowiedniej dystrybucji. Prościzna.

Uruchamiamy Karaf poleceniem bin/karaf. Są inne sposoby i zainteresowanych odsyłam do "producenta".
jacek:~/apps/karaf
$ ./bin/karaf 
        __ __                  ____      
       / //_/____ __________ _/ __/      
      / ,<  / __ `/ ___/ __ `/ /_        
     / /| |/ /_/ / /  / /_/ / __/        
    /_/ |_|\__,_/_/   \__,_/_/         

  Apache Karaf (2.2.4)

Hit '' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '' or 'osgi:shutdown' to shutdown Karaf.
Jak instruuje początkowy ekran, wystarczy skorzystać z tabulacji i/lub polecenia help, aby dowiedzieć się wiele o poszczególnych poleceniach. Dodatkowo, w większości (wszystkich?) przypadków sama nazwa polecenia powinna wyjaśnić przeznaczenie.

Weźmy chociażby polecenie features:list (nie zapominamy o tabulacji po pierwszych literach!)
karaf@root> features:
features:addurl              features:info                features:install             features:list
features:listrepositories    features:listurl             features:listversions        
features:refreshurl          features:removerepository    features:removeurl           features:uninstall
karaf@root> features:list
features:list                features:listrepositories    features:listurl             features:listversions
karaf@root> features:list
State         Version           Name                          Repository             Description
[uninstalled] [2.2.4          ] karaf-framework               karaf-2.2.4            
[uninstalled] [2.5.6.SEC02    ] spring                        karaf-2.2.4            
[uninstalled] [2.5.6.SEC02    ] spring-web                    karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring                        karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-aspects                karaf-2.2.4            
[uninstalled] [1.2.1          ] spring-dm                     karaf-2.2.4            
[uninstalled] [1.2.1          ] spring-dm-web                 karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-instrument             karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-jdbc                   karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-jms                    karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-struts                 karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-test                   karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-orm                    karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-oxm                    karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-tx                     karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-web                    karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-web-portlet            karaf-2.2.4            
[uninstalled] [2.2.4          ] wrapper                       karaf-2.2.4            
[uninstalled] [2.2.4          ] obr                           karaf-2.2.4            
[installed  ] [2.2.4          ] config                        karaf-2.2.4            
[uninstalled] [7.4.5.v20110725] jetty                         karaf-2.2.4            
[uninstalled] [2.2.4          ] http                          karaf-2.2.4            
[uninstalled] [2.2.4          ] war                           karaf-2.2.4            
[uninstalled] [2.2.4          ] kar                           karaf-2.2.4            
[uninstalled] [2.2.4          ] webconsole-base               karaf-2.2.4            
[uninstalled] [2.2.4          ] webconsole                    karaf-2.2.4            
[installed  ] [2.2.4          ] ssh                           karaf-2.2.4            
[installed  ] [2.2.4          ] management                    karaf-2.2.4            
[uninstalled] [2.2.4          ] eventadmin                    karaf-2.2.4            
[uninstalled] [2.2.4          ] jasypt-encryption             karaf-2.2.4            
[uninstalled] [0.3            ] transaction                   karaf-enterprise-2.2.4 OSGi Transaction Manager
[uninstalled] [0.3            ] jpa                           karaf-enterprise-2.2.4 OSGi Persistence Container
[uninstalled] [0.3            ] jndi                          karaf-enterprise-2.2.4 OSGi Service Registry JNDI access
[uninstalled] [0.3            ] application-without-isolation karaf-enterprise-2.2.4
Jak rozumiem istotę features w Karaf to nic innego jak zestawy funkcjonalne - zbiór pakunków, które razem tworzą pewną funkcjonalną całość. Prześwietlmy sam karaf-framework (ponownie nie zapominamy o tabulacji!)
karaf@root> features:
features:addurl              features:info                features:install             features:list
features:listrepositories    features:listurl             features:listversions
features:refreshurl          features:removerepository    features:removeurl           features:uninstall
karaf@root> features:in
features:info       features:install
karaf@root> features:info kar
kar               karaf-framework   
karaf@root> features:info karaf-framework 
Description of karaf-framework 2.2.4 feature
----------------------------------------------------------------
Feature has no configuration
Feature has no configuration files
Feature has no dependencies.
Feature contains followed bundles:
  mvn:org.ops4j.pax.url/pax-url-mvn/1.2.8
  mvn:org.ops4j.pax.url/pax-url-wrap/1.2.8
  mvn:org.ops4j.pax.logging/pax-logging-api/1.6.3
  mvn:org.ops4j.pax.logging/pax-logging-service/1.6.3
  mvn:org.apache.felix/org.apache.felix.configadmin/1.2.8
  mvn:org.apache.felix/org.apache.felix.fileinstall/3.1.10
  mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.asm/3.3_2
  mvn:org.apache.aries/org.apache.aries.util/0.3
  mvn:org.apache.aries.proxy/org.apache.aries.proxy/0.3
  mvn:org.apache.aries.blueprint/org.apache.aries.blueprint/0.3.1
  mvn:org.apache.karaf.shell/org.apache.karaf.shell.console/2.2.4
  mvn:org.apache.karaf.shell/org.apache.karaf.shell.osgi/2.2.4
  mvn:org.apache.karaf.shell/org.apache.karaf.shell.log/2.2.4
  mvn:org.apache.karaf.shell/org.apache.karaf.shell.packages/2.2.4
  mvn:org.apache.karaf.shell/org.apache.karaf.shell.commands/2.2.4
  mvn:org.apache.karaf.shell/org.apache.karaf.shell.dev/2.2.4
  mvn:org.apache.karaf.jaas/org.apache.karaf.jaas.config/2.2.4
  mvn:org.apache.karaf.jaas/org.apache.karaf.jaas.modules/2.2.4
  mvn:org.apache.karaf.jaas/org.apache.karaf.jaas.command/2.2.4
  mvn:org.apache.karaf.features/org.apache.karaf.features.core/2.2.4
  mvn:org.apache.karaf.features/org.apache.karaf.features.command/2.2.4
  mvn:org.apache.karaf.features/org.apache.karaf.features.management/2.2.4
  mvn:org.apache.karaf.management/org.apache.karaf.management.server/2.2.4
  mvn:org.apache.aries.jmx/org.apache.aries.jmx/0.3
  mvn:org.apache.aries.jmx/org.apache.aries.jmx.blueprint/0.3
I od razu wiadomo z czego składa się taka kompletna funkcjonalnie całość. Bystre oko dostrzeże tam Apache Aries Blueprint (mvn:org.apache.aries.blueprint/org.apache.aries.blueprint/0.3.1).

Nie pozostaje nic innego jak sprawdzić działanie Aries Blueprint z przykładowym projektem z...Aries Blueprint. Korzystamy z pomocy Karaf, aby zainstalować pakunek z repozytorium mavenowego - wystarczy skorzystać z polecenia install i odpowiedniego adresu z mvn na przodzie.
karaf@root> install -s mvn:org.apache.aries.blueprint/org.apache.aries.blueprint.sample/0.3.1
Bundle start
Bundle ID: 49
karaf@root> ======== Initializing Foo =========
Service registration notification: 5 -1 707063160: Hello FooBar
org.apache.felix.framework.BundleContextImpl@5e6276e5 [a list element, 5] PLN
Fri Apr 17 00:00:00 CEST 2009 {osgi.service.blueprint.compname=foo, key=value}
Działa! I nie trzeba było wiele. Wystarczy Karaf. Spróbuj sam, a przekonasz się, że "zaawansowane" nie musi oznaczać "niedostępne".

Teraz skoro środowisko jest już zestawione, nie ma już wymówek na brak wiedzy do poznania Enterprise OSGi z kontenerem OSGi Blueprint w roli głównej. Jeśli Spring Framework daje Ci wiele radości, to w połączeniu z OSGi może być jej jeszcze więcej.

Czy pracujesz już z Karaf? A może również i Aries albo Spring-DM? Jakie wrażenia? Jest coś ciekawego, co powaliło Cię na kolana? Chętnie wsłuchałbym się w głos praktyka.

12 listopada 2011

Płynny interfejs java.nio.file.attribute.AclEntry.Builder w Java 7

4 komentarzy
Trudno stwierdzić, jak wiele jest tych ciekawostek w Java 7 pod kątem wzorców użytych do rozbudowy API, ale trafiłem dzisiaj na java.nio.file.attribute.AclEntry.Builder, który zbudowany jest w oparciu o warte wzmiankowania konstrukcje programistyczne - wzorzec Budowniczy z tzw. "fluent interface" (często tłumaczone dosłownie jako "płynny interfejs"), czyli techniką konstruowania klas tak, aby metoda zwracała instancję obiektu, dla której została wywołana. W ten sposób możemy wywoływać metody, jedna po drugiej, przez ich łączenie.

Jakkolwiek wątpię, abym często obcował z AclEntry i jej pobratyńcami, to cieszę się, że pojawiła się ta klasa, która uważam, że spopularyzuje ten sposób budowania API w Javie.

Skoro rysunek może zastąpić 1000 słów, to może przykładowy kod z AclEntry.Builder również?
package pl.japila.java7.nio2;

import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.attribute.AclEntry;
import java.nio.file.attribute.AclEntryFlag;
import java.nio.file.attribute.AclEntryPermission;
import java.nio.file.attribute.AclEntryType;
import java.nio.file.attribute.UserPrincipal;
import java.nio.file.attribute.UserPrincipalLookupService;

public class AclEntryDemo {

     public static void main(String[] args) throws IOException {
          // who...
          UserPrincipalLookupService principalLookupService =
              FileSystems.getDefault().getUserPrincipalLookupService();
          UserPrincipal principal = principalLookupService.lookupPrincipalByName("jacek");
          System.out.printf("Principal: %s %n", principal);
         
          // ...does what.
          AclEntry aclEntry = AclEntry.newBuilder()
                    .setType(AclEntryType.ALLOW)
                    .setPrincipal(principal)
                    .setPermissions(AclEntryPermission.LIST_DIRECTORY)
                    .setFlags(AclEntryFlag.DIRECTORY_INHERIT)
                    .build();
          System.out.printf("ACL Entry: %s %n", aclEntry);
     }

}
Niezłe, co? A to wszystko dostępne w Java 7.

Przy okazji, warto zajrzeć na blog pragmatists.pl, w którym Paweł Lipiński przedstawił temat we wpisie Płynne interfejsy.

Czy ma ktoś pomysły, gdzie użyć AclEntry i jej podobych? A może już jest w użyciu u Ciebie? Jakie zastosowanie? Zachęcam do podzielenia się doświadczeniami, których mi zauważalnie brakuje.

10 listopada 2011

Level 2 Certified IT Specialist decyzją komisji certyfikacyjnej IBM CEE/MEA

2 komentarzy
Panie i Panowie, Ci mali i Ci duzi, Ci mniej i Ci bardziej doświadczeni, i tak dalej, i tym podobne.

Właśnie otrzymałem od komisji certyfikacyjnej w IBM mail następującej treści:

"Decision of the CEE/MEA IT Specialist Level 2 Certification Board

Dear Jacek

It is my pleasure to inform you about the positive decision of the CEE/MEA IT Specialist Certification board who is herewith approving your IT Specialist Level 2 Certification.
You may now use the title Level 2 Certified IT Specialist. This title is independent of your position (i.e.band) and indicates that you are certified in the IT Specialist profession.

I wish you much success in your professional career in the future.

Best regards

Franziska Feller
IT Specialist Profession Leader Northeast IOT & CEE/MEA
IT Architect Profession Leader CEE/MEA & ALPS"


Tłumacząc na polski - z dniem dzisiejszym przechodzę na wyższy level zgodnie ze ścieżką rozwoju profesjonalnego w IBM.

Założeniem programu certyfikacyjnego jest uhonorowanie dążeń pracowników IBM do profesjonalnego wykonywania zadań w duchu poszanowania zasad etyki zawodowej. Brzmi trochę wyniośle i może aż nadto patetycznie, ale w założeniu ma prowadzić do wyróżnienia osób, którym nie trzeba mówić, a które mówią i którym nie trzeba pokazywać, a które pokazują. W pakiecie kandydat opisuje, dlaczego jego udział w projekcie miał wpływ na niego (projekt nie kandydata). Mimo, że przez długi czas bojkotowałem ten proces (trochę ukrywając przy tym swoją obawę o brak kwalifikacji), aby ostatecznie ulec zachętom.

12 września 2011 wysłałem pakiet - dokument podsumowujący moją działalność przez ostatnie 5 lat, co pozwoliłem sobie na upublicznienie we wpisie Pakiet certyfikacyjny na specjalistę IT wysłany. Do zebrania komisji dzieliły mnie 3 wywiady z innymi IBMerami, którzy takie miano już posiadają - 2 polaków i jedna osoba z RPA. Oni to podczas komisji certyfikacyjnej uchwalają "zdatność" kandydata do przyjęcia tytułu. W moim przypadku odbyło się zgodnie z moimi oczekiwaniami! Pamiętam jednak, że wywiady (swego rodzaju rozmowy kwalifikacyjne) nie były dla mnie lekkie. Miałem nieodparte wrażenie, że ogólne postrzeganie jest takie, że za mało w nim konkretnych zasług projektowych, które mogłyby uzasadniać moje aspiracje. Nie chodziło o podparcie ich certyfikatami produktowymi czy po prostu wykonywaniem swoich obowiązków, ale nietuzinkowymi "zagraniami", które mogłyby wyróżniać mnie z tłumu. Okazało się jednak, że było w tym pakiecie wystarczająco wiele, aby się obronił i pozwolił mi na dzisiejsze świętowanie.

Jest to swego rodzaju podsumowanie mojej pięcioletniej działalności w IBM i jestem niezwykle dumny móc pochwalić się tytułem. Od tej pory jestem jego orędownikiem :)

Więcej o programie certyfikacyjnym na stronie Welcome to the Open CITS Certification web site.

08 listopada 2011

Eclipse DemoCamp 2011 w Warszawie innymi słowy

9 komentarzy
2 tygodnie temu...świeżo po warsjawie 2011.

Pada pomysł zorganizowania Eclipse DemoCamp (EDC) 2011 w Warszawie. Były urodziny Eclipse, pojawiła się Java 7, jest potrzeba zorganizowania inauguracyjnego spotkania Warszawa JUG - robimy EDC. Nagłaśniam temat na forum WJUGa. Zgłaszają się prelegenci - Piotr Chmielewski z JavaFX, Paweł Cesar Sanjuan Szklarz z G1 i ja z java.util.concurrent w Java 7.

Jakoś tak w tym samym czasie...

Kontaktuje się ze mną firma mLife. Chcą wejść we współpracę z grupą WJUG. Świetnie się składa, myślę. Proponuję udział w sponsorowaniu EDC. Przyjmują. Mam kaskę na pizzę. Na napoje również. Mam wszystko! Jestem Panem wszechświata. Ponosi mnie.

Rozpoczynam rejestrację. Czekam na poniedziałek, aby wyliczyć zamówienie pizz. Wychodzi 80 zarejestrowanych. Piszę do pizzerii - Da Grasso. Podobno nieciekawy wybór, ale co mi tam - pizza to pizza. Nie mam do tego głowy.

Dzwonię do pizzerni. Szast, prast i mam zamówienie. Gość współpracował z nami, więc wie co w trawie piszczy. Poszło gładko. Temat z głowy. No prawie. Jeszcze tylko sprawdzę, czy wszystko w porządku z płatnością i dostawą, ale to już we wtorek.

Siedzę w java.util.concurrent. Przygotowuję prezentację. Zaczynam zastanawiać się, czy ja aby jestem dobrze przygotowany do tego przedstawienia?! Mam wątpliwości, czy temat zajmie jedynie 30 minut. Będę musiał gonić. Nie lubię tego.

Nadchodzi wtorek, 8.11. To już dziś! Mam prezentację, mam pizzę, mam prelegentów. Jest wszystko! Jeszcze ostatnie szlify mojej prezentacji, jeszcze polerka o Phaser i wybija 16:30. Pora się zwijać na Banacha.

17:05. Wjeżdza 504. Jadę.

Momento! Czy ja aby zamówiłem również napoje?! Dzwonię do pizzerii. "Czy w zamówieniu są napoje?" pytam. Po drugiej stronie spokojnym głosem "Nie". CO?!?! O w mordę! Proszę o zmianę - tniemy pizze. Ile napoi? Jakie? Cola? Mają tylko 1L. Wybieram Tymbarka 0,25. Ma zrobić, aby było dobrze. Lubię dobrze i gość wie, co jest grane. Zdaję się na pomoc z pizzerii. Uff, dobrze, że w ogóle o tym pomyślałem! Załatwione.

17:59. Rozpoczynamy. Widzę znajome twarze. Dużo tych twarzy. Różne płcie. Jest też mLife i zaczyna się rozdawanie gadżetów. Fajnie, że jest ich tylu. Gdybym miał to przygotowywać samemu - odleciałbym. A tak, fajna kobitka jest i w ogóle jakoś tak poukładane wygląda.

Przygotowuję kamerę.

Pierwszy prelegent stremowany niemiłosiernie. Prosi o zwłokę. Może 10 minut krócej. CO?! Koleś, zluzuj, to przyjazna klientela. Zaczynam myśleć, że koleś zejdzie mi na serce. Jakby mu pomóc? Słownie poklepuję go po ramieniu. Daje radę. W końcu wchodzi na scenę. Kamera, akcja! Cicho, za cicho mówi. Bawię się kamerą, aby nagrać jak Piotr występuje w roli prelegenta. Widać tremę. Co?! Przeprasza za nią?! Oj, gościu, tego się nie robi. To widać, więc po co o tym jeszcze mówić?! Mów o JavaFX! Trema robi swoje. Koniec wystąpienia. Oklaski. Widać dumę u Piotra. Brawo! Pora na drugiego prelegenta.

Drugiego?! Kurcze, gdzie jest Paweł? Paweł, gdzie jesteś. Nie ma go na sali. Chwila zastanowienia i po moim pytaniu o możliwość wystąpienia publika akceptuje plan awaryjny. Rozkładam się, a tu dzwoni dostawca z pizzerni. Jest pizza! Zatem przerwa. Wchodzi Paweł. Co za bieg wypadków. Nie za szybko aby? Zaraz zejdę na serce. Uff, na przerwie sobie odsapnę.

Pizza-time. Robię za kelnera. Pada z tłumu "Przydałoby się trochę sosu". Nie ma sosu?! Tutaj jest! Rozdaję zainteresowanym, ale teraz dopiero reflektuję się, że obsługuję jedynie lewą stronę. Prawa daje sobie radę widzę. Jest dobrze. Pizza schodzi i napoje również. Auć, napoi już nie ma, a pizza jeszcze jest! Cóż, przy następnym razie pomyślimy i o tym. Zapisane na stronie "Do poprawy". Czas retrospekcji już się zaczął (mimo, że impreza wciąż trwa).

Podchodzi Marcin, a może Maciej? Kurcze, już nie pamiętam. Proponuje robótkę. Firma z Gdańska dała ciała i nie dokończyła serwisu. Jest finansowanie, ale nie ma komu robić?! Co za czasy - robota sama przychodzi. Pytam "Jak nas znalazł". Google i takie tam. Przyszedł, aby zaproponować pracę z Grails. Wygląda ciekawie. Muszę się zastanowić. Nie mam do tego głowy teraz. Obiecuję nagłośnić temat przed kolejnym wystąpieniem, na blogu i grupie. Zawsze marzyłem o zbliżeniu inwestorów do naszej grupy. Czyżby marzenia się spełniały?!

Pora przygotować się do prezentacji. Godzina 18:57. Jestem gotów, a tu pada "Może jednak moglibyśmy utrzymać harmonogram? Wolałbym, aby Paweł teraz wystąpił." Ups. Chyba mnie tu nie lubią. Idę ustalić temat z Pawłem. Jest zgoda. Paweł się rozkłada. Ja na scenie wyłuszczam temat z Gdańska. Cisza na sali. Pospali się?! Chrapaliby chyba, co? Nie. Wszyscy patrzą na mnie. Chyba słuchają.

Paweł wchodzi na scenę. Akcja!

Dostaję informację, że przyjechała druga partia pizz. I tyle widziałem Pawła. Przyjechało bodajże 10 nowych - 3 rodzaje. Zaczynam rozmowę na korytarzu o możliwościach ożywienia studentów z MIMUWu z p. dr Jabłonowskim. Pizza schodzi. Jacyś "przechodnie" pytają o możliwość uszczknięcia pizzy. A proszę bardzo. "A z jakiej to okazji?" pada. "Mamy spotkanie javowe" - odpowiadam.

Godzina 19:25. Wchodzę do sali. Paweł w najlepsze opowiada o G1. Widać zainteresowanie publiczności. Padają pytania, Paweł oddaje się rozważaniom, widać interakcję. Jest dobrze. Momento, ale czy nie powinien już kończyć?! 19:30. On wciąż przy mikrofonie i nie widać końca. Pokazuję, że koniec. Paweł widzi, ale brnie w zaparte. "Uparty gość" myślę sobie. Cóż, niech ma jeszcze 5 minut. 19:35. Wciąż mówi. Bach, jest ostatni slajd. Będzie koniec. Jest!

Wspominam o pizzy. Daję 5 minut na przerwę i zapraszam na przekąskę, toaletę i w ogóle odświeżenie umysłu. Już przeczuwam, że ze mną będzie bolało. Mam 30 slajdów, 30 minut i godzinę prawie 19:45. Nie jest dobrze.

Zaczynam. Idzie 1 slajd, później drugi. Widać, że ludzi mniej niż na poprzednich wystąpieniach, ale zrzucam to w duchu na późną porę. Na pewno nie na mój temat, czy mnie samego. Niemożliwe!

Rozgrzewam się. Idzie coraz sprawniej, padają pierwsze pytania. Już nie pamiętam, czy sam nie prowokuję ich. Czas płynie, a ja w połowie. Kolejne pytania, tym razem moje. Pada odpowiedź, druga, wywiązuje się dłuższa wypowiedź. Nie nie mogę na to pozwolić. Muszę skracać. Zaczynam biec. Auć, chyba za dużo przygotowałem do omówienia. A miało być za mało na 30 minut!

Jest 20:15, może 20:20. Pytam, czy mogę prosić o 15 minut dłużej. Pada, że nawet mam 20. Jest lepiej. Koniec o Fork/Join. Nie ma przykładów. Za mało czasu. Muszę nadganiać.

Wchodzimy w ThreadLocalRandom. Tutaj krótko - 1 slajd. Zapominam o tym i przerzucam na kolejny, a tu...Phaser. A właśnie, miało być o Phaser! Szybko przypominam sobie, co tam miałem powiedzieć. Wspominam o książce i głęboki oddech. To będzie z górki. Chyba polubiłem Phaser. Jakiś taki prosty się teraz wydaje. Nadrabiam trochę miną, pomaga mi publika. Jest dobrze. Prezentacja się klei. Tak lubię!

Jest godzina 20:30. Nie! Jest później! 20:45. Znowu zawaliłem z czasem. Trzeba nie było prowokować publiki do dyskusji. Trzeba było trzymać się planu, a nie improwizować jak na "jam session". Następnym razem. Następnym razem.

Jeszcze na koniec prezentacja aplikacji z sourceforge. Chyba się podoba. Sala wybucha gromkim śmiechem. Jest dobrze. Publika się bawi, ja wciąż na scenie - dam radę. No nie, chwila przed 21:00. Zdecydowanie za późno skończyliśmy. Następnym razem będę pilniejszy. 30 minut to trochę mało. Koniec. Oklaski.

Ale co jest?! Pochodzi gość i proponuje wystąpienie na...5 minut. Co?! Nietechniczna publika?! O czym będę mówił?! O prowadzeniu bloga, WJUGa, prezentacje publiczne. Cokolwiek. "Trzymaj się 5 minut!" pada. Nigdy nie brałem udziału w takim przedsięwzięciu. Biorę to! Będzie jazda, ooostra jazda.

Dyskusje, pożegnania, złożenie spotkania. Chyba się udało. Oby nie dostrzegli tych ostrych kantów. To EDC to jeden wielki kant. Jestem zadowolony ogólnie. Samemu udało mi się zestawić to spotkanie. Widać nie wypadłem z wprawy. Ktoś musi mi trochę posłodzić?! Kolejnym razem muszę kogoś zaprosić. Samemu to przewalić się można.

Na zegarze 21:15. W domu jestem po 22. Dzieciaki okupują łazienkę, żonka i dzidzia śpią. Publikuję prezentację z mojego wystąpienia. Nie mogę nie prosić o słowa krytyki. Muszę wiedzieć, gdzie miałem wpadkę. Lubię doskonalić warsztat. Łudzę się, że ktoś jeszcze zechce do nich zajrzeć.

Wciąż ślęczę nad tym wpisem. O łazienka wolna. Koniec. Idę spać. Paaaa.

04 listopada 2011

IBM Certified Solution Developer - WebSphere Integration Developer V6.2 od dzisiaj

0 komentarzy
20 listopada 2009 napisałem w Od dzisiaj zwą mnie "IBM Certified System Administrator - WebSphere Application Server, Network Deployment V6.1" :
"Po prawie 4 latach pracy w IBM z produktami z rodziny IBM WebSphere mam swój pierwszy certyfikat produktowy "Test 000-253: IBM WebSphere Application Server Network Deployment V6.1, Core Administration" i tym samym przywdziałem szaty "IBM Certified System Administrator - WebSphere Application Server, Network Deployment V6.1"."
Dzisiaj mijają prawie 2 lata od tego momentu i tym bardziej jestem dumny móc pochwalić się kolejnym osiągnięciem na niwie certyfikacyjnej - od dzisiaj jestem IBM Certified Solution Developer - WebSphere Integration Developer V6.2.


Wynik nie napawa optymizmem - 65%, co tylko potwierdza, że chyba nie dane mi wychylić głowy ponad przeciętność. Jak do tej pory niewiele było egzaminów, z których potrafiłem uzyskać 4 i więcej, więc po prostu akceptuję wynik, przede wszystkim ciesząc się, że mam ten egzamin za sobą.

A nie było lekko. Dla przypomnienia wspomnę o podsumowaniu moich wcześniejszych prób - wpis z 21 sierpnia 2010 Do 3 razy sztuka? A może 4? Kolejne niepowodzenie z Test 000-379: IBM WebSphere Integration Developer V6.2, Solution Development.

Właśnie poprzednie nieudane podejścia i dodatkowo wczorajszy Fail pozostawiało wiele do życzenia. I nauki!


Ale czego nie robi się dla kariery?!

Bardzo przydało mi się studiowanie różnych scenariuszy z narzędziem, a szczególnie tych, które poznałem właśnie podczas tych wszystkich podejść testowych. I właśnie ta nauka pozostanie u mnie w pamięci najdłużej - projekty, w których miałem możliwość uczestniczyć do tej pory z WID nie były specjalnie wyrafinowane i zaczynam podejrzewać, że może wynika to z faktu, że wciąż na SOA w Polsce trzeba jeszcze poczekać. Mam nieodparte wrażenie, że bez względu na produkt, którym chcemy realizować założenia SOA, wciąż za mało studiujemy jego możliwości. Nie zamierzam wychwalać zestawu WID/WPS jako właściwego do wszystkich sytuacji integracyjnych, ale dla stosunkowo wielu jest to właściwa oferta. Kto nie wierzy, niech spróbuje samodzielnie poznać produkt - niestety nie wiem, czy w ogóle istnieje wersja do samodzielnej nauki, chociażby czasowa. Zainteresowanych uprasza się o kontakt na priv - może uda się zaspokoić ciekawość w jakiś bliżej jeszcze nieokreślony sposób.

Można tylko zapytać, po co w ogóle ten certyfikat, kiedy od paru lat mamy wersję 7.0 (z egzaminem Test 000-607: IBM WebSphere Process Server V7.0, Integration Development) oraz 7.5 (ze zmienioną nazwą na Integration Designer w zestawie IBM Business Process Manager 7.5 Advanced)? Po prostu chciałem sobie udowodnić, że mogę. Uparłem się na tę wersję, bo byłem święcie przekonany, że znam produkt wystarczająco, aby zdać egzamin. Każda kolejna porażka tylko mnie coraz bardziej rozjuszała (a moje ego cierpiało). Ten opór się w końcu opłacił i wierzę, że z niewielkimi zmianami między wersjami 7.0 i 7.5 pora spróbować czegoś (nieznacznie?) odmiennego - IBM Certified Associate BPM Developer - WebSphere Lombardi Edition V7.2? Nie znaczy to, że kończę z WID, bo co to, to nie! Po prostu jego już okiełznałem na tyle, abym wiedział na czym się skupić, aby już bez stresu poznawać jego dalsze tajniki. Klienci powinni odczuć zmianę na korzyść.

Pozdrawiam jednocześnie wszystkich, którym niejednokrotnie powinęła się noga na tym samym egzaminie. Niesamowite uczucie móc tego doświadczyć!

02 listopada 2011

84 spotkanie Warszawa JUG - Warszawski Eclipse DemoCamp 2011 - Java 7, JavaFX i Eclipse

0 komentarzy
Warszawska Grupa Użytkowników Technologii Java (Warszawa JUG)
Warszawska Grupa Użytkowników Javy (Warszawa JUG) zaprasza na 83 spotkanie, które odbędzie się w najbliższy wtorek, 8 listopada 2011 o godzinie 18:00 w sali 5440 Wydziału MIM UW przy ul. Banacha 2 w Warszawie. Spotkanie jest jednocześnie oficjalnym otwarciem sezonu spotkań 2011/12 oraz świętowaniem dwóch wielkich wydarzeń w kalendarzu entuzjasty Javy - wydania Java 7 oraz dziesiątej rocznicy Eclipse.org.

Temat: Warszawski Eclipse DemoCamp 2011
Prelegenci: Piotr Chmielewski, Paweł Szklarz, Jacek Laskowski

Agenda

18:00-18:25 JavaFX Piotr Chmielewski
18:25-19:00 pizza
19:00-19:25 Garbage-First Garbage Collection w Java 7 Paweł Szklarz
19:30-20:00 java.util.concurrent w Java 7 z Eclipse Indigo SR1 Jacek Laskowski

Sponsorem naszego spotkania została firma mLife.

mLife.pl

Strona minikonferencji na eclipse.org - Eclipse DemoCamps November 2011/Warszawa.

Uprasza się o rozsądną rejestrację (wymaga potwierdzenia) na stronie Warszawski Eclipse DemoCamp 2011, aby dopasować liczbę pizz i napoi.

Wstęp wolny

Zapraszam w imieniu prelegentów i grupy Warszawa JUG!

Kontakt z organizatorem: Jacek Laskowski.

01 listopada 2011

java.util.Objects w Java 7 jeszcze raz - ostatni?

0 komentarzy
Sądziłem, że poprzednie dwa wpisy na temat java.util.Objects wyczerpały temat, ale nie tylko, że nie wykorzystałem wszystkich metod oferowanych przez tę klasę, chociażby Objects.hash(Object... values), ale sprowokowany przez komentarz ags (znany również jako Andrzej Grzesik) udało mi się znacznie uatrakcyjnić mój przykład.

Zwracam uwagę na zmiany w samej klasie Customer - metody hashCode() oraz equals(Object) oraz sam test z assertNotSame() i assertSame().

Ufam, że teraz wszyscy są usatysfakcjonowani, nieprawdaż?

package pl.japila.java7;

import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;

import java.util.Objects;

import org.junit.Test;

public class ObjectsTest {

 class Customer {
  public final String code;
  public final String name;

  public Customer(final String name, final String code) {
   this.name = name;
   this.code = code;
  }

  @Override
  public int hashCode() {
   return Objects.hash(name, code);
  }

  @Override
  public boolean equals(Object obj) {
   if (this == obj)
    return true;
   if (obj == null)
    return false;
   if (getClass() != obj.getClass())
    return false;
   Customer other = (Customer) obj;
   if (!getOuterType().equals(other.getOuterType()))
    return false;
   return Objects.equals(name, other.name) && Objects.equals(code, other.code);
  }

  private ObjectsTest getOuterType() {
   return ObjectsTest.this;
  }
 }

 @Test
 public void testObjectsMethods() {

  Customer jacek = new Customer("Jacek", "X23");
  Customer klonJacka = new Customer("Jacek", "X23");

  assertTrue("Klon Jacka jest Jackiem", Objects.equals(jacek, klonJacka));
  assertNotSame("Jacek nierówny swojemu klonowi", jacek, klonJacka);
  
  Customer wskazanieNaJacka = jacek;

  assertTrue(Objects.equals(jacek, wskazanieNaJacka));
  assertSame(jacek, wskazanieNaJacka);
 }

}