Pokazywanie postów oznaczonych etykietą warsjawa. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą warsjawa. Pokaż wszystkie posty

poniedziałek, 1 grudnia 2014

Warsjawa 2014 podsumowanie nr 2 i dawanie feeedback’u

W moim przedostatnim wpisie: Warsjawa 2014, czyli ja jako prowadzący 2 warsztaty umieściłem materiały z których korzystałem podczas tych warsztatów i opisałem swoje pierwsze wrażenia. Teraz czas na kolejną ostatnią część podsumowania, ponieważ już jakiś czas temu spłynęły do mnie wyniki ankiety przeprowadzonej przez organizatorów. A jest się czym pochwalić :-D Poniżej zamieszczam fragmenty korespondencji, którą otrzymałem od organizatorów.

Odnośnie Upiększ swoje testy. Testowanie jednostkowe dla średnio zaawansowanych


Your workshop was among best workshops of Warsjawa 2014! 
Here comes the results: 
number of feedbacks: 8 
average grade (1 to 5, higher is better): 4.63 
feedback comments: 
- A lot of knowledge presented, but a bit too fast. 
- Bardzo fajne i przydatne warsztaty - fajnie zorganizowane 
- Z warsztatów jestem bardzo zadowolony. Poznałem nowe, lepsze metody testowania, których mam nadzieje użyć w codziennej pracy. Projekt na githubie znacznie ułatwił cala sprawę. Dziękuje :) 
- Workshop was as described. From a begginer point of view approach : from simplest libraries to most helpful was realy good.


Co to dla mnie oznacza? Że dostałem 5 głosów z oceną 5 i 3 z oceną 4, lub jakiś inny wariant dający sumę 37. Przy ośmiu głosach daje to właśnie oceną 4.63 (a dokładniej 4.625). Bardzo się cieszę tak wysoką oceną, która w tym momencie trochę rekompensuje ogrom trudu włożonego w przygotowanie tegoż warsztatu.

Odnośnie Poznaj lepiej swoje środowisko programistyczne i zwiększ swoją produktywność z IntelliJ Idea

Here comes the results: 
number of feedbacks: 6 
average grade (1 to 5, higher is better): 4.5 
feedback comments: 
- Prawdziwe warsztaty, bardzo ciekawie poprowadzone na konkretnym przykładzie. Nie mam do nich żadnych uwag. 
- Miałem iść na C/C++ in Android Apps. Jednak mnogość instalowania narzędzi zniechęciła mnie (była sobota 16:00)... dosłownie na 1 minutę przed startem warsztatu przyszedłem tutaj. I nie żałuje. Skrótów wszystkich nie zapamiętałem, ale wiem dokładnie co można za ich pomocą osiągnąć. Formuła warsztatu wymagała ciągłego zaangażowania oraz umożliwiała świetną zabawę w poprawienie kodu kogoś innego :) Prelegent bardzo pozytywnie nastawiony do życia i moim zdaniem niezły kozak jeżeli chodzi o Intelli :) 
- Very good workshop, I learned a lot about the Intellij Idea.

Tutaj ocena nie jest już tak wysoka, ale i tak jest dobrze. Zwłaszcza że warsztat był w sobotę pod koniec dnia i większość już pewnie myślała o wieczornym piwie. Bardzo mnie tutaj ucieszyła druga opisowa opinia jednego z uczestników. Dzięki - kimkolwiek jesteś.

Podczas analizowania feedbacku od uczestników moich warsztatów naszły mnie jednak smutne przemyślenia. Ludzie bardzo niechętnie dają opinię zwrotną drugiej osobie! Trzeba się o nią wręcz dopraszać i ciągnąć za język. Szkoda, że system głosowania na Warsjawie nie zadziałał, bo on mógłby dać trochę szerszy obraz oceny warsztatu. A tak, to ankietę pokonferencyjną – jak widać powyżej – mało komu chce się wypełnić. Nie wiem czy to wynika z naszej introwertycznej natury, nieśmiałości, poprawności politycznej, czy z problemu z wyrażaniem swoich odczuć? Przecież na co dzień przekzujemy dalej swoje opinie na temat kodu naszych współtowarzyszy projektu. Przecież robicie Code Review? A może nie?

