<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog Espeo Software</title>
	<atom:link href="http://blog.espeo.pl/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.espeo.pl</link>
	<description>O technologii i biznesie naszym zdaniem</description>
	<lastBuildDate>Mon, 22 Feb 2010 17:06:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>We begin to see a rainbow. But will there be the treasure?</title>
		<link>http://blog.espeo.pl/2010/02/22/we-begin-to-see-a-rainbow-but-will-there-be-the-treasure/</link>
		<comments>http://blog.espeo.pl/2010/02/22/we-begin-to-see-a-rainbow-but-will-there-be-the-treasure/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 17:06:04 +0000</pubDate>
		<dc:creator>TomaszRakowski</dc:creator>
				<category><![CDATA[english]]></category>

		<guid isPermaLink="false">http://blog.espeo.pl/?p=244</guid>
		<description><![CDATA[There are views, nice views. Views of growth, prosperity, success. Still a lot to do &#8211; but what&#8217;s been done, is going now in the right direction. Not only the number of projects is rising &#8211; but the number of our own developers as well. It&#8217;s just like in a nature &#8211; the better soil, [...]]]></description>
			<content:encoded><![CDATA[<p>There are views, nice views. Views of growth, prosperity, success. Still a lot to do &#8211; but what&#8217;s been done, is going now in the right direction. Not only the number of projects is rising &#8211; but the number of our own developers as well. It&#8217;s just like in a nature &#8211; the better soil, the better plants &#8211; but also bigger crops so more hands are needed.</p>
<p>After quite successful beginning of this year we had another office party &#8211; it helps us not to forget where we work <img src='http://blog.espeo.pl/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  Simply a statement from our marketing materials which says &#8220;Members of Espeo are its greatest value&#8221; it&#8217;s totally true! And what was this time? A mysterious place in deep woods with classical tenpin bowling facilities &#8211; it was truly something! None of us was experienced in it &#8211; so it was seriously challenging for every member of our crew. How astonishing emotions were there, you couldn&#8217;t simply imagine.<br />
Leading was changing every single minute, every point counted, every move was&#8230; a crap <img src='http://blog.espeo.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' />   There were some moves worth seeing, but basically &#8211; we were poor. Especially&#8230; me,  to be honest. At first it wasn&#8217;t going so badly &#8211; but as the time passed by, so did our &#8220;talent&#8221;. Nonetheless there were winners &#8211; however I wasn&#8217;t among them.</p>
<p>We really enjoyed it. And we enjoy what&#8217;s going on around us. A temperature is rising, a sun is less and less timidly showing behind the clouds and our company is growing thanks to proper watering. After the raining times there is a rainbow on the sky. Now let&#8217;s find the rainbow treasure!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.espeo.pl/2010/02/22/we-begin-to-see-a-rainbow-but-will-there-be-the-treasure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zwinny projekt okiem programisty.</title>
		<link>http://blog.espeo.pl/2010/02/12/zwinny-projekt-okiem-programisty/</link>
		<comments>http://blog.espeo.pl/2010/02/12/zwinny-projekt-okiem-programisty/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 14:51:07 +0000</pubDate>
		<dc:creator>Paweł Ziemba</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[metodyki]]></category>

		<guid isPermaLink="false">http://blog.espeo.pl/?p=206</guid>
		<description><![CDATA[Czym jest Agile dla programisty? Co zmienia zastosowanie zwinnego podejścia w porównaniu z klasycznym waterfall?]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		PRE { font-family: "Courier New", monospace; font-size: 10pt } 		P { margin-bottom: 0.21cm } --></p>
<p style="text-align: left">Czym jest <em>Agile </em>dla programisty? Co zmienia zastosowanie zwinnego podejścia w porównaniu z klasycznym <em>waterfall</em>?</p>
<h2><strong>Klasyka</strong></h2>
<p style="text-align: justify">Mam za sobą kilka większych lub mniejszych projektów realizowanych klasycznie. Obserwowałem pracę programistów z różnych perspektyw. Ciekawa jest tu obserwacja jak zmienia się nastawienie pojedynczych ludzi, jak i całych zespołów do realizacji projektu. Człowiek potrafi zaadaptować się niezwykle szybko do środowiska w jakim przebywa&#8230;</p>
<p style="text-align: justify">W klasycznym podejściu rola programisty ogranicza się w zasadzie do &#8216;klepania kodu&#8217;. Powszechnie przy tym narzeka się na analityków, projektantów, a także testerów. Często nie dostrzega się klienta, czy nawet celów projektu, poza należną premią oczywiście <img src='http://blog.espeo.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify">
<div id="attachment_235" class="wp-caption aligncenter" style="width: 610px"><img class="size-medium wp-image-235   " src="http://blog.espeo.pl/wp-content/uploads/2010/02/waterfall.png" alt="Jak wygląda (w uproszczeniu oczywiście) klasyczny warterfall" width="600" height="250" />
<p class="wp-caption-text">Jak wygląda (w uproszczeniu oczywiście) klasyczny warterfall</p>
</div>
<p style="text-align: center">
<p style="text-align: justify">Miejsce programisty jest w zasadzie tylko przy etapie &#8216;kodowanie&#8217;. Jego rolą jest naklepanie treści do tego co wymyślił projektant&#8230; i przekazanie następnie do testera &#8211; z nadzieją aby ten nie wykrył tych drobnych obejść, które często wynikały z nieścisłego gdzieniegdzie projektu. W końcu po co zawracać sobie tym głowę &#8211; projektant widocznie tak chciał to ma.</p>
<p style="text-align: justify">Do takiej roli bardzo dobrze przygotowują wszelkie uczelnie. Po prostu trzeba doskonale znać narzędzia i język w którym się koduje. Działamy jak algorytm &#8211; na wejściu analiza, na wyjście dajemy działający kod. Nie ma znaczenia co gdzieś daleko za nami chciał klient, ani czego oczekuje po wdrożeniu. Jesteśmy tylko połączeniem projektanta z testerem.</p>
<p style="text-align: justify">Czasami rzeczywistość zaskakuje nas jak drogowców zimą <img src='http://blog.espeo.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Faza analizy się przedłuża i nie ma czasu na projekt <img src='http://blog.espeo.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Wówczas implementujemy często wynik analizy bez projektu&#8230; Jeśli przedłużyła się analiza &#8211; znaczy, że dziedzina jest trudna, pewnie implementacja też się przedłuży, więc może faza testów też jest niepotrzebna? Najważniejsze jest przecież wdrożenie&#8230; Tego chce klient (a może nie?).</p>
<p style="text-align: justify">W takich projektach <em>Project Manager</em> ma niełatwe zadanie. Ślęczy nocami nad znienawidzonym M$ Projectem, aby zgrać wszystkie etapy. Każdy próbuje zwalić winę na innego&#8230; To już temat na zupełnie osobny artykuł&#8230;<br />
Programista podejmuje decyzje jedynie na temat tego czy użyć pętli while czy może lepiej for. Całą resztę zrzuca na projektanta lub PMa.</p>
<h2><strong>Agile</strong></h2>
<p style="text-align: justify">Jak wygląda zwinny proces rozwoju oprogramowania z punktu widzenia programisty?</p>
<p style="text-align: justify">
<div id="attachment_234" class="wp-caption aligncenter" style="width: 610px"><img class="size-medium wp-image-234  " src="http://blog.espeo.pl/wp-content/uploads/2010/02/agile.png" alt="Uproszczony schemat Agile" width="600" height="208" />
<p class="wp-caption-text">Uproszczony schemat Agile</p>
</div>
<p style="text-align: justify">
<p style="text-align: justify">Tutaj idziemy przez całość zagadnień małymi kroczkami. Za każdym razem wykonujemy analizę, projekt implementację i integrację z całością. Za każdym razem dostajemy informację zwrotną od klienta czy to co zrobiliśmy to jest to czego oczekuje. Klient dostaje gotowe fragmenty, które może używać. Sam decyduje które fragmenty chce najszybciej.<br />
A co robi teraz programista? Otóż niestety ma sporo więcej pracy. Przejmuje po części role analityka, projektanta, testera i wdrożeniowca&#8230; Niestety ma więcej pracy i odpowiedzialności. Ale myślę że praca ta jest dużo ciekawsza i posiada dużo większe możliwości rozwoju.</p>
<p style="text-align: justify">Niestety jednak, tutaj napotykamy problem. Większość absolwentów kierunków informatycznych nie jest dobrze przygotowana do przejęcia tych wszystkich ról. Nie wystarczy więc powiedzieć &#8211; od dziś pracujemy w agile. Trzeba nieustannie podnosić kwalifikacje pracowników.</p>
<p style="text-align: justify">Poszczególne fazy, z racji tego że nie są one w pełni formalnie osadzone, różnią się też sporo od tych znanych z podejścia klasycznego. Nie powstaje zwykle jakiś spójny dokument zwany analizą, czy projektem, który jest normalnie akceptowany i odbierany przez klienta. Za to klient akceptuje gotowa działające kawałki. Wydaje się, że ma to głębszy sens &#8211; za abstrakcyjnym dokumentem projektu nie widać zwykle gotowego systemu.</p>
<p style="text-align: justify">Uczelnie wypuszczają całą masę programistów. To samo w sobie nie jest złe, są oni zwykle doskonali w programowaniu&#8230; Jednak spotyka się takich którzy nie słyszeli nigdy akronimu <em>SOLID</em>. Podczas studiów wykonuje się niezliczone &#8216;projekty&#8217; programistyczne. Niewiele z nich jednak przechodzi przez fazy analizy, projektowania, czy nawet testowania! A te umiejętności wśród programistów są niezbędne aby swobodnie realizować zwinny projekt.</p>
<p style="text-align: justify">Jest to jedna z trudności (i wyzwań) dla zwinnych zespołów – w klasycznym podejściu każdy ma swoją działkę w której nabywa umiejętności; w agile każdy jest specjalistą od wszystkiego <img src='http://blog.espeo.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Postaram się dalej pokazać, że to nie taki diabeł straszny jak go malują.</p>
<p style="text-align: justify">
]]></content:encoded>
			<wfw:commentRss>http://blog.espeo.pl/2010/02/12/zwinny-projekt-okiem-programisty/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>It&#8217;s freezing outside&#8230;but development in progress &#8211; as usual.</title>
		<link>http://blog.espeo.pl/2010/01/25/its-freezing-outside-but-development-in-progress-as-usual/</link>
		<comments>http://blog.espeo.pl/2010/01/25/its-freezing-outside-but-development-in-progress-as-usual/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 16:13:27 +0000</pubDate>
		<dc:creator>TomaszRakowski</dc:creator>
				<category><![CDATA[english]]></category>

		<guid isPermaLink="false">http://blog.espeo.pl/?p=203</guid>
		<description><![CDATA[Winter is in its peak nowadays! It&#8217;s so cold, that minus five degrees (Celsius) feels
like hot, minus fifteen is typical and when it&#8217;s minus twenty five &#8211; we can say &#8220;it&#8217;s
getting a bit colder&#8221;   A temperature exceeding minus thirty degrees is even happening
- what a weather, for God&#8217;s sake we&#8217;re not in a [...]]]></description>
			<content:encoded><![CDATA[<p>Winter is in its peak nowadays! It&#8217;s so cold, that minus five degrees (Celsius) feels<br />
like hot, minus fifteen is typical and when it&#8217;s minus twenty five &#8211; we can say &#8220;it&#8217;s<br />
getting a bit colder&#8221; <img src='http://blog.espeo.pl/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  A temperature exceeding minus thirty degrees is even happening<br />
- what a weather, for God&#8217;s sake we&#8217;re not in a deep Russia, are we?!</p>
<p>Although our cars are seriously wounded by this critical conditions and getting to the<br />
office on time is becoming a challenge &#8211; development process stays unimpressed and<br />
evolves as was meant to. Simply astonishing way of dealing with complex IT projects -<br />
despite the world is so unfriendly outside, in house it all works like a Swiss watch.<br />
Public transport is struggling with major drawbacks, roads are black no more and are<br />
becoming a one, huge ice rink, selected schools are going to be closed, flight are being<br />
canceled one after another &#8211; but developers from Espeo are doing their job as usual.</p>
<p>What can I say &#8211; guys still make a huge impression on me, even when I&#8217;m no longer the<br />
&#8220;new one&#8221;. As a sales person all I can do is to stay aside, admire their achievement and<br />
make sure there will be always some challenging projects in a queue.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.espeo.pl/2010/01/25/its-freezing-outside-but-development-in-progress-as-usual/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vaadin framework</title>
		<link>http://blog.espeo.pl/2010/01/15/vaadin-framework/</link>
		<comments>http://blog.espeo.pl/2010/01/15/vaadin-framework/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 12:38:28 +0000</pubDate>
		<dc:creator>Łukasz Matyja</dc:creator>
				<category><![CDATA[technologia]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://blog.espeo.pl/?p=195</guid>
		<description><![CDATA[
Vaadin to framework przeznaczony do budowy graficznego interfejsu użytkownika dla aplikacji internetowych tworzonych z wykorzystaniem języka Java. Całe rozwiązanie oparte jest o Google Web Toolkit (GWT). Paleta gotowych komponentów jest dość szeroka, można w niej znaleźć m.in. kontrolki do obsługi kalendarza, tabel, do budowy menu itp. jeśli jednak okazało by się to niewystarczające można utworzyć [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="margin-bottom: 0cm"><span style="font-size: small"><span style="font-weight: normal">Vaadin to framework przeznaczony do budowy graficznego interfejsu użytkownika dla aplikacji internetowych tworzonych z wykorzystaniem języka Java. Całe rozwiązanie oparte jest o Google Web Toolkit (GWT). </span></span><span style="color: #000000"><span style="font-size: small"><span style="font-weight: normal">Paleta gotowych komponentów jest dość szeroka, można w niej znaleźć m.in. kontrolki do obsługi kalendarza, tabel, do budowy menu itp. jeśli jednak okazało by się to niewystarczające można</span></span></span><span style="font-size: small"><span style="font-weight: normal"> utworzyć własny komponent. </span></span></p>
<p><span style="font-size: small"><span style="font-weight: normal">Na stronie projektu dostępny jest plugin dla środowiska Eclipse. Opisany w dalszej części przykład został wykonany właśnie z wykorzystaniem tego pluginu. </span></span></p>
<p><span style="font-size: large"><strong>Konfiguracja</strong></span></p>
<p><span style="font-size: small"><span style="font-weight: normal">Struktura projektu wykorzystującego framework Vaadin nie różni się praktycznie niczym od zwykłej aplikacji internetowej wykonywanej za pomocą Javy, nie ma żadnych zbędnych plików  i katalogów, które niekiedy potrafi wprowadzić sporo zamieszania. </span></span></p>
<p><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="font-weight: normal"><span style="color: #000000"><span style="font-size: small">W pliku web.xml zdefiniowany został m.in. serwlet obsługujący żądania, jego parametr inicjujący zawiera identyfikator klasy, na podstawie której zostanie wygenerowany pierwszy widok (zaraz po uruchomieniu aplikacji). Sama klasa serwletu jest częścią frameworka Vaadin. Domyślnie włączony jest tryb debagowania.</span></span></p>
<pre>&lt;context-param&gt;
  &lt;description&gt;Vaadin production mode&lt;/description&gt;
  &lt;param-name&gt;productionMode&lt;/param-name&gt;
  &lt;param-value&gt;false&lt;/param-value&gt;
&lt;/context-param&gt;

&lt;servlet&gt;
  &lt;servlet-name&gt;Simplevaadinexample Application&lt;/servlet-name&gt;
  &lt;servlet-class&gt;
    com.vaadin.terminal.gwt.server.ApplicationServlet
  &lt;/servlet-class&gt;
  &lt;init-param&gt;
    &lt;description&gt;Vaadin application class to start&lt;/description&gt;
    &lt;param-name&gt;application&lt;/param-name&gt;
    &lt;param-value&gt;pl.espeo.example.MainWindow&lt;/param-value&gt;
  &lt;/init-param&gt;
&lt;/servlet&gt;
</pre>
<p><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } --><span style="color: #000000"><span style="font-size: large"><strong>Przykładowa aplikacja</strong></span></span></p>
<p><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } --><span style="color: #000000"><span style="font-size: small">Każda aplikacja wykorzystująca framework Vaadin musi posiadać klasę, która dziedziczy po klasie</span></span><span style="color: #000000"><span style="font-family: Times New Roman,serif"><span style="font-size: small"><span style="font-weight: normal"> Application i implementuje metodę init(). W tworzonej aplikacji tą rolę pełni klasa VaadinApp, dodatkowo został wykorzystany interfejs ClickListener do obsługi zdarzeń obiektu Button.</span></span></span></span></p>
<pre>public class VaadinApp extends Application implements ClickListener {

 private Window mainWindow;
 private Window subWindow;
 private Button closeButton;
 private Label label;

 @Override
 public void init() {
 mainWindow = new Window("Main window");
 createSubWindow();
 mainWindow.addWindow(subWindow);
 setMainWindow(mainWindow);        
 }

//...
}</pre>
<p><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="font-weight: normal"><span style="color: #000000"><span style="font-family: Times New Roman,serif"><span style="font-size: small">W metodzie init() stworzone zostało główne okno programu stanowiące kontener dla pozostałych  elementów graficznego interfejsu użytkownika.</span></span></span></p>
<pre> private void createSubWindow() {
   VerticalLayout layout = new VerticalLayout();
   layout.setSpacing(true);
   layout.setMargin(true);    

   label = new Label("Window content");
   closeButton = new Button("Close");
   closeButton.addListener(this);

   layout.addComponent(closeButton);

   subWindow = new Window("Window");
   subWindow.addComponent(layout);
   subWindow.center();
   subWindow.setClosable(false);
 }

 @Override
 public void buttonClick(ClickEvent event) {
   mainWindow.removeWindow(subWindow);
 }</pre>
<p><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="font-weight: normal"><span style="color: #000000"><span style="font-family: Times New Roman,serif"><span style="font-size: small">Metoda  buttonClick pochodzi z interfejsu  ClickListener, jej wywołanie powoduje usunięcie okna z okna głównego aplikacji.</span></span></span></p>
<p><span style="color: #000000"><span style="font-size: large"><strong>Podsumowanie</strong></span></span></p>
<p><span style="font-size: small"><span style="font-weight: normal">Vaadin framework stanowi ciekawą alternatywę dla tworzenia tradycyjnego tworzenia widoków – za pomocą jsp, html css itd. W końcu cała aplikacja może być napisana w Javie. </span></span></p>
<p><span style="font-size: small"><span style="font-weight: normal">Sposób implementacji poszczególnych elementów jest bardzo podobny do Swinga co moim zdaniem należy uznać za duży plus. Wydaje mi się, że Vaadin świetnie sprawdziłby się w mały i średnich projektach.</span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.espeo.pl/2010/01/15/vaadin-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New year &#8211; new challenges</title>
		<link>http://blog.espeo.pl/2010/01/05/new-year-new-challenges/</link>
		<comments>http://blog.espeo.pl/2010/01/05/new-year-new-challenges/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 11:47:28 +0000</pubDate>
		<dc:creator>TomaszRakowski</dc:creator>
				<category><![CDATA[english]]></category>

		<guid isPermaLink="false">http://blog.espeo.pl/?p=192</guid>
		<description><![CDATA[And it&#8217;s happened &#8211; the 2009 is over&#8230; The time is passing by like a TGV train &#8211; is it just me or it happens to everybody?
I look at my mates in the office and I see they know that it is 2010 now. However they don&#8217;t seem to bother &#8211; it looks like they [...]]]></description>
			<content:encoded><![CDATA[<p>And it&#8217;s happened &#8211; the 2009 is over&#8230; The time is passing by like a TGV train &#8211; is it just me or it happens to everybody?</p>
<p>I look at my mates in the office and I see they know that it is 2010 now. However they don&#8217;t seem to bother &#8211; it looks like they have a new energy to work, to have a fresh start in a new year.  Good for them! Having a spare time is something, we can&#8217;t afford nowadays &#8211; and it could be even harder, as some new challenges are right ahead. And you know what? I can read from our developers&#8217; faces that they were expecting it! Even more &#8211; they were waiting for it, as new challenges are like an air to breath for them, like a petrol for a racecar &#8211; &#8220;too much&#8221; is not in their vocabulary.</p>
<p>What can I say &#8211; let the 2010 begin!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.espeo.pl/2010/01/05/new-year-new-challenges/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile methodology &#8211; leading to teamwork improvement</title>
		<link>http://blog.espeo.pl/2009/12/14/agile-methodology-leading-to-teamwork-improvement/</link>
		<comments>http://blog.espeo.pl/2009/12/14/agile-methodology-leading-to-teamwork-improvement/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 16:19:58 +0000</pubDate>
		<dc:creator>TomaszRakowski</dc:creator>
				<category><![CDATA[english]]></category>

		<guid isPermaLink="false">http://blog.espeo.pl/?p=187</guid>
		<description><![CDATA[As far as a team&#8217;s effectiveness is concerned, I can easily tell, that in my opinion, based on my eye-witnessed observations, employees who are familiar with and experienced in agile methodology are far better team players than those who aren&#8217;t. This statement&#8217;s got even stronger meaning, when you realize, that for me it is a [...]]]></description>
			<content:encoded><![CDATA[<p>As far as a team&#8217;s effectiveness is concerned, I can easily tell, that in my opinion, based on my eye-witnessed observations, employees who are familiar with and experienced in agile methodology are far better team players than those who aren&#8217;t. This statement&#8217;s got even stronger meaning, when you realize, that for me it is a totally new subject and I&#8217;ve never come across this kind of methodology in software development before!</p>
<p>It all started during our office Christmas party. We were divided into two groups, with different goals to achieve. What surprised me the most, was that making two groups was the difficult part &#8211; as everyone wanted to be with everyone <img src='http://blog.espeo.pl/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />   After two teams were made &#8211; all following steps were processed as they were planned to, without a scratch, and all were delivered on time. The level of understanding and an easiness of acting as a team was astonishing.</p>
<p>The next day I was even more mystified when I discovered, that during typical business activities concerning software development, all was lead in the same way as it was still a Christmas party &#8211; with a great understanding, effective cooperation, perfect communication and in awesome moods.  In this moment it became obvious to me &#8211; it is the way how software should be developed. Ever.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.espeo.pl/2009/12/14/agile-methodology-leading-to-teamwork-improvement/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Web Toolkit 2.0 oficjalnie dostępny!</title>
		<link>http://blog.espeo.pl/2009/12/09/google-web-toolkit-2-0-oficjalnie-dostepny/</link>
		<comments>http://blog.espeo.pl/2009/12/09/google-web-toolkit-2-0-oficjalnie-dostepny/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 17:17:45 +0000</pubDate>
		<dc:creator>Michał Kalinowski</dc:creator>
				<category><![CDATA[news]]></category>
		<category><![CDATA[technologia]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://blog.espeo.pl/?p=174</guid>
		<description><![CDATA[Wczoraj na Google Campfire One został oficjalnie zaprezentowany Google Web Toolkit w najnowszej wersji 2.0. Nowości i zmian jest naprawdę sporo, a jedną z istotniejszych jest wprowadzenie narzędzia Speed Tracer.
Speed Tracer jest dodatkiem do przeglądarki Google Chrome, który umożliwia analizę wydajnościową aplikacji webowych (nie tylko tych tworzonych w GWT). Speed Tracer pozwala na bardzo dokładne [...]]]></description>
			<content:encoded><![CDATA[<p>Wczoraj na <a href="http://code.google.com/campfire/" target="_blank">Google Campfire One</a> został oficjalnie zaprezentowany <a href="http://code.google.com/webtoolkit/" target="_blank">Google Web Toolkit</a> w najnowszej wersji 2.0. Nowości i zmian jest naprawdę sporo, a jedną z istotniejszych jest wprowadzenie narzędzia Speed Tracer.</p>
<p>Speed Tracer jest dodatkiem do przeglądarki Google Chrome, który umożliwia analizę wydajnościową aplikacji webowych (nie tylko tych tworzonych w GWT). Speed Tracer pozwala na bardzo dokładne przyjrzenie się działającej aplikacji, wliczając w to np. obserwację zdarzeń JavaScript&#8217;owych. Zamiast wymieniać następne funkcjonalności narzędzia Speed Tracer, lepiej obejrzeć krótki (1:40) tutorial, gdzie wszystko jest bardzo ładnie pokazane. Warto zwrócić uwagę na naprawdę rewelacyjny interfejs aplikacji (zrobiony oczywiście w GWT <img src='http://blog.espeo.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ).</p>
<p><!-- Smart Youtube --><span class="youtube"><object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/Sn_3rJaexKc&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=&amp;fs=1&amp;hl=en&amp;autoplay=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0" /><param name="allowFullScreen" value="true" /><embed wmode="transparent" src="http://www.youtube.com/v/Sn_3rJaexKc&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=&amp;fs=1&amp;hl=en&amp;autoplay=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="355" ></embed><param name="wmode" value="transparent" /></object></span></p>
<p>Myślą przewodnią nowej wersji GWT są szybsze aplikacje webowe. Szybsze zarówno w sensie szybkości ich działania, jak i szybkości developmentu. Lista zmian i nowości jest naprawdę duża. Zwrócę więc uwagę tylko na te najważniejsze (moim zdaniem).</p>
<p>Wersja 2.0 zdecydowanie poprawia cykl <em>edycja/odświeżenie</em> przez wprowadzenie tzw. <em>development mode</em>, który pozwala uruchomić w trybie <em>debug</em> projekt GWT w dowolnej przeglądarce, a nie jednej, dedykowanej (jak to było wcześniej). Oznacza to, że nareszcie można używać Firefoksa albo Chrome&#8217;a przy tworzeniu aplikacji GWT, a wraz z nimi -- pakietu ulubionych rozszerzeń na czele z Firebugiem <img src='http://blog.espeo.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Nie obeszło się przy tej okazji bez zmiany <a href="http://code.google.com/eclipse/" target="_blank">Google Plugin for Eclipse</a>, którym teraz można całkowicie kontrolować development mode z poziomu naszego ulubionego IDE <img src='http://blog.espeo.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Jeszcze trochę z ciekawostek: development mode działa przez sieć. Można więc &#8220;przypiąć się&#8221; do zdalnej sesji przeglądarki. Wydaje się to szczególnie przydatne dla Linuksiarzy, którzy mogą tylko zgadywać jak wygląda ich aplikacji w IE pod Windows. (Nawet z GWT pewnych rzeczy się nie przeskoczy&#8230;)</p>
<p>Kolejna wielka zmiana, która dla mnie osobiście wydaje się być szalenie interesująca, to wprowadzenie nowego, deklaratywnego sposobu konstruowania interfejsu użytkownika o nazwie <em>UiBinder</em>. Założenie jest takie, by uczynić łatwą (a przy okazji trochę wymusić) separację warstwy widoku od logiki aplikacji. Pomysł polega na tworzeniu dwóch plików dla każdego komponentu warstwy prezentacji. Aspekty widoku zawarte są w pliku <strong>.ui.xml</strong>, który stanowi &#8220;mieszankę&#8221; normalnego HTML&#8217;a oraz komponentów widoku (ang. <em>widgets</em>). Sama implementacja logiki aplikacji pozostaje natomiast w osobnym pliku <strong>.java</strong>. Pozwala to na bardzo wyraźną separację tych dwóch zagadnień i np. bardziej efektywną współpracę programistów oraz web designerów. Dodatkowo, w czasie kompilacji sprawdzane są wszystkie referencje między powyższymi plikami, więc nie ma mowy o żadnych literówkach i tego typu błędach. Naturalnie, Google Plugin for Eclipse wspiera to rozwiązanie w 100%, wliczając refactoring, uzupełnianie kodu itd.</p>
<p>Najnowszy Google Web Toolkit wprowadza również tzw. <em>layout panels</em>, pozwalające na dokładne rozmieszczenie elementów w obrębie strony. Nie ma co ukrywać, że używając HTML i CSS jest to duży problem, który najczęściej wymusza użycie pewnych &#8220;sztuczek&#8221;. Nawet we wcześniejszych wersjach GWT czasami trzeba było pokombinować, żeby coś wyglądało tak jak trzeba we wszystkich przeglądarkach. Nowe rozwiązanie bazuje tylko na standardzie CSS, co ma dać layout nie tylko bardziej stabilny i przewidywalny, ale również szybszy (znane są dość spore problemy wydajnościowe przy zmianie rozmiaru okna przeglądarki we wcześniejszych wersjach GWT). Layout panels, jak łatwo się domyślić, doskonale sprawdzają się w połączeniu z UiBinder.</p>
<p>Kluczową nową funkcjonalnością w GWT 2.0 jest programowe rozdzielanie kodu (ang. <em>code splitting</em>). Polega to na wskazaniu (w kodzie źródłowym), które komponenty muszą być wczytane &#8220;z góry&#8221; i są konieczne do załadowania aplikacji, a które można doczytać chwilę później. To tak trochę jak oglądanie filmu na YouTube: nie trzeba przecież wczytać całości, żeby rozpocząć oglądanie. Moim zdaniem to świetne rozwiązanie. Mamy do czynienia przecież z aplikacjami webowymi; tutaj nie może być poczucia, że coś jest &#8220;instalowane&#8221;. Taką aplikację otwieramy i już ma być; każąc użytkownikowi czekać 15 sekund na pojawienie się pierwszego ekranu, możemy go łatwo stracić. Świetne wyniki tutaj uzyskał zespół Google Wave. W chwili obecnej skompilowana, pełna funkcjonalność tej aplikacji to &#8220;ważący&#8221; prawie 1500 kB JavaScript, który trzeba przecież ściągnąć od razu. Dzięki zastosowaniu rozdzielania kodu, początkowo użytkownik ma do pobrania 200 kB (a po kompresji już tylko 80 kB), a reszta jest &#8220;dociągana&#8221; w czasie, gdy zastanawia się gdzie by tu kliknąć. Różnica właściwie o rząd wielkości! Częściowo zasługa w tym również nowej wersji kompilatora, który tak czy inaczej &#8220;odchudza&#8221; kod nawet o ponad 20%. Można bez problemu skompilować starsze aplikacje. W moim ostatnim projekcie w GWT dało to oszczędność 14% (właśnie sprawdziłem <img src='http://blog.espeo.pl/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ) tak po prostu, bez dotykania kodu źródłowego.</p>
<p>Z mniejszych zmian, nastąpiło ulepszenie mechanizmu paczek (ang. <em>bundles</em>). Teraz zamykać w paczki można nie tylko grafiki, ale pliki dowolnego rodzaju. Jest również specjalny rodzaj paczki dla plików CSS, który automatycznie optymalizuje dołączone arkusze stylów.</p>
<p>Podsumowując, GWT 2.0 wydaje się być znaczną aktualizacją tego produktu. Poprawiono zarówno efektywność pracy z technologią (co w konsekwencji zmniejsza koszt tworzenia oprogramowania), jak i wydajność samych aplikacji. Google Web Toolkit niewątpliwie potwierdza swoją mocną pozycję na rynku nowoczesnych technologii front-end&#8217;owych dla aplikacji webowych. Dla mnie osobiście, jest to już od dawna faworyt w tej kategorii, który coraz bardziej rośnie w siłę. Gorąco zachęcam do pobrania nowej wersji biblioteki i przyjrzenia się wprowadzonym zmianom. Zainteresowanych kieruję na <a href="http://code.google.com/webtoolkit/" target="_blank">stronę produktu</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.espeo.pl/2009/12/09/google-web-toolkit-2-0-oficjalnie-dostepny/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google GIN, czyli dependency injection w GWT</title>
		<link>http://blog.espeo.pl/2009/09/04/google-gin-czyli-dependency-injection-w-gwt/</link>
		<comments>http://blog.espeo.pl/2009/09/04/google-gin-czyli-dependency-injection-w-gwt/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 15:05:48 +0000</pubDate>
		<dc:creator>Michał Kalinowski</dc:creator>
				<category><![CDATA[technologia]]></category>
		<category><![CDATA[gin]]></category>
		<category><![CDATA[guice]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://blog.espeo.pl/?p=160</guid>
		<description><![CDATA[Wstęp
Google GIN (GWT INjection) to stosunkowo młody projekt Google, wprowadzający do Google Web Toolkit możliwość wstrzykiwania zależności (ang. dependency injection). Oparty jest na Google Guice (o którym pisałem kilka tygodni temu) i zapewnia pewien podzbiór funkcjonalności tej biblioteki.  Po co więc GIN? Potrzeba wynika wprost ze specyfiki aplikacji tworzonych w GWT, która uniemożliwia zastosowanie &#8220;typowego&#8221; [...]]]></description>
			<content:encoded><![CDATA[<h2>Wstęp</h2>
<p><a href="http://code.google.com/p/google-gin/" target="_blank">Google GIN (GWT INjection)</a> to stosunkowo młody projekt Google, wprowadzający do <a href="http://code.google.com/webtoolkit/" target="_blank">Google Web Toolkit</a> możliwość wstrzykiwania zależności (ang. <em>dependency injection</em>). Oparty jest na <a href="http://code.google.com/p/google-guice/" target="_blank">Google Guice</a> (o którym <a href="http://blog.espeo.pl/2009/08/18/google-guice-dependency-injection-framework/" target="_blank">pisałem kilka tygodni temu</a>) i zapewnia pewien podzbiór funkcjonalności tej biblioteki.  Po co więc GIN? Potrzeba wynika wprost ze specyfiki aplikacji tworzonych w GWT, która uniemożliwia zastosowanie &#8220;typowego&#8221; frameworka do wstrzykiwania zależności. Rozwinę ten temat za chwilę.</p>
<p>Póki co, nie ma możliwości pobrania skompilowanej biblioteki ze strony projektu (tak jak pisałem, jest to jeszcze wczesna faza rozwoju), więc pozostaje <em>check out</em> z publicznego repozytorium i własnoręczna kompilacja:</p>
<pre>
<pre class="brush: bash;">
svn checkout http://google-gin.googlecode.com/svn/trunk/ google-gin-read-only
cd google-gin-read-only
ant dist
</pre>
</pre>
<p>Zbudowanego JARa (<strong>./out/dist/gin.jar</strong>) oczywiście należy dołączyć do swojego projektu.</p>
<h2>Zaczynamy!</h2>
<p>Mamy już dostępne klasy GIN, więc można zaczynać. W regularnym Guice, po skonfigurowaniu zależności w klasie modułu i utworzeniu <strong>Injector</strong>a, obiekty pobiera się mniej więcej tak:</p>
<pre>
<pre class="brush: java;">
RegistrationService registrationService = injector.getInstance(RegistrationService.class);
</pre>
</pre>
<p>W GWT jednak powyższy kod nie zadziała. Żeby być ścisłym: nie zadziała w komponentach po stronie klienta (ang. <em>client-side</em>). Jak wiadomo, aplikacja GWT dzieli się na stronę klienta i stronę serwera. Po stronie serwera nie ma żadnego problemu ze wstrzykiwaniem zależności. Obiekty są instancjonowane w rzeczywistym JRE (najczęściej w kontenerze serwletów) i żyją &#8220;normalnym&#8221; Javowym życiem. Można używać Guice, Spring albo dowolnego innego rozwiązania do wstrzykiwania zależności i będzie działać. Po stronie klienta wygląda to jednak zupełnie inaczej, ponieważ kod Java jest kompilowany do JavaScript, więc JRE nie istnieje (jest jedynie w niewielkim zakresie emulowane przez bibliotekę GWT). Standardowe użycie Guice nie zadziała więc z dwóch powodów:</p>
<ul>
<li>Na poziomie JavaScript nie istnieją klasy.</li>
<li>Guice (podobnie jak większość tego typu rozwiązań) często korzysta z mechanizmu <em>reflection</em> Javy, który nie jest w ogóle emulowany w GWT.</li>
</ul>
<p>GIN stosuje więc inny sposób na zapewnienie wstrzykiwania zależności. Na początek należy zaimportować moduł GIN we własnym module GWT.</p>
<pre>
<pre class="brush: xml;">
&lt;module&gt;
  ...
  &lt;inherits name=&quot;com.google.gwt.inject.Inject&quot; /&gt;
  ...
&lt;/module&gt;
</pre>
</pre>
<p>Teraz funkcjonalność oferowana przez GIN jest dostępna w obrębie strony klienta aplikacji GWT. Dochodzimy jednak ponownie do momentu, gdy &#8220;jakoś&#8221; trzeba w końcu te zależności pobrać. W GIN używa się do tego specjalnej wersji <strong>Injector</strong>a &#8212; <strong>Ginjector</strong>a (który jednak de facto nie jest związany relacją dziedziczenia z tym pierwszym).</p>
<pre>
<pre class="brush: java;">
public interface ApplicationGinjector extends Ginjector {
    ApplicationPresenter getApplicationPresenter();
}
</pre>
</pre>
<p><strong>Ginjector</strong> powinien oferować tylko komponenty potrzebne na etapie inicjalizacji aplikacji. Przy ich pobieraniu zostaną zainicjowane ich zależności, a więc również zależności tych zależności itd. W ten sposób zostanie zbudowany cały graf obiektów, a zależności automatycznie powstrzykiwane. W tym przypadku, komponentem potrzebnym na samym początku działania aplikacji jest <strong>ApplicationPresenter</strong>, który wyświetla ekran startowy. Zależności definiuje się dokładnie tak jak w Guice, czyli za pomocą adnotacji <strong>@Inject</strong>.</p>
<p>Jak wiadomo, <strong>Injector</strong> potrzebuje również modułu, w którym zawarte są informacje na temat komponentów.</p>
<pre>
<pre class="brush: java;">
public class ApplicationClientModule extends AbstractGinModule {
    @Override
    protected void configure() {
        bind(ApplicationPresenter.class);
        // other bindings...
    }
}
</pre>
</pre>
<p>Jak widać, moduł po stronie klienta w GWT dziedziczy z <strong>AbstractGinModule</strong>. Poza tym wszystko wygląda dokładnie jak w Guice. Istotnym niuansem związanym z modułami GIN jest fakt, że w przypadku nie odnalezienia powiązania dla klasy, automatycznie wywoływana jest dla niej metoda <strong>GWT.create()</strong>, przez co niektóre rzeczy (np. asynchroniczne interfejsy usług) będą działać nawet bez odpowiedniej deklaracji w klasie modułu.</p>
<p>Zdefiniowany moduł należy jeszcze skojarzyć z właściwym interfejsem <strong>Ginjector</strong> za pomocą adnotacji <strong>@GinModules</strong>.</p>
<pre>
<pre class="brush: java;">
@GinModules(ApplicationClientModule.class)
public interface ApplicationGinjector extends Ginjector {
    ApplicationPresenter getApplicationPresenter();
}
</pre>
</pre>
<p>W ten sposób, <strong>Ginjector</strong> jest w stanie skonfigurować całą aplikację na podstawie danych zawartych w określonym module. Aby to zrobić, należy go utworzyć za pomocą wywołania <strong>GWT.create()</strong> oraz pobrać początkowe obiekty.</p>
<pre>
<pre class="brush: java;">
public final class Application implements EntryPoint {
    public void onModuleLoad() {
        ApplicationGinjector injector = GWT.create(ApplicationGinjector.class);
        ApplicationPresenter applicationPresenter = injector.getApplicationPresenter();
        applicationPresenter.go(RootPanel.get());
    }
}
</pre>
</pre>
<p>W ten sposób, cała procedura wstrzykiwania zależności ma miejsce już w czasie kompilacji. Użycie GIN nie jest więc związane z żadnym dodatkowym narzutem przetwarzania. (Wyszłoby na to samo, gdybyśmy konfigurowali komponenty ręcznie.)</p>
<h2>Prawie jak Guice</h2>
<p>Z użyciem GIN jest związanych kilka niuansów, o czym wspomniałem już na samym początku. GIN to nie jest mimo wszystko to samo co Guice, tylko dla GWT. Najbardziej istotne różnice w stosunku do Guice to:</p>
<ul>
<li>Zamiast typów <strong>Module</strong> i <strong>AbstractModule</strong> są <strong>GinModule</strong> i <strong>AbstractGinModule</strong>.</li>
<li>Zamiast typu <strong>Injector</strong> jest <strong>Ginjector</strong> z adnotacją <strong>@GinModules</strong>.</li>
<li>Niemożliwe jest użycie powiązania <strong>toInstance()</strong> i prawdopodobnie nigdy nie będzie możliwe (ze względu na to, że GIN działa w czasie kompilacji, a nie wykonania).</li>
<li>Na chwilę obecną nie jest możliwe definiowanie własnych zasięgów.</li>
<li>Nie ma adnotacji <strong>@ImplementedBy</strong> oraz <strong>@ProvidedBy</strong>.</li>
<li>Brak obsługi zależności cyklicznych.</li>
<li>Brak wsparcia dla AOP.</li>
</ul>
<p>Warto jeszcze dodać, że istnieje sposób na współpracę z regularnym Guice za pomocą klasy <strong>GinModuleAdapter</strong>, dzięki której <strong>GinModule</strong> staje się dostępny jako zwykły <strong>Module</strong>. Można więc rozważyć utworzenie wspólnej części zależności w postaci <strong>GinModule</strong>. Ponadto, zrozumienie jak działa strona klienta w GWT na pewno pomoże uniknąć wielu potencjalnych problemów z GIN.</p>
<h2>Podsumowanie</h2>
<p>Jak widać, w GWT również można wygodnie wstrzykiwać zależności i to korzystając z bardzo przyjaznego API znanego z Guice. Mimo, że biblioteka ta jest jeszcze nieco niedojrzała i nie doczekała się nawet wersji 1.0, moim zdaniem warto się nią zainteresować i zastosować we własnych projektach w Google Web Toolkit. Używając jej przez ostatnie kilka miesięcy nie napotkałem żadnych problemów (w szczególności ze stabilnością), a znacząco ułatwiłem sobie pracę, rezygnując z ręcznego wstrzykiwania zależności. Myślę, że Google jeszcze nie raz zaskoczy nas różnymi ciekawymi dodatkami do GWT. Póki co, zapraszam na <a href="http://code.google.com/p/google-gin/" target="_blank">stronę domową projektu</a> oraz zachęcam do własnych eksperymentów z Google GIN.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.espeo.pl/2009/09/04/google-gin-czyli-dependency-injection-w-gwt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Guice, dependency injection framework</title>
		<link>http://blog.espeo.pl/2009/08/18/google-guice-dependency-injection-framework/</link>
		<comments>http://blog.espeo.pl/2009/08/18/google-guice-dependency-injection-framework/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 15:30:46 +0000</pubDate>
		<dc:creator>Michał Kalinowski</dc:creator>
				<category><![CDATA[technologia]]></category>
		<category><![CDATA[guice]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://blog.espeo.pl/?p=138</guid>
		<description><![CDATA[Wstęp
Google Guice to framework wspierający wstrzykiwanie zależności (ang. dependency injection) w aplikacjach Java. Można by powiedzieć: kolejny framework wspierający wstrzykiwanie zależności. Faktycznie, trzeba przyznać, że rynek Javowych rozwiązań tego typu jest dość mocno nasycony już od dłuższego czasu i oferuje pełen przekrój złożoności bibliotek, zaczynając od bardzo lekkich, takich jak choćby PicoContainer, a kończąc na [...]]]></description>
			<content:encoded><![CDATA[<h2>Wstęp</h2>
<p><a href="http://code.google.com/p/google-guice/" target="_blank">Google Guice</a> to framework wspierający wstrzykiwanie zależności (ang. <em>dependency injection</em>) w aplikacjach Java. Można by powiedzieć: kolejny framework wspierający wstrzykiwanie zależności. Faktycznie, trzeba przyznać, że rynek Javowych rozwiązań tego typu jest dość mocno nasycony już od dłuższego czasu i oferuje pełen przekrój złożoności bibliotek, zaczynając od bardzo lekkich, takich jak choćby <a href="http://www.picocontainer.org/" target="_blank">PicoContainer</a>, a kończąc na pełnych stosach rozwiązań Java Enterprise ze <a href="http://www.springsource.org/about" target="_blank">Springiem</a> na czele. Czy warto więc zawracać sobie głowę Guice&#8217;m? Moim zdaniem warto, bo zaproponowane przez Google&#8217;a rozwiązanie pokazuje nową jakość w implementacji wstrzykiwania zależności w aplikacjach Java, czyniąc ogromny użytek z typów generycznych oraz adnotacji. Guice jest przy tym lekki, ma proste API i bardzo szybko można się go nauczyć. Dlaczego warto to zrobić? Bo jest dobry. Kolesie z Google&#8217;a go używają. Musi być dobry. Poza tym, wygrał <a href="http://www.joltawards.com/history/winners.html" target="_blank">18th Jolt Award</a> w kategorii <em>Libraries, Frameworks and Components</em>. Musi być dobry.</p>
<h2>Podstawy</h2>
<p>W Guice występują dwie podstawowe konstrukcje opisujące wstrzykiwanie zależności. Pierwszą są moduły, które mówią <em>co należy wstrzyknąć</em>, a drugą jest adnotacja <strong>@Inject</strong>, która mówi <em>gdzie należy wstrzyknąć</em>. Proste. Zobaczmy jak to działa na przykładzie usługi rejestracji użytkowników.</p>
<pre class="brush: java;">
public class RegistrationServiceImpl implements RegistrationService {
    private final PersistanceManager persistanceManager;
    private final MailService mailService;

    @Inject
    public RegistrationServiceImpl(PersistanceManager persistanceManager, MailService mailService) {
        this.persistanceManager = persistanceManager;
        this.mailService = mailService;
    }

    public void register(User user) {
        ...
    }
}
</pre>
<p>Jak widać naszą usługę specyfikuje kontrakt <strong>RegistrationService</strong>. Mamy jego implementację w postaci klasy <strong>RegistrationServiceImpl</strong>, która wymaga do działania usługi trwałości danych (<strong>PersistanceManager</strong>) oraz usługi do wysyłania maili (<strong>MailService</strong>). Chcielibyśmy, aby odpowiednie implementacje tych usług zostały automatycznie wstrzyknięte za pomocą parametrów konstruktora (adnotacja <strong>@Inject</strong>) już na etapie tworzenia usługi rejestracji. Spróbujmy opisać zależności między interfejsami a ich konkretnymi realizacjami za pomocą modułu.</p>
<pre class="brush: java;">
public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(RegistrationService.class).to(RegistrationServiceImpl.class);
        bind(PersistanceManager.class).to(HibernatePersistanceManager.class);
        bind(MailService.class).to(JavaMailService.class);
    }
}
</pre>
<p>Mamy nasz moduł. Jak widać, metoda <strong>configure()</strong> zawiera definicje kolejnych powiązań. Mamy więc usługę rejestracji określoną kontraktem <strong>RegistrationService</strong> z przypisaną naszą implementacją <strong>RegistrationServiceImpl</strong>. Mamy również usługę trwałości danych <strong>PersistanceManager</strong> zaimplementowaną w klasie <strong>HibernatePersistanceManager</strong>, która używa Hibernate&#8217;a do zapewnienia trwałości encji, oraz usługę <strong>MailService</strong> wraz z implementacją <strong>JavaMailService</strong> korzystającą z JavaMail do wysyłania poczty.</p>
<p>OK. Wystarczy już tylko użyć zdefiniowanego zespołu obiektów i przeprowadzić rejestrację użytkownika.</p>
<pre class="brush: java;">
public class UserRegistrationExample {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new MyModule());
        RegistrationService registrationService = injector.getInstance(RegistrationService.class);
        User user = new User(&quot;Michal&quot;, &quot;Kalinowski&quot;);
        registrationService.register(user);
    }
}
</pre>
<p>To wszystko. Działa. &#8220;Prawie&#8221; jak w Springu, tylko zamiast trochę przydługawego pliku XML mamy elegancką implementację interfejsu <strong>Module</strong> w Javie, a zamiast identyfikowania obiektów za pomocą jakichś napisów mamy referencje do rzeczywistych klas. Myślę, że nie muszę wspominać jak ułatwia to refactoring. Jedyne do czego można się &#8220;przyczepić&#8221; to inwazyjność framework&#8217;a (odniesienia do API we własnych klasach), ale coś za coś. Wygoda jest niesamowita. Swoją drogą, pomysł na tyle przypadł do gustu kolesiom od Springa, że sami piszą już coś podobnego; nazywa się to <a href="http://www.springsource.org/javaconfig" target="_blank">Spring JavaConfig</a> i powinno niedługo zostać oficjalnie wydane.</p>
<p>Oczywiście, proste powiązania interfejs &lt;=&gt; klasa i wstrzykiwanie zależności przez konstruktor to nie koniec możliwości Guice.</p>
<h2>Powiązania</h2>
<p>Oprócz prostych powiązań klasy z interfejsem, jest również kilka bardziej zaawansowanych konstrukcji.</p>
<p>Jedną z nich jest powiązanie adnotacją. Wyobraźmy sobie, że <strong>JavaMailService</strong> ma zostać użyty przez 2 różne usługi. Jedna z nich, nasz <strong>RegistrationService</strong>, do rozsyłania poczty powinna używać konta na Gmail&#8217;u, a inna &#8211; konta na Yahoo. Nic prostszego. Potrzebna nam dodatkowa adnotacja.</p>
<pre class="brush: java;">
@BindingAnnotation
@Target( { FIELD, PARAMETER, METHOD })
@Retention(RUNTIME)
public @interface Gmail {
}
</pre>
<p>Modyfikujemy nieznacznie konstruktor naszej usługi rejestracji.</p>
<pre class="brush: java;">
public class RegistrationServiceImpl implements RegistrationService {
    @Inject
    public RegistrationServiceImpl(PersistanceManager persistanceManager, @Gmail MailService mailService) {
        this.persistanceManager = persistanceManager;
        this.mailService = mailService;
    }
    ...
}
</pre>
<p>Oczywiście potrzebne jest również dodatkowe powiązanie w module.</p>
<pre class="brush: java;">
bind(MailService.class).annotatedWith(Gmail.class).to(GmailJavaMailService.class);
</pre>
<p>Widać więc, że w Guice powiązanie jednoznacznie definiuje dopiero para adnotacji oraz typu.</p>
<p>Idźmy dalej. Jest możliwość stworzenia powiązania z konkretną instancją danego typu.</p>
<pre class="brush: java;">
bind(String.class).annotatedWith(JdbcUri.class).toInstance(&quot;jdbc:mysql://localhost/application&quot;);
</pre>
<pre class="brush: java;">
public class HibernatePersistanceManager implements PersistanceManager {
    public HibernatePersistanceManager(@JdbcUri String jdbcConnectionString) {
         ...
    }
    ...
}
</pre>
<p>Cool, huh? Można również zdefiniować w module własną metodę tworzenia obiektu. Używa się do tego adnotacji <strong>@Provides</strong>.</p>
<pre class="brush: java;">
public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        ...
    }

    @Provides
    PersistanceManager providePersistanceManager() {
        HibernatePersistanceManager persistanceManager = new HibernatePersistanceManager(&quot;jdbc:mysql://localhost/application&quot;);
        persistanceManager.initConnectionPool();
        return persistanceManager;
    }
}
</pre>
<p>Robi się bałagan w klasie modułu? Napiszmy zewnętrzne providery dla naszych komponentów.</p>
<pre class="brush: java;">
public class DatabasePersistanceManagerProvider implements Provider&lt;persistanceManager&gt; {
    private final Connection connection;

    @Inject
    public DatabasePersistanceManagerProvider(Connection connection) {
        this.connection = connection;
    }

    public PersistanceManager get() {
        DatabasePersistanceManager persistanceManager = new DatabasePersistanceManager();
        persistanceManager.setConnection(connection);
        return persistanceManager;
    }
}
</pre>
<p>I jeszcze odpowiednie powiązanie.</p>
<pre class="brush: java;">
bind(PersistanceManager.class).toProvider(DatabasePersistanceManagerProvider.class);
</pre>
<p>Można nawet zdefiniować providera bezpośrednio w interfejsie.</p>
<pre class="brush: java;">
@ProvidedBy(DatabasePersistanceManagerProvider.class)
public interface PersistanceManager {
    ...
}
</pre>
<p>Warto zwrócić uwagę, że definicje powiązań w Guice &#8220;czytają się same&#8221;. Jest to ogromna zaleta tej biblioteki. Nie ma tu nawet co tłumaczyć.</p>
<h2>Zasięgi</h2>
<p>Domyślnie Guice dostarcza nową instancję klasy przy każdym zapytaniu do kontenera. Można jednak zażyczyć sobie za pomocą adnotacji <strong>@Singleton</strong>, by istniała dokładnie jedna instancja danego komponentu w obrębie całej aplikacji. W aplikacjach webowych, po dołączeniu odpowiedniego dodatku do deskryptora <strong>web.xml</strong>, można używać również zasięgu sesyjnego (<strong>@SessionScoped</strong>) oraz zasięgu pojedynczego żądania HTTP (<strong>@RequestScoped</strong>). Zasięgi można ustawiać na kilka sposobów. Można np. zrobić to na samej klasie.</p>
<pre class="brush: java;">
@Singleton
public class JavaMailService implements MailService {
    ...
}
</pre>
<p>Nic nie stoi na przeszkodzie, by ustawić zasięg na metodzie tworzącej obiekt w obrębie modułu.</p>
<pre class="brush: java;">
public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        ...
    }

    @Provides @Singleton
    MailService provideMailService() {
        ...
    }
}
</pre>
<p>Oczywiście, zawsze można zrobić to po prostu w definicji powiązania.</p>
<pre class="brush: java;">
bind(MailService.class).to(JavaMailService.class).in(Singleton.class);
</pre>
<h2>Wstrzykiwanie</h2>
<p>W Guice dostępne są 3 standardowe metody wstrzykiwania zależności. Widzieliśmy już wstrzykiwanie przez konstruktor. Można również użyć do tego regularnej metody (niekoniecznie klasycznego settera).</p>
<pre class="brush: java;">
public class RegistrationServiceImpl implements RegistrationService {
    @Inject
    public void provideLogger(Logger logger) {
        ...
    }
    ...
}
</pre>
<p>Można również wstrzykiwać bezpośrednio do pola klasy, ale jest to zdecydowanie niezalecane.</p>
<pre class="brush: java;">
public class RegistrationServiceImpl implements RegistrationService {
    @Inject Logger logger;
    ...
}
</pre>
<p>Można w Guice również wstrzykiwać same providery.</p>
<pre class="brush: java;">
public interface Provider&lt;t&gt; {
  T get();
}
</pre>
<p>Zapewniają one dodatkową elastyczność polegającą na tym, że kontener zwraca instancję komponentu-zależności wraz z każdym wywołaniem metody <strong>get()</strong>, a nie tylko jednorazowo na etapie tworzenia grafu obiektów.</p>
<pre class="brush: java;">
public class DatabasePersistanceManager implements PersistanceManager {
    private final Provider&lt;connection&gt; connectionProvider;

    @Inject
    public DatabasePersistanceManager(Provider&lt;connection&gt; connectionProvider) {
        this.connectionProvider = connectionProvider;
    }

    public void persist(Object entity) {
        Connection connection = connectionProvider.get();
        ... // do something with provided connection
    }
}
</pre>
<p>Jakie to może mieć zastosowanie? Różne, przeróżne. Możemy potrzebować wielu instancji tego samego komponentu. Możemy zechcieć pomieszać komponenty różnych zasięgów (np. wstrzykiwanie danych użytkownika utrzymywanych w sesji HTTP do komponentu z zasięgiem Singleton). Możemy wreszcie użyć późnego ładowania (ang. <em>lazy loading</em>), jeśli konstruowanie komponentu-zależności jest kosztowne, a nie musi być wykonywane za każdym razem.</p>
<h2>Czy to wszystko?</h2>
<p>Oczywiście, omówiono tylko część możliwości Guice, aczkolwiek prawdopodobnie wystarczy to w 90% zastosowań. Widać więc, jak szybko można tę technologię przyswoić. Więcej informacji można odnaleźć w <a href="http://code.google.com/p/google-guice/wiki/Motivation" target="_blank">dokumentacji</a> biblioteki. Znajduje się tam m.in. omówienie wsparcia dla programowania aspektowego oraz opis integracji Guice z rozwiązaniami webowymi. Warto tam zajrzeć.</p>
<h2>Podsumowanie</h2>
<p>Google Guice wydaje się stanowić bardzo ciekawą ofertę jako framework do wstrzykiwania zależności. Jeśli nie potrzebujemy bardzo kompleksowego rozwiązania takiego jak np. Spring, Guice powinien być w zupełności wystarczający. Jest bardzo lekki, prosty i ma niezwykle szybką krzywą uczenia. Dokładne przeczytanie tego posta powinno pozwolić na rozpoczęcie pracy, a w razie problemów zawsze pozostaje dokumentacja. Guice znacznie uprzyjemnia pracę programisty, pozwalając opisywać zależności i szczegóły ich wstrzykiwania za pomocą kodu Java &#8220;ozdobionego&#8221; adnotacjami i typami generycznymi, z zachowaniem jednocześnie deklaratywnego charakteru tego opisu. Jest to niewątpliwie znaczny krok do przodu. Uważam, że w dobrym kierunku.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.espeo.pl/2009/08/18/google-guice-dependency-injection-framework/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ignorowanie metadanych różnych IDE w SVN</title>
		<link>http://blog.espeo.pl/2009/05/03/ignorowanie-metadanych-roznych-ide-w-svn/</link>
		<comments>http://blog.espeo.pl/2009/05/03/ignorowanie-metadanych-roznych-ide-w-svn/#comments</comments>
		<pubDate>Sun, 03 May 2009 18:59:17 +0000</pubDate>
		<dc:creator>Michał Kalinowski</dc:creator>
				<category><![CDATA[technologia]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[intellij idea]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://blog.espeo.pl/?p=133</guid>
		<description><![CDATA[Dzisiaj krótka, aczkolwiek przydatna (mam nadzieję) notatka. Problem (choć raczej kosmetyczny), który napotkałem w trakcie realizacji bieżącego projektu, to pojawianie się w repozytorium SVN różnych &#8220;dziwnych&#8221; katalogów i plików, nie związanych bezpośrednio z projektem. Szybko udało mi się ustalić, że są to metadane generowane przez IDE inne niż Eclipse. Wcześniej, pracując w projektach, gdzie jedynym [...]]]></description>
			<content:encoded><![CDATA[<p>Dzisiaj krótka, aczkolwiek przydatna (mam nadzieję) notatka. Problem (choć raczej kosmetyczny), który napotkałem w trakcie realizacji bieżącego projektu, to pojawianie się w repozytorium SVN różnych &#8220;dziwnych&#8221; katalogów i plików, nie związanych bezpośrednio z projektem. Szybko udało mi się ustalić, że są to metadane generowane przez IDE inne niż Eclipse. Wcześniej, pracując w projektach, gdzie jedynym używanym IDE był Eclipse, automatycznie dopisywałem:</p>
<pre class="brush: bash;">
.classpath
.project
.settings
.wtpmodules
</pre>
<p>do atrybutu <strong>svn:ignore</strong> katalogu każdego projektu w ramach przestrzeni roboczej (ang. <em>workspace</em>) i było po problemie. Aktualnie mamy w zespole jednego NetBeans&#8217;owca i do powyższej listy trzeba było dopisać jeszcze:</p>
<pre class="brush: bash;">
nbproject
</pre>
<p>Postanowiłem jednak przy okazji skonstruować kompletną listę wpisów do <strong>svn:ignore</strong>, która zawiera metadane 3 głównych IDE (Eclipse, NetBeans, IntelliJ IDEA). Dodatkowo dodałem <strong>target</strong>, jako standardowy katalog wyjściowy Maven&#8217;a oraz maskę <strong>*.log</strong>, bo takie pliki czasem również pojawiają się w repo. Mam nadzieję, że ta lista okaże się dla kogoś przydatna. Wygląda na to, że wystarczy ją &#8220;z góry&#8221; zaaplikować do wszystkich katalogów projektowych i mieć problem z głowy <img src='http://blog.espeo.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  .</p>
<p>Ostateczna wartości atrybutu <strong>svn:ignore</strong>:</p>
<pre class="brush: bash;">
target
*.log
.classpath
.project
.settings
.wtpmodules
nbproject
*.ipr
*.iws
*.iml
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.espeo.pl/2009/05/03/ignorowanie-metadanych-roznych-ide-w-svn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
