<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;Dk8CQn4ycCp7ImA9WhRbFkU.&quot;"><id>tag:blogger.com,1999:blog-20941681</id><updated>2012-02-08T08:07:43.098+01:00</updated><category term="inne" /><category term="rational" /><category term="clojure" /><category term="derby" /><category term="jaxb" /><category term="jboss seam" /><category term="screenkasty" /><category term="gwt" /><category term="hosting" /><category term="konkursy" /><category term="różne" /><category term="grails" /><category term="osgi" /><category term="TDD" /><category term="facelets" /><category term="redbook" /><category term="testng" /><category term="artykuły" /><category term="git" /><category term="spring-dm" /><category term="websphere" /><category term="ejb3" /><category term="rails" /><category term="wycieczki" /><category term="sca" /><category term="eclipse" /><category term="jetspeed2" /><category term="jax-ws" /><category term="toplink" /><category term="java7" /><category term="it-soa" /><category term="scala" /><category term="bpms" /><category term="jsf" /><category term="java" /><category term="javaee5" /><category term="spring security" /><category term="javame" /><category term="recenzje" /><category term="bajtkod" /><category term="maven2" /><category term="aspectj" /><category term="jaas" /><category term="olap" /><category term="java6" /><category term="android" /><category term="tuscany" /><category term="jpa" /><category term="groovy" /><category term="brms" /><category term="mac" /><category term="certyfikacja" /><category term="confitura" /><category term="książki" /><category term="ruby" /><category term="podcast" /><category term="buildr" /><category term="openejb3" /><category term="screenkasty grails" /><category term="tomee" /><category term="glassfish" /><category term="cxf" /><category term="skrinkasty" /><category term="warszawa-jug" /><category term="openejb" /><category term="mda" /><category term="ibm" /><category term="guice" /><category term="commons" /><category term="wicket" /><category term="Fsharp" /><category term="uml" /><category term="cdi" /><category term="jee6" /><category term="docbook" /><category term="konferencje" /><category term="axis2" /><category term="xdoclet2" /><category term="szkolenie" /><category term="raven" /><category term="javafx" /><category term="podkast" /><category term="hibernate" /><category term="geronimo" /><category term="spring framework" /><category term="ajax" /><category term="jsp" /><category term="JAVArsovia" /><category term="portlety" /><category term="web services" /><category term="netbeans" /><category term="jakarta" /><category term="asm" /><category term="intellij idea" /><category term="javaee" /><category term="jboss" /><category term="jruby" /><category term="openjpa" /><title>Jacek Laskowski jawnie</title><subtitle type="html">Często, ale bynajmniej nie zawsze o Javie, Java EE czy JVM</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>763</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/BlogJackaLaskowskiego" /><feedburner:info uri="blogjackalaskowskiego" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>BlogJackaLaskowskiego</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><entry gd:etag="W/&quot;CkMGQHw-fip7ImA9WhRbE0w.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-3460069404001835135</id><published>2012-02-03T11:00:00.000+01:00</published><updated>2012-02-04T00:07:01.256+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-04T00:07:01.256+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="konferencje" /><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Clojure na kanwie zmiany cen w sklepach</title><content type="html">&lt;a href="https://twitter.com/jaceklaskowski/status/165411906310520832"&gt;Na twitterze napisałem, że może być dzisiaj ciężko posiedzieć przy Clojure&lt;/a&gt;, a tu &lt;a href="http://groups.google.com/group/warszawa-jug/t/bd221f3ce593b3f3"&gt;podczas dyskusji na Warszawa JUG&lt;/a&gt; pojawiła się niezwykle interesująca propozycja zmiany planów! (proszę nie sugerować się tematem wątku, bo niezwykle szybko podryfował w innym kierunku)&lt;br /&gt;
&lt;br /&gt;
Wystarczyło przespać się z tematem i rozwiązanie samo przyszło. Nie jest to specjalnie czysto funkcyjne podejście do problemu, ale ma pewne zaczątki funkcyjne, więc pozwala mi sądzić, że zaczynam czuć temat programowania funkcyjnego z &lt;a href="http://clojure.org"&gt;Clojure&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Poniżej &lt;a href="http://groups.google.com/group/warszawa-jug/msg/8e2b0bbe5ad249b7"&gt;wycinek dyskusji&lt;/a&gt;, w którym przedstawiam moje funkcyjne rozwiązanie do zmiany cen w sklepie. Tym samym dziękuję całej społeczności Warszawa JUG, w szczególności &lt;a href="http://blog.solidcraft.eu/"&gt;Kubie Nabrdalikowi&lt;/a&gt; i &lt;b&gt;Irkowi Matysiewiczowi&lt;/b&gt; za sprowokowanie mnie do bardziej wytężonej pracy umysłowej!&lt;br /&gt;
&lt;br /&gt;
Korzystając z okazji, chciałbym zaprosić wszystkich zainteresowanych moimi doświadczeniami funkcyjnymi z Clojure oraz samym językiem na konferencje &lt;a href="http://2012.33degree.org/"&gt;33rd Degree&lt;/a&gt; w Krakowie w dniach 19-21.03.2012 oraz &lt;a href="http://4developers.org.pl/"&gt;4 Developers&lt;/a&gt; w Poznaniu w dniu 18.04.2012 na moje publiczne wystąpienia w temacie. Będzie duuużo dyskusji i rzeczywistego poruszania dotykanych problemów mentalnych przy rozpracowywaniu paradygmatu funkcyjnego z Clojure. Musisz tam być, jeśli temat Clojure choć w części Cię zaintrygował i akceptujesz moje, potencjalnie błędne rozumienie sprawy.&lt;br /&gt;
&lt;br /&gt;
Wciąż czekam na potwierdzenie mojego udziału w konferencjach &lt;a href="http://www.sfi.org.pl/"&gt;SFI&lt;/a&gt; w Krakowie i &lt;a href="http://2012.geecon.org/"&gt;GeeCON&lt;/a&gt; w Poznaniu. Jeśli nie chcesz czytać na blogu, ani zawitać do stolicy, zaproś mnie do siebie, tj. przekonaj organizatorów wspomnianych konferencji do zaakceptowania mojego tematu wystąpienia.&lt;br /&gt;
&lt;br /&gt;
To wypełnia mój polski harmonogram wokół publicznych wynużeń o Clojure i planuję w ten sposób przygotować się do wyjścia poza ramy konferencji polskich. Marzy mi się najbardziej &lt;a href="http://euroclojure.com/"&gt;EuroClojure&lt;/a&gt; w Londynie i &lt;a href="http://jazoon.com"&gt;Jazoon&lt;/a&gt; w Zurichu. To byłoby niezwykłe podsumowanie pracy z Clojure!&lt;br /&gt;
&lt;br /&gt;
Pomożecie?&lt;br /&gt;
&lt;br /&gt;
A teraz pora na &lt;a href="http://groups.google.com/group/warszawa-jug/msg/8e2b0bbe5ad249b7"&gt;wspomniany wycinek dyskusji o programowaniu funkcyjnym na forum Warszawa JUG&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;2012/2/3 Jakub Nabrdalik &amp;lt;jakubn@gmail.com&gt;:&lt;br /&gt;
&gt; Na ziemi, developerzy robią software&lt;br /&gt;
&gt; spełniający wymagania klienta. Z tych kilku sklepów które zrobiłem, w&lt;br /&gt;
&gt; prawie wszystkich (w przeciwieństwie do systemów&lt;br /&gt;
&gt; magazynowo-sprzedażowych/ERP, które robiłem), klient życzył sobie by&lt;br /&gt;
&gt; towar nie był rezerwowany przy wkładaniu do koszyka i by cenę można&lt;br /&gt;
&gt; było zmieniać w trakcie godzin pracy i by jej efekty były&lt;br /&gt;
&gt; natychmiastowe (obejmowały także właśnie kupujących). Jeden wyjątek&lt;br /&gt;
&gt; jaki miałem, wiosny nie czyni.&lt;br /&gt;
&lt;br /&gt;
A teraz moje podejście do sprawy (podejście bardziej teoretyczne niżpraktyczne):&lt;br /&gt;
&lt;br /&gt;
Klient: Chcę mieć możliwość aktualizacji ceny w trakcie transakcji (przez transakcję rozumiemy ciąg następujących po sobie czynności - od&lt;br /&gt;
wzięcia towaru z półki do podejścia do kasy)&lt;br /&gt;
&lt;br /&gt;
Ja: Dobrze. Czy w trakcie wykonywania poszczególnych kroków powinienem informować świat zewnętrzny o potencjalnym zapotrzebowaniu na towar&lt;br /&gt;
(wysyłanie komunikatów)? (wersja dla nas, technicznych: czy są jeszcze nietransakcyjne operacje, których wycofanie nie będzie możliwe&lt;br /&gt;
korzystając z monitora transakcji? - tutaj transakcja ma znaczenie techniczne)&lt;br /&gt;
&lt;br /&gt;
Klient: Nie&lt;br /&gt;
&lt;br /&gt;
W tym momencie nie zakładam jeszcze, że będzie to Java, która da mi setPrice(...), albo Clojure, który zrobi to inaczej, np. {:cena ...}&lt;br /&gt;
(to miałem na myśli pisząc o patrzeniu na problemy przez pryzmat dostępnych narzędzi - będąc bardziej dosłowny - olewam narzędzia na tę&lt;br /&gt;
chwilę). Koncentruję się na wymaganiach.&lt;br /&gt;
&lt;br /&gt;
I dalej rozmowa...staram się być upierdliwy^H^H^Hdociekliwy.&lt;br /&gt;
&lt;br /&gt;
Ja: Co w sytuacji, kiedy podchodząc do kasy klient widzi różnicę między ceną na/przy towarze, a kasową/systemową? Chyba daje mu to&lt;br /&gt;
prawo do pozwania Was?&lt;br /&gt;
&lt;br /&gt;
Klient: ???&lt;br /&gt;
&lt;br /&gt;
Załóźmy, że klient mówi, że olewa to, co klient sobie myśli, albo, że w większości przypadków nie ma to znaczenia, bo będziemy się martwić&lt;br /&gt;
na miejscu.&lt;br /&gt;
&lt;br /&gt;
Wtedy ja, mając tę informację, przy wystąpieniu takiej sytuacji obsługuję to jako sytuację wyjątkową (nie piszę o wyjątkach w Javie) i w razie zgłoszenia uwagi przez klienta...już w kodzie...podmieniam jego towar na nowy z nową ceną (tzn. jest to stary produkt z nową&lt;br /&gt;
ceną).&lt;br /&gt;
&lt;br /&gt;
Sytuacja podobna jest do sytuacji, w której wszyscy wiedzą jaka jest wartość cyfry 8, ale akceptują jej zmianę, bo...cóż takie są realia&lt;br /&gt;
aka wymagania klienta. Cóż, ponownie, akceptuję to i jak to obsłużyłbym w Clojure:&lt;br /&gt;
&lt;br /&gt;
(def basket (list)) ; koszyk jest pusty&lt;br /&gt;
&lt;br /&gt;
;; towar&lt;br /&gt;
(def milk {:name :milk :price 10})&lt;br /&gt;
&lt;br /&gt;
;; klient bierze towar z półki&lt;br /&gt;
(def basket (conj basket milk))&lt;br /&gt;
&lt;br /&gt;
;; załóżmy, że teraz cena towaru się zmienia&lt;br /&gt;
(def milk {:name :milk :price 50})&lt;br /&gt;
&lt;br /&gt;
;; klient ma wciąż starą wersję, bo struktury są niezmienne, stałe&lt;br /&gt;
;; My wiemy i chcemy, aby zmiana ceny musiała pociągać za sobą zmianę w systemie&lt;br /&gt;
;; najlepszą opcją, jest odłączenie ceny od towaru i wybranie jej z kasy (odłączamy atrybut cena od fizycznego towaru)&lt;br /&gt;
;; nasze rozumowanie wyżej jest niepoprawne&lt;br /&gt;
;; jeszcze raz&lt;br /&gt;
&lt;br /&gt;
;; czyścimy koszyk&lt;br /&gt;
(def basket '())&lt;br /&gt;
&lt;br /&gt;
;; zależy nam na strukturze, która ma kontrolowany dostęp (współbieżnie), ale odczyt ma być nieblokujący&lt;br /&gt;
;; Clojure STM przychodzi z pomocą, w końcu to malutka biblioteka do programowania współbieżnego&lt;br /&gt;
;; mamy do dyspozycji ref, atom i agent - http://clojure.org/atoms&lt;br /&gt;
&lt;br /&gt;
(def milk-price (atom 10))&lt;br /&gt;
&lt;br /&gt;
;; towar poprawniej&lt;br /&gt;
(def milk {:name :milk :price milk-price})&lt;br /&gt;
&lt;br /&gt;
;; jaka jest teraz cena mleka w kasie?&lt;br /&gt;
@milk-price&lt;br /&gt;
&lt;br /&gt;
;; a ta na etykiecie, na półce?&lt;br /&gt;
@(:price milk)&lt;br /&gt;
&lt;br /&gt;
;; są równe&lt;br /&gt;
(= @milk-price @(:price milk))&lt;br /&gt;
&lt;br /&gt;
;; wkładamy mleko do koszyka&lt;br /&gt;
(def basket (conj basket milk))&lt;br /&gt;
&lt;br /&gt;
;; sprawdźmy cenę mleka w koszyku (idziemy do czytnika)&lt;br /&gt;
;; tutaj wychodzi, że możnaby pomyśleć o koszyku-mapie - identyfikator produktu i ich lista&lt;br /&gt;
;; wybaczcie niedbałość&lt;br /&gt;
(map deref (map :price (filter #(= (:name % :milk)) basket)))&lt;br /&gt;
&lt;br /&gt;
;; w naszym przypadku możnaby krócej - duuuuże "skrzywienie" tematu&lt;br /&gt;
(def milk-price-in-basket (:price (first basket)))&lt;br /&gt;
&lt;br /&gt;
;; są równe&lt;br /&gt;
(= @milk-price @milk-price-in-basket)&lt;br /&gt;
&lt;br /&gt;
;; ZMIANA CENY w kasach&lt;br /&gt;
;; o jeden w górę (inc - to +1)&lt;br /&gt;
(swap! milk-price inc)&lt;br /&gt;
&lt;br /&gt;
;; od tej pory wszystkie wątki aka klienci oraz kasy widzą to samo&lt;br /&gt;
;; to jest przykład uproszczenia współbieżności i cecha Clojure&lt;br /&gt;
;; sprawdźmy&lt;br /&gt;
&lt;br /&gt;
@milk-price-in-basket&lt;br /&gt;
&lt;br /&gt;
;; jeszcze podbijamy cenę&lt;br /&gt;
(swap! milk-price inc)&lt;br /&gt;
&lt;br /&gt;
;; i jeszcze raz sprawdzmy&lt;br /&gt;
@milk-price-in-basket&lt;br /&gt;
&lt;br /&gt;
;; koniec - Ctrl-C&lt;br /&gt;
&lt;br /&gt;
Podsumowanie: All problems in computer science can be solved by another level of indirection [1]&lt;br /&gt;
&lt;br /&gt;
[1] http://en.wikipedia.org/wiki/Abstraction_layer&lt;br /&gt;
&lt;br /&gt;
Czekam na uwagi. Chciałbym tym samym podziękować wszystkim zaangażowanym w dyskusję za przedstawienie bardzo ciekawego problemu&lt;br /&gt;
do rozwiązania, który zamierzam wykorzystać w moich prezentacjach programowania funkcyjnego z Clojure. Jak się uda pierwsze będzie&lt;br /&gt;
podczas SFI w Krakowie 8-10.03.2012, ale spóźnionym był znacznie z rejestracją tematu, więc może być ciężko. Ale ciii, nie zapeszajmy :)&lt;br /&gt;
&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-3460069404001835135?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/o_LPJls4qDc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/3460069404001835135/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2012/02/clojure-na-kanwie-zmiany-cen-w-sklepach.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/3460069404001835135?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/3460069404001835135?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2012/02/clojure-na-kanwie-zmiany-cen-w-sklepach.html" title="Clojure na kanwie zmiany cen w sklepach" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEYFQ346cSp7ImA9WhRUFk0.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-1057281497441253799</id><published>2012-01-26T20:28:00.000+01:00</published><updated>2012-01-26T20:28:32.019+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-26T20:28:32.019+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Zapytany o początki z Clojure</title><content type="html">Nie długo trwało, aby kilka maili między mną a rozmówcą zmieniło temat główny na (nieznacznie) poboczny - zalążek projektu&amp;nbsp;&lt;a href="https://github.com/jaceklaskowski/librarian-clojure"&gt;librarian-clojure&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
W ten sposób poniosło mnie (dosłownie i w przenośni) na &lt;a href="http://librarian-clojure.heroku.com/"&gt;Heroku&lt;/a&gt;, gdzie uruchomiłem webową wersję HelloWorld z &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;'owym &lt;a href="https://github.com/mmcgrana/ring"&gt;Ring&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Pewnie dla niejednego jest to o wiele za wiele, ale czego nie robi się dla zauważalnego rozwoju informatycznego, w którym nie ma miejsca dla już poznanego, a jedynie nieznacznie odświeżonego, a raczej próbuje się czegoś zupełnie nowego, np. zmiana języka obiektowego (Java, Scala) na funkcyjny (Clojure), albo zmiana języka statycznie typowanego (Java, Scala) na dynamiczny (Clojure, JRuby). Człowiek ponownie czuje się niedoświadczony i w ogóle (przesadnie) zagubiony. Podobno tylko tak można się czegoś nowego nauczyć w naszej branży.&lt;br /&gt;
&lt;br /&gt;
Pożyjemy, zobaczymy. A teraz ciii...Clojure się zbliża!&lt;br /&gt;
&lt;br /&gt;
Kiedy projekt trafił w ręce mojego rozmówcy, padło kilka pytań, które pomyślałem, że zadaje więcej osób, więc postanowiłem odpowiedzieć na nie w formie wpisu na blogu (a nóż widelec kogoś skusi i wejdzie w temat - byłoby cudnie - niechby chociaż komentował, jak to beznadziejnie nam idzie!) Marzą mi się regularne sesje, w których z kimś zasiadałbym przy IRC i jakoś współdzieląc ekran programował w parze zdalnie. Podobno się daje i jedynie wystarczy trochę chęci. Znajdzie się ktoś na ochotnika do librarian-clojure? Regularne sesje - stała pora, stała długość sesji i stałe miejsce mogłyby przyciągnąć innych, choćby do pooglądania. Cudo pomysł!&lt;br /&gt;
&lt;br /&gt;
A teraz do pytań.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Jako IDE Eclipse?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
"Jedynie"&amp;nbsp;&lt;b&gt;Clojure REPL&lt;/b&gt; (powłoka Clojure).&lt;br /&gt;
&lt;br /&gt;
Jeśli jednak potrzebujesz wskazówek, to możesz skorzystać z Eclipse z wtyczką &lt;a href="http://code.google.com/p/counterclockwise/"&gt;CounterClockWise (CCW)&lt;/a&gt; lub IntelliJ IDEA i &lt;a href="http://plugins.intellij.net/plugin/?id=4050"&gt;La Clojure&lt;/a&gt;. Możesz spróbować Emacs.&lt;br /&gt;
&lt;br /&gt;
Ja pracuję nad sobą, aby skorzystać z dobrodziejstw Eclipse CCW.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Czy project.clj to manifest?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Zależy co rozumiesz przez manifest? Ten javowy, to nie, ale manifest jako główny plik konfiguracyjny projektu, to jak najbardziej.&lt;br /&gt;
&lt;br /&gt;
Innymi słowy, jest to serce projektu zarządzanego przez &lt;a href="https://github.com/technomancy/leiningen"&gt;leiningen&lt;/a&gt; (odpowiednik Mavena w świecie Clojure).&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Dlaczego nadałeś rozszerzenie *.md dla pliku README?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Chcę korzystać ze wspacia dla &lt;b&gt;markdown&lt;/b&gt; przez &lt;a href="http://github.com/"&gt;GitHub&lt;/a&gt;, który rozpoznaje takie pliki jako pisane w tym metajęzyku. Daje to formatowanie tekstu bez większych udziwnień (niż te, których wymaga sam markdown).&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Czy ns (namespace) to analogia dla pakietów w Javie?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Prawie. To właściwie javowy odpowiednik FQCN (ang. &lt;i&gt;fully-qualified class name&lt;/i&gt;), czyli pakiet + nazwa klasy.&lt;br /&gt;
&lt;br /&gt;
Każdy plik w Clojure to zwykle zestaw funkcji (nic jednak nie stoi na przeszkodzie, abyś potworzył przestrzenie nazw, a w nich funkcje itd.) Zachowując jednak zdrowy rozsądek, rozsądnie jest potraktować pojedynczy plik clj z ns jako klasę, w której na początku znajduje się deklaracja przestrzeni nazewniczej, w której "siedzi" również nazwa pliku (coś ala javowa klasa).&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Czy :use to analogia do import w Javie?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Tak.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Czy deftest to słowo kluczowe definiujące funkcję 'testową' analogicznie do anotacji @org.junit.Test?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Tak.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Jakie wykorzystanie gita preferujesz - z poziomu powłoki systemowej, czy IDE, np. Eclipse EGit?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Powłoka. Javowe IDE wspierają gita, więc kiedy się już zdecydujesz, znajdziesz i wsparcie dla gita. Przekonuję się do &lt;a href="http://eclipse.org/egit/"&gt;Eclipse EGit&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-1057281497441253799?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/mCVsPwG6SZ4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/1057281497441253799/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2012/01/zapytany-o-poczatki-z-clojure.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/1057281497441253799?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/1057281497441253799?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2012/01/zapytany-o-poczatki-z-clojure.html" title="Zapytany o początki z Clojure" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkUFRXsyfip7ImA9WhRUFk0.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-5865263318722582988</id><published>2012-01-20T15:53:00.001+01:00</published><updated>2012-01-26T21:03:34.596+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-26T21:03:34.596+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Clojure finansowo z makrem -&gt; (wplatanie na drugą pozycję)</title><content type="html">&lt;a href="http://jlaskowski.blogspot.com/2012/01/clojure-finansowo.html"&gt;Pisałem w poprzednim wpisie&lt;/a&gt; o moich ponownych poczynaniach wokół &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;, aby w końcu zrozumieć jego istotę i w ogóle istotę programowania funkcyjnego.&lt;br /&gt;
&lt;br /&gt;
Kontynuując moje "naukowe" aktywności zakończyłem lekturę &lt;a href="http://www.amazon.com/o/asin/1935182641"&gt;"The Joy of Clojure: Thinking the Clojure Way"&lt;/a&gt;, którą podsumowałem recenzją &lt;a href="http://www.amazon.com/review/R3A4AEX4O6W0T1"&gt;The "Why" of Clojure - mind-bending for enlightenment with idiomatic Clojure code&lt;/a&gt; w serwisie Amazon.com (nakłaniam do oddaniu głosu) i zabrałem się za kolejną książkę &lt;a href="http://www.dpunkt.de/buecher/3372.html"&gt;Clojure – Grundlagen, Concurrent Programming, Java&lt;/a&gt;. Tym razem będzie po niemiecku, a przez to zdecydowanie trudniej (dawno to było, kiedy władałem tym językiem w stopniu zadowalającym).&lt;br /&gt;
&lt;br /&gt;
Jakby celem utrudnienia i tak już niełatwego zadania nauki Clojure po niemiecku, dostałem od Manning &lt;a href="http://www.manning.com/rathore/"&gt;Clojure in Action&lt;/a&gt;, co przyprawiło mnie o niemały ból głowy - brnąć w przypominanie sobie niemieckiego (jedno z postanowień noworocznych), czy odłożyć to i zabrać się za drugą książkę, która pisana była z myślą o tym "Jak to zrobić w Clojure". Na razie Clojure z niemieckim przeważa.&lt;br /&gt;
&lt;br /&gt;
Przeglądając reakcję czytelników po ostatnim wpisie &lt;a href="http://jlaskowski.blogspot.com/2012/01/clojure-finansowo.html"&gt;Clojure finansowo&lt;/a&gt; uzasadniłem moje wewnętrzne przekonanie, że należy kontynuować temat programowania funkcyjnego z Clojure.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-yP3USts20kE/Txk05CMlZmI/AAAAAAAADK4/K1Isf2YKs6s/s1600/clojure-finansowo-reactions.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="24" src="http://1.bp.blogspot.com/-yP3USts20kE/Txk05CMlZmI/AAAAAAAADK4/K1Isf2YKs6s/s320/clojure-finansowo-reactions.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
I właśnie w tym momencie zorientowałem się, że w prezentowanej aplikacji najbardziej zabrakło idiomatycznego Clojure, o którym tak wiele pisano w "The Joy of Clojure".&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://jlaskowski.blogspot.com/2012/01/clojure-finansowo.html"&gt;Było tak&lt;/a&gt;:&lt;br /&gt;
&lt;pre class="brush: text; gutter: false"&gt;; zakładam 366 dni w roku 2012 i kapitalizację w dni wolne (niesprawdzone)
(defn interest-rate-per-day [interest-rate-per-year]
     (/ (* interest-rate-per-year 0.01) 366))

; funkcja pomocnicza do wyliczenia zysku (niewykorzystywana)
(defn interest [present-value interest-rate]
     (- (* present-value (inc interest-rate)) present-value))

(defn future-value [present-value interest-rate periods]
     (* present-value (Math/pow (inc (interest-rate-per-day interest-rate)) periods)))

(defn max-present-value [limit interest-rate periods]
     (/ limit (Math/pow (inc (interest-rate-per-day interest-rate)) periods)))

(max-present-value 10000 8.1 31)&lt;/pre&gt;Powinno być jednak tak (miejsca oznaczone przez ",,," w pierwszej funkcji służą *jedynie* wskazaniu, gdzie argument zostanie przekazany przez &lt;a href="http://blog.fogus.me/2009/09/04/understanding-the-clojure-macro/"&gt;makro -&amp;gt;&lt;/a&gt; - usuń je, a zobaczysz zmianę, a raczej jej brak!):&lt;br /&gt;
&lt;pre class="brush: text; gutter: false"&gt;; zakładam 366 dni w roku 2012 i kapitalizację w dni wolne (niesprawdzone)
(defn interest-rate-per-day [interest-rate-per-year]
  (-&amp;gt; interest-rate-per-year
      (* ,,, 0.01)
      (/ ,,, 366)))

(defn future-value [present-value interest-rate periods]
  (-&amp;gt; interest-rate 
      interest-rate-per-day 
      inc
      (Math/pow periods)
      (* present-value)))

; teraz dopiero zauważyłem, że future-value jest skopiowane w części do max-present-value :(
(defn max-present-value [limit interest-rate periods]
  (let [v (-&gt; interest-rate interest-rate-per-day inc (Math/pow periods))]
    (/ limit v)))

(max-present-value 10000 8.1 31)&lt;/pre&gt;Od razu ładniej, nieprawdaż?&lt;br /&gt;
&lt;br /&gt;
Mówią, że po ilości idiomatyczych konstrukcji poznaje się poziom zaawansowania w danej dziedzinie i nie inaczej jest w programowaniu - czy to w Javie, czy Clojure, czy innym języku, nawet takim jak angielski, niemiecki, itp.&lt;br /&gt;
&lt;br /&gt;
A jak to jest u Ciebie z idiomatycznymi konstrukcjami? Znasz jakieś w Javie? Ciekawym również Scali (pewnie _ jest swego rodzaju idiomem) czy JRuby.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-5865263318722582988?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/TgT89FkxVac" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/5865263318722582988/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2012/01/clojure-finansowo-z-makrem-wplatanie-na.html#comment-form" title="Komentarze (4)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5865263318722582988?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5865263318722582988?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2012/01/clojure-finansowo-z-makrem-wplatanie-na.html" title="Clojure finansowo z makrem -&gt; (wplatanie na drugą pozycję)" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-yP3USts20kE/Txk05CMlZmI/AAAAAAAADK4/K1Isf2YKs6s/s72-c/clojure-finansowo-reactions.png" height="72" width="72" /><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;D0IAQn85fSp7ImA9WhRWF0w.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-4753177279708095045</id><published>2012-01-04T23:19:00.000+01:00</published><updated>2012-01-04T23:19:03.125+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-04T23:19:03.125+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Clojure finansowo</title><content type="html">Maksym to straszny brojek się robi. Kiedykolwiek przyglądam mu się bacznie, bez względu na jego minkę, widzę w nim gościa, którego będzie nosiło. Aż boimy się z Agatą pomyśleć, co będzie, kiedy zacznie raczkować, a później chodzić. Brrr...Będzie jazda bez trzymanki (jak u Owsiaka na WOŚPie)!&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-lsZXKgOfV0o/TwTPutFTS4I/AAAAAAAADKo/1UCB2olj7Tw/s1600/maksym-18.12.2011.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="320" width="222" src="http://4.bp.blogspot.com/-lsZXKgOfV0o/TwTPutFTS4I/AAAAAAAADKo/1UCB2olj7Tw/s320/maksym-18.12.2011.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Gość właśnie skończył 3 miesiące i rośnie jak na drożdżach. Zdjęcie z miarką jest z 18 grudnia i teraz jest jeszcze dłuższy! Niech rośnie w siłę, aby tatusiowi na emeryturę zarobić :)&lt;br /&gt;
&lt;h2&gt;Clojure&lt;/h2&gt;Jeszcze w zeszłym roku zabrałem się ponownie za &lt;a href="http://clojure.org"&gt;Clojure&lt;/a&gt; i w ramach postanowień noworocznych zdecydowałem się rozpoznać możliwość wykorzystania tego języka do tworzenia aplikacji biznesowych. Wiem, że ludzie w tym coś robią i powstają systemy korporacyjne, ale ja jakoś tego nie czuję.&lt;br /&gt;
&lt;br /&gt;
Jeszcze.&lt;br /&gt;
&lt;br /&gt;
Siedzę od lat w Javie, głównie w jej wydaniu korporacyjnym (Java EE), i kiedykolwiek pytany o możliwości Clojure, moim ochom i echom nie ma końca. Szybko się jednak kończy, kiedy pada &lt;i&gt;"A jaką aplikację możnaby w tym napisać, aby widać było zysk w porównaniu, chociażby, z Javą?"&lt;/i&gt;. I tu mnie pot zalewa, zaczynam czkać i kończy się na mizernym &lt;i&gt;"Nie wiem"&lt;/i&gt;. Właśnie na tym chciałbym popracować w tym roku. Muszę to wiedzieć, albo pora zarzucić Clojure jako język, któremu poświęcam czas.&lt;br /&gt;
&lt;br /&gt;
Czytam sobie pomalutku &lt;a href="http://www.amazon.com/o/asin/1935182641"&gt;"The Joy of Clojure: Thinking the Clojure Way"&lt;/a&gt; i poszukuję odpowiedzi na nurtujące mnie odpowiedzi sensowności stosowania języka przy tworzeniu aplikacji korporacyjnych (niechby to były wyłącznie aplikacje webowe). Wiem o istnieniu &lt;a href="http://compojure.org"&gt;Compojure&lt;/a&gt;, &lt;a href="https://github.com/mmcgrana/ring"&gt;Ring&lt;/a&gt; i podobnych rozwiązań, ale jakoś do mnie nie przemawiają, bo...tak naprawdę w ogóle się z nimi nie zmierzyłem na dłużej niż kilka chwil. To uważam za głównego winowajcę moich trudów mentalnych wokół Clojure.&lt;br /&gt;
&lt;br /&gt;
I właśnie w tym roku postanowiłem to zmienić. Albo teraz, albo nigdy.&lt;br /&gt;
&lt;h2&gt;...finansowo&lt;/h2&gt;Ostatnimi czasy wzięło mnie na porównywanie ofert różnych banków dotyczących lokat (głównie "antybelkowych") i rachunków oszczędnościowych (z dniowym naliczaniem odsetek). Na &lt;a href="http://bankier.pl"&gt;bankier.pl&lt;/a&gt; trafiłem na ofertę Deutsche Banku z kontem oszczędnościowym z kapitalizacją 8,1% (bez podatku od zysków kapitałowych przy założeniu, że nie przekroczymy 10k PLN).&lt;br /&gt;
&lt;br /&gt;
To górne ograniczenie mnie zaintrygowało. Moje skromne pokłady wiedzy finansowej zostały lekko nadwyrężone, kiedy miałem policzyć, ile należy wpłacić, aby nie przekroczyć 10k w ciągu miesiąca, w którym mam do dyspozycji jeden przelew bezpłatny. Chodziło o znalezienie tej magicznej kwoty, z którą mogłem spokojnie przespać 29 nocy, aby przed 30. przelać różnicę niezbędną do "przeczekania" kolejnego miesiąca (i tak wyłącznie do 28 lutego).&lt;br /&gt;
&lt;br /&gt;
Wystarczyło otworzyć Google Docs i policzyć. Można było również skorzystać z kalkulatorów różnej maści w Sieci, albo LibreOffice, ale mnie zachciało się...Clojure (później dopiero doszło do mnie, że to był przerost formy nad treścią, ale co wiem, to moje).&lt;br /&gt;
&lt;br /&gt;
Chcesz spróbować samodzielnie? Nic trudnego. Przekonaj się sam(a)!&lt;br /&gt;
&lt;br /&gt;
Zainstaluj &lt;b&gt;lein&lt;/b&gt; zgodnie z dokumentacją na stronie &lt;a href="https://github.com/technomancy/leiningen#readme"&gt;domowej projektu&lt;/a&gt;. Sprowadza się to do pobrania &lt;a href="https://raw.github.com/technomancy/leiningen/stable/bin/lein"&gt;skryptu lein&lt;/a&gt; i kilku drobnych systemowych ustawień.&lt;br /&gt;
&lt;br /&gt;
Teraz już tylko kilka chwil i siedzisz w Clojure po pachy.&lt;br /&gt;
&lt;pre  class="brush: text; gutter: false"&gt;jacek:~/sandbox
$ lein new clojure-finansowo
Created new project in: /Users/jacek/sandbox/clojure-finansowo
Look over project.clj and start coding in clojure_finansowo/core.clj
jacek:~/sandbox
$ cd clojure-finansowo/
jacek:~/sandbox/clojure-finansowo
$ lein repl
Copying 1 file to /Users/jacek/sandbox/clojure-finansowo/lib
REPL started; server listening on localhost port 25483
user=&gt; 
&lt;/pre&gt;I jesteś w REPL - interaktywnej powłoce Clojure. Skorzystaj z poniższego skryptu, aby wyliczyć ILE trzeba włożyć, aby nie przekroczyć magicznego 10k w miesiącu, w którym masz jeden przelew darmowy (wliczając przelew na rachunek spoza banku).&lt;br /&gt;
&lt;pre  class="brush: text; gutter: false"&gt;; zakładam 366 dni w roku 2012 i kapitalizację w dni wolne (niesprawdzone)
(defn interest-rate-per-day [interest-rate-per-year]
     (/ (* interest-rate-per-year 0.01) 366))

; funkcja pomocnicza do wyliczenia zysku (niewykorzystywana)
(defn interest [present-value interest-rate]
     (- (* present-value (inc interest-rate)) present-value))

(defn future-value [present-value interest-rate periods]
     (* present-value (Math/pow (inc (interest-rate-per-day interest-rate)) periods)))

(defn max-present-value [limit interest-rate periods]
     (/ limit (Math/pow (inc (interest-rate-per-day interest-rate)) periods)))

(max-present-value 10000 8.1 31)&lt;/pre&gt;Nie jest to cudo programowania w Clojure, ale nie miało takim być. Służyło jedynie odświeżeniu moich znajomości z Clojure i uważam, że ten cel został w pełni zrealizowany. Przede wszystkim, zrealizowałem swój własny cel biznesowy (a właściwie finansowy, ale przecież to to samo).&lt;br /&gt;
&lt;br /&gt;
Czy nazwy funkcji odpowiadają zamierzeniom autora (patrząc oczyma czytelnika)? Czy zrobił(a)byś to inaczej? Daj się namówić na podzielenie się kilkoma usprawnieniami, aby biedną duszyczkę jackową uchować od ogni piekielnych :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-4753177279708095045?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/iD14kKbOySk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/4753177279708095045/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2012/01/clojure-finansowo.html#comment-form" title="Komentarze (9)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/4753177279708095045?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/4753177279708095045?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2012/01/clojure-finansowo.html" title="Clojure finansowo" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-lsZXKgOfV0o/TwTPutFTS4I/AAAAAAAADKo/1UCB2olj7Tw/s72-c/maksym-18.12.2011.png" height="72" width="72" /><thr:total>9</thr:total></entry><entry gd:etag="W/&quot;DUYDRXw8cCp7ImA9WhRWFk8.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-1445076368641836087</id><published>2012-01-03T22:46:00.001+01:00</published><updated>2012-01-03T22:46:14.278+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-03T22:46:14.278+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><title>O operatorach przesunięć w Javie...prawie wszystko</title><content type="html">Na zakończenie 2011 zasiadłem do rozpoznania wewnętrznej reprezentacji liczb całkowitych w Javie i w ten sposób powstały dwa wpisy:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://jlaskowski.blogspot.com/2011/12/kod-uzupenien-do-dwoch-w-javie.html"&gt;Kod uzupełnień do dwóch w Javie (reprezentacja binarna liczb całkowitych)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jlaskowski.blogspot.com/2011/12/o-kodzie-uzupenien-do-dwoch-w-javie-raz.html"&gt;O kodzie uzupełnień do dwóch w Javie raz jeszcze&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;Wszystko jednak zaczęło się od operatorów przesunięcia, a szczególnie jednego - prawego, bez znaku &amp;gt;&amp;gt;&amp;gt;. Zaczął mnie intrygować, skąd w ogóle pomysł na przesunięcia w Javie? Jakiej klasy problemy są rozwiązywane nimi? I jakie znaczenie ma przesunięcie z i bez znaku?&lt;br /&gt;
&lt;br /&gt;
Dla przypomnienia:&lt;br /&gt;
&lt;br /&gt;
&amp;amp; (AND) zwraca 1, wyłącznie jeśli oba bity są 1.&lt;br /&gt;
^ (XOR) zwraca 0, jeśli oba bity są jednocześnie 0 lub 1.&lt;br /&gt;
|  (OR)   zwraca 0, wyłącznie jeśli oba bity są 0.&lt;br /&gt;
&lt;br /&gt;
Kolejność działań: &amp;amp;, ^, |&lt;br /&gt;
&lt;h2&gt;Wstępniak&lt;/h2&gt;Java definiuje 3 operatory przesunięcia - w lewo ze znakiem &amp;lt;&amp;lt;, w prawo ze znakiem &amp;gt;&amp;gt; i w prawo bez znaku &amp;gt;&amp;gt;&amp;gt;. Wszystkie działają wyłącznie na typach całkowitych long (64 bity) lub int (32 bity) i typ lewego argumentu wyznacza typ prawego. W przypadku węższych typów -  short, byte, char - są one promowane do int i to po obu stronach niezależnie.&lt;br /&gt;
&lt;br /&gt;
Jeśli typem lewego argumentu jest int, jedynie 5 najmłodszych bitów jest branych pod uwagę. Dlaczego? Taka jest długość bitowej reprezentacji int, tzn. 5 bitów pozwala na określenie zakresu przesunięcia od 0 do 31 włącznie, a tylko takie ma sens w przypadku 32 bitowej reprezentacji liczby całkowitej. W myśl tej zasady prawy argument jest zawsze pomniejszany przez zastosowanie operatora logicznego AND z maską 0x1F (0b11111), aby nie wyjść poza zakres [0, 31].&lt;br /&gt;
&lt;br /&gt;
Jeśli jednak typem lewego argumentu jest long, wtedy jedynie 6 najmłodszych bitów jest branych pod uwagę. Ponownie, tylko tyle bitów - 2^6 - służy do reprezentacji bitowej dowolnej liczby long. Tym razem stosujemy logiczny AND z maską 0x3F (= 0b111111) i przesunięcie jest wykonane w zakresie 0 do 63 włącznie.&lt;br /&gt;
&lt;br /&gt;
Lewy argument typu long nie wymusza promocji argumentu prawego do long, gdyż i tak int jest wystarczający, aby określić zakres przesunięcia [0-63] (przez zastosowanie maski 0x3F).&lt;br /&gt;
&lt;pre&gt;35            00000000 00000000 00000000 00100011
31 -&gt; 0x1f    00000000 00000000 00000000 00011111
&amp;amp;             -----------------------------------
              00000000 00000000 00000000 00000011   -&amp;gt; 3
&lt;/pre&gt;&lt;pre&gt;-29           11111111 11111111 11111111 11100011
31 -&amp;gt; 0x1f    00000000 00000000 00000000 00011111
&amp;amp;             -----------------------------------
              00000000 00000000 00000000 00000011   -&amp;gt; 3
&lt;/pre&gt;Interesujący wydał mi się ten drugi przykład, gdzie prawy operand -29 daje ostatecznie przesunięcie 3 bitów (!) Z takim pytaniem na egzaminie znajomości Javy można łatwo polec.&lt;br /&gt;
&lt;h2&gt;Operator lewego przesunięcia ze znakiem &amp;lt;&amp;lt;&lt;/h2&gt;Działanie n &amp;lt;&amp;lt; s to przesunięcie s bitów w n z uwzględnieniem bitu znaku, czyli zakres działania to 31 bitów dla lewego operandu typu int lub 63 dla long (odpowiednio maskowane jak opisałem wyżej). Nowe bity po prawej, które pojawią się przy przesunięciu, są wypełniane zerami.&lt;br /&gt;
&lt;br /&gt;
Przesunięcie w lewo ze znakiem jest równoważne iloczynowi lewego operandu przez 2 do potęgi s, tj. n * 2^s.&lt;br /&gt;
&lt;br /&gt;
Przykład: 11 &amp;lt;&amp;lt; 3 = 11 * 2^3 = 11 * 8 = 88&lt;br /&gt;
&lt;pre&gt;11 (binarnie)       0000 0000 0000 0000 0000 0000 0000 1011
przesunięcie o 3    0000 0000 0000 0000 0000 0000 0101 1000
wynik:              88 (dziesiętnie)
&lt;/pre&gt;Podobnie z liczbami ujemnymi.&lt;br /&gt;
&lt;h2&gt;Operator prawego przesunięcia ze znakiem &amp;gt;&amp;gt;&lt;/h2&gt;Działanie n &amp;gt;&amp;gt; s to przesunięcie s bitów w n z uwzględnieniem bitu znaku, czyli zakres działania to 31 bitów dla lewego operandu typu int lub 63 dla long (odpowiednio maskowane). Przy przesunięciu w prawo ze znakiem "wypełniaczem" miejsc pustych jest najważniejszy bit - bit znaku, tj. 0 dla dodatnich i 1 dla ujemnych.&lt;br /&gt;
&lt;br /&gt;
Dla liczb nieujemnych, przesunięcie w prawo ze znakiem jest równoważne z obliczeniem ilorazu (bez reszty) lewego operandu przez 2 do potęgi s, tj. n / 2^s.&lt;br /&gt;
&lt;br /&gt;
Przykład: 11 &amp;gt;&amp;gt; 3 = 11 / 2^3 = 11 / 8 = 1&lt;br /&gt;
&lt;pre&gt;11 (binarnie)       0000 0000 0000 0000 0000 0000 0000 1011
przesunięcie o 3    0000 0000 0000 0000 0000 0000 0000 0001
wynik:              1 (dziesiętnie)
&lt;/pre&gt;Przykład: -17 &amp;gt;&amp;gt; 3 = -3&lt;br /&gt;
&lt;pre&gt;-17 (binarnie)      1111 1111 1111 1111 1111 1111 1110 1111
przesunięcie o 3    1111 1111 1111 1111 1111 1111 1111 1101
wynik:              -3 (dziesiętnie)
&lt;/pre&gt;&lt;h2&gt;Operator prawego przesunięcia bez znaku &amp;gt;&amp;gt;&amp;gt;&lt;/h2&gt;Działanie n &amp;gt;&amp;gt;&amp;gt; s to przesunięcie s bitów w n wliczając bit znaku (bit znaku traci swoją wyjątkowość i jest traktowany jak każdy inny bit).&lt;br /&gt;
&lt;br /&gt;
Z przesunięciem bez znaku "wypełniaczem" staje się 0, co może zamazać bit znaku i zmienić znak wyniku, który zawsze będzie dodatni.&lt;br /&gt;
&lt;br /&gt;
Próbując wyrazić działanie &amp;gt;&amp;gt;&amp;gt; wzorem stosuje się następującą zasadę - jeśli lewy operand jest dodatni, wtedy wynik jest identyczny z prawym przesunięciem ze znakiem. Jeśli jednak lewy operand jest ujemy, wtedy wynik równa się (n &amp;gt;&amp;gt; s) + (2 &amp;lt;&amp;lt; ~s). I właśnie ten wzór mnie zmroził najbardziej. Aż mnie do tej pory ciarki przechodzą :)&lt;br /&gt;
&lt;br /&gt;
Przykład: 11 &amp;gt;&amp;gt;&amp;gt; 3 = 11 &amp;gt;&amp;gt; 3 = 11 / 2^3 = 1&lt;br /&gt;
&lt;pre&gt;11 (binarnie)       0000 0000 0000 0000 0000 0000 0000 1011
przesunięcie o 3    0000 0000 0000 0000 0000 0000 0000 0001
wynik:              1 (dziesiętnie)
&lt;/pre&gt;Przykład: -17 &amp;gt;&amp;gt;&amp;gt; 3 = 536870909&lt;br /&gt;
&lt;pre&gt;-17 (binarnie)      1111 1111 1111 1111 1111 1111 1110 1111
przesunięcie o 3    0001 1111 1111 1111 1111 1111 1111 1101
wynik:              536870909 (dziesiętnie)
&lt;/pre&gt;&lt;h2&gt;Zastosowanie przesunięć&lt;/h2&gt;Operatory ze znakiem to odpowiednio mnożenie i dzielenie lewego operanda przez s-tą potęgę dwójki.&lt;br /&gt;
&lt;br /&gt;
Tylko skąd pomysł na &amp;gt;&amp;gt;&amp;gt;?! Na pewno nie zamierzam zapamiętać wzoru na wynik (chociaż przy przeglądaniu Sieci i spisywaniu wiedzy już zagnieździło się w głowie). Musi być tego jakieś sensowne uzasadnienie.&lt;br /&gt;
&lt;br /&gt;
Dopiero w &lt;a href="http://www.java-samples.com/showtutorial.php?tutorialid=60"&gt;The Unsigned Right Shift&lt;/a&gt; olśniło mnie, kiedy trafiłem na możliwe zastosowanie operatora prawego przesunięcia bez znaku &lt;i&gt;"shifting bits that does not represent a numeric value, e.g. pixel-based values and graphics."&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
I uzupełniając, w &lt;a href="http://henkelmann.eu/2011/02/01/java_the_unsigned_right_shift_operator"&gt;Bit twiddling in Java: The Unsigned Right Shift Operator&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
Mimo, że każdy ciąg bitów o długości mniejszej niż 64 (najdłuższy typ w Javie - long) reprezentuje pewną liczbę całkowitą, to jedynie przesunięcia ze znakiem szanują reprezentację ciągu w postaci liczby - zachowują znak, a on ma znaczenie przy liczbach. W przypadku przesunięcia w prawo bez znaku &amp;gt;&amp;gt;&amp;gt; reprezentacja liczbowa nie ma znaczenia, a jedynie ciąg bitów - właśnie przez brak dbałości o znak liczby.&lt;br /&gt;
&lt;br /&gt;
Innymi słowy, główne zastosowanie prawego przesunięcia bez znaku to sterowniki urządzeń, niskopoziomowa obsługa grafiki i formatów graficznych, pakiety komunikacyjne, kryptografia. W mojej karierze z Javą nigdy jednak nie spotkałem się z takimi zadaniami, ani chociażby minimalnego użycia operatorów przesunięcia. Zdają się być zbyt magiczne, aby miały zastosowanie nad chociażby &lt;a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#pow(double, double)"&gt;java.lang.Math.pow(double, double)&lt;/a&gt;. Mówi się również, że maksymalna liczba możliwych pytań z operatorów przesunięć na egzaminie z SCJP nie przekracza...jednego (!)&lt;br /&gt;
&lt;br /&gt;
Zagadka: Jaki będzie wynik dowolnego przesunięcia liczby 0xFFFFFFFF (8 znaków F, tj. 32 jedynki) dla operatorów prawego przesunięcia ze znakiem?&lt;br /&gt;
&lt;br /&gt;
W artykule &lt;a href="http://en.wikipedia.org/wiki/Bitwise_operation"&gt;Bitwise operation&lt;/a&gt; znalazłem bardzo intrygujące zachowanie przesunięć.&lt;br /&gt;
&lt;br /&gt;
Zacznijmy od zagadki: Jaki będzie wynik odpowiednich przesunięć - (-12 &amp;gt;&amp;gt; 2) &amp;lt;&amp;lt; 2, (-12 &amp;lt;&amp;lt; 2) &amp;gt;&amp;gt; 2, (-12 &amp;gt;&amp;gt;&amp;gt; 2) &amp;lt;&amp;lt; 2, (-12 &amp;lt;&amp;lt; 2) &amp;gt;&amp;gt;&amp;gt; 2?&lt;br /&gt;
&lt;br /&gt;
UWAGA: Przesunięcia typów mniej pojemnych, które będą rozszerzane do int - do 32 bitów, np. 8-bitowy byte rozszerzany jest do 32 bitowego int, więc przesunięcie &amp;gt;&amp;gt;&amp;gt; może nie mieć żadnego wpływu i należy maskować liczbę przed przesunięciem, np. (b &amp; 0xFF) &amp;gt;&amp;gt;&amp;gt; 2.&lt;br /&gt;
&lt;br /&gt;
Przesunięcie w prawo zawsze skutkuje "wypadaniem" liczb poza koniec (jakby wpadały w przepaść i były tracone na zawsze).&lt;br /&gt;
&lt;br /&gt;
W &lt;a href="http://www.javaranch.com/journal/200406/ScjpTipLine-BitShifting.html"&gt;The SCJP Tip Line Bit Shifting by Corey McGlone&lt;/a&gt; trafiłem na ciekawą zagadkę, która wynika bezpośrednio z powyższych reguł przesunięcia liczb całkowitych (szczególnie maskowaniem prawego operandu).&lt;br /&gt;
&lt;br /&gt;
Zagadka: Jaki będzie wynik 3 &amp;gt;&amp;gt;&amp;gt; 32?&lt;br /&gt;
&lt;br /&gt;
Na odpowiedź masz jedynie sekundę :)&lt;br /&gt;
&lt;br /&gt;
Pamiętasz maskowanie prawego operandu przed wykonaniem przesunięcia? Dla int będzie to maska 0x1F, czyli 32. Czy teraz łatwiej odpowiedzieć na powyższe pytanie? To jaki będzie wynik?&lt;br /&gt;
&lt;br /&gt;
Wystarczy zastosować mod 32 i masz gotową odpowiedź.&lt;br /&gt;
&lt;br /&gt;
3 &amp;gt;&amp;gt;&amp;gt; 32 = 3 &amp;gt;&amp;gt;&amp;gt; (32 % 32) = 3 &amp;gt;&amp;gt;&amp;gt; 0 = 3&lt;br /&gt;
&lt;br /&gt;
Fajne, co?! Właśnie takie cuda w Javie i w ogóle w językach programowania nakręcają mnie na dalsze ich zgłębianie. Czego i Tobie życzę w Nowym Roku 2012! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-1445076368641836087?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/u7fRJ37WZjY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/1445076368641836087/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2012/01/o-operatorach-przesuniec-w-javieprawie.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/1445076368641836087?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/1445076368641836087?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2012/01/o-operatorach-przesuniec-w-javieprawie.html" title="O operatorach przesunięć w Javie...prawie wszystko" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkcCSH08fCp7ImA9WhRWE04.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-533935271769889515</id><published>2011-12-31T14:25:00.002+01:00</published><updated>2011-12-31T14:27:49.374+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-31T14:27:49.374+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><title>17b 79 63 7a 65 6e 69 61 20 6e 6f 77 6f 72 6f 63 7a 6e 65</title><content type="html">Właśnie dobiega końca 2011 rok i nadeszła pora na życzenia noworoczne. Ostatnio siedzę nad reprezentacją liczb całkowitych w Javie, więc nie inaczej mogło być i dzisiaj (w końcu to taka uroczysta pora, która wymaga specjalnego potraktowania :-))&lt;br /&gt;
&lt;pre&gt;1010011 1111010 1100011 1111010 100011001 101011011 1101100 1101001 1110111 1100101 1100111 1101111
100000
1001110 1101111 1110111 1100101 1100111 1101111
100000
1010010 1101111 1101011 1110101
100000
110010 110000 110001 110010
100000
101111100 1111001 1100011 1111010 1111001
100000
1001010 1100001 1100011 1100101 1101011
100000
1001100 1100001 1110011 1101011 1101111 1110111 1110011 1101011 1101001
100000
1111010
100000
1110010 1101111 1100100 1111010 1101001 1101110 100000101 101110
&lt;/pre&gt;Do odkodowania można skorzystać z poniższej aplikacji.&lt;br /&gt;
&lt;pre  class="brush: java; gutter: true"&gt;package pl.japila.java7;

import java.util.Scanner;

import javax.swing.JOptionPane;

public class ZyczeniaNoworoczne {

    public static void main(String... args) {
        String userInput = JOptionPane.showInputDialog(null,
                "Wprowadź dane do odkodowania (zastosuj zasadę Copiego &amp; Paste)");

        StringBuilder zyczeniaNoworoczne = new StringBuilder();

        Scanner scanner = new Scanner(userInput);
        while (scanner.hasNext()) {
            zyczeniaNoworoczne.append((char) Integer.parseInt(scanner.next(), 2));
        }

        JOptionPane.showMessageDialog(null, zyczeniaNoworoczne);
    }

}&lt;/pre&gt;p.s. Do odkodowania tytułu zastosuj podstawę 16 w linii 17.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-533935271769889515?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/9A0W61oN708" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/533935271769889515/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2011/12/0x17b-0x79-0x63-0x7a-0x65-0x6e-0x69.html#comment-form" title="Komentarze (3)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/533935271769889515?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/533935271769889515?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2011/12/0x17b-0x79-0x63-0x7a-0x65-0x6e-0x69.html" title="17b 79 63 7a 65 6e 69 61 20 6e 6f 77 6f 72 6f 63 7a 6e 65" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;Ak4AQXo8eSp7ImA9WhRWE08.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-5690311948856889631</id><published>2011-12-30T22:51:00.000+01:00</published><updated>2011-12-31T11:55:40.471+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-31T11:55:40.471+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><title>O kodzie uzupełnień do dwóch w Javie raz jeszcze</title><content type="html">W &lt;a href="http://jlaskowski.blogspot.com/2011/12/kod-uzupenien-do-dwoch-w-javie.html"&gt;Kod uzupełnień do dwóch w Javie (reprezentacja binarna liczb całkowitych)&lt;/a&gt; zaprezentowałem moją dotychczasową wiedzę na temat reprezentacji binarnej liczb całkowitych w Javie. Uważam to za mój początek w dokładniejszym rozpoznaniu tematu i nie ukrywam, że wciągnął mnie. Przypomnę tylko, że zaczęło się od zmian w Javie 7 z Fork/Join (nowe podejście do współbieżności w Javie z konstrukcjami wyższego poziomu), aby przez operator przesunięcia w prawo bez znaku &amp;gt;&amp;gt;&amp;gt; przejść do kodu uzupełnień do dwóch dla liczb całkowitych w Javie. Właśnie takie przejścia z jednego tematu na drugi w krótkim czasie lubię najbardziej. Nie pozwalają człowiekowi na dłuższy bezruch.&lt;br /&gt;
&lt;br /&gt;
Przez ostatni tydzień dalej zgłębiałem temat i przesiedziałem sporo czasu czytając różnej maści artykuły. O większości pisałem na swoim kanale &lt;a href="http://twitter.com/jaceklaskowski"&gt;@jaceklaskowski&lt;/a&gt; na twitterze, więc wielu już miało przedsmak tego, o czym teraz będę pisał.&lt;br /&gt;
&lt;br /&gt;
Prawie.&lt;br /&gt;
&lt;h2&gt;Liczby całkowite w Javie&lt;/h2&gt;Specyfikacja &lt;a href="http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html"&gt;The Java Language Specification, Third Edition&lt;/a&gt; w rozdziale &lt;b&gt;4.2.1 Integral Types and Values&lt;/b&gt; wymienia typy całkowite z ich zakresami. W kolejności ich długości wyróżniamy: &lt;b&gt;byte&lt;/b&gt; na 8 bitach, &lt;b&gt;short&lt;/b&gt; na 16 bitach, &lt;b&gt;int&lt;/b&gt; na 32 bitach i najdłuższy &lt;b&gt;long&lt;/b&gt; na 64 bitach. Jest jeszcze całkowite &lt;b&gt;char&lt;/b&gt;, które reprezentowane jest na 16 bitach, z tą różnicą, w porównaniu do poprzednich, że bez bitu znaku (najstarszy bit, pierwszy od lewej strony, albo ostatni z prawej).&lt;br /&gt;
&lt;br /&gt;
I już przy omawianiu dostępnych typów dostrzec można ich różną reprezentację wewnętrzną - byte, short, int i long są z bitem znaku, w przeciwieństwie do char, któremu dano wszystkie dostępne bity do dyspozycji.&lt;br /&gt;
&lt;h2&gt;Dodawanie i liczba przeciwna w kodzie uzupełnień do dwóch&lt;/h2&gt;W artykule na Wikipedii &lt;a href="http://en.wikipedia.org/wiki/Two%27s_complement"&gt;Two's complement&lt;/a&gt; trafiłem na zdanie, które wywarło na mnie niesamowite wrażenie i sprawiło, że zrozumiałem sens istnienia tego systemu kodowania. Uważam, że mogłoby stanowić świetne wprowadzenie dla całego artykułu, albo jedyne:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;"Two's complement numbers is a way to encode negative numbers into ordinary binary, such that addition still works."&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Tylko o jakie dodawanie chodzi?!&lt;br /&gt;
&lt;br /&gt;
Właśnie o zwykłe dodawanie binarne się rozchodzi. Jak mogłem się zorientować przeszukując materiały w Sieci, istnieje wiele systemów reprezentowania liczb całkowitych, ale czy to podwójne zero, czy konieczność rozróżniania znaku dodawanych liczb, sprawiają, że kod uzupełnienia do dwóch wydaje się być najbardziej trafnym. I taki zastosowano w Javie.&lt;br /&gt;
&lt;br /&gt;
W &lt;a href="http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/twoscomp.html"&gt;Signed Int: Two's Complement&lt;/a&gt; mogłem dalej zgłębiać niuanse kodu uzupełnień do dwóch, który od tej pory będę zapisywał jako &lt;b&gt;2C&lt;/b&gt; (od angielskiego &lt;i&gt;two's complement&lt;/i&gt;). Tam dowiedziałem się, że w 2C występuje jedno zero i dodawanie jest spójne dla reprezentacji bitowej z i bez znaku korzystając ze sprzętowej realizacji dodawania bitów (bez względu, czy reprezentują liczbę ze znakiem, czy bez - obie reprezentacje sprowadzane są do reprezentacji bez znaku). Ta cecha 2C jest związana z działaniem sprzętowym dodawania, a tutaj moja wiedza kończy się niezwykle szybko i na tym poprzestanę. I czuję, że więcej nie jest mi potrzebne o maszynowych rozwiązaniach.&lt;br /&gt;
&lt;br /&gt;
Zadanie dla dociekliwych: wykonaj bitowe dodawanie liczb całkowitych, np. 1 i 2.&lt;br /&gt;
&lt;br /&gt;
Najdłuższa liczba całkowita - typu long - ma do dyspozycji 64 bity. Pierwszy bit zarezerwowany jest dla bitu znaku (poza char).&lt;br /&gt;
&lt;br /&gt;
Do uzyskania liczby ujemnej w 2C mamy 3 różne sposoby, z których najczęściej brany jest ten, który polega na odwróceniu wszystkich bitów i dodaniu jedynki, tj. &lt;b&gt;-B = ~B + 1&lt;/b&gt;, przy założeniu, że B to dowolna liczba całkowita.&lt;br /&gt;
&lt;br /&gt;
Zadanie dla dociekliwych: znajdź liczbę przeciwną do 1 korzystając z powyższego algorytmu.&lt;br /&gt;
&lt;br /&gt;
I właśnie w tym momencie dociera do mnie jak interesującym jest rozpoznawanie tematu reprezentacji 2C. Dodaj 1 do liczby, której reprezentacja bitowa zawiera wyłącznie 1ki (czyli -1).&lt;br /&gt;
&lt;pre&gt;1111 1111 1111 1111 1111 1111 1111 1111     // -1
+ 0000 0000 0000 0000 0000 0000 0000 0001     //  1
-------------------------------------------------------------------
 10000 0000 0000 0000 0000 0000 0000 0000     //  0 (na 33 bitach = przepełnienie!)&lt;/pre&gt;Obie liczby są typu int. Obie mają do dyspozycji 32 bity z ostatnim bitem (licząc od lewej) zarezerwowanym na znak. Wynik również musi mieścić się w 32 bitach, ale cóż to?! Dodawanie 1 i -1 kończy się przepełnieniem - wynik wymusza 33 bity. W Javie taka sytuacja jest ukrywana przez usunięcie dodatkowego 33 bitu, aby w ten sposób otrzymać liczbę 32-bitową, która składa się wyłącznie z samych 0, a to po prostu 0 w systemie dziesiętnym. Jakież to piękne!&lt;br /&gt;
&lt;br /&gt;
Idąc dalej, możnaby zastanowić się, co stanie się przy wyznaczaniu liczby przeciwnej dwukrotnie? Czy zachodzi zasada wyznaczania liczby przeciwnej podwójnie, która powinna wyznaczyć liczbę początkową, czyli -(-x) = x, w 2C?&lt;br /&gt;
&lt;br /&gt;
Krok 1. Reprezentacja liczby całkowitej w postaci 32 bitów (dla int) lub 64 bitów (dla long). Ja pozostanę przy 32 bitach.&lt;br /&gt;
&lt;br /&gt;
int n0 = 1111 1111 1111 1111 1111 1111 1111 1111     // -1&lt;br /&gt;
&lt;br /&gt;
Krok 2. Odwracamy wszystkie bity&lt;br /&gt;
&lt;br /&gt;
int n1 = 0000 0000 0000 0000 0000 0000 0000 0000     // 0&lt;br /&gt;
&lt;br /&gt;
Krok 3. Dodajemy jedynkę&lt;br /&gt;
&lt;br /&gt;
int n2 = 0000 0000 0000 0000 0000 0000 0000 0001     // 1&lt;br /&gt;
&lt;br /&gt;
Zakończyłem pierwsze wyliczenie liczby przeciwnej do zadanej, czyli -1. Czy kontynuując odwracanie wyliczę wyjściową, czyli -1?&lt;br /&gt;
&lt;br /&gt;
Krok 4 Reprezentacja bitowa liczby 1&lt;br /&gt;
&lt;br /&gt;
int n00 = 0000 0000 0000 0000 0000 0000 0000 0001     // 1&lt;br /&gt;
&lt;br /&gt;
Krok 5 Odwrócenie bitów&lt;br /&gt;
&lt;br /&gt;
int n10 = 1111 1111 1111 1111 1111 1111 1111 1110     // nieistotne&lt;br /&gt;
&lt;br /&gt;
Krok 6 Dodajemy jedynkę&lt;br /&gt;
&lt;br /&gt;
int n20 = 1111 1111 1111 1111 1111 1111 1111 1111     // -1&lt;br /&gt;
&lt;br /&gt;
I jak łatwo zauważyć n20 == n0, czyli parzyste wykonanie wyznaczania liczby odwrotnej do zadanej zawsze zwróci liczbę początkową.&lt;br /&gt;
&lt;br /&gt;
Z &lt;a href="http://igoro.com/archive/why-computers-represent-signed-integers-using-twos-complement/"&gt;Why computers represent signed integers using two’s complement&lt;/a&gt; tylko upewniłem się, że 2C jest warte poświęconego czasu i jego zrozumienie uważam od tej pory za obowiązkowe (ja już mam za sobą, więc tym łatwiej jest mi rzucać takie stwierdzenia :)).&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;"The representation of signed integers is the representation used by modern processors. It is called "two's complement" because to negate an integer, you subtract it from 2N. For example, to get the representation of –2 in 3-bit arithmetic, you can compute 8 – 2 = 6, and so –2 is represented in two’s complement as 6 in binary: 110."&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
W tym zdaniu znajduje się kolejny sposób na wyznaczanie liczb przeciwnych w 2C. Po prostu odejmujemy liczbę dodanią od 2^N, czyli dla 32 bitowych liczb typu int będzie to 1 + 32 zera w binarnej reprezentacji (wyznaczenie, a co ważniejsze, zapamiętanie tej liczby stanowi nie lada wyzwanie umysłowe, więc pozostańmy przy takim opisie).&lt;br /&gt;
&lt;br /&gt;
Z &lt;a href="http://jlaskowski.blogspot.com/2011/12/kod-uzupenien-do-dwoch-w-javie.html"&gt;Kod uzupełnień do dwóch w Javie (reprezentacja binarna liczb całkowitych)&lt;/a&gt; wiemy, że mnożenie &lt;br /&gt;
&lt;pre  class="brush: java; gutter: false"&gt;package pl.japila.java7;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import org.junit.Test;

