czwartek, 27 października 2011

Wtyczki do Eclipse’a wspomagające naukę TDD


Aby zacząć naukę TDD (Test-driven development) wiele nie trzeba. Wystarczy ulubione środowisko programistyczne IDE (Idea / NetBeans / Eclipse) i narzędzie do testowania (JUnit / TestNG / xUnit). I teraz albo czytamy mądre książki (polecam "TDD by Example" Kenta Becka) jednocześnie kodując, lub szukamy odpowiednich informacji w necie, albo szukamy kogoś doświadczonego, aby pokodzić w parach. No i można już uskuteczniać TDD. Tylko skąd wiadomo, że robimy to dobrze? Czy pamiętamy o wszystkich krokach? Może czasem zapominamy zrefaktoryzować kod? Czy rzeczywiście mamy rytm red, green, refactor?

W celu śledzenia i późniejszej oceny jak nam poszło TDD warto zainstalować w Eclipse’ie plugin Pulse. Kiedy pierwszy raz o nim usłyszałem (i tu podziękowania dla Bartka), pomyślałem sobie: po co komu plugin do TDD? Pewnie to jakaś ściema lub zbędny bajer. I rzeczywiście jest to bajer, ale całkiem użyteczny.

Plugin Pulse tworzy wykres naszej aktywności, zaznaczając kiedy nasze testy fail’owały, kiedy były zielone i kiedy robiliśmy refaktoring. Na stronie plugin’a można zobaczyć ciekawy filmik prezentacyjny możliwości.

W celu przetestowania plugin’u wziąłem się wiec za PrimeFactorsKata, gdyż tej Katy wcześniej nie robiłem. Efekt poniżej:



Początkowo napisałem testy dla jedynki i dwójki (pierwsze dwie czerwone kropki). Gdy napisałem test dla 4ki to się skapnąłem, że skoro jest to rozkład na czynniki pierwsze, to powinienem zwracać listę wartości, a nie pojedynczą wartość. Trzeba było wiec sygnaturę metody zmienić.

Następnie szły kolejne testy, czasem w miarę potrzeby jakiś refaktoring. Jako refaktoring jest rozpoznawane użycie któregoś z automatycznych mechanizmów, np. Extract Method (Alt + Shift + M), czy Rename (Alt + Shift + R). Niestety, jak robimy to ręcznie, to nie jest to wykrywane przez plugin. Ale w sumie niedziwne, gdyż wówczas każda edycja kodu by generowała niebieskie punkty na wykresie.

Gdy już nie chciało mi się już szukać (ani liczyć) kolejnych testowych wartości, które bym dodał do testów, przerwałem katę. Nie napisałem w pełni funkcjonalnej metody, gdyż pewnie dla jakiś kolejnych dużych wartości mogło by to nie działać. Ale nie o to chodzi w ćwiczeniach typu CodeKata by dojść do końca (bez skojarzeń;) ), a o poznanie jakiejś nowej techniki programistycznej, lub wyrobieniu sobie dobrych nawyków.

Wracając jeszcze z Warsjawy, co opisywałem we wpisie: Warsjawa 2011 już za nami, jechałem pociągiem i wziąłem się za BowlingGameKata. Tutaj już miałem sporo czasu na implementację. Nie było to moje pierwsze podejście do tego problemu, więc już jakoś w podświadomości było wiadomo, jak to rozwiązać. Ćwiczyłem dodatkowo tworzenie notatek, na temat tego, jakie testy trzeba jeszcze napisać i jakie są już napisane. Wykres z wtyczki Pulse poniżej:



Zacząłem równo o 16.00 i początkowo pisałem proste testy dla następujących przypadków (liczby to ilości kręgli zbitych w danym rzucie):
  • 0 - pierwszy zielony test.
  • 1- pierwszy czerwony i już po nim jakiś refaktoring.
  • 1, 3 - drugi czerwony test.
  • 1, 3, 4, 5 - któryś z zielonych testów po 16.10.
  • Pierwszy bonus: Spare – zacząłem o 16.14 i wtedy postanowiłem zrobić większy refaktoring, tj. wprowadzić design obiektowy. Skończyłem go o 16.30 i 5 minut później już mi śmigał pierwszy test dla Spare’a. Do 16.40 jeszcze coś refaktoryzowałem, co nawed plugin zarejestrował.
  • Double Spare  - zacząłem chwile po 16.40 i trochę musiałem podebugować do 16.55. Ostatecznie okazało się, że w teście źle przeliczyłem oczekiwaną wartość. 
  • Strike – o 17.03 skończyłem implementację drugiego bonusu.
  • Double Strike – skończyłem implementację o 17.33. W międzyczasie musiałem zmienić przedział w pociągu, gdyż skończył się prąd w gniazdku :P
  • Spare, Strike – skończyłem o 17.39 (miałem błąd w danych testowych)
  • Strike, Spare– skończyłem o 17.41(j.w.). Następnie chciałem napisać implementację Full Strike (czyli ciągle rzucamy 10 za pierwszym razem). Ale po tym jak test zfail’ował, dopisałem do mojej listy TODO jeszcze inne, prostsze testy dotyczące końcówki gry (ostatnia ramka) i zacząłem od nich implementację.
  • Spare w ostatniej ramce – skończyłem o 17.54.
  • Strike w ostatniej ramce – skończyłem o 18.00.
  • Double Strike w przedostatniej (i ostatniej) ramce skończyłem o 18.03.
  • Full Strike (ciągle rzucamy 10) – działał od razu po odkomentowaniu testu, gdyż wcześniejszymi testami zapewniłem odpowiednie działanie ostatniej ramki. Na koniec jeszcze usunąłem duplikacje z kodu ekstrachując odpowiednie metody.

Pierwszy raz doprowadziłem tą Katę do końca i jestem z niej zadowolony. Teraz moją implementację trzeba porównać z rozwiązaniem wujka Boba.

Kolejnym pluginem udostępnianym przez @iamhappyprog na stronie www.happyprog.com jest TDGotchi. Dzięki kolejnym wynikom testów zbieramy punkty i rozwiajamy nasze „zwierzątko”.

Podczas PrimeFactorsKata udało mi się uzbierać 5 punktów, przy bowlingu zapomniałem spojrzeć.



Przy zamknięciu i otwarciu widoku, punkty się resetują. możemy jeszcze obserwować nasze zwierzątko / ikonke jak się zmienia, gdy zminimalizujemy widok.

Ostatnim plugin’em tego samego autora jest PairHero. Wspiera on Pomodoro Technique i ping pong programing.  Za przechodzące testy i refaktoring dostajemy punkty, a za szybkie zmiany kierownik – pilot można dodatkowo pomnożyć te punkty. Fajne jeśli akurat ćwiczmy Ping Pong'a, szybkie zmiany, lub po prostu programowanie w parach.Przykładowy screenshot poniżej.



Z przedstawionych plugin’ów najbardziej polecam pierwszy, gdyż wg. Mnie niesie największą wartość i pozwala na dobrą retrospekcje jak i porównanie wykresu z innymi developerami. Pozwala również nam zauważyć, jak często wykonujemy automatyczny refaktoring, ile czasu potrzebujemy na przejście red -> green itp.

A jak wygląda Twój puls?

niedziela, 23 października 2011

Mobilization – konferencja o technologiach mobilnych - wrażenia


Ledwie tydzień temu byłem na Warsjawie, a tu już następna konferencja: Mobilization.pl, która odbyła się w sobotę w Łodzi. Była to pierwsza edycja konferencji i jeszcze sporo pozostawia do życzenia co do poziomu wykładów, ale miejmy nadzieję, że w przyszłości się to poprawi.

O 9.50 było szybkie powitanie uczestników, parę spraw organizacyjnych i rozpoczął się pierwszy wykład Bartłomieja Zassa na temat programowania Windows Phone Mango. Mimo, że nie jestem fanem rozwiązań tej firmy, byłem pod wielki wrażeniem tej prelekcji jak i prelegenta. Przede wszystkim prezentacja była bardzo dobrze przygotowana, było kodowanie na żywo (które działało), opcja zoom na ekranie, zaznaczanie kursorem elementów na ekranie, pokaz działania telefonu na rzutniku, płynne przełączanie się pomiędzy kodem a prezentacją i jeszcze parę innych fajnych drobnostek. Istny majstersztyk. Jedyne co mi się nie spodobało, to częściowe ucięcie prawej strony ekranu prezentacji (złe wyskalowanie ekranu – można było wcześniej ustawić), i mówienie „na pan/państwo”. Ja wolę luźniejszy sposób prowadzenia prezentacji i zwracanie się „na Ty/Wy”.

