19 grudnia 2012

Przyszłość WJUGa widzę w różowych barwach

0 komentarzy
W ostatni wtorek odbyło się długooczekiwane spotkanie na temat przyszłości grupy Warszawa JUG, która liczy obecnie 669 członków zapisanych na forum.


Jak można zorientować się po aktywności uczestników dyskusji na forum i poza nim, głównie na spotkaniach, ale również na sztandarowych konferencjach grupy - Confitura oraz warsjawa, grupa rozwija się prężnie. Spotkania zaplanowane są aż do 19 marca, więc można założyć, że jeśli koniec świata ma nastąpić, to nie będzie to w nadchodzący piątek, ale najwcześniej 20 marca, bo wcześniej grupa ma do załatwienia jeszcze kilka spotkań.


I właśnie owe spotkania były zaczątkiem do dyskusji na forum Warszawa JUG o przyszłości grupy. Zawrzało. Należało się spotkać i omówić sprawy, bo coś jest na rzeczy.

I się spotkaliśmy.


Spotkanie było otwarte dla każdego, komu leży na sercu przyszłość grupy i może pojawić się osobiście na MIMUWie. Pojawiły się zadania do wykonania, które skrzętnie zanotował Wojtek w wątku o przyszłości WJUGa.

Jeśli chciał(a)byś zrobić coś dla warszawskiej społeczności javowej, to może warto rozważyć udział w pracach przy jej kształtowaniu? Udział w grupie Warszawa JUG uważam za dobre miejsce, aby sprawdzić swoje umiejętności twórcze. Czekamy na Ciebie!

p.s. Coraz częściej pojawia się idea zorganizowania hack-a-thonu w Warszawie. Trzymaj kciuki.

13 grudnia 2012

Pytań o prace inżynierską końca nie widać

7 komentarzy
To już nie pierwszy raz, kiedy odpowiadam na pytanie w stylu "Mam pytanie odnośnie tematu pracy inżynierskiej, może Pan pomógłby nakierować na wybrany temat z jakieś dziedziny Javy bądź czegoś nowego. Aplikacja biznesowa, rozbudowana, połączona z jakimś API bądź coś zupełnie innego. Liczę na odpowiedź."

I co ja mam takiemu biedakowi odpowiedzieć?! Za mało jestem wyrazisty w swojej znajomości Javy i samemu daleko mi do określenia swoich zainteresowań poznawczych.

Z jednej strony języki programowania, przede wszystkim funkcyjne, w których miejsce znajdują Clojure, Scala i F#, ale nie stronię od artykułów i ciekawych wskazówek ze strony Dart, JRuby, Jython i JavaScript. Nie bez echa pozostają wydarzenia wokół Java 8. Choćby w samych językach programowania sporo tego.

Do tego należałoby dorzucić Java EE, serwery aplikacyjne (Apache TomEE i WebSphere Liberty Profile), specyfikacje OSGi, Enterprise OSGi i SCA.

Później jeszcze produkty typu IBM Worklight czy IBM BPM, aby nie zapomnieć o wciąż nękającym mnie o więcej czasu platformie Android.

Jak można przeczytać, ja powinienem być ostatnią osobą, z którą należałoby się wiązać, albo przynajmniej pytać o sugestie, bo sam jestem w kropce, za co się zabrać (!) Robię tym samym wszystko i nic!

Skończyło się na takiej odpowiedzi, bo właśnie wczoraj zgłosiłem ten temat do programu w ramach IBM:

Proponuję Enterprise OSGi jako temat baaardzo ciekawy a wciąż niedoceniany. Zacząłbym od przejrzenia/przeczytania specyfikacji 4.2 [1] i zabrania się za dłubanie przykładowych aplikacji, które będą uruchamiane na WebSphere 8.5.5 Alpha Liberty Profile [2], które z kolei trafią do githuba [3]. Tego jak widzę nigdy za wiele, a ludziska wykazują zainteresowanie.

Sam nad tym obecnie siedzę, aby przygotować zestaw materiałów "reklamujących", więc moglibyśmy połączyć siły.

[1] http://www.osgi.org/Download/Release4V42
[2] https://www.ibm.com/developerworks/mydeveloperworks/blogs/wasdev/entry/download_wlp_v85next_alpha?lang=en
[3] https://github.com/

Powodzenia życzę wszystkim borykającym się z samookreśleniem i wyborem tematu prac. Nic bardziej mylnego myśląc, że różnorodność pomaga. Poszedłbym nawet dalej z moimi tezami. Zaczynam twierdzić, że wiedza wcale nie uskrzydla, a wręcz odwrotnie - ogranicza w myśleniu, kierując je na już przetarte szlaki. Tego zazdroszczę mojemu najmłodszemu synowi - otwartości umysłu, braku ograniczeń i pasji odkrywania. Straciłem to drugie, a zaczyna się koniec pierwszego. Życzę innych doznań w 2013!

Jako pomysł jakiejkolwiek pracy sugeruję wyłączyć wszystko wokół i zastanowić się, czego samemu chciałoby się użyć. Niechby to już istniało i niechby to był Facebook, nie ważne. Właśnie za to zabrałbym się w pierwszym rzucie i zaczął swoje poczynania rozwojowe. Po drodze pojawi się wiele ciekawych tematów-odprysków.

11 grudnia 2012

Tomek Kuprowski z Apache Cassandra na spotkaniu Warszawa JUG

2 komentarzy
Właśnie wróciłem ze spotkania Warszawa JUG, na którym Tomek Kuprowski prezentował temat Apache Cassandra w praktyce.

Spotkanie nie było specjalnie interesujące tematycznie, bo NoSQL nie jest moim konikiem, a jedynie użycie "w praktyce" w temacie przykuło moją uwagę, co w połączeniu z moją dłuższą niebytnością na spotkaniach sprawiło, że się zebrałem i wybrałem.

Nie żałuję wcale, bo zawsze to dobrze pooddychać tym samym powietrzem, co inni napaleńcy informatyczni, choćby to miało trwać jedynie 2 godziny. Utwierdziłem się, że temat NoSQL nie będzie w zakresie moich zainteresowań - całkiem inny świat od tego, w którym siedzę, a moje możliwości decyzyjne w tym zakresie są tak niewielkie, że aż niezauważalne i nie zamierzam tego zmieniać.

Nagranie jest, ale zanim się pojawi w sieci, sugeruję zapoznać się z innym ze spotkania poprzedniego, w którym Kamil Szymański przedstawiał Apache Cassandra teoretycznie. Chyba tylko dlatego, że poświęciłem trochę czasu na to nagranie wiedziałem, o czym się dzisiaj mówiło. Dało się zauważyć powiązanie między prezentacjami i świetnie to wyszło. Na pewno jeszcze wrócę do obu niebawem (chcę przeanalizować sposoby prezentacji tematu przez obu panów ponownie, aby zaczerpnąć trochę pomysłów dla swoich wystąpień).

Dzisiejszą prezentację otworzył nasz sponsor Krzysiek Wagner z firmy foxcode, który przedstawił firmę i jej idee - tworzenie aplikacji mobilnych na platformie Android i to wyłącznie w Javie! Nic hybrydowego z HTML5, a jedynie Java w pełnym tego słowa znaczeniu. Miałem okazję wracać z Krzyśkiem na Ursynów, więc skorzystałem z okazji, aby poświęcić czas na przekonanie go do dalszych wystąpień, tym razem jako prelegent (który w ten sposób przedstawiłby nie tylko, ile już wiedzą o Androidzie, ale jakiego typu problemy napotkali, aby tym samym jeszcze bardziej przyciągnąć kandydatów do pracy). A skoro o pracy, to poszukują 2 programistów mobilnych na Androida na zaraz, więc jest szansa popracowania w nietuzinkowym zespole. Więcej na nagraniu z dzisiejszego spotkania, które pojawi się niebawem. Kontakt do firmy znajdziecie na ich stronie.

Dzisiejsza moja wizyta na spotkaniu WJUGa przypomniała mi, że warto się na nich pojawiać częściej, bo napawają niewyjaśnionym optymizmem. Żywa dyskusja na koniec, po wystąpieniu Tomka, sprawiła, że zamiast ślęczeć nad pytaniami w pojedynkę, miałem odpowiedzi podane na talerzu i to przez dwóch dużo bardziej zaawansowanych praktyków - Kamila i Tomka. Dziękuję Panowie za wprowadzenie do tematu, a uczestnikom za podsycanie dyskusji. Dzięki Wam było warto! Cassandra będzie mi się mile kojarzyła.

24 listopada 2012

WebSphere Liberty Profile z Enterprise OSGi i Java EE na Eclipse DemoCamp w Poznaniu

2 komentarzy
Pamiętasz wpis z poprzedniej edycji Eclipse DemoCamp w roku 2011? Nie?! Zajrzyj do Wrażenia pokonferencyjne - o Eclipse DemoCamp w Poznaniu. Tam też znajdziesz zdjęcie, którym Łukasz postanowił utrwalić naszą znajomość. I właśnie podczas czwartkowego spotkania, zrobiliśmy sobie kolejne, ku głębszemu utrwalaniu.


A tak poza tą bojową miną Łukasza, miły z niego gość. Zebrał się wspólnie z Natalią i zorganizowali kolejną edycję Eclipse DemoCamp. Kolejny Eclipse DemoCamp w Poznaniu!

Można o tej konferencji wiele pisać, ale na pewno bez trudu można zauważyć, że EDC na stałe wpisało się w kalendarz imprez informatycznych w Poznaniu. Zawsze w ciekawych miejscach (aczkolwiek tegoroczne zaszumione karaoke w tle, co trochę irytowało) i z pełną salą (dobieraną zapewne pod liczbę uczestników, więc zawsze wydaje się, że ludzie się wylewają).

Ze względu na 95 minutowe opóźnienie pociągu Warszawa-Berlin pojawiłem się na konferencji na długo po tym, kiedy o pizzy przypominały jedynie sterty pustych opakowań, więc po pierwszym piwie moje ciało doznało lekkiego zaskoczenia alkoholowego i kiedy po Jarku Bąku i Darku Łukszy przyszło mi wystąpić, nie mogłem znaleźć języka w gębie. Atmosfera spotkania pozwoliła mi dość szybko dojść do siebie i zaaplikowałem publiczności odpowiednią dawkę mojej wiedzy.

Slajdów nie było, a kontynuacją wystąpienia będą przyszłe artykuły i skrinkasty, których należy oczekiwać więcej niebawem. Co do samej formy prezentacji, polecam przygotować kawałki kodu na slajdach i wspierać się nimi do uwypuklania wartościowych elementów prezentowanego tematu. Dodatkowo warto zawsze otwierać wystąpienie slajdami wprowadzającymi oraz podsumowującymi na koniec. I najważniejsze - różne metody prezentacji uatrakcyjniają jej zawartość, więc korzystaj ze slajdów, na których są rysunki, tekst, zdjęcia, mnóstwo kolorów czy figur oraz porcja kodowania na żywo w międzyczasie. Nie udaje mi się tego wdrożyć w pełni, ale mam wrażenie, że jest to podstawa udanego wystąpienia publicznego. Ciekawe doświadczenie móc tego skosztować.

Dziękuję Natalii i Łukaszowi za zaproszenie i zachęcam innych do przyszłego, *czynnego* współudziału, czy to w roli aktywnego uczestnika, czy współorganizatora, albo prelegenta.

Udział w tegorocznym EDC w Poznaniu odkładam do archiwum i uważam go za bardzo wartościowe doświadczenie. Polecam!

21 listopada 2012

Poznań by poznać - Eclipse DemoCamp i GDG DevFest

2 komentarzy
Jakoś tak umknęło mi, aby napisać, że od czwartku do niedzieli będę w Poznaniu na dwóch konferencjach w zaszczytnej roli prelegenta - Eclipse DemoCamp (EDC) w czwartek o 21:15 (!) oraz GDG DevFest Poland w sobotę o 12:00.