public class TwoCDemo {

    @Test
    public void test() {

        long oneAnd32Zeros = (long)1 &lt;&lt; 32; // 0x1_FFFF_FFFF - int overflow!
        int three = 3;  // 0b11
       
        int minusThree = (int)(oneAnd32Zeros - three);
       
        assertThat(minusThree, is(-3));
    }

}&lt;/pre&gt;
Jako podsumowanie, warto zwrócić uwagę na użycie operatora przesunięcia w lewo, aby uzyskać liczbę podwójnie większą od największej w zakresie int. Nie chciałem pisać tej liczby dziesiętnie, a (czego nie wiedziałem wcześniej) jej reprezentacja w notacji bitowej (z 0b), ósemkowej (z wiodącym 0), albo szesnastkowo (z 0x) nie jest możliwa - są one zarezerwowane wyłącznie dla typów int i mniejszych.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-5690311948856889631?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/UxTPNAzDzIg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/5690311948856889631/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2011/12/o-kodzie-uzupenien-do-dwoch-w-javie-raz.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5690311948856889631?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5690311948856889631?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2011/12/o-kodzie-uzupenien-do-dwoch-w-javie-raz.html" title="O kodzie uzupełnień do dwóch w Javie raz jeszcze" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkEBQ3Y_eCp7ImA9WhRWEEU.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-6420682765805417354</id><published>2011-12-23T23:18:00.000+01:00</published><updated>2011-12-28T17:10:52.840+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-28T17:10:52.840+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><title>Kod uzupełnień do dwóch w Javie (reprezentacja binarna liczb całkowitych)</title><content type="html">Wszystko zaczęło się od mojego przedstawienia zmian w Javie 7, w pakiecie &lt;b&gt;java.util.concurrent&lt;/b&gt; podczas &lt;a href="http://jlaskowski.blogspot.com/2011/11/84-spotkanie-warszawa-jug-warszawski.html"&gt;84 spotkania Warszawa JUG - Warszawski Eclipse DemoCamp 2011 - Java 7, JavaFX i Eclipse&lt;/a&gt; (prezentacja do pobrania jako &lt;a href="http://jaceklaskowski.pl/prezentacje/JacekLaskowski-EclipseDemoCamp2011-ConcurrencyUtilitiesJava7-2011.11.08.pdf"&gt;JacekLaskowski-EclipseDemoCamp2011-ConcurrencyUtilitiesJava7-2011.11.08.pdf&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
Wtedy zaczęła się moja przygoda ze szkieletem &lt;b&gt;Fork/Join&lt;/b&gt;. Rozwiązywanie problemu przez zrównoleglanie jego mniejszych składowych wymaga właściwego sposobu podziału (zwykle po połowie) i tak do ustalonego, minimalnego poziomu jego złożoności, a właściwie braku, po którym rozwiązanie można obliczyć "siłowo" (element po elemencie, liniowo).&lt;br /&gt;
&lt;br /&gt;
Kwestią, z którym zwykle zmagają się programiści korzystający z Fork/Join (czy dowolnego problemu rozwiązywanego przez algorytmy typu "dziel i zwycieżaj") to, w jaki sposób dzielić, aby samo dzielenie nie było na tyle skomplikowane, że zysk ze zrównoleglenia zostanie przez niego skonsumowany i ostatecznie wyjdziemy na przysłowiowe "zero".&lt;br /&gt;
&lt;br /&gt;
I tu pojawia się przyczynek do tego wpisu - &lt;b&gt;operator przesunięcia bez znaku w prawo &gt;&gt;&gt;&lt;/b&gt; (ang. &lt;i&gt;unsigned right shift&lt;/i&gt;) w Javie. &lt;br /&gt;
&lt;br /&gt;
Nie jest to niczym odkrywczym w Javie 7, ale przy Fork/Join nabrał większego znaczenia. Mówiąc wprost, ja na niego zwróciłem uwagę właśnie przy Fork/Join. I tak kończy się w zasadzie rola Fork/Join, które nie będzie już przywoływane, bo posłużył wyłącznie jako tło do rozpoznania operatora przesunięcia i jak się później okazało reprezentacji liczb całkowitych w Javie.&lt;br /&gt;
&lt;br /&gt;
Weźmy następujący problem: W jaki sposób wyznaczyć połowę pewnej liczby nieujemnej x?&lt;br /&gt;
&lt;br /&gt;
Liczba dowolna, acz ustalona, x (teraz dopiero dojrzałem, aby dostrzec piękno tych słów) może być liczbą elementów w tablicy, w którym znajdują się elementy do przetworzenia.&lt;br /&gt;
&lt;br /&gt;
Operator przesunięcia w prawo bez znaku &amp;gt;&amp;gt;&amp;gt; jest złożeniem &amp;lt;&amp;lt; i &amp;gt;&amp;gt; w zależności od znaku lewego argumentu - dodatni to &amp;gt;&amp;gt;, a ujemny...cóż...tu sprawa się komplikuje i wygląda (n&amp;gt;&amp;gt;s)+(2&amp;lt;&amp;lt;~s) przy założeniu, że rozważamy n&amp;gt;&amp;gt;&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
Pamiętam, kiedy dostrzegłem (a właściwie pokazano mi palcem), że n &amp;lt;&amp;lt; 1 to po prostu n * 2. Innych zastosowań przesunięcia w lewo jeszcze nie odkryłem, ale pewnie są równie zabójcze dla mojego serca :)&lt;br /&gt;
&lt;br /&gt;
Wtedy zacząłem zgłębiać reprezentację liczb całkowitych w Javie, bo w końcu działanie tych operatorów polega na przesunięciach binarnych.&lt;br /&gt;
&lt;br /&gt;
Zadanie wprowadzające: Czy znasz zapis binarny ujemnej liczby całkowitej w Javie? Niech to będzie -1 lub Integer.MIN_VALUE.&lt;br /&gt;
&lt;br /&gt;
Właśnie wtedy zreflektowałem się, jak niewiele wiem na ten temat. Niewiele?! Delikatnie powiedziane. Nic nie wiem! Zabrałem się za lekturę &lt;a href="http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html"&gt;specyfikacji języka Java&lt;/a&gt; (tutaj niewiele znalazłem poza ogólnikami), aby skończyć na pojęciach reprezentacjach liczb ze znakiem i bez oraz &lt;a href="http://pl.wikipedia.org/wiki/Kod_uzupe%C5%82nie%C5%84_do_dw%C3%B3ch"&gt;kod uzupełnień do dwóch&lt;/a&gt; (ang. &lt;i&gt;two's complement&lt;/i&gt;).&lt;br /&gt;
&lt;br /&gt;
I tak od rozpoznawania Fork/Join przeszedłem do operatora przesunięcia, aby skończyć na reprezentacji liczb całkowitych w Javie.&lt;br /&gt;
&lt;br /&gt;
W ten sposób powstała moja implementacja zamiany binarnego ciągu znaków (bez wiodącego 0b, które doszło w Javie 7) do postaci liczby całkowitej w zapisie dziesiętnym. Klasa nie jest krótka, ale starałem się dobierać nazwy do ich przeznaczenia, więc sądzę, że stosunkowo łatwo będzie zorientować się, co miałem na myśli.&lt;br /&gt;
&lt;br /&gt;
Przede mną analiza kodów źródłowych &lt;i&gt;java.lang.Integer&lt;/i&gt;, która dostarcza większości z poniższych metod. Niedługo więcej w temacie, bo nie czuję, abym go wyczerpał (a mam wrażenie, że jedynie zdrapałem wierzchnią warstwę). Oczekuję uwag i wskazówek od życzliwego czytelnika (w czasie świąt niegodnym nie podzielić się miłym słówkiem).&lt;br /&gt;
&lt;br /&gt;
Gdybyśmy już się nie widzieli, życzę najlepszego z okazji nadchodzących Świąt Bożego Narodzenia. Baw się i świętuj, aby wypoczęty wrócić do dalszych prac poznawczych.&lt;br /&gt;
&lt;pre  class="brush: java; gutter: true"&gt;package pl.japila.java7;

public class BinaryToDecimalIntDemo {

    static final char ZERO = '0';
    static final char ONE = '1';

    public static void main(String[] args) {
        for (int number = Integer.MIN_VALUE; number &lt;= Integer.MIN_VALUE + 0xFFFF; number++) {
            String negativeNumber = Integer.toBinaryString(number);
            int intInDecimal = BinaryToDecimalIntDemo.getIntInDecimal(negativeNumber);
            assert number == intInDecimal;
        }
        for (int number = Integer.MAX_VALUE; number &gt;= Integer.MAX_VALUE - 0xFFFF; number--) {
            String negativeNumber = Integer.toBinaryString(number);
            int intInDecimal = BinaryToDecimalIntDemo.getIntInDecimal(negativeNumber);
            assert number == intInDecimal;
        }
    }

    static int getIntInDecimal(String binary) {
        int sum = 0;
        boolean negative = false;
        char[] bits = binary.toCharArray();
        if (bits.length == Integer.SIZE) {
            if (isNegative(bits)) {
                negative = true;
                bits = subtractOne(invertBits(removeSignBit(bits)));
            }
        }
        for (int i = bits.length - 1, j = 0; i &gt;= 0; i--, j++) {
            sum += calculateValueInBinaryRepAt(j, bits[i]);
        }
        return negative ? (sum == 0 ? Integer.MIN_VALUE : -sum) : sum;
    }

    private static char[] subtractOne(final char[] bits) {
        char[] newBits = new char[bits.length];
        System.arraycopy(bits, 0, newBits, 0, newBits.length);
        int i = newBits.length - 1;
        if (newBits[i] == ONE) {
            newBits[i] = ZERO;
        } else {
            newBits[i] = ONE;
            for (int j = i - 1; j &gt;= 0; j--) {
                if (newBits[j] == ZERO) {
                    newBits[j] = ONE;
                } else {
                    newBits[j] = ZERO;
                    break;
                }
            }
        }
        return newBits;
    }

    private static char[] invertBits(char[] bits) {
        char[] newBits = new char[bits.length];
        System.arraycopy(bits, 0, newBits, 0, newBits.length);
        for (int i = 0; i &lt; newBits.length; i++) {
            newBits[i] = (newBits[i] == ZERO ? ONE : ZERO);
        }
        return newBits;
    }

    private static char[] removeSignBit(char[] bits) {
        char[] newBits = new char[bits.length - 1];
        System.arraycopy(bits, 1, newBits, 0, newBits.length);
        return newBits;
    }

    private static boolean isNegative(char[] bits) {
        return bits.length == Integer.SIZE &amp;&amp; bits[0] == ONE;
    }

    private static double calculateValueInBinaryRepAt(int i, char c) {
        return Math.pow(2, i) * Character.getNumericValue(c);
    }

}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-6420682765805417354?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/mLt6Xeu7lTY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/6420682765805417354/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2011/12/kod-uzupenien-do-dwoch-w-javie.html#comment-form" title="Komentarze (7)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/6420682765805417354?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/6420682765805417354?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2011/12/kod-uzupenien-do-dwoch-w-javie.html" title="Kod uzupełnień do dwóch w Javie (reprezentacja binarna liczb całkowitych)" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><thr:total>7</thr:total></entry><entry gd:etag="W/&quot;AkcMR3c5eip7ImA9WhRXE08.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-1895374810870544704</id><published>2011-12-18T22:27:00.001+01:00</published><updated>2011-12-19T21:54:46.922+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-19T21:54:46.922+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="konferencje" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>Relacja z cracow.mobi w Krakowie</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://cracow.mobi/" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="114" width="320" src="http://1.bp.blogspot.com/-RkChSf-Bb2M/Tu5V0iyaioI/AAAAAAAADKc/xr3QEYbpJj8/s320/cracow.mobi-logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;Dzień rozpocząłem dosyć wcześnie, bo aż o 5:30 i było to zdecydowanie za wcześnie, aby wystąpić jako prelegent na konferencji, jeśli dodać wydarzenia poprzednich dni&lt;br /&gt;
&lt;br /&gt;
Dzień wcześniej poprowadziłem prezentację na temat IBM WebSphere Application Server V8 u jednego z klientów IBM na południu Polski (nazwa i miejsce nie mają znaczenia, więc pozostańmy przy anonimowych nazwach). Tym razem pobudka o 4:45, aby wyrobić się na 6:17 na pociąg. Oczywiście dzień wcześniej również zeszło mi się do po północy przed kompem. Wszystko takie interesujące i ekscytujące, że kiedy przychodzi wieczór i rodzinka kładzie się spać, albo część już dawno śpi, cisza zapada i tak się siedzi, i siedzi, i siedzi, aż zegar wybija północ (!) Pamiętam, jak uporałem się z tym problemem kilka miesięcy temu, kiedy regularnie chodziłem spać około 22, aby zrekompensować "straty" pobudką wcześnie rano. I człowiek wyspany, i jakoś spokojniej z rana, i wszystko takie dopiero budzące się do życia, a dorzucając do tego, że wszystko działo się w lato, kiedy słońce gorąco prażyło, aż się chciało w tym wszystkim uczestniczyć!&lt;br /&gt;
&lt;br /&gt;
Zmęczenie jest zdecydowanie niewskazane przy jakiejkolwiek aktywności, a ta, która wymaga pełnego skupienia i udziału publiczności, jak wystąpienie na konferencji, jest nadzwyczaj niebezpieczna w takim stanie. Potrafi wydrenować ostatnie resztki energii.&lt;br /&gt;
&lt;br /&gt;
Do Krakowa dotarłem na czas - 10:15. Niedługo po rejestracji trafiłem na &lt;b&gt;Radka Holewę&lt;/b&gt;! Jakież było moje zdumienie widząc jego wesołą twarz, która musiała z pewnością kontrastować z moją, na której rysowało się postępujące (i sukcesywnie wyniszczające) zmęczenie. Moja ekscytacja spotkaniem z Radkiem jeszcze bardziej wpłynęła na moją kondycję (tak samo pozytywnie, co i negatywnie, więc możnaby założyć, że saldo pozostało bez zmian, ale wahnięcia również odciskają swoje piętno). Kilka późniejszych rozmów z &lt;b&gt;Konradem "ktosopl"&lt;/b&gt;, &lt;b&gt;Andrzejem "ags"&lt;/b&gt; i dopiero co poznanym &lt;b&gt;Bartkiem Filipowiczem&lt;/b&gt; (prelegentem po mnie) tylko pogarszało sprawę. Nawet gdybym o tym wiedział wcześniej, za nic i tak nie zrezygnowałbym z okazji zamienienia z nimi słowa. Właśnie podczas bezpośrednich spotkań dostrzegam ile tracę ślęcząc przed kompem zamiast wyjść "na miasto".&lt;br /&gt;
&lt;br /&gt;
Za zmęczeniem przywlokło się inne "cudo" - niepokój o moje przygotowanie. Konferencja &lt;a href="http://cracow.mobi"&gt;cracow.mobi&lt;/a&gt; była moją pierwszą, w której prezentacje były z bardzo wąskiego tematu - tworzenia aplikacji mobilnych na platformę &lt;a href="http://android.com"&gt;Android&lt;/a&gt;. Do tej pory zwykłem brać udział w takich, na których poruszano zagadnienia związane z językiem Java, technologią Java EE i miękkimi technikami wytwarzania oprogramowania. Zakres tematyczny zwykle był na tyle obszerny, że trudno było porównywać poszczególne prezentacje pod względem merytorycznym. Pozostawała jedynie możliwość porównywania ich pod względem estetycznym - przygotowanie prelegenta w temacie, wygląd prezentacji i w ogóle interakcja z publicznością. To dawało stosunkowo obszerne pole do popisu (lub ukrycia swojego niewielkiego praktycznego doświadczenia).&lt;br /&gt;
&lt;br /&gt;
To uzmysłowiłem sobie dopiero, kiedy zacząłem przyglądać się, w jaki sposób swoje tematy prezentują Konrad "ktosopl" Malawski i Marek Defeciński.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Konrad&lt;/b&gt; wystąpił z tematem &lt;i&gt;"Deep dive into RoboGuice - beyond "Hello World" apps"&lt;/i&gt;. Nie trudno było zauważyć jego ponadprzeciętną znajomość Androida - posługiwał się terminami androidowymi, jakby sam je tworzył i kilkukrotnie zapytany z sali, odpowiadał bez trudu. Słabiej, acz wciąż znośnie, wypadł prezentacyjnie. Kiedy wszedłem na salę, Konrad już mówił. Zacząłem uważnie przyglądać się, w jaki sposób przedstawiał temat, bo po raz pierwszy miałem możliwość zobaczyć go w akcji. I gdybym na pierwszym wrażeniu poprzestał i odpuścił sobie, to nota byłaby marna. Trudno było odgadnąć, jaki to temat wybrał sobie Konrad do przedstawienia. Tu miałem nie lada zagwozdkę. Przez pierwsze 30 minut Konrad przedstawiał Guice i założenia DI z @Inject. Ucieszyłem się z udziału Guice, a jednocześnie, przez cały ten czas, zachodziłem w głowę, co tak na prawdę skłania Konrada do jego omawiania. Koniec końców wszystkie prezentacje miały być z założenia o Androidzie, a tu czas mija, a o Androidzie ni widu ni słychu. Slajdy słabej jakości tylko pogarszały sprawę - wymagają dopracowania, bo prawie nic nie było widać. Trudno doszukiwać się problemu z projektorami, których ułożenie - jeden duży na dole i drugi na antresoli, oba z bardzo dobrą rozdzielczością - i sala, niewielka, acz dopasowana do liczby uczestników, gwarantowały komfort prelegentom i słuchaczom. W końcu nie wytrzymałem i zajrzałem do agendy - ma być o RoboGuice. Tego nie znałem. Ponownie podniosłem poziom zainteresowania na wysoki. I tak doczekałem się RoboGuice, aby na końcu doświadczyć testowania z nim. Konrad zasługuje na uznanie pod kątem jego obycia z Androidem i RoboGuice, ale na początku za bardzo odszedł od tematu i pod tym kątem zawiódł mnie. Widać potencjał prezentacyjny u Konrada i zrobię wszystko, co w mojej mocy, aby wziął udział w &lt;a href="http://confitura.pl"&gt;Confiturze 2012&lt;/a&gt;. RoboGuice wchodzi do mojego arsenału narzędziowego i z pewnością niebawem się nad nim będę rozwodził na tym blogu. Dzięki Konrad za inspirację!&lt;br /&gt;
&lt;br /&gt;
Przerwa.&lt;br /&gt;
&lt;br /&gt;
Całą prezentację Konrada przesiedziałem sam, aby móc w pełni skosztować jej smaków. Przesiadłem się do Radka, który rozmawiał z...Ryan'em Gosling'iem (!) Nie żartuję. Kolejny po mnie prelegent &lt;b&gt;Bartek Filipowicz&lt;/b&gt; wygląda zupełnie, jakby zdjąć skórę z Ryan'a (nic nie ujmując jednemu czy drugiemu). Kto nie wierzy, niech zajrzy na &lt;a href="http://cracow.mobi/speakers"&gt;stronę prelegentów cracow.mobi&lt;/a&gt; (na samym dole). Nie mogłem się powstrzymać i powiedziałem mu o tym. W ogóle nie widać było jego zdumienia. Bynajmniej u Radka. Podobno Bartek spotykał się z taką reakcją wcześniej. Nie mogłem zdjąć z niego oczu taki podobny! :) Później doszli do nas Andrzej i Konrad, któremu "sprzedałem" moją ocenę jego wystąpienia. Obiecał naniesienie poprawek. Może już na kolejną Confiturę? Gorąco będę go dopingował, aby zgodził się wziąć w niej udział. Konrad, mordo Ty moja, nie daj się prosić!&lt;br /&gt;
&lt;br /&gt;
Po przerwie, mikrofon przejął &lt;b&gt;Marek Defeciński&lt;/b&gt; z &lt;i&gt;"Testowanie w systemie Android"&lt;/i&gt;. Powiało nudą mimo, że temat i slajdy wręcz krzyczały, aby było inaczej. Gość ma wiedzę i doświadczenie w Androidzie - co do tego, nie mam żadnych wątpliwości, ale zdziwiłbym się, gdyby znalazły się osoby, które nie zarzuciłyby mu braku przygotowania od strony prezentacyjnej. Jak zwrócił uwagę Radek - 16 minut trwał wstęp o sobie! To jak za starych, dobrych czasów moich wystąpień, za które dostawałem cięgi. Później Marek zdecydował się na kod na żywo, ale z takimi wpadkami, że podziwiałem jego upór, aby go mimo trudności zaprezentować. Samoprezentacja przez 16 minut, niedziałające testy i w końcu uwagi odnośnie emulatora Androida, zmusiły mnie do zabrania głosu, aby wyprostować stwierdzenia o wolnym działaniu tego ostatniego. Jakoś w końcu musiałem zrekompensować sobie nudę! Można było odnieść wrażenie, że testy są złe, bo są baaardzo wolne w przypadku aplikacji androidowych. Jakkolwiek trudno mi potwierdzić tę tezę w ogólności, to w tym konkretnym przypadku Marek pracował na sprzęcie, na którym całe środowisko ADT wolno działało! Panowie i panie - nie twierdzę, że ADT to cudo inżynieryjne, ale nie łudźmy się, że procek i RAM to podstawa, aby poradzić sobie z takimi problemami. To na pewno nie pozwala na stwierdzenia, że testy są do kitu, bo...maszyna za wolna i kto je by tam robił.&lt;br /&gt;
&lt;br /&gt;
Jakby tego było mało Marek przekroczył czas prezentacji o dobre 10 minut. Gdyby chcieć podsumować jego wystąpienie jednym zdaniem, to pozwoliłbym sobie na stwierdzenie, że w pewnym momencie stracił kontakt z horyzontem i zaczął pikować niebezpiecznie, ku niechybnemu rozbiciu. Szczęśliwie dla wszystkich nie doszło do niej - koniec wystąpienia nadszedł i ulga pojawiła się po obu stronach.&lt;br /&gt;
&lt;br /&gt;
Mimo tylu gorzkich słów pod adresem Marka, cieszę się, że mogłem uczestniczyć w jego prezentacji, bo zgrabnie zaprezentował Robolectric, który wymaga android.jar, o którym wcześniej Konrad nie wspomniał, a jedynie pozwolił sobie na uwagi odnośnie niekompletności Android API, które kończą się komunikatami "Stub!". Jeśli dobrze rozumiem rozbieżność między Markiem i Konradem, to podobną sytuację mamy z bibliotekami Java EE 6 dostarczanymi przez GlassFish w repozytorium mavenowym, które są potrzebne przy kompilacji i odchudzono je o dostarczanie wyłącznie kompletnego API bez kompletnej implementacji. Nic nowego. Dzięki Marek za skorygowanie poprzednika! Już możesz szykować się na lipcową Confiturę!&lt;br /&gt;
&lt;br /&gt;
Kiedy Marek zademonstrował uruchomienie testów z poziomu Maven'a z pomocą wtyczki Easy shell do Eclipse moja ogólna ocena prezentacji lekko się podniosła. Szkoda, że 30 minut prezentacji było do kosza.&lt;br /&gt;
&lt;br /&gt;
Tak dotarłem do przerwy obiadowej. 1h nie pozwalała na wojaże po Krakowie w poszukiwaniu jedzenia, więc skoczyliśmy z Bartkiem "Ryan'em" do pobliskiej restauracji z kebabem. Zaczęło mnie jednak skręcać z obawy o moje przygotowanie, więc skończyło się na kilku gryzach i reszta wylądowała w koszu. Nerwy przed moim wystąpieniem kompletnie odebrały mi apetyt. Okazało się, że również i Bartkowi. Wspólnie przeszliśmy przez jego slajdy. To było dobre posunięcie, bo później okazało się, że nie dałem rady.&lt;br /&gt;
&lt;br /&gt;
I w końcu moje wystąpienie. Pozostawiam jej ocenę samym uczestnikom. Była to moja pierwsza prezentacja o Androidzie, która pozwoliła mi przypomnieć sobie uczucie tremy, która wiąże gardło przed publicznym wystąpieniem. Na prawdę dało mi się to odczuć i samemu zwróciłem uwagę na mój łamiący się głos. Poprzedni prelegenci nie pozostawiali mi złudzeń, że wodolejstwo nie jest tu mile widziane. Machanie rękoma należy odłożyć na bok i oczekuje się prezentacji na wysokim poziomie. Raczej nie byłem przygotowany do tego.&lt;br /&gt;
&lt;br /&gt;
Mimo wszystko jestem z niej zadowolony pod kątem zaangażowania kilku osób w jej przebieg (w ten sposób próbowałem markować niedostateczne przygotowanie). Udało mi się poznać &lt;b&gt;Jurka "AsyncTask"&lt;/b&gt;, &lt;b&gt;Grzegorza "Service"&lt;/b&gt; i &lt;b&gt;Pawła "wyciek Contextu"&lt;/b&gt;. Pojawiło się jeszcze kilka innych osób, które zechciały zabrać głos, ale ich niestety nie poznałem z imienia. Brawa dla wszystkich. Życzyłbym sobie, aby cała trójca zechciała przyjąć moje zaproszenie na Confiturę. W ich wypowiedziach dało się słyszeć doświadczenie i pewność swoich tez. Takich ludzi potrzeba więcej, aby ich postawa prowokowała do dyskusji podczas konferencji, co ma służyć dalszej wymianie doświadczeń. Jeśli Panowie czytacie ten wpis, zachęcam do kontaktu. Sam też Was będę poszukiwał. Pawła znam już osobiście, a Grzegorza jedynie mailem, więc zostaje jeszcze Jurek.&lt;br /&gt;
&lt;br /&gt;
Pod względem merytorycznym u mnie było...średnio. Jakim to doświadczeniem mogę się mienić, skoro moje przygody z Androidem zacząłem pół roku temu?! Za to pod względem czasowym wypadłem perfekcyjnie. Zacząłem punktualnie, przygotowany psychicznie i sprzętowo. I tak też skończyłem - równo o czasie. Temat mojej prezentacji &lt;i&gt;"RESTful Android"&lt;/i&gt; był nietrafiony, bo zdryfował na tematykę współbieżności na Androidzie, ale skoro przed samym rozpoczęciem wspomniałem o tym, czuję się zrehabilitowany. Jeśli tylko nie uraziłem uczestników swoim poziomem merytorycznym, cieszę się, że mogłem ponownie doświadczyć tego błogiego uczucia braku pewności w moje przygotowanie merytoryczne.&lt;br /&gt;
&lt;br /&gt;
Slajdy dostępne są jako &lt;a href="http://jaceklaskowski.pl/prezentacje/JacekLaskowski-cracow.mobi-RESTful-Android-2011.12.09.pdf"&gt;JacekLaskowski-cracow.mobi-RESTful-Android-2011.12.09.pdf&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Po moim wystąpieniu podeszło do mnie dwóch programistów androidowych z Comarchu - Maciej i kolega, którego imienia nie zapamiętałem (wybacz), którzy przedstawili mi problemy z dużą liczbą View w Activity (ponad 80) i problemami z działaniem Galaxy S2. Niestety, mimo, że szukali pomocy u mnie, to nie trwało długo, abym zreflektował się, kto tu potrzebuje pomocy - to nie ja im, ale oni mnie mogą pomóc. Mam do nich kontakt i nie zawaham się go użyć! Takich ludzi chciałbym więcej jako prelegentów na Confiturze 2012. Muszę nad nimi popracować jeszcze, bo nieświadomi moich planów względem nich.&lt;br /&gt;
&lt;br /&gt;
Tak zeszła mi prezentacja Bartka. Wybacz Bartek! Zaproszenie na Confiturę wciąż podtrzymuję, więc pozostajemy w kontakcie.&lt;br /&gt;
&lt;br /&gt;
Tak też skończyła się ścieżka wykładowa, ale nie moje poznawanie nowych twarzy. Mimo, że to wciąż konferencja javowa, to mało było osób, które wcześniej znałem. Wciąż zachodzę w głowę, czy Android to pole dla dotychczasowych znajomych z branży? Jakoś niewielu para się Androidem i trudno mi teraz odpowiedzieć dlaczego. Frapuje mnie to, więc niebawem pewnie jakaś odpowiedź się znajdzie.&lt;br /&gt;
&lt;br /&gt;
Na sam koniec trafiłem na kilku napaleńców konferencyjnych, którzy zapowiedzieli już organizację konferencji o urządzeniach inteligentnych w Katowicach! Pozdrowienia dla &lt;b&gt;Piotra "kosarock"&lt;/b&gt; i &lt;b&gt;Marcina&lt;/b&gt;! Nie tylko zaskoczyli mnie swoim zdeterminowaniem, ale również wyborem miejsca (a może przede wszystkim tego drugiego). Sądziłem, że Kraków i Wrocław promieniują na okolicę tak silnie, że trudno mówić o kolejnej inicjatywie w pobliżu. W samym Krakowie mamy już GeeCON z ekipą z Polish JUG, JDD Proidei z Andrzejem i Anią na czele, 33rd degree Grześka Dudy, teraz cracow.mobi, a jeszcze są SFI i Eclipse DemoCamp. Dodać do tego silne oddziaływanie Poznania (Eclipse DemoCamp, Code Retreat i potencjalnie GeeCON) oraz Warszawy (Confitura, warsjawa i Eclipse DemoCamp), i nie widzę miejsca na nową propozycję w środkowej i południowej Polsce (może za wyjątkiem Łodzi, w której ostatnio mieliśmy do czynienia z mobilization i Code Retreat). Gdybym tylko mógł oddać zapał katowickich organizatorów, to pewnie wielu z Was nie miałoby złudzeń, że w 2012 będzie się mobilnie działo w Polsce, a Katowice stanie się kolejnym miejscem konferencyjnym po cracow.mobi i mobilization. Będę ich wszystkich gorąco dopingował. Z tyloma konferencjami w okolicy, będzie więcej okazji na wymianę doświadczeń. Bardzo się z tego cieszę i kiedykolwiek poproszony o pomoc, zawsze chętnie jej udzielę. Zresztą organizatorzy odgrażali się, że już jestem zaproszony! Z pewną nieśmiałością przyjmuję zaproszenie. Dziękuję!&lt;br /&gt;
&lt;br /&gt;
O 16:45 byłem już w pociągu, aby przed 21 pojawić się w domu. Zmęczony i podekscytowany cieszyłem się, że wcześniej odwołałem udział w &lt;a href="http://add-11.posterous.com"&gt;Agile Development Day 2011 w Warszawie&lt;/a&gt;, które zaplanowane zostało na całą sobotę! Po prostu nie dałbym rady. Tak bardzo chciałem w nim uczestniczyć, że kiedy już się pojawiła w harmonogramie, okazało się, że nie dane mi w niej wziąć udziału. Tak bardzo chciałem móc zasiąść z &lt;b&gt;Jakubem Nabrdalikiem&lt;/b&gt; w parze i przy akompaniamencie &lt;b&gt;Krzyśka Jelskiego&lt;/b&gt; ponownie wczuć się w melodię TDD. Następnym razem.&lt;br /&gt;
&lt;br /&gt;
Trójka organizatorów cracow.mobi: &lt;b&gt;Mateusz&lt;/b&gt;, &lt;b&gt;Maria&lt;/b&gt; i &lt;b&gt;Łukasz&lt;/b&gt;, których miałem przyjemność poznać podczas konferencji stanęła na wysokości zadania. Jestem im niezwykle wdzięczny, że umożliwili mi wziąć udział w konferencji i to w zaszczytnej roli prelegenta. Niech to będzie dzień, w którym upewniłem się, że inwestycja mojego czasu w rozpoznanie Androida była dobrym wyborem. Nowa technologia, zupełnie nowa klasa urządzeń, nowi ludzie - w roli uczestników, prelegentów i organizatorów. Jestem pozytywnie naładowany na kolejne androidowe przyjemności. Nie mógłbym sobie wymarzyć lepszego zakończenia roku 2011!&lt;br /&gt;
&lt;br /&gt;
Nagrania z konferencji mają być dostępne na &lt;a href="http://www.youtube.com/user/mobiledeveloperpl"&gt;kanale mobiledeveloperpl na YouTube&lt;/a&gt;. Zapraszam do ich oglądania i komentowania. Uwagi zawsze mile widziane. Już nie mogę doczekać się, kiedy tylko pojawi się nagranie z mojego wystąpienia. Oj wstyd mi, oj wstyd, że można było tak wiele, a dałem tak niewiele. Kolejne książki czekają na moją przychylność i kolejne pomysły na aplikacje. Końcówkę roku 2011 zaplanowałem androidowo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-1895374810870544704?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/-aKYnilqWIo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/1895374810870544704/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2011/12/relacja-z-cracowmobi-w-krakowie.html#comment-form" title="Komentarze (12)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/1895374810870544704?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/1895374810870544704?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2011/12/relacja-z-cracowmobi-w-krakowie.html" title="Relacja z cracow.mobi w Krakowie" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-RkChSf-Bb2M/Tu5V0iyaioI/AAAAAAAADKc/xr3QEYbpJj8/s72-c/cracow.mobi-logo.png" height="72" width="72" /><thr:total>12</thr:total></entry><entry gd:etag="W/&quot;AkQFSXw7eSp7ImA9WhRQGUU.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-1827460204197143353</id><published>2011-12-15T23:31:00.000+01:00</published><updated>2011-12-15T23:31:58.201+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-15T23:31:58.201+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="java7" /><title>ManagementFactory.getPlatformMXBeans() w Javie 7 i nauka generyków</title><content type="html">Jestem technicznym recenzentem książki &lt;a href="http://www.packtpub.com/java-7-new-features-cookbook/book"&gt;Java 7 New Features Cookbook&lt;/a&gt; przed jej oficjalnym wydaniem na początku 2012 (pisałem o tym w &lt;a href="http://jlaskowski.blogspot.com/2011/10/pierwszy-rozdzia-o-java-7-od-packt.html"&gt;Pierwszy rozdział o Java 7 od Packt&lt;/a&gt;) i w rozdziale &lt;b&gt;9. Database, Security and System Enhancements&lt;/b&gt; trafiłem na metodę &lt;a href="http://docs.oracle.com/javase/7/docs/api/java/lang/management/ManagementFactory.html#getPlatformMXBeans%28java.lang.Class%29"&gt;java.lang.management.ManagementFactory.getPlatformMXBeans()&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Jej użycie od razu przykuło moją uwagę, przede wszystkim dlatego, że korzysta z typowego użycia typów generycznych w Javie. Zwykle generyki sprawiały mi trudność i postanowiłem tym samym sprawdzić swoją ich znajomość. Po przejrzeniu kodu źródłowego tej metody postanowiłem spróbować swoich sił i napisać własną metodę o podobnej funkcjonalności. Co jednak istotne, to zależało mi na użyciu generyków.&lt;br /&gt;
&lt;br /&gt;
I tak powstała klasa poniżej.&lt;br /&gt;
&lt;pre  class="brush: java; gutter: true"&gt;package pl.japila.java7;

import static java.lang.System.out;

public class Demo {

    public static void main(String[] args) throws Exception {
        int i = getInstance(Integer.class);
        out.println("i=" + i);
    }

    public static &amp;lt;T extends Number&gt; T getInstance(Class&amp;lt;T&gt; clazz)
            throws InstantiationException, IllegalAccessException {
        return clazz.newInstance();
    }

}&lt;/pre&gt;Czy dostrzegasz błąd, który popełniłem? Czy potrafisz wskazać go bez uruchamiania tej klasy? Ja niestety nie wykazałem się odpowiednią dbałością o szczegóły i umknęło mi to jedno ważne założenie. A jak u Ciebie?&lt;br /&gt;
&lt;br /&gt;
Przy okazji pisania tej klasy znalazłem również sposobność, aby przetestować skrót klawiszowy w Eclipse do utworzenia statycznego importu dla System.out - &lt;b&gt;Cmd+Shift+M&lt;/b&gt;. Spróbowałem również odszukać tej funkcjonalności przez odpalenie &lt;a href="http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500/whatsnew/eclipse-news-part1.html"&gt;Quick access&lt;/a&gt; i tam też to można znaleźć.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-GgIPBePOxRk/TupzL0W4AaI/AAAAAAAADJc/k1Z774DKW8s/s1600/eclipse-command-assist.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="98" width="320" src="http://4.bp.blogspot.com/-GgIPBePOxRk/TupzL0W4AaI/AAAAAAAADJc/k1Z774DKW8s/s320/eclipse-command-assist.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Dzięki &lt;b&gt;Marcinowi Stachniukowi&lt;/b&gt; (z &lt;a href="http://mstachniuk.blogspot.com/2011/12/agile-development-day.html"&gt;Agile Development Day&lt;/a&gt;) mogłem nauczyć się czegoś nowego o Eclipse! Dziękuję!&lt;br /&gt;
&lt;br /&gt;
Przeczytałem wpis Marcina, skomentowałem go, zrecenzowałem rozdział, popróbowałem się z generykami i jeszcze zapamiętałem dwa skróty klawiszowe w Eclipse. Nie za dużo jak na jeden dzień?! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-1827460204197143353?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/6Cb52X4yft4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/1827460204197143353/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2011/12/managementfactorygetplatformmxbeans-w.html#comment-form" title="Komentarze (4)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/1827460204197143353?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/1827460204197143353?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2011/12/managementfactorygetplatformmxbeans-w.html" title="ManagementFactory.getPlatformMXBeans() w Javie 7 i nauka generyków" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-GgIPBePOxRk/TupzL0W4AaI/AAAAAAAADJc/k1Z774DKW8s/s72-c/eclipse-command-assist.png" height="72" width="72" /><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;DUAMRn8-cSp7ImA9WhRQGUg.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-7265106991059904129</id><published>2011-12-14T23:37:00.000+01:00</published><updated>2011-12-15T15:03:07.159+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-15T15:03:07.159+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="websphere" /><category scheme="http://www.blogger.com/atom/ns#" term="konferencje" /><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="javaee" /><title>Wrażenia pokonferencyjne - o Eclipse DemoCamp w Poznaniu</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_November_2011/Poznan" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="81" src="http://wiki.eclipse.org/images/b/b7/Eclipse_DemoCamp_New.jpg" width="100" /&gt;&lt;/a&gt;&lt;/div&gt;Jak ten czas szybko płynie! Wydaje się, że to wcale nie tak dawno, kiedy &lt;a href="http://jlaskowski.blogspot.com/2011/11/wrazenia-pokonferencyjne-zacznijmy-od.html"&gt;pisałem o konferencji JDD w Krakowie&lt;/a&gt;, a to już prawie 2 tygodnie mija i dopiero teraz przedstawiam wrażenia z kolejnej, ze mną w roli prelegenta. Potwierdza się stara, dobra zasada, że zadania trzeba robić, a nie o nich mówić i w przypadków moich relacji pokonferencyjnych niestety nie udało mi się jej zastosować. Nadrabiam.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Dobrego złe początki&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Że też zawsze muszę sobie wybrać temat na wystąpienie, w którym doświadczenie zdecydowanie odbiega od standardów, których oczekuje się od prezentującego! W końcu zejdę na serce od tego stresu :)&lt;br /&gt;
&lt;br /&gt;
Do Poznania przyjechałem około 17:30 i wydawało się, że była to odpowiednia chwila. Jeśli jednak dodać do tego właśnie rozpoczynające się targi poznańskie (nie wiem, czy to były te targi, czy inne z puli wielu targów w Poznaniu), to niestety było to złe założenie. Kiedy taksówka zajechała przez dworzec, a później ślimaczym tempem dowlokła się pod drzwi pubu na Szyperskiej, było już dawno po rozpoczęciu &lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_November_2011/Poznan"&gt;Eclipse DemoCamp 2011 w Poznaniu&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Zastałem już tłoczną salę słuchaczami, którym &lt;b&gt;Tomek Zarna&lt;/b&gt; przedstawiał karierę Eclipse. Nie miałem okazji wysłuchać jego prezentacji, bo nie tylko, że trochę głośno, że jedynie na przodzie można było usłyszeć, co ma do powiedzenia, ale też sama sytuacja spotkania z organizatorami: &lt;b&gt;Natalią Klimasz&lt;/b&gt; i &lt;b&gt;Łukaszem Stachowiakiem&lt;/b&gt;, a później &lt;b&gt;Adamem Dudczakiem&lt;/b&gt;, aby jeszcze później trafić na &lt;b&gt;Darka "egit" Łukszę&lt;/b&gt; i...patrz, że też musiałem zapomnieć imienia!...nie pozwalała na wsłuchiwanie się. Zresztą, kto by tam słuchał, kiedy można pogadać z dawno niewidzianymi znajomymi?! Trafiłem również w międzyczasie na &lt;b&gt;Dawida Weissa&lt;/b&gt;, ale to było chyba już po jego prezentacji. Wszystkich gorąco pozdrawiam!&lt;br /&gt;
&lt;br /&gt;
"Przebijanie" się przez wrzawę powodowało tylko dalsze jej nakręcanie, więc o rozmowie nie było co marzyć. Za głośno. Jednak próbowaliśmy, co później odbiło się na moim gardle. Do domu zajechałem w stanie, jakbym był po niezłej bibce.&lt;br /&gt;
&lt;br /&gt;
Przysłuchiwałem się prezentacji Dawida, ale wciąż w zasadzie myślałem o moim przygotowaniu tematu i przyglądałem się reakcjom uczestników na to, co ma do powiedzenia. W sali znajdowały się dwa monitory, na których można było zobaczyć slajdy, ale tylko jeden miał obok prezentera, więc było nie lada wyzwaniem zdecydować się, gdzie patrzeć, aby widzieć, albo słyszeć (monitory były różnej rozdzielczości i ich ułożenie sprawiało, że miało to znaczenie). Miałem wrażenie, że atmosfera jest lekko akademicka, tzn. za bardzo nastawiona na odbiór, bez choćby chęci zadawania pytań, co sama atmosfera ogólnego zgiełku dodatkowo "sprzyjała".&lt;br /&gt;
&lt;br /&gt;
Pizza time. Już wspólnie ze Szczecinianami. Spałaszowaliśmy kilka kawałków, aby dalej dywagować na tematy różne. Prezentacje sobie, a my sobie.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Wchodzę na scenę&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Przyszła pora na moje wystąpienie. Sądziłem, że EDC to rodzaj spotkania, w którym dużo kodu jest wielce pożądane. Z drugiej strony zastanawiałem się, na ile skuteczny jest przekaz z otwartym IDE i kodowaniem na żywo. Tym razem postawiłem na to drugie. Miało być dużo &lt;b&gt;IBM Rational Application Developer V8&lt;/b&gt; z &lt;b&gt;Java EE 6&lt;/b&gt; na &lt;b&gt;IBM WebSphere Application Server V8&lt;/b&gt;. I to był mój błąd. Właśnie przez te monitory i ogólną wrzawę. Kompletnie nie spodziewałem się takiego miejsca i atmosfery, w której ja miałbym prezentować Java EE 6 tworząc aplikacje na żywo. Chciałem dobrze. To wszystko ich wina :)&lt;br /&gt;
&lt;br /&gt;
Najbardziej obawiałem się mojego przygotowania z JAX-RS (z zanurzonym Apache Wink w WAS V8), ale ostatecznie i tak nie pokazałem tego. Dzisiaj bardzo tego żałuję, bo mogło uzupełnić przekaz.&lt;br /&gt;
&lt;br /&gt;
Zaczęły się problemy z mikrofonem - a to za głośno, a to za daleko i tym samym cicho, a ja potrzebowałem wolnych rąk do kodowania. W końcu się dopasowaliśmy - doszedłem do porozumienia z mikrofonem i zabrałem się za demo.&lt;br /&gt;
&lt;br /&gt;
Zacząłem od prostej aplikacji webowej z servletem określonym przez @WebServlet. Zero deskryptora i tylko @WebServlet. Później urlPatterns i @WebFilter. Dalej przyszła pora na demonstrację @Stateless bez jawnego interfejsu biznesowego w ramach WAR. Dalej chwila z CDI i tak przeszliśmy z @EJB do @Inject (ciekawym, ile osób rozróżnia zastosowanie obu?) Dotarłem bodajże do @WebService wygenerowanym z POJO w projekcie javowym i na tym się zakończyła moja batalia o zademonstrowanie produktów IBM wspierających Java EE 6.&lt;br /&gt;
&lt;br /&gt;
Nawet się nie obejrzałem i wnet było już po godzinie.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Losowanie&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Na zakończenie organizatorzy przeprowadzili losowanie. Pamiętam, że losowano książki, bo podczas ich rozlosowywania zdążyłem tylko powiedzieć do Darka, że nigdy, ale to nigdy nie udało mi się czegokolwiek wygrać i chyba musiałem mówić to z takim przekonaniem, że kiedy skończyłem, padło "Jacek Laskowski".&lt;br /&gt;
&lt;br /&gt;
Wygrałem książkę!&lt;br /&gt;
&lt;br /&gt;
Cóż za radocha. Miałem do wyboru jedną i padło na &lt;a href="http://my.safaribooksonline.com/book/programming/9780596809515"&gt;"97 Things Every Programmer Should Know"&lt;/a&gt;. To było doskonałe zakończenie mojego wystąpienia i całego spotkania mimo, że, jak się później okazało, nie był to wcale koniec.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Nocne dyskusje i powrót&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu prezentacji, siedzieliśmy jeszcze dłuższą chwilę. Rozmawialiśmy o różnych rzeczach, aż padło magiczne: "Wychodzimy na miasto". Trafiliśmy na rynek, gdzie przesiedzieliśmy do...4 nad ranem! (mam nadzieję, że nie naciągam, bo już sam nie jestem pewien do której siedzieliśmy). Szczecin odjechał. I ja również zasypiając nad ranem. To na prawdę bolało szczególnie, że zakończyło się moim przespaniem porannego pociągu do Warszawy. W końcu jednak dotarłem do niej i EDC przeszło do historii jako bardzo udane przedsięwzięcie. Upewniło mnie o potrzebie częstszego udziału w nich i coś mi mówi, że nie powinienem odstępować od publicznych wystąpień. Chyba zaczęły mi ponownie sprawiać niesamowitą przyjemność.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-tZjyzhpXof8/Tun99sjCbBI/AAAAAAAADJQ/YxrcC4pcQIE/s1600/jacek-z-lukaszem-eclipse-democamp-poznan-2011.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="180" width="320" src="http://4.bp.blogspot.com/-tZjyzhpXof8/Tun99sjCbBI/AAAAAAAADJQ/YxrcC4pcQIE/s320/jacek-z-lukaszem-eclipse-democamp-poznan-2011.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Dziękuję Natalii i Łukaszowi za zaproszenie. Możliwość wyłożenia mojej niewiedzy szerszej publiczności była bezcenna :) Czuję się zobowiązany!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-7265106991059904129?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/60BJnE7CD4U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/7265106991059904129/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2011/12/wrazenia-pokonferencyjne-o-eclipse.html#comment-form" title="Komentarze (3)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/7265106991059904129?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/7265106991059904129?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2011/12/wrazenia-pokonferencyjne-o-eclipse.html" title="Wrażenia pokonferencyjne - o Eclipse DemoCamp w Poznaniu" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-tZjyzhpXof8/Tun99sjCbBI/AAAAAAAADJQ/YxrcC4pcQIE/s72-c/jacek-z-lukaszem-eclipse-democamp-poznan-2011.jpg" height="72" width="72" /><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;CUcGSHgyeCp7ImA9WhRQEU8.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-2553056197262964159</id><published>2011-12-05T22:42:00.001+01:00</published><updated>2011-12-05T23:10:29.690+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-05T23:10:29.690+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java7" /><title>j.u.concurrent.Phaser i wątek onAdvance w Java 7</title><content type="html">Każdorazowo, kiedy przygotowywałem klasę wspomagającą rozpoznanie &lt;a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Phaser.html"&gt;java.util.concurrent.Phaser&lt;/a&gt; jej uruchomienie wymagało dodania opcji &lt;b&gt;-ea&lt;/b&gt; w konfiguracji uruchomieniowej w Eclipse. W ten sposób mogłem prezentować moje doświadczenia w postaci pojedynczej klasy z użyciem &lt;b&gt;assert&lt;/b&gt;. To jednak wymagało ode mnie właściwej konfiguracji dla każdej uruchamianej klasy (!) Wystarczy jednak mała zmiana w konfiguracji JRE i po sprawie!&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-8HU3pHc8J0I/Tt07g53X3zI/AAAAAAAADJA/S7HBEru5gDw/s1600/java7-phaser-eclipse-ea-enabled.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="238" width="320" src="http://2.bp.blogspot.com/-8HU3pHc8J0I/Tt07g53X3zI/AAAAAAAADJA/S7HBEru5gDw/s320/java7-phaser-eclipse-ea-enabled.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Podczas mojego ostatniego wystąpienia o zmianach w Java 7 w kontekście programowania współbieżnego, w którym przedstawiłem j.u.c.Phaser, padło pytanie o wątek, który uruchamia metodę &lt;a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Phaser.html#onAdvance%28int,%20int%29"&gt;protected boolean onAdvance(int phase, int registeredParties)&lt;/a&gt;. Za pomocą tej metody kontrolujemy dostępność obiektu Phaser. Kiedy zwróci true, Phaser kończy swoje działanie. Dzięki niej, mamy również możliwość uruchomienia akcji podsumowującej fazę, kiedy ostatni wątek w danej fazie zgłosi swoje przybycie, a przed przejściem do kolejnej (jeśli takowa w ogóle nastąpi).&lt;br /&gt;
&lt;br /&gt;
Podczas spotkania nie byłem w stanie odpowiedzieć na pytanie o wątek, w którym będzie uruchomiona metoda onAdvance(), co czynię teraz, w poniższej klasie.&lt;br /&gt;
&lt;pre  class="brush: java; gutter: true"&gt;package pl.japila.java7.concurrent.phaser;

