<?xml version='1.0' encoding='windows-1250'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-4053149</id><updated>2010-03-11T14:06:08.384+01:00</updated><title type='text'>Dagblog</title><subtitle type='html'>Blog nejen o programování pro všechny kodery a koderky.</subtitle><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default?start-index=26&amp;max-results=25'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://sweb.cz/pichlik/atom.xml'/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>769</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4053149.post-3415907120569757896</id><published>2010-03-11T12:10:00.003+01:00</published><updated>2010-03-11T14:06:08.561+01:00</updated><title type='text'></title><content type='html'>&lt;h3&gt;Pryč se Singletony&lt;/h3&gt;

  &lt;p&gt;&lt;a tref="http://en.wikipedia.org/wiki/Design_Patterns_%28book%29"&gt;Gang of Four&lt;/a&gt; odhalil na světlo světa katalog návrhových vzorů, díky kterému se do širokého povědomí dostaly přístupy k řešení typických úkolu v objektovém programování. Mezi nejznámější návrhové vzory patří bezesporu &lt;cite&gt;Singleton&lt;/cite&gt;, řešící existenci pouze jedné instance dané třídy. Nevím jestli je jeho popularita zapříčiněna tím, že jej každý pochopí a nebo tím, že jej každý potřebuje (nebo si to alespoň myslí), každopádně singletony najdeme v každém kódu. Bohužel ve skutečnosti jakékoliv použití Singletonu sebou nese &lt;a href="http://blogs.msdn.com/scottdensmore/archive/2004/05/25/140827.aspx"&gt;značná rizika a nevýhody&lt;/a&gt;. Pro mě osobně testování a svázání objektů. Pravda, není to chyba vzoru jako takového, ale spíše jeho zneužívání na nesprávných místech.&lt;/p&gt;

  &lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.sweb.cz/pichlik/archive/uploaded_images/singleton-789292.PNG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 68px;" src="http://www.sweb.cz/pichlik/archive/uploaded_images/singleton-789290.PNG" alt="" border="0" /&gt;&lt;/a&gt;Pojďme zkusit najít zakopanou kostra pudla. &lt;cite&gt;Singleton&lt;/cite&gt; ze své podstaty drží nějaký kontext, ostatně proto jej zavádíme. Dobrá rada na začátek. Pokud najdete v kódu singleton, který nedrží kontext, pak máte skvělou příležitost tenhle singleton (chování) odstranit, protože je zbytečný. Skrze kontext se dostáváme k jiným částem systému (&lt;a href="http://martinfowler.com/articles/injection.html#UsingAServiceLocator"&gt;&lt;cite&gt;service locator&lt;/cite&gt;&lt;/a&gt;), to mohou být například nacacheovaná data, pool  připojení k databázi a tak dále. To stále ještě není problém, ten nastane ve chvíli, kdy začnete singletony nořit do sebe. Z aplikace se totiž stane jedna velká drátovaná koule bahna.&lt;/p&gt;  
  &lt;p&gt;Známe problém, ale známe řešení? Podle mých zkušeností je nejlepším řešením &lt;a href="http://martinfowler.com/articles/injection.html#InversionOfControl"&gt;&lt;cite&gt;obrácená kontrola&lt;/cite&gt;&lt;/a&gt; realizovaná pomocí &lt;a href="http://martinfowler.com/articles/injection.html#FormsOfDependencyInjection"&gt;dependency injection&lt;/a&gt;. &lt;cite&gt;Dependency injection&lt;/cite&gt; neelimujeuje singletony jako takové, ale umožňuje je přesunout pryč z aplikačního kódu do vrstvy frameworku. To je přesně o co tu běží. V čistě napsané aplikaci by neměl být použitý jiný singleton než ten představující entry point do vlastní aplikace. Typickým příkladem je singleton frameworku, kterému se předá řízení při přijetí HTTP požadavku. V případě desktopové aplikace je to singleton představující &lt;cite&gt;service locator&lt;/cite&gt;, přes který se získávají jednotlivé &lt;cite&gt;controllery&lt;/cite&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-3415907120569757896?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/3415907120569757896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/3415907120569757896'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2010_03_07_archive.html#3415907120569757896' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-9017723838157668058</id><published>2010-02-19T16:33:00.002+01:00</published><updated>2010-02-19T16:45:12.263+01:00</updated><title type='text'></title><content type='html'>&lt;h3&gt;Když nerozhodují jenom technické aspekty&lt;/h3&gt;

&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://mirandaeditors.files.wordpress.com/2009/06/frustrated-at-computer.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 225px; height: 204px;" src="http://mirandaeditors.files.wordpress.com/2009/06/frustrated-at-computer.jpg" alt="" border="0" /&gt;&lt;/a&gt;Každý z nás zažil situaci, kdy byl postaven před nalezení vhodné technologie nebo frameworku pro řešení určitého problému. Dlouhou dobu jsem zastával názor, že nejdůležitějším kritérium jsou technologické aspekty jako stabilita, dokumentace, komunita, zralost atd. Dneska už mi pomalu dochází, že každé rozhodnutí sebou nese kromě technických i sociální dopady, které je neradno ignorovat. Pokud tedy nechcete riskovat vlastní defenestraci.&lt;/p&gt;

&lt;p&gt;Bohužel věci se začnou komplikovat ve chvíli kdy proti sobě postavíte technické a sociální aspekty, protože se jedná o mnohdy protichůdné požadavky.  Pokud máme &lt;strong&gt;například&lt;/strong&gt; tým lidi, kteří pět let píší web aplikace v &lt;cite&gt;Jave&lt;/cite&gt; a řekneme jim, že další budou psát třeba v &lt;cite&gt;Ruby a Ruby&lt;/cite&gt; on &lt;cite&gt;Rails&lt;/cite&gt;.V takovém případě se lehce může stát, že se jich půlka naštve a odejde, ačkoliv z technologického pohledu se to může zdát jako ta nejlepší věc.&lt;/p&gt;

&lt;p&gt;Pokud se rozhodujete pro jakoukoliv technologii, zvažte kromě technologických aspektů  i "měkká" kritéria, která se vyplatí neignorovat. Slovy klasika: &lt;cite&gt;“musíme tomu štěstíčku naproti“&lt;/cite&gt;. Lidé se obecně rádi učí nové věci, ale musí za tím vidět nějaký hlubší smysl. se úplně nejraději učí věci, které zvyšují jejich cenu na trhu. Tím nemám rozhodně na mysli, aby jste začali psát v jazyku &lt;cite&gt;Cobol&lt;/cite&gt;, protože lidí ovládajících tento jazyk je relativně málo. Spíše jde o věci, které jsou takzvaně v kurzu, bráno v kontextu předešlých vět. Super skvělý framework, který jste si napsali na koleni se nebude chtít nikdo učit, protože až ho to za dva roky přestane u vás ve firmě bavit, tato zkušenost mu životopis nevylepší.&lt;/p&gt;

&lt;p&gt; Jednoduché věci se prosazují daleko snáze oproti těm komplexnějším, přestože mohou přinést užitek. Pokud chcete prosadit něco komplexnějšího mějte po ruce nějaký &lt;a href="http://www.urbandictionary.com/define.php?term=wow%20effect"&gt;wov efekt&lt;/a&gt;. Je to sice levný trik, ale zabírá… Vždy a za každých okolností mějte na paměti, že lidé rádi nadávají na to čemu dokonale nerozumí. A jsou z toho frustrováni. Tomu nezabráníte, neberte si to osobně a hlavně buďte na to připraveni třeba školením.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-9017723838157668058?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/9017723838157668058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/9017723838157668058'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2010_02_14_archive.html#9017723838157668058' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-8023233373717081647</id><published>2010-01-28T23:55:00.003+01:00</published><updated>2010-01-29T00:13:59.723+01:00</updated><title type='text'></title><content type='html'>&lt;h3&gt;Proč nepotřebuji (zatím) asynchronní JDBC&lt;/h3&gt;

  &lt;p&gt;&lt;cite&gt;Lukáš Křečan&lt;/cite&gt; se zkusil zamyslet nad tím, jestli v Jave potřebuje asynchronní JDBC API a svůj závěr vtisknul přímo do článku &lt;a href="http://blog.krecan.net/2010/01/28/proc-nepotrebuji-asynchronni-jdbc/"&gt;Proč nepotřebuji asynchronní JDBC&lt;/a&gt;. Já si dovolím &lt;cite&gt;Lukášem&lt;/cite&gt; mírně doplnit.&lt;/p&gt;

  &lt;p&gt;Nejdříve bychom si mohli demonstrovat na jednoduchém kódu  Lukášem zmiňované Servlet 3.0 API s podporou asynchronního volání, které bude v našem dalším povídání hrát důležitou roli.&lt;/p&gt;
  &lt;pre class="brush: java;highlight: [5,6,9,18,40]"&gt;
@WebServlet(name = "AsyncServlet", urlPatterns = { "/AsyncServlet" }, asyncSupported=true)
public class AsyncServlet extends HttpServlet {
 
  protected void doGet(HttpServletRequest request, HttpServletResponse response) {
  AsyncContext ac = request.startAsync(request, response);
  ac.start(new Worker(ac));  
 }
 
 public static class Worker implements Runnable {
  private final AsyncContext ac;
  
  public Worker(AsyncContext ac) { 
   this.ac = ac;
  }

  @Override
  public void run() {
   HttpServletResponse response = (HttpServletResponse) ac.getResponse();
   try {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = null;
    try {
     out = response.getWriter();
     out.println("&amp;lt;html&amp;gt;");     
     out.println("&amp;lt;body&amp;gt;");
     out.println("&amp;lt;h1&amp;gt;Servlet AsyncServlet output&amp;lt;/h1&amp;gt;");
     for(int i = 0; i &amp;lt; 10000; i++) {
      out.println("&amp;lt;p&amp;gt;Asynchronously generated response :-)&amp;lt;/p&amp;gt;");
      out.flush();
      try {
       Thread.sleep(200);       
      } catch (InterruptedException e) {}
     }
     out.println("&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;");     
    } catch (IOException e) {     
    } finally {
     out.close();
    }
   } finally {
    ac.complete();
   }
  }
 }
} 
  &lt;/pre&gt;

  &lt;p&gt;Trocha popisu. Na řádku 5 instruujeme kontejner, že požadavek bude vyřízen asynchronně. Na řádku 6 odpálíme asynchronní exekuci. V tomto případě se použije vlákno z poolu servletového kontejneru. Samozřejmě to nemusí vždy vyhovovat a my mužeme vytvořit klasický &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html"&gt;ThreadPoolExecutor&lt;/a&gt; a vlákna brát z něj.&lt;/p&gt;
  &lt;p&gt;
   Po vykonání řádku 6 se nám tedy v novém vlákně spustí exekuce viz třídá Worker a původní vlákno servletového kontejneru dokončí metodu &lt;code&gt;doGet&lt;/code&gt; a může být použito k obsluze jiného HTTP požadavku. Metoda &lt;code&gt;run&lt;/code&gt; třídy &lt;code&gt;Worker&lt;/code&gt; tedy běží v jiném vlákně. Pomocí &lt;code&gt;AsyncContextu&lt;/code&gt;, který jsme si předali a tvoří nás komunikační kanál se servletovým kontejnerem, jsme schopni vytvořit repsonse. Dokončení asynchronní práce se signalizuje voláním metody &lt;code&gt;complete&lt;/code&gt; na řádku 40.&lt;/p&gt;

    
    &lt;p&gt;Nyní k jádru pudla. Kde nám do hry vstupuje ono vzývané asynchronní JDBC  API. Představme si náš příklad lehce upraven o volání nám dobře známého JDBC. Stačí nám pouze třída &lt;code&gt;Worker&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="brush: java;highlight: [10,12]"&gt;
public static class Worker implements Runnable {
  private final AsyncContext ac;
  
  public Worker(AsyncContext ac) { 
   this.ac = ac;
  }

  @Override
  public void run() {
   Connection conn = getConnectionFromSomewhere();
   PreparedStatement ps =  conn.prepareStatement("insert into orders (a) values ('a')");
   ps.executeUpdate();
      ac.dispatch("/dekujeme-za-nakup.jsp");   
  } 
 }    
&lt;/pre&gt;
&lt;p&gt;Co se stane? Servletový kontejner má vlákno vrácené a může obsluhovat další HTTP požadavky, ale vlákno vykonávající  metodu &lt;code&gt;run&lt;/code&gt; bude zablokované na řádcích 10 a 12. &lt;cite&gt;Jíra Mareš&lt;/cite&gt; má do jisté míry pravdu, že na řádku 10 nám může pomoci poolovaní na úrovni databázových připojení. Nicméně vlákno bude zablokováno nejpozději na řádku 12.&lt;/p&gt;

  &lt;p&gt;Představme si situaci, že máme eschop a uživatel právě učinil nákup. Požadavek se odeslal a kód zůstal trčet na řádku 12. Asi nechceme, aby měl uživatel deset sekund "zmrzlé" UI prohlížeče, ale raději bychom mu ukázali stránku kde mu poděkujeme za nákup a třeba ještě něco nabídli z dceřiného obchodu.&lt;/p&gt;
  &lt;p&gt;Bez asynchronního JDBC API musíme obě blokující volání (10,11) zabalit ručně do asynchronního volání. Původní metoda &lt;code&gt;run&lt;/code&gt; potom vypadá přímo pohádkově.&lt;/p&gt;