Na samej prezentacji najpierw było trochę historii. W 2010 była premiera Windows Phone, ale nie w Polsce (gdyż nie było tłumaczenia na nasz ojczysty język) i oficjalnie nie można było kupić u nas takiego telefonu. Jednak jesienią 2011 pojawił się Windows Phone 7.5 Mango dostępny dla Polaków. Były na prezentacji podane minimalne wymagania sprzętowe, które musi posiadać telefon, aby obsługiwać ten system. Wymagania są dość spore co może wpływać na cenę urządzeń z produktem Microsoftu. Na dniach Nokia ma wypuścić Nokię 800 która ma działać na Windows Phone 7.

Na przedstawiany system można tworzyć oprogramowanie z wykorzystaniem Silverlight 4 czy też XNA (api dla XBoxa). Mango zawiera również Internet Explorer’a 9 (niby ten sam engine co w PC’tach), czyli daje to nam wsparcie dla Html’a 5 i sprzętowej akceleracji graficznej. Bartłomiej pokazywał słynny test FishIETank  odpalany na telefonie i wyglądał dobrze.

Telefony z Windowsem Phone 7 prezentują trochę inne podejście od obecnie popularnych smartfonów. Zamiast w menu wyświetlać ikonki, które uruchamiają poszczególne aplikacje, wprowadzono koncepcję kafelków. Są to takie większe ikonki, które pokazują jakiś stan aplikacji, np. informację, czy przyszły nowe e-maile. I nasze aplikacje (o ile to obsługują) można przypiąć do pulpitu jako taki kafelek. Ciekawe podejście, choć gusta są podzielone na temat tego rozwiązania.

Inną wprowadzoną do systemu koncepcją są Hub’y, czyli integracja informacji z wielu miejsc. Przykładowo w książce telefonicznej pod konkretnym kontaktem możemy mieć zagregowane informacje o danej osobie z facebook’a, linkedin’a gmail’a i innych. Fajna funkcjonalność.

Następnie było na prezentacji już bardziej praktycznie. Prelegent pokazał kilka przykładowych aplikacji i jak można prosto i szybko tworzyć własne. Bartek stworzył na szybko aplikację o konferencji dla Windows Phone 7.5. Pokazał przy tym jak można to robić z poziomu Visual Studio jak i Expression Blend 4. Oba narzędzia dobrze się integrują i synchronizują. Pierwsze służy programistom, a drugie jest bardziej dla grafików i projektantów interfejsów graficznych, ale można w nim również sporo funkcjonalności wyklikać. Jeśli chodzi o licencjonowanie to narzędzia są bezpłatne.

Microsoft udostępnił również (podobnie jak konkurencja) miejsce gdzie można umieszczać i sprzedawać swoje aplikacje, czyli Marketplace. Studenci mogą sobie za darmo konto założyć, osoby prywatne i firmy płacą 100 $ rocznie.

Prezentację uważam za najbardziej udaną i pokazującą najwięcej ze wszystkich prezentacji w jakich uczestniczyłem w ramach tej konferencji. Wystąpienie się przedłużyło, przez co cała agenda się przesunęła o 15 minut.