W ten sposób mam możliwość odwiedzić Poznań, aby poznać ludzi i ich opinie na prezentowane tematy. Na to liczę. Nie zamierzam występować w roli eksperta omawianych tematów. Wyrosłem z takiego myślenia (że w moim przypadku jest to w ogóle możliwe). Interesuje mnie wyłącznie rola osoby, która spędziła trochę czasu, aby zrozumieć tajniki współistnienia Enterprise OSGi z Java EE w ramach IBM WebSphere Application Server V8.5 Liberty Profile (to w czwartek na EDC) oraz współbieżności na platformie Android (sobota podczas GDG DevFest) i chciałaby podzielić się zdobytymi umiejętnościami z innymi, aby ukierunkować dalsze zgłębianie tematu.

Liczę na liczne przybycie oraz aktywny udział uczestników, aby poświęcony czas - organizatorów, uczestników oraz prelegentów - był wyłącznie mierzony w skali pozytywnych doznań (zamiast negatywnie jako zmarnowany).

Klimat konferencji tworzą wszyscy zaangażowani i ostatnią rzeczą powinno być narzekanie, że było nieciekawie, kiedy wystarczyło zawłaszczyć trochę czasu dla własnych potrzeb. Namawiam do zadawania pytań, nawet w sytuacji, kiedy istnieje przekonanie, że jest to najbardziej trywialne i najmniej pożądane pytanie w danej chwili (skąd w ogóle mogłoby nam przyjść takie myślenie do głowy, skoro pytanie jeszcze nie padło?!) Konwenanse zostawiamy w domu i pracy, a na konferencję przychodzimy z otwartymi umysłami pozbawionymi obostrzeń w postaci przeszłych (zamierzchłych?) doświadczeń, które nauczyły nas wyłącznie słuchać bądź akceptować prawdy oczywiste.

Zachęcam gorąco do zabrania pomidorów, aby skorzystać z kilku, jeśli okaże się to jedynym sposobem na wyrażenie swojej opinii nt. oprawy prezentowanego tematu, a pewnie i tym samym przegonienie prelegenta ze sceny (ze skutkiem natychmiastowym i pewnie dożywotnim) :-)

29 października 2012

Różnica między wyrażeniem a wyrażeniem (instrukcją)

3 komentarzy
Istnieje różnica między wyrażeniem a wyrażeniem. Jaka?! - zapytasz? Natychmiast idzie to wyłapać przy przejściu na język angielski, w którym mamy dwa różne słowa odpowiadające pojedynczemu w polskim - "expression" oraz "statement" (aczkolwiek dla tego drugiego Google Translator wskazuje na "oświadczenie" czy "deklaracja" przed "wyrażenie").

Jeśli pracujesz z językami imperatywnymi, np. Java, w których króluje "statement" i/lub językami funkcyjnymi, np. Scala lub Clojure, w których prym wiedzie "expression", warto znać różnicę. Przyznaję, że mi to trochę zajęło (zajęcia na studiach jakoś tak wtedy nużyły).

Niby oczywista jest ta różnica, ale nie wszyscy ją wyłapują. U mnie długo trwało zanim zaskoczyło. "expression" zawsze zwraca wartość i jest jej reprezentantem, a "statement" może, ale nie musi i zwykle stosowany jest dla skutków ubocznych, np. przypisanie częściowego wyliczenia do zmiennej poza nim, np. pętla for w Javie.

Od tej chwili usilnie próbuję zapamiętać, że w językach funkcyjnych korzystamy wyłącznie z "wyrażeń", podczas gdy w imperatywnych również i "instrukcji" (patrz Wikipedia w Instrukcja (informatyka) w sekcji Wyrażenia).

I już nie mam problemów ze wskazaniem wyrażenia od instrukcji. A nawet w tłumaczeniu!

Dla zwrócenia uwagi, posłużę się kawałkami kodu w Clojure.

If jest specjalną formą (= wyrażeniem) w Clojure (w przeciwieństwie do Javy) i działa na podobieństwo funkcji, które można przypisywać (aliasować), przekazywać do czy zwracać z funkcji.
user=> ; przypisanie
user=> (def if-inside
  #_=>   (if nil "nil jest prawda" "nil nie jest prawda"))
#'user/if-inside
user=> if-inside
"nil nie jest prawda"

user=> ; przekazanie do funkcji
user=> (defn my-fn [if-stmt]
  #_=>   if-stmt)
#'user/my-fn
user=> (my-fn if-inside)
"nil nie jest prawda"

user=> ; zwrocenie z funkcji
user=> (defn my-fn-returns-if-stmt [if-stmt]
  #_=>   (fn [] if-stmt))
#'user/my-fn-returns-if-stmt
user=> (my-fn-returns-if-stmt if-inside)
#<user$my_fn_returns_if_stmt$fn__3525 user$my_fn_returns_if_stmt$fn__3525@2304a962>
user=> ((my-fn-returns-if-stmt if-inside))
"nil nie jest prawda"
Proste, co?

A może jednak nie? Pytaj, aby było! Mówią, że to podstawy podstaw programowania funkcyjnego i brak zrozumienie fundamentów może negatywnie "promieniować" na dalszą znajomość jego.

25 października 2012

Ja z TomEE na JDD 2012 w Krakowie

11 komentarzy
Nie mam co do tego jakichkolwiek wątpliwości - krakowskie JDD na stałe wpisało się w harmonogram polskiej społeczności javowej, a ostatnie ruchy proidei ku umiędzynarodowieniu jej przynoszą wciąż niewielkie, ale zauważalne rezultaty. Wciąż jednak uważam, że JDD to bardzo lokalna konferencja, która jedynie przez swoje usytuowanie (Kraków) potrafi przyciągnąć uczestników i prelegentów. Na moje oko przewinęło się przez nią 200 osób w szczycie, a prelegenci wciąż nie zachwycają. Wciąż brakuje mi na niej nazwisk, które mogłyby gwarantować poziom wystąpienia i możliwość zamienienia słowa już po. Właśnie ta cecha konferencji, gdzie siedzę z prelegentami (częściej) i uczestnikami (rzadziej) sprawia, że JDD i inne konferencyjne propozycje inspirują mnie do dalszego rozwoju i poszukiwań.

Konferencja JDD 2012 trwa 2 dni - 25.10 (czwartek) i 26.10 (piątek) - ale ze względu na kolejne wyjazdy konferencyjne na Ukrainę na JavaDay musiałem zadowolić się jedynie pierwszym dniem i spotkaniem wieczornym dzień wcześniej. Podczas dnia konferencyjnego wystąpiłem z prezentacją o Apache TomEE, który jak zapewne uczestnicy już dobrze pamiętają, jest "zwykłym" Apache Tomcat plus dodatki. Owe dodatki sprawiają jednak, że pracujemy z certyfikowanym środowiskiem spełniającym wymogi specyfikacji Java EE 6 Web Profile (TomEE). Mamy również do dyspozycji edycje rozszerzone o JAX-RS (TomEE JAX-RS) czy JAX-WS i JMS (TomEE+). Jak możnaby to określić - dla każdego coś dobrego.

Tylko po co mi kolejny serwer aplikacyjny? I to jeszcze jakiś tam TomEE? Zajrzyj do prezentacji, a może coś jednak znajdziesz w TomEE dla siebie?



Gdyby zliczać liczbę wystąpień frazy "TomEE is Tomcat" to pewnie byłaby to najczęściej wspominana fraza podczas mojego wystąpienia. Moim założeniem było odpowiedzenie na pytanie "Dlaczego TomEE?" i mimo, że robiłem, co mogłem, to i tak na koniec padło pytanie "Po co mi TomEE?" :-) Możnaby zapłakać, ale faktycznie ucieszyłem się. W końcu kiedy to pytanie padło, to skoro padło, to znaczy, że niewystarczająco dobrze wyjaśniłem tę kwestię, a pytanie z tłumu posłużyło jako dodatkowy katalizator, aby inni zwrócili uwagę na moją odpowiedź, co życzyłbym sobie, aby było na samym początku. Siła pytania od publiczności uważam, że jest porównywalna z moimi staraniami, aby odpowiedź przebiła się do umysłów uczestników i każda pomoc mile widziana. Mam wrażenie, że teraz, po 50 minutach mojego wystąpienia, kilku zgodziłoby się na spędzenie kilku chwil z TomEE w swoich rozwiązaniach. Naprawdę warto, bo wszystko, co nowe rozwija, a praca z TomEE to praca z Tomcatem plus uzupełnienia do profilu webowego Java EE 6. Nie będę gołosłowny, kiedy powiem, że tworzenie aplikacji webowych z TomEE jest znacznie przyjemniejsze niż z czystym Tomcatem. Spróbuj i postaraj się skontrować moje tezy.

Nadmienię, że w zanadrzu mam(y) przecież jeszcze IBM WebSphere Application Server V8.5 Liberty Profile, którym jestem zafascynowany i który może wydawać się być łudząco podobny do Apache Tomcat czy Apache TomEE, ale faktycznie nimi nie jest i ma również swoje małe poletko, na którym rządzi niepodzielnie lub za chwilę będzie - patrz Enterprise OSGi i wykorzystanie kodów źródłowych pełnego WASa. To dla związanych z WASem stanowi niebagatelny powód, aby przystanąć w rzędzie korzystających z Liberty Profile. W końcu, jeśli docelowym środowiskiem uruchomieniowym będzie IBM WebSphere Application Server, to ostatnią rzeczą, jaką należałoby zrobić, jako programista, to korzystać z serwera alternatywnego, a najgorszym rozwiązaniem byłoby korzystanie z serwera o mniejszych możliwościach, chociażby na płaszczyźnie pełności wsparcia dla specyfikacji Java EE. Czyż praca z Tomcatem przed wejściem na WASa, to nie obdzieranie ze skóry możliwości WASa i obniżania wartości cech, które udostępnia?! Warto o tym pamiętać, na długo zanim zacznie się psioczyć na środowisko docelowe - może to być związane z niewłaściwymi oczekiwaniami, których sami jesteśmy autorem (!)

Jeśli chcesz spróbować się z WAS V8.5 Liberty Profile, zachęcam do lektury moich artykułów. Oferuję dodatkowo swoją pomoc (licząc, że sam ją również otrzymam). Ty zadajesz pytania, ja odpowiadam - wirtualnie przez artykuły, fizycznie, siedząc przy kompie ramię w ramię. Podejmiesz wyzwanie? Spotkania WJUGowe czekają :-)

Organizatorzy konferencji wraz z radą programową, w skład której wchodził m.in. ten Sławek Sobótka, pozwoliła mi na uchylenie rąbka tajemnicy o sensowność zastosowania TomEE. Okazało się, że pytanie o wdrożenie produkcyjne, które skwitowałem niemiłym ruchem ramionami na znak niewiedzy, już po moim wystąpieniu, sprowokowało jednego z uczestników do podzielenia się swoimi doświadczeniami w produkcyjnym użyciu TomEE. Jest jednak w Polsce produkcyjne wdrożenie, którego wyłącznym celem było przesyłanie plików za pomocą Web Services i Tomcat^H^H^H...ekhm...to znaczy TomEE...świetnie się do tego nadawał. Osoba rekomendująca nie miała problemów z wyborem po krótkim spotkaniu z TomEE. Działa i na to użycie sprawdza się znakomicie. Branża bankowa.

Mieć wybór - to lubię najbardziej! Jeśli wydawało Ci się, że świat kończy się na JBoss AS, Glassfish czy Tomcat, to teraz dorzucam jeszcze WAS V8.5 Liberty Profile, Apache TomEE, Apache Geronimo i jeszcze nie sposób nie wspomnieć o Oracle WebLogic Server czy Jetty. Mnogość rozwiązań może przerazić, a to pewnie i tak jedynie ułamek wiedzy, której się od nas wymaga.

A skoro o wiedzy, to podczas spotkania wieczornego, Kuba z Allegro pozwolił sobie przypomnieć mi o referencjach w Javie - Weak-, Soft- oraz PhantomReference. Zawsze jakoś odkładałem rozpoznanie ich na półkę z innymi rzeczami oczekującymi mojej uwagi, ale teraz zostałem przywołany do porządku i muszę usiąść nad nimi i zrozumieć ich zastosowanie w praktyce. W końcu to jedynie 5 klas z pakietu java.lang.ref (!) Znasz? Korzystasz? Podziel się wrażeniami! Zawsze to przyjemniej być prowadzonym przez bardziej doświadczone osoby.

Właśnie to najbardziej cenię sobie w możliwości udziału w konferencjach - bezpośredni kontakt z osobami, z którymi trudno byłoby mi się spotkać w innych sytuacjach. Jakkolwiek moim obecnym marzeniem byłoby omówienie TomEE i Liberty Profile, to sam TomEE dał mi również wiele satysfakcji. Był także miły wieczór w doborowym towarzystwie i było wystąpienie na drugi dzień - nie mogę narzekać. Tylko trochę żałuję, że nie mogłem zostać na imprezie integracyjnej z czwartku na piątek, bo wydawało mi się, że wielu mogłoby jeszcze zagadnąć mnie o sensowność TomEE, Liberty Profile czy wręcz Clojure. Szkoda.

Moje slajdy z prezentacji Apache Tomcat + Java EE 6 Web Profile = Apache TomEE znajdują się już na slideshare. Miłego oglądania i gorąco zachęcam do komentarzy. Kiedy dwóch rozmawia, to nierzadko prowokuje do konfrontacji aktualnej wiedzy, której kwestionowanie prowadzi do dalszego rozwoju. Skoro ciągła integracja jest tak ważna w naszej profesji, to można wnioskować, że ciągła integracja społeczna również. Czego Tobie życzę.

p.s. Nagrania z prezentacji mają się pojawić w Sieci wkrótce. Podobnie zdjęcia.

17 października 2012

Opóźnienia z => ciąg dalszy ze scala.Predef

2 komentarzy
Kiedy pisałem Różne miejsca wystąpienia => w języku Scala nie sądziłem, że symbol implikacji w Scali będzie mnie tak prześladował. W komentarzu do tego wpisu, Grzesiek napisał "no daj spokój, deklaracja sposobu przekazania wartości parametru metody ma być znajomością Scali "na wyższym poziomie"?", a tu na wykładzie Lecture 3.5 w "Functional Programming Principles in Scala" pojawił się scaladoc dla scala.Predef z assert, w którym drugi argument jest message: => Any. Widzicie ten symbol implikacji => przy Any?

W ten sposób możemy oczekiwać jedynie wykonania wyliczenia komunikatu, kiedy assertion typu Boolean jest spełnione. Sprytne. To lubię! Sprawdź to sam!
$ sbt console
Welcome to Scala version 2.9.2 (OpenJDK 64-Bit Server VM, Java 1.7.0-u10-b09).
Type in expressions to have them evaluated.
Type :help for more information.

scala> def printMessage = println("Wykonano mnie")
printMessage: Unit

scala> printMessage
Wykonano mnie

scala> assert(true, printMessage)

scala> assert(false, printMessage)
Wykonano mnie
java.lang.AssertionError: assertion failed: ()
     at scala.Predef$.assert(Predef.scala:160)
     at .<init>(<console>:9)
     at .<clinit>(<console>)
     at .<init>(<console>:11)
     at .<clinit>(<console>)
     at $print(<console>)
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
     at java.lang.reflect.Method.invoke(Method.java:601)
     at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704)
     at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:914)
     at scala.tools.nsc.interpreter.IMain.loadAndRunReq$1(IMain.scala:546)
     at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:577)
     at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:543)
     at scala.tools.nsc.interpreter.ILoop.reallyInterpret$1(ILoop.scala:694)
     at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:745)
     at scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:651)
     at scala.tools.nsc.interpreter.ILoop.processLine$1(ILoop.scala:542)
     at scala.tools.nsc.interpreter.ILoop.loop(ILoop.scala:550)
     at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:822)
     at scala.tools.nsc.interpreter.ILoop.main(ILoop.scala:851)
     at xsbt.ConsoleInterface.run(ConsoleInterface.scala:57)
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
     at java.lang.reflect.Method.invoke(Method.java:601)
     at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:73)
     at sbt.compiler.AnalyzingCompiler.console(AnalyzingCompiler.scala:64)
     at sbt.Console.console0$1(Console.scala:23)
     at sbt.Console$$anonfun$apply$2$$anonfun$apply$1.apply$mcV$sp(Console.scala:24)
     at sbt.TrapExit$.executeMain$1(TrapExit.scala:33)
     at sbt.TrapExit$$anon$1.run(TrapExit.scala:42)