W każdym bądź razie prelegenci, czy też prowadzący warsztaty – zwłaszcza Ci poczatkujący – oczekują jakiejś zwrotnej opinii na temat swojej pracy! Wierzę w możliwość ciągłego udoskonalenia się i poprawiania swoich zdolności, aby kolejnym razem wypaść lepiej.

W jaki sposób wiec najlepiej zbierać konstruktywne opinie o sobie i swojej pracy? Jak masz jakieś pomysły to koniecznie pisz w komentarzach!

Chcę jeszcze dokonać publicznej konstruktywnej samooceny (aby dać przykład, jakie potknięcia warto wytykać) i napisać, co poszło mi nie tak na moich warsztatach, aby następnym razem nie popełnić tego samego błędu. Na pierwszym warsztacie zapomniałem puścić powitalny filmiki od organizatorów. Niestety, ale tuż przed samymi warsztatami musiałem trochę pozmieniać bazę w git’cie (mam na myśli rebase, ale nie mam pojęcia jak to można na polski przetłumaczyć), aby historia na publicznym repo nie wyglądała później tak:

Z tego względu gdzieś mi umknęła wiadomość od organizatorów, prosząca o puszczenie filmików. Sory!

Co do drugiego warsztatu, to trochę mniej się do niego przygotowałem (w sensie slajdów), ale na szczęście nie to było najważniejsze, co widać po ocenie. Ważne, że uczestnicy się świetnie bawili i wynieśli sporą wiedzę z warsztatu.

Błędem był jednak brak porządnej aplikacji na telefon / tablet, pokazującej odliczany czas i dającej sygnał dźwiękowy co określony interwał. W tym warsztacie było bardzo ważne, aby co 5 minut robić zmianę, ale mój budzik nie zawsze dzwonił, przez co niektórzy siedzieli dłużej przy klawiaturze. Jak ktoś ma godną polecenia aplikację, do tego na Androida, to czekam na info!

Również brak przerwy mniej więcej w połowie warsztatu był kiepskim pomysłem, gdyż to chyba szybko wymęczyło ludzi. W okolicach drugiej godziny, widziałem zmęczenie na twarzach uczestników. A przerwa tuż przed końcem warsztatów nie była wystarczająco odświeżająca.

Mogłem również się trochę lepiej przygotować z implementowanego problemu, aby w razie dojścia do ślepego zaułku (do którego doszliśmy), aby szybko z niego wyskoczyć na właściwe tory. Do poprawienia następnym razem.


Przy okazji konfitury, firma Spartez zorganizowała jeszcze konkurs dla uczestników. Zadania można było rozwiązać wcześniej online, aby nie tracić czasu na samej konferencji. Jak zobaczyłem pytania (a było ich 6), od razu wiedziałem kto wygra – i nie pomyliłem się. Mimo wszystko zostałem wyróżniony i dostałem gadżety firmowe. Niestety ucho od kubka się potłukło w transporcie, ale jakoś mi specjalnie na nim nie zależało. Liczy się satysfakcja, z rozwiązanych zadań.

Podsumowując, obydwie wysokie oceny z warsztatów motywują mnie do dalszego działania w sferze dzielenia się moją wiedzą z innymi. Jeśli więc chciałbyś, abym poprowadził któryś w/w warsztatów u Ciebie w mieście / w firmie, daj znać na priv – e-mail do mnie znajdziesz na tej stronie.

A jeśli nie miałeś/-aś okazji uczestniczenia w moich warsztatach podczas Warsjawy, to być może, niedługo będzie taka możliwość w okolicach Wrocławia. Po więcej szczegółów zapraszam na stronę: chamberconf.pl

poniedziałek, 29 września 2014

Warsjawa 2014, czyli ja jako prowadzący 2 warsztaty

W tym roku miałem okazję poprowadzić 2 warsztaty na Warsjawie. Wcześniej prowadziłem jedynie prezentacje (czy to w pracy czy na WrocławJUG), a w formie warsztatów to był mój pierwszy raz! I od razu 2 różne tematy!

Jak mi poszło? Uważam, że co najmniej dobrze. Wydaje mi się, że nie miałem większych potknięć, feedback zbierany od uczestników jest jak dotychczas pozytywny.


Podobne opinie słyszałem, gdy się podpytywałem uczestników, jak i przeczytałem w e-mailach. Pewnie coś więcej będę mógł się dowiedzieć (zwłaszcza liczę na uwagi krytyczne, aby wiedzieć co poprawić następnym razem), gdy uczestnicy wypełnią ankietę pokonferencyjną. Wszelakie e-maile i komentarze również mile widziane.