import java.util.concurrent.Phaser;

public class PhaserOnAdvanceDemo {

    static class MyPhaser extends Phaser {
        String threadName;

        public void setOnAdvanceThreadName(String threadName) {
            this.threadName = threadName;
        }

        protected boolean onAdvance(int phase, int parties) {
            assert threadName.equals(Thread.currentThread().getName());
            return true;
        }
    }

    public static void main(String[] args) throws Exception {

        final MyPhaser phaser = new MyPhaser();

        assert 0 == phaser.getPhase();
        assert 0 == phaser.getRegisteredParties();
        assert 0 == phaser.getUnarrivedParties();

        final int parties = 2;

        phaser.bulkRegister(parties); // register 2 threads - main's and one more

        assert 0 == phaser.getPhase();
        assert parties == phaser.getRegisteredParties();
        assert parties == phaser.getUnarrivedParties();

        phaser.arrive(); // main thread arrives

        assert 0 == phaser.getPhase();
        assert parties == phaser.getRegisteredParties();
        assert 1 == phaser.getUnarrivedParties();

        Thread t = new Thread() {
            public void run() {
                phaser.arrive(); // this (sub)thread arrives
            }
        };
        phaser.setOnAdvanceThreadName(t.getName());
        t.start();

        t.join(); // wait till t dies

        assert phaser.isTerminated(); // onAdvance returned true, and hence phaser is terminated
        assert 0 &gt; phaser.getPhase(); // phaser is terminated, and hence getPhase() returns negative number
        assert parties == phaser.getRegisteredParties();
        assert 0 == phaser.getUnarrivedParties();
    }

}&lt;/pre&gt;Zanim uruchomisz powyższą klasę, zastanów się, jaka może być odpowiedź. Zmiana kolejności uruchomienia &lt;i&gt;phaser.arrive()&lt;/i&gt; ułatwia znalezienie odpowiedzi. Wystarczy przenieść linię 36 z &lt;i&gt;phaser.arrive()&lt;/i&gt; dla głównego wątku, po &lt;i&gt;t.join()&lt;/i&gt; w linii 50. Potrafisz wytłumaczyć dlaczego? Chętnie odpowiem na wyraźną prośbę (jej brak będzie oznaką znajomości odpowiedzi). Dla mnie to teraz taaaaakie oczywiste, ale trzeba było widzieć moją minę na prezentacji! :)&lt;br /&gt;
&lt;br /&gt;
p.s. W nadchodzący &lt;b&gt;piątek&lt;/b&gt;, &lt;b&gt;9 grudnia&lt;/b&gt;, występuję w roli prelegenta na konferencji &lt;a href="http://cracow.mobi"&gt;Cracow.mobi&lt;/a&gt; z tematem &lt;a href="http://cracow.mobi/schedule"&gt;RESTful Android&lt;/a&gt;. Będzie to moje pierwsze, androidowe wystąpienie, a 45 minut na prezentację uważam jedynie za możliwość nakreślenia tematu i jestem zmuszony do potraktowania go wyłącznie slajdami. Sugestie odnośnie sposobu i zawartości prezentacji tematu mile widziane.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-2553056197262964159?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/Si_hMz9cY24" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/2553056197262964159/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2011/12/juconcurrentphaser-i-watek-onadvance-w.html#comment-form" title="Komentarze (9)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2553056197262964159?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2553056197262964159?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2011/12/juconcurrentphaser-i-watek-onadvance-w.html" title="j.u.concurrent.Phaser i wątek onAdvance w Java 7" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-8HU3pHc8J0I/Tt07g53X3zI/AAAAAAAADJA/S7HBEru5gDw/s72-c/java7-phaser-eclipse-ea-enabled.png" height="72" width="72" /><thr:total>9</thr:total></entry><entry gd:etag="W/&quot;A0EDSHk8fSp7ImA9WhRRGEs.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-8342559192845708522</id><published>2011-12-02T23:30:00.000+01:00</published><updated>2011-12-03T00:47:59.775+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-03T00:47:59.775+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java7" /><title>O register() i bulkRegister(int) z j.u.concurrent.Phaser w Java 7</title><content type="html">Przeglądając źródła &lt;a href="http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/jsr166y/Phaser.java?view=markup"&gt;j.u.concurrent.Phaser&lt;/a&gt; trafiłem na ciekawostkę, która z początku zaskoczyła mnie, ale kiedy się nad tym chwilę zastanowiłem, byłem nie mniej zdumiony swoim zdumieniem.&lt;br /&gt;
&lt;br /&gt;
Phaser oferuje dwie metody do zarejestrowania uczestników faz - &lt;a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Phaser.html#register%28%29"&gt;public int register()&lt;/a&gt; oraz &lt;a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Phaser.html#bulkRegister%28int%29"&gt;public int bulkRegister(int parties)&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Trudno zrozumieć, dlaczego dopiero przegląd kodu źródłowego Phaser uzmysłowiło mi, że pierwsza metoda - &lt;i&gt;public int register()&lt;/i&gt; - jest specjalnym przypadkiem drugiej - &lt;i&gt;public int bulkRegister(int parties)&lt;/i&gt;, dla której &lt;i&gt;parties = 1&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Mam wrażenie, że wynikało to z mojego błędnego zrozumienia działania tych metod, w którym sądziłem, że rejestracja jest w jakiś sposób związana z konkretnym wątkiem. Pamiętam, jak próbowałem przekazać to błędne rozumienie uczestnikom ostatniego spotkania &lt;a href="http://www.warszawa.jug.pl"&gt;Warszawa JUG&lt;/a&gt; i tylko ich czujność doprowadziła do mojego &lt;i&gt;"Nie jestem pewien, jak to dokładnie działa"&lt;/i&gt;, co w efekcie sprawiło, że zajrzałem do kodu źródłowego i teraz znam prawidłową odpowiedź (!)&lt;br /&gt;
&lt;br /&gt;
A wystarczyło czytać &lt;a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Phaser.html"&gt;javadoc dla Phaser&lt;/a&gt; ze zrozumieniem, w którym napisano:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;"As is the case with most basic synchronization constructs, registration and deregistration affect only internal counts; they do not establish any further internal bookkeeping, so tasks cannot query whether they are registered. (However, you can introduce such bookkeeping by subclassing this class.)"&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Proste? Teraz tak!&lt;br /&gt;
&lt;br /&gt;
Poniższy przykład powinien pomóc zrozumieć problem bardziej. Od teraz już nie pomylę się i kolejna odsłona moich prezentacyjnych wyczynów wokół java.util.concurrent powinna nosić znamiona bardziej profesjonalnej :)&lt;br /&gt;
&lt;pre  class="brush: java; gutter: true"&gt;package pl.japila.java7.concurrent.phaser;