Pewnie domyślasz się, skąd ten wyjątek przy drugim wykonaniu? Niespecjalnie istotne w kontekście =>, ale znać, nie zawadzi.

15 października 2012

Notacja prefiksowa, infiksowa i static w Scali, Javie i Clojure

11 komentarzy
Zastanawia mnie, jak programujący w Scali czy Javie zaimplementowaliby metodę max, która zwraca element maksymalny dwóch lub więcej elementów, dla których porównanie zostało zdefiniowane, np. liczb i relacji mniejsze niż.

Mam nieodparte wrażenie, że zaproponowane rozwiązanie, ze względu na klasę tych języków jako obiektowych, w których kładzie się nacisk na definiowanie klas, będzie łamało zasady enkapsulacji i wyniesienia metody na poziom globalny przez zastosowanie słowa kluczowego static. I dlaczego statyczna metoda max w Javie trafiło to do klasy java.lang.Math zamiast java.lang.Number czy podobnie? Interesujący problem.

A wszystko za sprawą zajęć "Functional Programming Principles in Scala". Na wykładzie "Lecture 3.2 - More Fun with Rationals" (około 6:25) pojawiła się implementacja metody max.
class Rational(x: Int, y: Int) {
     ...
     def max(that: Rational) = numer * that.denom < that.numer * denom
}
Ten przykład uzmysłowił mi, że notacja prefiksowa (w Clojure domyślnie lub w Javie i Scali przez metody statyczne) sprawia, że nazwa operacji występuje przed argumentami. Uważam jednak, że użycie static gdziekolwiek w Javie czy Scali, sprowokuje uwagi osób przestrzegających zasad programowania obiektowego, aby nie stosować go, bo niszczy te zasady przez złamanie reguł enkapsulacji. W tym przypadku dobrze byłoby móc zdefiniować statyczną metodę max, która akceptowałaby wiele obiektów Rational i zwracała największy. Sądzę, że ten przykład na wykładzie był niezwykle niefortunny, bo promował zawężenie działania max do wyłącznie dwóch liczb oraz korzystał z notacji infiksowej, która w tym akurat przypadku jest niefortunna.
new Rational(1, 2).max(new Rational(1,3))
zamiast
max(new Rational(1, 2), new Rational(1,3))
Sądzę, że to drugie rozwiązanie odzwierciedla właściwiej fakt porównywania dwóch lub więcej elementów. Możnaby zastanowić się, co miałaby zwrócić ta metoda dla pojedynczej wartości?! Propozycje mile widziane (a dociekliwych zapraszam do przestudiowania rozwiązania w Clojure - clojure.core/max).

I jakby na zamówienie, dzisiaj w skrzynce znalazłem maila od DZone z Refcard dla Scali! Promocja Scali działa pełną parą. Warto rozważyć podobne arkusze dla Clojure, podstaw programowania współbieżnego w Javie i Groovy. Miłej lektury.

14 października 2012

Różne miejsca wystąpienia => w języku Scala

6 komentarzy
Podczas zajęć "Functional Programming Principles in Scala" dowiedziałem się o możliwości definiowania parametrów wejściowych funkcji typu by-name, których wartość wyliczana jest z opóźnieniem - na czas, kiedy ich wartość jest potrzebna i z naciskiem na możliwe skutki uboczne. Zapis takiego parametru składa się ze znaku implikacji => oraz nazwy parametru funkcji. Jak rozumiem ze zdania "This feature must be applied with care; a caller expecting by-value semantics will be surprised." znajomość tej konstrukcji należy do tych rzadko stosowanych i sugeruje znajomość Scali na wyższym poziomie, a mimo to pojawiło się na początkowej lekcji "Functional Programming Principles in Scala" i dodatkowo było przedmiotem ćwiczenia (!) Widać, że Odersky'iemu zależy na znajomości tej konstrukcji i trzeba mieć się na baczności.

Przyjrzyj się takiemu zapisowi funkcji i pomyśl, jaki będzie efekt wykonania jej.
scala> def f(y: Int, x: => Int) = y
f: (y: Int, x: => Int)Int

scala> f(5, 1000^100000000)
res2: Int = 5
Jeśli dobrze rozumiem materiał, to wykonanie f powinno być równie efektywne co wykonanie f(5, 1), czyli skoro drugi argument funkcji jest wyliczany na czas użycia, a nie jest użyty w powyższym przykładzie, to do obliczenia wartości w ogóle nie dojdzie.

Na wykładzie o funkcjach wyższego rzędu pojawiła się notacja parametru wejściowego funkcji, który jest również funkcją i tutaj ponownie pojawił się symbol implikacji =>. To był ten moment, w którym kolejny raz naszło mnie na rozmyślanie o stałych jako swego rodzaju funkcji, które wyglądają jak funkcje stałe, ale różnią się tym, że nie są literałami funkcyjnymi a prymitywami.
scala> def g(h: () => Int) = h()
g: (h: () => Int)Int

scala> g(() => 5)
res8: Int = 5
Sądzę, że zrozumienie różnicy między stałymi a funkcjami stałymi ma niebagatelne znaczenie w poznawaniu zachowania języka wspierającego konstrukcje funkcyjne. W znanych mi językach - Java, Clojure, Scala - 5 jest zawsze 5 i "wykonanie" jej nie pozostawia śladu, podczas gdy wykonanie funkcji stałej zwracającej 5 może pozostawić swój ślad w środowisku.

A skąd mnie naszło na rozprawianie o tym?

Porównajmy zapis deklaracji argumentu wejściowego po nazwie x: => Int od deklaracji argumentu będącego funkcją f: Int => Int. W pierwszym przypadku definiujemy parametr wyliczany z opóźnieniem, w drugim podobnie, ale mamy dla tego specjalną nazwę - funkcja. Funkcja to obliczenie, które będzie wykonane na czas jego wykonania. Bardzo podobnie do owego opóźnionego wyliczania dla x: => Int. Jak zaznaczono w już wspominanym rozdziale Call by name w Effective Scala użycie funkcji do celów modelowania opóźnienia wykonania jest zalecane jako jawne wskazanie opóźnienia.

Zatem foruje się podejście oparte na funkcji.
scala> def f(y: Int, x: () => Int) = y
f: (y: Int, x: () => Int)Int

scala> f(5, () => 1000^100000000)
res9: Int = 5
Różnica niewielka, a jakie konsekwencje!

Ot, taka ciekawostka (para)naukowa, której objawienia mogłem doświadczyć podczas analizowania wykładu.

12 października 2012

Rozpocznij swoją przygodę z językiem Scala

5 komentarzy
Wzięło mnie ponownie na poznawanie Scali. Miałem już kilka spotkań z tym językiem, ale zwykle kończyło się na dumaniu, gdzie mógłbym to zastosować i ostatecznie brakiem pomysłów i zarzuceniem nauki. Jeszcze przed Euro 2012 coś tam liznąłem, aby 30 kwietnia doświadczyć wyczerpania weny.