&lt;pre class="brush: java;"&gt;

@Override
public void run() {
 new Thread(){    
  public void run() {
   Connection conn = getConnectionFromSomewhere();
   PreparedStatement ps =  conn.prepareStatement("insert into foo (a) values ('a')");
   ps.executeUpdate();
  }    
 }.start();   
 ac.dispatch("/dekujeme-za-nakup.jsp");
} 
&lt;/pre&gt;
  &lt;p&gt;Nechtěl bych zde polemizovat, že JDBC je  samospasné. Je to jenom špička ledovce. Každopádně je to dobrý začátek k tomu, aby si podobným způsobem nemuseli zaneřádit kód aplikační vývojáři. Samo o sobě asynchronní JDBC  nepřinese žádné drastické zvýšení výkonu (v tom jsme s Lukášem za jedno), snad možná svižnější UI. Aby mělo asynchronní JDBC nějaký výkonnostní dopad, bylo by potřeba mít driver a databázi, která asynchronní volání podporuje.&lt;/p&gt;
  &lt;p&gt;A mimochodem není to taková utopie viz níže&lt;/p&gt;
  &lt;ul&gt;
   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms345113(SQL.90).aspx"&gt;Building Reliable, Asynchronous Database Applications Using Service Broker&lt;/a&gt; (&lt;cite&gt;Microsoft SQL Server 9.0 Technical Articles&lt;/cite&gt;)&lt;/li&gt;

   &lt;li&gt;&lt;a href="http://code.google.com/p/adbcj/wiki/Tutorial"&gt;Asynchronous Database Connectivity in Java&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href="http://www.igvita.com/2008/08/11/asynchronous-db-dbslayer-http/"&gt;Asynchronous DB: DBSlayer &amp; HTTP&lt;/a&gt;&lt;/li&gt;   
  &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-8023233373717081647?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/8023233373717081647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/8023233373717081647'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2010_01_24_archive.html#8023233373717081647' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-1430541663980310989</id><published>2010-01-27T23:36:00.002+01:00</published><updated>2010-01-27T23:42:18.314+01:00</updated><title type='text'></title><content type='html'>&lt;h3&gt;Oracle Sun akvizice. Hotovo a potvrzeno.&lt;/h3&gt;

&lt;div&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.internetnews.com/img/2009/04/open_source_sun_oracle5.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 180px;" src="http://www.internetnews.com/img/2009/04/open_source_sun_oracle5.jpg" border="0" alt="" /&gt;&lt;/a&gt;
&lt;cite&gt;Larry Ellison&lt;/cite&gt; ve webcastu k finálnímu dokončení akvizice firmy &lt;cite&gt;Sun&lt;/cite&gt; (nyní již &lt;cite&gt;Oracle&lt;/cite&gt;) uklidnil všechny javisty. Do Javy se investovat bude viz &lt;a href="http://www.oracle.com/ocom/groups/public/documents/webcontent/038563.pdf"&gt;FAQ&lt;/a&gt;. Najdete tam i kusé informace o tom co se chystá Oracle udělat se  Solarisem, MySQL, NetBeans a dalšími produkty. Ještě dávám k dobru hlášky, které mě pobavily a zaujaly z twitterového vysílání k této události. IBM a cloud computing si to od &lt;cite&gt;Larryho&lt;/cite&gt; pěkne slíznul.&lt;/p&gt;   &lt;/div&gt;&lt;div&gt;   &lt;p&gt;&lt;cite&gt;RT @Oracle: Larry Ellison: Solaris will be the OS for a cluster of computers, not just a high end box #oraclesun&lt;/cite&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;   &lt;p&gt;&lt;cite&gt;Larry: "Best 2 databases on planet are DB2 on mainframes and Oracle on modern computers" #oraclesun&lt;/cite&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;   &lt;p&gt;&lt;cite&gt;RT @sunmicrosystems: Larry Ellison: we are going to make MySQL better #oraclesun&lt;/cite&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;   &lt;p&gt;&lt;cite&gt;RT @Oracle: Larry Ellison: Solaris will be the OS for a cluster of computers, not just a high end box #oraclesun&lt;/cite&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;   &lt;p&gt;&lt;cite&gt;RT @vandenadort: Larry: IBM doesnt have Java, they haven't got Oracle database, what they have is a problem. They're a decade behind us #oraclesun&lt;/cite&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;   &lt;p&gt;&lt;cite&gt;RT @oracletechnet: Ellison: I love Linux, but Solaris is more mature and reliable for the high end #oraclesun&lt;/cite&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;   &lt;p&gt;&lt;cite&gt;Larry Ellison: DB2 is about a decade behind when it comes to Oracle technology #oraclesun&lt;/cite&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;   &lt;p&gt;&lt;cite&gt;Ellison "Why in the world didn't IBM create a scalable dbase machine. IBM is far behind, I don't think they have a chance at all."#oraclesun&lt;/cite&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;   &lt;p&gt;&lt;cite&gt;#oraclesun: Ellison: "I can't understand why IBM has never come out with a database machine. DB2 doesn't cluster, doesn't scale, nothing."&lt;/cite&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;   &lt;p&gt;&lt;cite&gt;#OracleSun LE: won't measure Java success in terms of revenue but in terms of tech success-&gt;Sun tried this, might work for Oracle?&lt;/cite&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;   &lt;p&gt;&lt;cite&gt;Ellison: "There is no in-memory dbase that will take the place of a relational dbase." #oraclesun&lt;/cite&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;   &lt;p&gt;&lt;cite&gt;Larry - The only thing new about Cloud is the name, we've been doing it for years. Itunes, Sales Force, etc all run #Oracle #oraclesun&lt;/cite&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;   &lt;p&gt;&lt;cite&gt;RT @oracletechnet: Ellison: The only thing new about cloud computing is the word "cloud" - it's just a computer attached to the Internet #oraclesun&lt;/cite&gt;&lt;/p&gt;  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-1430541663980310989?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/1430541663980310989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/1430541663980310989'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2010_01_24_archive.html#1430541663980310989' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-6123007365039270072</id><published>2010-01-24T18:41:00.002+01:00</published><updated>2010-01-24T18:50:15.116+01:00</updated><title type='text'></title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://pirun.ku.ac.th/%7Efscinpc/public_html/image/scientist_430.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 188px; height: 182px;" src="http://pirun.ku.ac.th/%7Efscinpc/public_html/image/scientist_430.jpg" alt="" border="0" /&gt;&lt;/a&gt;

&lt;h3&gt;Nedělní rozjímání nad softwarovým vývojem&lt;/h3&gt;

&lt;p&gt;Nemálo lidí přemýšlí o různých technikách zefektivnění softwarového vývoje. Zažil jsem metodologií, která byla klasický &lt;a href="http://en.wikipedia.org/wiki/Waterfall_model"&gt;vodopád&lt;/a&gt; obohacený a milestony po šesti týdnech. Tedy na začátku se udělal sběr požadavků, jejich analýza, pak design, implementace a verifikace/testování na závěr. Každou z těchto činnosti dělal v podstatě jiný tým lidí. Sběr požadavků dělal tým funkčních architektů, analýzy techničtí architekti, design a implementaci vývojáři a verifikaci a testování oddělení kvality. Ačkoliv tento systém vývoje fungoval, mohl fungovat daleko efektivněji a lépe.&lt;/p&gt;

&lt;p&gt;Prvním problémem je více méně striktní rozčlenění odpovědností, ačkoliv by se to mohlo zdát jako logické a správné, tak je to ve své podstatě kontraproduktivní. Práce každé skupiny má totiž jasný začátek a konec, s tím, že na ní navazuje práce jiné skupiny. Bohužel to sebou šílený redundanci v podobě sdílení informací. Když osoba &lt;cite&gt;A&lt;/cite&gt; na začátku celého řetězu něco vymyslí nebo změní, je potřeba tuto informaci rozšířit přes všechny navazující skupiny a to v jakýkoliv okamžik.&lt;/p&gt;

&lt;p&gt;Aby se této redundanci v předávání informací zamezilo, vznikají dokumenty. Celé řádka dokumentů v různých revizích, které popisují co prěsně autor zamýšlel. Máme sice jedno místo, kde se udržují informace, ale lidé musí pálit čas tím, aby tyto informace sepsali a další lidé tím, aby je vstřebali.&lt;/p&gt;

&lt;p&gt;Obecně si myslím, že rozškatulkovaný vývoj na skupiny lidí prostě nefunguje kvůli sociálním problémům. Jedna skupina si něco vymyslí a další za měsíc zjistí, že to je neproveditelné. Vznikají zbytečné třenice díky tomu, že architekt požaduje Táčmahál a vývojáři jsou schopni dodat v lepším případě srub kanadského dřevorubce nebo v tom horším kůlničku na dříví.&lt;/p&gt;

&lt;p&gt;Druhý problém je v tom, že fáze analýzy je sice ukotvená na začátku celého procesu nicméně pouze pro to, aby se na jejím základě dokázaly udělat časové odhady náročnosti a proto, aby mohli další skupiny lidí pracovat. Bohužel tento přístup má poměrně zásadní nedostatek. Né vždy totiž vidíme plně pod kapotu celého řešení. Spíše naopak, vidíme pouze tu část, se kterou jsme dobře seznámeni a dopad na navazující části nám často uniká. Takže naše analýza z principu stojí na vodě. Zkuste v takovém případě udělat odhad časové náročnosti.&lt;/p&gt;

&lt;p&gt;Teď jsme si popsali, některé z nevýhod a teď jak proces zrefaktorovat, tak aby fungoval k plné spokojenosti všech zúčastněných.&lt;/p&gt;

&lt;p&gt;Prvním problém je odstranění informační bariéry a sdílení informací.&lt;/p&gt;



&lt;p&gt;Psát v případě funkčních požadavků desetistránkové pamflety je nesmysl. Nejpochopitelnější je načárat funkční specifikaci na chování uživatelského aplikace a přidat stručný popis. Pokud to nedokážete, pak je nejspíše problém v tom, že zadání je příliš složité. Příliš složité zadání na úrovni uživatelského rozhraní nejspíše neznamená, že by zadání bylo složíte. Spíše to svědčí o tom, že to co uživatel chtěl bylo špatně pochopeno. Když chce uživatel skalpel, dejte mu skalpel a nikoliv multifunkční švýcarský nožík, který obsahuje navíc šroubovák, vývrtku a pilník.&lt;/p&gt;

&lt;p&gt;Nepište analýzy pokud to není opravdu potřeba a rozhodně je nepoužívejte jako zadání práce pro někoho jiného a nebo k časovým odhadům. Důležitá rozhodnutí, která mají tendenci se v analýzách objevovat, odložte až na poslední možnou chvíli (viz &lt;a href="http://en.wikipedia.org/wiki/Lean_software_development"&gt;

Lean software development&lt;/a&gt;) kdy budete mít všechny potřebné informace.&lt;/p&gt;

&lt;blockquote cite="http://en.wikipedia.org/wiki/Lean_software_development"&gt;

&lt;p&gt;&lt;cite&gt;An agile software development approach can move the building of options earlier for customers, thus delaying certain crucial decisions until customers have realized their needs better. This also allows later adaptation to changes and the prevention of costly earlier technology-bounded decisions.&lt;/cite&gt;&lt;/p&gt;

&lt;/blockquote&gt;

&lt;p&gt;Prací softwarového vývojáře není sepisování esejí či jejích louskání. Nejefektivnější způsob výměny informací je přímá komunikace a zapojení se všech členů týmu ve všech činostech vývojového cyklu. Striktní rozdělení činností vede pouze k vytváření bariér. Vedlejším efektem je to, že se určitá část lidí specializuje pouze na určitou část řešení. Dochází potom k třenicím, že lidé co dělají uživatelské rozhraní se cítí odstrčení od jádra systému a ty co dělají jádro nemají potuchy co potřebují ti co dělají uživatelské rozhraní. Stejný kastovní systém dělá problém i při dělení na vývojáře a architekty.&lt;/p&gt;