A tymczasem zamieszczam poniżej materiały z których korzystałem.

Upiększ swoje testy! Testowanie jednostkowe dla średniozaawansowanych.



Kod używany na warsztacie: https://github.com/mstachniuk/SolarSystem

Poznaj lepiej swoje srodowisko programistyczne i zwieksz swoja produktywnosc z IntelliJ Idea.

Kod napisany przez uczestników podczas warsztatów: https://github.com/mstachniuk/WarsjawaCodingDojo

Co do samej konferencji, to minusy (z punktu widzenia prelegenta):
- nie do końca przygotowane sale (rzutnik, nasłonecznienie, jakieś pudła)
- system do komunikacji z uczestnikami nie wysyła załączników i wiadomości nie dochodzą do wszystkich
- nie do końca udany pomysł ze szwendaniem się po knajpach po konferencji

A na plus:
- obecność zagranicznych spikerów
- wcześniejsza rejestracja dla prelegentów
- transparentnosć, co ile kosztowało
- długie przerwy, dobry timeline

I oby tak dalej, albo i jeszcze lepiej!

czwartek, 11 września 2014

Rusza rejestracja na tegoroczną Warsjawę oraz moje tematy

Już niedługo (21.09.2014 21:00) ruszy rejestracja dla uczestników Warsjawy - darmowej konferencji, która składa się z samych warsztatów! Liczba miejsc jest ograniczona, dlatego warto się spieszyć, zwłaszcza, że jest szansa na warsztaty, które będzie prowadził Venkat Subramaniam! Jest to założyciel Agile Developer, autor wielu książek jak i świetny prelegent, którego mieliśmy okazję wielokrotnie oglądać na polskich konferencjach. Styl jego prezentacji jest specyficzny, a o części jego wystąpień można przeczytać na moim blogu.

Dzięki wizycie Venkata w Warszawie, udało się go zaprosić także do Wrocławia i poprowadzi on wykład Programming with Lambda Expressions w ramach WrocJUG. Będzie również warsztat: Programming Concurrency - Workshop, ale na niego nie ma już miejsc, a lista oczekujących jest długa.

Jednocześnie zapraszam na warsztaty, które sam będę prowadził w ramach Warsjawy. Poniżej przedstawiam tematy, które będę prowadził, wraz z krótkim komentarzem.

Czas: Piątek, 26 września 2014 13:00
Temat: Upiększ swoje testy. Testowanie jednostkowe dla średnio zaawansowanych