I tak to trwało, i trwało, aż coursera udostępniła zajęcia "Functional Programming Principles in Scala".

Zacząłem z 2 tygodniowym opóźnieniem i przyszło mi nadrabiać zaległości. Co mnie najbardziej zdumiewa to to, że nie sądziłem, że mnie aż tak wciągnie. Chyba łatwość języka (w porównaniu z poznawaniem Clojure) sprawia, że jakoś tak pisze się w Scali naturalnie (żeby nie napisać aż nazbyt znajomo). Martin Odersky prowadzi zajęcia w przyzwoity sposób i chce się w tym uczestniczyć. Nie mam obaw, aby polecić te zajęcia.

Ciekawostka: na dzisiejszym spotkaniu dot. warsjawa 2012, na 4 organizatorów aż 3 uczestniczy w tych zajęciach!

Jeśli zastanawiasz się, jak zacząć swoją przygodę z językiem, proponuję zapisać się na te zajęcia, a co najmniej instalację Scala IDE for Eclipse, które dostarczane jest z bardzo użyteczną funkcją - Scala Worksheet. Tworzysz taki "brudnopis" i każde wpisanie poprawnego wyrażenia w Scali jest wykonane przy następnym zapisie. Niezwykle wciągające narządko.


Można również zainstalować sbt, ale na początek Scala IDE wystarczy. W końcu to początek i ostatnią rzeczą, jaką należałoby zrobić to zawalić kompa narzędziami, których szybko nie przyjdzie nam używać, a ich nieużywanie będzie nam ciążyło! Nie mówię, że są niepotrzebne, ale początek zróbmy sobie delikatnym wstępem do środowiska Scala i całą energię skupmy na poznawaniu składni i programowania funkcyjnego.

Dla czytelników pragnących łyknąć trochę wiedzy teoretycznej proponuje się Programming in Scala, First Edition oraz Programming Scala (żadnej jeszcze nie czytałem, więc nie pytajcie, co o nich sądzę - stąd ta bezosobowa zachęta w postaci "proponuje się").

Mamy również książkę po polsku - Język programowania Scala od Grześka Balcerka. Jeszcze jej nie czytałem, a czeka na mnie już dobre kilka miesięcy! Jak wieść niesie, niedługo warsztaty Grześka z funkcyjnej Scali! Pierwszymi miastami mają być Poznań i Warszawa. Może pora uruchomić pierwszy hack-a-thon ze Scalą w Warszawie? Co o tym sądzicie? Ciekawym efektów programowania cały weekend w jakimś podziemiu :)

27 września 2012

Warsjawa potrzebuje Cię!

1 komentarzy
To nie pierwszyzna dla wielu z Was. Większość przyzna, że publiczne wystąpienia są potrzebne do ugruntowania wiedzy, a bywa, że wręcz do jej zdobycia. Trudno również zaprzeczyć, aby nie miało to żadnego wpływu na naszą karierę. Z własnego doświadczenia wiem, że prowadzenie szkoleń pozwala na sprawniejsze zapamiętanie tematu i wyrobienie sobie pewnych nawyków, które zwykliśmy nazywać doświadczeniem lub intuicją. Po prostu człowiek wie, nie wiedząc dlaczego.

27 października członkowie grupy Warszawa JUG organizują konferencję warsjawa 2012, która w zamierzeniu ma "praktyczne podejście do problemów związanych z tworzeniem oprogramowania na platformie Java (JVM), począwszy od Agile, Scrum, przez Software Craftsmanship, a skończywszy na konkretnych językach programowania (Clojure, Scala, Groovy, JRuby) czy rozwiązaniach (szkieletach, rusztowaniach i kompletnych produktach) budowanych z ich pomocą. Mile widziane są również tematy związane z tworzeniem aplikacji mobilnych na Androidzie."

Myślisz, że nie może Cię na niej zabraknąć? Wierzysz, że udział w roli uczestnika nie będzie dostatecznym wyzwaniem i nie spełni Twoich oczekiwań? Chcesz być prelegentem i poprowadzić warsztat z interesującej technologi bądź języka? Potrzebujesz się sprawdzić w boju, a projektów jak na lekarstwo? Zachęcam do zgłoszenia swojego tematu w formularzu Rejestracja prelegentów - Warsjawa 2012. Nikt za Ciebie tego nie zrobi. Musisz zrobić to Ty!

Wciąż się wahasz? Zapytaj na forum grupy Warszawa JUG, co inni sądzą o Twoim pomyśle. Możesz być mile zaskoczony/-ą!

20 września 2012

Współbieżność i Android na Mobilization^2

0 komentarzy
W najbliższą sobotę będę miał przyjemność występować na konferencji Mobilization^2 w Łodzi, podczas której przedstawię temat "Zrównoleglanie zadań w Javie na platformie Android". Prezentacja będzie podsumowaniem dotychczasowych doświadczeń w rozpoznaniu tematu zrównoleglania zadań na platformie Android i liczę na kontakt z osobami, których tematyka intryguje, a moje wystąpienie stanie się swoistym katalizatorem dalszych studiów.

Prezentacja zaplanowana jest na godzinę 10:15 w sali F10 – Fortress. Reszta na stronie konferencji. Zapraszam!

11 września 2012

Znalezione w skrzynce: Do czego mi Clojure?

9 komentarzy
Właśnie dostałem do skrzynki maila, który odzwierciedla większość pytań i wątpliwości, jakimi zarzucają mnie moi rozmówcy w temacie Clojure. Postanowiłem opublikować moją odpowiedź, która specjalnie nie wnosi nic nowego w temacie, ale być może zainspiruje do ciekawej dyskusji o sensowności...właśnie! Czego ta sensowność miała by dotyczyć?! Pytanie pozostawiam otarte.

> Na pikniku rzuciłeś pytanie "W jaki sposób przekonać programistów Javy do
> użycia Clojure w swoich projektach?". Poczytałem trochę na ten temat i
> jedyne co mi nie pozwala używać tego języka to to, że po prostu nie mam
> czasu na naukę nowych języków. Musisz wziąć pod uwagę to, że ja reprezentuje
> jak to powiedziałeś "żółtodziobów" (chociaż za takiego się nie uznaję). Ja
> swój czas zamierzam poświęcić na naukę technologi takich jak Spring , JPA,
> JSF,EJB, SQL itd. Są to technologie które najczęściej występują w
> ogłoszeniach o pracę i jest ich tak dużo że nie ma czasu na naukę Clojure.

Cześć XXX,

Święta racja! W zasadzie nic dodać nic ująć, ale zastanów się, ile
osób tak myśli. Sądzę, że cała masa. Właściwie nawet więcej, co
sprawia, że przebicie się na lidera w tej grupie jest zadaniem
wymagającym dużego nakładu pracy. A może by tak warto rozważyć
poświęcenie nie mniej czasu na coś odmiennego, co sprawi, że jeśli
wartościowe (podkreślam słowo "jeśli") da Ci gwarantowaną przewagę.
Czy w takim świetle Clojure wypada ciekawiej?

> -powiedział ile czasu zajmie nauka Clojure
> -powiedział jak szybko można zrobić coś co działa w Clojure
> -do czego ten język wykorzystuje się w praktyce, jakiś konkretny przypadek w
> którym Clojure jest bez cenny ( bo jak sam stwierdziłeś że przykład z
> wyświetlaniem daty nie za bardzo wszystkich przekonał)
> -zapewnił że użycie Clojure jest stabilne, można go obdarzyć zaufaniem
> To prawdopodobnie kupił bym Clojure In Action i zaczął przerabiać kolejne
> rozdziały.

Czy potrafiłbyś odpowiedzieć na te pytania, gdyby zamiast Clojure
występowało Java lub inny język programowania? Celem Clojure było
przybliżenie programowania funkcyjnego do platformy Java i wielu
przypadło to do gustu. Jak to bywa, znalazło się też wielu, którym
niekoniecznie. Trudno powiedzieć, kto ma rację, bo gdyby tak było, nie
byłoby tylu języków programowania.

Nie oczekuj od innych, że powiedzą Ci, jak masz żyć. To Twoje życie,
Twoje wybory i co dla jednego wpadką, dla innego sukcesem. Wszystko
zależy od nastawienia. Moje jest otwarte na nowe, a że udaje mi się
zwykle trafiać w ciekawe technologie/języki, nie obawiam się o własną
przyszłość znając Clojure. Na pewno poszerza horyzonty.

> Ogólnie Java jest językiem w którym można zrobić wszystko i należało by
> wskazać taką rzecz która w Javie jest za obszerna. Jakieś porównanie ile to
> trzeba się na główkować w Javie a w Clojure robi się to w prosty sposób i
> można się zająć innymi rzeczami.

Weźmy trywialne przechodzenie po liście. A teraz pomyśl, że to cały
strumień danych. Współbieżność. Zwartość kodu funkcyjnego jest nie do
przecenienia w porównaniu z obiektowym. Oba jednak mają swoje plusy i
minusy.

28 sierpnia 2012

Zbiegi okoliczności wokół Android 4.1 Jelly Bean

7 komentarzy
Android 4.1, Jelly Bean "spotykam" na każdym kroku. Poza technicznymi detalami, które udaje mi się wyłapać podczas lektury artykułów, trafiłem ostatnio na informację o przygotowaniach do wydania Android 4.1 na Samsung Galaxy S II. Wcześniejsza zajawka o aktualizacji do 4.0.4 sprawiła, że przez tydzień sprawdzałem co godzinę, czy jest coś dostępnego. W przypadku Jelly Bean, odpuszczam. Na razie nie widzę powodów, abym potrzebował go. Jak będzie to będzie. I od razu mniej problemów na głowie.

A tu proszę. Wychodzę na spacer z Maksymem, a tu na telefonie informacja o dostępnej aktualizacji! Ni z gruszki ni z pietruszki pojawia się aktualizacja! Bajka!


Cóż było robić, aktualizacja ruszyła. Po 10 minutach telefon był już gotowy do ponownego użycia.


Jakby na dokładkę, w drodze powrotnej trafiłem na...


I jak to nazwać? Zbieg okoliczności? Próba zwrócenia na siebie uwagi? Ech, Androidzie, już do Ciebie wracam :)

26 sierpnia 2012

j.piknik z programowaniem funkcyjnym w Clojure

0 komentarzy
Koniec wakacji zbliża się nieuchronnie i widać ruch w interesie konferencyjnym. Najbliższa konferencja j.piknik już 30 sierpnia w Warszawie, podczas której wystąpię z tematem "Programowanie funkcyjne z Clojure (w przykładach)". Zaczynam o 16:20.