&lt;p&gt;Možná je to anarch&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://adaptiveblue.img.s3.amazonaws.com/topics/p/cowboy_coding/small"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 208px; height: 150px;" src="http://adaptiveblue.img.s3.amazonaws.com/topics/p/cowboy_coding/small" alt="" border="0" /&gt;&lt;/a&gt;ie, možná je to &lt;a href="http://en.wikipedia.org/wiki/Cowboy_coding"&gt;cowboy coding&lt;/a&gt;, ale podle mého soudu by všichni měli dělat všechno. Tím se nejlépe sdílí týmové znalosti a nutí to k větší míře komunikace. A lidi to pochopitelně víc baví. Striktní rozdělení na architekty a vývojáře neexistuje. Zásadní rozhodnutí se přijímají společně. Funkci architekta v uvozovkách drží vývojáři, kteří jsou respektování zbytkem týmu a mají dostatečnou autoritu fungovat jako arbitr sporu typu použijeme knihovnu typy &lt;cite&gt;X&lt;/cite&gt; nebo &lt;cite&gt;Y&lt;/cite&gt;.


&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;Vsuvka:Role manažera spočívá pouze v tom, že poskytuje servisní služby zbytku týmu. Dělá zapisy meetingu, zajišťuje hardware/software, dohlíží a připomíná na termíny, zajišťuje komunikaci s dalšími tými. V podstatě slouží jako tlumič různých byrokratických omezení. Manažer nikdy neděla technologická rozhodnutí nicméně jeho názor je vítán a respektován.&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;Občas mám pocit, že se různé procesy a metodiky vývoje hodně přeceňují. Z výše uvedených řádku by mohl leckdo nabít dojmu, že jsem &lt;cite&gt;vodopád&lt;/cite&gt; zrefaktoroval například na &lt;cite&gt;Scrum&lt;/cite&gt;. Přiznám se, že nevím, agilních metodik je celá řada. Někdy je to hra se slovíčky a ve výsledku se dospěje k tomu samému. Já osobně věřím ve dvě věci při softwárovém vývoji.&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;komunikace, komunikace a zase komunikace namísto byrokracie snažící se komunikaci suplovat&lt;/li&gt;

&lt;li&gt;silné individuality jako jádro malých týmů, kde každý člen se podílí na všech činoostech&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Jestli tomu bude říkat nebo v tom hledat &lt;cite&gt;Scrum&lt;/cite&gt;, &lt;cite&gt;Iterative and incremental development&lt;/cite&gt; či &lt;cite&gt;Lean software development&lt;/cite&gt; je poměrně nezajímavé.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-6123007365039270072?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/6123007365039270072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/6123007365039270072'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2010_01_24_archive.html#6123007365039270072' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-5416652554832124796</id><published>2010-01-11T23:34:00.002+01:00</published><updated>2010-01-11T23:37:26.759+01:00</updated><title type='text'></title><content type='html'>&lt;h3&gt;Google wave revoluce? A co Ubiquity&lt;/h3&gt;

 &lt;p&gt;Dostal se mi skrye &lt;cite&gt;Twitter&lt;/cite&gt; pod palec dokument nazvaný &lt;a href="http://www1.vtrenz.net/imarkownerfiles/ownerassets/1013/Technology%20Radar%20Jan%202010.pdf"&gt;Technology Radar&lt;/a&gt;, kde &lt;cite&gt;Martin Fowler&lt;/cite&gt; a jeho kolegové z &lt;cite&gt;ThoughtWorks&lt;/cite&gt; vytvořili, aby  &lt;cite&gt;"to help decision makers understand emerging technologies and trends that affect the market today". Jednou ze zmiňovaných technologií je i &lt;a href="https://wave.google.com/"&gt;Google Wave&lt;/a&gt; jako kolaborační platforma nové generace.&lt;/cite&gt;

&lt;/p&gt;
&lt;p&gt;Ačkoliv je tato technologie/platforma v rané fázi již jsem jí otestoval a nepřipadá mi, že by do světa internetu a webového brouzdání přinesla něco po čem "každý uživatel touží". Možná je to dáno pouze nepřítulným uživatelským rozhraním anebo tím, že tuto službo moc (skoro vůbec) nepoužívám, ale dojem to na mě neudělalo. Vlastně nikdo z mých kontaktů, kterých tam mám určitě přes dvacet, na mě vlny neposílá a raději se drží starého emailu či instant messengeru.&lt;/p&gt;
&lt;p&gt;Stejně jako mi přijde &lt;cite&gt;Google Wave&lt;/cite&gt; jako krok vedle, alespoň prozatím, tak mi jako revoluce přijde koncept, který představil projekt &lt;a href="https://mozillalabs.com/ubiquity/"&gt;Ubiquity&lt;/a&gt;. Prosím pomineme fakt, že každý nástroj je určený trochu k něčemu jinému a zaměříme se na to, co přináší mé osobě. Vždy při  brouzdání webu mám nemilý pocit, že prohlížeč je jenom nedokonalý nástroj, na kterém se neudál z pohledu koncového uživatele žádný vývoj.&lt;/p&gt;

&lt;p&gt;Kolikrát se mi stalo, že se prodírám nějakým textem a narazím na slovíčko, u kterého neznam překlad a nebo význam. Kromě pracnosti při otevírání nového okna a hledání překladu eventuelně významu, mě irituje, že ztrácím kontext toho původního okna. A přesně to je místo kde nastupuje &lt;cite&gt;Ubiquity&lt;/cite&gt;. Ta umožňuje totiž vykonávat to co zamýšlím uvnitř kontextu stránky.&lt;/p&gt;
&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.sweb.cz/pichlik/archive/uploaded_images/ubiquity-734947.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 174px;" src="http://www.sweb.cz/pichlik/archive/uploaded_images/ubiquity-734943.png" alt="" border="0" /&gt;&lt;/a&gt; Chci překlad slova, tak slovo označím, zmáčknu &lt;cite&gt;ctrl + space&lt;/cite&gt; (aktivace &lt;cite&gt;Ubiquity&lt;/cite&gt;) a napíšu &lt;cite&gt;tran&lt;/cite&gt; (zkratka pro příkaz &lt;cite&gt;translate&lt;/cite&gt;). Podle jazyku stránky a jazykového nastavení (takzvaný locale) prohlížeče se slovo automaticky přeloží. Stejným způsobem postupuji i v případě významu, jenom místo příkazu &lt;cite&gt;tran&lt;/cite&gt; použiji &lt;cite&gt;wiki&lt;/cite&gt;. Vykonávání příkazů v kontextu dává brouzdání další rozměr a výrazně zefektivňuje a usnadňuje práci s webem. Pokud jste &lt;cite&gt;Ubiquity&lt;/cite&gt; nikdy neviděli, tak mu určitě věnujte pozornost. Čas, který tím strávíte, bude daleko efektivnější než v případě &lt;cite&gt;Google Wave&lt;/cite&gt;.

&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-5416652554832124796?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/5416652554832124796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/5416652554832124796'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2010_01_10_archive.html#5416652554832124796' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-8373247506105539146</id><published>2009-11-28T19:07:00.001+01:00</published><updated>2009-11-28T19:09:48.177+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'></title><content type='html'>&lt;h3&gt;Eclipse E4 - nejlepší RCP platforma&lt;/h3&gt;

&lt;p&gt;Dlouhou dobu mi ležel v "šuplíku" dokument &lt;a href="http://www.eclipse.org/e4/resources/e4-whitepaper.php"&gt;Eclipse E4&lt;/a&gt; popisující koncept, kterým ubíra další generace &lt;cite&gt;Eclipse&lt;/cite&gt;. &lt;/p&gt;

&lt;p&gt;Hodně často je slyšet, že &lt;cite&gt;Eclipse&lt;/cite&gt;,  jako IDE pro Javu, nedosahuje takové úrovně jako &lt;cite&gt;IntelliJ IDEA&lt;/cite&gt;. Můžete s tímto názorem souhlasit a nebo jej rozporovat, ale je důležité si uvědomit následující fakta. &lt;cite&gt;Eclipse&lt;/cite&gt; není primárně navržen jako IDE pro Javu, ale jako platforma pro vývoj nástrojů a aplikací.&lt;/p&gt; 


&lt;p&gt;

Pokud tedy očekáváte, že verze 4 přinese nějaký zásadní posun v oblasti vývojových nástrojů, pak budete pravděpodobně zklamání. Samozřejmě přijdou nějaké dílčí vylepšení, například podpora komplexnějšího projektového layoutu, ale revoluci nečekejte. Osobně si myslím, že to je dobře, protože Eclipse vývojáři se mohou soustředit na to co děla Eclipse Eclipsem a to je vlastní platforma. Eclipse možná není tím nejlepším IDE pro Javu, ale bez nejmenší diskuze je nejlepší platformou pro vytváření nástrojů a aplikací.&lt;/p&gt;

&lt;p&gt;Kromě vylepšeného programového modelu, který by měl umožnit lepší spolupráci pluginů, mne zaujaly poměrně zásadnější změny na poli vlastního UI. První velkou změnou je možnost popsat UI (SWT) deklarativně - pomocí XML a nebo EMF modelu. Aplikační kód nebude tedy již obsahovat definici UI což přinese několik výhod.&lt;/p&gt;

&lt;ul&gt;

 &lt;li&gt;S modelem UI bude možné manipulovat za běhu podobně jako měníme například pomocí JavaScriptu DOM HTML stránek.&lt;li&gt;

 &lt;li&gt;UI půjde nastylovat. E4 pro tyto účely nabízí rozšířené CSS (lepší selektory).&lt;/li&gt;

 &lt;li&gt;UI bude možné renderovat různými způsoby.&lt;li&gt;

&lt;/ul&gt;

&lt;p&gt;U posledního bodu bych se rád krátce zastavil. Eclipse E4 totiž již obsahuje renderer SWT komponent do Adobe Flex. Cesta do duše internetového prohlížeče je otevřena. Když uvážíme sílu tohoto frameworku pro vytváření RIA a programový model Eclipse, pak se zdá, že to je nejslibnější kombinace pro tenké klienty vůbec. Nenapadá mě moc technologií, které by mohly konkurovat a to i z .NET světa.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-8373247506105539146?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/8373247506105539146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/8373247506105539146'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2009_11_22_archive.html#8373247506105539146' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-5485781239252508924</id><published>2009-11-13T11:03:00.002+01:00</published><updated>2009-11-13T11:12:53.056+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='podcast'/><title type='text'></title><content type='html'>&lt;h3&gt;CZ Podcast #33 - reloaded&lt;/h3&gt;

&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://a3.twimg.com/profile_images/271290835/images.jpeg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 132px; height: 122px;" src="http://a3.twimg.com/profile_images/271290835/images.jpeg" border="0" alt="" /&gt;&lt;/a&gt;
Možná jste se už báli, že nás postihla ptačí, prasečí či jiná chřipka, ale my jsme opět tady (jenom &lt;cite&gt;Filemon&lt;/cite&gt; měl nějakou dětskou nemoc). Každopádně &lt;a href="http://java.cz/article/26973"&gt;další díl&lt;/a&gt; jsme věnovali novinkám kolem nás. &lt;cite&gt;Roumen&lt;/cite&gt; pohovořil o open source procesu kolem IntelliJ IDEA, já o zážitcích s .NET a &lt;cite&gt;Filemon&lt;/cite&gt; o MDA (generátorech kódu). Bavte se.