Opis: Warsztat jest przeznaczony dla średniozaawansowanych programistów Java, którzy napisali już trochę testów i chcieliby je upiększyć. Podczas warsztatu będziemy ćwiczyć tworzenie ładnej sekcji given (za pomocą Builder'ów), jak i czytelniejsze zapisywanie assercji (za pomocą Hamcrest'a, FEST'a i AssertJ). Bedzie jeszcze o testowaniu wyjątków i testach parametrycznych. Warsztat będzie prowadzony po polsku, względnie może być po niemiecku;) Wymagane jest zabranie ze sobą własnego komputera ze skonfigurowanym środowiskiem programistycznym i opcjonalnie konto na GitHub'ie (do przesyłania gist'ów).

Być może, jak starczy czasu, będzie można poćwiczyć jeszcze inne rzeczy, ale to już zależy głównie od prędkości grupy, jak i zainteresowania tym, co będą chcieli usłyszeć uczestnicy.

Czas: Sobota, 27 września 2014 16:00
Temat: Poznaj lepiej swoje środowisko programistyczne i zwiększ swoją produktywność z IntelliJ Idea

Opis: Każdy programista powinien poświęcić 10 godzin na dogłębne poznanie swojego zintegrowanego środowiska pracy, aby móc z niego efektywnie (i efektownie) korzystać! A Ty ile czasu na to poświęciłeś? Warsztat jest przeznaczony dla programistów Java, korzystających z IntelliJ Idea, lub chcących się go nauczyć. Warsztat będzie miał formę Coding Dojo, podczas którego będziemy wspólnie pisać Katę i wzajemnie uczyć się korzystania z Idei bez użycia myszki. Warsztat będzie prowadzony po polsku, względnie może być po niemiecku;) Własny komputer nie jest wymagany, gdyż będziemy kodować wspólnie na jednym, podpiętym do rzutnika. Przyda się za to notatnik i długopis do zapisywania nowopoznanych kombinacji klawiszowych.

Na pomysł tego warsztatu wpadłem po tym, jak go z wielkim sukcesem przeprowadziłem w ostatnim projekcie. Po prostu, gdy udało się kupić IntelliJ Idea dla całego zespołu (o co bardzo ciężko walczyłem - skutecznie), musiałem wdrożyć kolegów w nowe środowisko. Wcześniej pokazywałem jedynie czym się różni Idea od Eclipse'a, ale to nie to samo co praktyka przy klawiaturze. Nie chciałem również słyszeć narzekań, że teraz trzeba się na nowo uczyć wszystkich kombinacji klawiszowych.

Zebrałem więc cały zespół, wyjaśniłem zasady i poszłooo! Było bardzo intensywnie, śmiesznie i co najważniejsze pouczająco. Ludzie wychodzili wówczas z sali z ugotowaną głową, ale widziałem później, że te warsztaty bardzo im pomogły. Zebrałem również bardzo pozytywne opinie na retrospektywie.

Mam nadzieję, że na Warsjawie będzie równie gorąco.

P.S. W razie jak byście chcieli się wcześniej zapisać na warsztaty, to przeczytajcie ten status.

czwartek, 24 października 2013

Warsjawa 2013

W tym roku jakoś tak biednie u mnie było, jeśli chodzi o konferencje javowe (z różnych względów), ale na szczęście udało mi się zawitać na Warsjawę. Trzeba więc relację z tegoż wydarzenia skrobnąć, aby w przyszłości było gdzie zajrzeć do notatek, gdy przyjdzie mi zmierzyć się z jakimś poważniejszym problemem wydajnościowym lub a Akką.

Warsztat z Profilowania aplikacji JVM prowadzili Kuba Kubryński i Michał Warecki. Na początku było strasznie dużo teorii (właściwie do przerwy obiadowej), no ale nie każdy ma możliwość zmierzenia się z takimi problemami na co dzień, więc należało dużo wytłumaczyć i pokazać, co jest standardowo dostępne wraz z zainstalowanym systemem operacyjnym i JDK.

Zaczęło się od pamięci w Javie. Generalnie można ją podzielić na 3 części:
  • Young Generation
  • Old Generation
  • Permanent Generation

Młoda i stara generacja są przechowywane na stercie, a ostatnia trzecia część pamięci to Perm Gen, gdzie znajdują się załadowane klasy wraz z metodami. Co ważne, to to, że internowane Stringi lądują w Perm Gen i dlatego warto sprawdzać, ile one zajmują. Na szczęście od wersji 7 problem ten znika, gdyż teksty lądują na stercie. Więcej na ten temat tutaj: Java SE 7 Features and Enhancements.

Jest jeszcze coś takiego jak Code Cache, czyli miejsce w pamięci na skompilowany kod natywny naszych aplikacji. Pewnie jeszcze by się coś tam znalazło, ale nie jest to dla nas w tym momencie interesujące.

Następnie było o tym, jaka jest różnica między boolean a Boolean, a właściwie ile to obydwa twory zajmują pamięci. I tak boolean to jeden bit, ale Boolean to 12 bajtów nagłówka obiektu i jeden bit. A że nie można takich dziwnych, nieokrągłych wartości w pamięci używać, klasa zostanie dodatkowo wyrównana do 32 bitów (4ch bajtów) lub ich wielokrotności, w przypadku 32 bitowej maszyny wirtualnej. W przypadku 64 bitowej wersji będzie to zaokrąglenie do 64 bitów (8 bajtów), lub wielokrotności oczywiście.

Tak więc Boolean zajmuje w Javie aż 16 bajtów! Dlatego ze względów wydajnościowych, gdy trzecia wartość wyrażenia logicznego (null) jest nam niepotrzebna, to warto Boolean’a unikać.

Było jeszcze o rozmiarach, jakie zajmują obiekty:
  • shallow – to rozmiar samego obiektu wraz nagłówkiem
  • deep - rozmiar całego grafu obiektów, jaki jest osiągany z danego obiektu.
  • retained - rozmiar definiujący, ile pamięci było by zwolnione, gdyby właśnie wystartował Garbage Collector.

Jeszcze ciekawsze rozwiązanie to odśmiecanie przez kopiowanie, czyli Copying GC. W Young Generation mamy dwa obszary: From (Survivor1) i To (Survivor2). Gdy pierwszy z nich się zapełni i gdy nadejdzie czas na odśmiecanie, to żyjące obiekty zostaną przekopiowane z From do To. Następnie zamienią się role bloków, tzn. blok From stanie się nowym blokiem To, a obecnie zapełniony To stanie się nowym From. Każde takie kopiowanie pomiędzy Survivor1 i Survivor2 zwiększa wiek życia obiektów. Dzięki temu zabiegowi kopiowania do nowej przestrzeni, pamięć jest regularnie defragmentowana. Intensywnie z tego podejścia korzysta The Garbage First Garbage Collector (G1 GC). W tym przypadku pamięć jest podzielona na sporo kawałków, pomiędzy którymi, podczas odśmiecania, są kopiowane elementy.

W JVM są dostępne różne implementacjie Garbage Collectorów. I tak przykładowo domyślnym jest Serial GC (-XX:+UseSerialGC). Działa on jednowątkowo i blokuje inne zdania. Ale przynajmniej nie traci się tutaj czasu na przełączanie kontekstu.

Kolejną implementacją jest Parallel GC (albo jak podaje dokumentacja: throughput collector). Można ją uaktywnić pomocą -XX:+UseParallelGC a cechuje się ona tym, że w przeciwieństwie do Serial GC, używa wielu wątków do przyspieszenia odśmiecania. Domyślnie tylko generacja Young (Minor) jest odśmiecana równolegle. Aby również starą (Old, Major) generację równolegle odśmiecić, należy skorzystać z opcji -XX:+UseParallelOldGC. Te strategie redukują narzut Garbage Collektora na aplikację.

Kolejną implementacją czyszczenia pamięci z nieużytków jest Concurrent Collector (-XX:+UseConcMarkSweepGC), zwany też często CMS. Jest on zalecany tam, gdzie preferuje się krótkie przerwy na odśmiecanie, gdzie jest dużo długożyjących danych, na maszynach z dwoma lub więcej procesorami.

Jest jeszcze G1 GC, oficjalnie dostępny od JDK 7. Dzieli on całą pamięć na bloki, w których są umieszczane nasze dane. Gdy obszar się zapełni, dane są przenoszone do innych bloków, a co jest nie potrzebne - jest usuwane. Docelowo G1 GC ma zastąpić CMS GC.

Następnie były przedstawione Unixowe narzędzia, które mogą nam pomóc podejść do problemu od trochę innej strony (nie koniecznie od dupy strony). I tak za pomocą htop można podejrzeć drzewo procesów, również Javy. Iostat pokazuje utylizację zasobów na poziomie I/O. Dzięki temu można się np. dowiedzieć, że dysk nam nie wyrabia. Free pokazuje ilość wolnej / zajętej pamięci, a dstat przerywania, Contex Switche i inne różne zużycia. Natomiast perf to taki systemowy profiler. Uwzględnia on Contex Switch’e, migracje CPU (przerzucenie wykonywania czegoś na inny procek), ilość instrukcji na cykl CPU, odwołania do cache procesora.

Następnie było o narzędziach dostępnych w JDK. Poniżej opiszę tylko to, czego nie opisałem w relacji z JDD 2012.

Jinfo najczęściej pokazuje komunikat „Error attaching to process...”, ale jeden z prelegentów ma na to 2 obejścia: sudo sh -c "echo 0 > /proc/sys/kernel/yama/ptrace_scope"
Lub w: /etc/sysctl.d/10-pthrace.conf ustawić kernel.yama.ptrace_scope = 0

Pierwsze jest tymczasowe i każdy admin powinien nam je na chwilę dać, a drugie jest permanentne, ale z jakiś tam względów niebezpieczne. Kolejne narzędzia to:

jstat -class PID 5s - komenda ta zrzuca nam co 5 sekund informację, ile jest załadowanych klas, ile pamięci zajmują i ile jest „odładowanych” klas
jstat -gc PID 5s - daje nam informacje o utylizacji pamięci
jstat -printcompilation PID 5s – pokazuje nam, które metody są skompilowane do kodu natywnego przez kompilator JIT (just-in-time compilation).
jstack PID - pokazuje stacktrace’y wszystkich wątków

Gdy chcemy się pobawić trochę linią poleceń, to możemy w ten sposób: java -XX:+PrintFlagsFinal -server –version wyświetlić sobie wszystkie flagi w Javie i poznać ich wartości domyślne. Niby znaczenie tych flag miało być gdzieś w dokumentacji opisane, ale jedyne co sensownego znalazłem to ten wpis na blogu: Hotspot JVM Options - The complete reference.

Później było jeszcze o Alekseyu Shipilevie i jego projekcie Java Object Layout. Niestety obecnie jest on niedostępny. Udało mi się gdzieś binarkę znaleźć, ale problem jest, jak to podpiąć pod Ideę / Eclipse’a, gdyż wszyscy linkują do strony autora, a ta już nie istnieje. Ale generalnie dzięki temu narzędziowi można podejrzeć wielkości, jakie zajmują w pamięci nasze klasy.

Było jeszcze trochę o Java VisualVM dostępnym standardowo w JDK. Warto do niego doinstalować pluginy, takie jak: MBeans, GC Viewer, Visual GC, Tracer i inne. Dzięki temu będziemy mogli sporo ciekawszych informacji podczas tuningowania naszych aplikacji uzyskać.

Po przerwie było jeszcze o Java Mission Control narzędziu, które jest dostępne JDK od wersji 7u40. Na pewno warto się przyjrzeć bliżej temu narzędziu.

Na koniec było jeszcze trochę o JProfileru i nadszedł czas na trochę praktyki. Za pomocą aplikacji profiling można było zobaczyć jak się zachowują różne implementacje Garbage Collectora, jak wyglądają wycieki pamięci itp. Podpinaliśmy się pod aplikację za pomocą JVisualVM’a i tam było bardzo ładnie widać co jak działa.

Kolejnym warsztatem, w którym uczestniczyłem, była Akka, prowadzona przez Maćka Próchniaka. Było już trochę widać zmęczenie po twarzach uczestników jak i samego prelegenta. No ale cóż, 17 godzina to trochę późna pora, zwłaszcza jak się chwilę wcześniej w innych warsztatach uczestniczyło.

Początkowy wstęp teoretyczny był bardzo klarownie przedstawiony i wszystko wydawało się bardzo jasne i proste. Takie się nie okazało, gdy przeszliśmy do kodu. Tam już było trochę ciężej. Postanowiliśmy, że zamiast osobno rozwiązywać zadania przygotowane przez Maćka, to rozwiąże on je sam, a reszta popatrzy. Tutaj jednak już nic więcej nie napiszę co zapamiętałem, ani czego się nauczyłem, gdyż trochę nie nadążałem / nie funkcjonowałem, a nieużywanie Skali od czasów ostatniego kursu Oderskiego dało mi się we znaki. Na szczęście niedługo startuje kolejna część tego kursu: Principles of Reactive Programming. Trzeba sobie do tego czasu trochę odświeżyć Scalę, aby gładko przez kurs przebrnąć.

Na koniec udało nam się zestawić razem rozproszonych aktorów, którzy komunikowali się ze sobą.

Byłem jeszcze na imprezie powarsztatowej. Udało mi się odnowić parę starych znajomości, trochę nowych nawiązać, dostać opieprz, że nic nie piszę na blogu (a więc jednak ktoś to czyta i niektórym komuś to pomaga), ani że nie występuję na konferencjach (zwłaszcza tych zagranicznych, nie mówiąc już o polskich). No cóż będę się starał zmienić ten stan rzeczy no i mam nadzieję, że się uda.

Na koniec należą się jeszcze wielkie brawa dla organizatorów, wolontariuszy i sponsorów, za super warsztaty (choć sam może nie trafiłem na typowe warsztaty), dobrą atmosferę i możliwość dzielenia się wiedzą jak i jej zdobywaniem. Sieć po kablu bardzo dobrze działała, trochę może brakowało informacji, gdzie, jaka sala się znajduje. Rozumiem też, że wydarzenie było darmowe i budżet był nie wielki, ale zabrakło mi... herbaty. No cóż, nie każdy jest przecież kawowcem (choć w naszej branży to chyba tylko jakieś odosobnione wyjątki), ale w ogólnej ocenie całości można ten detal pominąć. Trzymajmy poziom, aby w przyszłym roku było co najmniej tak dobrze jak w tym.

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ć.