import java.util.concurrent.Phaser;

public class Phaser2Demo {

    public static void main(String[] args) throws Exception {
        final Phaser phaser = new Phaser();

        int parties = 3;
        for (int i = 0; i &lt; parties; i++) {
            phaser.register();
        }

        assert 0 == phaser.getPhase();
        assert 3 == phaser.getRegisteredParties();
        assert 3 == phaser.getUnarrivedParties();

        Thread t;

        (t = new Thread() {
            public void run() {
                phaser.arrive(); // arrive and move on
            }
        }).start();

        t.join(); // awaits thread t's death

        assert 0 == phaser.getPhase();
        assert 3 == phaser.getRegisteredParties();
        assert 2 == phaser.getUnarrivedParties();

        (t = new Thread() {
            public void run() {
                phaser.arrive(); // arrive and move on
                phaser.arrive(); // arrive and move on
            }
        }).start();

        t.join(); // awaits thread t's death

        assert 1 == phaser.getPhase();
        assert 3 == phaser.getRegisteredParties();
        assert 3 == phaser.getUnarrivedParties();
    }

}&lt;/pre&gt;
Coś niejasne? Wyjaśnić? Służę pomocą. Czym więcej pytań, tym więcej rozpoznania i tym lepsze moje zrozumienie tematu (oby i Twoje).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-8342559192845708522?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/X1lliqRRSM0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/8342559192845708522/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2011/12/o-register-i-bulkregisterint-z.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/8342559192845708522?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/8342559192845708522?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2011/12/o-register-i-bulkregisterint-z.html" title="O register() i bulkRegister(int) z j.u.concurrent.Phaser w Java 7" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0ICRng-fSp7ImA9WhRRF0o.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-5737185833718098087</id><published>2011-12-01T23:26:00.001+01:00</published><updated>2011-12-01T23:46:07.655+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-01T23:46:07.655+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java7" /><title>Zagadka z Rethrowing Exceptions with More Inclusive Type Checking w Java 7</title><content type="html">Czytając bardzo krótki, acz treściwy wpis &lt;a href="http://stuartmarks.wordpress.com/2011/07/21/a-new-java-exception-handling-idiom/"&gt;A New Java Exception Handling Idiom&lt;/a&gt; o nowej cesze &lt;b&gt;Java 7&lt;/b&gt; - &lt;a href="http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html#rethrow"&gt;Rethrowing Exceptions with More Inclusive Type Checking&lt;/a&gt; pomyślałem o pewnej zagadce, której próba rozwiązania wymusi choćby minimalne zrozumienie zmian wokół obsługi wyjątków w najnowszym wydaniu Javy 7. Takie perełki sprawiają, że określenie zmian jako niewielkich w tym wydaniu jest czymś, z czym mam kłopot, aby się zgodzić.&lt;br /&gt;
&lt;br /&gt;
Zagadka:&lt;br /&gt;
&lt;pre  class="brush: java; gutter: true"&gt;package pl.japila.java7;

