poniedziałek, 14 grudnia 2009

Przenosiny Bloga





Blog został przeniesiony pod adres:

czwartek, 3 września 2009

Configuring HermesJMS to work with Tibco

I assume that you have Tibco installed in <TIBCOHOME>

1) Download & install HermesJMS. I assume that <HERMES_HOME> is the installation directory for Hermes.
2) Copy <TIBCOHOME>/ems/clients/java/*.* into <HERMES_HOME>/lib. There is no need to overwrite existing files.
3) For next steps, there is a presentation prepared here and we will follow it with the following note: See the first step of the presentation, then stop and come back here :) In the first step the presentation shows already prepared, long list of providers. To work with Tibco, we will only need one provider, which we have to add manually. To add a provider, go to Providers tab in Preferences dialog, right click under Classpath Groups, select Add Group and type the name (i.e. Tibco Ems). When the provider appears on the list, expand it's subtree to see the Library item. Right click on Library and select Add JAR(s). Add all JARs in <TIBCOHOME>/ems/clients/java directory. Click Apply, then OK to close Preferences window. Continue with step 2 of the presentation.

In Step 3, don't be surprised if just after selecting the Loader from the dropdown list, the list will disappear. It actually didn't dissapear, it's just behind the right edge of the dialog, and you can see it again, if you resize the dialog.

Good luck!

poniedziałek, 31 sierpnia 2009

JDK5, Ubuntu i Summer Time

Zacznijmy od tego że jestem właśnie w trakcie przesiadki na Linuksa, a konkretnie Kubuntu.

Pierwszy poważny problem który napotkałem dotyczy strefy czasowej widzianej przez Jave. Konfiguracja:

1) JRE6 zainstalowane "z paczki" (za pomocą aptitude), aby za jego pomocą uruchamiać Javowe narzędzia, aplety w przeglądarce itp.
2) JDK5 ściągnięte od Suna i rozpakowane. Służy do celów deweloperskich. Tutaj wskazuje JAVA_HOME.

Problem polegał na tym że Java w JDK nie uwzględniała przesunięcia czasu letniego (w zainstalowanym "z paczki" JRE jest OK). Po kilku godzinach rwania włosów z głowy znalazłem to zgłoszenie buga. W tytule mowa jest co prawda o JDK6, ale jak się okazuje pasuje również do wersji 5. Wykonałem z drobną zmianą to co tam jest opisane, czyli:

sudo cp /etc/localtime /etc/localtime.bak
sudo ln -s -f /usr/share/zoneinfo/Europe/Warsaw /etc/localtime
i po problemie. Weird...

P.S.
Jaki komunikator polecacie? Najlepsze by było coś co obsłuży zarówno GG jak i Jabbera.

środa, 12 sierpnia 2009

Testowalny kod

Mamy sezon ogórkowy, więc tylko krótki post o tym co niezwykle ważne, nawet w wakacje. Świetny artykuł Misko Hevery zatytułowany Writing Testable Code. Artykuł kieruje do mini-książki w formacie PDF zawierającej praktyczne przykłady jak istniejący, kiepski kod doprowadzić do sensownej i testowalnej postaci. Autorzy wykorzystują framework Guice, ale koncepcyjnie proponowane rozwiązania są uniwersalne.
Planuję również przyjrzeć się projektowi Testability Explorer, którego współautorem jest Misko, a który umożliwia analizowanie kodu pod względem testowalności (statyczna analiza bytecodu z tego co na szybko wyczytałem). Na razie ściągnąłem źródła i przekonałem się na własne oczy, że możliwości oferowane przez Guice są naprawdę bardzo ciekawe.

Miłej lektury!

wtorek, 7 lipca 2009

Manifesto for Software Craftsmanship




Nie ma już odwrotu :) Świadomy praw i obowiązków, pełen chęci ciągłego doskonalenia swego rzemiosła podpisałem dziś manifest. Do czego gorąco także i Ciebie zachęcam, jeśli nie jest Ci obca troska o jakość Twojej pracy.

niedziela, 5 lipca 2009

Javarsovia 2009 za nami

Największa bezpłatna konferencja polskiej społeczności javowej niestety już za nami. Piszę niestety, ponieważ to wydarzenie było niewątpliwym sukcesem i chciałoby się mieć takie konferencje co tydzień ;) Na Javarsovii nie zabrakło ciekawych prezentacji i niejednokrotnie ciężko było mi się zdecydować który wykład o danej godzinie wybrać. Szkoda mi kilku wykładów, które zmuszony byłem ominąć - mam nadzieję że organizatorzy szybko udostępnią filmy z konferencji i będzie można nadrobić tę stratę. Szczególnie żałuję wykładu Szczepana Fabra na temat testowania - ten temat od dłuższego czasu coraz bardziej mnie wciąga a wczoraj nie wiedzieć czemu poszedłem na Cloud Computing, który szczerze mówiąc trochę rozczarował... Uczestniczyłem już kiedyś w (rewelacyjnej zresztą) prezentacji Szczepana na temat Mockito (chyba było to na JDD) i tym razem pomyślałem że również będzie o Mockito - dlatego wybrałem inny wykład... Ominęła mnie także prezentacja Łukasza Lipki z naszego rodzimego Silesia JUG nt. Mule ESB. Łukasz mówił już kiedyś o Mule na spotkaniu JUGa, chociaż na Javarsovii na pewno rozszerzył jeszcze i tak ciekawą prezentację ;)

To może teraz coś o wykładach na których byłem :) Wymienię trzy, które zrobiły na mnie największe wrażenie, dostarczyły najwięcej nowej wiedzy - wybór oczywiście subiektywny.

Konrad Kamiński przedstawił Garbage First - nowy garbage collector w maszynie HotSpot. Szczerze przyznam, że przed tym wykładem nie miałem pojęcia jak działają wewnętrzne algorytmy GC a wykład Konrada dał dużo światła na ten jakże ważny temat. Nowy GC wygląda ciekawie, a możliwość określenia ile maksymalnie czasu może zajmować jego praca w danym odcinku czasu jest w aplikacjach serwerowych bardzo pożądana.

Kolejnym świetnym wykładem był wykład Jarosława Kijanowskiego na temat Drools Guvnor. Temat mi osobiście bliski, ponieważ używam Drools w projekcie nad którym obecnie pracuję. Jarek poprowadził prezentację w bardzo ciekawy, luźny sposób oraz - co należy podkreślić - pominął wiele niepotrzebnych detali technicznych które z punktu widzenia meritum tematu były nieistotne a jedynie zaciemniłyby obraz. Tej umiejętności niestety wciąż brakuje wielu polskim prelegentom, którzy potrafią zasypać słuchacza tonami XMLi wylewających się z projektora... Oprócz Guvnor'a Jarek zaprezentował również Drools CEP (Complex Event Processing) które pozwala na podejmowanie decyzji nie tylko na podstawie bieżących faktów, ale również "patrząc wstecz" (np 10 ostatnich zdarzeń, zdarzenia z ostatnich 20min) - ciekawa sprawa. Nie próbowałem jeszcze użyć Drools CEP, ale wygląda na to, że może być on darmową, opensource'ową konkurencją dla Oracle CEP.

Ostatnim wykładem na który się wybrałem był Spring TestContext Framework Jakuba Milkiewicza. Bardzo, bardzo ciekawy wykład poprowadzony w świetnym stylu. Publiczność wręcz domagała się przedłużenia prezentacji i przedstawienia jeszcze kilku przykładów. Do tej pory używałem małej części tego mini-frameworku, ale po tym wykładzie na pewno to się zmieni. Muszę się również przyjrzeć HamCrest'owi, którego Jakub używał do tworzenia asercji.

Na koniec dygresja na temat organizacji konferencji. To że organizatorzy DARMOWEJ konferencji zorganizowali DARMOWY lunch dla wszystkich uczestników - to jak dla mnie (jako głodomora) mistrzostwo świata!!! Poza tym ogólnie nie było rzeczy do której można by się przeczepić :) Wykłady ciekawe, żołądek pełny, sale dobre, miejsca dosyć, widoczność dobra itd itp. Podnieśliście poprzeczkę Panowie!

czwartek, 11 czerwca 2009

Pragmatyczny programista

Właśnie skończyłem czytać książkę "Pragmatyczny programista. Od czeladnika do mistrza". Nie będę odosobniony, jeśli powiem, że każdy programista powinien tę książkę przeczytać. Ten post jest zgrupowaniem haseł i zasad, które dla mnie osobiście były najciekawszą nauką płynącą z tej lektury. Większość z nich to tematy znane, ale moim zdaniem na tyle ważne żeby jeszcze raz o nich powiedzieć i podkreślić ich znaczenie.

Wybite okno
Kiedy w bloku pojawi się wybite okno i nikt dostatecznie szybko tego nie naprawi, szybko pojawią się kolejne wybite okna i inne oznaki postępującego zniszczenia. Podobna zasada dotyczy kodu źródłowego - nie pozostawiaj w swoich systemach wybitych okien (zły kod, antywzorce, błędne decyzje projektowe, work-around'y). Nie dopuszczaj do powstania "ogniska rozkładu" Twojego systemu.

Ortogonalność

Poruszając się wzdłuż osi pionowej, rzut aktualnego położenia na oś poziomą nie zmienia się. Tak powinny być zaprojektowane systemy informatyczne: zmiany w module A nie powinny być zauważone przez moduł B. Oba moduły powinny komunikować się za pomocą dobrze zdefiniowanych interfejsów, a szczegóły implementacji powinny być ukryte tak, aby każdy z modułów mógł zostać zmieniony, a nawet zastąpiony bez konieczności zmian w pozostałych modułach.

Prawo Demeter (zasada minimalnej wiedzy)
W dużym skrócie: rozmawiaj tylko z obiektami z własnego otoczenia. Nie wyciągaj z nich innych obiektów ("wnętrzności") aby z nimi porozmawiać (byłoby to wnikanie w implementację). Niech obiekt nadrzędny odpowiednio oddeleguje wywołania, sam decydując jak chce zrealizować zadany cel. Zamiast:
car.getOnboardComputer().getGPS().getLocation();
napisz
car.getLocation()
pozostawiając klasie Car decyzję, jak zaimplementować określanie lokalizacji.

Pociski smugowe
Autorzy nazwali tak technikę podobną nieco do prototypowania, która zaleca stworzenie na początku rozwiązania bardzo ubogiego, ale przechodzącego przez wszystkie warstwy i stanowiącego bazę dla dalszego rozwoju systemu. W odróżnieniu od prototypu, rozwiązanie to nie trafia do kosza po sprawdzeniu że działa, lecz staje się integralną częścią systemu, wokół której tworzone są kolejne funkcjonalności aż do zakończenia projektu. Nazwa pociski smugowe wzięła się z tego, że stworzony kod pozwala stwierdzić, czy projekt "trafia do celu" czyli idzie w dobrym kierunku już na początku, posiadając zaimplementowaną jedynie najmniejszą możliwą część funkcjonalności. Dziś w dobie agile, chyba bardzo często stosowana technika ;)

Odwracalność
Podejmuj decyzje odwracalne. Przygotuj się na to, że klient zechce zmienić wersję, lub nawet producenta bazy danych, serwer aplikacyjny etc...

Programowanie przypadkowe
Fred nie wie dlaczego program nie działa, ponieważ wcześniej nie wiedział, dlaczego program działał.

Poznaj API
i technologie które używasz, aby nie tworzyć kodu na oślep, kodu który działa przez przypadek.

Testowanie jednostkowe
jest jak testowanie układów scalonych - sygnały podane na odpowiednie wejścia powodują odpowiednie stany na wyjściach.

DRY
Na temat tej zasady nie będę się powtarzał :)