Kolejną prezentacją na której byłem, było Programowanie Android 3.0 prowadzone przez Krzysztofa Janika. Prezentacja słaba, już na drugim slajdzie były jakieś błędy. Prelegent chciał zrobić małe demo pokazywane z tableta (bo tam działa Android 3.0), ale miał jakieś problemy z kablem. Próbował jeszcze włączyć live streaming (cała konferencja była stream’owana na giwebcast.pl) na rzutniku, by pokazać tablet do kamery. Niestety nie udało się załadować streamingu na komputerze prelegenata :( Dodatkowo Krzysiek często patrzył na slajdy i zadawał dużo pytań publiczności, które nie wnosiły nic do tematu. Bardzo słabe wystąpienie.

Jedyne co wyniosłem z prelekcji to obecność w Androidzie 3.0 czegoś co nazywamy Fragments. Są to jakby miniActivity, które możemy dynamicznie osadzać w innych Activity.

Kolejne wystąpienie było Konrada Hołowińskiego na temat Multiplatform mobile apps. Konrad przedstawił dwa rozwiązania pozwalające pisać raz i uruchamiać aplikację na różnych urządzeniach mobilnych.

Pierwszym omawianym rozwiązaniem było Appcelerator Titanium. Aplikację tworzymy za pomocą JavaScript’u wykorzystując dodatkowo natywne komponenty dla konkretnych platform. Titanium dorzuca później do kodu własny interpreter JS, co zwiększa wielkość aplikacji. Jeśli dobrze zrozumiałem, to od pewnego czasu produkt ten używa statycznej analizy i kompilacji kodu, generując kod natywny dla danej maszyny. Zdecydowano się na taki krok ze względów wydajnościowych, ale przez to pojawiały się przez jakiś czas wycieki pamięci.

Titanium wspiera Androida, iOSa i BlackBery (nie w pełni). Dzięki  kompilacji do natywnego kodu, aplikacje przyjmują wygląd platformy na której są uruchamiane. Pojawiają się przez to często różnice w wyglądzie na innych urządzeniach, co zostało pokazane podczas prezentacji na emulatorach iPhone’a i Androida. Mamy również dostępne darmowe jak i płatne plugin’y rozszerzające możliwości dostarczane przez Titanium.

Następnie było o konkurencyjnym rozwiązaniu PhoneGap, które wspiera więcej (bo aż 6) platform. Tutaj piszemy w HTMLu 5, JavaScript’cie i CSS3. Produkt jest typu open-source i wszelkie plugin’y są rozwijane przez społeczność.

PhoneGap jest uruchamiany w natywnym silniku JS danego urządzenia. Daje on jednak też dostęp do większości funkcjonalności dostępnych w smartfonach, za pomocą „zmostkowania” ich do JS. Podejście to ma swoje wady jak i zalety. Wadą jest brak wsparcia dla wielowątkowości i wolniejsze działanie od aplikacji tworzonych w Titanium, lub natywnie. Za to naszą aplikację możemy uruchomić w przeglądarce i podejrzeć cos się dzieje np. za pomocą FireBug’a.

Z ciekawostek, to PhoneGap zostało ostatnio przejęte przez firmę Adobe, które się stara zaistnieć na rynku urządzeń mobilnych. Zobaczymy co z tego wyjdzie.

Na konferencji miałem okazję poznać Tomka Dziurko. Po prezentacji Konrada poszliśmy na obiad i po nim chcieliśmy pójść na Advanced layouts on the Android battlefield. Jacka Niedzwieckiego, ale chwilkę się spóźniliśmy, a sala była wypchana po brzegi. Alternatywny wykład o Windows 7 nas nie interesował, więc se posiedzieliśmy w holu konferencji.

Następnie miał być wykład o Androidzie i SmartTV, ale prelegent nie przyjechał. W jego miejsce wrzucono Testowanie w Systemie Android Marka Defecińskiego. Marek był jednym z organizatorów konferencji i prowadzi Blog Progamisty Android. Marek jest niespełnionym fanem testów. Swoją opowieść zaczynał od J2ME, w której sam miałem przyjemność się sprawdzić. I rzeczywiście potwierdzam, że o testowaniu w J2ME nie ma co mówić.

Później już było o Androidzie i testowaniu funkcjonalnym za pomocą robotium. Projekt się reklamuje jako Selenium ale dla Androida i działa na emulatorze Androida. Prelegent nie był jednak do końca zadowolony z tego rozwiązania.

Innym ciekawym, omawianym projektem był Robolectric. Jest to framework do testów, który za pomocą Javassist podmienia to co siedzi w android.jar. Dzięki temu możemy nasze testy odpalać na komputerze, działa refaktoryzacja i jest to szybkie.

Było jeszcze wspomniane o android-mock i paru innych frameworkach do testowania. Niestety Marek nie pokazał żadnych przykładów, zrzucając winę na aktualizacje maven’a. Brakuje mu jeszcze oswojenia z publiką i rozluźnienia podczas prowadzenia prezentacji. Na problem suchego gardła polecam wodę z cytryną przed i w trakcie prezentacji (powoduje wydzielanie śliny) jak i unikania słodyczy oraz nadmiernego picia wody (wysusza gardło). Ponadto bujanie się na boki jest trochę denerwujące / rozpraszające dla słuchaczy. Niestety pewność na tego typu wystąpieniach można wyćwiczyć jedynie występując.

Następne prelekcje były dla mnie mniej interesujące. Spotkałem na konferencji Pawła Zubkiewicza, którego znam dzięki WrocJUG. Jako, że Paweł jest z Wrocławia, postanowiłem się zabrać z Nim i innymi pracownikami QNH do domu, gdyż powrót autobusem o 21.35 z Łodzi jakoś mi się nie uśmiechał.

W drodze powrotnej nie mogło się obejść bez niespodzianek, mianowicie klocki hamulcowe się starły i musieliśmy się zatrzymać. Na całe szczęście wylądowaliśmy w miejscowości Szadek, a nie gdzieś w lesie. Dobrą pizze tam mają i gdyby nie ta awaria nigdy bym się tam nie pojawił. Pomoc drogowa zawiozła nas z powrotem do Łodzi i tam już czekał na nas samochód zastępczy, którym dojechaliśmy do Wrocławia.

Podsumowując, jak na pierwszą edycję konferencji, organizacja wypadła dobrze. Były dostępne przekąski w postaci kanapek i jogurtów (świetny pomysł) jak i kawa / herbata. Jedna sala była trochę mała, przez co nie chciałem się dociskać na jeden wykład. Na krzesełkach konferencyjnych były fajne podkładki przyczepiane do krzesła rzemykiem, na których się wygodnie notowało. Trzeba jedynie poziom prezentacji podnieść i będzie cacy.

wtorek, 18 października 2011

Warsjawa 2011 już za nami


W minioną sobotę (15.10.2011) odbyła się Warsjawa 2011. Konferencja ta jest organizowana przez te same osoby co Confitura z tym że ma ona charakter warsztatowy. Ja postanowiłem wziąć udział w ścieżce dotyczącej GWT gdyż ostatnio trochę pokodziłem w tej technologii i chciałem uzupełnić / usystematyzować swoja wiedzę. Ale od początku.

Konferencja rozpoczęła się chwile po 9.00 słowem wstępnym organizatorów. Chwile później poszliśmy już do sal gdzie miały być warsztaty. Sala była trochę mniejsza niż przewidziane 60 uczestników, więc było ciasnawo, ale przyjemnie. No i ilość podłączonych komputerów do sieci elektrycznej musiała się skończyć wysadzeniem korków. Trzeba było kilka przedłużaczy spiąć ze sobą i ukraść prąd z korytarza, aby muc w ogóle rzutnik prowadzącemu  uruchomić. Wysadzenie korków jest rzeczą, której można się spodziewać, ale zbytnio nie ma się jak przed tym zabezpieczyć. No chyba że ktoś ma generator prądotwórczy pod ręką i mógłby udostępnić :P

Warsztaty rozpoczęły się więc o 9.45. Po krótkim wprowadzeniu utworzyliśmy przykładową aplikację i zaczęliśmy zabawę. Niestety prowadzący założył, że będzie Wi-Fi i że będzie działać. Niestety było to błędne założenie, co trochę rozwalało pracę. Przykład ten pokazuje, że przygotowanie prezentacji / warsztatu nie jest sprawą trywialną i że należy się zabezpieczyć na ewentualność braku dostępu do Internetu i wszelkie inne problemy. Całe szczęście pojawiłem się chwilę przed konferencją i zdążyłem jeszcze uruchomić skrypty konfigurujące środowisko, dzięki czemu mogłem wykonywać początkowe ćwiczenia. Poniżej przedstawiam garść interesujących informacji o GWT, które wyniosłem z warsztatu.

Moduł GWT dzieli się na client server i shared. Widać to w nazwach pakietów w naszym module. Klasy umieszczone w pakiecie shared są współdzielone przez client i server. To co jest umieszczone w client i shared jest tłumaczone na JavaScript, więc nie może zawierać / używać tego co nie jest przetłumaczalne na JS. Inaczej dostaniemy błędy kompilacji typu: No source code is available for type <nazwa_klasy> did you forget to inherit a required module?. Trzeba wtedy sprawdzić, czy wskazywana klasa jest osiągalna w client lub shared.

W GWT jest coś takiego ciekawego jak SafeHTML. Chroni on przed atakami Cross-Site-Scripting (XSS). Było tylko o tym wspomniane i z pewnością trzeba kiedyś temat zgłębić.

Inna ciekawostką są klasy rozszerzające SelectionScriptLinker. Definiują one, w jaki sposób ma być generowany kod JS przez kompilator. I tak IFrameLinker generuje kod GWT ładowany w osobne znaczniki <IFRAME>. Inna klasa SingleScriptLinker generuje pojedynczego JavaScript’a, a CrossSiteIframeLinker umożliwia ładowanie skryptów z różnych lokalizacji. To ostatnie przydaje się, gdy deploy’ujemy aplikację na wielu serwerach.

Chcąc skorzystać z wybranego Linker’a musimy dodać odpowiedni wpis w pliku konfiguracyjny modułu (*.gwt.xml). I tak Chcąc skorzystać z CrossSiteIframeLinker dopisujemy:

<add-linker name="xs"/>

Dla SingleScriptLinker jest to:

<add-linker name="sso"/>

Wszystkie linkier’y należą do modułu core w GWT. Chcąc sprawdzić co jest domyślnie włączone i co jeszcze można włączyć, należy poczytać zawartość pliku Core.gwt.xml.

Na warsztacie dowiedziałem się w końcu jak z Developer Mode skorzystać. Wcześniej o nim coś słyszałem ale nie wiedziałem dokładnie jak działa. Najlepiej przygotować sobie projekt z poziomu Eclipse’a: File -> New -> Web Application Project. Dzięki temu mamy możliwość skorzystania z plugin’a GWT do Eclipse’a.



Wybierając opcję GWT Compile Project wtyczka kompiluje aplikację i tworzy konfigurację uruchomieniową dla Eclipse’a. Możemy również sobie wybrać ile kompilator na wypisywać na konsole podczas kompilacji, oraz jak ma wyglądać JS po kompilacji (Pretty, Obfuscated, Detailed)



O dziwo zaimportowanie projektu, utworzonego przez skrypt webAppCreator dostarczany wraz z GWT, nie pozwala nam korzystać z tego dodatku. Po udanej kompilacji możemy uruchamiać naszą aplikację w Development mode.



Wybieramy przeglądarkę i już można się nacieszyć nasza aplikacją. Zaletą jest to, że nie musimy za każdym razem rekompilować całej naszej aplikacji, tylko wciskamy F5 w przeglądarce. Pewnie są jakieś ograniczenia na to, co się automatycznie odświeża a co nie - kwestia dowiedzenia się.

Ciekawą funkcjonalnością jest możliwość logowania na konsolę po stronie klienta. Służy do tego moduł Logging. Aby go uaktywnić, należy w pliku konfiguracyjnym modułu dodać następujący wpis:

<inherits name="com.google.gwt.logging.Logging"/>

Ważne jest aby umieścić go przed naszym Entry Point’em!!! Ja umieściłem za i się męczyłem kilka godzin czemu nie działa.

I już możemy logować:

logger.info("onModuleLoad()");
logger.log(Level.WARNING, "warning");
logger.log(Level.INFO, "info");

Trzeba pamiętać, aby dołączyć standardową bibliotekę javową: java.util.logging.Logger. Efekt widać na konsoli w Eclipse:

Sun Oct 16 19:20:33 CEST 2011 LogowanieEntryPoint
INFO: onModuleLoad()
Sun Oct 16 19:20:33 CEST 2011 LogowanieEntryPoint
WARNING: warning
Sun Oct 16 19:20:33 CEST 2011 LogowanieEntryPoint
INFO: info

Jak i w przeglądarce:



Inną ważna rzeczą jest przyspieszanie kompilacji projektu. Niestety kompilacja do JS trwa długo i dodatkowo jest generowany kod na 6 przeglądarek. Warto dla celów development’u ograniczyć kompilację do jednej przeglądarki. I tak aby generować kod dla Firefox’a należy w pliku konfiguracyjnym moduł dodać następująca linijkę:

<set-property name="user.agent" value="gecko1_8"/>

Warto wiedzieć, że wpisy te są zdefiniowane w UserAgent.gwt.xml.

Tyle mniej więcej było do przerwy obiadowej. Około 13.45 zaczęły przychodzić pierwsze Pizze. Było ich sporo i co jakiś czas dochodziły nowe. Można było się spokojnie najeść, bo pod koniec przerwy widziałem jeszcze niedojedzone kawałki. Jako że przed przerwą budowanie aplikacji nie chciało mi działać, uniemożliwiało mi to aktywne uczestnictwo w warsztatach. Postanowiłem więc (nie ja jeden) przenieść się na ścieżkę wykładową.

Najpierw Koziołek mówił na temat tego jak jeszcze można wykorzystać biblioteki testowe. Otóż ułatwiają one nam budowanie walidatorów danych (np. otrzymanych od klienta). Tutaj Bartek pokazywał jak skorzystać z TestNG.

Inna ciekawostka to zastosowanie Mockito w kodzie produkcyjnym. Da się i jest to przydatne, gdy wiemy, że jakaś funkcjonalność dojdzie w niedalekiej przyszłości, ale jeszcze nie wiemy co to de facto będzie. W tym momencie możemy sobie zbudować interfejs taki, jak będzie nam potrzebny i go zmockować, aby zwracał nam domyślne wartości. Jak już będzie wiadomo co / jak należy to poprawnie zaimplementować, to wyrzucając mocka podpinamy konkretną implementację. Ciekawe rozwiązanie, choć dla niektórych może to być zbyt kontrowersyjne.

Na koniec było jeszcze o DbUnit. Dzięki tej bibliotece możemy zasilać naszą bazę nowymi danymi, np. wraz z kolejnymi release’ami naszej aplikacji. Nie musimy w tym momencie utrzymywać skryptów SQLowych (co jest kosztowne i trudne), a przygotowanie danych można zrzucić na klienta dając mu do ręki Excela.

W ogólności zaletą zastosowania opisywanych bibliotek jest minimalizacja ilości naszego kodu, bo więcej naszego kodu = więcej błędów. Opisywane biblioteki są przetestowane przez duże grono użytkowników, a gdy nasz kod jest mniejszy to łatwiej znaleźć w nim ewentualny błąd. Dodatkowo wykorzystanie TestNG powoduje powstawanie programów samotestujących się.

Na koniec został wykład Jacka Laskowskiego. Jacek opowiadał o TomEE czyli starym Tomcat’ie rozszerzonym o kilka bibliotek (CDI – OpenWebBeans, EJB – OpenEJB, JavaMail, OpenJPA, JSF – MyFaces, JTA - Geronimo Transaction) i certyfikat serwera aplikacji. Czyli mamy nowe narzędzie, które obsługujemy jak stare, a daje nam kilka dodatkowych możliwości. Wcześniej mogliśmy dołączyć dodatkowe moduły ręcznie.

Po omówieniu teoretycznym, Jacek pokazał kilka sztuczek z NetBeans’em i TomEE i jak można szybko wystartować z nowym narzędziem. Niby żaden przełom, ale myślę, że nowy Tomcat pomoże zacząć nowicjuszom współpracę z nim. Sporą cześć tego co była na wykładzie można przeczytać na blogu Jacka, a pewnie jeszcze jakieś uzupełnienia się pojawią. Samo prowadzenie prezentacji jak zwykle na dobrym poziomie.

Na koniec były jeszcze podziękowania dla sponsorów / organizatorów i losowanie nagród. Jak zwykle zostało wylosowane sporo osób, które już poszły do domu. Chyba warto w końcu napisać prostą maszynę losującą, gdyż podobny problem z nagrodami pojawia się na innych konferencjach.

Podsumowując organizacyjnie po za wifi i prądem nie było się do czego czepiać. Pizzy było wystarczająco, napojów troszkę mniej, a i tak super że były. Szkoda trochę, że warsztat z GWT trochę nie wyszedł (problemy z netem i skryptem budującym), ale na szczęście można było alternatywnie pójść na wykłady. No cóż trzeba będzie samemu bardziej usiąść do tej technologii i się pobawić.