public class PreciseRethrowDemo {

    public static void main(String[] args) throws Exception {
        PreciseRethrowDemo demo = new PreciseRethrowDemo();
        demo.createFoo();
    }

    Foo createFoo() throws FooException {
        Bar bar = new Bar();
        try {
            return new Foo(bar);
        } catch (Throwable t) {
            t = new SubFooException();
            bar.cleanup();
            throw t;
        }
    }

    @SuppressWarnings("serial")
    static class FooException extends Exception {}
    @SuppressWarnings("serial")
    static class SubFooException extends FooException {}
    static class Foo {
        Foo(Bar bar) throws FooException {
            throw new FooException();
        };
    }
    static class Bar {
        void cleanup() {};
    }

}&lt;/pre&gt;Czy powyższe skompiluje się? Jeśli tak, jaki będzie rezultat? Odpowiedzi można umieszczać w komentarzach. Proszę o kolejne zagadki, jeśli spotkałeś/-aś się z podobnymi w obszarze obsługi wyjątków w Java 7.&lt;br /&gt;
&lt;br /&gt;
p.s. Za kilka dni - &lt;a href="http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=182#2"&gt;17 grudnia 2011&lt;/a&gt; - kończy się możliwość podejścia do testowego egzaminu na &lt;a href="http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=41&amp;p_exam_id=1Z0_803"&gt;Oracle Certified Associate, Java SE 7 Programmer&lt;/a&gt;. System wyliczył mi koszt na poziomie 61 USD i przy niekorzystnym kursie USD/PLN mimo wszystko planuję podejść do niego za 2 tygodnie. A Ty?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-5737185833718098087?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/fFNgX1t0FIc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/5737185833718098087/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2011/12/zagadka-z-rethrowing-exceptions-with.html#comment-form" title="Komentarze (7)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5737185833718098087?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5737185833718098087?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2011/12/zagadka-z-rethrowing-exceptions-with.html" title="Zagadka z Rethrowing Exceptions with More Inclusive Type Checking w Java 7" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><thr:total>7</thr:total></entry><entry gd:etag="W/&quot;CEEMQXY4fCp7ImA9WhRRFk0.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-2884547028392670702</id><published>2011-11-29T21:17:00.001+01:00</published><updated>2011-11-29T22:38:00.834+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-29T22:38:00.834+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="warszawa-jug" /><category scheme="http://www.blogger.com/atom/ns#" term="java7" /><title>85 spotkanie Warszawa JUG o zmianach w Java 7 - Adam z JVM i ja z j.u.c.Phaser</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.warszawa.jug.pl" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="148" width="100" src="http://2.bp.blogspot.com/-Nz0QAHFKiAw/TrHD1D26NDI/AAAAAAAADGw/KK9hUM8aiI4/s400/Warszawajug.png" alt="Warszawska Grupa Użytkowników Technologii Java (Warszawa JUG)" /&gt;&lt;/a&gt;&lt;/div&gt;Zwykłem zapowiadać spotkania &lt;a href="http://www.warszawa.jug.pl/"&gt;Warszawskiej Grupy Użytkowników Javy (Warszawa JUG)&lt;/a&gt;, ale tym razem było inaczej - zapowiedzi nie było, a spotkanie i tak się odbyło. Jedynym źródłem informacji o spotkaniu, w którym &lt;b&gt;Adam Michalik&lt;/b&gt; przedstawił temat "Zmiany JVM w Java 7", a ja wystąpiłem z "java.util.concurrent.Phaser praktycznie", była &lt;a href="http://warszawa.jug.pl"&gt;strona&lt;/a&gt; i &lt;a href="http://groups.google.com/group/warszawa-jug/topics"&gt;forum&lt;/a&gt; grupy. Okazało się, że wystarczyło, aby przyciągnąć blisko 30 osób, wśród których dało się dostrzec osoby, których dawno nie widziałem. To może być dowodem na to, że grupa (ponownie) przeżywa okres rozwoju i ma się całkiem dobrze. Dodając do tego plany spotkaniowe na kolejne 3 edycje i możnaby wyciągać wnioski o jej (ponownym) rozkwicie. Coraz bardziej skłaniam się ku tezie, że bez niej wiele rzeczy nie byłoby mi dane poznać, a tak 2 godziny i mam podsumowanie - chociażby dzisiaj o Java 7 i invokedynamic.&lt;br /&gt;
&lt;br /&gt;
Chciałbym wierzyć, że moja, dzisiejsza prezentacja była równie dobra merytorycznie i prezentacyjnie jak Adama, który stał się moim wzorem do naśladowania. Znalazłem w jego prezentacji kilka ciekawych elementów, które zamierzam wprowadzić do własnych, publicznych wystąpień. Przede wszystkim slajdy, które zawierały dużą dawkę rysunków. To już nie pierwszy raz, kiedy dostrzegam siłę wyrazu obrazków, rysunków, diagramów, itp. Wszystko, co nie jest tekstem warto rozważyć jako element uzupełniający i uatrakcyjniający prezentację. Dobrym rozwiązaniem byłą agenda w postaci diagramu. I ten stoicki spokój w głosie. Jest z czego, a raczej od kogo, czerpać pomysły. Dzięki Adam!&lt;br /&gt;
&lt;br /&gt;
Gdyby ktoś jeszcze zechciał wyjawić, jak JRuby wykorzystuje invokedynamic, o którym Adam wspomniał, że pojawia się z generowaniem klas, aby było szybciej, byłoby jeszcze cudniej. Albo lepiej - niech to przedstawi na naszym spotkaniu. Dla przyjezdnych mogę zorganizować fundusze związane z przyjazdem.&lt;br /&gt;
&lt;br /&gt;
Około 7 wszedłem na scenę z przedstawieniem &lt;a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Phaser.html"&gt;java.util.concurrent.Phaser&lt;/a&gt; z Java 7. Sądziłem, że od ostatniego razu temat jest już mi bliżej znany na tyle wystarczająco, aby nikt mi nie "podskoczył", ale czy to styl, w którym przedstawiałem podstawy, którym łatwo dotarłem do publiczności, czy to błyskotliwość zebranych, ale nie trwało długo, kiedy moja pewność została mocno nadszarpnięta. W przyjemnej atmosferze padło kilka pytań uzupełniających, które położyły się cieniem na kilka wcześniejszych, moich stwierdzeń o Phaser. Bardzo podobała mi się ta dociekliwość uczestników, którzy jedynie w niewielkim stopniu używali java.util.concurrent - klasy Executor i współbieżne struktury. Zdziwiłem się, że nikt nie korzystał z CountDownLatch czy CyclicBarrier. Zabrakło mi mojego "mentora" z poprzedniego spotkania, który podjął się trudu nakreślenia różnic między CountDownLatch, CyclicBarrier i Phaser, kiedy dało się zauważyć moje braki. Takich ludzi cenię najbardziej. Chciałoby się mieć do nich dostęp częściej.&lt;br /&gt;
&lt;br /&gt;
Jako sukces dzisiejszego spotkania traktuję rozmowę na temat przyszłych wystąpień z osobami, których parkiet WJUGa jeszcze nie gościł. Pozdrowienia dla Michała i Piotra, których zapisałem sobie jako kandydatów. Od razu wziąłem ich adresy mailowe, aby mi nie "uciekli" :)&lt;br /&gt;
&lt;br /&gt;
Prezentacja z mojego dzisiejszego spotkania dostępna jest jako &lt;a href="http://jaceklaskowski.pl/prezentacje/JacekLaskowski-WJUG-j.u.concurrent.Phaser-2011.11.29.pdf"&gt;JacekLaskowski-WJUG-j.u.concurrent.Phaser-2011.11.29.pdf&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Zachęcam do dzielenia się swoimi doświadczeniami z poznawania czegoś nowego. Nie trzeba być geek'em, aby prezentacja poszła gładko, a częściej była przyczynkiem do dokładniejszego zgłębiania tematu. Czego mogłem dzisiaj doświadczyć. Daleko mi do znawcy tematu java.util.concurrent, a jednak kilku z uczestników dzisiejszego spotkania pozwoliło mi sądzić, że było to dla nich wartościowe. Wystarczy, abym kontynuował temat. Kolejne odsłony tematu współbieżności w Javie 7 już niebawem.&lt;br /&gt;
&lt;br /&gt;
A teraz pora na &lt;b&gt;Androida&lt;/b&gt; i podsumowywanie myśli w temacie mojej prezentacji &lt;b&gt;"RESTful Android - aplikacja androidowa jako klient REST"&lt;/b&gt; podczas &lt;a href="http://cracow.mobi"&gt;cracow.mobi&lt;/a&gt; w Krakowie. Będzie to moje pierwsze wystąpienie w temacie aplikacji mobilnych na Androida i bardzo chciałbym, aby nie było ostatnim. Jeśli jest coś, co wartoby zaprezentować, rozpracować, czy podobnie, napisz mi na priv. Szczególnie ciekawi mnie, czy jako uczestnik wolał(a)byś więcej kodu czy teorii? I ile to znaczy "więcej"? Niech to będzie przymiarka do najlepszej prezentacji o Androidzie, jaką udało Ci się kiedykolwiek zobaczyć! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-2884547028392670702?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/G5CvcmiBpDQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/2884547028392670702/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/85-spotkanie-warszawa-jug-o-zmianach-w.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2884547028392670702?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2884547028392670702?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/85-spotkanie-warszawa-jug-o-zmianach-w.html" title="85 spotkanie Warszawa JUG o zmianach w Java 7 - Adam z JVM i ja z j.u.c.Phaser" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-Nz0QAHFKiAw/TrHD1D26NDI/AAAAAAAADGw/KK9hUM8aiI4/s72-c/Warszawajug.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0EEQXkyfSp7ImA9WhRRFE4.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-5041005904575356218</id><published>2011-11-27T22:20:00.001+01:00</published><updated>2011-11-27T23:06:40.795+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-27T23:06:40.795+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="różne" /><category scheme="http://www.blogger.com/atom/ns#" term="TDD" /><title>Łącząc przyjemności - o TDD i spacerze "nagraniowym" z Maksymem</title><content type="html">Warto czasami przystanąć, zastanowić się i po prostu pomyśleć bez jakichkolwiek zewnętrznych "przeszkadzaczy". Doświadczyłem błogosławieństwa takich chwil niedawno dwukrotnie i nie mogłem uwierzyć, jak niewiele trzeba, aby mieć ich więcej.&lt;br /&gt;
&lt;br /&gt;
Podczas konferencji &lt;b&gt;JDD w Krakowie&lt;/b&gt; (czytaj &lt;a href="http://jlaskowski.blogspot.com/2011/11/wrazenia-pokonferencyjne-zacznijmy-od.html"&gt;Wrażenia pokonferencyjne - zacznijmy od JDD w Krakowie&lt;/a&gt;) miałem przyjemność uczestniczyć w sesji "TDD Coding Dojo" z &lt;b&gt;Krzyśkiem Jelskim&lt;/b&gt; i &lt;b&gt;Marcinem Zajączkowskim&lt;/b&gt;. Kiedy wracałem do domu pociągiem, a może jeszcze wcześniej, w taksówce, zacząłem zastanawiać się nad słowami &lt;b&gt;Jakuba Nabrdalika&lt;/b&gt;, który kiedyś stanowczym tonem stwierdził, że nie da się robić TDD z już gotową aplikacją. Miałem wtedy wrażenie, że Kuba jest tak etycznie upośledzony przez TDD, że jedyną, słuszną drogą dla TDD jest zacząć od testów. Ja jednak bardzo nalegałem na możliwość dopisywania testów do gotowej aplikacji (projekt &lt;a href="http://openejb.apache.org"&gt;Apache OpenEJB&lt;/a&gt;), aby stworzyć siatkę bezpieczeństwa dla późniejszych prac przy zmianie kodu. Nie pomagał nawet mój wrodzony wdzięk. Po prostu, Kuba kończył taki pomysł stanowczym: "To nie będzie TDD" i tyle mi było z nim rozmawiać. Oj, jaki ja byłem na niego zły za takie potraktowanie. Nie żebym czuł jakąś zadrę do niego za to, ale po prostu nie mogłem zrozumieć, dlaczego to nie przejdzie.&lt;br /&gt;
&lt;br /&gt;
I właśnie podczas powrotu do Warszawy, po sesji z Krzyśkiem i Marcinem, olśniło mnie! Wydaje mi się, że zrozumiałem ideę TDD. Wreszcie połączyłem teorię z praktyką i jakkolwiek nie było tego drugiego wiele, to wystarczyło, abym usnął tezę, która wydaje się zgodna z myśleniem Kuby (!) Nie zapomnę tej chwili, kiedy prawie wykrzyknąłem "Eureka!"&lt;br /&gt;
&lt;br /&gt;
TDD stosujemy jako "zapalnik" zmian w aplikacji. Pojawia się test, nie przechodzi (czerwono), piszemy minimalistyczną implementację, taką, aby jedynie pozwoliła przejść testowi (pojawia się zielone), refaktoring i tak w kółko. Kiedy zastanowić się nad kolejnością zmian w aplikacji - najpierw test, później minimalnistyczna implementacja i tak, aż do znudzenia, to łatwo zrozumieć, że aplikacja ma tyle, aby jedynie/aż przeszły testy. Nic więcej. Jeśli jest więcej, to prawdopodobnie możemy liczyć się z miejscami niepokrytymi testami. Całkiem zrozumiałe, jeśli para programistów jest więcej niż początkująca w temacie programowania i TDD w ogólności.&lt;br /&gt;
&lt;br /&gt;
Weźmy teraz działającą aplikację. Skoro działa, to każdy kawałek kodu, który mógłby wyglądać na potencjalny błąd...NIE jest błędem! Na pewno nie jest nim jeszcze. Gdyby już był, to pojawiłaby się poprawka i...po błędzie. I teraz pora na moje olśnienie - wręcz niemożliwym jest pisanie testów, które objęłyby wszystkie możliwe przypadki do przetestowania dla działającej aplikacji. Słyszałem o narzędziach automatyzujących, które prześwietlając kod wykrywają "zakręty" na if'ach i temu podobnych konstrukcji "rozgałęziających", ale, właśnie, to są automaty. Gdyby pisać je ręcznie, to nigdy nie wiadomo, czy jest ich wystarczająco wiele, aby powiedzieć, że jest ich wystarczająco wiele. Właśnie to odwrócenie zależności między testami a aplikacją jest problemem. Nie można mówić o odwróceniu zależności w przypadku TDD, gdzie zależnością aplikacji są testy. A może na odwrót? Tak czy inaczej, jeśli zakładamy, że dla testu sprawdzającego, czy zwrócono liczbę 5 piszemy kod, który po prostu zwraca 5, to nie ma szansy na pomyłkę. Kod może być dalej pod kątem zaawansowania funkcjonalnego, ale należałoby to odznaczyć jako...nadgorliwość. Oczekujemy 5, to nie ma potrzeby wywoływać usługi RESTowej, która zwraca 5, bo wystarczy zwrócić 5. Proste i oczywiste.&lt;br /&gt;
&lt;br /&gt;
Czy moje zrozumienie TDD jest właściwe? Czy takiego myślenia oczekuje się od praktyków TDD? Chętnie poznam Twoją opinię. W komentarzach jest duuuużo miejsca na dywagacje.&lt;br /&gt;
&lt;br /&gt;
Kolejnym momentem, w którym doświadczyłem momentu olśnienia był dzisiejszy spacer z Maksymem. Kolejny samotny spacer przez 1,5-2h to nie przelewki. Łazisz po utartych ścieżkach Lasu Kabackiego i tak idziesz, i idziesz, i idziesz. Można kota dostać.&lt;br /&gt;
&lt;br /&gt;
Z drugiej strony, kilka dni temu odznaczyłem sobie kilka nagrań z konferencji do odsłuchania i wcale mi się nie uśmiechało odsłuchiwanie ich podczas siedzenia w domu. Każdorazowo, kiedy próbowałem usiąść nad nimi w domu, zawsze pojawiało się zniecierpliwienie i w ogóle ogólna niechęć do ślęczenia przed kompem i gapienia się w monitor z założonymi rękoma. Nuda. Nosiło mnie moje wewnętrzne ADHD. 30 minut jeszcze dam radę słuchać, ale więcej?! Nie ma mowy! No i jeszcze mógłbym nie usłyszeć Maksyma, kiedy się obudzi i daje znać o tym wszem i wobec!&lt;br /&gt;
&lt;br /&gt;
I tak dzisiaj przypomniałem sobie o tych nagraniach i idąc Lasem Kabackim włączyłem &lt;a href="http://www.infoq.com/presentations/Language-Panel"&gt;Language Panel&lt;/a&gt; o językach programowania. Byłem ciekaw, co też tam Ci myśliciele mówią o językach. Skoro i tak miałem ponad godzinę czasu na spacer, to przecież mogłem go spędzić łącząć przyjemne z pożytecznym.&lt;br /&gt;
&lt;br /&gt;
I tak ze słuchawkami na uszach (głos) i smartfonem w nogach Maksyma (wizja) zeszło mi przyjemnie 40 minut. Las gwarantował spokój, brak zewnętrznych przeszkadzaczy i wiatru, który szalejąc na osiedlu tutaj zanikł kompletnie. Przyjemna sprawa.&lt;br /&gt;
&lt;br /&gt;
Początkowo planowałem godzinny spacer, ale kiedy minęło mi 40 minut, stwierdziłem, że pozwolę sobie na dłuższy spacer i...ponad godzinne nagranie &lt;a href="http://www.infoq.com/presentations/Clojure-and-the-Web"&gt;Clojure and the Web&lt;/a&gt;. Nie polecam tego nagrania, ale dla napaleńców może być ciekawym podsumowaniem zalet Clojure (przez pierwsze 20 minut) oraz przegląd szkieletów webowych w Clojure z praktycznym przeglądem Ring w drugiej części.&lt;br /&gt;
&lt;br /&gt;
Po 2,5 godzinach wróciłem do domu wyjątkowo zadowolony (!) Maksym przez całą drogę spał smacznie, ja przejrzałem 2 nagrania, co dało nam obu sporą dawkę świeżego (?) powietrza, a reszta rodzinki odetchnęła na jakiś czas od Maksyma. Już nie mogę doczekać się kolejnego spaceru! Co proponujecie do obejrzenia? Może coś w tematyce TDD? Zastanawiam się, czy pomysł odsłuchiwania na mrozie wypali. Ale w końcu i w Norwegii używają Galaxy S2, a tam ciągle zimno.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-5041005904575356218?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/M5Wjn2tQrKE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/5041005904575356218/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/aczac-przyjemnosci-o-tdd-i-spacerze.html#comment-form" title="Komentarze (2)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5041005904575356218?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5041005904575356218?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/aczac-przyjemnosci-o-tdd-i-spacerze.html" title="Łącząc przyjemności - o TDD i spacerze &quot;nagraniowym&quot; z Maksymem" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DU4GRn89eCp7ImA9WhRREkg.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-8113179404685838767</id><published>2011-11-25T22:30:00.001+01:00</published><updated>2011-11-25T22:52:07.160+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-25T22:52:07.160+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="konferencje" /><title>Wrażenia pokonferencyjne - zacznijmy od JDD w Krakowie</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.11.jdd.org.pl" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="43" width="120" src="http://3.bp.blogspot.com/-m3a9blgW0qc/TsVx-LlTOoI/AAAAAAAADIk/fBmQgGi2clE/s400/jdd-logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;Właśnie mija tydzień, w którym miałem przyjemność uczestniczyć w dwóch konferencjach - &lt;a href="http://www.11.jdd.org.pl"&gt;JDD w Krakowie&lt;/a&gt;, w dniach 21-22.11 oraz &lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_November_2011/Poznan"&gt;Eclipse DemoCamp w Poznaniu&lt;/a&gt; późnym wieczorem 24.11, żeby nie napisać w nocy.&lt;br /&gt;
&lt;br /&gt;
Obie pozwoliły mi zorientować się w znaczeniu budowania społeczności i konieczności dzielenia się wiedzą. Obawiam się jednak, że to podsumowanie w minimalny tylko sposób będzie odzwierciedleniem moich wrażeń, ochów i echów dla formuły i osób w nich uczestniczących. Klimat obu był wspaniały, aczkolwiek jeden niepodobny do drugiej.&lt;br /&gt;
&lt;br /&gt;
Zacznijmy od JDD 2011...&lt;br /&gt;
&lt;br /&gt;
Do Krakowa zajechałem około 11:00 w poniedziałek. Na hotelu, gdzie odbywała się konferencja, rozwieszono banery konferencyjne (ważna rzecz i do wdrożenia przy kolejnych konferencjach). Wpadłem na &lt;b&gt;Krzyśka Jelskiego&lt;/b&gt;, z którym zamieniłem więcej niż trochę słów, aby po kilku kwadransach spotkać &lt;b&gt;Grześka Dudę&lt;/b&gt; i &lt;b&gt;Andrzeja Targosza&lt;/b&gt;. Później przygotowania do panelu dyskusyjnego ze &lt;b&gt;Sławkiem Sobótką&lt;/b&gt;, &lt;b&gt;Andrzejem Grzesikiem&lt;/b&gt; i świeżo poznanym &lt;b&gt;Piotrkiem Buckim&lt;/b&gt;. Ach, zapomniałbym o &lt;b&gt;Ani Kołodziejczyk&lt;/b&gt;. Wybacz Aniu. Na początku rozmowa szła niemrawo, aby, po chwili, przygotowania do panelu przerodziły się w aktywną dyskusję, w której z łatwością można było wskazywać strony, które zajmują rozmówcy. W pewnym momencie wręcz wszyscy "usiedli" na Piotrze. Myliłby się ten, kto pomyślałby, że ciężko jemu było - wyglądało wręcz, jakby większa liczba oponentów tylko go podsycała do dyskusji.&lt;br /&gt;
&lt;br /&gt;
Panel przebiegł...rozmownie. Trochę zabawnie, trochę niemrawo, ale na pewno tłumnie. Sala wypełniona była po brzegi. Czasami dało się odczuć pewne zakłopotanie brakiem aktywności po stronie uczestników, ale zasługą moderatora - Andrzeja Targosza - towarzystwo się rozgrzało i kiedy panel dobiegał końca bez trudu można było zauważyć większe niż przeciętne zaangażowanie wszystkich w dyskusję. Uważam, że ułatwieniem przy pokonywaniu barier publicznego przemawiania było wprowadzenie metody na przedstawienie się, aby w odpowiedzi usłyszeć przedstawienie się rozmówcy i czasami gromki śmiech sali - coś w deseń: &lt;i&gt;"Jak się nazywasz?"&lt;/i&gt;, na co rozmówca odpowiadał swoim imieniem, np. &lt;i&gt;"Cześć, jestem Maksym"&lt;/i&gt;, aby po chwili usłyszeć w odpowiedzi &lt;i&gt;"Cześć Maksym, jestem Jacek"&lt;/i&gt;, co on kwitował &lt;i&gt;"Cześć Jacek!"&lt;/i&gt; Coś w ten deseń. Uważam, że te wprowadzające gierki słowne znacząco rozluźniały atmosferę i pomagały rozmówcom. Wiele osób później wyraziły swój zachyt połączony ze zdumieniem, że zorganizowano panel i że interesują nas potrzeby uczestników odnośnie kolejnych edycji konferencji w Polsce. W międzyczasie padało kilka pytań, na które publika proszona była odpowiadać podniesieniem ręki w górę i co najbardziej utkwiło mi w pamięci, to moment, kiedy na pytanie o powód uczestniczenia w konferencji, kiedy padło "Czy poznanie nowego było powodem udziału?" wszyscy, jak jeden mąż, podnieśli do góry rękę. Na naszych twarzach musiało wymalować się ogromne zdziwienie reakcją publiczności. Wcześniejsze pytania kończyły się zwykle kilkoma rękoma w górze, a tu pytanie i...zrobiło się tłoczno w górze. Niezwykłe doświadczenie móc to zobaczyć.&lt;br /&gt;
&lt;br /&gt;
Później obiad, który przeciągnął się przez cały następny wykład, który przegadałem z dopiero co poznanymi osobami.&lt;br /&gt;
&lt;br /&gt;
Na wykład &lt;b&gt;Erika Jan de Wit'a&lt;/b&gt; "Scrum – następca modelu kaskadowego" wszedłem z lekkim spóźnieniem. Podobały mi się slajdy, które zwracały uwagę swoją skromnością, a w połączeniu z ostrym światłem projektora, przykuwały oko wyrazistością i dużym kontrastem bieli z odpowiednio dobranym czerwonym (gość pracuje w Canoo, co powinno tłumaczyć dobór kolorów). Muszę wdrożyć ten szablon u siebie w jakieś formie. Dowiedziałem się, że Scrum jest &lt;i&gt;"quick response to change"&lt;/i&gt; (co zwykle jednak wiązałem z Kanbanem, o którym za moment, ale teraz sądzę, że to domena każdej z praktyk wytwarzania oprogramowania). Prelegent nie musiał zachęcać do dyskusji i było jej znacznie więcej niż przewidywał. Często wyczuć można było pewne zagubienie we własnych slajdach. 30 minut byłoby jednak bardziej właściwym czasem na to wystąpienie, bo ostatni kwadrans przesiedziałem jak na szpilkach nie mogąc doczekać się końca. Zbyt monotonne i wyłącznie tekstowe prezentacje nie spełniają moich oczekiwań i szybko tracę skupienie.&lt;br /&gt;
&lt;br /&gt;
Kolejny wykład to prezentacyjna porażka. Miałem dosyć po Eriku tego siedzenia i słuchania o Scrumie, kiedy to &lt;b&gt;Paweł Brodziński&lt;/b&gt; rozpoczął "Scrum, Kanban i inne opowieści". Pierwsze 15 minut - nic do zarzucenia. Czytam regularnie wpisy Pawła &lt;a href="http://blog.brodzinski.com/"&gt;na jego blogu&lt;/a&gt;, więc te 15 minut wynikają z dużej dozy zaufania, że cokolwiek nie powie, prezentacja musi być dobra. I w zasadzie była, ale sposób mówienia po angielsku był dobijający. Spokojny ton, prawie senny, z perfekcyjnie dobieranymi i wymawianymi słowami sprawiały, że ledwo dawałem radę utrzymać się na krześle. Paweł dobrze wpasowywał się w kolejne slajdy tak, że nie widać było, czy tak dobrze je zna, czy zerka na nie ukratkiem nie dając tego po sobie poznać. Jako prezenter znający tematykę i przygotowane materiały Paweł dostaje najwyższe noty. Jednak ton przekazania i to chodzenie w kółko - kompletne fiasko. Zbyt wiele gadania, za mało zachęt do angażowania publiki w dyskusję i to oddzielanie każdego słowa. Ledwo wytrwałem do końca. Ucieszyłem się, kiedy padło &lt;i&gt;"Thanks!"&lt;/i&gt; Ja jemu też very &lt;i&gt;"Thanks!"&lt;/i&gt; i klaskałem bodaj najgłośniej (w końcu koniec!)&lt;br /&gt;
&lt;br /&gt;
Za cel podczas przerw wziąłem sobie poznawanie uczestników. Próbowałem minimalizować rozmowy w grupie, którą znam, aby móc pogadać z nieznajomymi. Tak dowiedziałem się o oczekiwaniach uczestników do wystąpienia &lt;b&gt;Moniki Koniecznej&lt;/b&gt;. Kogokolwiek nie zapytałem, wszyscy wskazywali na jej wykład jako kolejny, w który po prostu nie można nie być. Okazało się później, że myliłem Monikę z &lt;a href="http://2011.geecon.org/speakerdetails/14"&gt;Patrycją Węgrzynowicz&lt;/a&gt; i &lt;a href="http://2010.geecon.org/speakerdetails/11"&gt;Holly Cummins&lt;/a&gt;. I dobrze, że mnie poprawiono. Jak później z nią rozmawiałem, dowiedziałem się, że nosiła dredy, więc faktycznie mogłem ją pomylić z Holly bez problemu. W ten sposób zrezygnowałem z &lt;b&gt;Andrew Rubingera&lt;/b&gt; "Testowanie w środowisku Java Enterprise". Duża interakcja z publiką, gry i zabawy, slajdy w postaci zdjęć z niewielką dawką tekstu sprawiły, że wciągnąłem się. Jednak i tu straciłem cierpliwość, bo ostatnie 15 minut patrzyłem na zegarek, kiedy to lekki merytorycznie temat zaczął mnie nużyć. Monika, co przyznała później w rozmowie, wytraciła poczucie czasu i ostatni kwadrans był bolesną walką z czasem.&lt;br /&gt;
&lt;br /&gt;
Na prezentację &lt;b&gt;Venkata Subramaniama&lt;/b&gt; znowu nie dotarłem, bo kolidowała z innymi, ciekawymi (?) wykładami. Z perspektywy żałuję, ale i tak nie odmówiłem sobie zamienić z nim kilku słów na temat prezentacji. Planowałem wręcz zagadnąć go podczas przerw, na co zgodził się z pewnym zachwytem, ale nie dane mi było. Postanowiłem jednak, że po tylu zachwytach publiczności jego wystąpieniami, kolejnym razem obowiązkowo muszę wziąć udział w jednym. Podobnie ze Sławkiem Sobótką. Wszyscy jacyś nawiedzeni z Venkatem i Sławkiem?! Jakieś ogólne pranie mózgu?! Gdzie, kogo by nie zapytać, bez wahania wskazują na ich wystąpienia jako takie, których nie można nie odwiedzić. A ja właśnie pchnąłem się ku temu występkowi. Jakaś mania uwielbienia dla Sławka i Venkata?! Oszaleli, czy co?!&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-OkLHHf3_F3c/Ts9YUX3jr6I/AAAAAAAAILc/70kwY4e188M/s800/JDD11_BB_123.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="532" width="800" src="https://lh4.googleusercontent.com/-OkLHHf3_F3c/Ts9YUX3jr6I/AAAAAAAAILc/70kwY4e188M/s800/JDD11_BB_123.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Wieczorem, wspólnie z &lt;b&gt;Jackiem Lisem&lt;/b&gt; i &lt;b&gt;Tomkiem&lt;/b&gt; zjedliśmy pizzę, aby na 21:00 trafić do klubu na Kazimierzu, w którym odbywała się impreza konferencyjna. Miejsce ciekawe, ale zdecydowanie odradzałbym tam organizowanie pogadanek. Za głośno. Podczas panelu dyskusyjnego padła propozycja, aby omawiać pewne tematy z większą uwagą - ciągła integracja, Scala, NoSQL i środowiska automatycznego budowania. Tematy zostały przypisane do miejsc w klubie i kiedy zobaczyłem salę VIP Room z napisem "Scala", nie miałem złudzeń, które drzwi otworzyć. Niestety, rozmów tam o Scali jak na lekarstwo i jedynym połączeniem między miejscem a Scalą była...nazwa miejsca. Pokój przypominał miejsce schadzek - czerwony, z niedużą leżanką-tapczanem, stacjami z plejakami i dużym telewizorem. Ludzie grali, rozmawiali i widać było, że można było w tym miejscu faktycznie składnie porozmawiać - muzyka nie była tak uciążliwa, jak w innych częściach klubu. Tam przegadałem cały wieczór, aby o północy zwinąć się do hotelu. Pozdrowienia dla studenta z Wrocławia oraz programistek od EJB 2.1 i JBoss 5 z TeleU :-) Bardzo ciekawa rozmowa!&lt;br /&gt;
&lt;br /&gt;
Drugi dzień to "TDD Coding Dojo" z &lt;b&gt;Krzyśkiem Jelskim&lt;/b&gt; i &lt;b&gt;Marcinem Zajączkowskim&lt;/b&gt;. Dzień wcześniej rozmawiałem z Krzyśkiem, jak będzie przebiegało Dojo i kiedy dowiedziałem się o publicznym programowaniu trochę mnie zmroziło. Przekonanie, że nie jestem gotów do publicznych prezentacji programowania na żywo, jakoś znacząco zaczęło wpływać na moją decyzję, ale ciekawość wzięła górę. Mimo wszystko nie mogłem doczekać się, aby doświadczyć tego na własnej skórze. Niezwykle żywe programowanie w tłumie, gdzie dwie osoby siedząc przed kompem programowało minesweeper'a przy akompaniamencie gapiów z sali. Co 7 minut zmiana jednego "parzysty" i tak do południa. Cudo! Obiecuję sobie więcej tego typu wydarzeń z moim udziałem.&lt;br /&gt;
&lt;br /&gt;
Konferencja pierwsza klasa i życzę każdemu tak owocnych wyjazdów. Nagrodą jest możliwość poznania ludzi z branży i zawsze, ale to zawsze, zwiększenie wiedzy w temacie - niechby nawet niekoniecznie javowym, ale wciąż z obszaru wytwarzania oprogramowania.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-8113179404685838767?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/WE4nN4hEZuY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/8113179404685838767/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/wrazenia-pokonferencyjne-zacznijmy-od.html#comment-form" title="Komentarze (3)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/8113179404685838767?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/8113179404685838767?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/wrazenia-pokonferencyjne-zacznijmy-od.html" title="Wrażenia pokonferencyjne - zacznijmy od JDD w Krakowie" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-m3a9blgW0qc/TsVx-LlTOoI/AAAAAAAADIk/fBmQgGi2clE/s72-c/jdd-logo.png" height="72" width="72" /><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;DkQMQ30-cCp7ImA9WhRSFUs.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-4103056255319031500</id><published>2011-11-17T21:22:00.001+01:00</published><updated>2011-11-17T22:13:02.358+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-17T22:13:02.358+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="websphere" /><category scheme="http://www.blogger.com/atom/ns#" term="konferencje" /><category scheme="http://www.blogger.com/atom/ns#" term="osgi" /><title>Przyszły tydzień konferencyjnie - JDD 2011 w Krakowie i Eclipse DemoCamp w Poznaniu</title><content type="html">&lt;b&gt;Maksym&lt;/b&gt; rozwija się znakomicie. Stuknęło mu 6 tygodni i nie tylko, że zaczął przekręcać głowę z lewa na prawo (z przewagą skierowania na lewo), to zaczął się uśmiechać i reaguje na znajome głosy i zachowania (dorosłych, głównie rodziców, którzy wierzą i brną w zaparte, że te milusie słówka są przyjemniejsze dla ucha malca).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-6gHJGZ2TGCQ/TsVw6YkXyvI/AAAAAAAADIY/9cHK7H1VLQg/s1600/maksym-2011-11-15%2B13.31.49.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="346" width="400" src="http://4.bp.blogspot.com/-6gHJGZ2TGCQ/TsVw6YkXyvI/AAAAAAAADIY/9cHK7H1VLQg/s400/maksym-2011-11-15%2B13.31.49.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Maksym uśmiecha się, regularnie ogłasza pobudkę około 6:45 (z przewagą godzin wcześniejszych - akurat na ranne bicie dzwonów o 6:30!) i kiedy się złości bardzo intensywnie rusza nogami - najpierw lewą, aby przy udziale prawej być na prawdę zły. Doskonała zabawa to rozpoznawanie jego zachowań - podobne do rozpoznawania działającego oprogramowania bez dokumentacji :)&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;JDD w Krakowie - 21-22 listopada 2011&lt;/h2&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.11.jdd.org.pl/" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="43" width="120" src="http://3.bp.blogspot.com/-m3a9blgW0qc/TsVx-LlTOoI/AAAAAAAADIk/fBmQgGi2clE/s400/jdd-logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;Poniedziałek i wtorek jestem w Krakowie na konferencji &lt;a href="http://www.11.jdd.org.pl"&gt;JDD 2011&lt;/a&gt;, w której biorę udział jako uczestnik panelu dyskusyjnego &lt;a href="http://www.11.jdd.org.pl/panel-dyskysyjny-welcome-to-the-javaland"&gt;Welcome to Javaland&lt;/a&gt;. Za stroną konferencji:&lt;br /&gt;
&lt;blockquote&gt;&lt;em&gt;"W czasie konferencji JDD odbędzie się panel dyskusyjny, w trakcie którego zaproszeni goście: Jacek Laskowski, Grzesiek Duda, Andrzej Grzesik, Anna Kołodziejczyk i Andrzej Targosz rozmawiać będą na temat historii rozwoju konferencji i społeczności Java w Polsce. Opowiemy o tym jak doszło do zorganizowania pierwszej imprezy, jak się rozwijały kolejne inicjatywy oraz jaka jest przyszłość spotkań Javy w naszym kraju.&lt;br /&gt;
&lt;br /&gt;
Odpowiemy na pytania dlaczego ważne jest organizowanie w Polsce technicznych konferencji, jak to się stało, ze bez wsparcia jednej mocnej firmy udało się doprowadzić do tak dynamicznego rozrostu społeczności Java w Polsce oraz dlaczego istnienie kilku podobnych eventów równolegle ma sens. Wspólnie zastanowimy się co zrobić, aby zwiększyć ilość uczestników zagranicznych w kolejnych konferencjach oraz co wyróżnia nasze imprezy na mapie Europy."&lt;/em&gt;&lt;/blockquote&gt;Trudno mi powiedzieć, czy na miejscu uczestników konferencji cieszyłbym się z takiego "wypełniacza" (szczególnie, że alternatywy nie ma), ale zapytany o udział, od razu się zgodziłem, bo uważam, że wciąż zbyt mało osób udziela się publicznie &lt;i&gt;pro publico bono&lt;/i&gt;. Liczę na aktywny udział uczestników konferencji.&lt;br /&gt;
&lt;br /&gt;
Później już w roli uczestnika konferencji zamierzam wziąć udział w prezentacji &lt;b&gt;Tomasza Kowalczewskiego&lt;/b&gt; z "Domknięcia w Javie", &lt;b&gt;Erika Jan de Wit'a&lt;/b&gt; "Scrum – następca modelu kaskadowego", &lt;b&gt;Pawła Brodzińskiego&lt;/b&gt;, którego wpisy na blogu czytam z zapałem, z "Scrum, Kanban i inne opowieści", aby na koniec usiedzieć przy &lt;b&gt;Andrew Rubinger'ze&lt;/b&gt; z "Testowanie w środowisku Java Enterprise". Jakoś tak wyszło, że wszystkie z prezentacji będą po angielsku, a tematy są po polsku :)&lt;br /&gt;
&lt;br /&gt;
Drugi dzień chciałbym poświęcić na dokształcanie w temacie TDD z udziałem &lt;b&gt;Krzysztofa Jelskiego&lt;/b&gt; i &lt;b&gt;Marcina Zajączkowskiego&lt;/b&gt;, którzy poprowadzą "TDD Coding Dojo".&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Eclipse DemoCamp w Poznaniu - 24 listopada 2011&lt;/h2&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.jug.poznan.pl/2011/11/eclipse-democamp-10-urodziny-eclipse-24-11-2011/" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="400" width="283" src="http://1.bp.blogspot.com/-BYF_cnswLXo/TsV1Lv7PuOI/AAAAAAAADIw/wcX5GrwqioE/s400/eclipse-demo-camp-poster-24.11.2011.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
W czwartek, 24 listopada, pojawię się wieczorem z tematem &lt;b&gt;"Java EE 6 with WebSphere AS 8 and Rational Application Developer 8"&lt;/b&gt; w Poznaniu na Eclipse DemoCamp. Kto jednak chciałby słuchać o Java EE 6, od kiedy stała się wręcz trywialna w użyciu?! Dla wytrwałych będę miał więc niespodziankę w postaci...OSGi Blueprint. Zobaczymy, co WAS8 potrafi uruchomić, a RAD8 stworzyć w tym obszarze. Będzie to dla mnie świetna okazja, aby odświeżyć sobie temat Enterprise OSGi z OSGi Blueprint z Apache Aries w IBM WebSphere Application Server V8.&lt;br /&gt;
&lt;br /&gt;
Zastanawiam się, czy całkowicie zaniechać slajdów na rzecz prezentacji aplikacji, które omówię korzystając z RAD V8 i uruchomię na WAS V8?! Godzina na tego typu cyrki nigdy nie kończy się na godzinie i zostaje tylko niesmak niedopowiedzenia. Przy godzinie uważam, że nie ma co liczyć na wiele, więc pewnie skończy się na slajdach, aby po 45 minutach zachęcić do pytań. Obym nie zapomniał, że moje wystąpienie zaplanowane jest na 9 w nocy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-4103056255319031500?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/vMKnDSvR0M4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/4103056255319031500/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/przyszy-tydzien-konferencyjnie-jdd-2011.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/4103056255319031500?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/4103056255319031500?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/przyszy-tydzien-konferencyjnie-jdd-2011.html" title="Przyszły tydzień konferencyjnie - JDD 2011 w Krakowie i Eclipse DemoCamp w Poznaniu" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-6gHJGZ2TGCQ/TsVw6YkXyvI/AAAAAAAADIY/9cHK7H1VLQg/s72-c/maksym-2011-11-15%2B13.31.49.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CU4MQXwzfCp7ImA9WhRSE0Q.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-7331912997861823345</id><published>2011-11-15T22:14:00.001+01:00</published><updated>2011-11-15T22:53:00.284+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-15T22:53:00.284+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="osgi" /><title>Enterprise OSGi? OSGi Blueprint? To może Karaf z Aries?</title><content type="html">Trzeba mi było dyskusji z &lt;b&gt;Łukaszem Dywickim&lt;/b&gt; (&lt;a href="https://twitter.com/ldywicki"&gt;@ldywicki&lt;/a&gt;) na twitterze, abym zrozumiał, jak niewiele trzeba, aby &lt;b&gt;OSGi&lt;/b&gt; zrzuciło z siebie czar tajemniczości. Całkowicie. Dzięki Łukasz!&lt;br /&gt;
&lt;br /&gt;
Ostatnio, jeśli mówi się o OSGi to raczej w jego wydaniu korporacyjnym, której celem jest połączenie ze standardami spod sztandaru Java EE, tj. &lt;b&gt;Enterprise OSGi&lt;/b&gt;. Pisałem o tym &lt;a href="http://jlaskowski.blogspot.com/search/label/osgi"&gt;niejednokrotnie na blogu&lt;/a&gt;. Niejednokrotnie mówiłem o tym na konferencjach oraz "popełniłem" jeden artykuł w temacie - &lt;a href="http://www.jaceklaskowski.pl/wiki/Enterprise_OSGi_runtime_setup_with_Apache_Aries_Blueprint"&gt;Enterprise OSGi runtime setup with Apache Aries Blueprint&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Teraz jednak okazuje się, że sprawa jest jeszcze bardziej prosta niż mi się poprzednio wydawało. Nie trzeba specjalnych kwalifikacji do zestawienia środowiska Enterprise OSGi. Wystarczy &lt;a href="http://karaf.apache.org/"&gt;Apache Karaf&lt;/a&gt; i sprawa staje się niezwykle trywialna (jeśli założyć, że nauczenie się jego specyficznych poleceń wpasowuje się w to określenie).&lt;br /&gt;
&lt;br /&gt;
Instalacja Karaf sprowadza się do rozpakowania odpowiedniej dystrybucji. Prościzna.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy Karaf poleceniem &lt;i&gt;bin/karaf&lt;/i&gt;. Są inne sposoby i zainteresowanych odsyłam do "producenta".&lt;br /&gt;
&lt;pre  class="brush: bash; gutter: false"&gt;jacek:~/apps/karaf
$ ./bin/karaf 
        __ __                  ____      
       / //_/____ __________ _/ __/      
      / ,&lt;  / __ `/ ___/ __ `/ /_        
     / /| |/ /_/ / /  / /_/ / __/        
    /_/ |_|\__,_/_/   \__,_/_/         

  Apache Karaf (2.2.4)