Celem prezentacji jest stworzenie prostego projektu w Clojure zarządzanego przez lein2 oraz informacyjnie konfiguracja dla Apache Maven 3, aby później użyć go w aplikacji javowej. W tej konfiguracji chciałbym pokazać, że elementy naszej aplikacji może być łatwiej oprogramować w Clojure, aby później użyć ich w głównej aplikacji javowej jako biblioteki zależne. Widać wyraźnie, że główny nacisk będę kierował do programistów javowych, których nosi w stronę języków alternatywnych. Sam ostatnio borykałem się z podobnym problemem (jak tu wprowadzić Clojure do projektu, w którym króluje Java) i wydaje mi się, że jest to podstawowy problem wielu z nas (= programistów javowych).
Jako środowiska programistyczne będą zaprezentowane Eclipse IDE + CCW (wtyczka do Clojure, Clojure REPL i informacyjnie Sublime Text 2.

Strona wydarzenia dostępna na facebooku.

Zachęcam do zadawania pytań w komentarzu, abym przygotowany mógł odpowiedzieć na nie podczas prezentacji lub po. Zapraszam i do zobaczenia!

17 sierpnia 2012

O tym jak DelayQueue realizuje kontrakt Iterable oraz BlockingQueue

0 komentarzy
W poprzednim wpisie Króciutko o j.u.concurrent.DelayQueue zaprezentowałem dosyć uproszczony przykład zastosowania java.util.concurrent.DelayQueue, w którym kolejka ukrywała elementy nieaktywne, co w tym konkretnym przypadku oznaczało wszystkie elementy. DelayQueue jest najzwyczajniej w świecie kolejką, która posiada dodatkową cechę, która pozwala na "widoczność" elementów, których czas "zamrożenia" minął. Stąd też, nieblokująca metoda poll() zwracała specjalną wartość - null - oznaczającą niemożność wykonania, tj. natychmiastowego zwrócenia elementu z kolejki.

Klasa j.u.c.DelayQueue posiada następujące cechy:
  • jest kolejką
  • jest nieograniczona (metoda remainingCapacity() zawsze zwraca Integer.MAX_VALUE)
  • jest blokująca (niektóre operacje manipulujące elementami kolejki, np. wspomniane poll() czy take())
  • operuje wyłącznie elementami typu j.u.concurrent.Delayed.
Zagłębiłem się w javadoc tej klasy i znalazłem inne ciekawostki, które przykuły moją uwagę. Oto przykład z nimi, a Twoim zadaniem jest odpowiedź na pytania w komentarzach. Miłej lektury!
package pl.japila.java7;

import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

public class DelayQueueMain {

    static class Conference implements Delayed {

        long delay;

        public Conference(long delay) {
            this.delay = delay;
        }

        @Override
        public int compareTo(Delayed o) {
            Conference c = (Conference) o;
            return this.getDelay() < c.getDelay() ? -1 : this.getDelay() == c.getDelay() ? 0 : 1;
        }

        @Override
        public long getDelay(TimeUnit unit) {
            return getDelay();
        }

        public long getDelay() {
            return delay;
        }

        @Override
        public String toString() {
            return String.format("Conference starts in %s days", getDelay());
        }

    }

    public static void main(String[] args) {
        DelayQueue<Conference> conferences = new DelayQueue<Conference>();
        conferences.add(new Conference(5));
        conferences.add(new Conference(10));
        conferences.add(new Conference(15));

        System.out.println("Head (delay expired furthest in the past) element: " + conferences.poll());

        // Q1: Jakie elementy zostaną wypisane na ekran?
        for (Conference conf : conferences) {
            System.out.println(conf);
        }

        // Q2: Jaki efekt po wykonaniu poniższej linii?
        System.out.println(conferences.element());

        // Q3: Co się stanie tutaj?
        conferences.add(null);
    }

}

15 sierpnia 2012

Króciutko o j.u.concurrent.DelayQueue

2 komentarzy
Kolejny raz potwierdza się zasada, że kto czyta, nie błądzi. W przypadku pakietu java.util.concurrent możnaby powiedzieć, że jest to najbardziej nieprzestrzegana zasada, której hołduję od jakiegoś czasu i zamiast przysiąść nad dokumentacją javadoc, pozwalam sobie na poznawanie jej wyłącznie przy okazji i to w tak niewielkich dawkach, że byłoby grzechem nazwać je wykraczającymi przyzwoite minimum.

Na szczęście przyszło mi recenzować nadchodzącą książkę o java.util.concurrent - Java 7 Concurrency Cookbook z wydawnictwa Packt, więc chciał, czy nie chciał, jestem zaangażowany i poznaję.

Mojemu Maksymowi stuknęło 10 miesięcy! Postępy jakie robi we własnym rozwoju często są niezwykle zaskakujące i chciałbym móc to samo powiedzieć o swoim w kontekście j.u.concurrent. Przez ostatni miesiąc nauczył się sprawnie raczkować, siadać, wstawać, a nawet zaczyna chodzić asekurowany, czy to meblami czy przez inną osobę. Zaczyna mówić i od kilku dni daje się słyszeć blablabla, mama, czy inne dźwięki, których opisanie uważam za niemożliwe. Rozumie frazy: biedronka, nie, wypluj smoka, gdzie...?, lampa, daj, chodź, piciu piciu, am, otwórz buźkę i jeszcze kilka innych. Zaczęliśmy go przyzwyczajać do mycia zębów, bo przy 4 zębach i kolejnych 4 wychodzących, nie daje nam innego wyboru. Jada chętnie, dużo pije i ogólnie cacy. Oby tak dalej! A mówią, że nic nie trwa wiecznie :(

Gdyby przełożyć jego rozwój na mój w kontekście j.u.concurrent, to ja dopiero zacząłem raczkować. Pora to zmienić, bo za moment, to nie ja jego, ale on mnie będzie wychowywał. A jak Wam idzie poznawanie nowego API? Korzystacie z niego regularnie czy tylko z doskoku i to w ramach własnych, prywatnych projektów?

Na zakończenie krótki przykład z klasą, o istnieniu której dowiedziałem się właśnie z książki. Oto, proszę Państwa, wchodzi java.util.concurrent.DelayQueue. Trzeba było widzieć moją minę, kiedy przeczytałem o tej klasie, a nigdy wcześniej nawet słowa o niej nie czytałem. Niedobrze z moją znajomością Javki.

Pytanie kontrolne: Co będzie wypisane na ekran po uruchomieniu poniższej klaski?

package pl.japila.java7;

import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

public class DelayQueueMain {

    static class Conference implements Delayed {

        long delay;

        public Conference(long delay) {
            this.delay = delay;
        }

        @Override
        public int compareTo(Delayed o) {
            Conference c = (Conference) o;
            return this.getDelay() < c.getDelay() ? -1 : this.getDelay() == c.getDelay() ? 0 : 1;
        }

        @Override
        public long getDelay(TimeUnit unit) {
            return delay;
        }

        public long getDelay() {
            return delay;
        }

    }

    public static void main(String[] args) {
        DelayQueue<Conference> conferences = new DelayQueue<Conference>();
        conferences.add(new Conference(5));
        conferences.add(new Conference(10));
        conferences.add(new Conference(15));

        System.out.println("Head (delay expired furthest in the past) element: " + conferences.poll());
    }

}

25 lipca 2012

Kilka ciekawostek z Java Concurrency API w Java 7 od Packt

0 komentarzy
Trudno mi było uwierzyć, że dałem się namówić na kolejną recenzję książki z wydawnictwa Packt. Nie jestem ich fanem, a ich książki są zwykle zbyt lekkie merytorycznie, aby kilka ciekawostek, których doszukanie się i tak zajmuje sporo czasu, było w stanie zrekompensować mój ból.

Tym razem jestem mile zaskoczony zawartością planowanej książki o współbieżności w Java 7 - Java 7 Concurrency Cookbook. Wydaje się być odpowiednio dopasowana merytorycznie do moich potrzeb, a że o współbieżności mowa (z którą mam niezwykle rzadko okazję się spotykać), tym lepiej dla niej (i mnie)!

Jako recenzent techniczny odpowiadam za jej właściwą zawartość merytoryczną i jakkolwiek pierwszy rozdział mógłbym z uciechą wrzucić do kosza, to kolejne zdają się bronić bez większego problemu.

Mam za sobą przeczytane 3 rozdziały (z ośmiu) i zaczynam z niecierpliwością oczekiwać lektury kolejnych. Właśnie w rozdziale 3 pojawiły się java.util.concurrent.CyclicBarrier oraz mój ulubieniec z Java 7 - j.u.c.Phaser.

Sposób przekazywania wiedzy przez autora nie nastraja do zagłębniania się w treść, a raczej służy jako zajawka do dalszego studiowania na własną rękę. Najbardziej "rozbraja" mnie prezentacja kodu źródłowego, który poszatkowany jest na kilkanaście punktów, które okraszone są skromnym opisem, często wręcz trywialnym nawet dla laika. Zatem, czytasz co będzie, demonstracja tego, co miało być i kolejny punkt. Dodając do tego, opisywanie konstrukcji "Stwórz klasę, która implementuje Runnable" i pojawia się kawałek początku klasy z "implements Runnable" i ręce opadają. Trzeba przywyknąć.

Z ciekawostek, które musiałem sprawdzić na własną rękę, zanim wprowadziłem zmiany w obecnej wersji, to klasa j.u.c.TimeUnit (którą swego czasu przedstawił mi Tomek Nurkiewicz), multi-catch oraz kombinacja TimeUnit z Phaser, a także j.u.Collections.nCopies.

Poniżej przykładowy kod, który służył jedynie celom sprawdzenia API. Nic ponadto! I niech tak zostanie.

package pl.japila.java7;

import java.util.Collections;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.Phaser;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class Main {

    public static void main(String[] args) {
        System.out.println("Millis in a day: " + TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS));
        System.out.println("Sleeping for 2 secs");
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Collections.nCopies(3, true));
        CyclicBarrier barrier = new CyclicBarrier(1);
        try {
            barrier.await();
        } catch (InterruptedException | BrokenBarrierException e) {
            e.printStackTrace();
        }
        Phaser phaser = new Phaser(2);
        try {
            phaser.awaitAdvanceInterruptibly(phaser.arrive(), 2, TimeUnit.SECONDS);
        } catch (InterruptedException | TimeoutException e) {
            e.printStackTrace();
        }
    }

}

06 lipca 2012

Confitura 2012

4 komentarzy
Świetna sprawa te dzieci. Jestem pełen podziwu dla osób, którym czas upływa na wychowywaniu 3 i więcej dzieci. Jakoś przy dwójce było co robić, ale przy trójce mam wrażenie, że to kosmos.

U mnie dwójka dużych pomaga przy wychowywaniu najmłodszego, więc przy stanie 4:1 (liczba wychowujących do wychowywanych) jest z pewnością łatwiej. Ot, choćby możliwość zostawienia młodego pod opieką córki czy syna - bezcenne!

Jak na zdrowego bobasa przystało, Maksym broi na maksa. Już pełza i podnosi tyłek do raczkowania, a przy przejściu przez granicę 9 miesięcy (3 dni temu!), kiedy to żona wyczytała, że powinien sam siadać, jakby na zawołanie zaczął siadać. Do tego stopnia, że kiedy jest w łóżeczku i oznajmia, że się obudził, albo że chce jeść, siedzi. Dużo radości!


Ach, zapomniałbym - jeśli potrzebujesz uporządkować sobie harmonogram dnia, dziecko okaże się nieocenione. Nie ma czasu na marnowanie dnia, bo za moment stałe momenty, których dzieciak zmarnować nie da. Żadna książka, szkolenie, planowanie nie może równać się z wychowywaniem dziecka. Polecam!

To już prawie tydzień od naszej konferencji społecznościowej - Confitury 2012. Obfitowała w wiele naj, możne nawet w same naj?! Tym bardziej mnie to cieszy, bo nie tylko, że nie uczestniczyłem w jej współtworzeniu, ale również nie przeszedłem sita kwalifikacyjnego z moimi wykładami o Clojure oraz lekkimi kontenerami Java EE - Apache TomEE i IBM WebSphere AS 8.5 Liberty Profile. Czyżby to było powodem, dla którego można nazwać ją naj?! Cóż, samo życie. Mało nie doszło do tego, że w ogóle nie pojawiłbym się na konferencji. Synuś Maksym zagwarantował pobudkę wczesnym rankiem, tak abym przed 9:00 był gotów do dnia, więc na rozpoczęcie Confitury jak znalazł.

I tak się zaczęło.

(Wrażenia na bieżąco można było podziwiać na moim kanale na twitterze - @jaceklaskowski)