&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-5485781239252508924?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/5485781239252508924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/5485781239252508924'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2009_11_08_archive.html#5485781239252508924' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-5867716946020959897</id><published>2009-11-01T11:23:00.002+01:00</published><updated>2009-11-01T11:28:03.046+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pranice'/><title type='text'></title><content type='html'>&lt;h3&gt;Do pranice: Vhodnost ORM&lt;/h3&gt;      
&lt;p&gt;Dvakrát se mi v poslední době stalo, že jsem se snažil někoho přesvědčit o nevhodnosti použití &lt;cite&gt;Hibernate&lt;/cite&gt; a obecně ORM nástrojů pro přístup do databáze. ORM přístup má svoje výhody, ale i věci, které činí jeho použití obtížné.&lt;/p&gt;

      &lt;h4&gt;Faktory, které ovlivňují jestli je ORM vhodná volba.&lt;/h4&gt;
      &lt;ul&gt;
       &lt;li&gt;Aplikace pracuje pouze s více typy databází. V takovém případě přináší ORM neocenitelné služby v oblasti přenositelnosti. Ta nemusí být dokonalá, ale určitě převáží nad práci vynaloženou nad portací vrstvy pro přístup k datům pro N dalších typů databáze.&lt;/li&gt;
       &lt;li&gt;Aplikace potřebuje číst a zapisovat košaté objektové struktury. Zde nám ORM neušetří práci na psaní dotazů, ale ušetří nám hromadu kódu, který bude potřeba na jejich zpracování. Mám na mysli především kód, který prochází &lt;cite&gt;ResultSet&lt;/cite&gt; a staví objektový strom a naopak kód, který prochází objektový strom a staví &lt;cite&gt;PreparedStatement&lt;/cite&gt;.&lt;/li&gt;

       &lt;li&gt;Aplikace si může dovolit upravit RDBMS schéma,  aby vyhovovalo objektově-relačnímu mapování. Ačkoliv &lt;cite&gt;Hibernate&lt;/cite&gt; nabízí doslova kouzla pro namapování čehokoliv na cokoliv je lepší upravit RDBMS schéma, tak aby vyhovovalo.&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;Jednou z charakteristik ORM frameworků je jejich snadná počáteční adopce. Tyto řešení fungují velice snadno pro vzorová schémata typu: potřebuji namapovat one-to-many vztah, potřebuji získat entitu na základě jejího identifikátoru. Řekl bych, že tato vlastnost a databázová přenositelnost je pozlátko, které hodně vývojářů zláká. Bohužel je zde i temná strana síly, se kterou zahrávati neradno je a počítati musí se s ní.&lt;/p&gt;

     &lt;p&gt;Osobně bych to vyjádřil takto, pokud nemáte v týmu někoho se zkušeností s ORM, čeká vás plno nemilých překvapení. To je dané komplexností ORM a vy pravděpodobně nemáte ani tucha co je pod kapotou. První vystřízlivění nastává ve chvíli kdy si zapnete výpis SQL dotazů následované &lt;cite&gt;LazyInitializationException&lt;/cite&gt; a zakončeno magickými zápisy do databáze, které vám nedávají smysl.&lt;/p&gt;
     &lt;p&gt;To střízlivění a bolehlav je důsledkem komplexnosti, kterou ORM představuje. Takže kromě toho, že se učíte jazyk vlastního frameworku, musíte vstřebat a pochopit právě tuto komplexnost. Stejně jako máme návrhové vzory pro objektově orientovaný návrh nebo návrh enterprise systémů, tak máme i vzory pro to jak úspěšně používat ORM. A věřte mi, že máte problém pokud ty vzory neznáte.&lt;/p&gt;
      &lt;p&gt;Nerad bych, aby tenhle článek vyzněl tak, že ORM je špatné. To v žádném případě není. Jenom je dobré si uvědomit, že jako každé řešení se pro některé úkoly hodí více, pro některé méně a pro některé vůbec. Samozřejmě je na místě otázka co jiného když ne ORM. Docela dobrý kompromis mezi komplexním ORM a nízkoúrovňovým JDBC představuje framework &lt;a href="http://ibatis.apache.org/"&gt;iBatis&lt;/a&gt; (viz třeba &lt;cite&gt;Honza Novotný&lt;/cite&gt; &lt;a href="http://blog.novoj.net/2009/08/16/ibatis-30-preview-cast-prvni/"&gt;iBatis 3.0 preview – část první&lt;/a&gt;), kdy mapujete objektový graf na SQL dotazy namísto tabulek.&lt;/p&gt;

&lt;p&gt;Budu nesmírně rád pokud mi zde pod článkem vyjádřite svůj názor o vašich zkušenostech s ORM.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-5867716946020959897?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/5867716946020959897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/5867716946020959897'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2009_11_01_archive.html#5867716946020959897' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-476092344442925143</id><published>2009-10-18T23:50:00.000+02:00</published><updated>2009-10-18T23:53:47.917+02:00</updated><title type='text'></title><content type='html'>&lt;h3&gt;Testování aplikací - panelová diskuze&lt;/h3&gt;
  &lt;p&gt;Co se stane, když dáte dohromady javistu, dotnetaka, pythonistu a rubyistu a necháte je diskutovat o testování aplikací. Po pravdě řečeno jsem nevěděl co od toho čekat, ale rád jsem přijal pozvání, které mi adresoval &lt;a href="http://jirava.net/blog"&gt;Jarda Jirava&lt;/a&gt; na akci &lt;a href="http://akce.altairis.cz/Events/299.aspx"&gt;Testování aplikací - panelová diskuze&lt;/a&gt;. Spolu se mnou diskutoval ještě &lt;a href="http://twitter.com/karmiq"&gt;Karel Minařík&lt;/a&gt; (Ruby), &lt;a href="http://twitter.com/honzakral"&gt;Jan Král&lt;/a&gt; (Python), &lt;a href="http://twitter.com/borekb"&gt;Borek Bernard&lt;/a&gt; (Flex, .NET) a &lt;cite&gt;Michael Juřek&lt;/cite&gt; (.NET) za účasti osmdesáti posluchačů.&lt;/p&gt;

  &lt;p&gt;Na začátek musím předeslat, že akce byla opravdu povedená a moji spoluřečníci byli skvěle připraveni. Na internetu se objeví dokonce i audio záznam. Rád bych zde shrnul to nejzajímavější co jsem si z diskuze odnesl.&lt;/p&gt;
  
  &lt;p&gt;V případě dynamických jazyků jako Ruby nebo Python jsou testy alfou a omegou celého psaní. Testy zde zněla jako mantra takřka pro jakoukoliv softwárovou disciplínu. Test sloužil zároveň jako jeho design a měřidlo kvality kódu. Přístup Test first byl dosti často citován jako způsob pro to kde začít s kódem. Jak správně zaznělo z publika od &lt;a href="http://jetensky.net/"&gt;Pavla Jetenského&lt;/a&gt; psát aplikace postavené nad staticky typovým jazykem ještě jde, ale dělat to za použití dynamického jazyka je problém.&lt;/p&gt;  
  
  &lt;p&gt;Téma, na kterém jsme se zasekli, by vydalo určitě na samostatný článek. Jednalo se o přípravu dat pro testy. Jedna z pouček o psaní testů říká, že příprava vlastních dat pro test by neměla záviset na žádné aplikační logice. Líbilo se mi, že se nám doufám podařilo shodnout, že při psaní aplikací postavených nad databází je toto pravidlo pouze teorie a jakákoliv redundantní příprava dat postupem času dosti rychle ztrácí dech. Například kvůli tomu, že databázové schéma či aplikační omezení se stále vyvíjí a je těžké je držet konzistentní.&lt;/p&gt;

  
  &lt;p&gt;Z naší diskuze mě zaujalo ještě pár střípků&lt;/p&gt;
  &lt;ul&gt;
   &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Carbon_footprint"&gt;Carbon footprint&lt;/a&gt; - čím dřív začnete testovat na nižší úrovni abstrakce tím menší počet počítačů je potřeba (ekologický fundamentalismus dotažený k dokonalosti? ;-).&lt;/li&gt;

   &lt;li&gt;&lt;a href="http://research.microsoft.com/en-us/projects/Pex/"&gt;Pex&lt;/a&gt; - je rozšíření Visual Studia, které dokáže projít a zanalyzovat váš kód a na základě této znalosti vygenerovat odpovídající testy.&lt;/li&gt;
   &lt;li&gt;Borkova ilustrace složitosti psaní testů pro jednotlivé typy kódu. Nejjednoduší bylo povětšinou psát testy pro klasické knihovny oproti například desktopovým aplikacím. Dobrý argument na někoho kdo mi bude doporučovat jeho vlastní framework.&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-476092344442925143?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/476092344442925143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/476092344442925143'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2009_10_18_archive.html#476092344442925143' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-3099964125087268552</id><published>2009-10-10T20:15:00.003+02:00</published><updated>2009-10-10T20:23:57.775+02:00</updated><title type='text'></title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://brotherpeacemaker.files.wordpress.com/2007/08/rap-artist.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 148px; height: 147px;" src="http://brotherpeacemaker.files.wordpress.com/2007/08/rap-artist.jpg" alt="" border="0" /&gt;&lt;/a&gt;

&lt;h3&gt;Chudokrevný model, chudý příbuzný objektově orientovaného návrhu?&lt;/h3&gt;
   &lt;p&gt;Nedávno se mě jeden kolega zeptal jestli budeme mít &lt;a href="http://martinfowler.com/bliki/AnemicDomainModel.html"&gt;anemic domain model&lt;/a&gt; (chudokrevný?). Byl jsem trošku v rozpacích co tím myslí. Po krátke diskuzi jsme si vyjasnili termíny (problém jsem znal, ale termín jsem zapomněl) a já jsem prohodil, že asi budeme. Když nad tím přemýšlím, musím říci, že to byla blbost.       
   &lt;/p&gt;
   &lt;p&gt;

   Pokud si přečtete výše uvedeny článek &lt;cite&gt;Martina Fowlera&lt;/cite&gt; dostane se vám erudovaného vysvětlení co to je chudokrevný doménový model model. Pokud to dělat nechcete, pak se budete muset spokojit s mojí interpretací. Chudokrevný doménový model je takový model, kdy doménové třídy reprezentující business entity systému neobsahují žadnou logiku. Jsou to pouze "přenosky" dat se settry a gettry.
   &lt;/p&gt;
   &lt;p&gt;&lt;cite&gt;Fowler&lt;/cite&gt; dále správně upozorňuje na fakt, že chudokrevný doménový model vede k příliš těžkopádné a tlusté aplikační vrstvě. V té se mísí všechna aplikační logika namísto toho, aby ležela právě v doménovém modelu kam patří. Pokud jste v posledních pár letech dělali nějakou vícevrstvou aplikaci, pak se schválně podívejte na velikost všech tříd, které v názvu obsahují slovo &lt;cite&gt;Service&lt;/cite&gt;. Jsou to u vás největší molochy v celém projektu jako u mě?&lt;/p&gt;

   &lt;p&gt;Problém s těmito molochy je v tom, že jsou jenom velice těžce jakýmkoliv způsobem refaktorovatelné. Samozřejmě pokud pominu fakt, že z metody o pětsistech řádcích uděláme pět malých o sto řádcích. Představa nějakého objektového re-designu je skoro nemožná.&lt;/p&gt;
   &lt;p&gt;Každý chytrý J2EE tutoriál či článek nám radí jak je dobré členit náš program do vrstev. Máme tak vrstvu servisní (aplikační logiky), vrstvu prezentační a vrstvu persistence (ukládání dat). Bohužel už nikde, až na pár míst, se nedočteme jak správně by měly tyto vrstvy vypadat. Výsledkem je, že sice správně separuje kód se stejnou odpovědností (UI, persistence), ale neděláme to objektově správně. Ve smyslu, že kód který patří do doménového modelu daváme do vrstev kam vůbec nepatří.&lt;/p&gt;
   &lt;p&gt;Jenže co to je objektově správně a potřebujeme to vůbec? Dokázali jsme žít se špatným objektovým návrhem léta a naše programy fungovaly dobře. Ovšem to by neměl být důvod nesnažit se jejich strukturu zlepšit, pokud víme, že je něco špatně. Hodně jsem přemýšlel o tom jakým způsobem to udělat a přijde mi, že nejlépe to řeší &lt;a href="http://domaindrivendesign.org/"&gt;Domain Driven Design&lt;/a&gt; (zkráceně DDD).&lt;/p&gt;

   &lt;p&gt;Klíčove je, že aplikačni logika, která leží v servisné vrstvě, nebo nedej bože ve vrstvě persistence, se přesune do doménových tříd. To neznamená ovšem, že by najednou měla každá z těchto tříd vědět jakým způsobem se má uložit do databáze nebo snad ovládat transakční logiku. Doménové třídy například požadavek na uložení delegují na vrstvu persistence.&lt;/p&gt;
   &lt;p&gt;Servisní vrstva a vstva pro ukládání dat by měla zůstat co nejtenčí. V podstatě to znamená, že slouží jenom k tomu, aby došlo k správnému překladu jedné objektové reprezentace na druhou a kordinaci s infrastrukturou. Nemyslim si, že je jednoduché takto aplikace vytvářet. Největší problém je v tom, že s doménovými třídami nakládáme obvykle v kódu jinak než s třídami jiných vrstev.&lt;/p&gt;
   &lt;p&gt;Třidy z doménového modelu vytváříme povětšinou konstruktorem. V takovém případě máme problém jak do nich dostat právě třídy jiných vrstev. No ale to už je na &lt;a href="http://pichlik.sweb.cz/archive/2008_02_10_archive.html#4492014207119127029"&gt;jiný článek&lt;/a&gt;.&lt;/p&gt;

   &lt;p&gt;Na závěr dám k dobru ješte pár dobrých článků k tématu&lt;/p&gt;
   &lt;ul&gt;
    &lt;li&gt;&lt;a href="http://www.infoq.com/articles/ddd-in-practice"&gt;Domain Driven Design and Development In Practice&lt;/a&gt;&lt;/li&gt;
       
    &lt;li&gt;&lt;a href="http://www.infoq.com/interviews/domain-driven-design-eric-evans"&gt;Eric Evans on Domain Driven Design &lt;/a&gt;&lt;/li&gt;

    &lt;li&gt;&lt;a href="http://codebetter.com/blogs/david_laribee/archive/2007/09/24/domain-model-overuse.aspx"&gt;Domain Model Overuse&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=38047"&gt;Spring 2.0 vs. the Anemic Domain Model&lt;/a&gt;&lt;/li&gt;
   &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-3099964125087268552?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/3099964125087268552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/3099964125087268552'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2009_10_04_archive.html#3099964125087268552' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-1522225810880355219</id><published>2009-08-12T23:22:00.001+02:00</published><updated>2009-08-12T23:23:53.846+02:00</updated><title type='text'></title><content type='html'>&lt;h3&gt;Pálit trasírkami&lt;/h3&gt;   
   &lt;p&gt;Někdo z pravidelných čtenářů tohoto blogu by mohl následující přirovnání považovat za můj násilný pokus nalézt paralelu v umění válečném. Nicméně to o čem budu povídat není nejen z mojí hlavy, ale i termíny jsou původní.&lt;/p&gt;  
   &lt;p&gt;Volně převyprávěno z &lt;a href="http://www.artima.com/intv/tracer.html"&gt;Tracer Bullets and Prototypes&lt;/a&gt; - &lt;cite&gt;Pragmatic Programmers Andy Hunt and Dave Thomas talk with Bill Venners about the importance of getting feedback during development by firing tracer bullets and building prototypes.&lt;/cite&gt;&lt;/p&gt;  
   &lt;p&gt;Představte si, že ležíte ve tmě někde v buši a máte zasáhnout  cíl. Máte dvě možnosti. První, znáte přibližnou polohu cíle, povětrnostní podmínky,  atd. a  z těchto údajů spočítáte balistickou dráhu kulky, nastavíte mířidla, zatajíte dech a vystřelíte. Pokud jste počítali dobře,  vaše údaje se shodovaly s reálnými  a cíl se nepohnul tak možná trefíte.&lt;/p&gt; 
   &lt;p&gt;Druhou možností je použít &lt;a href="http://en.wikipedia.org/wiki/Tracer_ammunition"&gt;značkovací munici&lt;/a&gt; též zvanou trasírky. Trasírka je speciální kulka, která za sebou   po vystřelení  nechává svítící stopu. V zásobníku bývá napáskováná každá n-tá střela tohoto typu.  Při použití značkovací munice prostě vystřelíte a podle dráhy střely, kterou vidíte, zkorigujete náměr, tak aby pokud možno další střela našla cíl a nebo se mu alespoň přiblížila.&lt;/p&gt;

   &lt;p&gt;Nyní je pravá chvíle na uvedení paralely se softwárovým vývojem. Představte si, že stojíte před vývojem nového softwaru a nebo na prahu nového releasu. Někde na jeho konci je doručení finální podoby. Stejně jako při té střelbě v buši je mnohdy obtížné vědět přesnou polohu a čas od času se cíl pohne (kdo by to byl čekal). Některé požadavky dopadnou více či méně včas, některé jsou nejasné, a některé si vyložíme jinak. V takovém případě postup, kdy uděláme jeden velký odhad (předpoklad) na začátku a potom doručíme na konci (vystřelíme) kompletní řešení, často selhává.&lt;/p&gt;
   &lt;p&gt;Oproti tomu trasírky se dají do řeči softwárového vývoje převést asi následovně. Na začátku uděláme nějaký předpoklad, provedeme podle něj vývoj a po čase  to vezmeme a ukážeme zákazníkovi. On nám řekne jak blízko nebo daleko jsme od jeho představ. Uděláme korekci a v další iteraci a opět ukážeme zákazníkovi. Tak společnými silami, postupným korigováním dráhy střely, dojdeme k řešení po kterém zákazník touží.&lt;/p&gt;
   &lt;p&gt;Mě se pálení trasírkami zdá jako vhodný způsob, ačkoliv v něm vidím jedno nebezpečí. Občas se stane, především pokud nešijeme na míru jenom jednomu zákazníkovi, že to co si vymyslí jeden zákazník, se jeví jako nepoužitelné pro jiného zákazníka, protože jeho představa je diametrálně odlišná. Tím chci říci, že není úplně nejlepší, aby korekci vaší hlavně dělal zákazník bez vaší asistence, protože by to také mohlo skončit tím, že se střelíte do nohy. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-1522225810880355219?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/1522225810880355219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/1522225810880355219'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2009_08_09_archive.html#1522225810880355219' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-9087482321526660124</id><published>2009-08-02T23:16:00.000+02:00</published><updated>2009-08-02T23:18:30.000+02:00</updated><title type='text'></title><content type='html'>&lt;h3&gt;Knihovny  tříd vs. Knihovny komponent&lt;/h3&gt;