Hit '&lt;tab&gt;' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '&lt;ctrl-d&gt;' or 'osgi:shutdown' to shutdown Karaf.&lt;/pre&gt;Jak instruuje początkowy ekran, wystarczy skorzystać z tabulacji i/lub polecenia &lt;i&gt;help&lt;/i&gt;, aby dowiedzieć się wiele o poszczególnych poleceniach. Dodatkowo, w większości (wszystkich?) przypadków sama nazwa polecenia powinna wyjaśnić przeznaczenie.&lt;br /&gt;
&lt;br /&gt;
Weźmy chociażby polecenie &lt;i&gt;features:list&lt;/i&gt; (nie zapominamy o tabulacji po pierwszych literach!)&lt;br /&gt;
&lt;pre  class="brush: bash; gutter: false"&gt;karaf@root&gt; features:
features:addurl              features:info                features:install             features:list
features:listrepositories    features:listurl             features:listversions        
features:refreshurl          features:removerepository    features:removeurl           features:uninstall
karaf@root&gt; features:list
features:list                features:listrepositories    features:listurl             features:listversions
karaf@root&gt; features:list
State         Version           Name                          Repository             Description
[uninstalled] [2.2.4          ] karaf-framework               karaf-2.2.4            
[uninstalled] [2.5.6.SEC02    ] spring                        karaf-2.2.4            
[uninstalled] [2.5.6.SEC02    ] spring-web                    karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring                        karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-aspects                karaf-2.2.4            
[uninstalled] [1.2.1          ] spring-dm                     karaf-2.2.4            
[uninstalled] [1.2.1          ] spring-dm-web                 karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-instrument             karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-jdbc                   karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-jms                    karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-struts                 karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-test                   karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-orm                    karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-oxm                    karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-tx                     karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-web                    karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-web-portlet            karaf-2.2.4            
[uninstalled] [2.2.4          ] wrapper                       karaf-2.2.4            
[uninstalled] [2.2.4          ] obr                           karaf-2.2.4            
[installed  ] [2.2.4          ] config                        karaf-2.2.4            
[uninstalled] [7.4.5.v20110725] jetty                         karaf-2.2.4            
[uninstalled] [2.2.4          ] http                          karaf-2.2.4            
[uninstalled] [2.2.4          ] war                           karaf-2.2.4            
[uninstalled] [2.2.4          ] kar                           karaf-2.2.4            
[uninstalled] [2.2.4          ] webconsole-base               karaf-2.2.4            
[uninstalled] [2.2.4          ] webconsole                    karaf-2.2.4            
[installed  ] [2.2.4          ] ssh                           karaf-2.2.4            
[installed  ] [2.2.4          ] management                    karaf-2.2.4            
[uninstalled] [2.2.4          ] eventadmin                    karaf-2.2.4            
[uninstalled] [2.2.4          ] jasypt-encryption             karaf-2.2.4            
[uninstalled] [0.3            ] transaction                   karaf-enterprise-2.2.4 OSGi Transaction Manager
[uninstalled] [0.3            ] jpa                           karaf-enterprise-2.2.4 OSGi Persistence Container
[uninstalled] [0.3            ] jndi                          karaf-enterprise-2.2.4 OSGi Service Registry JNDI access
[uninstalled] [0.3            ] application-without-isolation karaf-enterprise-2.2.4&lt;/pre&gt;Jak rozumiem istotę &lt;i&gt;features&lt;/i&gt; w Karaf to nic innego jak zestawy funkcjonalne - zbiór pakunków, które razem tworzą pewną funkcjonalną całość. Prześwietlmy sam &lt;i&gt;karaf-framework&lt;/i&gt; (ponownie nie zapominamy o tabulacji!)&lt;br /&gt;
&lt;pre  class="brush: bash; gutter: false"&gt;karaf@root&gt; features:
features:addurl              features:info                features:install             features:list
features:listrepositories    features:listurl             features:listversions
features:refreshurl          features:removerepository    features:removeurl           features:uninstall
karaf@root&gt; features:in
features:info       features:install
karaf@root&gt; features:info kar
kar               karaf-framework   
karaf@root&gt; features:info karaf-framework 
Description of karaf-framework 2.2.4 feature
----------------------------------------------------------------
Feature has no configuration
Feature has no configuration files
Feature has no dependencies.
Feature contains followed bundles:
  mvn:org.ops4j.pax.url/pax-url-mvn/1.2.8
  mvn:org.ops4j.pax.url/pax-url-wrap/1.2.8
  mvn:org.ops4j.pax.logging/pax-logging-api/1.6.3
  mvn:org.ops4j.pax.logging/pax-logging-service/1.6.3
  mvn:org.apache.felix/org.apache.felix.configadmin/1.2.8
  mvn:org.apache.felix/org.apache.felix.fileinstall/3.1.10
  mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.asm/3.3_2
  mvn:org.apache.aries/org.apache.aries.util/0.3
  mvn:org.apache.aries.proxy/org.apache.aries.proxy/0.3
  mvn:org.apache.aries.blueprint/org.apache.aries.blueprint/0.3.1
  mvn:org.apache.karaf.shell/org.apache.karaf.shell.console/2.2.4
  mvn:org.apache.karaf.shell/org.apache.karaf.shell.osgi/2.2.4
  mvn:org.apache.karaf.shell/org.apache.karaf.shell.log/2.2.4
  mvn:org.apache.karaf.shell/org.apache.karaf.shell.packages/2.2.4
  mvn:org.apache.karaf.shell/org.apache.karaf.shell.commands/2.2.4
  mvn:org.apache.karaf.shell/org.apache.karaf.shell.dev/2.2.4
  mvn:org.apache.karaf.jaas/org.apache.karaf.jaas.config/2.2.4
  mvn:org.apache.karaf.jaas/org.apache.karaf.jaas.modules/2.2.4
  mvn:org.apache.karaf.jaas/org.apache.karaf.jaas.command/2.2.4
  mvn:org.apache.karaf.features/org.apache.karaf.features.core/2.2.4
  mvn:org.apache.karaf.features/org.apache.karaf.features.command/2.2.4
  mvn:org.apache.karaf.features/org.apache.karaf.features.management/2.2.4
  mvn:org.apache.karaf.management/org.apache.karaf.management.server/2.2.4
  mvn:org.apache.aries.jmx/org.apache.aries.jmx/0.3
  mvn:org.apache.aries.jmx/org.apache.aries.jmx.blueprint/0.3&lt;/pre&gt;I od razu wiadomo z czego składa się taka kompletna funkcjonalnie całość. Bystre oko dostrzeże tam &lt;b&gt;Apache Aries Blueprint&lt;/b&gt; (&lt;i&gt;mvn:org.apache.aries.blueprint/org.apache.aries.blueprint/0.3.1&lt;/i&gt;).&lt;br /&gt;