Raczej spontanicznie pojawiłem się na konferencji od samego rana. Wpadłem po rozpoczęciu, około 10 i po kilku powitaniach ruszyłem na pierwszą prezentację dnia - "Clojure praktycznie. Clojure jako silnik szablonowania HTML" Łukasza Barana. Byłem mile zaskoczony widząc prezentację o Clojure w harmonogramie konferencji, ale zły (na siebie wyłącznie!), że to nie ja ją prowadzę. W zasadzie z takim lekko agresywnym nastawieniem wszedłem na wykład, chcąc się przekonać, że to ja powinienem to poprowadzić. Pewnie to podejście miało wpływ na odbiór, bo zupełnie mi się niepodobało. Wybacz Łukasz i zrzuć to na barki mojej złości, ale prezentacja była nudna, monotonna i w ogóle nie zachęcała do wejścia w Clojure. Powiem więcej - odrzucała od tego języka. Szkoda, bo ma potencjał, a rozmowy za kulisami utwierdziły mnie w przekonaniu, że prelegent nie przygotował się do tej roli. Pytałem ludzi, którzy siedzieli koło mnie dlaczego przyszli i jakie ich są wrażenia, i dostałem najpierw odpowiedź, że "Ja tutaj, bo kolega jest", aby później dowiedzieć się, że ani kolega, ani pozostali dwaj za mną, nie byli zachwyceni z prezentowanej treści. Noty były niskie, baaardzo niskie. Od wykładu sponsorowanego wymagam więcej. Ja straciłem czas.

Później poszedłem na Waldka Kota i jego "Invokedynamic = bardziej dynamiczna JVM", ale niestety nie dostałem się do sali - cała była wypełniona. Gratulacje Waldek. Po latach ciszy, należało Ci się. Ja niestety zmęczony upałem i staniem na korytarzu, odpuściłem. Później słyszałem głosy, że nic nie było widać, za duszno i trochę za mało programowania. Żałuję, że nie mogłem się przekonać na własnej skórze, ale spokojniejszym po tych komentarzach. Dobrze było jednak móc zamienić słowo z Waldkiem później. Oby było go więcej i niechby jedynie rozprawiał o invokedynamic. Potrzebuję ich więcej!

Przez dłuższą chwilę bawiłem u Kuby Nabrdalika, który roztrząsał temat Grooviego, a wcześniej dodatków funkcyjnych do Javy. Szkoda, że zabrakło Clojure. Może, zgodnie z powtarzanymi tezami, przyjdzie mu poznać ten język w tym roku? Ciekawie prowadzona prezentacja, ale treść nie porywała. Zbyt wielki nacisk na bajeranckie slajdy, a kiedy przyszło do kodu źródłowego, za dużo na pojedynczym slajdzie, a często nawet zbyt skomplikowanie, aby było zachęcające. Pewnie świadomy ruch, aby zachęcić do Groovy i Grails. Mnie nie urzekło i przed wejściem Grails na scenę, uciekłem.

I w tym momencie miałem wracać do domu, do obowiązków, ale wymigałem się i zostałem. Do tej pory czuję razy na plecach. Wybacz Agatko!

Obiad był smaczny. Najadłem się do syta, a przy okazji nagadałem się ze znajomymi. Atmosfera boska!

O 14:10 wszedłem na długooczekiwanego Grzegorza Balcerka i jego prezentację "Jak i po co pozbywać się wzorców projektowych". Poznałem Grześka w Szczecinie i obiecywałem sobie zobaczyć go w akcji. Słyszałem już to i owo, więc tym bardziej nie mogłem doczekać się, co zobaczę. Dodając do tego jego książkę o Scali, którą napisał, bo...uczył się języka (!), liczyłem, że nauczę się wiele. Nauczyłem się. Czy wiele? Niekoniecznie. Najbardziej przypadł mi do gustu jego spokój, kiedy obrzucany obelgami o czelność forowania własnych myśli musiał się zmagać z gorącymi głowami Konrada i spółki. Nie podobała mi się treść prezentacji, więc tutaj duży minus dla Grześka. Jak potwierdziłem u innych uczestników, wielu zauważyło rozbieżność między tematem prezentacji a treścią i wielu oceniło ją jako najgorszą (!) Ja jednak znalazłem w niej kilka ciekawych kąsków prezenterskich, więc nie żałuję poświęconego czasu. Co mnie irytowało, to zachowanie publiki, która nie mogąc zgodzić się z tezami Grześka, próbowała deprecjonować jego zdolności do przekazywania wiedzy. Słychać było zarzuty w stylu "Dlaczego w ogóle śmiesz…", co przekreśla dalszą część pytania. Pytania o monady były niepotrzebne i nie wnosiły nic merytorycznego do spotkania. Niezgoda była wyczuwalna w powietrzu. Grzesiek opanowany próbował ratować sytuację, ale było za późno. Wypadło słabo, a publika również maczała w tym palce. Dla mnie było to o tyle pouczające, że nigdy wcześniej nie byłem na takiej prezentacji - jako prelegent i uczestnik - więc obserwowałem zachowanie obu stron i…będę teraz ostrożniejszy. Czego zabrakło u Grześka, to wzmiankowania, że "wzorce są uzupełnieniem cech języka o elementy, których brakuje mu, a istnieją w innych językach." Weźmy znaną mi Javę i Clojure - większość (wszystkie?) wzorce projektowe w Javie są próbą załatania braku domknięć i funkcji wyższego rzędu.

Później poszedłem na "Uwolnić się od "if"" Tomka Nurkiewicza. Temat zgodny z moim myśleniem, więc nie mogłem doczekać się posłuchać, co ma do powiedzenia. Bardzo interesująca i interaktywna prezentacja. Dużo zabawy i wiedzy. W taki sposób można spędzać całe weekendy, a nie tylko godzinę. Duże brawa dla Tomka za opanowanie i właściwe przedstawienie tematu. Czasami było trochę za bardzo kabaretowo, ale wspominam to jedynie dlatego, że sam nie miałem możliwości zaprezentowania swojego. Chciałbym móc wystąpić na Confiturze i być porównywanym merytorycznie z Tomkiem. Gość ma wiedzę i potrafi ją przekazać. Duże brawa! Jest od kogo się uczyć.

Po Tomku jeszcze kilka chwil na pogaduchach, aby przed kąpielą Maksyma (19:00) pojawić się w domu. Trochę żałuję, że nie mogłem uczestniczyć w Spoinie, ale mówią, że dobrze jest umiejętnie skończyć dobrą zabawę, aby były wyłącznie miłe wrażenia - ja takie mam!

Gratulacje dla prelegentów za chęć podzielenia się wiedzą (mimo moich krytycznych uwag). Gratulacje dla organizatorów za stworzenie bajecznej atmosfery wymiany wiedzy. Gratulacje dla uczestników za liczne przybycie i aktywny udział w prezentacjach (czasami nawet za aktywny). Poza temperaturą na zewnątrz i tłokiem w salach i na korytarzu brak innych uwag. Czekam na kolejną edycję, której nie zamierzam już przepuścić prezentacyjnie. Muszę się jedynie bardziej postarać.

02 czerwca 2012

Softdevcon z 20 uczestnikami oraz ja z Clojure o współbieżności i testowaniu

14 komentarzy
Jakoś tak bez echa przebiegły przygotowania do konferencji softdevcon w Warszawie, na której przedstawiłem temat "O tym jak języki funkcyjne upraszczają testowanie i programowanie współbieżne - na przykładzie Clojure". Wejście miałem o godzinie 9:00, co przy bardzo specjalistycznym temacie wokół Clojure mogło stanowić nielada wyzwanie dla śpiochów.

Konferencja (chociaż przy takiej liczności, chyba raczej nie powinienem tego tak nazywać) odbyła się w czwartek, w budynku Millenium Plaza na Al. Jerozolimskich 123a, na 4 piętrze i już sama sala nie zachęcała do tłumnego przybycia - mogła pomieścić maksymalnie 40 osób i już przy tej liczbie dałoby się odczuć dyskomfort braku miejsca. Kiedy się w niej pojawiłem trochę mnie zmroziło. Wyglądało skromniej niż nasze spotkania WJUGowe. Cóż było robić?! Zacząłem obawiać się braku zainteresowanych. Co nie było dalekie od prawdy.

O 8:45 było już 5 osób, więc dawało mi nadzieję, że to jest właśnie kwiat polskiej branży informatycznej, bo wszystko sprawiało, że myślenie, że uczestnicy są właśnie dla Clojure, mogło być uzasadnione. Na 9:00 sala była "wypełniona" dwunastoosobową grupą zaintrygowanych (przynajmniej tak chciałem i chcę o nich myśleć).

Zaprezentowałem około 10 slajdów wprowadzających, głównie przygotowujących do sesji kodowania na żywo. Jak uzmysłowił mi kolejny prelegent - Jakub Binkowski, który wyśmienicie przedstawił temat "Programowanie równoległe - projektowanie i testowanie" (na platformie .Net) - należało rozpocząć od prezentacji gotowego kodu w IDE, aby potencjalnie zejść na poziom Clojure REPL. Ja jednak nie wyłapałem tej potrzeby i odwróciłem kolejność. Zresztą pamiętam podobne uwagi na poprzednich konferencjach i nie wyciągnąłem z tego właściwych wniosków! Oj, niedobrze, niedobrze.

Wyniki mojej prezentacji można znaleźć w podsumowaniu, które przygotowali organizatorzy. Pozostawię je bez komentarza, pozwalając na własne wnioski.

"Podsumowanie ankiet uczestników - sposób przedstawienia tematu (na podstawie czternastu wypełnionych ankiet)
- 4 osoby oceniło prelekcję jako bardzo dobrą (29%)
- 9 osób oceniło prelekcję jako dobrą (64%)
- 1 osoba oceniła prelekcję jako słabą (7%)

Najczęściej pojawiające się komentarze:
- mało czasu (czyli jest zainteresowanie! może warto zainwestować w warsztaty w tej tematyce - kilka osób wyraziło chęć dalszego zagłębienia się w temat)
- powinno pojawić się więcej informacji na temat 'współpracy z Java'
- 'brak IDE'
- dobry sposób prezentacji
- jasne i klarowne przedstawienie tematu
- wzbudzenie zainteresowania - interakcja z uczestnikami"


Zostałem na kolejnej prezentacji Jakuba o programowaniu równoległym. Doskonale przygotowane slajdy, dykcja, przygotowanie merytoryczne i właściwe przeplatanie slajdów z przykładami sprawiło, że bez wahania mógłbym od razu wystawić najwyższą notę. Kiedy dodać, że przedstawiał programowanie giełdy, natychmiast ujął mnie za serce! Trudno byłoby przebić Jakuba w jakości prezentacji. Przyglądałem mu się chwytając każdy jego gest, zmianę intonacji, przejścia między slajdami a przykładami, aby samemu wdrożyć kilka tricków w swoim repertuarze prezenterskim. Przez 1 godzinę nauczyłem się więcej niż przez ostatnie własne publiczne wystąpienia. Podobało mi się!

Nie szukałem specjalnie wpadek (może na początku, kiedy zobaczyłem slajdy i gościa, sądząc, że będzie nadrabiał miną, bo były takie przesłodzone), ale na minus mógłbym wskazać metody, którym uzasadniał swoje tezy, które kilkukrotnie nie przypadły mi do gustu. W wielu miejscach były w stylu (baaaardzo upraszczam) "Bo tak jest dobrze i koniec, a skoro ja mówię, to wiem". Z wieloma tezami się nie zgadzałem, ale że nie odpuszczałem sobie z pytaniami do Jakuba, wielokrotnie gryzłem się w język, aby nie spacyfikować prezentacji. W końcu to nie ma być dyskusja wyłącznie między nami. Widząc nikłe zaangażowanie uczestników, odpuszczałem z krytyką, zostawiając sobie jedynie możliwość zadawania pytań uzupełniających. Dodatkowo, na minus położę całkowitą ignorancję języka funkcyjnego F#, bo..."Jestem zawalony robotą." usłyszałem. Porażka! Szczególnie, że F# jest językiem pierwszej kategorii, obok C#, na platformie .Net i wspieranym przez najnowszą wersję Visual Studio. Kiedy zobaczyłem pewne funkcyjne konstrukcje w C# - użycie typu Func (podobnie jak w Scali) oraz wyrażenia lambda (podobnie do tych z Java 8) - aż się prosi o F#. A jednak "zawalenie robotą" bierze górę :(