&lt;p&gt;Jako základní stavební kámen vývoje považuji volně provázané
komponenty. Problém je v tom, že Java nemá adekvátní prostředky na to,
abych mohl vůbec komponentově vyvíjet. Jako největší bolest vidím to,
že nemůžeme dosáhnout zapouzdření. To vede k tomu, že v Jave nepoužíváme
knihovny komponent, ale knihovny tříd. Knihovny tříd mají tu nevýhodu,
že nejsou jasné hranice toho, co je ještě veřejné API a to co je
implementační detail. výsledkem je Babylonské zmatení jazyků na úrovni
tříd.&lt;/p&gt;
&lt;p&gt;Komponenta je něco co má následující charakteristiku.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vícenásobné použití&lt;/li&gt;
&lt;li&gt;Není specifická pro daný kontext resp. využitelná v různých kontextech&lt;/li&gt;

&lt;li&gt;Lze jí skládat dohromady s jinými komponentami&lt;/li&gt; p
&lt;li&gt;Dodržuje zapouzdření pomocí rozhraní&lt;/li&gt;
&lt;li&gt;Jednotka nezávislého nasazení a verze&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dlouhou dobu jsem si myslel, že &lt;cite&gt;OSGi&lt;/cite&gt; bude tou správnou
cestou, ale musím říci bohužel není, alespoň ne v tento čas.

&lt;cite&gt;OSGi&lt;/cite&gt; sráží do kolen právě ono stigma toho, že jsme byli
celou tu dobu zvyklí vyrábět knihovny tříd. Pokud dnes budete chtit
udělat aplikaci postavenou na &lt;cite&gt;OSGi&lt;/cite&gt;, pak narazíte na to,
že knihovny třetích stran nejsou vůbec připraveny. A to už nemluvím o
tom, že udělat webovou aplikaci nasaditelnou jako přenositelný WAR
archív, je věc více než složitá&lt;/p&gt;
&lt;p&gt;Paradoxně nejblíže k této charakteristice mají Enteprise Java
Beanu, bohužel jejich užití sráží další nevýhody jako například příliš
restriktivní programový model. Jsem ohromě zvědavý co vypadne z &lt;a tref="http://jcp.org/en/jsr/detail?id=277"&gt;JSR
277    Java Module Systém&lt;/a&gt;. Bohužel si myslím, že alespoň ze
začátku tu bude stejný problém jako s &lt;cite&gt;OSGi&lt;/cite&gt;, tedy že na to
nebudou knihovny stavěné, nicméně alespoň zacelí mezeru po chybějícím standardu.

&lt;/p&gt;
&lt;p&gt;
Jako další, a nemalý problém, vidím to, že  pokud mám technologii
jako &lt;cite&gt;OSGi&lt;/cite&gt;, tak je to jenom jedna polovina skládačky. Tou
druhou je pro mě kooperace s Dependency Injection frameworkem, který
by měl řídit to, jakým způsobem bude vnitřně komponenta
assemblovaná. Ideální představa je taková, že komponenta má dané
rozhraní představované například Java Interfacem. Implementace je
složení několika java tříd pomocí Dependency Injection s tím, že tyto
třídy nejsou vidět mimo rozsah komponenty, to znamená, že nikdo nemůže
udělat lookup těchto tříd. To je například věc, která je prakticky i
ve Springu velice těžko realizovatelná.  &lt;/p&gt;
&lt;p&gt;Můžu říci, že mě tato chybějící podpora čistého komponentového
vývoje nejvíce omezuje v týmovém pojetí. Není například vůbec
jednoduché nalinkovat jasné rozdělení odpovědností. Můžu sice o
nějakém JARu říci, to je komponenta XYZ, ale ve chvíli, kdy si ho
někdo přidá na classpath, tak jakékoliv hranice komponenty padají a
použití je řízené tím co nabídne code completion v IDE. Díky tomu se
potom jednotlivé JARy používají jinak, než bylo zamýšleno, protože
jakékoliv hranice padají.&lt;/p&gt;
&lt;p&gt;Java má před sebou dlouhou cestu hledání optimálního řešení, o tom,
že je to potřeba není myslím sebemenšího sporu.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-9087482321526660124?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/9087482321526660124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/9087482321526660124'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2009_08_02_archive.html#9087482321526660124' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-8000769272076377526</id><published>2009-07-31T12:00:00.002+02:00</published><updated>2009-07-31T12:12:34.214+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring-framework'/><title type='text'></title><content type='html'>&lt;h3&gt;Prezentace - Java EE 6 and how their relate to Spring Framework&lt;/h3&gt;

&lt;p&gt;Jürgen Höller &lt;a href="http://www.infoq.com/presentations/Spring-and-Java-EE-6-Jurgen-Holler"&gt;presents&lt;/a&gt; some of the new features coming in Java EE 6 and how their relate to Spring Framework: Profiles, Servlet 3.0, JSR-236 Concurrency, JSF 2.0, JPA 2.0, JSR-303, JAX-RS, EJB 3.1, JSR-299. Doporučuji juknout až tak od 25. minuty záznamu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Highlights&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt; 

&lt;li&gt;Spring 3.0 bude stále ještě podporovat Java EE 1.4&lt;/li&gt;
&lt;li&gt;Java EE 5 ma zivotni cyklus 2007 - 2013 (jsme v první třetině jejího používání)&lt;/li&gt;
&lt;li&gt;Nekonzistence mezi jednotlivými JSR specifikacemi. Pravá ruka neví, co děla levá aneb kdo dříve příjde, ten dřév mele.&lt;/li&gt;
&lt;li&gt;Některé specifikace, respektive jejich části, jsou kontroverzní, například autodeployment v servlet 3.0,  automatické zámky na singleton EJB komponentách.&lt;/li&gt;
&lt;li&gt;JAX-RS standard pro REST, chybějící integrace s web frameworky, proto zvolil Spring vlastní model, ačkoliv má stále integraci s existujícími JAX-RS implementacemi (RESTEasy, Jersey)&lt;/li&gt; 

&lt;li&gt;JSR 299 (WebBeans), postupná změna zaměření specifikace. Původně zamýšlená jako pojítko JSF a EJB, nyní Dependency injection. Přesah do dalších specifikací, je možné, že se část posune do EJB  3.1.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Z meho pohledu Java EE 6 zatím vypadá jako jeden velký rozharany stroj. Tak uvidíme jestli se ho podaří vyladit.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-8000769272076377526?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/8000769272076377526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/8000769272076377526'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2009_07_26_archive.html#8000769272076377526' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-1026411894827169734</id><published>2009-06-30T16:31:00.001+02:00</published><updated>2009-06-30T16:31:20.828+02:00</updated><title type='text'>Dependency Injection Frameworky</title><content type='html'>Check out this SlideShare Presentation: &lt;div style="width:425px;text-align:left" id="__ss_1661884"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/pichlik/dependency-injection-frameworky?type=presentation" title="Dependency Injection Frameworky"&gt;Dependency Injection Frameworky&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=dependency-injection-frameworky-090630092042-phpapp01&amp;stripped_title=dependency-injection-frameworky" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=dependency-injection-frameworky-090630092042-phpapp01&amp;stripped_title=dependency-injection-frameworky" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;documents&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/pichlik"&gt;Roman Pichlik&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-1026411894827169734?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/1026411894827169734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/1026411894827169734'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2009_06_28_archive.html#1026411894827169734' title='Dependency Injection Frameworky'/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-3149926937291231110</id><published>2009-06-28T23:06:00.000+02:00</published><updated>2009-06-28T23:07:31.611+02:00</updated><title type='text'></title><content type='html'>&lt;h3&gt;Jak pěstovat portfolio znalostí&lt;/h3&gt;

