<?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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C0EMRX8zfip7ImA9WxNbEkw.&quot;"><id>tag:blogger.com,1999:blog-20941681</id><updated>2009-11-14T16:14:44.186+01:00</updated><title>Jacek Laskowski - Notatnik Projektanta Java EE</title><subtitle type="html">O Javie, Java EE i otwartym oprogramowaniu po polsku</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="hub" href="http://pubsubhubbub.appspot.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>jacek@laskowski.net.pl</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>511</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/BlogJackaLaskowskiego" type="application/atom+xml" /><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><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;CUQMSX0zfCp7ImA9WxNbEU8.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-7695025473318843719</id><published>2009-11-13T15:25:00.002+01:00</published><updated>2009-11-13T15:43:08.384+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-13T15:43:08.384+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Funkcyjne wyjście z REPL z (exit) i ankieta językowa</title><content type="html">Już dawno nie czułem takiej radości z tak niewielkiej ilości kodu. Chyba wciąż jestem przerażony liczbą nawiasów w Clojure, więc kiedy napisałem funkcję &lt;span style="font-weight:bold;"&gt;(exit)&lt;/span&gt; bezbłędnie za pierwszym razem, można sobie wyobrazić, jaki byłem szczęśliwy.&lt;pre class="brush: clojure"&gt; user=&amp;gt; (def exit (fn [] (. System exit 0)))&lt;br /&gt; #'user/exit&lt;br /&gt; user=&amp;gt; (exit)&lt;/pre&gt;Brakowało mi tej funkcji w Clojure REPL, bo ^C, czy ^Z + ENTER pachniały mi jakąś niedoróbką. W tak niewielkiej funkcji udało mi się wykorzystać 3 istotne możliwości Clojure - definiowanie zmiennej przez &lt;span style="font-weight:bold;"&gt;def&lt;/span&gt;, której przypisano funkcję anonimową przez &lt;span style="font-weight:bold;"&gt;fn&lt;/span&gt;, która z kolei wykorzystuje integrację Clojure z Javą za pomocą specjalnej formy &lt;span style="font-weight:bold;"&gt;.&lt;/span&gt; (kropka). Ale ze mnie programista, co? :)&lt;br /&gt;&lt;br /&gt;Można to jednak lekko podrasować i wykorzystać specjalną formę &lt;span style="font-weight:bold;"&gt;#()&lt;/span&gt;, która również definiuje funkcję anonimową. Owa funkcja anonimowa w niektórych kręgach nazywana jest...&lt;span style="font-weight:bold;"&gt;domknięciem&lt;/span&gt; (ang. &lt;span style="font-style:italic;"&gt;closure&lt;/span&gt;). Domknięcie w Clojure nie różni się bardzo w porównaniu do tradycyjnego wywołania funkcji, ale tym razem owe wywołanie &lt;span style="font-style:italic;"&gt;fn&lt;/span&gt; kończy się stworzeniem nowej. Funkcja, która operuje na innych, w tym zwraca je, nazywamy &lt;a href="http://pl.wikipedia.org/wiki/Funkcja_wy%C5%BCszego_rz%C4%99du"&gt;funkcją wyższego poziomu&lt;/a&gt; (ang. &lt;span style="font-style:italic;"&gt;higher-order function&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Wracając do naszego #() to możnaby powyższe zapisać tak:&lt;pre class="brush: clojure"&gt; user=&amp;gt; (def exit #(. System exit 0))&lt;br /&gt; #'user/exit&lt;br /&gt; user=&amp;gt; (exit)&lt;/pre&gt;Przeglądając &lt;a href="http://groups.google.com/group/clojure/msg/73df9c3446bf092f"&gt;kod źródłowy "Game of Life" Scotta Frasera&lt;/a&gt; trafiłem na metodę &lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html#availableProcessors()"&gt;java.lang.Runtime.availableProcessors()&lt;/a&gt;, o której istnieniu nie wiedziałem. W zasadzie o wielu metodach jeszcze nie wiem i wiele z nich wywrze na mnie podobne, pozytywne wrażenie, aczkolwiek ta ma tą zaletę, że utwierdziła mnie w przekonaniu, że mój laptop faktycznie posiada procesor 2-rdzeniowy i 2 wątki powinny działać równolegle (biorąc pod uwagę działanie wszystkich innych programów w tle, pewnie tak nie będzie i jeden z wątków i tak będzie szybszy).&lt;pre class="brush: clojure"&gt; user=&amp;gt; (def available-procs (.. java.lang.Runtime getRuntime availableProcessors))&lt;br /&gt; #'user/available-procs&lt;br /&gt; user=&amp;gt; (println available-procs)&lt;br /&gt; 2&lt;br /&gt; nil&lt;/pre&gt;Zadanie dla wytrwałych: Jak zmienić def powyżej, aby możliwe było wykonanie (available-procs), który zwróci 2, tj.&lt;pre class="brush: clojure"&gt; user=&amp;gt; (available-procs)&lt;br /&gt; 2&lt;/pre&gt;p.s. Rozpocząłem kolejną ankietę odnośnie języków programowania &lt;span style="font-style:italic;"&gt;"Jaki język programowania używasz poza Javą?"&lt;/span&gt; (jest na blogu po prawej u góry). Nie ma znaczenia, czy do zabawy, w projekcie, własnej ciekawości, czytasz o nim książkę, czy podobnie. Poświęcasz swój czas, więc wystarczy, aby określić go jako "używasz". Interesuje mnie, czy chociażby rozważasz alternatywę dla Javy i jaki to jest język. Wszystkie języki poza JVM wpadły do kategorii "Inne (poza JVM)". Głosujcie!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-7695025473318843719?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/r1PINo5Qi28" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/7695025473318843719/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=7695025473318843719" title="Komentarze (4)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/7695025473318843719?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/7695025473318843719?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/11/funkcyjne-wyjscie-z-repl-z-exit-i.html" title="Funkcyjne wyjście z REPL z (exit) i ankieta językowa" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total></entry><entry gd:etag="W/&quot;DEYMQHs_fCp7ImA9WxNbEEg.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-227599610494484278</id><published>2009-11-12T21:02:00.000+01:00</published><updated>2009-11-12T21:03:01.544+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-12T21:03:01.544+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="warszawa-jug" /><title>56. spotkanie Warszawa JUG - Jesienny Eclipse DemoCamp 2009</title><content type="html">&lt;a href="http://www.warszawa.jug.pl"&gt;Warszawska Grupa Użytkowników Technologii Java (Warszawa JUG)&lt;/a&gt; zaprasza na 56. spotkanie, które odbędzie się we wtorek, 24. listopada o godzinie 18:00 w sali 5440 Wydziału MIMUW przy ul. Banacha 2 w Warszawie.&lt;br /&gt;&lt;br /&gt;Temat: &lt;a href="http://eclipsedemocamp.warszawa.jug.pl"&gt;Jesienny Eclipse DemoCamp 2009&lt;/a&gt;&lt;br /&gt;Prelegenci: &lt;b&gt;Michał Margiel&lt;/b&gt;, &lt;b&gt;Łukasz Lenart&lt;/b&gt;, &lt;b&gt;Jacek Laskowski&lt;/b&gt;, &lt;b&gt;Sebastian Pietrowski&lt;/b&gt;, &lt;b&gt;Tomasz Bujok&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Tym razem forma spotkania będzie minikonferencją wokół produktów Eclipse Foundation, w której 5 prelegentów zaprezentuje rozwiązania w ciągu...20 minut każdy. Jeśli to nie przekonuje Cię o spędzeniu wtorkowego wieczoru w niezwykle porywającej atmosferze w gronie entuzjastów javowych, to może agenda?&lt;br /&gt;&lt;br /&gt;18:00-18:20 &lt;b&gt;Bądź leniwy - wykorzystaj ukrytą moc Eclipse, czyli jak robić by się nie narobić i wycisnąć max ze środowiska&lt;/b&gt; Michał Margiel&lt;br /&gt;18:25-18:45 &lt;b&gt;GoogleAppEngine - chmura na Ja(v)wie&lt;/b&gt; Łukasz Lenart&lt;br /&gt;18:50-19:10 &lt;b&gt;OpenEJB Eclipse Plugin - EJB 3.1 z Apache OpenEJB w Eclipse IDE&lt;/b&gt; Jacek Laskowski&lt;br /&gt;19:15-19:35 &lt;b&gt;Wprowadzenie do Cloud Foundry&lt;/b&gt; Sebastian Pietrowski&lt;br /&gt;19:40-20:00 &lt;b&gt;Po prostu monitoring, czyli jak zbudować skalowalną architekturę monitoringu w 20 minut za pomocą Spring, AOP i ActiveMQ&lt;/b&gt; Tomasz Bujok&lt;br /&gt;&lt;br /&gt;Harmonogram niezwykle napięty, więc o nudzie nie może być mowy. W miłej atmosferze wiedza sama wchodzi do głowy, mimo późnej godziny.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Wstęp wolny&lt;/b&gt;, ale &lt;a href="http://oiola.com/e/482-jesienny-eclipse-democamp-2009/"&gt;rejestracja&lt;/a&gt; wskazana.&lt;br /&gt;&lt;br /&gt;Zapraszam w imieniu prelegentów i grupy Warszawa JUG!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-227599610494484278?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/2KTqi6azWSo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/227599610494484278/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=227599610494484278" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/227599610494484278?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/227599610494484278?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/11/56-spotkanie-warszawa-jug-jesienny.html" title="56. spotkanie Warszawa JUG - Jesienny Eclipse DemoCamp 2009" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;D08FRXY-fip7ImA9WxNUGUo.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-9014094405617925111</id><published>2009-11-11T22:10:00.003+01:00</published><updated>2009-11-11T22:43:34.856+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-11T22:43:34.856+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>(-&gt; Clojure zrozumieć-makro-thread przeczytać-artykuł opisać-na-blogu)</title><content type="html">Zgodnie z sugestią &lt;a href="http://jlaskowski.blogspot.com/2009/11/programowanie-w-clojure-czesc-2.html?showComment=1257777495973#c5166828619663572422"&gt;Michaela&lt;/a&gt; zabrałem się za poznawanie Clojure od strony jego kodu źródłowego i podążając słowami mojego mistrza zabrałem się za makro &lt;span style="font-weight:bold;"&gt;-&amp;gt;&lt;/span&gt;, zwane również w kręgach Clojure jako makro &lt;span style="font-style:italic;"&gt;"thread"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Kod źródłowy jest niezwykle mały i znajduje się w repozytorium Git - &lt;a href="http://github.com/richhickey/clojure/raw/master/src/clj/clojure/core.clj"&gt;core.clj&lt;/a&gt;.&lt;pre class="brush: clojure"&gt; (defmacro -&amp;gt;&lt;br /&gt;   "Threads the expr through the forms. Inserts x as the&lt;br /&gt;   second item in the first form, making a list of it if it is not a&lt;br /&gt;   list already. If there are more forms, inserts the first form as the&lt;br /&gt;   second item in second form, etc."&lt;br /&gt;   ([x form] (if (seq? form)&lt;br /&gt;               `(~(first form) ~x ~@(next form))&lt;br /&gt;               (list form x)))&lt;br /&gt;   ([x form &amp; more] `(-&amp;gt; (-&amp;gt; ~x ~form) ~@more)))&lt;/pre&gt;Forma &lt;span style="font-weight:bold;"&gt;doc&lt;/span&gt; zwraca &lt;span style="font-style:italic;"&gt;Clojure doc&lt;/span&gt;, czyli dokumentację funkcji będącej jej argumentem wejściowym, więc i bez kodu źródłowego możnaby się doczytać, co autor miał na myśli tworząc makro -&amp;gt; (mi to nie wystarczyło, ale pomyślałem, że wspomnę i o tej możliwości).&lt;pre class="brush: clojure"&gt; user=&amp;gt; (doc -&amp;gt;)&lt;br /&gt; -------------------------&lt;br /&gt; clojure.core/-&amp;gt;&lt;br /&gt; ([x form] [x form &amp; more])&lt;br /&gt; Macro&lt;br /&gt;   Threads the expr through the forms. Inserts x as the&lt;br /&gt;   second item in the first form, making a list of it if it is not a&lt;br /&gt;   list already. If there are more forms, inserts the first form as the&lt;br /&gt;   second item in second form, etc.&lt;br /&gt; nil&lt;/pre&gt;Czytając dokumentację dosłownie, makro -&amp;gt; ma za zadanie wpleść wyrażenie do listy form. Wciąż mi to jednak niewiele mówi. Definicja -&amp;gt; składa się z dwóch przypadków - kiedy makro dostaje na wejściu dwa parametry i więcej. &lt;span style="font-weight:bold;"&gt;Forma&lt;/span&gt; (ang. &lt;span style="font-style:italic;"&gt;form&lt;/span&gt;) to po prostu dwa nawiasy, w których są wywołania funkcji czy makr, lub ponownie form. I tak rekurencyjnie mamy całą masę par nawiasów. W Clojure *wszystko* jest w nawiasach, albo zastąpione pewnymi specjalnymi konstrukcjami  - uproszczeniami rozpoznawanymi przez kompilator, które wychodzą poza ten schemat, np. przywoływana już konstrukcja tworzenia kluczy :nazwa jest równoznaczna z wywołaniem funkcji &lt;span style="font-style:italic;"&gt;(keyword "nazwa")&lt;/span&gt; (często nazywanymi po angielsku &lt;span style="font-style:italic;"&gt;"syntactic sugar"&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Wykonanie -&amp;gt; z jednym parametrem, to po prostu jego zwrócenie.&lt;pre class="brush: clojure"&gt; user=&amp;gt; (-&amp;gt; 2)&lt;br /&gt; 2&lt;/pre&gt;To było proste! :) Teraz będzie znacznie trudniej. Jeśli na wejściu -&amp;gt; mamy dwa parametry, to rozpatrujemy przypadki - 1) forma jest sekwencją (&lt;span style="font-weight:bold;"&gt;seq?&lt;/span&gt; zwraca prawdę) i 2) kiedy nie jest. Przy okazji, nazwy funkcji, których wynikiem jest wartość logiczna true/false są zakończone &lt;span style="font-weight:bold;"&gt;?&lt;/span&gt; (znak zapytania).&lt;br /&gt;&lt;br /&gt;Weźmy ponownie coś równie prostego jak poprzednio.&lt;pre class="brush: clojure"&gt; user=&amp;gt; ; w nawiasie mamy funkcję minus i jej jedyny argument 3&lt;br /&gt; user=&amp;gt; (-&amp;gt; 2 (- 3))&lt;br /&gt; -1&lt;/pre&gt;Dlaczego? Analizując kod źródłowy -&amp;gt; dochodzimy do wniosku, że jest to równoznaczne z poniższym.&lt;pre class="brush: clojure"&gt; user=&amp;gt; (- 2 3)&lt;br /&gt; -1&lt;/pre&gt;Pierwszy argument dla -&amp;gt; jest na drugiej pozycji w pierwszej formie, którą było (- 3). Można jeszcze sprawdzić, jaki był wynik if'a w makro -&amp;gt;.&lt;pre class="brush: clojure"&gt; user=&amp;gt; (seq? (- 3))&lt;br /&gt; false&lt;/pre&gt;Zatem wyliczenie (-&amp;gt; 2 (- 3)) sprowadza się do konstrukcji (list form x), tj. (list - 3 2), a to daje:&lt;pre class="brush: clojure"&gt; user=&amp;gt; (list - 3 2)&lt;br /&gt; (#&amp;lt;core$___4506 clojure.core$___4506@16de49c&amp;gt; 3 2)&lt;/pre&gt;Sprawdźmy, co da wywołanie tego funkcją &lt;span style="font-weight:bold;"&gt;eval&lt;/span&gt;.&lt;pre class="brush: clojure"&gt; user=&amp;gt; (eval (list - 3 2))&lt;br /&gt; 1&lt;/pre&gt;Źle! Chyba popełniłem jakiś błąd w rozumowaniu, jaki argument jest przekazywany do seq?, bo w końcu zgodnie z definicją formy, zapis (- 3) nią jest! Biorąc więc pod uwagę moje niedoświadczenie i możliwe pomyłki w rozumowaniu, wchodzimy w sekcję if'a, bo wtedy wszystko jest cacy - 2 staje się drugim argumentem dla odejmowania, a 3 trzecim. Owe szlaczki w makro to sposób na tworzenie kodu w fazie wczytywania programu w Clojure (zaraz przez kompilacją i uruchomieniem), w której następuje rozwiązywanie makr, których celem jest uproszczenie życia programistom przez generowanie bardziej złożonego kodu (po co klepać kilkakrotnie to samo w wielu liniach, jeśli możemy zdefiniować makro raz i wywoływać wielokrotnie w jednej?! "Cudo" znane programistom C/C++).&lt;br /&gt;&lt;br /&gt;Wciąż jednak nie rozumiałem, co jest takiego specjalnego w tym makro, aż trafiłem na &lt;a href="http://www.lexparse.com/category/clojure/"&gt;LexParse&lt;/a&gt;, gdzie padła wzmianka o &lt;span style="font-weight:bold;"&gt;potoku&lt;/span&gt; (ang. &lt;span style="font-style:italic;"&gt;pipeline&lt;/span&gt;). Teraz było znacznie łatwiej zrozumieć, co autor miał na myśli. Aczkolwiek do pełnego zrozumienia daleko (pewnie za mało wciąż napisanych programów w Clojure).&lt;pre class="brush: clojure"&gt; user=&amp;gt; (-&amp;gt; 2 {2 "dwa"} {"dwa" "DWA"})&lt;br /&gt; "DWA"&lt;/pre&gt;Spróbuj samodzielnie znaleźć odpowiedź dlaczego w wyniku otrzymaliśmy "DWA", albo poniżej true:&lt;pre class="brush: clojure"&gt; user=&amp;gt; (-&amp;gt; '(0 0 0) (count) (odd?))&lt;br /&gt; true&lt;/pre&gt;Doświadczenia z Clojure skończyłem artykułem &lt;a href="http://java.ociweb.com/mark/clojure/article.html"&gt;Clojure - Functional Programming for the JVM&lt;/a&gt;, którego autorem jest &lt;span style="font-weight:bold;"&gt;R. Mark Volkmann&lt;/span&gt;. Tam znalazłem wzmiankę o &lt;a href="http://en.wikipedia.org/wiki/Simon_Peyton_Jones"&gt;Simon Peyton-Jones&lt;/a&gt;, który włożył wiele wysiłku w Haskella (czysty język funkcyjny) i miał powiedzieć w &lt;a href="http://oscon.blip.tv/file/324976"&gt;OSCON 2007 - Simon Peyton-Jones - A Taste of Haskell Part I&lt;/a&gt;: &lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;"In the end, any program must manipulate state. A program that has no side effects whatsoever is a kind of black box. All you can tell is that the box gets hotter."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;i dalej już od autora artykułu: &lt;span style="font-style:italic;"&gt;The key is to limit side effects, clearly identify them, and avoid scattering them throughout the code.&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;Warto również wspomnieć o leniwym rozwiązywaniu/wyliczaniu sekwencji - &lt;span style="font-weight:bold;"&gt;leniwych sekwencjach&lt;/span&gt; (ang. &lt;span style="font-style:italic;"&gt;lazy sequences&lt;/span&gt;) (a może trafniej będzie nazywać je opóźnionymi czy nawet ospałymi czy w końcu uśpionymi sekwencjami?). Elementy w sekwencji nie są wyliczane, aż do momentu ich użycia, co pozwala na tworzenie nieskończonych ciągów danych bez narażania się na wysycenie sterty pamięci JVM. Ta cecha Clojure uzmysłowiła mi o możliwym podejściu w Javie, w której zwykle (zawsze?) wyliczamy wszystkie elementy, nawet jeśli ich nie potrzebujemy. Weźmy za przykład tablicę 150-elementową, albo jeszcze dłuższą. W Javie, w zależności od typu elementów, wielkość potrzebna na ich przechowanie musi być dostępna w trakcie deklaracji. Alternatywą mogłoby być stworzenie takiej kolekcji, w której podajemy liczbę elementów i tyle, a kiedy potrzebny będzie piąty, dziesiąty, czy którykolwiek inny element, wyliczamy go dokładnie w momencie zapytania o niego. Nie sądzę, abym kiedykolwiek myślał o programowaniu w Javie w ten sposób (może dlatego, że po prostu nie miałem okazji?!). Na szczęście nie musimy już tego implementować w Javie, bo mamy Clojure, więc chociażby dla tego warto zwrócić się ku niemu.&lt;br /&gt;&lt;br /&gt;Bardzo przypadł mi do gustu następujący akapit:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Is Clojure code hard to understand? Imagine if every time you read Java source code and encountered syntax elements like if statements, for loops, and anonymous classes, you had to pause and puzzle over what they mean. There are certain things that must be obvious to a person who wants to be a productive Java developer. Likewise there are parts of Clojure syntax that must be obvious for one to efficiently read and understand code.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Podobnie będzie z dowolnym językiem mówionym - angielski prosty, niemiecki również, pewnie podobnie z francuskim, czy hiszpańskim, nie wspominając o rosyjskim czy w ogóle słowiańskich. Nasłuchaliśmy się ich wokoło i teraz po prostu przywykliśmy do ich konstrukcji. Brakuje nam zrozumienia ich semantyki, więc chodzimy na drogie kursy licząc, że cudem bez specjalnego wysiłku mentalnego wejdą nam w przysłowiowe 5 minut. Wtedy również zadamy sobie pytanie o sensowność nauki kolejnego języka skoro mówimy, piszemy i czytamy po angielsku. Przypomina mi to pytanie o sensowność uczenia się Clojure. Po co się go uczyć skoro znamy Javę? Po co uczyć się kolejnego języka mówionego, znając angielski? Dla mnie, odpowiedź nasuwa się sama - z ciekawości, co tracimy nie potrafiąc posługiwać się językiem, którym władają inni. Czy Clojure jest tym językiem, który należałoby poznać? Nie wiem. Wiem jednak, że należy chociażby spróbować zrozumieć programowanie funkcyjne, aby zastosować go tam, gdzie programowanie obiektowe czy imperatywne nie przystaje. Jeśli znamy tylko OO, to jak tu mówić o zdrowym rozsądku? Dobrze ujął to &lt;a href="http://en.wikiquote.org/wiki/Abraham_Maslow"&gt;Abraham Maslow&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;I suppose it is tempting, if the only tool you have is a hammer, to treat everything as if it were a nail.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;bądź, jak to jest częściej przywoływane:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;If the only tool you have is a hammer, you tend to see every problem as a nail.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Niestety nie wiem, jak miałoby to brzmieć po polsku :(&lt;br /&gt;&lt;br /&gt;Właśnie kiedy miałem opublikować wpis, zajrzałem jeszcze do źródeł Clojure i trafiłem na funkcję &lt;span style="font-weight:bold;"&gt;clojure-version&lt;/span&gt;. Trywialna, aczkolwiek wciąż pouczająca implementacja (której pewnie jeszcze samodzielnie nie dałbym rady napisać):&lt;pre class="brush: clojure"&gt; user=&amp;gt; (clojure-version)&lt;br /&gt; "1.1.0-alpha-SNAPSHOT"&lt;/pre&gt;Jeśli doczytałeś/-aś do tego miejsca, to może i wytrwałeś/-aś z czytaniem podanego wyżej artykułu o Clojure. Jeśli tak, to w sekcji o mapach (Maps) jest wzmianka o...makrze -&amp;gt; (!)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;The -&amp;gt; macro, referred to as the "thread" macro, calls a series of functions, passing the result of each as an argument to the next. For example the following lines have the same result:&lt;br /&gt;&lt;br /&gt;(f1 (f2 (f3 x)))&lt;br /&gt;(-&amp;gt; x f3 f2 f1)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Teraz już jest jasne, co makro -&amp;gt; robi. W ramach nauki Clojure pozostaje więc nauczyć się jego implementacji na pamięć, aby kolejnym razem napisać podobne.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-9014094405617925111?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/GSx8VhPq-Y8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/9014094405617925111/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=9014094405617925111" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/9014094405617925111?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/9014094405617925111?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/11/clojure-zrozumiec-makro-thread.html" title="(-&gt; Clojure zrozumieć-makro-thread przeczytać-artykuł opisać-na-blogu)" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;D0YCQnw_eip7ImA9WxNUGEQ.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-6140833109174655168</id><published>2009-11-10T23:09:00.000+01:00</published><updated>2009-11-11T00:19:23.242+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-11T00:19:23.242+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Środowisko programistyczne dla Clojure i poprzedni przykład funkcjonalniej</title><content type="html">Nasze praktyczne przygody z &lt;a href="http://clojure.org"&gt;Clojure&lt;/a&gt; możemy zacząć od instalacji wymaganego oprogramowania i/lub uruchomienia Clojure REPL lokalnie, albo skorzystać z &lt;a href="http://lotrepls.appspot.com/"&gt;Lord of the REPLs&lt;/a&gt;. Interesująca alternatywa, nie tylko pomocna w nauce Clojure, ale i Groovy, Ruby czy Scala.&lt;br /&gt;&lt;br /&gt;Kiedy jednak nasze doświadczenie w programowaniu funkcyjnym w Clojure zacznie wykraczać poza proste aplikacje będące złożeniem kilku funkcji i spróbujemy wyjść poza ramy REPL możemy skorzystać ze wsparcia udostępnianego przez zintegrowane środowiska programistyczne, np. NetBeans IDE, Eclipse IDE czy IntelliJ IDEA. Wystarczy doszukać się właściwej wtyczki (rozszerzenia) i możemy czerpać garściami z pomocy IDE - możemy chociażby znieść z siebie trud dbania o nawiasy. Dla NetBeans IDE mamy &lt;a href="http://enclojure.org/"&gt;Enclojure&lt;/a&gt;. Ostatnia wersja z &lt;a href="http://cloud.github.com/downloads/EricThorsen/enclojure/enclojure-plugin-2009-11-3.nbm"&gt;3.11&lt;/a&gt;, więc dostatecznie świeża, aby uwierzyć w aktywny jej rozwój. Dla środowiska Eclipse IDE mamy &lt;a href="http://code.google.com/p/clojure-dev/"&gt;Clojure plug-in for Eclipse (clojure-dev)&lt;/a&gt;, o której dowiedziałem się w artykule &lt;a href="http://www.ibm.com/developerworks/opensource/library/os-eclipse-clojure/index.html"&gt;The Clojure programming language - Take advantage of the Clojure plug-in for Eclipse&lt;/a&gt;. Stawiam na NetBeans IDE i Enclojure.&lt;br /&gt;&lt;br /&gt;Dla bloggerów istnieje podświetlanie składni dla Clojure w ramach Syntax Highlighter 2.0 - &lt;a href="http://www.undermyhat.org/blog/2009/09/list-of-brushes-syntaxhighligher/"&gt;All Syntax Highlighter 2.0 brushes collected, described and downloadable&lt;/a&gt;. Można zobaczyć go w działaniu w moich wpisach dotyczących Clojure, chociażby ten. Jeśli więc przyjdzie zaprezentować swoje cudo w Clojure szerokiej publiczności na własnym blogu warto podeprzeć się stylem clojure. Znacznie uatrakcyjnia prezentację kodu.&lt;br /&gt;&lt;br /&gt;A skoro mamy środowisko możemy powrócić do naszego przykładu z surowcami, której wersja bardziej przypominająca wersję funkcjonalną (dosłownie i w przenośni) wygląda teraz następująco:&lt;pre class="brush: clojure"&gt; (ns pl.jaceklaskowski.clojure)&lt;br /&gt;&lt;br /&gt; (defn czas-zwiekszenia-produkcji&lt;br /&gt;  "Wylicza potrzebny czas (w minutach) do osiagniecia stanu magazynowego na uruchomienie rozbudowy do poziomu przy danej produkcji"&lt;br /&gt;  [docelowo, magazyn, produkcja]&lt;br /&gt;  (let [teraz (java.util.Calendar/getInstance)]&lt;br /&gt;   (. teraz (add (java.util.Calendar/MINUTE)&lt;br /&gt;    (* 60 (reduce max (map / (map - (map #(.getValue %) docelowo) (map #(.getValue %) magazyn)) (map #(.getValue %) produkcja))))))&lt;br /&gt;   (. teraz getTime)))&lt;/pre&gt;Widać wyraźne zwiększenie konstrukcji PF z &lt;span style="font-weight:bold;"&gt;reduce&lt;/span&gt; i &lt;span style="font-weight:bold;"&gt;map&lt;/span&gt;. Poza samym wyliczeniem, za ile nastąpi zwiększenie (w linii 8.) mamy również wyliczoną dokładną godzinę, kiedy to nastąpi (linie 6., 7. i 9.)&lt;br /&gt;&lt;br /&gt;Zamiast dłubania w REPL zapisujemy cały program w pliku &lt;span style="font-style:italic;"&gt;czas-zwiekszenia-produkcji.clj&lt;/span&gt;. Zwyczajowo skrypty w Clojure zapisywane są z rozszerzeniem &lt;span style="font-weight:bold;"&gt;.clj&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Tworzymy kolejny skrypt testowy &lt;span style="font-style:italic;"&gt;skrypt-testowy.clj&lt;/span&gt;, który zweryfikuje poprawność działania.&lt;pre class="brush: clojure"&gt; (load-file "czas-zwiekszenia-produkcji.clj")&lt;br /&gt;&lt;br /&gt; (ns pl.jaceklaskowski.clojure)&lt;br /&gt;&lt;br /&gt; (def magazyn {:drewno 10 :glina 10 :zelazo 10 :zboze 10})&lt;br /&gt; (def docelowo {:drewno 20 :glina 20 :zelazo 20 :zboze 20})&lt;br /&gt; (def produkcja {:drewno 5 :glina 5 :zelazo 5 :zboze 5})&lt;br /&gt;&lt;br /&gt; (println (czas-zwiekszenia-produkcji docelowo magazyn produkcja))&lt;/pre&gt;Uruchomienie to po prostu wykonanie:&lt;pre class="brush: clojure"&gt; $ java -jar clojure-1.1.0-alpha-SNAPSHOT.jar skrypt-testowy.clj&lt;br /&gt; #&amp;lt;Date Tue Nov 10 23:36:07 CET 2009&amp;gt;&lt;/pre&gt;I tak kończy się moje poszukiwanie ładniejszej (=bardziej funkcyjnej) wersji &lt;span style="font-style:italic;"&gt;czas-zwiekszenia-produkcji&lt;/span&gt;. Oczywiście nie kończy to mojej przygody z Clojure i jeśli kiedykolwiek pomyślałem, aby sobie odpuścić, bo i po co mi PF, to wizyta na blogu &lt;a href="http://blog.bestinclass.dk/"&gt;BEST IN CLASS&lt;/a&gt; jest faktycznie najlepszym w swojej klasie i nie pozwala zapomnieć o możliwościach Clojure. Warto tam zajrzeć w wolnej chwili, szczególnie w chwilach zwątpienia. Mnie zachwycił i upewnił w postanowieniu poznania go dokładniej.&lt;br /&gt;&lt;br /&gt;W kolejnym podejściu postaram się zrozumieć o co chodzi w makro &lt;span style="font-weight:bold;"&gt;-&amp;gt;&lt;/span&gt; oraz funkcji &lt;span style="font-weight:bold;"&gt;line-seq&lt;/span&gt; z core.clj jak zasugerował &lt;span style="font-weight:bold;"&gt;Michael&lt;/span&gt; w &lt;a href="http://jlaskowski.blogspot.com/2009/11/programowanie-w-clojure-czesc-2.html?showComment=1257777495973#c5166828619663572422"&gt;komentarzu&lt;/a&gt; do ostatniego mojego wpisu o Clojure - &lt;a href="http://jlaskowski.blogspot.com/2009/11/programowanie-w-clojure-czesc-2.html"&gt;Programowanie w Clojure - część 2 - pierwszy przykład z wyliczaniem surowców&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-6140833109174655168?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/FQrPQczZRTY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/6140833109174655168/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=6140833109174655168" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/6140833109174655168?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/6140833109174655168?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/11/srodowisko-programistyczne-dla-clojure.html" title="Środowisko programistyczne dla Clojure i poprzedni przykład funkcjonalniej" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DkYMRXg8eyp7ImA9WxNUFkU.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-1923615073432913275</id><published>2009-11-08T13:28:00.004+01:00</published><updated>2009-11-08T13:43:04.673+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-08T13:43:04.673+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Programowanie w Clojure - część 2 - pierwszy przykład z wyliczaniem surowców</title><content type="html">Nasze ćwiczenia z programowania w &lt;a href="http://clojure.org"&gt;Clojure&lt;/a&gt; zaczniemy od uruchomienia &lt;span style="font-weight:bold;"&gt;Clojure REPL&lt;/span&gt; (Read-Eval-Print-Loop). Clojure REPL jest niczym innym jak interaktywnym interpreterem dla Clojure.&lt;pre class="brush: clojure"&gt; jlaskowski@work /cygdrive/c/oss/clojure&lt;br /&gt; $ java -jar clojure-1.1.0-alpha-SNAPSHOT.jar&lt;br /&gt; Clojure 1.1.0-alpha-SNAPSHOT&lt;br /&gt; user=&amp;gt;&lt;/pre&gt;Od tej pory zakładam, że wiemy, w jaki sposób dostać znak zachęty jak wyżej.&lt;br /&gt;&lt;br /&gt;Powiedzmy, że chcemy wyliczyć liczbę surowców do wybudowania pewnej jednostki (w szczególności podniesienia poziomu samego surowca, aby dawał znacznie większą produkcję niż obecnie). Mamy 4 rodzaje surowców, które nazwiemy: drewno, glina, żelazo i zboże. Całkiem typowe w wielu grach strategicznych. Na celownik weźmiemy &lt;a href="http://pl.wikipedia.org/wiki/Travian"&gt;Traviana&lt;/a&gt;. Trochę czasu mi z nim zeszło i zawsze zastanawiałem się, czy jestem w stanie stworzyć system-bota, który podpowiadałby mi najlepszą strategię. Ktoś kiedyś wspominał coś o programowaniu nieliniowym odnośnie tego rodzaju kalkulacji, ale pojawiała się również wzmianka o programowaniu funkcyjnym. Ile w tym prawdy nigdy nie doszedłem, jednakże tym razem mam możliwość choć po części sprawdzić się w Clojure jako języku funkcyjnym do rozwiązania, albo chociaż próby rozwiązania, tego problemu. To byłby taki system ekspertowy, który podpowiadałby mi różne strategie (pewnie za nim stoi cała masa teorii matematycznej z różnymi modelami, ale ja wybieram podejście naiwne bez zebrania wcześniej wystarczającej wiedzy, tj. "na żywioł" :)). Do zbudowania gliny na 1. poziomie (tak, z każdą jednostką mamy związaną cechę - poziom) potrzeba 80 drewna, 40 gliny, 80 żelaza i 50 zboża (patrz &lt;a href="http://pdt-clan.info/wordpress/?page_id=42"&gt;1.1.11 Kopalnia gliny&lt;/a&gt;). Każda wioska ma swoją produkcję i zakładam, że początkowo produkcja jest na 0. Najpierw spróbuję odpowiedzieć na pytanie, ile czasu potrzeba, abym podniósł produkcję gliny przy aktualnym stanie magazynu i produkcji surowców.&lt;br /&gt;&lt;br /&gt;Mamy więc założenia do funkcji, którą w Javie moglibyśmy nazwać &lt;span style="font-style:italic;"&gt;obliczCzasDoZwiekszeniaProdukcji(surowca, naPoziom, przyObecnymStanieMagazynowym, przyObecnejProdukcji)&lt;/span&gt;. Nazwy funkcji w Clojure są zazwyczaj ciągiem słów oddzielonych myślnikami, co daje w naszym przypadku czas-zwiekszenia-produkcji (zakładając, że celem funkcji jest obliczenie czegoś nie widzę potrzeby powtarzania tego w nazwie funkcji).&lt;br /&gt;&lt;br /&gt;Zaczynam od definicji magazynu. Będzie to mapa, która w Clojure deklarowana jest przez &lt;span style="font-weight:bold;"&gt;{}&lt;/span&gt; (nawiasy klamrowe), między którymi ciąg elementów tworzy pary klucz-wartość. Przecinki są opcjonalne i traktowane dokładnie jak spacja, czyli taki zapis&lt;pre class="brush: clojure"&gt; user=&amp;gt; (def magazyn {:drewno 0 :glina 0 :zelazo 0 :zboze 0})&lt;br /&gt; #'user/magazyn&lt;/pre&gt;jest równoznaczny takiemu:&lt;pre class="brush: clojure"&gt; user=&amp;gt; (def magazyn {:drewno 0, :glina 0, :zelazo 0, :zboze 0})&lt;br /&gt; #'user/magazyn&lt;/pre&gt;W definiowaniu mapy skorzystałem z możliwości definiowania słów kluczowych w Clojure z użyciem &lt;span style="font-weight:bold;"&gt;:&lt;/span&gt; (dwukropek). Wartością słów kluczowych są one same, więc idealnie nadają się na klucze w mapie.&lt;pre class="brush: clojure"&gt; user=&amp;gt; :cokolwiek&lt;br /&gt; :cokolwiek&lt;/pre&gt;Jak większość (wszystko?) w Clojure, tak i mapa jest funkcją, której pojedynczym argumentem jest klucz.&lt;pre class="brush: clojure"&gt; user=&amp;gt; (magazyn :drewno)&lt;br /&gt; 0&lt;/pre&gt;Również odwrotne spojrzenie jest poprawne, tj. słowa kluczowe są również funkcją, której argumentem jest mapa, w której się odszukują (!)&lt;pre class="brush: clojure"&gt; user=&amp;gt; (:drewno magazyn)&lt;br /&gt; 0&lt;/pre&gt;Takie spojrzenie na mapę i jej kluczy było dla mnie niezwykłym doświadczeniem mentalnym :) W sumie to logiczne, aby potraktować w ten sposób struktury danych, a zmienia całkowicie moje dotychczasowe spojrzenie obiektowe. Skoro wszystko jest funkcją, jedynym problemem pozostaje poznanie ich zasady działania (semantyki). Niby proste i pamiętam, że kiedy uczyłem się żonglować, co wydawało mi się początkowo niezwykle trudne i w zasadzie poza zasięgiem, kiedy oduczyłem się złego sposobu podawania piłeczki z ręki do ręki, nauczenie się poprawnie przez przerzucanie piłeczek było dziecinnie proste. Mówi się, że jedynym problemem w nauce nowego są nasze własne przyzwyczajenia i obawy. Chyba dlatego tak trudno jest się uczyć z wiekiem - zbyt wiele doświadczenia, które nas ogranicza?!&lt;br /&gt;&lt;br /&gt;Do definicji funkcji w Clojure używamy &lt;span style="font-weight:bold;"&gt;defn&lt;/span&gt;, w której w cudzysłowach dodajemy opis funkcji, a w nawiasach kwadratowych parametry wejściowe.&lt;pre class="brush: clojure"&gt; (defn czas-zwiekszenia-produkcji&lt;br /&gt;  "Wylicza potrzebny czas do zwiekszenia produkcji surowca na danym poziom przy danym stanie magazynowym i produkcji"&lt;br /&gt;  [surowiec, poziom, stanMagazynowy, produkcja]&lt;br /&gt;  ...&lt;br /&gt; )&lt;/pre&gt;Chwilowo zamiast parametru wejściowego poziom będącym liczbą całkowitą przekażemy mapę z potrzebnymi surowcami do przejścia na dany poziom.&lt;pre class="brush: clojure"&gt; user=&amp;gt; (def poziom1 {:drewno 80 :glina 40 :zelazo 80 :zboze 50})&lt;br /&gt; #'user/poziom1&lt;/pre&gt;W takim przypadku sam surowiec nie ma znaczenia, bo w końcu na wejściu mamy stan początkowy (stan magazynowy), stan docelowy i produkcję (przyrost jednostek w czasie 1h). Definicja funkcji mogłaby wyglądać tak:&lt;pre class="brush: clojure"&gt;  (defn czas-zwiekszenia-produkcji&lt;br /&gt;  "Wylicza potrzebny czas do osiagniecia stanu magazynowego na uruchomienie rozbudowy do poziomu przy danej produkcji"&lt;br /&gt;  [stanDocelowy, stanMagazynowy, produkcja]&lt;br /&gt;  ...&lt;br /&gt; )&lt;/pre&gt;Wszystkie parametry wejściowe są mapami.&lt;br /&gt;&lt;br /&gt;Wywołanie funkcji w Clojure jest listą, której pierwszym elementem jest nazwa funkcji, a po nim następują parametry wejściowe.&lt;pre class="brush: clojure"&gt; user=&amp;gt; (czas-zwiekszenia-produkcji docelowo magazyn produkcja)&lt;/pre&gt;Dodając do tego możliwość importowania typów javowych przez &lt;span style="font-weight:bold;"&gt;import&lt;/span&gt; oraz ich wywoływania przez &lt;span style="font-weight:bold;"&gt;.&lt;/span&gt; (kropka) czy &lt;span style="font-weight:bold;"&gt;/&lt;/span&gt; (ukośnik) otrzymujemy ostatecznie następujący program w Clojure do obliczania czas potrzebnego do zwiększenia produkcji surowca przy danym magazynie i bieżącej produkcji.&lt;pre class="brush: clojure"&gt; (def magazyn {:drewno 10 :glina 4 :zelazo 15 :zboze 0})&lt;br /&gt;&lt;br /&gt; (def produkcja {:drewno 5 :glina 2 :zelazo 5 :zboze 4})&lt;br /&gt;&lt;br /&gt; (def glina1 {:drewno 80 :glina 40 :zelazo 80 :zboze 5})&lt;br /&gt;&lt;br /&gt; (import '(java.util Calendar))&lt;br /&gt;&lt;br /&gt; (def teraz (Calendar/getInstance))&lt;br /&gt;&lt;br /&gt; (defn czas-zwiekszenia-produkcji&lt;br /&gt;  "Wylicza potrzebny czas (w minutach) do osiagniecia stanu magazynowego na uruchomienie rozbudowy do poziomu przy danej produkcji"&lt;br /&gt;  [docelowo, magazyn, produkcja]&lt;br /&gt;  (max&lt;br /&gt;   (/ (- (docelowo :drewno)(magazyn :drewno)) (produkcja :drewno))&lt;br /&gt;   (/ (- (docelowo :glina)(magazyn :glina)) (produkcja :glina))&lt;br /&gt;   (/ (- (docelowo :zelazo)(magazyn :zelazo)) (produkcja :zelazo))&lt;br /&gt;   (/ (- (docelowo :zboze)(magazyn :zboze)) (produkcja :zboze)))&lt;br /&gt; )&lt;br /&gt;&lt;br /&gt; (. teraz add (Calendar/MINUTE) (* 60 (czas-zwiekszenia-produkcji glina1 magazyn produkcja)))&lt;br /&gt;&lt;br /&gt; (. teraz getTime)&lt;/pre&gt;Kopiując każdą z linii do REPL mamy:&lt;pre class="brush: clojure"&gt; $ java -jar clojure-1.1.0-alpha-SNAPSHOT.jar&lt;br /&gt; Clojure 1.1.0-alpha-SNAPSHOT&lt;br /&gt; user=&amp;gt; (def magazyn {:drewno 10 :glina 4 :zelazo 15 :zboze 0})&lt;br /&gt; #'user/magazyn&lt;br /&gt; user=&amp;gt; (def produkcja {:drewno 5 :glina 2 :zelazo 5 :zboze 4})&lt;br /&gt; #'user/produkcja&lt;br /&gt; user=&amp;gt; (def glina1 {:drewno 80 :glina 40 :zelazo 80 :zboze 5})&lt;br /&gt; #'user/glina1&lt;br /&gt; user=&amp;gt; (import '(java.util Calendar))&lt;br /&gt; java.util.Calendar&lt;br /&gt; user=&amp;gt; (def teraz (Calendar/getInstance))&lt;br /&gt; #'user/teraz&lt;br /&gt; user=&amp;gt; (defn czas-zwiekszenia-produkcji&lt;br /&gt;  "Wylicza potrzebny czas (w minutach) do osiagniecia stanu magazynowego na uruchomienie rozbudowy do poziomu przy danej produkcji"&lt;br /&gt;  [docelowo, magazyn, produkcja]&lt;br /&gt;  (max&lt;br /&gt;   (/ (- (docelowo :drewno)(magazyn :drewno)) (produkcja :drewno))&lt;br /&gt;   (/ (- (docelowo :glina)(magazyn :glina)) (produkcja :glina))&lt;br /&gt;   (/ (- (docelowo :zelazo)(magazyn :zelazo)) (produkcja :zelazo))&lt;br /&gt;   (/ (- (docelowo :zboze)(magazyn :zboze)) (produkcja :zboze)))&lt;br /&gt; )&lt;br /&gt; #'user/czas-zwiekszenia-produkcji&lt;br /&gt; user=&amp;gt; (. teraz add (Calendar/MINUTE) (* 60 (czas-zwiekszenia-produkcji glina1 magazyn produkcja)))&lt;br /&gt; nil&lt;br /&gt; user=&amp;gt; (. teraz getTime)&lt;br /&gt; #&amp;lt;Date Mon Nov 09 07:16:59 CET 2009&amp;gt;&lt;/pre&gt;Wersja bardziej funkcyjna z map i reduce w kolejnym wpisie. Zdecydowanie zbyt wiele w tej wersji argumentów do max. Można się zapisać na śmierć z tymi kluczami w mapach i samym wprowadzaniem programu do wykonania. Wasze propozycje mile widziane, bo moja przygoda z programowaniem funkcyjnym z Clojure dopiero się zaczęła i wpadki są wręcz oczekiwane.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-1923615073432913275?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/XMfkqT8F-4o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/1923615073432913275/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=1923615073432913275" title="Komentarze (6)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/1923615073432913275?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/1923615073432913275?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/11/programowanie-w-clojure-czesc-2.html" title="Programowanie w Clojure - część 2 - pierwszy przykład z wyliczaniem surowców" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total></entry><entry gd:etag="W/&quot;CE8BQnw5fCp7ImA9WxNUFEg.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-1012633874460643035</id><published>2009-11-05T21:11:00.002+01:00</published><updated>2009-11-05T21:27:33.224+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-05T21:27:33.224+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="warszawa-jug" /><title>55. spotkanie Warszawa JUG - "Zastosowanie BPELa w praktyce" Rafała Rusina i Macieja Próchniaka</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.warszawa.jug.pl"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 132px; height: 200px;" src="http://groups.google.com/group/warszawa-jug/web/WarszawaJUG.gif?display=thumb&amp;width=200&amp;height=200" border="0" alt="" /&gt;&lt;/a&gt;&lt;a href="http://www.warszawa.jug.pl"&gt;Warszawska Grupa Użytkowników Technologii Java (Warszawa JUG)&lt;/a&gt; zaprasza na 55. spotkanie, które odbędzie się w najbliższy wtorek, 10.11.2009 o godzinie 18:00 w sali 5440 Wydziału MIMUW przy ul. Banacha 2 w Warszawie.&lt;br /&gt;&lt;br /&gt;Temat prezentacji: &lt;b&gt;Zastosowanie BPEL'a w praktyce przy użyciu Apache ODE, Apache ServiceMix i SoapUI&lt;/b&gt;&lt;br /&gt;Prelegenci: &lt;b&gt;Rafał Rusin (TouK)&lt;/b&gt;, &lt;b&gt;Maciej Próchniak (TouK)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;W trakcie prezentacji Rafał i Maciej opowiedzą o połączeniu Apache ODE i Apache ServiceMix. Rozpoczniemy od wstępu do BPELa i jego ideologii oraz prostego przykładu połączenia kilku serwisów ODE z ServiceMixem. Będzie to podstawą do omówienia różnych kwesti, które sprawiły im najwięcej trudności podczas projektu i sposoby ich rozwiązywania. SoapUI znajdzie swoje miejsce w arsenale programisty jako wygodne narzędzie do testowania serwisów.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Rafał Rusin&lt;/b&gt; jest absolwentem Uniwersystetu Warszawskiego. W TouK pracuje od 2004 roku. Zajmowałem się developmentem i architekturą wielu komercyjnych projektów w tym czasie. Tematyka procesów biznesowych towarzyszyła mu już w tamym okresie. Ostatnio postanowił zastować projekt Apache ODE do większego projektu komercyjnego, który sprawił, że pojawiło się kilka poprawek i rozszerzeń ODE, co z kolei skończyło się nieoczekiwanym zaproszeniem Rafała jako członka zespołu sterującego Apache ODE PMC.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Maciej Próchniak&lt;/b&gt; jest absolwentem matematyki Uniwersystetu Warszawskiego. W poprzednich latach tworzył w Javatechu aplikacje webowe. Obecnie zajmuje się utrzymaniem oraz testowaniem procesów biznesowych napisanych w BPELu, a także architekturą i implementacją komponentów ServiceMix'owych.&lt;br /&gt;&lt;br /&gt;Planowany czas prezentacji to 1,5 godziny, po której planuje się 15-30-minutową dyskusję.&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;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-1012633874460643035?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/TfPqT6dy1-c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/1012633874460643035/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=1012633874460643035" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/1012633874460643035?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/1012633874460643035?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/11/55-spotkanie-warszawa-jug-zastosowanie.html" title="55. spotkanie Warszawa JUG - &quot;Zastosowanie BPELa w praktyce&quot; Rafała Rusina i Macieja Próchniaka" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;Ck4EQn0_eSp7ImA9WxNUEkQ.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-7232904326011722674</id><published>2009-11-03T23:35:00.002+01:00</published><updated>2009-11-04T00:28:23.341+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-04T00:28:23.341+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="różne" /><title>(wady) Agile - Dyskusja</title><content type="html">Najwyraźniej ostatnia Warsjawa 2009 (patrz moja relacja &lt;a href="http://jlaskowski.blogspot.com/2009/10/wrazenia-z-sobotniej-zwinnej-warsjawy.html"&gt;Wrażenia z sobotniej, zwinnej Warsjawy 2009&lt;/a&gt;) pokazała niedosyt "lekkich" tematów o Scrumie/Agile podczas spotkań i konferencji organizowanych przez &lt;a href="http://www.warszawa.jug.pl"&gt;Warszawa JUG&lt;/a&gt;, bądź też w samej Warszawie. Na forum grupy rozgorzała dyskusja &lt;a href="http://groups.google.com/group/warszawa-jug/browse_thread/thread/5c4a514780b29429"&gt;[warszawa-jug] (wady) Agile - Dyskusja&lt;/a&gt;, w której moim faworytem stał się nieznany mi wcześniej &lt;span style="font-weight:bold;"&gt;Adam Lider&lt;/span&gt; (nota bene, nazwisko mówi samo za siebie), który &lt;a href="http://groups.google.com/group/warszawa-jug/msg/1469c8492e3798db"&gt;napisał&lt;/a&gt; (cytuję za pozwoleniem Adama w całości):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Po kilku latach doswiadczenia z lekkimi metodykami jestem sceptycznie nastawiony do Scruma. Uwazam ze jest to metoda, ktora moze nawet wyrzadzic krzywde filozofii Agile. Wytwarzanie oprogramowania jest rzemioslem trudnym, wymagajacym wiedzy, doswiadczenia, a przede wszystkim dyscypliny. Aby dojsc do "mistrzostwa" trzeba po prostu duzo pracy. Natomiast Scrum jest czesto widziany jako rozwiazanie dla zespolow, ktore sobie nie radza. Niestety zdecydowana wiekszosc tych zespolow zbudowana jest z malo lub srednio doswiadczonych ludzi i Scrum moze im niewiele pomoc a nawet zaszkodzic, poprzez koncepcje samoorganizujacego sie zespolu. Jak ja moge wiedziec co jest dla mnie dobre skoro malo jeszcze doswiadczylem? Najczesciej nie wiem. Co wiecej wprowadzenie Scruma do takich zespolow wprowadza rodzaj sztucznego uporzadkowania, w ktorym czesto wieksza wage przewiazuje sie do pielegnacji Scruma niz projektu. Tam gdzie Scrum dziala to najczesniej zespoly zbudowane z bardzo dobrych ludzi, a Scrum jest tylko (bardzo waznym) smarem dla dobrego mechanizmu.Dla zespolow mniej doswiadczonych zdecydowanie bardziej polecam XP. Dla mnie glowna roznica w stosunku do Scruma to zdecyowanie wiekszy nacisk na czysto techniczne praktyki tj. TDD, No bugs, Done Done z podkresleniem, ze musisz stosowac wszystko i nie jutro, ale dzisiaj. Praktykowanie TDD nie jest latwe i wiekszosc mniej doswiadczoncyh zespolow pracujacych pod etykieta Scrum (lub bez) po prostu odklada w czasie zastosowanie tej (lub innych rownie wymagajacych) praktyki (w koncu sami sie organizujemy i skoro to dla nas trudne, mozemy to zaczac pozniej). Jak sie ma kiepskich rzemieslnikow to Scrum niewiele pomoze. To troche tak jak z nasza reprezentacja pilki noznej - czy wierzycie ze z super taktyka super trenera nasi kopacze zdobyliby puchar w 2012? Moze i zagraliby lepiej, a moze wrecz przeciwnie bo np. kluczem dla taktyki bylaby gra z pierwszej pilki, a to trzeba umiec.&lt;br /&gt;&lt;br /&gt;Moj glowny zarzut dla tej metody to proba wmowienia, ze wytwarzanie oprogramowania moze byc efektywne i dosc latwe (ze Scrumem), z niedostateczny podkresleniem wagi rzemiosla zespolu i jego czlonkow.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ta wypowiedź dokładnie wyraża mój pogląd na temat lekkich metodyk, które mimo swojej nazwy nie są wcale lekkimi we wdrożeniu, bo ich lekkość jest zauważalna dopiero, kiedy zespół jest doświadczony, aby pozwolić sobie na samoorganizowanie i dyscyplinę pracy. Skąd niby członkowie młodych zespołów (doświadczeniem nie wiekiem) mieliby wiedzieć, czego chcą, jeśli ich jedyną potrzebą jest skończyć projekt (nic nadzwyczajnego, normalka) w technologi, którą dopiero poznają, bo wszyscy wkoło mówili, że fajna?! Przejaskrawiam z tą nową technologią, ale traktuję go jedynie jako przykład i możnaby tutaj podstawić wszystko inne, które kojarzy nam się z fantazją młodych zespołów. Tutaj podkreślam, że zwykle w takich zespołach panuje przekonanie, że fajna technologia będzie panaceum na brak doświadczenia zespołu oraz skróci czas, tak że projekt nie tylko, że zakończy się w założonym czasie, ale i budżecie (!) Marzenia ściętej głowy, co? Powiedziałbym, że zwinny zespół można budować z osób, które samodzielnie również potrafiliby poprowadzić ten projekt tyle, że zajęłoby im to więcej czasu. Siła doświadczonych inżynierów wynika z ich pragmatycznego podejścia do tematu i świadomości, że po ciekawym poranku z kawką i eclipsową wtyczką do pudelka (ukłon w stronę Mateusza) przyjdzie im ciężko popracować przy zadaniu. Jeśli do tej ciężkiej pracy dodamy niezwykle wyrafinowany funkcjonalnie superszkielet aplikacyjny, to mamy dwa podejścia, idziemy z nim w szranki i konkury, aby go poznać, a wtedy wdrażamy, albo po prostu zarzucamy, bo z naszych obliczeń wynika, że albo on albo my. To nazywam pragmatycznym podejściem. Mamy świadomość, że nie wszystko teraz i zaraz, że niektóre superrozwiązania jeszcze na nas poczekają. Takiej świadomości nie możemy oczekiwać od niedoświadczonych członków zespołu.&lt;br /&gt;&lt;br /&gt;A Ty jak uważasz? Pewnie nie tylko ja jestem zainteresowany Twoim zdaniem, więc podejmij temat i wyraź swoją opinię na forum w wątku &lt;a href="http://groups.google.com/group/warszawa-jug/browse_thread/thread/5c4a514780b29429"&gt;[warszawa-jug] (wady) Agile - Dyskusja&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-7232904326011722674?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/_6NKbdqhBjI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/7232904326011722674/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=7232904326011722674" title="Komentarze (4)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/7232904326011722674?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/7232904326011722674?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/11/wady-agile-dyskusja.html" title="(wady) Agile - Dyskusja" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total></entry><entry gd:etag="W/&quot;A0UMQXw6fip7ImA9WxNUEUk.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-1372730640940515104</id><published>2009-11-01T23:05:00.004+01:00</published><updated>2009-11-02T09:08:00.216+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-02T09:08:00.216+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Programowanie w Clojure - część 1 - tytułem wstępu</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://clojure.org"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 100px;" src="http://clojure.org/file/view/clojure-icon.gif" border="0" alt="" /&gt;&lt;/a&gt;Jedną książkę o &lt;a href="http://clojure.org"&gt;Clojure&lt;/a&gt; mam już za sobą (patrz recenzja &lt;a href="http://www.jaceklaskowski.pl/wiki/Book_review:_Programming_Clojure"&gt;Book review: Programming Clojure&lt;/a&gt;), a kolejna jest w trakcie pisania - &lt;a href="http://apress.com/book/view/1430272317"&gt;Practical Clojure (The Definitive Guide)&lt;/a&gt;, więc jeśli miałbym poczuć klimaty programowania w języku funkcyjnym z użyciem Clojure, nie pozostaje mi nic innego jak po prostu zacząć w nim programować. Nie planuję wielkich programów, ale przynajmniej przećwiczę te elementy języka, które oznaczyłem sobie jako ciekawe podczas lektury &lt;a href="http://pragprog.com/titles/shcloj/programming-clojure"&gt;Programming Clojure&lt;/a&gt; Stuarta Halloway'a.&lt;br /&gt;&lt;br /&gt;Jest wiele cech różniących programowanie funkcyjne od programowania obiektowego, ale podstawowym mogłyby być &lt;span style="font-weight:bold;"&gt;"czyste" funkcje&lt;/span&gt; (ang. &lt;span style="font-style:italic;"&gt;pure functions&lt;/span&gt;), których wynik działania zależy wyłącznie od parametrów wejściowych, a nie od aktualnego stanu aplikacji czy innych ukrytych źródeł danych możliwych do wykorzystania w implementacji funkcji. Wiemy, że te same dane dają ten sam wynik bez względu na moment, w jakim funkcja została wykonana. Programowanie z czystymi funkcjami nie jest obce programistom javowym. W Javie to my jednak decydujemy, czy tworzona funkcja jest czysta (bez efektów ubocznych), czy nie. Wszystko zależy od implementacji. W programowaniu funkcyjnym może to być w ogóle niemożliwe do realizacji, albo wymaga specjalnych słów kluczowych w języku, które explicite oznaczą funkcję, jako posiadającą efekty uboczne. Możnaby powiedzieć, że w Javie też tak jest, bo pewne konstrukcje mówią nam, czy skutkują efektem ubocznym, czy nie, ale to wymaga analizy implementacji, podczas gdy w Clojure jedynie wyszukania odpowiednich słów kluczowych obejmujących sekcje modyfikujące.&lt;br /&gt;&lt;br /&gt;Kolejną składową programowania funkcyjnego są &lt;span style="font-weight:bold;"&gt;niezmienne struktury danych&lt;/span&gt; (ang. &lt;span style="font-style:italic;"&gt;immutable data structure&lt;/span&gt;). Każda operacja na strukturze danych powoduje jej skopiowanie i wykonanie operacji. Każdorazowo dostajemy kopię struktury wejściowej.&lt;br /&gt;&lt;br /&gt;Łącząc obie cechy programowania funkcyjnego, efekty uboczne (ang. &lt;span style="font-style:italic;"&gt;side effects&lt;/span&gt;) nie wystąpują w ogóle, albo są wyjątkiem a nie regułą. Tym samym testowanie aplikacji jest prostsze. Sprawdzamy, czy dla tego samego wejścia mamy to samo wyjście i tyle. Podobnie z &lt;a href="http://pl.wikipedia.org/wiki/Przetwarzanie_wsp%C3%B3%C5%82bie%C5%BCne"&gt;programowaniem współbieżnym (równoległym)&lt;/a&gt;. Skoro wszystkie struktury są niezmienne, a działanie funkcji zwraca ich kopię, to nie ma czego synchronizować (!) Idąc dalej, programowanie funkcyjne daje możliwość zrównoleglania obliczeń, skoro wynik działania funkcji zależy wyłącznie od danych wejściowych, a kolejność obliczeń składowych funkcji złożonej nie ma znaczenia. I dalej, jeśli wykonamy funkcję czystą z parametrami wejściowymi, które będą wykorzystane w kolejnym wywołaniu, możemy zoptymalizować takie wywołanie podstawiając wynik poprzedniego wywołania funkcji - umieścić wynik w pamięci podręcznej i kosztem funkcji będzie jedynie odczyt z pamięci.&lt;br /&gt;&lt;br /&gt;Nie ma nic za darmo. W końcu, gdyby taka słodycz płynęła z programowania funkcyjnego, zamiast programowania imperatywno-obiektowego w Javie pisalibyśmy aplikacje w Haskellu, OCamlu, MLu, czy microsoftowym F#. Coś jest na rzeczy, że bliżej nam do imperatywnego myślenia niż funkcyjnego, podobnie jak z bazami danych, które przyzwyczailiśmy się postrzegać relacyjnie, a oprogramowywać dostęp do ich danych obiektowo (stąd powód dla rozwiązań ORM). Dobrze jednak mieć wybór. Clojure jest językiem uruchamianym na JVM z całym dobrodziejstwem inwentarza, a wprowadza nas w świat programowania funkcyjnego, w którym niektóre problemy rozwiązuje się prościej. Miejmy po prostu świadomość istnienia Clojure, podobnie jak Groovy, Scala, JRuby, Jython, Erlang, itp. i dobierajmy narzędzie do problemu, a nie komplikujmy problem, aby dopasować i rozwiązać go znanymi technikami.&lt;br /&gt;&lt;br /&gt;Nie mam jeszcze wyrobionego zdania nt. Clojure i jego użycia w projektach. Próbuję wierząc, że komentarze i dyskusje dadzą mi odpowiedź, czy jest warto. Jedna książka to zdecydowanie za mało, aby wyrobić sobie pogląd na temat zastosowania Clojure w projektach. Skoro znalazła się osoba Rich Hickey, która stworzyła kolejny język funkcyjny Clojure, tym razem działający na JVM, to musi w tym być jakaś ukryta wiedza, której zrozumienie nie jest mi jeszcze dane. Kładę to raczej na barki mojego intelektualnego niedorozwoju niż braku sensu w powstaniu Clojure. Kiedy będę mógł porównać Javę do Clojure i wskazać zalety jednego względem drugiego, nawet jeśli skończy się na wyrzuceniu Clojure jako niepotrzebnego, mam nadzieję, że mimo wszystko nie będzie to czas stracony. Podkreślam słowo &lt;span style="font-style:italic;"&gt;nadzieja&lt;/span&gt;. Aktywność na &lt;a href="http://groups.google.com/group/clojure"&gt;grupie dyskusyjnej użytkowników Clojure&lt;/a&gt; wskazuje, że język ma swoje poletko, w którym sprawdza się. Chcę wiedzieć, czy dla mnie również.&lt;br /&gt;&lt;br /&gt;Ciekawym podsumowaniem cech programowania funkcyjnego może być prezentacja &lt;a href="http://www.ia.pw.edu.pl/~mszlenk/spop/Programowanie%20funkcyjne%20-%20wprowadzenie.pdf"&gt;Programowanie funkcyjne - wprowdzenie&lt;/a&gt; p. dr inż. Marcina Szlenka z PW. W katalogu &lt;span style="font-style:italic;"&gt;spop&lt;/span&gt;, gdzie znajduje się prezentacja, znajdziemy 2 zadania, które możemy spróbować zrealizować w Clojure (autor zażyczył sobie implementacji w Haskellu). Zawsze to łatwiej uczyć się nowego mając określone zadanie, poza takim ogólnym jak po prostu nauczyć się nowego :)&lt;br /&gt;&lt;br /&gt;Clojure to Lisp na JVM. Składniowo oznacza to mnóstwo nawiasów, aczkolwiek twórca Clojure zrozumiał, że była to jedna z bolączek Lispa i w wielu miejscach, gdzie Lisp wymagałby nawiasów, w Clojure ich nie ma. I dobrze.&lt;br /&gt;&lt;br /&gt;W książce "Programming Clojure" autor napisał:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;"My personal quest for a better JVM language included significant time spent with Ruby, Python, and JavaScript, plus less intensive exploration of Scala, Groovy, and Fan. These are all good languages, and they all simplify writing code on the Java platform. But for me, Clojure stands out."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Interesujące, co? Nie potrafiłbym porównać wszystkich wymienionych języków, więc nie pozostaje mi nic innego, jak uwierzyć autorowi na słowo i samemu spróbować swoich sił z Clojure. Ciekawe jest, że obok Clojure pojawiły się również Scala, Groovy i nieznany mi w ogóle &lt;a href="http://fandev.org/"&gt;Fan&lt;/a&gt;. Wystarczy chwila na stronie Fan i trudno nie oprzeć się wrażeniu, że wszystko w nim jest, a jednak brakuje mu zainteresowania społeczności. Dlaczego? Działa na JVM, .Net CLR i w przeglądarce. Ma jakby wszystko, co daje Java, a środowisko szersze, a jednak czegoś brakuje. Ktoś parał się nim?&lt;br /&gt;&lt;br /&gt;Wracając do Clojure, zacznijmy od początku. Rozpoczynamy programowanie w Clojure pobierając kompilator i środowisko uruchomieniowe ze &lt;a href="http://clojure.org/"&gt;strony domowej Clojure&lt;/a&gt;. Pobieramy &lt;a href="http://clojure.googlecode.com/files/clojure_1.0.0.zip"&gt;Clojure 1.0.0&lt;/a&gt; i rozpakowujemy w wybranym katalogu. Ja wybrałem trochę bardziej pokrętną drogę i zbudowałem Clojure lokalnie, więc numery wersji będą różne. Dla zainteresowanych, wystarczy&lt;pre&gt; svn co http://clojure.googlecode.com/svn/trunk/ clojure&lt;br /&gt; cd clojure&lt;br /&gt; ant&lt;/pre&gt;Uruchamiamy interpreter Clojure - &lt;span style="font-weight:bold;"&gt;REPL&lt;/span&gt; - poleceniem&lt;pre&gt; jlaskowski@work /cygdrive/c/oss/clojure&lt;br /&gt; $ java -jar clojure-1.1.0-alpha-SNAPSHOT.jar&lt;br /&gt; Clojure 1.1.0-alpha-SNAPSHOT&lt;br /&gt; user=&amp;gt;&lt;/pre&gt;Jest to podobne do &lt;span style="font-weight:bold;"&gt;groovysh&lt;/span&gt; czy &lt;span style="font-weight:bold;"&gt;groovyConsole&lt;/span&gt; w Groovy i pewnie podobne rozwiązania znajdziemy również w Scali czy Erlangu. Składnia Clojure wymaga, aby każde polecenie było podawane w nawiasach, w których najpierw podajemy funkcję, a później jej parametry, np.&lt;pre&gt; user=&amp;gt; (+ 1 3)&lt;br /&gt; 4&lt;br /&gt; user=&amp;gt; (- 3 1)&lt;br /&gt; 2&lt;br /&gt; user=&amp;gt; (* 2 4)&lt;br /&gt; 8&lt;/pre&gt;Jeśli wymagane jest dalsze zagnieżdzenie struktur, mamy kolejny poziom nawiasów, itp.&lt;pre&gt; user=&amp;gt; (+ 2 (- 5 2))&lt;br /&gt; 5&lt;/pre&gt;Z pewnymi wyjątkami nawiasy wyznaczają zakres działania funkcji. Skoro wszystko jest funkcją, będzie tyle par nawiasów, co wykonywanych funkcji.&lt;br /&gt;&lt;br /&gt;Koniec pracy w REPL to znane i lubiane Ctrl-C. To byłoby tyle na dobry początek. Zainteresowany? A czym?! :) W kolejnych wpisach dalsze podboje programowania funkcyjnego z Clojure przy tworzeniu czegoś bardziej użytecznego niż przysłowiowe "Witaj Świecie".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-1372730640940515104?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/VWDT0rcVlKA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/1372730640940515104/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=1372730640940515104" title="Komentarze (1)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/1372730640940515104?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/1372730640940515104?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/11/programowanie-w-clojure-czesc-1-tytuem.html" title="Programowanie w Clojure - część 1 - tytułem wstępu" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;C08ERX8zfyp7ImA9WxNVGEg.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-2511642142032686554</id><published>2009-10-29T22:10:00.004+01:00</published><updated>2009-10-29T22:30:04.187+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-29T22:30:04.187+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="konferencje" /><category scheme="http://www.blogger.com/atom/ns#" term="warszawa-jug" /><title>Wrażenia z sobotniej, zwinnej Warsjawy 2009</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.warszawa.jug.pl"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 132px; height: 200px;" src="http://groups.google.com/group/warszawa-jug/web/WarszawaJUG.gif?display=thumb&amp;width=200&amp;height=200" border="0" alt="" /&gt;&lt;/a&gt;Tematem przewodnim sobotniej konferencji &lt;a href="http://warsjawa.pl/"&gt;Warsjawa 2009&lt;/a&gt; były metodyki lekkie i tylko takie prezentacje zostały zakwalifikowane. Do grupy szczęśliwców, którzy mogli przedstawić swój punkt widzenia na sprawy Agile/Scrum byli (w kolejności występowania): &lt;a href="http://www.lenart.org.pl/"&gt;Łukasz Lenart&lt;/a&gt;, &lt;a href="http://www.pawellipinski.com/"&gt;Paweł Lipiński&lt;/a&gt;, &lt;a href="http://www.linkedin.com/pub/krzysztof-jelski/0/43a/a11"&gt;Krzysztof Jelski&lt;/a&gt;, &lt;a href="http://szimano.org/"&gt;Tomasz "szimano" Szymański&lt;/a&gt; i &lt;a href="http://www.linkedin.com/pub/tomasz-%C5%82asica/2/309/731"&gt;Tomasz Łasica&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pojawiłem się w budynku Elki PW w trakcie trwania przerwy na pizzę - około 13tej. Pierwsze wrażenia bardzo pozytywne - tłok na piętrze, co mogło być spowodowane liczbą uczestników lub niewielkich rozmiarów korytarzem. Niestety nie policzyłem uczestników, ale zaryzykowałbym 100kę. Było wystarczająco dużo jak na sobotę i niecałkiem techniczną konferencję. Widać było zainteresowanie Scrumem. Tematy były praktyczne i panowie Tomki nie pozostawili złudzeń, że znają się na rzeczy.&lt;br /&gt;&lt;br /&gt;Najpierw, co mi się podobało. Podobało mi się móc wysłuchać o Scrumie w przysłowiowych "żołnierskich słowach". Krótko i treściwie. Każdy z prelegentów miał 30 minut na przedstawienie tematu i 15 minut dyskusji. Akurat. Tomek Ł. skorzystał nawet z pomocy kawek, które zapalały się po przekroczeniu kwadransu. Ciekawy pomysł. Nie dłużyło się wcale, a nawet, mimo, że byłem jedynie na 2 wystąpieniach (szimano i Tomka Łasicy), miałem wrażenie, że prezentacje pojawiają się i znikają, i nie wiedząc kiedy, było po wszystkim. Było ciekawie, czasowo dopasowane, więc dla mnie idealnie. Organizacyjnie super! Łukasz Lenart, który wraz z grupą wolontariuszy (wybaczcie nie wspomnę z imienia i nazwiska, bo pamiętam tylko Agnieszkę i to tylko dlatego, że później jeszcze wystąpiła na wtorkowym 54. spotkaniu Warszawa JUG i tak się jakoś utrwaliło) zorganizował konferencję zrobił to dokładnie, jak było trzeba. Napoje były, pizza też i mini-aula również. Oświetlenie, nagłośnienie i ekran dopasowane. Logistyka na medal. Sponsorzy również dopisali i na scenie pojawili się &lt;a href="http://pragmatists.pl"&gt;Pragmatists&lt;/a&gt; oraz &lt;a href="http://softwaremill.pl/"&gt;SoftwareMill&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Wracając do naszych prelegentów - Tomków, o tym co dobre już było. Byli merytoryczni, ale nie obyło się bez jednego drobnego minusu. U obu nie podobało mi się "mówienie do monitora". Kontakt wzrokowy z uczestnikami był, ale niewielki w porównaniu z tym z komputerem. Dało się odczuć, że bardziej zależało im na przedstawieniu tematu bez wpadek, tak jak przygotowali sobie na komputerach niż na kontakcie z publicznością. Niewielka to strata, gdy merytorycznie wypadają doskonale, ale znacznie łatwiej zadaje się pytania prelegentowi, który wręcz prowokuje do nich patrząc na uczestników. I to byłoby tyle z wpadek. Jedna, niewielka wielkiej różnicy nie robi, więc odbiór obu oceniam na wysoki (do perfekcji brakuje właśnie tego wzrokowego kontaktu).&lt;br /&gt;&lt;br /&gt;Co mnie jednak nieprzyjemnie wzbudziło w kontekście przedstawiania Scruma, to fakt, że podkreśla się go jako metodykę niesformalizowaną, a aż roi się w nim od formalizmów - podział ról, etapów w projekcie i ta przedziwna mania utrzymywania nazewnictwa angielskojęzycznego. Nie nalegam na zaprzestanie korzystania z niego, gdzie brakuje polskiego odpowiednika, ale wprowadzanie nowego nowym (językiem) może zakończyć się znacznie mniejszym powodzeniem niż mówienie w języku zrozumiałym dla słuchaczy-nowicjuszy. Weźmy na przykład taki &lt;span style="font-style:italic;"&gt;sprint&lt;/span&gt; - raczej kojarzy się z uciążliwym biegiem po wygraną i nie oddaje lekkości tego terminu (zakładając, że w Scrumie jako metodyce lekkiej wszystko jest lekkie). Dlaczego nie korzystać jednocześnie ze sprintu i okresu produkcji, aby w ten sposób przybliżyć znaczenie tego pierwszego? Jeszcze z samym sprintem można przywyknąć, bo kilkakrotnie padło na konferencji, że nazwa sprint odpowiada trudowi, jaki wkłada się w każdy ze sprintów, aby zrealizować zakładany plan, ustalony wspólnie z właścicielem produktu czy też Scrum Masterem (nie pamiętam dokładnie z kim to się ustala, chyba z oboma). Padło nawet, że po 4tym czy jeszcze kolejnym można odczuć trudy sprintów. Nie rozumiem tego do końca, bo w końcu pracujemy znacznie więcej niż 6-7h zakładane jako dzień w Scrumie, więc dobrze spędzone godziny powinny być kojące niż wykańczające? Bardziej nieprzemawiającymi do mnie terminami były (świadomie używam ich formy mówionej) &lt;span style="font-style:italic;"&gt;toking stik&lt;/span&gt;, &lt;span style="font-style:italic;"&gt;tajmboksowanie&lt;/span&gt;, &lt;span style="font-style:italic;"&gt;assajnowanie&lt;/span&gt;, &lt;span style="font-style:italic;"&gt;łajtbord&lt;/span&gt; i &lt;span style="font-style:italic;"&gt;beklog&lt;/span&gt;. Nie twierdzę, że nie nasuwają skojarzeń, ale tylko nieznacznie. Czy nie lepiej byłoby używać słownictwa bardziej bliskiego słuchaczom, aby nowy temat przedstawiać "starymi" terminami/słowami, które niosą tą samą informację, ale przemawiają do nas dosadniej, np. &lt;span style="font-style:italic;"&gt;pałeczka/różdżka rozmówcy&lt;/span&gt;, &lt;span style="font-style:italic;"&gt;harmonogramowanie&lt;/span&gt;, &lt;span style="font-style:italic;"&gt;przypisywanie&lt;/span&gt;, &lt;span style="font-style:italic;"&gt;tablica&lt;/span&gt;, &lt;span style="font-style:italic;"&gt;lista zadań&lt;/span&gt;, itp. Akurat idealnie odpowiadają terminom angielskim, ale chodzi mi raczej o przybliżenie słuchacza korzystając z bardziej zrozumiałego dla niego słownictwa. Mam wrażenie, że przez to całe słownictwo wokół Scruma tworzy się pewna aura tajemniczości, która niepotrzebnie wpływa niekorzystnie na zrozumienie, o co w tym wszystkim chodzi. Ma być lekko, a przez to słownictwo nie jest. Nasunęła mi się nawet myśl, że Scrumowcy to "językowi inwalidzi". Jakby się wszyscy uparli na to angielskie słownictwo?!&lt;br /&gt;&lt;br /&gt;Co mnie "ujęło za serce" w Scrumie to położenie nacisku na odpowiedzialność jednostki w zespole. W razie niesubordynacji nie wskazuje się winnych, ale odbiera im się możliwość popełnienia ich kolejnym razem. Zamiast winienia, że Iksiński zatwierdza zmiany, które skutkują złamaniem budowania aplikacji (nie wykonaniem kompilacji czy brakiem spełnienia testów jednostkowych), do systemu kontroli wersji wprowadza się "zaporę" w postaci automatycznie wykonywanych testów, kompilacji, itp. i tylko ich spełnienie potwierdza zmianę. Zamiast stać i krytykować wzbogaca się środowisko o narzędzia, które wiele robią za nas. Tak jak powinno być. Wcześniej czy później, Iksiński zrozumie swój błąd i się nauczy, że zmiany należy zatwierdzać do repozytorium jedynie po poprawnym zbudowaniu/przetestowaniu aplikacji lokalnie. Jakość wzrasta samoistnie.&lt;br /&gt;&lt;br /&gt;W Scrumie występują karty, którymi przypisujemy wagę każdego z omawianych funkcjonalności, które wejdą do sprintu. Gra w karty świadczy, że Scrum kładzie nacisk na luźną atmosferę pracy, ale jednocześnie wprowadza tyle nowej nomenklatury i nakłada ramy odpowiedzialności, że trudno w to uwierzyć, że wciąż nazywa się go lekkim. Może gdyby nie naciskano tak często na ową lekkość Scruma, miałbym do tego mniej uszczypliwy stosunek.&lt;br /&gt;&lt;br /&gt;Miałem jeszcze okazję przejrzeć nagranie z Łukaszem Lenartem w roli organizatora podczas wystąpienia otwierającego konferencję i jako prelegenta w kolejnym wystąpieniu. Bardzo ciekawie przeprowadzona prezentacja z dużą dawką sportu. Zrozumiałem różnicę między uczestniczeniem w spotkaniu na żywo. Tego się nie da odtworzyć podczas odsłuchiwania. Brawo Łukasz za pomysł!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;24. listopada&lt;/span&gt;, w ramach wtorkowych spotkań Warszawa JUG, będzie miał miejsce &lt;span style="font-weight:bold;"&gt;Eclipse DemoCamp 2009&lt;/span&gt;. Spróbujemy odtworzyć atmosferę Warsjawy, bo jak dla mnie wyznaczyła ciekawą formułę spotkań - 30/15. Zresztą taki postulat pojawił się po Warsjawa Eclipse DemoCamp 2009, więc dlaczego nie spróbować ponownie?! Chętni do pomocy przy organizacji DemoCampa proszeni o kontakt na grupie &lt;a href="http://www.warszawa.jug.pl"&gt;Warszawa JUG&lt;/a&gt;. Każda pomoc mile widziana. Finansowanie mamy zapewnione przez Eclipse Foundation, ale wartoby również skorzystać z możliwości promocji polskich firm informatycznych. Znacie takowe, które byłyby zainteresowane wystawieniem swojego logo na stronie Eclipse.org, konferencji i w trakcie, piszcie. W końcu tyle, ile sami zrobimy, tyle będziemy mieli. Tym razem zadbam, aby w relacjach pojawiły się nazwiska zaangażowanych :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-2511642142032686554?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/rP5-G__tqss" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/2511642142032686554/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=2511642142032686554" title="Komentarze (15)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2511642142032686554?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2511642142032686554?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/10/wrazenia-z-sobotniej-zwinnej-warsjawy.html" title="Wrażenia z sobotniej, zwinnej Warsjawy 2009" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">15</thr:total></entry><entry gd:etag="W/&quot;C0EDQH4zeSp7ImA9WxNVGE0.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-2076571907895838701</id><published>2009-10-29T00:25:00.012+01:00</published><updated>2009-10-29T08:34:31.081+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-29T08:34:31.081+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="różne" /><title>A to Ci niespodzianka - 1002 czytelników przy 501 wpisach!</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wSeV_DMR2uA/SujUkRPyFDI/AAAAAAAACaY/cOGWK4g6A04/s1600-h/blog-statystyki-1002-czytelnikow.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 141px;" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/SujUkRPyFDI/AAAAAAAACaY/cOGWK4g6A04/s320/blog-statystyki-1002-czytelnikow.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5397797872973517874" /&gt;&lt;/a&gt;Czasami było więcej, a czasami mniej. Czasami ciekawiej, a czasem niekoniecznie. Przez ostatnie 3 lata, odkąd postanowiłem spróbować swoich sił na polu blogerskim i założyłem Notatnik, upewniłem się co do tego, że w życiu dobrze jest wyznaczyć sobie cel, obrać właściwy kurs i dążyć do niego każdego dnia, aby ostatecznie chociażby otrzeć się o jego zrealizowanie. &lt;br /&gt;&lt;br /&gt;Niestety mogę tak napisać wyłącznie o bardzo wąskiej części mojego życia, a mowa o moich doświadczeniach przy prowadzeniu &lt;a href="http://www.warszawa.jug.pl"&gt;Warszawa JUG&lt;/a&gt; oraz prezentowania swojej wiedzy szerokiej publiczności, czego celem było utrzymanie jej w ryzach i ciągłe samodoskonalenie ku uciesze własnej i czytelników. Ja Wam moje spojrzenie technologiczne, a Wy mi komentarze, spostrzeżenia i własne doświadczenia. Układ wystarczająco partnerski, aby po wspomnianych 3 latach móc ucieszyć oko 1002 czytelnikami przy 501 wpisach.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wSeV_DMR2uA/SujUkaD5HiI/AAAAAAAACag/amSuDJvogp4/s1600-h/blog-archiwum-501-artykulow.png"&gt;&lt;img style="float:right; margin:10px 0 0 0;cursor:pointer; cursor:hand;width: 182px; height: 320px;" src="http://1.bp.blogspot.com/_wSeV_DMR2uA/SujUkaD5HiI/AAAAAAAACag/amSuDJvogp4/s320/blog-archiwum-501-artykulow.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5397797875339566626" /&gt;&lt;/a&gt;&lt;br /&gt;I nie chodzi o liczby, ale o efekt, jaki udało mi się osiągnąć przy tym wystawianiu się na publiczną krytykę. Dzięki złudnemu magicznemu blaskowi rosnącej popularności mojego bloga, przyzwyczaiłem się do próbowania swoich sił z coraz to ciekawszymi rozwiązaniami, które pozwoliły mi ostatecznie uwierzyć, że jak się chce, to można. Można znacznie więcej, ale nie chodzi, aby robić więcej i więcej, ale żeby robić to z głową. Mam wrażenie, że to właśnie pisanie na blogu pozwoliło mi być konkretniejszym literacko i przedstawiać temat zwięźlej. Chciałbym, aby było to prawdą, bo w życiu osobistym różnie to bywa.&lt;br /&gt;&lt;br /&gt;Zebrałem kilka statystyk z Google Analytics, które pokazują, co cieszyło się największym zainteresowaniem. Może również komuś nasuną jakieś spostrzeżenia, o których mi nie byłoby dane pomyśleć? W końcu co dwie głowy to nie jedna. Co by nie napisać, to sądzę, że możliwość zamienienia słowa i wymiana doświadczeń pozwoliła mi stać się efektywniejszym technologicznie. Dzięki Notatnikowi udało mi się poznać wielu ludzi, których z pewnością nie miałbym okazji poznać i miałem możliwość uczestniczenia w wielu konferencjach, a nawet kilka zorganizować w ramach Warszawa JUG. Nie mam złudzeń, że jest warto kontynuować temat upubliczniania swojego spojrzenia na technologie javowe na blogu (i wciąż zachodzę w głowę do czego mógłby przydać mi się mikroblog w stylu tweetera, blipa czy podobnych).&lt;br /&gt;&lt;br /&gt;Dziękuję wszystkim, którzy zajrzeli do mojego bloga. Ufam, że choć raz znaleźli coś interesującego, a jeśli nie było im to dane do tej pory, zapraszam do kolejnych wpisów. Wczoraj udało mi się uruchomić Apache OpenEJB 3.1 w ramach środowiska OSGi (Apache Felix), gdzie pakunkami są składowe serwera oraz same moduły EJB, a ziarna są usługami OSGi, więc jeśli nawet nie było ciekawie, to z pewnością będzie. Jeśli wciąż nie wierzysz, napisz na priv dlaczego. W końcu jak inaczej poprawić swój warsztat, jeśli nie przez zbieranie krytycznych uwag i wyciąganie wniosków?&lt;br /&gt;&lt;br /&gt;Wciąż zastanawiam się, jakby tu wykorzystać popularność Notatnika i sprawić, aby zmienił się w "stanowisko pracy większej liczby osób" i poza komentarzami udostępnił możliwość innym wyrażenia swojego zdania technologicznego. Myślałem o pewnej społecznościówce, gdzie nagrodą za aktywność byłoby publiczne wyróżnienie w statystykach. Brzmi trochę wyniośle, ale ideą jest, aby kanał dystrybucji wiedzy nie był jednoosobowy i był platformą dla innych, którzy dla jednego wpisu nie widzą sensu zakładania własnego bloga. Domena już jest - &lt;a href="http://javosfera.pl"&gt;javosfera.pl&lt;/a&gt; i nazwa mówi za siebie. Teraz należałoby stworzyć interesującą szatę graficzną i uzbroić technologiami javowymi. Jeśli macie dostęp do grafików, którzy zechcieliby stworzyć taką szatę Web 2.0 z pastelowymi kolorami, krągłościami przy przyciskach i skromnym aczkolwiek użytecznym układem strony koniecznie dajcie mi znać. Z jednym już rozmawiam, ale poza grafikiem potrzebne są osoby do zabawy z technologiami klienckimi, przede wszystkim CSS, HTML i JavaScript. Serwerem zajmę się z przyjemnością, ale na kliencie będzie to trwało. Dotychczasowe serwisy javowe (jdn.pl, dworld.pl, java.pl, j2ee.pl) po prostu nie dają tych możliwości, które promują aktywność, a dla potencjalnych sponsorów są za mało widoczne, nie zapominając, że są niejavowe (poza dworld.pl?). Pora to zmienić. Możnaby w ten sposób popróbować się ze Scrumem wirtualnie, gdzie jest lista zadań do wykonania, pary pracujące nad daną funkcjonalnością i cotygodniowe podsumowanie co zrobiono, a co planujemy na przyszłość. Może być zabawnie. Zainteresowanych uprasza się o kontakt na priv.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wSeV_DMR2uA/SujUklmSUBI/AAAAAAAACao/b7n9qESTDME/s1600-h/googleanalytics-benchmarking.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 206px;" src="http://3.bp.blogspot.com/_wSeV_DMR2uA/SujUklmSUBI/AAAAAAAACao/b7n9qESTDME/s320/googleanalytics-benchmarking.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5397797878436614162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wSeV_DMR2uA/Sujacn30QoI/AAAAAAAACbY/GaTGlBVjFgY/s1600-h/googleanalytics-visitors-overview.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 216px;" src="http://1.bp.blogspot.com/_wSeV_DMR2uA/Sujacn30QoI/AAAAAAAACbY/GaTGlBVjFgY/s320/googleanalytics-visitors-overview.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5397804338677826178" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wSeV_DMR2uA/SujacT6hsjI/AAAAAAAACbQ/NCoSOyHPcSI/s1600-h/googleanalytics-traffic-sources.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 188px;" src="http://1.bp.blogspot.com/_wSeV_DMR2uA/SujacT6hsjI/AAAAAAAACbQ/NCoSOyHPcSI/s320/googleanalytics-traffic-sources.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5397804333320483378" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wSeV_DMR2uA/SujacH27PDI/AAAAAAAACbI/CzLA1J3swL8/s1600-h/googleanalytics-keywords.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 209px;" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/SujacH27PDI/AAAAAAAACbI/CzLA1J3swL8/s320/googleanalytics-keywords.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5397804330084154418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wSeV_DMR2uA/Sujab10bLpI/AAAAAAAACbA/i8DdIhsv6ag/s1600-h/googleanalytics-keywords-25.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 231px;" src="http://1.bp.blogspot.com/_wSeV_DMR2uA/Sujab10bLpI/AAAAAAAACbA/i8DdIhsv6ag/s320/googleanalytics-keywords-25.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5397804325241826962" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wSeV_DMR2uA/SujUlEakZEI/AAAAAAAACa4/Zf8_1b6xTxs/s1600-h/googleanalytics-content-performance-pagetitle.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://3.bp.blogspot.com/_wSeV_DMR2uA/SujUlEakZEI/AAAAAAAACa4/Zf8_1b6xTxs/s320/googleanalytics-content-performance-pagetitle.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5397797886708966466" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wSeV_DMR2uA/SujUk0zrQ5I/AAAAAAAACaw/vZ5yKffSe9U/s1600-h/googleanalytics-content-performance.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 231px;" src="http://1.bp.blogspot.com/_wSeV_DMR2uA/SujUk0zrQ5I/AAAAAAAACaw/vZ5yKffSe9U/s320/googleanalytics-content-performance.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5397797882519307154" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-2076571907895838701?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/FSzotkaQlTU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/2076571907895838701/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=2076571907895838701" title="Komentarze (5)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2076571907895838701?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2076571907895838701?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/10/to-ci-niespodzianka-1002-czytelnikow.html" title="A to Ci niespodzianka - 1002 czytelników przy 501 wpisach!" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_wSeV_DMR2uA/SujUkRPyFDI/AAAAAAAACaY/cOGWK4g6A04/s72-c/blog-statystyki-1002-czytelnikow.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total></entry><entry gd:etag="W/&quot;CEIHQHg_fip7ImA9WxNVFkU.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-5168617092879327521</id><published>2009-10-27T09:14:00.004+01:00</published><updated>2009-10-27T23:28:51.646+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-27T23:28:51.646+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="recenzje" /><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>W świat programowania funkcyjnego na JVM z "Programming Clojure" od The Pragmatic Programmers</title><content type="html">Jesienna aura idealnie sprzyja zgłębianiu wiedzy przez lekturę książek. Tym razem padło na &lt;a href="http://pragprog.com/titles/shcloj/programming-clojure"&gt;Programming Clojure&lt;/a&gt; Stuarta Halloway'a (The Pragmatic Programmers, Maj 2009).&lt;br /&gt;&lt;br /&gt;Po 2 tygodniach naginania mojego obiektowo-imperatywnego umysłu do myślenia funkcyjnego przebrnąłem w pocie czoła przez 300 stron o &lt;a href="http://clojure.org"&gt;Clojure&lt;/a&gt;. Początkowo nie mogłem się w ogóle odnaleźć. Wszechobecne nawiasy były do strawienia, ba nawet wydały mi się przyjazne jak średniki, czy jawne określanie typów w Javie. Po prostu składnia i tyle. Kwestia gustu, czy się ją lubi, czy nie. Co mnie jednak najbardziej zmęczyło (i to w pełnym tego słowa znaczeniu), to myślenie w kategoriach struktur danych, które są...niezmienne. Dodając do tego funkcje jako obywateli pierwszej kategorii (domknięcia), makra i multimetody, a programowanie obiektowe wydaje się być zbyt rozdmuchane składniowo. Wiele z problemów programistycznych przedstawiono ciekawie w sposób funkcyjny.&lt;br /&gt;&lt;br /&gt;Przez cały czas nie mogłem zrozumieć, dlaczego miałbym poznać kolejny język programowania, który w dodatku jest funkcyjny. Po co mi się z nim męczyć?! Mało mi było Haskella czy OCamla, które omijałem szerokim łukiem?! Teraz nie mam złudzeń, że chociażby, dla świadomości, że osoba programująca funkcyjnie w Clojure nie musi być dodatkiem do zespołu, a powinna być jego przewodnikiem. Clojure to po prostu język funkcyjny napisany w znanej nam Javie, więc w chwilach zwątpienia zawsze możemy zejść na poziom programowania obiektowego w niej lub mikstury programowania obiektowo-imperatywno-funkcyjnego z Groovy. Wszystko zależy od zdrowego rozsądku, gdzie i jak wkleić poszczególne elementy. Zamknięcie funkcjonalności w biblioteki wielokrotnego użycia ukrywa nam detale jaki język programowania został użyty, więc nic nie stoi na przeszkodzie, aby jednym z nich w projekcie był właśnie...Clojure.&lt;br /&gt;&lt;br /&gt;Recenzja książki "Programming Clojure" znajduje się na moim Wiki - &lt;a href="http://www.jaceklaskowski.pl/wiki/Book_review:_Programming_Clojure"&gt;Book review: Programming Clojure&lt;/a&gt; (po angielsku ze względu na wymogi wydawnictwa w programie "Książka dla JUGa za recenzję").&lt;br /&gt;&lt;br /&gt;Zapewne kolejne wpisy powinny choć w niewielkim stopniu przedstawić możliwości programowania funkcyjnego z Clojure, więc nie jest to ostatni raz, kiedy się z nim spotykam(y). Czy ma ktoś tyle szczęścia, aby wykorzystać jakikolwiek język funkcyjny w projekcie komercyjnym? Wszędzie wszechobecna Java, Scala, Groovy, czy może znalazłoby się, albo już znaleziono, miejsce dla Clojure? Jest strona &lt;a href="http://clojure.pl"&gt;po polsku o Clojure&lt;/a&gt; i trochę o programowaniu funkcyjnym można poczytać w materiale &lt;a href="http://wazniak.mimuw.edu.pl/index.php?title=Programowanie_funkcyjne"&gt;"Programowanie funkcyjne"&lt;/a&gt; na ważniaku. Jeśli dodać do tego, że właśnie kilka dni temu pojawiła się wtyczka &lt;a href="http://grails.org/plugin/clojure"&gt;Clojure Plugin&lt;/a&gt; do Grails można odnieść wrażenie, że obok Clojure nie można przejść obojętnie. W końcu, czego możnaby oczekiwać od Clojure w Grails, gdzie jest Groovy?! Taki temat mógłby pojawić się na spotkaniu &lt;a href="http://www.warszawa.jug.pl"&gt;Warszawa JUG&lt;/a&gt;. Kto chętny? Krzysiek? Przyjezdni mają gwarantowany wikt i opierunek :)&lt;br /&gt;&lt;br /&gt;Dziękuję &lt;a href="http://pawelstawicki.blogspot.com"&gt;Pawłowi Stawickiemu&lt;/a&gt; ze szczecińskiego JUGa za kontakt z wydawnictwem "The Pragmatic Programmers", a &lt;a href="http://blog.mjanuszewski.pl/"&gt;Michałowi Januszewskiemu&lt;/a&gt; za wskazanie "Programming Clojure". Prawdopodobnie nie schyliłbym się po nią, gdyby nie obaj panowie. Chylę czoła za dobór repertuaru informatycznego.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-5168617092879327521?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/bMDVmr6mTlQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/5168617092879327521/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=5168617092879327521" title="Komentarze (3)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5168617092879327521?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5168617092879327521?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/10/w-swiat-programowania-funkcyjnego-na.html" title="W świat programowania funkcyjnego na JVM z &quot;Programming Clojure&quot; od The Pragmatic Programmers" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></entry><entry gd:etag="W/&quot;Ak4CRHczfCp7ImA9WxNVFUs.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-8862985617040262215</id><published>2009-10-26T15:55:00.000+01:00</published><updated>2009-10-26T15:56:05.984+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-26T15:56:05.984+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="warszawa-jug" /><title>54. spotkanie Warszawa JUG - "Wyślij siebie na urlop, czyli o skutecznym zarządzaniu zespołem programistów" Agnieszki Orlewicz</title><content type="html">&lt;a href="http://www.warszawa.jug.pl"&gt;Warszawska Grupa Użytkowników Technologii Java (Warszawa JUG)&lt;/a&gt; zaprasza na 54. spotkanie, które odbędzie się w najbliższy wtorek, 27.10.2009 o godzinie 18:00 w sali 5440 Wydziału MIMUW przy ul. Banacha 2 w Warszawie.&lt;br /&gt;&lt;br /&gt;Temat prezentacji: &lt;b&gt;Wyślij siebie na urlop, czyli o skutecznym zarządzaniu zespołem programistów&lt;/b&gt;&lt;br /&gt;Prelegent: &lt;b&gt;Agnieszka Orlewicz&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;W trakcie prezentacji Agnieszka opowie, jak być skutecznym liderem zespołu programistów i radzić sobie z problemami, takimi jak brak zaangażowania, delegowanie pracy, przekazywanie informacji zwrotnej. Tematy te są istotne niezależnie od tego czy pracujemy w SCRUMIe, XP czy innej cięższej/lżejszej metodyce. Znajdziemy tu przedstawienie technik, dzięki którym nasze 8 godzin w pracy będzie bardziej wartościowe i będzie można bezproblemowo iść na urlop ... lub nawet w pracy czuć się jak na urlopie (ech, dla wielu to tylko marzenia).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Agnieszka Orlewicz&lt;/b&gt; jest absolwentką Wydziału Elektroniki i Technik Informacyjnych PW i pracuje jako konsultant w firmie Premium Technology. Javę pokochaną od 'pierwszego wejrzenia'  sprawdziła w wielu ciekawych projektach m.in w CERNie i cały czas pozostaje z nią w kontakcie. Oprócz tego interesuje się kulturą japońską, podróżowaniem, psychologią i ostatnio również tworzeniem muzyki elektronicznej. Posiada certyfikat SCJP.&lt;br /&gt;&lt;br /&gt;Planowany czas prezentacji to 1 godzina, po której planuje się 15-30-minutową dyskusję.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Wstęp wolny!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Zapraszam w imieniu prelegenta i grupy Warszawa JUG!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-8862985617040262215?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/lbXYDOmzFBw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/8862985617040262215/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=8862985617040262215" title="Komentarze (1)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/8862985617040262215?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/8862985617040262215?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/10/54-spotkanie-warszawa-jug-wyslij-siebie.html" title="54. spotkanie Warszawa JUG - &quot;Wyślij siebie na urlop, czyli o skutecznym zarządzaniu zespołem programistów&quot; Agnieszki Orlewicz" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;DUUBSHoyeSp7ImA9WxNVE0Q.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-69432312108599589</id><published>2009-10-24T17:03:00.003+02:00</published><updated>2009-10-24T17:14:19.491+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-24T17:14:19.491+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="osgi" /><category scheme="http://www.blogger.com/atom/ns#" term="artykuły" /><title>Użycie javax.transaction.TransactionManager w OSGi z Apache Felix</title><content type="html">Jeszcze przed Warsjawą byłem gotów do opublikowania moich doświadczeń z "OSGifikacji" OpenEJB, więc wrażenia z dzisiejszej, zwinnej Warsjawy pojawią się w kolejnym wpisie. Muszę się jeszcze nad nimi zastanowić, aby były odczytane właściwie.&lt;br /&gt;&lt;br /&gt;Wracając do tematu przewodniego tego wpisu - OSGi, podczas wspomnianej osgifikacji natrafiłem na początkowo nietrywialny problem związany z dostępnością pakietu &lt;span style="font-weight: bold;"&gt;javax.transaction&lt;/span&gt; i jego interfejsu &lt;span style="font-weight: bold;"&gt;TransactionManager&lt;/span&gt;. Sama platforma Javy - JRE - dostarcza pakiet javax.transaction, więc OSGi również. Idąc jednak ku rozwiązaniom Java EE, gdzie korzysta się z javax.transaction.TransactionManager prowadzi to do nieoczekiwanych komplikacji i praca początkowo zaplanowana przeze mnie na kilka kwadransów skończyła się po kilku...godzinach o 3 nad ranem. Miało już nie być takich numerów z nocnymi nasiadówami, ale po prostu nie mogłem się oprzeć. Jeszcze tylko to, tylko to i będzie koniec. Był - problemu i mój! :)&lt;br /&gt;&lt;br /&gt;Spisałem swoje doświadczenia w kolejnym artykule &lt;a href="http://www.jaceklaskowski.pl/wiki/U%C5%BCycie_javax.transaction.TransactionManager_w_OSGi_z_Apache_Felix"&gt;Użycie javax.transaction.TransactionManager w OSGi z Apache Felix&lt;/a&gt;, abyście nie musieli tracić czasu na rozwiązywanie problemów, które już nimi nie są. To właśnie nazywamy doświadczeniem, a skoro ja je mam (w kontekście OSGi i javax.transaction), to i Wy. Proste!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-69432312108599589?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/8TLt0Ki6TDM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/69432312108599589/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=69432312108599589" title="Komentarze (3)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/69432312108599589?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/69432312108599589?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/10/uzycie-javaxtransactiontransactionmanag.html" title="Użycie javax.transaction.TransactionManager w OSGi z Apache Felix" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></entry><entry gd:etag="W/&quot;CUYNRnw6fip7ImA9WxNVEkQ.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-894585223725033600</id><published>2009-10-23T12:00:00.002+02:00</published><updated>2009-10-23T12:19:57.216+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-23T12:19:57.216+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="konferencje" /><category scheme="http://www.blogger.com/atom/ns#" term="warszawa-jug" /><title>"Zwinna" Warsjawa 2009 w najbliższą sobotę</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.warszawa.jug.pl/"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 132px; height: 200px;" src="http://groups.google.com/group/warszawa-jug/web/WarszawaJUG.gif?display=thumb&amp;amp;width=200&amp;amp;height=200" alt="" border="0" /&gt;&lt;/a&gt;W najbliższą sobotę, &lt;span style="font-weight: bold;"&gt;24. października&lt;/span&gt;, w godzinach 10:00-16:00 odbędzie się &lt;a href="http://www.warsjawa.pl/"&gt;"Zwinna" Warsjawa 2009&lt;/a&gt; organizowana przez grupę &lt;a href="http://www.warszawa.jug.pl/"&gt;Warszawa JUG&lt;/a&gt;. Tym razem nie na MIMUWie, czy w auli Wydziału Biologii, ale na &lt;a href="http://www.elka.pw.edu.pl/"&gt;Elce - Wydziale Elektroniki i Technik Informacyjnych&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Informacje o konferencji znajdziecie na jej stronie domowej i wierzę, że już wszyscy wiedzą co i jak, i stawią się tłumnie. Wstęp wolny, a jeszcze w międzyczasie będzie poczęstunek - pizza! Dzięki naszym sponsorom &lt;a href="http://softwaremill.pl/"&gt;softwaremill&lt;/a&gt;, &lt;a href="http://pragmatists.pl/"&gt;pragmatists&lt;/a&gt; i &lt;a href="http://www.ej-technologies.com/"&gt;ej-technologies&lt;/a&gt; całość imprezy nie wiąże się dla Was z żadnymi kosztami, a zwinnych wystąpień nie powinno zabraknąć (dosłownie i w przenośni).&lt;br /&gt;&lt;br /&gt;Niech harmonogram mówi sam za siebie:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;10:00 - 10:15 - słowo wstępne&lt;/li&gt;&lt;li&gt;10:15 - 11:00 - I ty możesz być zwinny (30 minut wykład, 15 minut na dyskusję) - &lt;span style="font-weight: bold;"&gt;Łukasz Lenart&lt;/span&gt;&lt;/li&gt;&lt;li&gt;11:00 - 11:45 - I Twój zespół może być zwinny (czas j. w.) - &lt;span style="font-weight: bold;"&gt;Paweł Lipiński&lt;/span&gt;&lt;/li&gt;&lt;li&gt;11:45 - 12:30 - TDD w Twoim zespole (czas j. w.) - &lt;span style="font-weight: bold;"&gt;Krzysztof Jelski&lt;/span&gt;&lt;/li&gt;&lt;li&gt;12:30 - 13:30 - przerwa na Pizzę!&lt;/li&gt;&lt;li&gt;13:30 - 14:15 - Scrum czyli Młyn, ale w rozproszeniu (czas j. w.) - &lt;span style="font-weight: bold;"&gt;Tomek Szymański&lt;/span&gt;&lt;/li&gt;&lt;li&gt;14:15 - 15:00 - Niepopularne retrospekcje (czas j. w.) - &lt;span style="font-weight: bold;"&gt;Tomek Łasica&lt;/span&gt;&lt;/li&gt;&lt;li&gt;15:00 - 15:30 - dyskusje, dojadanie pizzy i koniec....&lt;/li&gt;&lt;/ul&gt;Niektórych prelegentów już znam i największą niewiadomą jest dla mnie &lt;span style="font-weight: bold;"&gt;Tomek Łasica&lt;/span&gt;. Wiem ile zależy od prowadzącego i jestem ciekaw, co gość zaprezentuje. Reszta prelegentów już wygłaszała swoje peany nt. Agile podczas konferencji - Paweł i Krzysiek, więc połowicznymi niewiadomymi będą dla mnie - Łukasz i Tomek Sz. (znany szerokiej publiczności jako &lt;span style="font-style: italic;"&gt;"szimano"&lt;/span&gt;). Cięty język to jego drugie ja i liczę, że ten Młyn i to jeszcze w rozproszeniu będzie właśnie zbiorem takich ciętych ripost pod adresem Scruma (nie muszą być krytyczne, ale zwięzłe i konkretne aż do bólu jak najbardziej). Brakuje mi w tym gronie Michała M., albo Pawła W. z naszego lokalnego podwórka (nazwiska znane redakcji :)). Z tego, co się zorientowałem ich Agile też porwało! A czy są wśród nas sceptycy? Słuchać samych ewangelistów może być nużące.&lt;br /&gt;&lt;br /&gt;Jakkolwiek sama Warsjawa nie jest organizowana pierwszy raz, to pojawienie się jej na Elce może zaskoczyć. Sam nie wiem, czego można się tam spodziewać, więc nawet jeśli nie sama konferencja, to chociaż miejsce powinno być dla mnie źródłem ciekawych doświadczeń. Będzie czas na dyskusje, więc należałoby jedynie zadbać, aby nie zaprzepaścili nam go przeciągający czas występu prelegenci. To będzie nasz obywatelski projekt, aby dopilnować końca wystąpienia i mieć czas na dyskusje. Zgoda?&lt;br /&gt;&lt;br /&gt;p.s. Kto zamierza twittować czy blipować? Wiedza na bieżąco, jak idą prezentacje może być interesująca dla tych, którym nie dane było pojawić się na nich. W zasadzie w takim wykorzystaniu twittera/blipa widzę ich największą wartość. Może poza informowaniem o pracy zespołu przy projekcie, ale to już temat na inne p.s.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-894585223725033600?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/7lw_NRUFgT0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/894585223725033600/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=894585223725033600" title="Komentarze (7)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/894585223725033600?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/894585223725033600?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/10/zwinna-warsjawa-2009-w-najblizsza.html" title="&quot;Zwinna&quot; Warsjawa 2009 w najbliższą sobotę" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total></entry><entry gd:etag="W/&quot;DUAMRnY4eyp7ImA9WxNWGUs.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-5734818569937011391</id><published>2009-10-19T17:47:00.004+02:00</published><updated>2009-10-19T17:56:27.833+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T17:56:27.833+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><title>Java Type Proposals wyłączone w Eclipse IDE 3.6?!</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wSeV_DMR2uA/StyLY0zl1pI/AAAAAAAACaQ/Zu73jQSb7lk/s1600-h/eclipse-osgi-project_19102009_174515.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 186px;" src="http://3.bp.blogspot.com/_wSeV_DMR2uA/StyLY0zl1pI/AAAAAAAACaQ/Zu73jQSb7lk/s320/eclipse-osgi-project_19102009_174515.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394339712291165842" /&gt;&lt;/a&gt;To już nie pierwszy raz, kiedy się z tym spotykam i nie wiem, czemu miało by to służyć?! Korzystam z &lt;span style="font-weight:bold;"&gt;Eclipse IDE 3.6m2&lt;/span&gt; i wciskając &lt;span style="font-weight:bold;"&gt;Ctrl+Spacja&lt;/span&gt; w edytorze javowym nie są podpowiadane typy javowe?!&lt;br /&gt;&lt;br /&gt;Rozwiązaniem jest włączenie opcji &lt;span style="font-weight:bold;"&gt;Java Type Proposals&lt;/span&gt; w &lt;span style="font-weight:bold;"&gt;Preferences &amp;gt; Java &amp;gt; Editor &amp;gt; Content Assist &amp;gt; Advanced&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wSeV_DMR2uA/StyLNMVBZII/AAAAAAAACaI/TJvymS0FBkA/s1600-h/eclipse-osgi-project_19102009_174500.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 312px; height: 320px;" src="http://4.bp.blogspot.com/_wSeV_DMR2uA/StyLNMVBZII/AAAAAAAACaI/TJvymS0FBkA/s320/eclipse-osgi-project_19102009_174500.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394339512446968962" /&gt;&lt;/a&gt;Czy mógłby mi ktoś wyjaśnić, dlaczego to jest domyślnie wyłączone? To tak, jakby zaoferować samochód ze wskazaniem, że służy wyłącznie do spania (zamiast jeżdżenia).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-5734818569937011391?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/7fT_7O5a6II" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/5734818569937011391/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=5734818569937011391" title="Komentarze (7)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5734818569937011391?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5734818569937011391?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/10/java-type-proposals-wyaczone-w-eclipse.html" title="Java Type Proposals wyłączone w Eclipse IDE 3.6?!" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_wSeV_DMR2uA/StyLY0zl1pI/AAAAAAAACaQ/Zu73jQSb7lk/s72-c/eclipse-osgi-project_19102009_174515.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total></entry><entry gd:etag="W/&quot;AkcMSX0_fSp7ImA9WxNWF04.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-8347286065849442910</id><published>2009-10-16T22:48:00.000+02:00</published><updated>2009-10-17T02:08:08.345+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-17T02:08:08.345+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="osgi" /><title>Tworzenie pakunków OSGi w Eclipse IDE 3.6m2 - Eclipse się sprawdził</title><content type="html">Potrzebowałem stworzyć wtyczkę OSGi, ale nie miałem zamiaru zejść na poziom linii poleceń. To już przerabiałem w &lt;a href="http://www.jaceklaskowski.pl/wiki/Tworzenie_pakiet%C3%B3w_OSGi_z_Apache_Maven_2"&gt;Tworzenie pakietów OSGi z Apache Maven 2&lt;/a&gt; czy &lt;a href="http://www.jaceklaskowski.pl/wiki/Pakunki_OSGi_w_projekcie_wielomodu%C5%82owym_Apache_Maven_2_z_maven-bundle-plugin"&gt;Pakunki OSGi w projekcie wielomodułowym Apache Maven 2 z maven-bundle-plugin&lt;/a&gt;. Tym razem miałem potrzebę skorzystania z IDE.&lt;br /&gt;&lt;br /&gt;NetBeans IDE odpada, bo nie oferuje żadnego wsparcia w tym temacie. IntelliJ IDEA - hmmm, nie mam wciąż pojęcia, czy się nadaje, ale przecież Eclipse IDE to w końcu środowisko oparte na OSGi - jako platformie i składowych. W Eclipse można stworzyć jego wtyczki (rozszerzenia), które są niczym innym jak pakunkami OSGi.&lt;br /&gt;&lt;br /&gt;Po chwili byłem po lekturze artykułu &lt;a href="http://www.vogella.de/articles/OSGi/article.html"&gt;OSGi with Eclipse Equinox - Tutorial&lt;/a&gt; i byłem gotów do eksperymentów.&lt;br /&gt;&lt;br /&gt;Zaczynam typowo. Otwieram Eclipse 3.6M2, &lt;span style="font-style:italic;"&gt;Ctrl+N&lt;/span&gt; i wybieram &lt;span style="font-style:italic;"&gt;Plug-in Project&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wSeV_DMR2uA/StkHClE9VJI/AAAAAAAACYw/u0C2F5gZ2J0/s1600-h/eclipse-osgi-project_17102009_012802.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://3.bp.blogspot.com/_wSeV_DMR2uA/StkHClE9VJI/AAAAAAAACYw/u0C2F5gZ2J0/s320/eclipse-osgi-project_17102009_012802.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5393349769646920850" /&gt;&lt;/a&gt;Uzupełniam dane projektu przyszłej wtyczki - &lt;span style="font-weight:italic;"&gt;Project name&lt;/span&gt; ustawiam na &lt;span style="font-style:italic;"&gt;ejb-client&lt;/span&gt; i wybieram &lt;span style="font-style:italic;"&gt;Target Platform&lt;/span&gt; jako &lt;span style="font-style:italic;"&gt;an OSGi framework: standard&lt;/span&gt; (ktoś wie, co to oznacza i czego nie mam w porównaniu z Equinox?).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wSeV_DMR2uA/StkHRfik7iI/AAAAAAAACY4/vcNSeTulseU/s1600-h/eclipse-osgi-project_17102009_012954.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 281px; height: 320px;" src="http://1.bp.blogspot.com/_wSeV_DMR2uA/StkHRfik7iI/AAAAAAAACY4/vcNSeTulseU/s320/eclipse-osgi-project_17102009_012954.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5393350025858575906" /&gt;&lt;/a&gt;Kolejny ekran bez zmian&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wSeV_DMR2uA/StkHbMUO56I/AAAAAAAACZA/JXYtEFR1eAA/s1600-h/eclipse-osgi-project_17102009_013021.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 281px; height: 320px;" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/StkHbMUO56I/AAAAAAAACZA/JXYtEFR1eAA/s320/eclipse-osgi-project_17102009_013021.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5393350192496830370" /&gt;&lt;/a&gt;i w następnym &lt;span style="font-style:italic;"&gt;Templates&lt;/span&gt; wybieram &lt;span style="font-style:italic;"&gt;Hello OSGi Bundle&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wSeV_DMR2uA/StkHg1xwJ9I/AAAAAAAACZI/O3eahVRuDWw/s1600-h/eclipse-osgi-project_17102009_013156.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 281px; height: 320px;" src="http://3.bp.blogspot.com/_wSeV_DMR2uA/StkHg1xwJ9I/AAAAAAAACZI/O3eahVRuDWw/s320/eclipse-osgi-project_17102009_013156.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5393350289525843922" /&gt;&lt;/a&gt;Super te szablony, bo z nimi stworzenie bardziej wyrafinowanej wtyczki (wszystkie poza wspomnianym &lt;span style="font-style:italic;"&gt;Hello OSGi Bundle&lt;/span&gt;) sprowadza się do odpowiedniego wyboru. Nie trzeba nawet wiedzieć, co to są pakunki, aby je stworzyć!&lt;br /&gt;&lt;br /&gt;Ostatni ekran to konfiguracja szablonu, więc może się różnic, w zależności od wcześniejszego wyboru.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wSeV_DMR2uA/StkHwStboZI/AAAAAAAACZQ/5zGB3amFLxo/s1600-h/eclipse-osgi-project_17102009_013235.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 281px; height: 320px;" src="http://4.bp.blogspot.com/_wSeV_DMR2uA/StkHwStboZI/AAAAAAAACZQ/5zGB3amFLxo/s320/eclipse-osgi-project_17102009_013235.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5393350554990387602" /&gt;&lt;/a&gt;Kiedy pojawi się pytanie o przełączenie perspektywy na &lt;span style="font-style:italic;"&gt;Plug-in Development&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wSeV_DMR2uA/StkH9PfI_wI/AAAAAAAACZY/TjmfPVd-s4A/s1600-h/eclipse-osgi-project_17102009_013355.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 152px;" src="http://4.bp.blogspot.com/_wSeV_DMR2uA/StkH9PfI_wI/AAAAAAAACZY/TjmfPVd-s4A/s320/eclipse-osgi-project_17102009_013355.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5393350777463439106" /&gt;&lt;/a&gt;wciskam &lt;span style="font-style:italic;"&gt;Yes&lt;/span&gt; i w końcu mam swój wymarzony pakunek OSGi.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wSeV_DMR2uA/StkIEOsjuPI/AAAAAAAACZg/FFMyLrmDAAM/s1600-h/eclipse-osgi-project_17102009_013428.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 252px;" src="http://3.bp.blogspot.com/_wSeV_DMR2uA/StkIEOsjuPI/AAAAAAAACZg/FFMyLrmDAAM/s320/eclipse-osgi-project_17102009_013428.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5393350897510365426" /&gt;&lt;/a&gt;Teraz można dalej się bawić w tworzenie bardziej wyrafinowanych elementów pakunku, a na uznanie zasługują dwie rzeczy - edytor MANIFEST.MF (patrz zrzut ekranu wyżej) oraz widok &lt;span style="font-style:italic;"&gt;Outline&lt;/span&gt; (na zrzucie wyżej po prawej).&lt;br /&gt;&lt;br /&gt;Kiedy przełączyłem się na zakładkę MANIFEST.MF w edytorze manifestu, w widoku &lt;span style="font-style:italic;"&gt;Outline&lt;/span&gt; pojawiła się charakterystyka pakunku. Bajera!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wSeV_DMR2uA/StkIS0o-q9I/AAAAAAAACZo/Q-c2Fp-PiQI/s1600-h/eclipse-osgi-project_17102009_013648.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 252px;" src="http://1.bp.blogspot.com/_wSeV_DMR2uA/StkIS0o-q9I/AAAAAAAACZo/Q-c2Fp-PiQI/s320/eclipse-osgi-project_17102009_013648.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5393351148214070226" /&gt;&lt;/a&gt;Mając gotową wtyczkę/pakunek wystarczy &lt;span style="font-style:italic;"&gt;File &amp;gt; Export&lt;/span&gt; i wybrać &lt;span style="font-style:italic;"&gt;Deployable plug-ins and fragments&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Mamy możliwość wyboru pakunku i jego danych do eksportu.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wSeV_DMR2uA/StkIeBj-s5I/AAAAAAAACZw/hk3OwxMKNko/s1600-h/eclipse-osgi-project_17102009_013741.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 274px; height: 320px;" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/StkIeBj-s5I/AAAAAAAACZw/hk3OwxMKNko/s320/eclipse-osgi-project_17102009_013741.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5393351340661322642" /&gt;&lt;/a&gt;Po prostu bajka. Wszystko idzie bez najmniejszych potknięć. W katalogu &lt;span style="font-style:italic;"&gt;plugins&lt;/span&gt;, poniżej wskazanego katalogu, czeka na nas gotowy do uruchomienia pakunek OSGi.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wSeV_DMR2uA/StkIvrq3SqI/AAAAAAAACZ4/qx2ZRjgaRK4/s1600-h/eclipse-osgi-project_17102009_014107.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 314px; height: 320px;" src="http://1.bp.blogspot.com/_wSeV_DMR2uA/StkIvrq3SqI/AAAAAAAACZ4/qx2ZRjgaRK4/s320/eclipse-osgi-project_17102009_014107.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5393351644022262434" /&gt;&lt;/a&gt;W łatwy sposób mamy możliwość importu istniejących pakunków oraz definiowania zależności między nimi - określenie importów i eksportów w manifeście.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wSeV_DMR2uA/StkJBYpVyNI/AAAAAAAACaA/aOJTFkQzAxU/s1600-h/eclipse-osgi-project_17102009_014647.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 222px;" src="http://2.bp.blogspot.com/_wSeV_DMR2uA/StkJBYpVyNI/AAAAAAAACaA/aOJTFkQzAxU/s320/eclipse-osgi-project_17102009_014647.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5393351948153243858" /&gt;&lt;/a&gt;Tym samym Eclipse IDE 3.6m2 stało się narzędziem numer 1, jeśli chodzi o tworzenie pakunków OSGi.&lt;br /&gt;&lt;br /&gt;Ciekawe, czy IntelliJ IDEA daje jakiekolwiek wsparcie dla tworzenia pakunków OSGi?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-8347286065849442910?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/u1ACv_5oLoo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/8347286065849442910/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=8347286065849442910" title="Komentarze (2)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/8347286065849442910?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/8347286065849442910?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/10/tworzenie-pakunkow-osgi-w-eclipse-ide.html" title="Tworzenie pakunków OSGi w Eclipse IDE 3.6m2 - Eclipse się sprawdził" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_wSeV_DMR2uA/StkHClE9VJI/AAAAAAAACYw/u0C2F5gZ2J0/s72-c/eclipse-osgi-project_17102009_012802.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;D0EBRns_fip7ImA9WxNWFUg.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-2914021356833312358</id><published>2009-10-14T22:49:00.006+02:00</published><updated>2009-10-14T23:27:37.546+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-14T23:27:37.546+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="osgi" /><category scheme="http://www.blogger.com/atom/ns#" term="it-soa" /><title>IT-SOA - interesujący projekt z OSGi/SCA w roli głównej na AGH i innych polskich uczelniach</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wSeV_DMR2uA/StY6T96oY-I/AAAAAAAACYg/xIqhuIQ-DC4/s1600-h/itsoa-logo.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 41px;" src="http://4.bp.blogspot.com/_wSeV_DMR2uA/StY6T96oY-I/AAAAAAAACYg/xIqhuIQ-DC4/s320/itsoa-logo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5392561718535152610" /&gt;&lt;/a&gt;Kilka dni temu natchnęło mnie na wyszukiwanie informacji o prowadzonych projektach badawczych wokół OSGi na polskich uczelniach. Nie pamiętam dokładnie jaką frazę wpisałem w Google, ale było to bodajże &lt;span style="font-style:italic;"&gt;"osgi uniwersytet"&lt;/span&gt; i w zakładce zaawansowane wybrałem język polski. Ku mojemu zdumieniu natrafiłem na bardzo zaawansowany technologicznie projekt &lt;a href="https://www.soa.edu.pl/"&gt;IT-SOA&lt;/a&gt;, którego uczestnikami są AGH z Krakowa, Uniwersytet Ekonomiczny w Poznaniu, Politechnika Poznańska, Instytut Podstaw Informatyki PAN i Politechnika Wrocławska.&lt;br /&gt;&lt;br /&gt;Za stroną główną projektu: &lt;span style="font-style:italic;"&gt;"Projekt dotyczy współczesnych technologii informacyjnych działających w systemach rozproszonych."&lt;/span&gt; Nie powiem, żeby mnie nie zaintrygowało. Zacząłem przeglądać informacje o projekcie i trafiłem na &lt;a href="https://www.soa.edu.pl/web/guest/19"&gt;Obszar Badawczy 5&lt;/a&gt;, którego tematem przewodnim był OSGi (było tam kilka innych akronimów, ale ja widziałem, albo chciałem widzieć, jedynie OSGi :)).&lt;br /&gt;&lt;br /&gt;Postanowiłem napisać do koordynatora projektu (namiary na stronie &lt;a href="https://www.soa.edu.pl/web/guest/5"&gt;Kontakt&lt;/a&gt;) i niedługo musiałem czekać, aby dostać odpowiedź z...Sekretariatu Projektu SOA. Po krótkiej korespondencji z panem &lt;span style="font-weight:bold;"&gt;prof. Krzysztofem Zielińskim&lt;/span&gt; z AGH, który zawiaduje projektem okazało się, że dzisiejszy dzień (środa) jest najlepszy dla obu stron i spotykamy się w Krakowie, aby przedyskutować temat współpracy (okazało się, że IBM jest również zaangażowany w temat, więc nie mogłem życzyć sobie więcej).&lt;br /&gt;&lt;br /&gt;Po kilkugodzinnej rozmowie w gronie pracowników AGH zaangażowanych w temat okazało się, że mimo początkowego sceptycyzmu, że OSGi jest, i SOA też, ale pewnie jedynie dla wzmocnienia przekazu projektu, bez jakiegokolwiek mocniejszego wykorzystania, projekt nie tylko, że wymienia je z nazwy, ale rozpoznanie technologiczne nie skupia się na podstawowym użyciu, ale również w postaci rozwiązań typu Spring-DM, Swordfish, Distributed OSGi (D-OSGi) i in. Bardzo mocno korzysta się z ServiceMix 4 z jego wsparciem dla OSGi i możliwością klastrowania komponentów JBI (jako członek ServiceMix PMC nie miałem nawet świadomości, że JBI jest wspierane przez niego). Padły również akronimy typu SCA, CEI (rozwiązanie WebSphere AS do rozgłaszania komunikatów) oraz CBE (format komunikatów), więc można sobie tylko wyobrazić, jak chłonąłem te wszystkie informacje podczas spotkania. Widać, że jest z kim porozmawiać na te tematy w Krakowie, bo na AGH naliczyłem 6 osób, które wiedzą, co w trawie piszczy.&lt;br /&gt;&lt;br /&gt;Byłoby to niesamowite doświadczenie móc uczestniczyć w tego typu przedsięwzięciu, więc rozpoczynam moją krucjatę, aby choć przez chwilę móc czerpać z doświadczeń projektu IT-SOA.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://pragprog.com/titles/shcloj/programming-clojure"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 190px; height: 228px;" src="http://3.bp.blogspot.com/_wSeV_DMR2uA/StZBzZwhiLI/AAAAAAAACYo/99wQcpNEw9w/s320/shcloj.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5392569955166292146" /&gt;&lt;/a&gt;&lt;br /&gt;Podczas podróży miałem okazję przeczytać pierwsze rozdziały książki &lt;a href="http://pragprog.com/titles/shcloj/programming-clojure"&gt;Programming Clojure&lt;/a&gt;. Jedyne co mogę powiedzieć po 3 rozdziałach, to że programowanie funkcyjne jest...trudne dla mojego imperatywno-obiektowego postrzegania świata. Wciąż zachodzę w głowę dlaczego miałbym się nauczyć Clojure, ale skoro mam o nim książkę i wielu wychwalało programowanie funkcyjne jako odświeżające, postaram się wytrwać do końca. Tak wiele trudności w zrozumieniu tematu z branży IT już dawno nie miałem, a już odnośnie samego programowania, wcale. Czy tylko ja doświadczam takich trudności intelektualnych?!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-2914021356833312358?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/ADv0vUT69mM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/2914021356833312358/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=2914021356833312358" title="Komentarze (7)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2914021356833312358?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2914021356833312358?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/10/it-soa-interesujacy-projekt-z-osgisca-w.html" title="IT-SOA - interesujący projekt z OSGi/SCA w roli głównej na AGH i innych polskich uczelniach" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_wSeV_DMR2uA/StY6T96oY-I/AAAAAAAACYg/xIqhuIQ-DC4/s72-c/itsoa-logo.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total></entry><entry gd:etag="W/&quot;D0EBQn85fSp7ImA9WxNWEks.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-406330508826278679</id><published>2009-10-11T14:52:00.001+02:00</published><updated>2009-10-11T14:54:13.125+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-11T14:54:13.125+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="warszawa-jug" /><category scheme="http://www.blogger.com/atom/ns#" term="javame" /><title>53. spotkanie Warszawa JUG - "Java w długopisie, zaskakująco użyteczne połączenie" Michała Margiela</title><content type="html">&lt;a href="http://www.warszawa.jug.pl"&gt;Warszawska Grupa Użytkowników Technologii Java (Warszawa JUG)&lt;/a&gt; zaprasza na 53. spotkanie, które odbędzie się w najbliższy wtorek, 13.10.2009 o godzinie 18:00 w sali 5440 Wydziału MIMUW przy ul. Banacha 2 w Warszawie.&lt;br /&gt;&lt;br /&gt;Temat prezentacji: &lt;b&gt;Java w długopisie, zaskakująco użyteczne połączenie&lt;/b&gt;&lt;br /&gt;Prelegent: &lt;a href="http://poligloci.margiel.eu"&gt;Michał Margiel&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;W takcie prezentacji Michał przedstawi genialny[1] wynalazek firmy livescribe - inteligentny długopis o jakże zaskakującej nazwie "Smart pen", który może zrewolucjonizować sposób prowadzenia notatek na wykładach[1].&lt;br /&gt;&lt;br /&gt;Długopis zawdzięcza swą "mądrość" Javie ME, którą ma na pokładzie oraz rozszerzeniom, o których więcej podczas prezentacji.&lt;br /&gt;&lt;br /&gt;Wykład składa się z dwóch części. W pierwszej zostaną zaprezentowane wbudowane możliwości pisaka - synchronizacja tego, co piszemy z tym, co słyszymy, rozpoznawanie pisma, oraz aplikacja desktopowa do zarządzania naszymi notatkami. W drugiej części przedstawiony będzie interfejs programistyczny na przykładzie aplikacja tworzonej na żywo.&lt;br /&gt;&lt;br /&gt;Zdaniem Michała każdy student (ale nie tylko) po wysłuchaniu prelekcji będzie marzył o własnym "Smart penie"&lt;br /&gt;&lt;br /&gt;&lt;a href="http://poligloci.margiel.eu"&gt;Michał Margiel&lt;/a&gt; jest absolwentem wydziału Elektrycznego Politechniki Warszawskiej, z wykształcenia informatyk. W WJUGu jest od samego początku jego istnienia, oraz współorganizował dwie edycje konferencji Javarsovia. Na codzień pracuje  w firmie Pragmatists na stanowisko artysta-programista[2] , zaś samą javą zajmuje się już od ponad 4 lat. Posiada certyfikaty SCJP, SCWCD, pomocy przedmedycznej oraz wychowawcy kolonijnego.&lt;br /&gt;&lt;br /&gt;Planowany czas prezentacji to 1,5 godziny, po której planuje się 15-30-minutową dyskusję.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Wstęp wolny!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Zapraszam w imieniu prelegenta i grupy Warszawa JUG!&lt;br /&gt;&lt;br /&gt;[1] Tak przynajmniej twierdzi Prelegent.&lt;br /&gt;[2] Oczywiście artysta sztuki programowania ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-406330508826278679?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/bg9xIOmKThE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/406330508826278679/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=406330508826278679" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/406330508826278679?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/406330508826278679?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/10/53-spotkanie-warszawa-jug-java-w.html" title="53. spotkanie Warszawa JUG - &quot;Java w długopisie, zaskakująco użyteczne połączenie&quot; Michała Margiela" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;D0YGQXk9fCp7ImA9WxNWEUQ.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-4664275304716705852</id><published>2009-10-10T18:23:00.004+02:00</published><updated>2009-10-10T19:18:40.764+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-10T19:18:40.764+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="recenzje" /><category scheme="http://www.blogger.com/atom/ns#" term="osgi" /><category scheme="http://www.blogger.com/atom/ns#" term="spring-dm" /><title>Recenzja "Pro Spring Dynamic Modules for OSGi Service Platforms" z Apress - dobry wstęp do OSGi/Spring-DM, ale ogólnie klapa</title><content type="html">Udało mi się wygospodarować trochę czasu na lekturę &lt;a href="http://www.apress.com/book/view/1430216123"&gt;Pro Spring Dynamic Modules for OSGi™ Service Platforms&lt;/a&gt; autorstwa Daniela Rubio z wydawnictwa Apress i niestety, ale noty są bardzo niskie. Dobre wprowadzenie do OSGi i Spring-DM, ale jak na książkę z "Pro" w tytule, to zdecydowanie za mało. Zresztą, gdyby tylko to, ale listingi build.xml Anta, cały 2 rozdział o Spring Framework czy kolejny o SpringSource dm Server przeszły moje najśmielsze oczekiwania, co można zrobić z książką, gdzie tematem przewodnim miał być Spring-DM. Tyle sobie obiecywałem po tej książce, a skończyło się na tym, że jestem mocniejszy w Apache Ant, Apache Ivy i wiem, co w trawie piszczy odnośnie SpringSource dm Server. Później miało być lepiej. Szumny tytuł o wersjonowaniu w OSGi, tworzeniu aplikacji webowych z Spring-DM oraz testowanie aplikacji opartych na OSGi ze Spring-DM, a skończyło się jedynie na wielkich oczekiwaniach i niemiłym zaskoczeniu, że mogło być więcej, lepiej, itp. Nie powiem, że nie nauczyłem się więcej o OSGi, ale zdecydowanie za mało jak na książkę "Pro" (każdorazowo, kiedy piszę to słowo przypomina mi się wypowiedź Lt. Aldo Raine w "Inglourious Basterds" &lt;span style="font-style:italic;"&gt;"I think you show great talent. And I pride myself on having an eye for that kind of talent. Your status as a Nazi killer is... still amateur. We all come here to see if you wanna go pro..."&lt;/span&gt;). W tej książce mieć talent, to znaleźć te brylanty, które po 300 stronach zrobią z nas Pro. Ostrzegam jednak, nie będzie łatwo. W zasadzie, każdy komu ta książka nie zacznie się dłużyć stanie się Pro. Może o to chodziło autorowi?!&lt;br /&gt;&lt;br /&gt;Podsumowując, książka nie warta swych pieniędzy, ale dla członków &lt;a href="http://www.warszawa.jug.pl"&gt;Warszawa JUG&lt;/a&gt;, którzy mają ją kosztem recenzji, i są zainteresowani wprowadzeniem do OSGi i Spring-DM z dodatkami w stylu Ant, Ivy czy SSdS, dlaczego nie?! Uważam, że bez wygórowanych oczekiwań można znaleźć kilka ciekawostek.&lt;br /&gt;&lt;br /&gt;Pełną recencję książki po angielsku (ze względu na wymagania wydawcy w programie "Książka za recenzję") znajdziecie w &lt;a href="http://www.jaceklaskowski.pl/wiki/Book_review:_Pro_Spring_Dynamic_Modules_for_OSGi_Service_Platforms"&gt;Book review: Pro Spring Dynamic Modules for OSGi Service Platforms&lt;/a&gt;. Miłej lektury - recenzji i...książki! ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-4664275304716705852?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/-uhOlrHDRfk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/4664275304716705852/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=4664275304716705852" title="Komentarze (2)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/4664275304716705852?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/4664275304716705852?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/10/recenzja-pro-spring-dynamic-modules-for.html" title="Recenzja &quot;Pro Spring Dynamic Modules for OSGi Service Platforms&quot; z Apress - dobry wstęp do OSGi/Spring-DM, ale ogólnie klapa" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;AkINQng-eip7ImA9WxNWEEo.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-6662095678238278548</id><published>2009-10-09T10:33:00.003+02:00</published><updated>2009-10-09T10:56:33.652+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-09T10:56:33.652+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="maven2" /><category scheme="http://www.blogger.com/atom/ns#" term="ejb3" /><category scheme="http://www.blogger.com/atom/ns#" term="glassfish" /><category scheme="http://www.blogger.com/atom/ns#" term="artykuły" /><title>Uruchomienie zdalnego klienta EJB wyłącznie w oparciu o interfejs biznesowy (bez implementacji)</title><content type="html">Właśnie takiego obrotu sprawy sobie życzyłem. Publikuję wyniki moich doświadczeń szerszemu gronu z nadzieją, że komukolwiek zechce się poświęcić trochę czasu na prześledzenie mojego toku myślenia i samych wyników. Tak też było w przypadku mojego, ostatniego artykułu &lt;a href="http://www.jaceklaskowski.pl/wiki/Jak_d%C5%82ugo_korzysta%C4%87_z_referencji_bezstanowego_komponentu_sesyjnego_EJB_%28na_przyk%C5%82adzie_EJB_3.0_i_GlassFish_v3%29"&gt;Jak długo korzystać z referencji bezstanowego komponentu sesyjnego EJB (na przykładzie EJB 3.0 i GlassFish v3)&lt;/a&gt;. Jego celem było sprawdzenie zachowania się zdalnej referencji EJB3 podczas niedostępności serwera. Przeoczyłem jednak fakt, że aplikacja kliencka dystrybuowana była nie tylko ze zdalnym interfejsem biznesowym, ale również z jego implementacją jako bezstanowe ziarno sesyjne EJB. Nie długo trzeba było czekać, aby takiemu podejściu zaprotestował &lt;a href="http://jlaskowski.blogspot.com/2009/10/jak-dugo-korzystac-z-referencji.html?showComment=1254820416881#c6303916172857002979"&gt;Łukasz Lenart&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Jedna uwaga, która ogólnie jest globalna do tego typu przykładów. Mianowicie klientowi dostarczasz nie tylko interfejs ale również implementację jako zależność, przez co używanie serwera aplikacyjnego do zdalnej komunikacji jest zbędnym narzutem. Nigdzie jeszcze nie znalazłem przykładu jak to zrobić bez dostarczania implementacji a tylko sam interfejs. Moje próby potwierdziły tylko, że tego nie da się zrobić w przypadku Glassfisha :-(&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Problem, jaki wskazał Łukasz, polegał na dystrybuowaniu zdalnego klienta EJB3 w paczce, która zawierała nie tylko interfejs biznesowy, ale i jego implementację (!) Przyznaję, że nie pomyślałem o takim skonstruowaniu paczki dystrybucyjnej klienta, która nie zawierałaby implementacji komponentu EJB, z którego korzysta. Kiedy przeczytałem komentarz, a szczególnie jego ostatnie zdanie, nie miałem złudzeń czym się zająć.&lt;br /&gt;&lt;br /&gt;Ten rodzaj reakcji jest zapewne największym podziękowaniem czytelników - dzielimy się własnymi reakcjami na proponowaną rzeczywistość. W końcu autor mógł nie wiedzieć, że da się lepiej, lub po prostu uważać to za nieistotne. Stwarza się w ten sposób okazję do wymiany doświadczeń w jedną (od autora) i drugą, zwrotną stronę (od czytelników), w której nie ma strony wiodącej (poza stroną inicjującą dyskusję, ale tutaj trudno wskazać, czy sam autor artykułu, czy komentarza nią jest - świetny temat na pracę doktorską z filozofii :-)). Tak czy owak, jest nad czym się pochylić i artykuł spełnia swoją rolę - nie jest jednostronny. Najważniejsze, że przy takim podejściu nikt nie traci, bo ja miałem kolejny temat, a Łukasz et al rozwiązanie. Idziemy tym samym naprzód i kolejne projekty stają jeszcze prostsze technologicznie.&lt;br /&gt;&lt;br /&gt;Uwielbiam takie publiczne dywagacje, bo nigdy nie wiadomo z kim przyjdzie mi rozmawiać. W przypadku Łukasza to sprawa jest prosta - dostaje baty w bilarda, więc chciał się odegrać :P Ale nie tylko Łukasz zareagował! Dostałem prywatnie komentarz od &lt;span style="font-weight:bold;"&gt;Pawła Balczyńskiego&lt;/span&gt;, który znalazł błąd w jednym z listingów. Standardowe "U mnie działa" miało przez chwilę zastosowanie, ale fakt faktem błąd był (tylko dlaczego u mnie działało?!). Dzięki Paweł!&lt;br /&gt;&lt;br /&gt;Zainteresowanych kolejnym doświadczeniem i jego wynikami zapraszam do lektury nowego artykułu &lt;a href="http://www.jaceklaskowski.pl/wiki/Uruchomienie_zdalnego_klienta_EJB_wy%C5%82%C4%85cznie_w_oparciu_o_interfejs_biznesowy_%28bez_implementacji%29"&gt;Uruchomienie zdalnego klienta EJB wyłącznie w oparciu o interfejs biznesowy (bez implementacji)&lt;/a&gt;. Teraz oczekuję kolejnej porcji pomysłów na udoskonalenie warsztatu. Komenatrze mile widziane - na priv, albo w komentarzu do tego wpisu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-6662095678238278548?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/DfiAg90h17o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/6662095678238278548/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=6662095678238278548" title="Komentarze (2)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/6662095678238278548?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/6662095678238278548?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/10/uruchomienie-zdalnego-klienta-ejb.html" title="Uruchomienie zdalnego klienta EJB wyłącznie w oparciu o interfejs biznesowy (bez implementacji)" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;CU8ERXk4eyp7ImA9WxNXF0o.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-8484830454932135244</id><published>2009-10-05T22:00:00.002+02:00</published><updated>2009-10-05T22:16:44.733+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-05T22:16:44.733+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ejb3" /><category scheme="http://www.blogger.com/atom/ns#" term="glassfish" /><category scheme="http://www.blogger.com/atom/ns#" term="artykuły" /><title>Jak długo korzystać z referencji bezstanowego komponentu sesyjnego EJB (na przykładzie EJB 3.0 i GlassFish v3)</title><content type="html">Niedawno dostałem do skrzynki takie pytanie:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;(...)Głównie nurtuje mnie "jak długo" po otrzymaniu referencji do ejb mogę go używać (kontener może go przecież spasywować/usunąć albo *** wie, co jeszcze zrobić) - mogę z niego korzystać dowolnie długo/pobierać od nowa co wywołanie metody biznesowej czy jeszcze inaczej?&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Początkowo miałem po prostu odpowiedzieć i zapomnieć o temacie. Zdalna referencja jest jedynie &lt;span style="font-weight:bold;"&gt;pośrednikiem&lt;/span&gt; (ang. &lt;span style="font-style:italic;"&gt;proxy&lt;/span&gt;) między kodem klienta a serwerem i tak na prawdę odpowiada jedynie za komunikację z serwerem bez utrzymywania jakiegokolwiek stanu komponentu EJB. Mimo jasnej dla mnie odpowiedzi, postanowiłem sprawdzić ją w ramach niewielkiego eksperymentu, który miał mi nie tylko zweryfikować samą odpowiedź, ale również dać nową na pytanie, ile czasu potrzeba na zestawienie środowiska do jego przeprowadzenia. Do dyspozycji miałem linię poleceń lub IDE. Z IDE jest o tyle problem, że trudno wybrać to jedyne (w przypadku projektów Java EE wskazywałbym na NetBeans IDE), więc pozostałem przy linii poleceń. Tak się bawiłem, że skończyło się na nowym artykule - &lt;a href="http://www.jaceklaskowski.pl/wiki/Jak_d%C5%82ugo_korzysta%C4%87_z_referencji_bezstanowego_komponentu_sesyjnego_EJB_%28na_przyk%C5%82adzie_EJB_3.0_i_GlassFish_v3%29"&gt;Jak długo korzystać z referencji bezstanowego komponentu sesyjnego EJB (na przykładzie EJB 3.0 i GlassFish v3)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Wykorzystałem w nim Apache Maven 2.2.1 i GlassFish v3 b66 do zestawienia projektu wielomodułowego, który posłużył mi za materiał testowy. Jest też kilka miejsc oznaczonych TODO, dla osób, które rozmyślają, jakby tu zaangażować się w naukę technologii javowych praktycznie. Ufam, że lektura dostarczy równie wiele zabawy co i mi. Pochwały/nagany mile widziane.&lt;br /&gt;&lt;br /&gt;p.s. Zastanawiam się, czy nie warto rozważyć screencastów (brakuje mi dla tego chwytliwego odpowiednika po polsku). Wink, Camtasia, a może jeszcze coś innego? Pewnie z udziałem NetBeans IDE 6.8 dev, bo w końcu tego typu projekty dobrze się w nim robi. Co o tym sądzicie?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-8484830454932135244?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/eWebOWeeh_0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/8484830454932135244/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=8484830454932135244" title="Komentarze (8)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/8484830454932135244?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/8484830454932135244?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/10/jak-dugo-korzystac-z-referencji.html" title="Jak długo korzystać z referencji bezstanowego komponentu sesyjnego EJB (na przykładzie EJB 3.0 i GlassFish v3)" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">8</thr:total></entry><entry gd:etag="W/&quot;C0cHRX86fyp7ImA9WxNXFUQ.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-2309908053667980176</id><published>2009-10-03T19:19:00.004+02:00</published><updated>2009-10-03T19:30:34.117+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-03T19:30:34.117+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="maven2" /><title>default-* execution dla różnych konfiguracji wtyczek w Apache Maven 2.2.1</title><content type="html">Podczas moich ostatnich wojaży z projektami zarządzanymi &lt;a href="http://maven.apache.org"&gt;Apache Maven 2&lt;/a&gt; potrzebowałem możliwości zdefiniowania różnych konfiguracji dla wtyczki &lt;span style="font-weight:bold;"&gt;maven-surefire-plugin&lt;/span&gt;. Początkowo rozważałem taką konfigurację:&lt;pre class="brush: xml"&gt; &amp;lt;build&amp;gt;&lt;br /&gt;  &amp;lt;plugins&amp;gt;&lt;br /&gt;   &amp;lt;plugin&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;     &amp;lt;configuration&amp;gt;&lt;br /&gt;      &amp;lt;excludes&amp;gt;&lt;br /&gt;       &amp;lt;exclude&amp;gt;**/WyswietlanieKomunikatowClientTest.java&amp;lt;/exclude&amp;gt;&lt;br /&gt;      &amp;lt;/excludes&amp;gt;&lt;br /&gt;     &amp;lt;/configuration&amp;gt;&lt;br /&gt;     &amp;lt;executions&amp;gt;&lt;br /&gt;      &amp;lt;execution&amp;gt;&lt;br /&gt;       &amp;lt;id&amp;gt;uruchom-WyswietlanieKomunikatowClientTest&amp;lt;/id&amp;gt;&lt;br /&gt;       &amp;lt;phase&amp;gt;integration-test&amp;lt;/phase&amp;gt;&lt;br /&gt;       &amp;lt;configuration&amp;gt;&lt;br /&gt;        &amp;lt;includes&amp;gt;&lt;br /&gt;         &amp;lt;include&amp;gt;**/WyswietlanieKomunikatowClientTest.java&amp;lt;/include&amp;gt;&lt;br /&gt;        &amp;lt;/includes&amp;gt;&lt;br /&gt;       &amp;lt;/configuration&amp;gt;&lt;br /&gt;       &amp;lt;goals&amp;gt;&lt;br /&gt;        &amp;lt;goal&amp;gt;test&amp;lt;/goal&amp;gt;&lt;br /&gt;       &amp;lt;/goals&amp;gt;&lt;br /&gt;      &amp;lt;/execution&amp;gt;&lt;br /&gt;     &amp;lt;/executions&amp;gt;&lt;br /&gt;   &amp;lt;/plugin&amp;gt;&lt;br /&gt;  &amp;lt;/plugins&amp;gt;&lt;br /&gt; &amp;lt;/build&amp;gt;&lt;/pre&gt;która oznacza, że domyślne wykonanie wtyczki, np. podczas wykonania &lt;span style="font-weight:bold;"&gt;mvn install&lt;/span&gt;, wykluczy wykonanie testów z WyswietlanieKomunikatowClientTest, podczas gdy uruchomienie &lt;span style="font-weight:bold;"&gt;mvn integration-test&lt;/span&gt;, albo wszystkich faz kolejnych, tj. &lt;span style="font-weight:bold;"&gt;verify&lt;/span&gt;, &lt;span style="font-weight:bold;"&gt;install&lt;/span&gt; czy &lt;span style="font-weight:bold;"&gt;deploy&lt;/span&gt;, już tak (warto zajrzeć na strony &lt;a href="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html"&gt;Introduction to the Build Lifecycle&lt;/a&gt; i &lt;a href="http://maven.apache.org/guides/mini/guide-configuring-plugins.html#Configuring_Build_Plugins"&gt;Guide to Configuring Plug-ins#Configuring Build Plugins&lt;/a&gt; z dokumentacji Apache Maven, jeśli tematy są niejasne). I tutaj właśnie pojawił się problem - chcąc wykluczyć WyswietlanieKomunikatowClientTest musiałem wykonywać fazy niższe niż &lt;span style="font-weight:bold;"&gt;integration-test&lt;/span&gt;, a one wykluczają &lt;span style="font-weight:bold;"&gt;install&lt;/span&gt;. I na odwrót, wykonanie &lt;span style="font-weight:bold;"&gt;install&lt;/span&gt; wykona &lt;span style="font-weight:bold;"&gt;integration-test&lt;/span&gt;, a to nie było mi na rękę.&lt;br /&gt;&lt;br /&gt;Zacząłem przeszukiwać Internet w poszukiwaniu rozwiązania dla konfiguracji bez &lt;span style="font-weight:bold;"&gt;phase&lt;/span&gt; w ramach &lt;span style="font-weight:bold;"&gt;execution&lt;/span&gt; wtyczki. Sądziłem, że gdzieś wokół takiego myślenia powinienem znaleźć rozwiązanie. I jakież było moje zdumienie, kiedy trafiłem na dokument &lt;a href="http://docs.codehaus.org/display/MAVENUSER/Default+Plugin+Execution+IDs"&gt;Default Plugin Execution IDs&lt;/a&gt;, gdzie przeczytałem o podobnych dywagacjach. To odpowiadało moim potrzebom! Lektura dokumentu upewniła mnie, że mam szansę coś znaleźć w Mavenie. Na końcu dokumentu, w sekcji &lt;span style="font-weight:bold;"&gt;References&lt;/span&gt;, było wskazanie na dwa zgłoszenia JIRA dla Apache Maven. Pierwsze &lt;a href="http://jira.codehaus.org/browse/MNG-3401"&gt;MNG-3401&lt;/a&gt; niezwykle obiecujące, ale kolejne &lt;a href="http://jira.codehaus.org/browse/MNG-3203"&gt;MNG-3203&lt;/a&gt; odpowiadało dokładnie temu, czego poszukiwałem. Oba rozwiązane tyle tylko, że...&lt;span style="font-style:italic;"&gt;"This should work both in Maven 2.2.0 and in Maven 3.x"&lt;/span&gt;. U mnie niestety Maven w wersji 2.1.0:&lt;pre&gt; $ mvn -v&lt;br /&gt; Apache Maven 2.1.0 (r755702; 2009-03-18 20:10:27+0100)&lt;br /&gt; Java version: 1.6.0_14&lt;br /&gt; Java home: c:\apps\java6\jre&lt;br /&gt; Default locale: en_PL, platform encoding: Cp1250&lt;br /&gt; OS name: "windows xp" version: "5.1" arch: "x86" Family: "windows"&lt;br /&gt;&lt;/pre&gt;Sądziłem, że pracuję z najnowszą wersją Mavena, więc nietrudno sobie wyobrazić, jak wielkie zrobiłem oczy, kiedy zobaczyłem, że wersja 2.2.1 jest już dostępna. To było dokładnie to, czego poszukiwałem. Rozwiązanie na miarę. Instalacja nowej wersji Apache Maven 2.2.1&lt;pre&gt; $ mvn -v&lt;br /&gt; Apache Maven 2.2.1 (r801777; 2009-08-06 21:16:01+0200)&lt;br /&gt; Java version: 1.6.0_14&lt;br /&gt; Java home: c:\apps\java6\jre&lt;br /&gt; Default locale: en_PL, platform encoding: Cp1250&lt;br /&gt; OS name: "windows xp" version: "5.1" arch: "x86" Family: "windows"&lt;br /&gt;&lt;/pre&gt;zmiana konfiguracji projektu na następującą:&lt;pre class="brush: xml"&gt; &amp;lt;build&amp;gt;&lt;br /&gt;  &amp;lt;plugins&amp;gt;&lt;br /&gt;   &amp;lt;plugin&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;executions&amp;gt;&lt;br /&gt;     &amp;lt;execution&amp;gt;&lt;br /&gt;      &amp;lt;id&amp;gt;default-cli&amp;lt;/id&amp;gt;&lt;br /&gt;      &amp;lt;configuration&amp;gt;&lt;br /&gt;       &amp;lt;excludes&amp;gt;&lt;br /&gt;        &amp;lt;exclude&amp;gt;**/WyswietlanieKomunikatowKlientTest.java&amp;lt;/exclude&amp;gt;&lt;br /&gt;       &amp;lt;/excludes&amp;gt;&lt;br /&gt;      &amp;lt;/configuration&amp;gt;&lt;br /&gt;     &amp;lt;/execution&amp;gt;&lt;br /&gt;     &amp;lt;execution&amp;gt;&lt;br /&gt;      &amp;lt;id&amp;gt;default-test&amp;lt;/id&amp;gt;&lt;br /&gt;      &amp;lt;configuration&amp;gt;&lt;br /&gt;       &amp;lt;includes&amp;gt;&lt;br /&gt;        &amp;lt;include&amp;gt;**/WyswietlanieKomunikatowKlientTest.java&amp;lt;/include&amp;gt;&lt;br /&gt;       &amp;lt;/includes&amp;gt;&lt;br /&gt;      &amp;lt;/configuration&amp;gt;&lt;br /&gt;      &amp;lt;goals&amp;gt;&lt;br /&gt;       &amp;lt;goal&amp;gt;test&amp;lt;/goal&amp;gt;&lt;br /&gt;      &amp;lt;/goals&amp;gt;&lt;br /&gt;     &amp;lt;/execution&amp;gt;&lt;br /&gt;    &amp;lt;/executions&amp;gt;&lt;br /&gt;   &amp;lt;/plugin&amp;gt;&lt;br /&gt;  &amp;lt;/plugins&amp;gt;&lt;br /&gt; &amp;lt;/build&amp;gt;&lt;br /&gt;&lt;/pre&gt;i jestem w domu! Problem rozwiązany! Teraz każdorazowe uruchomienie &lt;span style="font-weight:bold;"&gt;mvn install&lt;/span&gt; wykona konfigurację o identyfikatorze &lt;span style="font-weight:bold;"&gt;default-cli&lt;/span&gt;, a każdorazowe wykonanie &lt;span style="font-weight:bold;"&gt;mvn test&lt;/span&gt;, czyli dosłowne uruchomienie wtyczki surefire, która jest związana z fazą test, wykona konfigurację &lt;span style="font-weight:bold;"&gt;default-test&lt;/span&gt;. Dokładnie tak, jak sobie życzyłem. Warto zajrzeć do przykładowego wykonania obu poleceń i prześledzić wykonywanie wtyczek i ich execution, aby dokładnie poznać różnicę między nimi. Nie ma to jak rozwiązanie problemu w przysłowiowe 5 minut - dobrze zadane zapytanie w Google...bezcenne! :)&lt;br /&gt;&lt;br /&gt;p.s. Jak tak dalej pójdzie, to niedługo zejdę na serce. Tyle wrażeń jednego dnia na pewno niekorzystanie wpływa na moje zdrowie :) A to tylko przy takim, pojedynczym wydarzeniu, a przecież nie było ono moim jedynym. Informatycy to strasznie podatny na zawał serca lud ;-)&lt;br /&gt;&lt;br /&gt;p.s.2. Skoro przy temacie zarządzania projektami, to natrafiłem ostatnio na &lt;a href="http://www.gradle.org/"&gt;gradle&lt;/a&gt;. Używa ktoś tego? Chętnie wysłucham wrażeń. Komentarze, listy na priv mile widziane.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-2309908053667980176?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/WKqn5BHdVH8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/2309908053667980176/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=2309908053667980176" title="Komentarze (7)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2309908053667980176?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/2309908053667980176?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/10/default-execution-dla-roznych.html" title="default-* execution dla różnych konfiguracji wtyczek w Apache Maven 2.2.1" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total></entry><entry gd:etag="W/&quot;AkUARXY_cSp7ImA9WxNXEEU.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-5442263772786832004</id><published>2009-09-27T23:28:00.005+02:00</published><updated>2009-09-27T23:50:44.849+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-27T23:50:44.849+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javaee6" /><category scheme="http://www.blogger.com/atom/ns#" term="glassfish" /><category scheme="http://www.blogger.com/atom/ns#" term="osgi" /><category scheme="http://www.blogger.com/atom/ns#" term="spring-dm" /><title>Java EE 6 i OSGi z FishCAT i "Pro Spring Dynamic Modules for OSGi Service Platforms"</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://wiki.glassfish.java.net/Wiki.jsp?page=FishCAT"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 107px; height: 86px;" src="http://wiki.glassfish.java.net/logo.gif" border="0" alt="" /&gt;&lt;/a&gt;Rozpoczął się &lt;a href="http://wiki.glassfish.java.net/Wiki.jsp?page=FishCAT"&gt;FishCAT&lt;/a&gt;, czyli program testowania najnowszego wydania GlassFish v3 (b65), który ma ocenić gotowość produktu do produkcyjnych wdrożeń. Tym samym moja aktywność wokół Grails zostaje wzbogacona o doświadczenia z GlassFishem.&lt;br /&gt;&lt;br /&gt;Z listu powitalnego do FishCAT - &lt;a href="http://markmail.org/message/t727e2kjea7rxetk"&gt;[FishCAT] Please start FishCAT testing on b65, Thanks !&lt;/a&gt; - można przeczytać, że:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Here is FishCAT testing schedule.  Bugs filed after the ending date may be differed to next release based on&lt;br /&gt;the priority. Hope you will find some time in next to weeks to help us testing.&lt;br /&gt;&lt;br /&gt;FishCAT Testing Schedule:    9/25/09 - 10/9/09 (2 weeks)&lt;br /&gt;FishCAT doc review schedule: 9/25/09 - 10/9/09 (2 weeks)&lt;br /&gt;FishCAT i18n/l10n testing:   9/25/09 - 10/21/09 (4 weeks)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;czyli jedynie 2 tygodnie na testowanie produktu przed finalnym wydaniem. Zdaje się, że w tym czasie należy oczekiwać również wielu finalnych wydań specyfikacji wchodzących w skład Java EE 6. Proszę, proszę, to było w końcu rok temu, kiedy na rynku pojawiło się Java EE 5, a tu mamy nową wersję. Ta również ma być jeszcze ciekawsza niż poprzednie. I znowu wyścig serwerów aplikacyjnych o prym w realizacji Java EE 6 się zacznie.&lt;br /&gt;&lt;br /&gt;Już od jakiegoś czasu przyglądałem się rozwojowi GF i co mnie najbardziej zachwyciło, to wsparcie dla OSGi. Oczywiście dodając do tego wsparcie Java EE 6 mamy pełen obraz, dlaczego zdecydowałem się na 2-tygodniowe turnee z GlassFishem w roli głównej. Sam udział w programie ma być pretekstem do powrotu do korzeni ze wspomnianymi technologiami, które zostały przesłonięte Grails.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.apress.com/book/view/9781430216124"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 125px; height: 164px;" src="http://www.apress.com/resource/bookcover/9781430216124?size=medium" border="0" alt="" /&gt;&lt;/a&gt;Jako uzupełnienie mojego powrotu do Java EE/OSGi zabrałem się za lekturę &lt;a href="http://www.apress.com/book/view/9781430216124"&gt;"Pro Spring Dynamic Modules for OSGi Service Platform"&lt;/a&gt; z Apress. Jakkolwiek książce bliżej do rozwiązań opartych na Spring Framework, a więc bliżej jej do Grails niż GlassFish czy Java EE 6, to wszystkie technologie są tak ze sobą związane, że dotykając jednego trudno nie dotknąć innych.&lt;br /&gt;&lt;br /&gt;Na pierwszy rzut oka, najbardziej egzotyczną technologią może wydawać się OSGi, ale właśnie z rozwiązaniami typu Spring-DM, czy GlassFish jego rola sprowadza się do ukrytego gracza, który wspiera infrastrukturę, na której nasze aplikacje są budowane (Spring-DM) i/lub uruchamiane (GlassFish). Właśnie podział na budowane-uruchamiane daje odpowiedź, dlaczego Spring-DM (strona OSGi) ma tak silny związek z GlassFish (strona Java EE 6). I coś co wydaje się być różne i odległe od siebie jest faktycznie nierozerwalne (albo przynajmniej takim powinno być).&lt;br /&gt;&lt;br /&gt;Stworzenie aplikacji springowej może być rozbudowane o cechy OSGi z pomocą Spring-DM, a środowiskiem uruchomieniowym może być właśnie GlassFish (który niestety poza wykorzystaniem OSGi wewnętrznie nie daje możliwości skorzystania z niego w ramach wdrażanych aplikacji korporacyjnych). Spring Framework to wyłącznie szkielet aplikacyjny, którego główną cechą jest realizacja podejścia (wzorca?) Inversion of Control przez mechanizm Depenency Injection, który potrzebuje środowiska uruchomieniowego z jego usługami. Serwer aplikacyjny Java EE świetnie uzupełnia ofertę Spring Framework przez dostarczenie wszystkich obowiązkowych usług typu monitor transakcyjny, zarządca utrwalania danych JPA czy infrastruktura bezpieczeństwa.&lt;br /&gt;&lt;br /&gt;Jeszcze podczas lektury &lt;a href="http://www.jaceklaskowski.pl/wiki/Book_review:_Grails_in_Action"&gt;"Grails in Action"&lt;/a&gt; doświadczyłem niesamowitego olśnienia odnośnie różnicy między &lt;span style="font-weight:bold;"&gt;Inversion of Control (IoC)&lt;/span&gt; a &lt;span style="font-weight:bold;"&gt;Dependency Injection (DI)&lt;/span&gt;, co zwykłem traktować jako synonimy. Jakież było moje zdumienie, kiedy przeczytałem, że IoC to podejście (wzorzec?) tworzenia aplikacji, gdzie zarządzanie zależnościami oddelegowuje się do kontenera IoC, a DI to jedna z jego realizacji, która polega na przekazywaniu/wstrzykiwaniu owych zależności do komponentu zarządzanego (strona 396). Niestety, nie jestem w stanie wskazać innej realizacji IoC, ale na takie przedstawienie tematu mogę się zgodzić. Niewielka różnica, która często &lt;a href="http://dictionary.cambridge.org/define.asp?key=cracks*1+0&amp;dict=I"&gt;"fall through the cracks"&lt;/a&gt; (piękny idiom w j. angielskim, którego nie mogłem nie użyć w ramach pogłębiania mojej znajomości angielskiego).&lt;br /&gt;&lt;br /&gt;Sama książka &lt;span style="font-weight:bold;"&gt;"Pro Spring Dynamic Modules for OSGi Service Platforms"&lt;/span&gt; rozpoczyna się, tak jak prawdopodobnie zaczyna się każda książka na ten temat - najpierw wprowadzenie do OSGi, później Spring Framework, dalej Spring Dynamic Modules, aż lądujemy z SpringSource dm Server w jednej dłoni, a jego rozwiązaniami wokół wersjonowania składowych aplikacji, dostępem do danych, aplikacjami webowymi i testowaniem w drugiej. Na razie mam za sobą pierwszy rozdział książki "Introducing OSGi" i mimo jedynie 42 stron na ten temat, warto było. Tak jak można było się tego spodziewać, było tworzenie pakunku OSGi, ale czego nie, to próba zarejestrowania jego funkcjonalności jako usługi (tak, było też wymienione SOA, ale tylko przez chwilę) i udostępnienie jej jako servlet za pomocą HTTP Service. Nie ma wiele rozpisywania się nt. OSGi, ale jest wystarczająco, aby wprowadzić w temat, a sam przykład jest zdecydowanie bardziej zaawansowany niż jego nazwa mogłaby wskazywać - HelloWorld. Jestem niezwykle zadowolony z tego, że zdecydowałem się na tę książkę. Leżała u mnie od lutego (!) Jest to książka drukowana, więc zainteresowani będą musieli odczekać jeszcze kilka tygodni, kiedy wróci do &lt;a href="http://groups.google.com/group/warszawa-jug/web/biblioteka-warszawskiego-juga"&gt;Biblioteki Warszawskiego JUGa&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Przede mną wprowadzenie do Spring Framework przez 60 stron. Już przez głowę przeszło mi, aby przerzucić te strony i zabrać się za kolejny rozdział 3. "Integrating Spring and OSGi". Nie będzie mi łatwo przebrnąć przez niego. Już tyle zostało powiedziane o Springu, a tu jeszcze 60 stron przede mną. Dobrze, że po nim znowu OSGi, a w odwodzie jest testowanie GlassFisha z NetBeans IDE 6.7.1/6.8 i nauka Java EE 6.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-5442263772786832004?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/57QBhjBKS9o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/5442263772786832004/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=5442263772786832004" title="Komentarze (2)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5442263772786832004?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5442263772786832004?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/09/java-ee-6-i-osgi-z-fishcat-i-pro-spring.html" title="Java EE 6 i OSGi z FishCAT i &quot;Pro Spring Dynamic Modules for OSGi Service Platforms&quot;" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;CUcGSH04eSp7ImA9WxNQGE8.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-5813915940341047521</id><published>2009-09-24T21:18:00.004+02:00</published><updated>2009-09-24T22:10:29.331+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-24T22:10:29.331+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="recenzje" /><category scheme="http://www.blogger.com/atom/ns#" term="grails" /><title>Recenzja "Grails in Action" z Manning - numer 1 w książkach o Grails</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.manning.com/gsmith/"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 150px; height: 188px;" src="http://4.bp.blogspot.com/_wSeV_DMR2uA/SraK9x0s6LI/AAAAAAAACYU/exR-_lZ8i9c/s320/grailsinaction-okladka.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5383643198519044274" /&gt;&lt;/a&gt;Wspominałem już o tym, że zabrałem się za lekturę kolejnej książki o Grails 1.1 - &lt;a href="http://www.manning.com/gsmith/"&gt;"Grails in Action"&lt;/a&gt; autorstwa Glena Smitha i Petera Ledbrooka z wydawnictwa Manning kilka dni temu (patrz &lt;a href="http://jlaskowski.blogspot.com/2009/09/grails-in-action-w-akcji-i-moje.html"&gt;"Grails in Action" w akcji i moje pierwsze wrażenia&lt;/a&gt;). Właśnie ją skończyłem i jedynie powtórzę, że sposób w jaki panowie Glen i Peter przedstawili Grails budzi mój najwyższy szacunek. Konkretnie i z humorem. Dokładnie tak, jak mógłby oczekiwać tego, każdy adept sztuki grailsowej, aczkolwiek byłbym niezwykle ostrożny z postawieniem tezy, że jest to książka dla nowicjuszy. W moim przypadku, kiedy to skończyłem 3 książki o Grails - &lt;a href="http://www.jaceklaskowski.pl/wiki/Book_review:_Beginning_Groovy_and_Grails:_From_Novice_to_Professional"&gt;Beginning Groovy and Grails: From Novice to Professional&lt;/a&gt;, &lt;a href="http://www.jaceklaskowski.pl/wiki/Book_review:_Grails_1.1_Web_Application_Development"&gt;Grails 1.1 Web Application Development&lt;/a&gt; oraz &lt;a href="http://www.jaceklaskowski.pl/wiki/Book_review:_The_Definitive_Guide_to_Grails%2C_Second_Edition"&gt;The Definitive Guide to Grails, 2nd Ed.&lt;/a&gt; sądziłem, że jedyne co w niej znajdę, to po prostu ugruntowanie już zdobytej wiedzy. Nie długo trwało, abym przekonał się, jak bardzo się myliłem. Mam wrażenie, że poprzednie książki były po prostu preludium do "Grails in Action". Jeśli "The Definitive Guide to Grails, 2nd Ed." jest kompedium wiedzy o Grails (w końcu pisana przez samego twórcę Grails - Graeme Rocher), to "Grails in Action" jest zwartym, ale wciąż kompletnym jego streszczeniem z nutką dobrego humoru. Mnóstwo testów jednostkowych, integracyjnych i kilka funkcjonalnych dopełniły obraz książki o Grails, w której stawia się nie tylko na przedstawienie jego cech, ale również, aby przeprowadzić przez nie w odpowiedni i interesujący sposób. Zdecydowanie udało się to autorom. Polecam! Kolejność czytania wspomnianych książek ma znaczenie, a nawet dwie pierwsze można spokojnie ominąć bez utraty wiedzy.&lt;br /&gt;&lt;br /&gt;Recenzja książki po angielsku (ze względu na wymóg wydawcy w ramach programu wsparcia &lt;a href="http://www.warszawa.jug.pl"&gt;Warszawa JUG&lt;/a&gt;) na moim Wiki - &lt;a href="http://www.jaceklaskowski.pl/wiki/Book_review:_Grails_in_Action"&gt;Book review: Grails in Action&lt;/a&gt;. Opublikowałem ją również na Amazonie - &lt;a href="http://www.amazon.com/review/R2UC1QVMTX2L78/ref=cm_cr_rdp_perm"&gt;The concise definitive guide to Grails&lt;/a&gt; (kolejny wymóg wydawnictwa). Książka jest do wypożyczenia w ramach Warszawa JUG w wersji PDF, więc nic nie stoi na przeszkodzie, aby poznać i Waszą opinię na jej temat. Chętni proszeni o kontakt na priv.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-5813915940341047521?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/Oy-b94fePPY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/5813915940341047521/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=5813915940341047521" title="Komentarze (5)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5813915940341047521?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5813915940341047521?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/09/recenzja-grails-in-action-z-manning.html" title="Recenzja &quot;Grails in Action&quot; z Manning - numer 1 w książkach o Grails" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_wSeV_DMR2uA/SraK9x0s6LI/AAAAAAAACYU/exR-_lZ8i9c/s72-c/grailsinaction-okladka.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total></entry><entry gd:etag="W/&quot;C04FRn88cSp7ImA9WxNQF0k.&quot;"><id>tag:blogger.com,1999:blog-20941681.post-5461869572313546139</id><published>2009-09-23T23:37:00.000+02:00</published><updated>2009-09-23T23:38:37.179+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-23T23:38:37.179+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="warszawa-jug" /><title>52. spotkanie Warszawa JUG - "Kickstart w tworzeniu aplikacji webowej z AppFuse i pomocnikami" Wojtka Erbetowskiego</title><content type="html">&lt;a href="http://www.warszawa.jug.pl"&gt;Warszawska Grupa Użytkowników Technologii Java (Warszawa JUG)&lt;/a&gt; zaprasza na 52. spotkanie, które odbędzie się w najbliższy wtorek, 29.09.2009 o godzinie 18:00 w sali 5440 Wydziału MIMUW przy ul. Banacha 2 w Warszawie.&lt;br /&gt;&lt;br /&gt;Temat prezentacji: &lt;b&gt;Kickstart w tworzeniu aplikacji webowej z AppFuse i pomocnikami&lt;/b&gt;&lt;br /&gt;Prelegent: &lt;b&gt;Wojtek Erbetowski&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;W trakcie prezentacji zostanie przedstawiony szkielet aplikacji webowej opartej na Spring Framework - AppFuse. Prelegent pokaże jak szybko stworzyć (nie taką znowu) prostą aplikację, jakie narzędzia mamy w niej "za darmo", a jakie możemy wdrożyć niedużym kosztem. W zależności od chęci publiki wdrożone do gotowej aplikacji (i omówione dla niezaznajomionych z nimi) zostaną m.in. takie rozwiązania jak: Gradle, Mercurial i JRebel. A może nawet spróbujemy porównać aplikację do wciąż młodego projektu Spring Roo?!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Wojtek Erbetowski&lt;/b&gt; jest z wykształcenia matematykiem i pracuje jako naczelny programista Java (J2EE/Spring) w niedużej firmie technologicznej.&lt;br /&gt;&lt;br /&gt;Planowany czas prezentacji to 1,5 godziny, po której planuje się 15-30-minutową dyskusję.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Wstęp wolny!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Zapraszam w imieniu prelegenta i grupy Warszawa JUG!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20941681-5461869572313546139?l=jlaskowski.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogJackaLaskowskiego/~4/r5pdf3fFNow" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jlaskowski.blogspot.com/feeds/5461869572313546139/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=20941681&amp;postID=5461869572313546139" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5461869572313546139?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20941681/posts/default/5461869572313546139?v=2" /><link rel="alternate" type="text/html" href="http://jlaskowski.blogspot.com/2009/09/52-spotkanie-warszawa-jug-kickstart-w.html" title="52. spotkanie Warszawa JUG - &quot;Kickstart w tworzeniu aplikacji webowej z AppFuse i pomocnikami&quot; Wojtka Erbetowskiego" /><author><name>Jacek Laskowski</name><uri>http://www.blogger.com/profile/09734540973692423017</uri><email>jacek@laskowski.net.pl</email><gd:extendedProperty name="OpenSocialUserId" value="13212261891453019625" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry></feed>