&lt;br /&gt;
Nie pozostaje nic innego jak sprawdzić działanie Aries Blueprint z przykładowym projektem z...Aries Blueprint. Korzystamy z pomocy Karaf, aby zainstalować pakunek z repozytorium mavenowego - wystarczy skorzystać z polecenia install i odpowiedniego adresu z mvn na przodzie.&lt;br /&gt;
&lt;pre  class="brush: bash; gutter: false"&gt;karaf@root&gt; install -s mvn:org.apache.aries.blueprint/org.apache.aries.blueprint.sample/0.3.1
Bundle start
Bundle ID: 49
karaf@root&gt; ======== Initializing Foo =========
Service registration notification: 5 -1 707063160: Hello FooBar
org.apache.felix.framework.BundleContextImpl@5e6276e5 [a list element, 5] PLN
Fri Apr 17 00:00:00 CEST 2009 {osgi.service.blueprint.compname=foo, key=value}&lt;/pre&gt;Działa! I nie trzeba było wiele. Wystarczy Karaf. Spróbuj sam, a przekonasz się, że "zaawansowane" nie musi oznaczać "niedostępne".&lt;br /&gt;
&lt;br /&gt;
Teraz skoro środowisko jest już zestawione, nie ma już wymówek na brak wiedzy do poznania Enterprise OSGi z kontenerem OSGi Blueprint w roli głównej. Jeśli Spring Framework daje Ci wiele radości, to w połączeniu z OSGi może być jej jeszcze więcej.&lt;br /&gt;
&lt;br /&gt;
Czy pracujesz już z Karaf? A może również i Aries albo Spring-DM? Jakie wrażenia? Jest coś ciekawego, co powaliło Cię na kolana? Chętnie wsłuchałbym się w głos praktyka.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-7331912997861823345?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/5vpoFtdzpWg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/7331912997861823345/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/enterprise-osgi-osgi-blueprint-to-moze.html#comment-form" title="Komentarze (6)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/7331912997861823345?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/7331912997861823345?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/enterprise-osgi-osgi-blueprint-to-moze.html" title="Enterprise OSGi? OSGi Blueprint? To może Karaf z Aries?" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><thr:total>6</thr:total></entry><entry gd:etag="W/&quot;D04CQns6eip7ImA9WhRSEU4.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-8223229181336956528</id><published>2011-11-12T22:53:00.001+01:00</published><updated>2011-11-12T23:12:43.512+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-12T23:12:43.512+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java7" /><title>Płynny interfejs java.nio.file.attribute.AclEntry.Builder w Java 7</title><content type="html">Trudno stwierdzić, jak wiele jest tych ciekawostek w &lt;b&gt;Java 7&lt;/b&gt; pod kątem wzorców użytych do rozbudowy API, ale trafiłem dzisiaj na &lt;a href="http://download.oracle.com/javase/7/docs/api/java/nio/file/attribute/AclEntry.Builder.html"&gt;java.nio.file.attribute.AclEntry.Builder&lt;/a&gt;, który zbudowany jest w oparciu o warte wzmiankowania konstrukcje programistyczne - wzorzec &lt;a href="http://pl.wikipedia.org/wiki/Budowniczy_%28wzorzec_projektowy%29"&gt;Budowniczy&lt;/a&gt; z tzw. &lt;i&gt;"fluent interface"&lt;/i&gt; (często tłumaczone dosłownie jako &lt;i&gt;"płynny interfejs"&lt;/i&gt;), czyli techniką konstruowania klas tak, aby metoda zwracała instancję obiektu, dla której została wywołana. W ten sposób możemy wywoływać metody, jedna po drugiej, przez ich łączenie.&lt;br /&gt;
&lt;br /&gt;
Jakkolwiek wątpię, abym często obcował z &lt;i&gt;AclEntry&lt;/i&gt; i jej pobratyńcami, to cieszę się, że pojawiła się ta klasa, która uważam, że spopularyzuje ten sposób budowania API w Javie.&lt;br /&gt;
&lt;br /&gt;
Skoro rysunek może zastąpić 1000 słów, to może przykładowy kod z &lt;i&gt;AclEntry.Builder&lt;/i&gt; również?&lt;br /&gt;
&lt;pre  class="brush: java; gutter: false"&gt;package pl.japila.java7.nio2;

import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.attribute.AclEntry;
import java.nio.file.attribute.AclEntryFlag;
import java.nio.file.attribute.AclEntryPermission;
import java.nio.file.attribute.AclEntryType;
import java.nio.file.attribute.UserPrincipal;
import java.nio.file.attribute.UserPrincipalLookupService;

public class AclEntryDemo {