&lt;p&gt;Po nějaké době jsem se opět dostal k čtení výborné knihy &lt;a href="http://www.pragprog.com/the-pragmatic-programmer"&gt;The Pragmatic Programmer: From Journeyman to Master&lt;/a&gt; od &lt;cite&gt;Andrew Hunta&lt;/cite&gt; a &lt;cite&gt;Davida Thomase&lt;/cite&gt;. Tentokrát jsem se začetl do kapitoly &lt;cite&gt;Your Knowledge portofolio&lt;/cite&gt;. Výše jmenovaní pánové tam kromě vypíchnutí faktu, že nejdůležitější vlastností jsou vaše zkušenosti a vědomosti, dávají k dobru pár rad k tomu, jak si vlastní vědomostní portfolio řídit k jeho dalšímu rozšíření. Metoda k tomu zvolená je podobná k finančním investicím.&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;cite&gt;seriozní investoři investují pravidelně, je to jejich zvyk.&lt;/cite&gt;&lt;/li&gt;
 &lt;li&gt;&lt;cite&gt;diverzifikace (různorodost) investic je klíčové pro dlouhodobý úspěch&lt;/cite&gt;&lt;/li&gt;
 &lt;li&gt;&lt;cite&gt;chytří investoři rozprostřou své investice přes ty konzervativní až po ty rizikové&lt;/cite&gt;&lt;/li&gt;

 &lt;li&gt;&lt;cite&gt;investoři se snaží levně koupit a prodat za maximální hodnotu&lt;/cite&gt;&lt;/li&gt;
 &lt;li&gt;&lt;cite&gt;portfolio je potřeba čas od času zrevidovat a přeskupit&lt;/cite&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ke každé z těchto rad je vždy uvedeno jak jí uplatnit v praxi vývojáře. Nechci už moc opisovat, takže se podělím o ty, které nejsou moc obvyklé, ale víceméně jsem si je ověřil vlastní praxí.&lt;/p&gt;

&lt;h4&gt;Alespoň jednou za rok nový jazyk nebo technologii&lt;/h4&gt;
&lt;p&gt;Když jste vývojáři v Jave, naučte a nebo prozkoumejte alespoň jednou za rok nový jazyk nebo technologii. Vůbec nevadí, že tuto technologii nepoužijete na aktuálním projektu. Třeba tam narazíte na zajímavé přístupy, které by vás normálně minuly. Vzpomínám si, jak se mi na prezentaci o &lt;cite&gt;Grails&lt;/cite&gt; líbil  Meta Object Programming a dynamické rozšiřování persistentní vrstvy. Říkal jsem si, jaká je to škoda, že to nejde v Jave, abych při bližším zkoumání zjistil, že to nakonec lze pomocí AOP.&lt;/p&gt;
&lt;h4&gt;Čtěte nepočítačové knihy&lt;/h4&gt;

&lt;p&gt;Hodně často se zapomíná, že víc čas než strávíte komunikací s počítačem strávíte na různých poradách a nebo komunikací se spolupracovníky. Takže není na škodu odložit &lt;cite&gt;Blocha&lt;/cite&gt; a jeho &lt;cite&gt;Efektivní Javu&lt;/cite&gt;  a šáhnout třeba po &lt;cite&gt;Fareed Zakariovi&lt;/cite&gt; a jeho dílku o střetu civilizací. Samozřejmě číst se dá ledascos a inspirace je všude kolem, antikou počínaje a životopisem &lt;cite&gt;Lance Armstronga&lt;/cite&gt; konče. Nedávno jsem našel úžasné paralely mezi softwarovými projektu a příklady úspěšně provedených speciálních operací jako Mussoliniho únos &lt;a href="http://tn.nova.cz/magazin/historie/kalendarium/seznamte-se-akcni-hrdina-otto-skorzeny.html"&gt;Otto Skorzenym&lt;/a&gt;, přepadení táboru &lt;a href="http://en.wikipedia.org/wiki/Operation_Ivory_Coast"&gt;Son Tay&lt;/a&gt; či &lt;a href="http://en.wikipedia.org/wiki/Operation_Entebbe"&gt;osvobození růkojmých na letišti v Entebe v Ugandě&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;Neučte se jenom technologie v technologické špičce&lt;/h4&gt;
&lt;p&gt;Když se dnes budete učit &lt;cite&gt;Spring framework&lt;/cite&gt;, tak je to jako přijít s křížkem po funuse. To je technologie, která už je tu minimálně pět let a pokud jste nezaspali dobu, tak už jí musíte znát. Je potřeba hledat technologie, jazyky či postupy, které na svoje masivní použití teprve čekají. Samozřejmě pořád je zde možnost, že vsadíte na koně, kterého čeká jenom &lt;cite&gt;patnáct minut slávy&lt;/cite&gt;, ale to vůbec nevadí. Kromě toho, že získáte zkušenosti, tak jednou trefíte do černého a získáte náskok.&lt;/p&gt;
&lt;h4&gt;Zkoušejte opak toho co používáte&lt;/h4&gt;

&lt;p&gt;Nejhorší věc, která se vám může stát je, že ustrnete. Proto je důležité hledat opak toho, co máte. Používáte celý život Windows, nainstalujte Linux. Děláte architekta, kódujte pro radost v nějakém open source projektu. Máte celý život brunety, zkuste blondýnu ;-).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-3149926937291231110?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/3149926937291231110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/3149926937291231110'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2009_06_28_archive.html#3149926937291231110' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-4404762212621402119</id><published>2009-06-19T11:24:00.000+02:00</published><updated>2009-06-19T11:26:00.848+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='podcast'/><title type='text'></title><content type='html'>&lt;h3&gt;Podcast 32# Google Wave&lt;/h3&gt;
&lt;p&gt;Tramtadadá &lt;a href="http://java.cz/article/podcast-google-wave-html5"&gt;podcast numero třicetdva&lt;/a&gt; je mezi námi. Podařilo se nám ulovit hosta více než zajímavého a to šefredaktora magazínu &lt;a href="http://zdrojak.root.cz/"&gt;Zdroják&lt;/a&gt; &lt;cite&gt;Martina Hassmana&lt;/cite&gt;. Během povídání jsme se kromě &lt;cite&gt;Google Wave&lt;/cite&gt; a &lt;cite&gt;HTML 5&lt;/cite&gt; zeptali i na další zajímavé věci z oblasti &lt;cite&gt;Rich internet Application&lt;/cite&gt;. Vaše ohlasy jsou vítany na adrese &lt;cite&gt;czpodcast zavinac gmail.com&lt;/cite&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-4404762212621402119?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/4404762212621402119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/4404762212621402119'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2009_06_14_archive.html#4404762212621402119' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-765749527084004026</id><published>2009-06-11T10:00:00.001+02:00</published><updated>2009-06-11T10:04:14.872+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='podcast'/><title type='text'></title><content type='html'>&lt;h3&gt;CZ Podcast 31 - JavaOne&lt;/h3&gt;

&lt;p&gt;Po delší odmlce jsme tu zpět a v plné síle, tentorkát s &lt;a href="http://java.cz/article/cz-podcast-31-javaone"&gt;novinkami z JavaOne&lt;/a&gt;. Součástí tohoto balení je i soutěž o licence vývojového prostředí IntelliJ IDEA. Vaše odpovědi jsou očekávané na adrese czpodcast@gmail.com.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-765749527084004026?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/765749527084004026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/765749527084004026'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2009_06_07_archive.html#765749527084004026' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-8071346605696544178</id><published>2009-05-22T09:39:00.001+02:00</published><updated>2009-05-22T09:41:25.790+02:00</updated><title type='text'></title><content type='html'>&lt;h3&gt;Proč by se vývojář neměl bát červeného světla&lt;/h3&gt;

 &lt;p&gt;Setkávám se s názorem, že vývojář by měl před každým commitem pustit při nejmenším build celého projektu a všechny testy. To je přístup, který neodpovídá je v rozporu s kontinuální integrací. Proč děláme kontinuální integraci, je to proto, abychom neustále viděli zelené světlo a nebo proto, aby jsme zavčasu zjistili, že máme problém? Občas se mi zdá, že je to jenom kvůli tomu zelenému světlu a to na úkor efektivního využití zdrojů ať již lidských či technických.&lt;/p&gt;

 &lt;p&gt;Každý projekt, kterého jsem se účastnil, přerostl v určitou dobu kritickou mez, kdy přístup spustím build a testy před commitem prostě neškáloval. Kompletní build našeho &lt;cite&gt;HP SOA Systinet&lt;/cite&gt; trvá na mém počítači přes dvacet minut a to se vůbec nebavím o spuštění testů. Kdyby každý vývojář toto dělal na svém počítači, tak se z toho buďto ukouše nudou a nebo nic nestihne, protože bude čekat, až mu doběhne build.&lt;/p&gt;

 &lt;p&gt;Je proto efektivnější udělat commit, který může potenciálně rozbít build. Efektivnější je to protože většina commitu ten build prostě nerozbije. Většina vývojářů totiž dělá změny lokálního charakteru, a nejčastější problémy, které těmito zásahy mohou vzniknout, odhalí IDE. Čili zůstane relativně malé množství problémů a kvůli nim se nevyplatí  pouštět celý ten kafemlejnek lokálně.&lt;/p&gt;

 &lt;p&gt;Servery kontinuální integrace bývají zpravidla mnohem výkonnější něž lokální vývojářské stanice a navíc mohou dělat celou řadu optimalizací. Distribuovat build, udělat analýzu závislosti  a vybuildovat jenom to co se změnilo, použít lokalní cache, buildovat dávkově a  podobně. Čili věci, o kterých si vývojář se svými omezenými zdroji může jenom nechat zdát.&lt;/p&gt;

 &lt;p&gt;Rozsvícené červené světlo neznamená žádnou tragédii! Pokud tuhle hru přijmete je potřeba ji hrát s jedním pravidlem. Do rozbitého stavu by se neměly nehromadit další commity. To můžete zajistit automatickým zamknutím version control systému v případě zboření. Povoleny jsou jenom commity, které to opravují. Rozpoznávat je lze rovněž automaticky, vývojář to o nich prozradí v commit message podle předefinované šablony. Pak nehrozí situace, že vývojář rozbije build, pak ho přejede tramvaj, a už to nikdo neopraví, protože bude zamčený version control systém.&lt;/p&gt;

 &lt;p&gt;Samozřejmě existují i méně invazivní metody. Při použití distribuovaného verzovacího systému lze mít hierarchii repozitoří. Pak je možné dosáhnout toho, že se commit automaticky posouvá v hierarchii repozitoří od té týmové až po tu projektovou v závislosti, jestli se povedlo na dané úrovni vybuilldovat. Ve výsledku tak nedochází k zamykání version control systému.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-8071346605696544178?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/8071346605696544178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/8071346605696544178'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2009_05_17_archive.html#8071346605696544178' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-724508051645031652</id><published>2009-05-11T09:07:00.002+02:00</published><updated>2009-05-11T09:13:01.626+02:00</updated><title type='text'></title><content type='html'>&lt;h3&gt;Kontroverze kolem Dependency Injection aneb když dva dělají totéž není to totéž&lt;/h3&gt;

&lt;p&gt;Minulý týden udělali &lt;cite&gt;SpringSource&lt;/cite&gt; a &lt;cite&gt;Google&lt;/cite&gt; (respektive vývojáři &lt;cite&gt;Guice&lt;/cite&gt; framewrku) společné &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=54499"&gt;oznámení&lt;/a&gt;, ve kterém představili návrh anotací určených k řízení &lt;cite&gt;Dependency Injection&lt;/cite&gt; (dále DI). Zajímavost této události je v tom, že v prostředí &lt;cite&gt;Java EE&lt;/cite&gt; již existuje poměrně pokročilá, né-li hotová, specifikace pod JSR 299 dříve nazývaná &lt;cite&gt;Web Beans&lt;/cite&gt;. Nepodezírám lidi ze &lt;cite&gt;SpringSource&lt;/cite&gt; či &lt;cite&gt;Google&lt;/cite&gt;, že neví o tom, že &lt;cite&gt;Web Beans&lt;/cite&gt; řeší skoro totéž. Jenže stará pravda je v tom, že když dva dělají totéž, není to totéž.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://in.relation.to/Bloggers/CommentsOnAnnotationsForDependencyInjection"&gt;Reakce&lt;/a&gt; link &lt;cite&gt;Gavina Kinga&lt;/cite&gt;, jakožto lídra specifikace JSR-299, na sebe nenechala dlouho čekat. Návrhu zmíněné dvojice vyčítá to, že je příliš povrchní a neřeší plno aspektu, které jsou s DI spojeny, například řízení v závislosti na deploymentu, a má pravdu. Otázkou zde je, jestli existuje takový zájem, který by &lt;cite&gt;SpringSource&lt;/cite&gt; a &lt;cite&gt;Guice&lt;/cite&gt;, aby se pouštěli do tvorby takové specifikace. Poslední poměrně skeptická &lt;a href="http://blog.novoj.net/2009/04/28/spring-one-den-druhy/"&gt;vyjádření lidi&lt;/a&gt; ze &lt;cite&gt;SpringSource&lt;/cite&gt; na adresu Java EE 6 a profilů, které se objevily na konferenci &lt;cite&gt;SpringOne&lt;/cite&gt;, naznačují, že žádný takový zájem neexistuje.&lt;/p&gt;