Możliwość poznania nowych osób uważam za bezcenne i to jest głównym motorem, aby uczestniczyć w konferencjach. Nauczyłem się, aby wyznacznikiem jakości konferencji była liczba osób, które poznam. W zasadzie uważam, aby czas konferencyjny spędzić na ciągłej rozmowie - niechby była o niczym, ale interakcja z żywą istotą informatyczną wynoszę na plan pierwszy.

Dowiedziełm się, że kilku uczestników mojego wystąpienia wyraziło zainteresowanie tematem - w tym jedna firma! - co dobrze wróży na przyszłość. Widać, że wciąż nie prezentuję właściwych argumentów na użycie Clojure, ale mój upór zdaje się zamieniać w realne działania u obserwatorów. I o to właśnie chodzi - zainteresowanie tematem, aby samodzielnie móc ocenić przydatność narzędzia - języka funkcyjnego Clojure, który jest "niewielką biblioteką do programowania współbieżnego" (to wersja dla programistów Java) i pozwala konstrukcjami funkcyjnymi na łatwiejsze testowanie (to wersja dla napaleńców TDD i okolic). Jak można było usłyszeć (trochę nawet doświadczyć, kiedy zszedłem na poziom REPL) na mojej prezentacji "O tym jak języki funkcyjne upraszczają testowanie i programowanie współbieżne - na przykładzie Clojure" łatwość testowania i użycia współbieżności w naszych aplikacjach są niezwykle zbieżne, żeby nie napisać, że są nierozłączne. Czym bardziej testowalny kod, tym łatwiej go użyć wespół z równoległością i na odwrót. Ciekawym Twojej opinii.

I pytanie podsumowująco-zaczepne: Czy kiedykolwiek programowałeś/-aś aplikacje korzystając ze współbieżności? Spodziewam się, że większość niestety odpowie "Tak, ale czasy, kiedy to było zaliczyć można do średniowiecza". Zastanawia mnie, dlaczego programiści Javy mając do dyspozycji wsparcie Javy dla współbieżności - chociażby ostatnie zmiany w pakiecie java.util.concurrent - tak niewiele wiedzą i z takim oporem korzystają z tego. Dlaczego? Tak bardzo ograniczani jesteśmy przez szkielety programistyczne (ang. frameworks)?! Czy to musi nas, aż tak ograniczać?!

29 maja 2012

Warsztaty z IBM WebSphere na PWSZ w Tarnowie - dzień 1

0 komentarzy
W ramach zadania "Przyszłość młodych w naszych rękach. Program zacieśniania współpracy uczelni z pracodawcami", które jest częścią projektu KLEKSS BIS Kapitał Ludzki - Edukacyjny Komponent Strategii Szkoły na uczelni PWSZ w Tarnowie mam okazję w ciągu 2 dni przedstawić aktualny stan zaawansowania prac IBM wokół nowych technologii - BPMN 2.0, Java EE 6 oraz aplikacji mobilnych z produktami, których data wydania jest zaplanowana dopiero na...15 czerwca! Mam okazję zaprezentować IBM WebSphere Business Process Manager V8, IBM WebSphere Application Server V8.5 Liberty Profile oraz IBM Worklight V5.0. Jako uzupełnienie stosu technologicznego, dodałem jeszcze programowanie funkcyjne z Clojure i dwudniowy maraton technologiczny trwa na dobre w Tarnowie! Wszystko praktycznie, z tworzeniem aplikacji na żywo i całkowicie bez slajdów - nie wliczając tego wprowadzającego o mnie :-)


Najbardziej podkręcony jestem możliwością zaprezentowania tych wszystkich technologii i produktów na żywo. Nie obyło się bez potknięć, chwil zadumy, ale mam wrażenie, że ogólnie poszło bardzo sprawnie.

O dziwo, jedynie jedna osoba wiedziała, a na drugiej trochę wymusiłem, określenie się z oczekiwanymi stawkami. Padło magiczne 4k PLN netto, co od razu skarciłem, że mi dumpingują rynek (!) Zakazałem mówić o tak niskich kwotach głośno i rozważyć bezpośrednie połączenie z Warszawą (chwilowo przerwane w Krakowie na okres remontu) jako potencjalny argument za większymi stawkami. Liczę na zastosowanie rad w działaniu.

Dzień 1 z BPMN 2.0, Java EE i IBM WebSphere


Dzisiaj miałem okazję przedstawić BPMN 2.0 oraz Java EE 6 z produktami IBM. Jutro zaplanowałem aplikacje mobilne (poprosiłem uczestników o przyniesienie swoich smartfonów), które będę tworzył w Javie (Android) oraz HTML5, CSS3 i JavaScript (IBM Worklight z użyciem PhoneGap, a w zasadzie Apache Cordova). Na podsumowanie turnee nie mogło zabraknąć Clojure. Nie wyobrażam sobie wystąpień publicznych bez jego udziału i nie mogło być inaczej w Tarnowie.

Podsumowaniem każdej trzygodzinnej sesji jest ankieta, którą uczestnicy wypełniają ku uciesze organizatorów i wykładowcy. Zebrałem wyniki i jestem trochę nimi zaskoczony. Myślałem, że to Java EE 6 wyjdzie mi dużo lepiej, a okazuje się, że udało mi się oczarować uczestników moją wiedzą o BPMN 2.0. Poniżej zestawienia średnich. Ciekawym Twojej interpretacji, gdzie wskazuje się największe niedociągnięcia (tych szukam najbardziej, aby kolejne inicjatywy tego pokroju były o niebo lepsze).

Wyniki pokazują potencjał naukowy drzemiący w studentach 2 roku PWSZ w Tarnowie i mogą stanowić ciekawy materiał badawczy dotyczący przyszłych adeptów informatyki praktycznej w Polsce. Grupa nie jest wielka, ale lepsze to niż nic. Prosiłem ich o najszczerszą szczerość.

Modelowanie procesów bieznesowych BPMN 2.0 w IBM WebSphere Business Process Manager V8.0


Uczestników (podpisanych na liście obecności): 22

Sposób prowadzenia zajęć: 13 osób na "Tak, odpowiadał" z 7 za "Średnio odpowiadał".

Wiedza merytoryczna (średnia): 5,23 (maksymalnie 6)

Umiejętność przekazywania wiedzy (średnia): 5,14 (maksymalnie 6)

Chętnie odpowiadał na pytania i udzielał wyjaśnień: wszystkie 22 osoby na "Tak".

Program wykładu: 16 osób na "Odpowiedni" z 6 osobami na "Za mało nasycony".

Oczekiwania: 4,5 (maksymalnie 6)

Uwagi:
  • więcej zastosowań programu (BPM)
  • przykłady gotowych projektów w BPM
  • przedstawienie gotowego projektu
  • przykłady z życia wzięte
  • więcej przykładów gotowych procesów biznesowych
  • przykłady praktyczne modelowania procesów biznesowych oraz aplikacji od strony klientów
  • gotowy projekt
  • sensowne użycie programu
  • realne przykłady biznesowe z projektów
  • krótki przegląd narzędzi BPMN
  • większy nacisk na programowanie
  • dokładnie sprecyzowany model rzeczywistego projektu biznesowego
  • wyjaśnienie modelowania procesu biznesowego na konkretnym przykładzie biznesowym
O czym innym wartoby posłuchać?
  • aplikacje mobilne
  • 2 osoby za "Programowanie w Javie"
  • 2 osoby za "Różne języki"

Java EE 6 z IBM WebSphere Application Server V8.5 i Eclipse IDE


Uczestników (podpisanych na liście obecności): 18

Sposób prowadzenia zajęć: 17 osób na "Tak, odpowiadał" z 6 za "Średnio odpowiadał".

Wiedza merytoryczna (średnia): 5,23 (maksymalnie 6)

Umiejętność przekazywania wiedzy (średnia): 5,09 (maksymalnie 6)

Chętnie odpowiadał na pytania i udzielał wyjaśnień: wszystkie 23 osoby na "Tak".

Program wykładu: 2 osoby na "Zbyt przesycony", 18 osób na "Odpowiedni" z 3 osobami na "Za mało nasycony".

Oczekiwania: 4,5 (maksymalnie 6)

Uwagi:
  • Więcej rozbudowanych przykładów
  • zagadnienia z projektowania serwisów internetowych opartych na Java EE i EJB
O czym innym wartoby posłuchać?
  • 3 osoby za "Tworzenie aplikacji mobilnych"
  • języki programowania
  • 4 osoby za "Java od podstaw"
  • AWT/Swing
  • Spring MVC

22 maja 2012

Clojure na WJUGu - mogło być więcej "gdzie" zamiast "jak"

4 komentarzy
Właśnie zbieram myśli po moim dzisiejszym spotkaniu WJUGowym, gdzie w gronie 19 osób mogłem przedstawić swoje postrzeganie budowania aplikacji korporacyjnych Java EE 6 z Clojure. Jak wspominałem, celem nie było przekonanie o słuszności zastosowania Clojure w Java EE 6, ani całkowite zaniechanie Javy na rzecz Clojure przy budowaniu aplikacji webowych, a jedynie zainspirowanie myśleniem wokół języków funkcyjnych do ich rozwijania na przykładzie Clojure.

Klimat spotkania sprawił, że miałem możliwość przedyskutowania kilku kwestii z uczestnikami. Padały wątpliwości o sensowność Clojure jako język programowania w projektach - a że za młody, niewiele doświadczeń z nim, itp., ale również stawiano pytania o miejsca, w których mógłby się odnaleźć. I tu znajduję pewną lukę w moim rozumowaniu Clojure - za mało było "gdzie" zamiast "jak". To cenna lekcja, której nie doświadczyłbym, gdyby nie spotkanie. Mam zadanie na Confiturę 2012! Oby tylko temat Clojure został przyjęty. Głosujcie na temat "Dlaczego nie programujemy funkcyjnie? (z Clojure w tle)" na Vote 4 Papers.

Dziękuję wszystkim uczestnikom za przybycie i za stworzenie atmosfery umożliwiającej wymianę poglądów. Właśnie tego potrzebowałem w mojej karierze wokół Clojure.

21 maja 2012

Jutro spotkanie Warszawa JUG ze mną i Clojure

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

Temat: Budowanie aplikacji (Java EE 6) z Clojure
Prelegent: Jacek Laskowski

Spotkanie ma być okazją do poznania Clojure od strony jego wsparcia dla bytów javowych. Aplikacje korporacyjne Java EE korzystają z mechanizmów języka Java, więc jeśli tylko udowodnimy tezę, że można tworzyć byty javowe w Clojure i to całkiem przyjemnie, to całkiem przyjemne może być budowanie aplikacji korporacyjnych z wykorzystaniem obu - Java EE 6 i Clojure.

OSTRZEŻENIE: Należy oczekiwać użycia Java EE jedynie jako tła dla wprowadzenia do Clojure. Dla wielu użycie Java EE w tytule może być zdecydowanie na wyrost i służy autorowi jako narzędzie do przykucia uwagi. Równie dobrze możnaby użyć innego chwytliwego terminu, które
kojarzy się z Javą.