     public static void main(String[] args) throws IOException {
          // who...
          UserPrincipalLookupService principalLookupService =
              FileSystems.getDefault().getUserPrincipalLookupService();
          UserPrincipal principal = principalLookupService.lookupPrincipalByName("jacek");
          System.out.printf("Principal: %s %n", principal);
         
          // ...does what.
          AclEntry aclEntry = AclEntry.newBuilder()
                    .setType(AclEntryType.ALLOW)
                    .setPrincipal(principal)
                    .setPermissions(AclEntryPermission.LIST_DIRECTORY)
                    .setFlags(AclEntryFlag.DIRECTORY_INHERIT)
                    .build();
          System.out.printf("ACL Entry: %s %n", aclEntry);
     }

}&lt;/pre&gt;Niezłe, co? A to wszystko dostępne w Java 7.&lt;br /&gt;
&lt;br /&gt;
Przy okazji, warto zajrzeć na blog &lt;b&gt;pragmatists.pl&lt;/b&gt;, w którym Paweł Lipiński przedstawił temat we wpisie &lt;a href="http://pragmatists.pl/plynne-interfejsy"&gt;Płynne interfejsy&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Czy ma ktoś pomysły, gdzie użyć AclEntry i jej podobych? A może już jest w użyciu u Ciebie? Jakie zastosowanie? Zachęcam do podzielenia się doświadczeniami, których mi zauważalnie brakuje.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-8223229181336956528?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/5iokThnQYaE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/8223229181336956528/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/pynny-interfejs-javaniofileattributeacl.html#comment-form" title="Komentarze (3)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/8223229181336956528?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/8223229181336956528?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/pynny-interfejs-javaniofileattributeacl.html" title="Płynny interfejs java.nio.file.attribute.AclEntry.Builder w Java 7" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;D0IAQ3g_fip7ImA9WhRTGUg.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-3083723735261747596</id><published>2011-11-10T20:33:00.001+01:00</published><updated>2011-11-10T21:05:42.646+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-10T21:05:42.646+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="certyfikacja" /><category scheme="http://www.blogger.com/atom/ns#" term="ibm" /><title>Level 2 Certified IT Specialist decyzją komisji certyfikacyjnej IBM CEE/MEA</title><content type="html">Panie i Panowie, Ci mali i Ci duzi, Ci mniej i Ci bardziej doświadczeni, i tak dalej, i tym podobne.&lt;br /&gt;
&lt;br /&gt;
Właśnie otrzymałem od komisji certyfikacyjnej w IBM mail następującej treści:&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;"Decision of the CEE/MEA IT Specialist Level 2 Certification Board &lt;br /&gt;
&lt;br /&gt;
Dear Jacek&lt;br /&gt;
&lt;br /&gt;
It is my pleasure to inform you about the positive decision of the CEE/MEA IT Specialist Certification board who is herewith approving your IT Specialist Level 2 Certification.&lt;br /&gt;
You may now use the title &lt;b&gt;Level 2 Certified IT Specialist&lt;/b&gt;. This title is independent of your position (i.e.band) and indicates that you are certified in the IT Specialist profession.  &lt;br /&gt;
&lt;br /&gt;
I wish you much success in your professional career in the future.&lt;br /&gt;
&lt;br /&gt;
Best regards&lt;br /&gt;
&lt;br /&gt;
Franziska Feller&lt;br /&gt;
IT Specialist Profession Leader Northeast IOT &amp; CEE/MEA&lt;br /&gt;
IT Architect Profession Leader CEE/MEA &amp; ALPS"&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
Tłumacząc na polski - z dniem dzisiejszym przechodzę na wyższy level zgodnie ze ścieżką rozwoju profesjonalnego w IBM.&lt;br /&gt;
&lt;br /&gt;
Założeniem programu certyfikacyjnego jest uhonorowanie dążeń pracowników IBM do profesjonalnego wykonywania zadań w duchu poszanowania zasad etyki zawodowej. Brzmi trochę wyniośle i może aż nadto patetycznie, ale w założeniu ma prowadzić do wyróżnienia osób, którym nie trzeba mówić, a które mówią i którym nie trzeba pokazywać, a które pokazują. W pakiecie kandydat opisuje, dlaczego jego udział w projekcie miał wpływ na niego (projekt nie kandydata). Mimo, że przez długi czas bojkotowałem ten proces (trochę ukrywając przy tym swoją obawę o brak kwalifikacji), aby ostatecznie ulec zachętom.&lt;br /&gt;
&lt;br /&gt;
12 września 2011 wysłałem pakiet - dokument podsumowujący moją działalność przez ostatnie 5 lat, co pozwoliłem sobie na upublicznienie we wpisie &lt;a href="http://jlaskowski.blogspot.com/2011/09/pakiet-certyfikacyjny-na-specjaliste-it.html"&gt;Pakiet certyfikacyjny na specjalistę IT wysłany&lt;/a&gt;. Do zebrania komisji dzieliły mnie 3 wywiady z innymi IBMerami, którzy takie miano już posiadają - 2 polaków i jedna osoba z RPA. Oni to podczas komisji certyfikacyjnej uchwalają "zdatność" kandydata do przyjęcia tytułu. W moim przypadku odbyło się zgodnie z moimi oczekiwaniami! Pamiętam jednak, że wywiady (swego rodzaju rozmowy kwalifikacyjne) nie były dla mnie lekkie. Miałem nieodparte wrażenie, że ogólne postrzeganie jest takie, że za mało w nim konkretnych zasług projektowych, które mogłyby uzasadniać moje aspiracje. Nie chodziło o podparcie ich certyfikatami produktowymi czy po prostu wykonywaniem swoich obowiązków, ale nietuzinkowymi "zagraniami", które mogłyby wyróżniać mnie z tłumu. Okazało się jednak, że było w tym pakiecie wystarczająco wiele, aby się obronił i pozwolił mi na dzisiejsze świętowanie.&lt;br /&gt;
&lt;br /&gt;
Jest to swego rodzaju podsumowanie mojej pięcioletniej działalności w IBM i jestem niezwykle dumny móc pochwalić się tytułem. Od tej pory jestem jego orędownikiem :)&lt;br /&gt;
&lt;br /&gt;
Więcej o programie certyfikacyjnym na stronie &lt;a href="http://www.opengroup.org/opencits/cert/"&gt;Welcome to the Open CITS Certification web site&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-3083723735261747596?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/Ddn7Xi14Yps" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/3083723735261747596/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/level-2-certified-it-specialist-decyzja.html#comment-form" title="Komentarze (2)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/3083723735261747596?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/3083723735261747596?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/level-2-certified-it-specialist-decyzja.html" title="Level 2 Certified IT Specialist decyzją komisji certyfikacyjnej IBM CEE/MEA" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;AkEEQ3g9cCp7ImA9WhRTGE4.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-6842090280178374424</id><published>2011-11-08T23:46:00.000+01:00</published><updated>2011-11-09T12:36:42.668+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-09T12:36:42.668+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="warszawa-jug" /><title>Eclipse DemoCamp 2011 w Warszawie innymi słowy</title><content type="html">2 tygodnie temu...świeżo po warsjawie 2011.&lt;br /&gt;
&lt;br /&gt;
Pada pomysł zorganizowania &lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_November_2011/Warszawa"&gt;Eclipse DemoCamp (EDC) 2011 w Warszawie&lt;/a&gt;. Były urodziny Eclipse, pojawiła się Java 7, jest potrzeba zorganizowania inauguracyjnego spotkania Warszawa JUG - robimy EDC. Nagłaśniam temat na forum WJUGa. Zgłaszają się prelegenci - &lt;b&gt;Piotr Chmielewski&lt;/b&gt; z JavaFX, &lt;b&gt;Paweł Cesar Sanjuan Szklarz&lt;/b&gt; z G1 i ja z java.util.concurrent w Java 7.&lt;br /&gt;
&lt;br /&gt;
Jakoś tak w tym samym czasie...&lt;br /&gt;
&lt;br /&gt;
Kontaktuje się ze mną firma &lt;a href="http://mlife.pl"&gt;mLife&lt;/a&gt;. Chcą wejść we współpracę z grupą WJUG. Świetnie się składa, myślę. Proponuję udział w sponsorowaniu EDC. Przyjmują. Mam kaskę na pizzę. Na napoje również. Mam wszystko! Jestem Panem wszechświata. Ponosi mnie.&lt;br /&gt;
&lt;br /&gt;
Rozpoczynam rejestrację. Czekam na poniedziałek, aby wyliczyć zamówienie pizz. Wychodzi 80 zarejestrowanych. Piszę do pizzerii - Da Grasso. Podobno nieciekawy wybór, ale co mi tam - pizza to pizza. Nie mam do tego głowy.&lt;br /&gt;
&lt;br /&gt;
Dzwonię do pizzerni. Szast, prast i mam zamówienie. Gość współpracował z nami, więc wie co w trawie piszczy. Poszło gładko. Temat z głowy. No prawie. Jeszcze tylko sprawdzę, czy wszystko w porządku z płatnością i dostawą, ale to już we wtorek.&lt;br /&gt;
&lt;br /&gt;
Siedzę w java.util.concurrent. Przygotowuję prezentację. Zaczynam zastanawiać się, czy ja aby jestem dobrze przygotowany do tego przedstawienia?! Mam wątpliwości, czy temat zajmie jedynie 30 minut. Będę musiał gonić. Nie lubię tego.&lt;br /&gt;
&lt;br /&gt;
Nadchodzi wtorek, 8.11. To już dziś! Mam prezentację, mam pizzę, mam prelegentów. Jest wszystko! Jeszcze ostatnie szlify mojej prezentacji, jeszcze polerka o Phaser i wybija 16:30. Pora się zwijać na Banacha.&lt;br /&gt;
&lt;br /&gt;
17:05. Wjeżdza 504. Jadę.&lt;br /&gt;
&lt;br /&gt;
Momento! Czy ja aby zamówiłem również napoje?! Dzwonię do pizzerii. "Czy w zamówieniu są napoje?" pytam. Po drugiej stronie spokojnym głosem "Nie". CO?!?! O w mordę! Proszę o zmianę - tniemy pizze. Ile napoi? Jakie? Cola? Mają tylko 1L. Wybieram Tymbarka 0,25. Ma zrobić, aby było dobrze. Lubię dobrze i gość wie, co jest grane. Zdaję się na pomoc z pizzerii. Uff, dobrze, że w ogóle o tym pomyślałem! Załatwione.&lt;br /&gt;
&lt;br /&gt;
17:59. Rozpoczynamy. Widzę znajome twarze. Dużo tych twarzy. Różne płcie. Jest też mLife i zaczyna się rozdawanie gadżetów. Fajnie, że jest ich tylu. Gdybym miał to przygotowywać samemu - odleciałbym. A tak, fajna kobitka jest i w ogóle jakoś tak poukładane wygląda.&lt;br /&gt;
&lt;br /&gt;
Przygotowuję kamerę.&lt;br /&gt;
&lt;br /&gt;
Pierwszy prelegent stremowany niemiłosiernie. Prosi o zwłokę. Może 10 minut krócej. CO?! Koleś, zluzuj, to przyjazna klientela. Zaczynam myśleć, że koleś zejdzie mi na serce. Jakby mu pomóc? Słownie poklepuję go po ramieniu. Daje radę. W końcu wchodzi na scenę. Kamera, akcja! Cicho, za cicho mówi. Bawię się kamerą, aby nagrać jak Piotr występuje w roli prelegenta. Widać tremę. Co?! Przeprasza za nią?! Oj, gościu, tego się nie robi. To widać, więc po co o tym jeszcze mówić?! Mów o JavaFX! Trema robi swoje. Koniec wystąpienia. Oklaski. Widać dumę u Piotra. Brawo! Pora na drugiego prelegenta.&lt;br /&gt;
&lt;br /&gt;
Drugiego?! Kurcze, gdzie jest Paweł? Paweł, gdzie jesteś. Nie ma go na sali. Chwila zastanowienia i po moim pytaniu o możliwość wystąpienia publika akceptuje plan awaryjny. Rozkładam się, a tu dzwoni dostawca z pizzerni. Jest pizza! Zatem przerwa. Wchodzi Paweł. Co za bieg wypadków. Nie za szybko aby? Zaraz zejdę na serce. Uff, na przerwie sobie odsapnę.&lt;br /&gt;
&lt;br /&gt;
Pizza-time. Robię za kelnera. Pada z tłumu "Przydałoby się trochę sosu". Nie ma sosu?! Tutaj jest! Rozdaję zainteresowanym, ale teraz dopiero reflektuję się, że obsługuję jedynie lewą stronę. Prawa daje sobie radę widzę. Jest dobrze. Pizza schodzi i napoje również. Auć, napoi już nie ma, a pizza jeszcze jest! Cóż, przy następnym razie pomyślimy i o tym. Zapisane na stronie "Do poprawy". Czas retrospekcji już się zaczął (mimo, że impreza wciąż trwa).&lt;br /&gt;
&lt;br /&gt;
Podchodzi Marcin, a może Maciej? Kurcze, już nie pamiętam. Proponuje robótkę. Firma z Gdańska dała ciała i nie dokończyła serwisu. Jest finansowanie, ale nie ma komu robić?! Co za czasy - robota sama przychodzi. Pytam "Jak nas znalazł". Google i takie tam. Przyszedł, aby zaproponować pracę z Grails. Wygląda ciekawie. Muszę się zastanowić. Nie mam do tego głowy teraz. Obiecuję nagłośnić temat przed kolejnym wystąpieniem, na blogu i grupie. Zawsze marzyłem o zbliżeniu inwestorów do naszej grupy. Czyżby marzenia się spełniały?!&lt;br /&gt;
&lt;br /&gt;
Pora przygotować się do prezentacji. Godzina 18:57. Jestem gotów, a tu pada "Może jednak moglibyśmy utrzymać harmonogram? Wolałbym, aby Paweł teraz wystąpił." Ups. Chyba mnie tu nie lubią. Idę ustalić temat z Pawłem. Jest zgoda. Paweł się rozkłada. Ja na scenie wyłuszczam temat z Gdańska. Cisza na sali. Pospali się?! Chrapaliby chyba, co? Nie. Wszyscy patrzą na mnie. Chyba słuchają.&lt;br /&gt;
&lt;br /&gt;
Paweł wchodzi na scenę. Akcja!&lt;br /&gt;
&lt;br /&gt;
Dostaję informację, że przyjechała druga partia pizz. I tyle widziałem Pawła. Przyjechało bodajże 10 nowych - 3 rodzaje. Zaczynam rozmowę na korytarzu o możliwościach ożywienia studentów z MIMUWu z p. dr Jabłonowskim. Pizza schodzi. Jacyś "przechodnie" pytają o możliwość uszczknięcia pizzy. A proszę bardzo. "A z jakiej to okazji?" pada. "Mamy spotkanie javowe" - odpowiadam.&lt;br /&gt;
&lt;br /&gt;
Godzina 19:25. Wchodzę do sali. Paweł w najlepsze opowiada o G1. Widać zainteresowanie publiczności. Padają pytania, Paweł oddaje się rozważaniom, widać interakcję. Jest dobrze. Momento, ale czy nie powinien już kończyć?! 19:30. On wciąż przy mikrofonie i nie widać końca. Pokazuję, że koniec. Paweł widzi, ale brnie w zaparte. "Uparty gość" myślę sobie. Cóż, niech ma jeszcze 5 minut. 19:35. Wciąż mówi. Bach, jest ostatni slajd. Będzie koniec. Jest!&lt;br /&gt;
&lt;br /&gt;
Wspominam o pizzy. Daję 5 minut na przerwę i zapraszam na przekąskę, toaletę i w ogóle odświeżenie umysłu. Już przeczuwam, że ze mną będzie bolało. Mam 30 slajdów, 30 minut i godzinę prawie 19:45. Nie jest dobrze.&lt;br /&gt;
&lt;br /&gt;
Zaczynam. Idzie 1 slajd, później drugi. Widać, że ludzi mniej niż na poprzednich wystąpieniach, ale zrzucam to w duchu na późną porę. Na pewno nie na mój temat, czy mnie samego. Niemożliwe!&lt;br /&gt;
&lt;br /&gt;
Rozgrzewam się. Idzie coraz sprawniej, padają pierwsze pytania. Już nie pamiętam, czy sam nie prowokuję ich. Czas płynie, a ja w połowie. Kolejne pytania, tym razem moje. Pada odpowiedź, druga, wywiązuje się dłuższa wypowiedź. Nie nie mogę na to pozwolić. Muszę skracać. Zaczynam biec. Auć, chyba za dużo przygotowałem do omówienia. A miało być za mało na 30 minut!&lt;br /&gt;
&lt;br /&gt;
Jest 20:15, może 20:20. Pytam, czy mogę prosić o 15 minut dłużej. Pada, że nawet mam 20. Jest lepiej. Koniec o Fork/Join. Nie ma przykładów. Za mało czasu. Muszę nadganiać.&lt;br /&gt;
&lt;br /&gt;
Wchodzimy w ThreadLocalRandom. Tutaj krótko - 1 slajd. Zapominam o tym i przerzucam na kolejny, a tu...Phaser. A właśnie, miało być o Phaser! Szybko przypominam sobie, co tam miałem powiedzieć. Wspominam o książce i głęboki oddech. To będzie z górki. Chyba polubiłem Phaser. Jakiś taki prosty się teraz wydaje. Nadrabiam trochę miną, pomaga mi publika. Jest dobrze. Prezentacja się klei. Tak lubię!&lt;br /&gt;
&lt;br /&gt;
Jest godzina 20:30. Nie! Jest później! 20:45. Znowu zawaliłem z czasem. Trzeba nie było prowokować publiki do dyskusji. Trzeba było trzymać się planu, a nie improwizować jak na "jam session". Następnym razem. Następnym razem.&lt;br /&gt;
&lt;br /&gt;
Jeszcze na koniec prezentacja aplikacji z sourceforge. Chyba się podoba. Sala wybucha gromkim śmiechem. Jest dobrze. Publika się bawi, ja wciąż na scenie - dam radę. No nie, chwila przed 21:00. Zdecydowanie za późno skończyliśmy. Następnym razem będę pilniejszy. 30 minut to trochę mało. Koniec. Oklaski.&lt;br /&gt;
&lt;br /&gt;
Ale co jest?! Pochodzi gość i proponuje wystąpienie na...5 minut. Co?! Nietechniczna publika?! O czym będę mówił?! O prowadzeniu bloga, WJUGa, prezentacje publiczne. Cokolwiek. "Trzymaj się 5 minut!" pada. Nigdy nie brałem udziału w takim przedsięwzięciu. Biorę to! Będzie jazda, ooostra jazda.&lt;br /&gt;
&lt;br /&gt;
Dyskusje, pożegnania, złożenie spotkania. Chyba się udało. Oby nie dostrzegli tych ostrych kantów. To EDC to jeden wielki kant. Jestem zadowolony ogólnie. Samemu udało mi się zestawić to spotkanie. Widać nie wypadłem z wprawy. Ktoś musi mi trochę posłodzić?! Kolejnym razem muszę kogoś zaprosić. Samemu to przewalić się można.&lt;br /&gt;
&lt;br /&gt;
Na zegarze 21:15. W domu jestem po 22. Dzieciaki okupują łazienkę, żonka i dzidzia śpią. Publikuję &lt;a href="http://jaceklaskowski.pl/prezentacje/JacekLaskowski-EclipseDemoCamp2011-ConcurrencyUtilities in Java 7-2011.11.pdf"&gt;prezentację z mojego wystąpienia&lt;/a&gt;. Nie mogę nie prosić o słowa krytyki. Muszę wiedzieć, gdzie miałem wpadkę. Lubię doskonalić warsztat. Łudzę się, że ktoś jeszcze zechce do nich zajrzeć.&lt;br /&gt;
&lt;br /&gt;
Wciąż ślęczę nad tym wpisem. O łazienka wolna. Koniec. Idę spać. Paaaa.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-6842090280178374424?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/-7QoblAnJSw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/6842090280178374424/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/eclipse-democamp-2011-w-warszawie.html#comment-form" title="Komentarze (9)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/6842090280178374424?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/6842090280178374424?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/eclipse-democamp-2011-w-warszawie.html" title="Eclipse DemoCamp 2011 w Warszawie innymi słowy" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><thr:total>9</thr:total></entry><entry gd:etag="W/&quot;CE8GQ3k-eSp7ImA9WhRTFEk.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-2809436542513641201</id><published>2011-11-04T22:40:00.000+01:00</published><updated>2011-11-04T22:40:22.751+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-04T22:40:22.751+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="websphere" /><category scheme="http://www.blogger.com/atom/ns#" term="certyfikacja" /><title>IBM Certified Solution Developer - WebSphere Integration Developer V6.2 od dzisiaj</title><content type="html">20 listopada 2009 napisałem w &lt;a href="http://jlaskowski.blogspot.com/2009/11/od-dzisiaj-zwa-mnie-ibm-certified.html"&gt;Od dzisiaj zwą mnie "IBM Certified System Administrator - WebSphere Application Server, Network Deployment V6.1" &lt;/a&gt;:&lt;br /&gt;
&lt;blockquote&gt;&lt;i&gt;"Po prawie 4 latach pracy w IBM z produktami z rodziny IBM WebSphere mam swój pierwszy certyfikat produktowy "Test 000-253: IBM WebSphere Application Server Network Deployment V6.1, Core Administration" i tym samym przywdziałem szaty "IBM Certified System Administrator - WebSphere Application Server, Network Deployment V6.1"."&lt;/i&gt;&lt;/blockquote&gt;Dzisiaj mijają prawie 2 lata od tego momentu i tym bardziej jestem dumny móc pochwalić się kolejnym osiągnięciem na niwie certyfikacyjnej - od dzisiaj jestem &lt;a href="http://www-03.ibm.com/certify/certs/15001503.shtml"&gt;IBM Certified Solution Developer - WebSphere Integration Developer V6.2&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-BsB0VgEZE-g/TrRTloqt_iI/AAAAAAAADHI/bgLLFpKJSDI/s1600/wid62-test-379-results-passed.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="400" width="366" src="http://2.bp.blogspot.com/-BsB0VgEZE-g/TrRTloqt_iI/AAAAAAAADHI/bgLLFpKJSDI/s400/wid62-test-379-results-passed.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Wynik nie napawa optymizmem - 65%, co tylko potwierdza, że chyba nie dane mi wychylić głowy ponad przeciętność. Jak do tej pory niewiele było egzaminów, z których potrafiłem uzyskać 4 i więcej, więc po prostu akceptuję wynik, przede wszystkim ciesząc się, że mam ten egzamin za sobą.&lt;br /&gt;
&lt;br /&gt;
A nie było lekko. Dla przypomnienia wspomnę o podsumowaniu moich wcześniejszych prób - wpis z 21 sierpnia 2010 &lt;a href="http://jlaskowski.blogspot.com/2010/08/do-3-razy-sztuka-moze-4-kolejne.html"&gt;Do 3 razy sztuka? A może 4? Kolejne niepowodzenie z Test 000-379: IBM WebSphere Integration Developer V6.2, Solution Development&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Właśnie poprzednie nieudane podejścia i dodatkowo wczorajszy Fail pozostawiało wiele do życzenia. I nauki!&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-qkJF-EMwxSM/TrRUJPiu_NI/AAAAAAAADHU/vTHj153YZ6w/s1600/wid62-test-379-test-result-failed.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="256" width="400" src="http://1.bp.blogspot.com/-qkJF-EMwxSM/TrRUJPiu_NI/AAAAAAAADHU/vTHj153YZ6w/s400/wid62-test-379-test-result-failed.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Ale czego nie robi się dla kariery?!&lt;br /&gt;
&lt;br /&gt;
Bardzo przydało mi się studiowanie różnych scenariuszy z narzędziem, a szczególnie tych, które poznałem właśnie podczas tych wszystkich podejść testowych. I właśnie ta nauka pozostanie u mnie w pamięci najdłużej - projekty, w których miałem możliwość uczestniczyć do tej pory z WID nie były specjalnie wyrafinowane i zaczynam podejrzewać, że może wynika to z faktu, że wciąż na SOA w Polsce trzeba jeszcze poczekać. Mam nieodparte wrażenie, że bez względu na produkt, którym chcemy realizować założenia SOA, wciąż za mało studiujemy jego możliwości. Nie zamierzam wychwalać zestawu WID/WPS jako właściwego do wszystkich sytuacji integracyjnych, ale dla stosunkowo wielu jest to właściwa oferta. Kto nie wierzy, niech spróbuje samodzielnie poznać produkt - niestety nie wiem, czy w ogóle istnieje wersja do samodzielnej nauki, chociażby czasowa. Zainteresowanych uprasza się o &lt;a href="mailto:jacek@japila.pl"&gt;kontakt na priv&lt;/a&gt; - może uda się zaspokoić ciekawość w jakiś bliżej jeszcze nieokreślony sposób.&lt;br /&gt;
&lt;br /&gt;
Można tylko zapytać, po co w ogóle ten certyfikat, kiedy od paru lat mamy wersję 7.0 (z egzaminem &lt;a href="http://www-03.ibm.com/certify/tests/ovr607.shtml"&gt;Test 000-607: IBM WebSphere Process Server V7.0, Integration Development&lt;/a&gt;) oraz 7.5 (ze zmienioną nazwą na Integration Designer w zestawie IBM Business Process Manager 7.5 Advanced)? Po prostu chciałem sobie udowodnić, że mogę. Uparłem się na tę wersję, bo byłem święcie przekonany, że znam produkt wystarczająco, aby zdać egzamin. Każda kolejna porażka tylko mnie coraz bardziej rozjuszała (a moje ego cierpiało). Ten opór się w końcu opłacił i wierzę, że z niewielkimi zmianami między wersjami 7.0 i 7.5 pora spróbować czegoś (nieznacznie?) odmiennego - &lt;a href="http://www-03.ibm.com/certify/certs/15010303.shtml"&gt;IBM Certified Associate BPM Developer - WebSphere Lombardi Edition V7.2&lt;/a&gt;? Nie znaczy to, że kończę z WID, bo co to, to nie! Po prostu jego już okiełznałem na tyle, abym wiedział na czym się skupić, aby już bez stresu poznawać jego dalsze tajniki. Klienci powinni odczuć zmianę na korzyść.&lt;br /&gt;
&lt;br /&gt;
Pozdrawiam jednocześnie wszystkich, którym niejednokrotnie powinęła się noga na tym samym egzaminie. Niesamowite uczucie móc tego doświadczyć!&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-2809436542513641201?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/vyBV0Ezw2Jg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/2809436542513641201/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/ibm-certified-solution-developer.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2809436542513641201?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2809436542513641201?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/ibm-certified-solution-developer.html" title="IBM Certified Solution Developer - WebSphere Integration Developer V6.2 od dzisiaj" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-BsB0VgEZE-g/TrRTloqt_iI/AAAAAAAADHI/bgLLFpKJSDI/s72-c/wid62-test-379-results-passed.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUYDSXsyeip7ImA9WhRTEko.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-592130871491117827</id><published>2011-11-02T23:32:00.000+01:00</published><updated>2011-11-02T23:32:58.592+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-02T23:32:58.592+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="konferencje" /><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="warszawa-jug" /><category scheme="http://www.blogger.com/atom/ns#" term="java7" /><title>84 spotkanie Warszawa JUG - Warszawski Eclipse DemoCamp 2011 - Java 7, JavaFX i Eclipse</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.warszawa.jug.pl" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="148" width="100" src="http://2.bp.blogspot.com/-Nz0QAHFKiAw/TrHD1D26NDI/AAAAAAAADGw/KK9hUM8aiI4/s400/Warszawajug.png" alt="Warszawska Grupa Użytkowników Technologii Java (Warszawa JUG)" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://www.warszawa.jug.pl/"&gt;Warszawska Grupa Użytkowników Javy (Warszawa JUG)&lt;/a&gt; zaprasza na 83 spotkanie, które odbędzie się w najbliższy wtorek, 8 listopada 2011 o godzinie 18:00 w sali 5440 Wydziału MIM UW przy ul. Banacha 2 w Warszawie. Spotkanie jest jednocześnie oficjalnym otwarciem sezonu spotkań 2011/12 oraz świętowaniem dwóch wielkich wydarzeń w kalendarzu entuzjasty Javy - wydania Java 7 oraz dziesiątej rocznicy Eclipse.org.&lt;br /&gt;
&lt;br /&gt;
Temat: &lt;b&gt;Warszawski Eclipse DemoCamp 2011&lt;/b&gt;&lt;br /&gt;
Prelegenci: &lt;b&gt;Piotr Chmielewski&lt;/b&gt;, &lt;b&gt;Paweł Szklarz&lt;/b&gt;, &lt;b&gt;Jacek Laskowski&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Agenda&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
18:00-18:25 &lt;b&gt;JavaFX&lt;/b&gt; Piotr Chmielewski&lt;br /&gt;
18:25-19:00 pizza&lt;br /&gt;
19:00-19:25 &lt;b&gt;Garbage-First Garbage Collection w Java 7&lt;/b&gt; Paweł Szklarz&lt;br /&gt;
19:30-20:00 &lt;b&gt;java.util.concurrent w Java 7 z Eclipse Indigo SR1&lt;/b&gt; Jacek Laskowski&lt;br /&gt;
&lt;br /&gt;
Sponsorem naszego spotkania została firma &lt;a href="http://mlife.pl"&gt;mLife&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.mlife.pl/"&gt;&lt;img src="http://wiki.eclipse.org/images/thumb/9/9e/Mlife.png/300px-Mlife.png" border="0" alt="mLife.pl" width="300" height="150" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Strona minikonferencji na eclipse.org - &lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_November_2011/Warszawa"&gt;Eclipse DemoCamps November 2011/Warszawa&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Uprasza się o rozsądną rejestrację (wymaga potwierdzenia) na stronie &lt;a href="http://oiola.com/e/789-warszawski-eclipse-democamp-2011/"&gt;Warszawski Eclipse DemoCamp 2011&lt;/a&gt;, aby dopasować liczbę pizz i napoi.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Wstęp wolny&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Zapraszam w imieniu prelegentów i grupy Warszawa JUG!&lt;br /&gt;
&lt;br /&gt;
Kontakt z organizatorem: &lt;a href="mailto:jacek@japila.pl"&gt;Jacek Laskowski&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-592130871491117827?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/DglIY6UikOo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/592130871491117827/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/84-spotkanie-warszawa-jug-warszawski.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/592130871491117827?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/592130871491117827?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/84-spotkanie-warszawa-jug-warszawski.html" title="84 spotkanie Warszawa JUG - Warszawski Eclipse DemoCamp 2011 - Java 7, JavaFX i Eclipse" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-Nz0QAHFKiAw/TrHD1D26NDI/AAAAAAAADGw/KK9hUM8aiI4/s72-c/Warszawajug.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0MGQXs7eyp7ImA9WhRTEUU.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-7194288506137000933</id><published>2011-11-01T23:10:00.002+01:00</published><updated>2011-11-01T23:10:20.503+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-01T23:10:20.503+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java7" /><title>java.util.Objects w Java 7 jeszcze raz - ostatni?</title><content type="html">Sądziłem, że poprzednie dwa wpisy na temat &lt;a href="http://download.oracle.com/javase/7/docs/api/java/util/Objects.html"&gt;java.util.Objects&lt;/a&gt; wyczerpały temat, ale nie tylko, że nie wykorzystałem wszystkich metod oferowanych przez tę klasę, chociażby &lt;a href="http://download.oracle.com/javase/7/docs/api/java/util/Objects.html#hash%28java.lang.Object...%29"&gt;Objects.hash(Object... values)&lt;/a&gt;, ale sprowokowany przez komentarz &lt;b&gt;ags&lt;/b&gt; (znany również jako &lt;a href="http://www.andrzejgrzesik.pl/"&gt;Andrzej Grzesik&lt;/a&gt;) udało mi się znacznie uatrakcyjnić mój przykład.&lt;br /&gt;
&lt;br /&gt;
Zwracam uwagę na zmiany w samej klasie &lt;i&gt;Customer&lt;/i&gt; - metody &lt;i&gt;hashCode()&lt;/i&gt; oraz &lt;i&gt;equals(Object)&lt;/i&gt; oraz sam test z &lt;i&gt;assertNotSame()&lt;/i&gt; i &lt;i&gt;assertSame()&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Ufam, że teraz wszyscy są usatysfakcjonowani, nieprawdaż?&lt;br /&gt;
&lt;br /&gt;
&lt;pre  class="brush: java; gutter: false"&gt;package pl.japila.java7;

import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;

import java.util.Objects;

import org.junit.Test;

public class ObjectsTest {

 class Customer {
  public final String code;
  public final String name;

  public Customer(final String name, final String code) {
   this.name = name;
   this.code = code;
  }

  @Override
  public int hashCode() {
   return Objects.hash(name, code);
  }

  @Override
  public boolean equals(Object obj) {
   if (this == obj)
    return true;
   if (obj == null)
    return false;
   if (getClass() != obj.getClass())
    return false;
   Customer other = (Customer) obj;
   if (!getOuterType().equals(other.getOuterType()))
    return false;
   return Objects.equals(name, other.name) &amp;&amp; Objects.equals(code, other.code);
  }

  private ObjectsTest getOuterType() {
   return ObjectsTest.this;
  }
 }

 @Test
 public void testObjectsMethods() {

  Customer jacek = new Customer("Jacek", "X23");
  Customer klonJacka = new Customer("Jacek", "X23");

  assertTrue("Klon Jacka jest Jackiem", Objects.equals(jacek, klonJacka));
  assertNotSame("Jacek nierówny swojemu klonowi", jacek, klonJacka);
  
  Customer wskazanieNaJacka = jacek;

  assertTrue(Objects.equals(jacek, wskazanieNaJacka));
  assertSame(jacek, wskazanieNaJacka);
 }

}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-7194288506137000933?l=jlaskowski.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/PREQnTvVLaY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/7194288506137000933/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/javautilobjects-w-java-7-jeszcze-raz.html#comment-form" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/7194288506137000933?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/7194288506137000933?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2011/11/javautilobjects-w-java-7-jeszcze-raz.html" title="java.util.Objects w Java 7 jeszcze raz - ostatni?" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/Sa0nSnEUCFI/AAAAAAAACDk/XZCpk4wGEjQ/S220/jacek_laskowski.jpg" /></author><thr:total>0</thr:total></entry></feed>