&lt;p&gt;Většina věcí, o kterých &lt;cite&gt;Gavin King&lt;/cite&gt; píše, je minimálně Spring frameworkem nabízena out of box. Možná mají lidé kolem &lt;cite&gt;Roda Johnsona&lt;/cite&gt; jenom pocit, že to s JSR-299 dopadne jako s jinými poměrně ambiciozními specifikacemi v Java EE. Problém této specifikace je možná v tom, že nebyla od začátku psána jako striktně DI orientovaná specifikace, tedy její přenositelnost do prostředí standardní Javy je velice omezená. Takže to dopadne jako experiment na vývojářích použitelný ve třetí verzi, ačkoliv mě osobně ta specifikace nepřijde vůbec špatná. Další možností je, že JSR-299 nebude nakonec součástí Java EE prověřit, což mohou zase vědět lide ze &lt;cite&gt;SpringSource&lt;/cite&gt;.&lt;/p&gt;

&lt;p&gt;Ať je ten důvod jakýkoliv, je nesporným faktem, že to vrhá špatné světlo na celý specifikační proces Javy. A opět, s jeho kritikou nikdy &lt;cite&gt;Rod Johnson&lt;/cite&gt; &amp;amp; spol. nikdy nešetřili. Ve výsledku to pak vypadá, že si všichni sledují jenom vlastní zájmy, a na nějakém širší shodě vlastně nikomu nezáleží.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-724508051645031652?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/724508051645031652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/724508051645031652'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2009_05_10_archive.html#724508051645031652' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-7007948005986065418</id><published>2009-04-22T09:35:00.001+02:00</published><updated>2009-04-22T09:37:37.218+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pranice'/><title type='text'></title><content type='html'>&lt;h3&gt;Do pranice: malé samopopisující versus velké okomentované&lt;/h3&gt;

&lt;p&gt;Během code review jsem se začetl do knihy &lt;a href="http://books.google.cz/books?id=1MsETFPD3I0C&amp;printsec=frontcover&amp;dq=refactoring+martin+fowler&amp;ei=SbzuSc7XOpbozASYt5HMAg"&gt;Refactoring&lt;/a&gt; od &lt;cite&gt;Martina Fowlera&lt;/cite&gt; a musím říci, že jeho styl programování se mi velice líbí. Jde o přístup k tomu jaký volí zápis metod a využívání &lt;a href="http://books.google.cz/books?id=1MsETFPD3I0C&amp;printsec=frontcover&amp;dq=refactoring+martin+fowler&amp;ei=SbzuSc7XOpbozASYt5HMAg#PPA110,M1"&gt;extract method&lt;/a&gt;. Obvykle co vidím nejen sám u sebe je přístup delší metody s vloženými komentáři (pokuď vůbec) co daná část metody dělá.&lt;/p&gt;

&lt;div align="left" class="java"&gt;
&lt;table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff"&gt;
   &lt;tr&gt;
  &lt;!-- start source code --&gt;
   &lt;td nowrap="nowrap" valign="top" align="left"&gt;
    &lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Configuration&amp;nbsp;getConfiguration&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;load&amp;nbsp;the&amp;nbsp;driver&amp;nbsp;(supplied&amp;nbsp;to&amp;nbsp;installer)&amp;nbsp;using&amp;nbsp;custom&amp;nbsp;classloader&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;try&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;if&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;driverClass&amp;nbsp;!=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;loadDriver&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;driverClass,&amp;nbsp;dbDrivers&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;catch&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;ClassNotFoundException&amp;nbsp;e&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;throw&amp;nbsp;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;ConfigurationException&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;e&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;configure&amp;nbsp;datasource&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;BasicDataSource&amp;nbsp;dataSource&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;BasicDataSource&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;Do&amp;nbsp;not&amp;nbsp;set&amp;nbsp;the&amp;nbsp;class&amp;nbsp;name,&amp;nbsp;becuase&amp;nbsp;the&amp;nbsp;datasource&amp;nbsp;calls&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;Class.forName&amp;nbsp;only&amp;nbsp;in&amp;nbsp;the&amp;nbsp;systemclassloader&amp;nbsp;where&amp;nbsp;the&amp;nbsp;driver&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;is&amp;nbsp;not&amp;nbsp;present.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;dataSource.setDriverClassName(driverClass);&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;dataSource.setUrl&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;connectionURL&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;dataSource.setUsername&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;userName&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;dataSource.setPassword&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;password&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;dataSource.setInitialSize&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#990000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;dataSource.setMaxActive&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#990000"&gt;15&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;dataSource.setDefaultAutoCommit&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;true&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;create&amp;nbsp;configuration&amp;nbsp;instance&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Factory&amp;nbsp;scopes&amp;nbsp;=&amp;nbsp;ScopeFactory.getInstance&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Configuration&amp;nbsp;cfg&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Configuration&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;scopes&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;cfg.setDataSource&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;dataSource&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;cfg;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;
    
   &lt;/td&gt;
  &lt;!-- end source code --&gt;
   &lt;/tr&gt;
  &lt;!-- start Java2Html link --&gt;

   &lt;tr&gt;
    &lt;td align="right"&gt;
&lt;small&gt;
&lt;a href="http://www.java2html.de" target="_blank"&gt;Java2html&lt;/a&gt;
&lt;/small&gt;
    &lt;/td&gt;

   &lt;/tr&gt;
  &lt;!-- end Java2Html link --&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;Podle Fowlerova receptu by mohl kód po refaktoru vypadat následovně.&lt;/p&gt;
&lt;div align="left" class="java"&gt;
&lt;table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff"&gt;

   &lt;tr&gt;
  &lt;!-- start source code --&gt;
   &lt;td nowrap="nowrap" valign="top" align="left"&gt;
    &lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Configuration&amp;nbsp;getConfiguration&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;loadDriverInCustomClassloader&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;BasicDataSource&amp;nbsp;dataSource&amp;nbsp;=&amp;nbsp;configureDataSource&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;createConfigurationInstance&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;dataSource&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;protected&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;void&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;loadDriverInCustomClassloader&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;try&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;if&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;driverClass&amp;nbsp;!=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;loadDriver&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;driverClass,&amp;nbsp;dbDrivers&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;catch&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;ClassNotFoundException&amp;nbsp;e&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;throw&amp;nbsp;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;ConfigurationException&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;e&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#7f0055"&gt;&lt;b&gt;protected&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;BasicDataSource&amp;nbsp;configureDataSource&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;BasicDataSource&amp;nbsp;dataSource&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;BasicDataSource&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;Do&amp;nbsp;not&amp;nbsp;set&amp;nbsp;the&amp;nbsp;class&amp;nbsp;name,&amp;nbsp;becuase&amp;nbsp;the&amp;nbsp;datasource&amp;nbsp;calls&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;Class.forName&amp;nbsp;only&amp;nbsp;in&amp;nbsp;the&amp;nbsp;systemclassloader&amp;nbsp;where&amp;nbsp;the&amp;nbsp;driver&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;is&amp;nbsp;not&amp;nbsp;present.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;dataSource.setDriverClassName(driverClass);&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;dataSource.setUrl&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;connectionURL&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;dataSource.setUsername&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;userName&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;dataSource.setPassword&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;password&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;dataSource.setInitialSize&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#990000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;dataSource.setMaxActive&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#990000"&gt;15&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;dataSource.setDefaultAutoCommit&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;true&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;protected&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Configuration&amp;nbsp;createConfigurationInstance&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;BasicDataSource&amp;nbsp;dataSource&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Factory&amp;nbsp;scopes&amp;nbsp;=&amp;nbsp;ScopeFactory.getInstance&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Configuration&amp;nbsp;cfg&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Configuration&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;scopes&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;cfg.setDataSource&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;dataSource&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;cfg;&lt;/font&gt;&lt;br /&gt;

&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;
    
   &lt;/td&gt;
  &lt;!-- end source code --&gt;
   &lt;/tr&gt;
  &lt;!-- start Java2Html link --&gt;

   &lt;tr&gt;
    &lt;td align="right"&gt;
&lt;small&gt;
&lt;a href="http://www.java2html.de" target="_blank"&gt;Java2html&lt;/a&gt;
&lt;/small&gt;
    &lt;/td&gt;

   &lt;/tr&gt;
  &lt;!-- end Java2Html link --&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;&lt;cite&gt;Fowler&lt;/cite&gt; uvádí tři základní důvody pro tento přístup.&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;lepší znovupoužitelnost metod uvnitř třídy pokud jsou jemnější&lt;/li&gt;
 &lt;li&gt;snazší překrytí v potomkovi&lt;/li&gt;
 &lt;li&gt;lepší čitelnost, větší metody se čtou jako série komentářů&lt;/li&gt;

&lt;/ul&gt;
&lt;p&gt;Mě osobně přijde jako nejrelevantnější poslední bod, tedy čitelnost vlastního kódu. Na příkladu, který jsem uvedl, to ještě možná tak nevypadá, ale pokud se  metody táhnou jak špagety, tak mi to přijde jako ideální přístup pro zlepšení čitelnosti a tím pádem kvality kódu.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-7007948005986065418?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/7007948005986065418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/7007948005986065418'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2009_04_19_archive.html#7007948005986065418' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-5201831749934238119</id><published>2009-04-14T09:43:00.001+02:00</published><updated>2009-04-14T09:45:30.670+02:00</updated><title type='text'></title><content type='html'>&lt;h3&gt;Google Application Engine, konec Java hostingu?&lt;/h3&gt;

&lt;p&gt;Minulý týden &lt;a href="http://googleappengine.blogspot.com/2009/04/seriously-this-time-new-language-on-app.html"&gt;oznámila&lt;/a&gt; firma Google podporu Javy pro jejich platfotmu &lt;a href="http://appengine.google.com/"&gt;Google Application Engine&lt;/a&gt;. Byla to zpráva poměrně překvapivá, protože dlouhou dobu vše nasvědčovalo tomu, že Google zvolí jiný jazyk kvůli všeobecně známé &lt;a href="http://pichlik.sweb.cz/archive/2006_11_26_archive.html#116449750869091495"&gt;problematičnosti s hostováním Javy&lt;/a&gt;. Alespoň takové byly náznaky nebo alespoň jejich interpretace uvnitř Java komunity, které Google nikdy nijak nekomentoval. Možná to bylo nakonec dobře, protože tím na sebe Google nevytvářel zbytečný tlak spojený s veřejným oznámením připravované podpory. Pod pokličkou se pilně pracovalo na řešení, které umožňuje běh webových aplikací postavených nad Javou.&lt;/p&gt;

&lt;p&gt;V této souvislosti není na škodu zamyslet se nad tím, proč byla nakonec zvolena Java. Bylo to zřejmě pragmatické rozhodnutí učiněné na základě faktu, že podpora Java znamená fungující Java Virtual Machine (JVM), která je schopna sama o sobě hostovat kromě vlastního jazyku Java i další jazyky jako například Ruby či Groovy. To určitě hrálo Jave do karet.&lt;/p&gt;

&lt;p&gt;Z technického hlediska Google App Enginu stojí za zmínku jakým způsobem si Google poradil s úskalími, které Java pro hosting přináší. Kromě věcí, které není zas až tak složité ohlídat jako například vytváření nových vláken či ukončení běhu JVM, je zajímavý například limit pro maximální doba odpovědi na požadavek, která je 30s. Pokud aplikace v požadovaném limitu nevrátí odpověď, má uživatel smůlu. Z pohledu škálovatelnosti klade Google App Engine důraz na to, aby se stav pokud možno nedržel v session na úrovni HTTP protokolu. Zapomeňte na sticky session, protože každý požadavek může směřovat na úplně odlišný server.&lt;/p&gt;

&lt;p&gt;Hned pár hodin po ohlášení podpory Javy se začalo spekulovat, jestli to bude znamenat konec konkurenčních hostingů. Myslím si, že nikoliv a ty důvody jsou čistě technického charakteru. Možnosti škálovatelnosti aplikace postavené nad Google App Engine jsou sice takřka neomezené, ale daň je krvavě placené kompromisy na implementační úrovni. Pokud vezmeme jakoukoliv klasickou webovou Java aplikaci, tak při jejím přenesení pravděpodobně spláčeme nad výdělkem. Kromě masivního využívání session pro udržení stavu konverzace bude tím nejzásadnějším problémem relační databáze.&lt;/p&gt;

&lt;p&gt;Dvacet let jsme stavěli naše aplikace nad relačními databázemi, ale Google App Engine nic takového nenabízí. Místo toho slouží pro uložení dat BigTable, která s pomocí Map/Reduce frameworku nabízí neskutečné možnosti v oblasti škálovatelnosti na úrovni zpracování dat ale... Přestože Google App Engine nabízí vyšší úroveň abstrakce nad BigTable v podobě ochuzené implementace JPA či JDO, jedná se poměrně o fundamentální posun ve vnímání toho jak jsou data uložena a jak s nimi pracovat. Nejedná se nejen o posun ve vnímaní, ale i ryze praktické důvody jako jsou nástroje a postupy, které byly dlouhodobě používány.&lt;/p&gt;