Jacek Laskowski jest założycielem i współprowadzącym Warszawskiego JUGa. Interesuje się Javą w wydaniu podstawowym (Java SE) i korporacyjnym (Java EE), a od kilku lat zadużony w programowaniu funkcyjnym z Clojure (i w tle F#). Swoje przemyślenia publikuje na polskojęzycznym blogu Jacek Laskowski jawnie oraz angielskojęzycznym Japila :: verba docent, exempla trahunt. Krótkie myśli znajdziesz na kanale @jaceklaskowski. Występuje podczas polskich konferencji, co traktuje jako wyróżnienie i miejsce prezentacji własnych poglądów. Będzie wdzięczny za wszelkie komentarze do jego publicznych aktywności.

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

Wstęp wolny

Zapraszam w imieniu swoim i grupy Warszawa JUG!

15 maja 2012

Po dwóch sesjach "Informatycznych Technologii Biznesowych" (ITB) na UAM w Poznaniu

0 komentarzy
Umożliwiono mi poprowadzenie pewnego projektu naukowego, którego celem jest zrealizowanie 24 godzin wykładów i ćwiczeń w ramach programu dwusemestralnych studiów podyplomowych "Informatyczne Technologie Biznesowe" (ITB) na Wydziale Matematyki i Informatyki Uniwersytetu im. Adama Mickiewicza.

W ten sposób mogę podzielić się swoją wiedzą w temacie programowania w Javie, Java EE 6 oraz produktów z rodziny IBM WebSphere, głównie IBM WebSphere Application Server V8 oraz V8.5 Libery Profile. Wybaczcie określenie, ale uczestnicy są pewnego rodzaju moim "materiałem poznawczym", który pozwala mi uzmysłowić sobie, jak rzeczy proste wcale takimi nie muszą być, a wszystko zależy od doświadczenia.

Kiedy ustalałem materiał do omówienia, planowałem wiele, sądząc, że 24 godziny to szmat czasu. I myliłby się ten, kto tak sądzi. Doświadczenie w wystąpieniach publicznych pomaga, ale tutaj zmienna czasu się znacząco wydłużyła, więc należało podzielić całość na małe prezentacje. Poza tym, jeśli zebrany materiał przygotowawczy nie pozwala na dopasowanie tematyki, to sprawa staje się karkołomna. Rozpoznanie audytorium jest kluczem do sukcesu sprawnego przekazu. Marzy mi się, aby po moich wystąpieniach znalazły się osoby, które pozwolą sobie na chwilę zastanowienia nad omówionym tematem. Marzy mi się, aby uczestnicy byli aktywni, wiedzieli, czego oczekują w zamian za poświęcony czas - swój czas. To jest inwestycja, którą wielu sprowadza do poziomu "odsiedzę swoje i będzie z bańki". Jeszcze mniej osób chce i potrafi wyrazić swoją opinię. Szkoda.

To sprawia, że praca z klientem (w tej konfiguracji są to słuchacze-studenci ITB) jest nieprzewidywalna i stąd okrywcza. A dodatkowo można wiele się nauczyć o materiale, który zdawało się, że rozumiem. Ot, choćby ostatnie próby z uruchomieniem executable jar, co w nomenklaturze Eclipse nazywa się Runnable Jar, a jest wykonywalnym plikiem jar z Main-Class w MANIFEST.MF.


Nie tylko nie wiedziałem o istnieniu asystenta Runnable JAR file w Eclipse, ale również później o powiązaniu między nim a konfiguracją uruchomieniową projektu.


Nie wiedziałem, bo nie było potrzebne, ale jak tu przeprowadzić wprowadzenie do Javy bez wyjaśnienia tego mechanizmu?! Teraz już wiem i kolejni będą mogli podziwiać moją wiedzę (a ja nie powiem, że jeszcze chwilę temu tego nie wiedziałem - niech sobie myślą, że się z tym urodziłem!).

I tak nieprzewidywalnie było jeszcze kilkakrotnie, kiedy kwitowałem pytania, uwagi, dyskusje stwierdzeniem "Wy to mi robicie specjalnie!" Innymi słowy, często padały pytania, które wcześniej zostały już wyjaśnione, które wymagały jedynie przeczytania, co napisane na ekranie, czy wręcz pomyślenia. Dzięki dwóm sesjom w ramach ITB nauczyłem się, że nie wszystko oczywiste, co jest dla mnie oczywiste, a wszystko wymaga czasu, skupienia i cierpliwości. Trzeba pozwolić na pytania i umiejętnie sugerować chwilę zastanowienia. Wciąż uczę się tej magicznej sztuki nauczania. Z trójką dzieci w domu wydaje się, że powinno być prościej, ale moje osiągnięcia na tym polu świadczą, że chyba jestem oporny na tę naukę.

Jeszcze przed pierwszą sesją ostrzegano mnie, żeby sobie nie urządzić wprowadzenia do programowania w Javie. Dla mnie poznawanie produktów IBM WebSphere przez osoby, które chcą wiedzieć więcej (rozumiem, że ITB, to właśnie wyrażenie tej potrzeby, że chce się coś więcej) sprowadza się do znajomości mechanizmów języka Java, w którym zostały napisane. Dlaczego? Wychodzę z założenia, że jeśli zna się podstawy, tj. składowe, to zrozumienie złożonej materii przychodzi łatwiej. Nie jest to warunek konieczny, ale przy odrobinie otwartości umysłu można poznać więcej, szybciej. Ja tego doświadczam i mam wrażenie, że inni również mogą.

Kiedy zapytałem uczestników, jakie są ich oczekiwania, zapadła cisza. Wyobraź sobie moją minę, kiedy próbuję dopasować materiał do uczestników, a oni sami nie wiedzą, czego chcą! Po sesji przedstawiania się oraz możliwego materiału edukacyjnego, odniosłem wrażenie, że wielu byłoby skłonnych poznać tajniki programowania w Javie.

I się zaczęło (w pozytywnym tego słowa znaczeniu!)

Zaczęliśmy od tworzenia projektów javowych w Eclipse. Kilka klas do uruchomienia z linii poleceń, później wspomniany wykonywalny jar, do tego aplikacja graficzna i na koniec servlet z IBM WebSphere Application Server 8.5 Liberty Profile.

Odnoszę wrażenie, że było to niesamowite doświadczenie dla obu stron. Przekrój naukowy, wiekowy oraz płciowy nie pozostawia złudzeń, że tak zróżnicowanej grupy nie miałem jeszcze wcześniej. I Java się podobała (co składam również na barki nieinwazyjnego sposobu, w jakim ją wprowadziłem - chwila pochwały dla siebie ku poprawieniu nastroju).

Na kolejnym spotkaniu mamy do dyspozycji 6 godzin i na moją propozycję, aby zabawić się z Androidem, grupa odpowiedziała gromkim "TAK!" Zaproponowałem, aby uczestnicy przynieśli swoje smartfony, bo nic tak nie daje kopa ku dalszemu rozwojowi, jak możliwość korzystania z tego, co samemu się stworzyło. Dawno to było, kiedy siedziałem przy Androidzie, a teraz będzie okazja do odświeżenia materiału. Już nie mogę doczekać się, kiedy zobaczę ich twarze, po tym, jak uruchomią pierwsze HelloWorld na swoich smartfonach. Oj, będzie się działo!

Na zakończenie wycinek z korespondencji, którą dostałem od jednego z uczestników:

"Chciałbym poznać środowisko Java od podstaw, ale ukierunkowując swoje zainteresowania w kierunku tworzenia dynamicznych stron WWW. Coś mi mówi, że w tym języku drzemie większy potencjał niż w PHP. Może i się mylę, ale jak nie sprawdzę to się nie dowiem. Tak czy siak skutecznie mnie zachęciłeś by choć spróbować."

I właśnie to było moim celem! Nie mam złudzeń, że 24 godziny to zdecydowanie za mało, aby pozwolić rozkoszować się pięknem języka Java (trzeba najpierw nauczyć się jej odpowiednio smakować), ale zaintrygować nią, to już wystarczy. Ten mail jest dopełnieniem mojego szczęścia. Kiedy dodam, że na sali znalazła się pani nauczycielka, która zechciała popróbować się samodzielnie z poznaniem Javy w ramach zadania domowego, mojego szczęścia jest więcej niż jedna osoba mogłaby skonsumować :-)

Kolejne "doświadczenie naukowe" już podczas tegotygodniowego GeeCON, podczas którego wystąpię z prezentacją "A whirlwind tour of Clojure", aby po niej pojawić się na spotkaniu Warszawa JUG 22 maja z tematem "Budowanie aplikacji Java EE 6 z Clojure" (zapraszam do dyskusji o jego formie i tematyce), aby pojawić się w Ustroniu 28 maja, Tarnowie 29-30 maja i Warszawie na konferencji Softdevcon 31 maja. Do zobaczenia!

p.s. Swoje doświadczenia zbieram w postaci materiałów szkoleniowych, które mam nadzieję opublikować niebawem. Pisz na priv, jeśli jesteś zainteresowany/a poznaniem szczegółów lub udziałem w projekcie jako beta tester. "Amicorum omnia communia" jak mówią.

10 maja 2012

Wątki podczas obsługi asynchronicznego żądania w Servlet 3.0 i IBM WebSphere Application Server 8.0.0.3

5 komentarzy
Kontynuując moje rozpoznawanie mechanizmów asynchronicznego przetwarzania żądań w Servlet 3.0, tym razem przysiadłem, aby rozpoznać ich obsługę w serwerze aplikacyjnym IBM WebSphere Application Server 8.0.0.3. Stworzyłem servlet, który wyświetla wątki uczestniczące w zadaniu.
package pl.japila;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns = "/AsyncServlet", asyncSupported = true)
public class AsyncServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

        // Record the servlet's thread
        PrintWriter out = response.getWriter();
        out.printf("<h3>Servlet's thread: %s</h3>", Thread.currentThread());
        out.flush();
        
        // Put the request into asynchronous mode
        request.startAsync();

        // Run an asynchronous task via servlet 3.0's abstractions
        AsyncContext asyncCtx = request.getAsyncContext();
        MyTask mt = new MyTask(asyncCtx);
        asyncCtx.start(mt);
        
        // Run another asynchronous task via java's abstractions
        MyTask mt02 = new MyTask(asyncCtx);
        new Thread(mt02).start();

        out.printf("<h3>Servlet finishes its job</h3>");
    }

    public class MyTask implements Runnable {

        AsyncContext asyncContext;

        public MyTask(AsyncContext asyncContext) {
            this.asyncContext = asyncContext;
        }

        @Override
        public void run() {
            ServletResponse response = asyncContext.getResponse();
            try {
                // do the time-consuming job
                PrintWriter out = response.getWriter();
                for (int i = 0; i < 5; i++) {
                    out.printf("<h2>Hello from thread: %s (%d)</h2>", Thread.currentThread(), i);
                    out.flush();
                    Thread.sleep(1 /* secs */ * 1000);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                asyncContext.complete();
            }
        }
    }
}
Czy widział(a)byś usprawnienia w tym servlecie?

Komentarz Tomka mógłby świadczyć o niepoprawności takiego podejścia, ale w moim przekonaniu jedynym obecnie problemem jest tworzenie wątku każdorazowo po otrzymaniu żądania i opcjonalnie brak określenia czasu oczekiwania na zakończenie. Alternatywnym i sądzę, że możliwym podejściem jest tworzenie pseudo-wątku za pomocą java.util.concurrent.Callable i skorzystanie z mechanizmów oferowanych przez pakiet java.util.concurrent. Na chwilę obecną wiem, że to możliwe (konsultant), ale nie wiem, jak to zrealizować (specjalista).

Wcześniejsze wpisy o przetwarzaniu asynchronicznym w Servlet 3.0:
Jego uruchomienie skutkuje wyświetleniem strony z uczestniczącymi wątkami. Uważam, że podział na dedykowane pule wątków w WASie, które można osobno stroić do potrzeb aplikacji, prezentuje się obiecująco.


A jak to wygląda na Twoim serwerze aplikacyjnym? Ciekawym wyników z GlassFish 3.1.2, JBoss AS 7.1.1, Apache Tomcat 7.0.27, Oracle WebLogic Server 12c i in. Wyniki można słać na priv, albo zamieścić bezpośrednio w komentarzu do tego wpisu. Gorąco zachęcam.