&lt;p&gt;Z výše uvedeného je patrné, že Google App Engine nebude rozhodně vhodný pro všechny typy webových aplikací. Pokud není hlavním kritériem aplikace škálovatelnost, pak Google App Engine nabízí sice zajímavé možnosti, ale vykoupené zásadními kompromisy při návrhu a vlastní implementaci, kdy tím nejzásadnějším je právě uložení a práce s daty. To bude hlavní příčina,že se nedá očekávat nějaký masivní přesun aplikací na Google App Engine. V poslední době se díky masivnímu rozvoji virtualizace objevilo několik zajímavých obláčku, např. &lt;a href="http://stax.net/"&gt;Stax&lt;/a&gt; , kde je Java platforma nabízená jako služba. V takovém řešení dostanete  k dispozici Tomcat, MySQL a platíte přenesená data a procesorový čas a nebudete tak nuceni dělat nějaké zásadní kompromisy v místech, kde to vaše aplikace zřejmě nepotřebuje.&lt;/p&gt;
&lt;h4&gt;Zdroje&lt;/h4&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;cite&gt;InfoQ&lt;/cite&gt; &lt;a href="http://www.infoq.com/news/2009/04/gae"&gt;Google Brings App Engine's Pros and Cons to Java &lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;cite&gt;JavaLobby&lt;/cite&gt; &lt;a href="http://java.dzone.com/news/java-google-app-engine-time"&gt;Java on Google App Engine - Time To Play In The Cloud&lt;/a&gt;&lt;/li&gt;

 &lt;li&gt;&lt;cite&gt;JavaLobby&lt;/cite&gt; &lt;a href="http://java.dzone.com/articles/java-google-app-engine"&gt;Java on Google App Engine&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-5201831749934238119?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/5201831749934238119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/5201831749934238119'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2009_04_12_archive.html#5201831749934238119' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-6892829300532401532</id><published>2009-04-08T00:15:00.002+02:00</published><updated>2009-04-08T00:15:49.229+02:00</updated><title type='text'></title><content type='html'>&lt;h3&gt;Micro-blogging jako nástroj pro zlepšení týmové komunikace&lt;/h3&gt;

    &lt;p&gt;Některé myšlenky začínají opravdu kouzelně. Včera za mnou přišel jeden z kolegů pozeptat se, jestli náhodou nemám nabíječku na jeho typ mobilního telefonu.  Při té příležitosti utrousil otázku, co si jako zasloužilý bloger, myslím o využití formátu &lt;a href="http://en.wikipedia.org/wiki/Micro-blogging"&gt;micro-blogging&lt;/a&gt; pro zlepšení komunikace mezi týmy. Nejdřív jsem nechápal na co se mě pta, ale pak mi vysvětlil, že micro-blogging je například &lt;cite&gt;Twitter&lt;/cite&gt;, který právě vidí na displeji mého notebooku.&lt;/p&gt;
    &lt;p&gt;Pokud o &lt;cite&gt;Twitteru&lt;/cite&gt; nic nevíte, doporučuji &lt;a href="http://hrouda.blogspot.com/2009/01/jet-jednou-co-je-to-twitter-1-dl.html"&gt;seriál&lt;/a&gt;, z kterého jsem si dovolil použít následující popis:&lt;/p&gt;

    &lt;blockquote cite="http://hrouda.blogspot.com/2009/01/jet-jednou-co-je-to-twitter-1-dl.html"&gt;
     &lt;p&gt;
      &lt;cite&gt;Twitter je instant messaging (nástroj pro výměnu okamžitých sdělení) dostupný z webové stránky. Na Twitteru můžete publikovat svoje příspěvky (takzvané Tweety) o délce maximálně 140 znaků. Když na Twitteru někoho následujete (following), můžete číst jeho příspěvky, sdělení. Když oni (followers) následují vás, mohou číst vaše příspěvky.&lt;/cite&gt;
     &lt;/p&gt;  
    &lt;/blockquote&gt;
    &lt;p&gt;Pokud pracujete ve větším týmu, třeba jako já, je občas problém udělat nějaké krátké sdělení a o něco zajímavého se podělit s vašimi kolegy. Můžete najít užitečný nástroj, zajímavý článek, chystáte se udělat nějaký větší zásah a nejste si jistí jeho vedlejšími efekty, či něco podobného. V takovém případě máte dilema, můžete to poslat na společný mail, ale zase to muže být informace, která nezajímá všechny. Jinými slovy, ředitele našeho centra asi nebude zajímat, že vyšla nová verze Mavenu. Vytvářet kvůli tomu příspěvek do blogu je zase moc pracné a navíc to většinou  předávaná informace nemá hlubší charakter.&lt;/p&gt;

    &lt;p&gt;Micro-blogging je právě úžasným kompromisem mezi mailem a regulérním příspěvkem pro blog, někde jsem viděl přirovnání SMS přes internet. Zprávu vidí všichni kdo vás následují a vy tak neotravujete další spoustu lidí, které pravděpodobně o vaše komentáře nemají zájem.&lt;/p&gt;
    &lt;p&gt;V našem případě by se systém alá &lt;cite&gt;Twitter&lt;/cite&gt; dal integrovat s vývojářskými nástroji. Občas se stane, že rozbijete build. V takovém případě je na build serveru vidět kdo to rozbil, ale už není vidět, jestli na tom ten člověk pracuje. Ta informace jestli na tom člověk pracuje, či jestli vůbec ví o tom co způsobil, by se dala integrovat právě přes systém alá &lt;cite&gt;Twitter&lt;/cite&gt;. U rozbitého buildu by bylo tlačítko, které by po kliknutí vytvořilo automaticky tweet. Na build serveru by se zase naopak reverzně k zbořeným buildum asociaovaly tweety.&lt;/p&gt;

    &lt;p&gt;Já osobně jsem myšlence zapojení micro-bloggingu jako součásti mezi týmové komunikace velice nakloněn. Stejně jako na &lt;cite&gt;Twitteru&lt;/cite&gt; se při použití za zavřenými dveřmi uvnitř firmy najdou hvězdy, které bude sledovat většina a také pasivní uživatelé, které nebude sledovat skoro nikdo. Díky tomu bude zaručena přirozená rovnováha mezi tím, že podstatné informace od lidí, co mají co říci, proudí ke všem a ty méně podstatné míří pouze k několika málo zainteresovaným.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-6892829300532401532?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/6892829300532401532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/6892829300532401532'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2009_04_05_archive.html#6892829300532401532' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-4267280591040002421</id><published>2009-04-05T21:10:00.002+02:00</published><updated>2009-04-05T21:23:53.702+02:00</updated><title type='text'></title><content type='html'>&lt;h3&gt;Tranzitivní závislosti v Mavenu z pohledu návrhu modulu&lt;/h3&gt;

&lt;p&gt;Tranzitivní závislosti v Mavenu neodpouštějí chyby v návrhu struktury modulů. Pojďme se podívat na to s čím je potřeba počítat. Mějme modul &lt;cite&gt;Foo&lt;/cite&gt;. Tento modul je použit jednak v kontextu serveru, jako součást webové aplikace, a jednak v lokálním kontextu jako součást command line nástroje. Modul &lt;cite&gt;Foo&lt;/cite&gt; má pro svojí řadu několik závislostí. Řekněme jednu společnou pro obě prostředí a potom dvě rozdílné množiny, každou pro jedno prostředí, jak je znázorněno na následujícím obrázku.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://sweb.cz/pichlik/spot-res/dependence.png" /&gt;&lt;/p&gt;

&lt;p&gt;Mechanismus tranzitivních závislostí v Mavenu způsobí, že pokud modul &lt;cite&gt;Foo&lt;/cite&gt; přidáme do WARu, dostanou se nám tam všechny závislosti a to včetně těch lokálních (žluté krabičky). A naopak, pokud si necháme vygenerovat například classpath pro lokální použití, dostanou se nám tam závislosti nutné pouze pro prostředí serveru. V případě, že by šlo pouze o malé množství závislostí, asi by to nevadilo, ale v případě, že se jedná o větší množství, musíme se tím začít zaobírat.&lt;/p&gt;
&lt;p&gt;První a nejlepší způsob je udělat refaktor modulu &lt;cite&gt;Foo&lt;/cite&gt; a ten rozdělit na tři části. Na modul obsahující logiku pro server &lt;cite&gt;Foo server&lt;/cite&gt;, modul obsahující logiky pro lokální použití &lt;cite&gt;Foo local&lt;/cite&gt; a modul obsahující logiku společnou pro obě části &lt;cite&gt;Foo common&lt;/cite&gt;. Tento poslední modul vznikne pouze  za předpokladu, že existuje sdílená logika. Zároveň s rozčleněním do těchto modulů roztrhneme i závislosti původního &lt;cite&gt;Foo&lt;/cite&gt; modulu. Ideální stav zobrazuje následující obrázek.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://sweb.cz/pichlik/spot-res/dependence-refactor.png" /&gt;&lt;/p&gt;
&lt;p&gt;No nežijeme v ideálním světě a tak se může ukázat, že modul &lt;cite&gt;Foo&lt;/cite&gt; půjde refaktorovat velice složitě, pokud vůbec, neboť se může jednat o dědictví z minulosti. V takovém případě máme dvě možnosti. Tam kde modul &lt;cite&gt;Foo&lt;/cite&gt; chceme použít, uděláme nechtěným závislostem přítrž jejich &lt;a href="http://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html"&gt;explicitním vynecháním&lt;/a&gt;. Toto řešení má tu nevýhodu, že na každém místě použití modulu &lt;cite&gt;Foo&lt;/cite&gt; musíme tento manuální krok zopakovat. Pokud nám v budoucnu nastane situace, že modul &lt;cite&gt;Foo&lt;/cite&gt; bude potřebovat novou závislost, řekněme kolizní závislost, ať již pro serverové či lokální prostředí, budeme muset opravit manuální odstranění o další závislost.&lt;/p&gt;

&lt;p&gt;Druhou možností je využití takzvaných &lt;a href="http://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html"&gt;volitelných (optional) závislostí&lt;/a&gt;, které mají tu vlastnost, že nejsou součástí tranzitivního uzávěru. Na dalším obrázku jsou volitelné závislosti vyznačeny čárkovaně. Díky tomu, že nejsou součástí tranzitivního uzávěru, tak je sice moduly, které je používají "nenakoupí", ale zároveň to znamená, že je budou muset opět explicitně uvést tam kde budou potřeba. To ilustruje následující obrázek, kdy si &lt;cite&gt;WAR&lt;/cite&gt; explicitně přidává volitelné závislosti.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://sweb.cz/pichlik/spot-res/dependence-optional-war.png" /&gt;&lt;/p&gt;

&lt;p&gt;I toto řešení má stejnou nevýhodu v podobě manuálního opakovaní všech volitelných závislostí na každém místě použití a s tím spojený problém budoucího rozšíření. Pro eliminaci této nevýhody lze použít následujícího triku. Zavedeme si speciální moduly pro obě prostředí, které nám poslouží pouze k seskupení závislostí. Díky tomu budeme mít management závislostí pro dané prostředí centralizovaný pouze do jednoho místa. Tyto ad hoc moduly je pak možné použít namísto původního modulu &lt;cite&gt;Foo&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://sweb.cz/pichlik/spot-res/dependence-groups.png" /&gt;&lt;/p&gt;
&lt;p&gt;Tento seskupovací workaround lze použít v podstatě na úpravu jakýchkoliv nevyhovujících závislostí a lze jej vhodně kombinovat s explicitním vynecháním závislostí. Je škoda, že Maven nenabízí podobný mechanismus urovnání závislostí nějakým lepším způsobem. Na druhou stranu na to lze koukat i tak,že Maven vynucuje správné rozčlenění modulů a schválně nenabízí prostředky pro jejich obcházení.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-4267280591040002421?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/4267280591040002421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/4267280591040002421'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2009_04_05_archive.html#4267280591040002421' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry><entry><id>tag:blogger.com,1999:blog-4053149.post-8151813903495082980</id><published>2009-04-01T12:54:00.000+02:00</published><updated>2009-04-01T12:55:02.095+02:00</updated><title type='text'></title><content type='html'>&lt;h3&gt;NetBeans 7&lt;/h3&gt;

&lt;p&gt;Podařilo se mi dostat k připravované verzi nových NetBeans. Jak je vidět již na splash obrazovce, vývoj této verze má jasné směřování... &lt;/p&gt;
&lt;p&gt;&lt;img src="http://pichlik.sweb.cz/spot-res/splash.png" width="473" height="300" /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4053149-8151813903495082980?l=www.sweb.cz%2Fpichlik%2Findex.html' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/8151813903495082980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4053149/posts/default/8151813903495082980'/><link rel='alternate' type='text/html' href='http://www.sweb.cz/pichlik/archive/2009_03_29_archive.html#8151813903495082980' title=''/><author><name>Roman Pichlík</name><uri>http://www.blogger.com/profile/08107100428754252316</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08779370921093953791'/></author></entry></feed>
