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

<channel>
	<title>Java crumbs</title>
	<atom:link href="http://blog.krecan.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.krecan.net</link>
	<description>Short remarks from the Java world</description>
	<pubDate>Tue, 19 Aug 2008 09:38:13 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
			<item>
		<title>Není revize kódu jako revize kódu</title>
		<link>http://blog.krecan.net/2008/08/18/neni-revize-kodu-jako-revize-kodu/</link>
		<comments>http://blog.krecan.net/2008/08/18/neni-revize-kodu-jako-revize-kodu/#comments</comments>
		<pubDate>Mon, 18 Aug 2008 19:09:23 +0000</pubDate>
		<dc:creator>Lukáš Křečan</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.krecan.net/?p=89</guid>
		<description><![CDATA[	Dagi se nám nějak rozepsal. Takže abych s ním udržel krok, napíšu velmi opožděnou reakci na to co napsal skoro před rokem a dneska mi připomněl svým nejnovějším zápiskem. 
	Revizi kódu můžeme pojmout několika způsoby. Zažil jsem jednu čistě formální revizi, která se dělala jen proto, aby se odškrtl chlívek v nějakém předávacím protokolu. Vypadá [...]]]></description>
			<content:encoded><![CDATA[<p>	Dagi se nám nějak rozepsal. Takže abych s ním udržel krok, napíšu velmi opožděnou reakci na to co <a href="http://www.sweb.cz/pichlik/archive/2007_09_16_archive.html#1752105705132510935">napsal skoro před rokem</a> a <a href="http://www.sweb.cz/pichlik/archive/2008_08_10_archive.html#5902318291154250995">dneska mi připomněl</a> svým nejnovějším zápiskem. </p>
<p>	Revizi kódu můžeme pojmout několika způsoby. Zažil jsem jednu čistě formální revizi, která se dělala jen proto, aby se odškrtl chlívek v nějakém předávacím protokolu. Vypadá to tak, že vezmete svůj kód, předáte ho někomu koho jste nikdy neviděli a on vám pošle protokol s výsledky. Protože obvykle recenzent nemá moc času, tak to jen tak prolétne, napíše vám že tady měly být tři mezery místo čtyř a tato proměnná měla mít tři slabiky. Obvykle není přínos moc velký. Tedy kromě toho, že se splní smlouva, což je samozřejmě důležité. Někdy můžou být výsledky i docela zajímavé. Pamatuji se, že mi při jednom code review vytkli, že jsem použil návrhový vzor singleton. No nakonec jsem si ho obhájil. Toho, že jsem o kus dál dělal docela divočárny s Java reflection si nikdo kupodivu nevšiml.</p>
<p>	Takováto revize kódu je z pohledu programátora k ničemu. Nicméně to není jediná možnost jak je dělat. Můžeme dělat i neformální revize kódu. Mám s nimi docela dobrou zkušenost. A <a href="http://jirablog.blogspot.com/2007/09/code-review-je-jiste-uzitecna-vec.html">nejsem sám</a>. Jak taková revize vypadá?</p>
<p>	Je to jednoduché. Vybere se kus kódu, který je nějak rozumně ohraničený a přiměřeně velký (všimněte si mého exaktního jazyka). Jeho autor ho připraví na revizi, může ho prohnat automatickou kontrolou jako třeba FindBugs a podobně. Pak ho dostanou do ruky recenzenti (obvykle dva), kteří mají za úkol udělat samotnou revizi. Ale pozor, recenzenti musí být s autorem kódu členy stejného týmu. To je nesmírně důležité. Tím že dělají revizi kódu se ho mimochodem i naučí. Takže místo jednoho člověka, který zná danou část aplikace už máme tři lidi, kteří se s ní kamarádí. </p>
<p>	A to není všechno. Celá revize by měla být završena sezením. To se sejde celý tým v zasedačce, pouští si kód na projektoru a povídá si o něm. Recenzenti ukazují co se jim líbilo, co by vylepšili a všichni dohromady pojídají koláč. Je nesmírně důležité udržet neformální a přátelskou atmosféru. Pokud máte manažera, který nechápe, že se při programování dělají chyby, na sezení ho nepouštějte. Je také dobré mít moderátora a zapisovatele. Moderátor řídí diskuzi, dohlíží na to aby se sezení nezvrhlo v hádku o tom, jestli je lepší HashMap nebo TreeMap. Zapisovatel zapisuje rozhodnutí o tom co je potřeba na kódu ještě vylepšit. Podobná revize kódu vám přinese několik výhod. </p>
<ol>
<li>Autor kódu se víc snaží. Znám to ze své zkušenosti. Když vím, že po mě někdo bude kód číst, tak se prostě víc snažím. Odpustím si některé prasárny, víc se zamýšlím nad tím co dělám. Je to hloupé, ale je to tak. (Alespoň se nestydim to přiznat)</li>
<li>Šíří se znalosti. To je podle mě největší přínos revizí. Jak recenzenti, tak autor kódu, ale i ostatní členové týmu se od sebe navzájem hrozně moc naučí. Při sezení si povídají nad konkrétním kódem, můžou si ukázat jak autor super použil návrhový vzor, jak by mohl lépe použít knihovnu XYZ apod. </li>
<li>Občas se při revizi najdou i nějaké chyby.</li>
</ol>
<p>Revize kódu mají i své nevýhody. Pokud je v týmu nezdravá atmosféra, můžou se zvrhnout v ošklivou hádku. Od toho máme moderátora aby tomu zabránil. A koláč, ten dokáže atmosféru docela uvolnit. Samozřejmě největší nevýhodou revizí je to, že žerou čas. Stejně jako dobrý návrh a unit testy, tak i revize kódu zabírají čas. A toho není nikdy nazbyt. Tady mi nezbývá než použít svůj oblíbený citát. </p>
<blockquote><p>Nikdy není dost času udělat to pořádně, vždycky je dost času udělat to znovu.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.krecan.net/2008/08/18/neni-revize-kodu-jako-revize-kodu/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Nejlepší softwarové články</title>
		<link>http://blog.krecan.net/2008/08/16/nejlepsi-softwarove-clanky/</link>
		<comments>http://blog.krecan.net/2008/08/16/nejlepsi-softwarove-clanky/#comments</comments>
		<pubDate>Sat, 16 Aug 2008 14:28:18 +0000</pubDate>
		<dc:creator>Lukáš Křečan</dc:creator>
		
		<category><![CDATA[Knihovnička SE]]></category>

		<guid isPermaLink="false">http://blog.krecan.net/?p=84</guid>
		<description><![CDATA[Dneska vás čeká pikorecenze knihy The Best Software Writing, kterou zkompiloval Joel Spolsky. V podstatě jde o souhrn článků, které Joel považuje za dobré. Musím se přiznat, že mě kniha moc nezaujala. Obsahuje pár hodně zajímavých článků a několik řekněme nadprůměrných. Nejvíc se mi asi líbil  článek Strong typing vs. Strong testing od Bruce [...]]]></description>
			<content:encoded><![CDATA[<p>Dneska vás čeká pikorecenze knihy <a href="http://www.joelonsoftware.com/articles/BestSoftwareWriting.html">The Best Software Writing</a>, kterou zkompiloval Joel Spolsky. V podstatě jde o souhrn článků, které Joel považuje za dobré. Musím se přiznat, že mě kniha moc nezaujala. Obsahuje pár hodně zajímavých článků a několik řekněme nadprůměrných. Nejvíc se mi asi líbil  článek <a href="http://mindview.net/WebLog/log-0025">Strong typing vs. Strong testing</a> od Bruce Eckela. Doporučuji vám si ho přečíst, poskytuje zajímavý pohled na problematiku dynamických jazyků.<br />
	Ale jinak bych vám spíš doporučil přečíst si Joela samotného, této knize dávám pět hvězdiček z deseti.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.krecan.net/2008/08/16/nejlepsi-softwarove-clanky/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JOS, yes!</title>
		<link>http://blog.krecan.net/2008/08/04/jos-yes/</link>
		<comments>http://blog.krecan.net/2008/08/04/jos-yes/#comments</comments>
		<pubDate>Mon, 04 Aug 2008 10:19:24 +0000</pubDate>
		<dc:creator>Lukáš Křečan</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.krecan.net/?p=83</guid>
		<description><![CDATA[I já jsem se o víkendu zúčastnil JOpenSpace. Původně jsem chtěl o akci něco napsat, ale bylo by to nošením dříví do lesa, už to udělali jiní.  Takže bych chtěl jen poděkovat Srakyimu za zorganizování a ostatním účastníkům za zajímavé diskuze. Díky.
]]></description>
			<content:encoded><![CDATA[<p>I já jsem se o víkendu zúčastnil <a href="http://www.jopenspace.cz/">JOpenSpace</a>. Původně jsem chtěl o akci něco napsat, ale bylo by to nošením dříví do lesa, už to udělali jiní.  Takže bych chtěl jen poděkovat Srakyimu za zorganizování a ostatním účastníkům za zajímavé diskuze. Díky.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.krecan.net/2008/08/04/jos-yes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Omezení vs. svoboda</title>
		<link>http://blog.krecan.net/2008/07/28/omezeni-vs-svoboda/</link>
		<comments>http://blog.krecan.net/2008/07/28/omezeni-vs-svoboda/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 21:49:10 +0000</pubDate>
		<dc:creator>Lukáš Křečan</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.krecan.net/?p=82</guid>
		<description><![CDATA[Dneska začnu hodně ze široka. Vydal jsem se na jazykový pobyt do Irska. Dostal jsem půlroční kontrakt v AerLingus, nicméně to zatím vypadá, že jediné co mám šanci se tam naučit je angličtina. Ne, že bych to nepotřeboval.
	To, že jsem v Irsku má ale jednu velkou výhodu, když si objednám knížku na britském Amazonu, mám [...]]]></description>
			<content:encoded><![CDATA[<p>Dneska začnu hodně ze široka. Vydal jsem se na jazykový pobyt do Irska. Dostal jsem půlroční kontrakt v <a href="http://www.aerlingus.com/">AerLingus</a>, nicméně to zatím vypadá, že jediné co mám šanci se tam naučit je angličtina. Ne, že bych to nepotřeboval.<br />
	To, že jsem v Irsku má ale jednu velkou výhodu, když si objednám knížku na britském Amazonu, mám ji do dvou dnů doma. Takže se máte na co těšit. Dneska jsem začal číst knížku „<a href="http://www.joelonsoftware.com/articles/BestSoftwareWriting.html">The Best of Software Writing</a>“, kterou sestavil Joel Spolsky. No a hned u první kapitoly mě popadla chuť napsat článek, na který se chystám už dlouho. Dokonce si nejsem jistý, jestli jsem ho už nenapsal. Snad ne.<br />
	Ta <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=74230">první kapitola</a> je ve zkratce o tom, že styl je důležitý. Autor v ní hájí myšlenku, že by měl kompilátor kontrolovat styl. Tzn. každý jazyk by měl mít předepsaný styl, který by byl jediný správný. Třeba v Javě by se musely složené závorky psát na novém řádku, mezi klíčovým slovem if a závorkou by musela být právě jedna mezera atp. Kompilátor by odmítal zkompilovat cokoliv, co by tento styl nedodržovalo. Odpadly by zbytečné hádky o tom, který styl je lepší, odpadlo by spousta zbytečných nastavení vývojových prostředí. Krása, že?<br />
	Na druhou stranu se dostávají do módy jazyky, kde je styl naprosto nedůležitý. Kde si můžete vybrat, jestli kolem parametrů metody napíšete závorky nebo ne. Kde můžete mít desítky různých příchutí jazyka, které si ani nejsou podobné.<br />
	Zvláštní, na jednu stranu voláme po svobodě, nechceme se zdržovat deklarováním proměnných ani psaním složených závorek. Na druhou stranu chceme mít víc omezeni, chceme větší typovou kontrolu a anotace, které za nás budou hlídat obsah polí. Někteří dokonce chtějí mít předepsáno, kde smí napsat mezeru.<br />
	Jedna možnost je, že se nejedná o ty samé lidi. Je možné, že někdo má sklon spíš ke svobodě a druhý spíš k omezení. Někomu vyhovuje Ant, někomu Maven.<br />
	Druhá možnost je že záleží na úkolu (jaké překvapení). Někdy se nám hodí volnost, jindy omezení. Tady jenom nevím jak poznat, který případ se nás týká.<br />
	No musím se přiznat, že jsem udělal zásadní pisatelskou chybu. Začal jsem psát, aniž bych věděl, jak to dopadne. Doufal jsem, že se to nějak vyvrbí. A ono ne. Takže pokud čekáte pointu tak vás zklamu.<br />
	Můžu jenom napsat jak to cítím já. Já osobně nesnáším omezení. To víte, jsem velice kreativní a jakékoliv omezení umělce mé úrovně brzdí. Ale co opravdu vítám je omezení ostatních. Však to znáte, kolegové jsou hrozná prasata, jejich programovací styl je strašný, kdyby jim to kompilátor dovolil, tak snad píší azbukou nebo co. Omezení na ně, čím víc tím líp.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.krecan.net/2008/07/28/omezeni-vs-svoboda/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Závažná bezpečnostní chyba ve Springu odhalena!</title>
		<link>http://blog.krecan.net/2008/07/17/zavazna-bezpecnostni-chyba-ve-springu-odhalena/</link>
		<comments>http://blog.krecan.net/2008/07/17/zavazna-bezpecnostni-chyba-ve-springu-odhalena/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 19:27:33 +0000</pubDate>
		<dc:creator>Lukáš Křečan</dc:creator>
		
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://blog.krecan.net/?p=81</guid>
		<description><![CDATA[Otázka: Je pravda, že v Košicích upálily rusa?
Odpověd rádia Jerevan: Ano, je to pravda, ale nebylo to v Košicích, ale v Kostnici a nebyl to rus, ale Hus.
Myslel jsem si, že jsem expert na senzační titulky. Ale tento je nepřekonatelný. Mohli jste na něj narazit dnes, například na theserverside.com. Na první pohled to vypadá, že [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Otázka: Je pravda, že v Košicích upálily rusa?<br />
Odpověd rádia Jerevan: Ano, je to pravda, ale nebylo to v Košicích, ale v Kostnici a nebyl to rus, ale Hus.</p></blockquote>
<p>Myslel jsem si, že jsem expert na senzační titulky. Ale tento je nepřekonatelný. Mohli jste na něj narazit dnes, například na <a href="http://www.theserverside.com/news/thread.tss?thread_id=50076">theserverside.com</a>. Na první pohled to vypadá, že  našli závažnou bezpečnostní chybu ve Springu. Na druhý pohled člověk přijde na to, že <a href="http://cs.wikipedia.org/wiki/R%C3%A1dio_Jerevan">Rádio Jerevan</a> obnovilo vysílání.<br />
	Takže, je pravda, že je ve Springu bezpečnostní chyba? Ano je to pravda, jenom to není ve Springu, ale ve Spring MVC a není to chyba, ale vlastnost.<br />
	Jde o to, že Spring MVC napojuje (binduje) hodnoty v HTML formulářích na beany. Pokud mám ve formuláři políčko se jménem <code>name </code> a v beaně pole se stejným jménem, Spring MVC mi automaticky nastaví hodnotu v beaně podle hodnoty ve formuláři. A to je ta chyba. Může se totiž stát, že mám v beaně jinou sadu polí než v HTML formuláři. Útočník teoreticky může v dotazu poslat hodnotu pole, které nebylo ve formuláři, a které tudíž ani nečekám. Prostě a jednoduše mi pošle jeden parametr dotazu (request parameter) navíc. Pokud správně trefí jméno, Spring nastaví hodnotu pole beany, u kterého to neočekávám. Takže teoreticky může změnit něco, co nechci aby se měnilo. To je závažná věc, a je dobré ji mít na paměti. Rozhodně bych to nechtěl zlehčovat. Musím se přiznat, že mi to až dodnes nedošlo.<br />
	Nicméně pokud to trochu přeformuluji, tak z toho plyne, že nemáme věřit ničemu, co nám přichází od uživatele. To rozhodně není žádná novinka. Jenom na to často zapomínáme. Uvedený problém má ve Spring MVC jednoduché <a href="http://www.springsource.com/securityadvisory">řešení</a>. Prostě mu řekneme, jaká pole má napojovat.<br />
	Samozřejmě to není jenom problém Spring MVC, stejný problém budou mít všechny podobně fungující frameworky (možná kromě JSF). Když mi přijde HTTP dotaz, tak nevím, která políčka byla v HTML formuláři. On tam konec konců ani žádný HTML formulář být nemusel. Dotaz mohl být klidně vygenerovaný nějakou aplikací. Jediné co mohu udělat, je explicitně určit, která pole se mají nastavovat. To Spring MVC umožňuje, jenom to skoro nikdo nepoužívá.<br />
	Takže abych to shrnul. Ve Springu bezpečnostní chyba není (alespoň co je mi známo). Chyba ale může vzniknout při jeho neopatrném používání. Doufám že se zítra nedočtu, že je závažná chyba v Oraclu. Doslechl jsem se, že umožňuje zavolat DROP SCHEMA a to může mít závažné následky na integritu dat. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.krecan.net/2008/07/17/zavazna-bezpecnostni-chyba-ve-springu-odhalena/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Paralelní svět</title>
		<link>http://blog.krecan.net/2008/06/30/paralelni-svet/</link>
		<comments>http://blog.krecan.net/2008/06/30/paralelni-svet/#comments</comments>
		<pubDate>Mon, 30 Jun 2008 18:14:28 +0000</pubDate>
		<dc:creator>Lukáš Křečan</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.krecan.net/?p=80</guid>
		<description><![CDATA[	V poslední době se hodně mluví o Erlangu. No a protože jsem slaměný vdovec a u žehlení se nudím, pustil jsem si přednášku od otce Erlangu Joe Armstronga. V tomto zápisku se chci o své dojmy z této přednášky podělit s vámi, mými oddanými fanoušky. Chci předem upozornit, že to jsou jen dojmy, pořádně ještě [...]]]></description>
			<content:encoded><![CDATA[<p>	V poslední době se hodně mluví o <a href="http://www.erlang.org/">Erlangu</a>. No a protože jsem slaměný vdovec a u žehlení se nudím, pustil jsem si <a href="http://www.infoq.com/presentations/erlang-software-for-a-concurrent-world">přednášku</a> od otce Erlangu Joe Armstronga. V tomto zápisku se chci o své dojmy z této přednášky podělit s vámi, mými oddanými fanoušky. Chci předem upozornit, že to jsou jen dojmy, pořádně ještě nemám na věc ujasněný názor.<br />
	Začátek přednášky je relativně zajímavý. Už jsem nejméně stokrát slyšel, že se programátoři musí začít chovat jinak, protože se objevily vícejádrové procesory. Ale vždy jsem si říkal, že tu máme přeci víceprocesorové stroje už hodně dlouho, tak jakápak změna. Až díky této přednášce jsem mi došlo, že změna není v tom, že máme více jader. Změna je v tom, že se sekvenční zpracování procesorů nezrychluje tak, jak jsme byli zvyklí. Od jisté doby roste rychlost hlavně díky paralelizaci. Všimněte si, že taktovací frekvence procesorů se v poslední době zas tak zásadně nemění. Naopak se objevují X jádrové procesory. Už prý existuje 1000 jádrový procesor, pokud bude růst počet jader exponenciálně, můžeme se v nedaleké budoucnosti dostat na zajímavá čísla. Předpokládejme, že je takový nárůst počtu jader možný. Dosud jsme byly zvyklí, že naše programy automaticky s novým procesorem zrychlí. Od příště už to tak být nemusí. To že klient můj sekvenční program nasadí na procesor s miliónem jader, neznamená, že bude milionkrát rychlejší. Spíš bude pomalejší než na jednojádrovém.<br />
	Tak a teď mé dojmy. Jak to ovlivňuje programátory? Protože jsem zvyklý na serverovou Javu, budu psát hlavně o ní. Představme si, že máme 1000 jádrový procesor. Jak budeme muset změnit svůj kód, aby běžel efektivně? Představme si pro začátek, že mám jednoduchou aplikaci založenou na servletech. Přijde dotaz, já ho v jenom vlákně zpracuji a v tom samém vlákně pošlu odpověď. Abych si to zkomplikoval, budu předpokládat, že ne všechna práce je výpočetně náročná, občas budu čekat na disk, databázi na jiném stroji atp. To znamená, že potřebuji mít víc vláken než procesorů (jader), abych byl schopen je vytížit. To znamená, že potřebuji víc než tisíc současných požadavků, aby ta vlákna měla co dělat (tady to trochu moc zjednodušuji, ale snad mi to prominete). Pokud je tento předpoklad splněn, nemusím svoji aplikaci měnit vůbec. Tedy za předpokladu, že JVM zvládne 1000 jádrový procesor.<br />
	Pokud mám méně než několik tisíc současných dotazů, procesor plně nevyužiji. Musím práci rozsekat na víc kousků. Jde to v Javě vůbec? Pan Armstrong tvrdí, že ne. Tvrdí, že Java je staromódní jazyk, který se spoléhá na sdílenou paměť, sdílený stav, zámky, transakce a podobná zvěrstva. Naproti tomu je Erlang moderní jazyk, který je navržen s tím, aby skvěle fungoval paralelně, který nemá problém s miliónem běžících pidiprocesů, které žádný stav nesdílejí, jenom si předávají zprávy. Tvrdí navíc, že problém Javy a podobných jazyků je přímo v jejich pojetí. Že jsou to jazyky sekvenční, kdežto Erlang je jazyk paralelní. Tvrdí navíc, že svět jako takový, je paralelní, tudíž je těžké ho popsat sekvenčním jazykem. Abych pravdu řekl, nevím jestli je svět paralelní nebo sekvenční. Na jednu stranu se každý člověk stará sám o sebe a rozhodně nesdílí svůj stav s ostatními. Jenom jim posílá všelijaké zprávy. To by nahrávalo paralelnímu pohledu. Jen ovšem do té doby, než se octnete v dopravní zácpě, která je podle mě silně sekvenční.<br />
	A v tom je právě zakopaný pes. Potíž není v jazyku, ale v řešeném problému. V Javě také nemusím sdílet žádný stav. Každé vlákno může mít svoji logicky oddělenou paměť. Když se nad tím  zamyslím, tak už se to dávno děje. Proto jsou tak populární řešení založená na JMS. Jednotlivé oddělené procesy si jenom předávají zprávy. To je přesně to, co mi poskytuje Erlang. V Javě to jenom není zakomponováno přímo v jazyku. Je to v ní na logicky vyšší úrovni. A tedy i s mnohem vyšší režií.<br />
	Ano je to tak, pokud mám problém, který se dá rozseknout na hodně malých úkolů, je snadné ho paralelizovat. Ale na to není nutné měnit jazyk. Mohu použít JMS, JINI nebo jiné jednodušší mechanizmy. Stále tu ale ještě máme spoustu aplikací, které prostě vyžadují sdílený stav, jejichž doména je sekvenční, které se paralelizovat nedají. Jsem rád, že mohu používat jazyk, který mi to umožňuje.<br />
	Bylo by samozřejmě pěkné, kdyby Java umožňovala snazší spouštění paralelních úloh. Na druhou stranu k tomu už spěje. V Javě 5 byly zavedeny <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Executors.html">executory (spouštěče?)</a>, <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Future.html">Futures</a> a <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html">datové struktury</a>, které nevyžadují synchronizaci. Možná není paralelní programování v Javě tak přímočaré jako v Erlangu, ale relativně jednoduché je. Takže můj závěr je následující – pokud máte problém, který je principiálně podobný telefonní ústředně, zkuste Erlang. Pokud píšete obecnou aplikaci, zůstaňte u Javy.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.krecan.net/2008/06/30/paralelni-svet/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Kterak být agilní ve vodopádu</title>
		<link>http://blog.krecan.net/2008/06/22/kterak-byt-agilni-ve-vodopadu/</link>
		<comments>http://blog.krecan.net/2008/06/22/kterak-byt-agilni-ve-vodopadu/#comments</comments>
		<pubDate>Sun, 22 Jun 2008 08:26:19 +0000</pubDate>
		<dc:creator>Lukáš Křečan</dc:creator>
		
		<category><![CDATA[Agile]]></category>

		<guid isPermaLink="false">http://blog.krecan.net/?p=79</guid>
		<description><![CDATA[Jak máme prodat agilní vývoj managementu? Nedělejte to, oni beztak nevědí co děláte.
Onehdá jsme s takovou podivnou partou lidí v hospodě řešili, jak propagovat Agilní vývoj v jedné nejmenované firmě. Potíž je v tom, že v té firmě se vyvíjí vodopádem. (I když management tvrdí, že se tam dělá RUP.)
No a včera jsem na InfoQ [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Jak máme prodat agilní vývoj managementu? Nedělejte to, oni beztak nevědí co děláte.</p></blockquote>
<p>Onehdá jsme s takovou podivnou partou lidí v hospodě řešili, jak propagovat Agilní vývoj v jedné nejmenované firmě. Potíž je v tom, že v té firmě se vyvíjí vodopádem. (I když management tvrdí, že se tam dělá RUP.)</p>
<p>No a včera jsem na InfoQ narazil na zajímavou přednášku o tom, jak dělat Agilní vývoj ve vodopádu.  Takže pokud vás toto téma zajímá, najděte si hodinku a čtvrt a podívejte  se na <a href="http://www.infoq.com/presentations/Agile-in-the-Waterfall-Enterprise-Michele-Sliger">to</a>. Nedovíte se tam nic převratného, ale alespoň to naznačí, kudy by se dalo jít.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.krecan.net/2008/06/22/kterak-byt-agilni-ve-vodopadu/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Spring field injection</title>
		<link>http://blog.krecan.net/2008/06/17/spring-field-injection/</link>
		<comments>http://blog.krecan.net/2008/06/17/spring-field-injection/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 10:41:14 +0000</pubDate>
		<dc:creator>Lukáš Křečan</dc:creator>
		
		<category><![CDATA[Articles in English]]></category>

		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://blog.krecan.net/?p=78</guid>
		<description><![CDATA[Few weeks ago, I worked on an interesting task. I had to find out how to migrate my customer&#8217;s proprietary framework to Spring. The framework was quite similar to Spring, although there were some differences. They used combination of XML and annotation configuration. Every property had special annotation saying that it is a property. XML [...]]]></description>
			<content:encoded><![CDATA[<p>Few weeks ago, I worked on an interesting task. I had to find out how to migrate my customer&#8217;s proprietary framework to Spring. The framework was quite similar to Spring, although there were some differences. They used combination of XML and annotation configuration. Every property had special annotation saying that it is a property. XML schema for configuration was generated based on this annotation. So basically you had XML configuration that said what to inject to the annotated fields. The problem was that they did not have set methods for the fields.</p>
<p>And of course, the customer did not want to change all their classes just to migrate to Spring. It meant that they needed configure all the beans using Spring, but inject the dependencies directly, not through set methods. </p>
<p>I know that it is ugly and not recommended but in this case I think I have good excuse. It is a customer&#8217;s requirement. The question of course is how to  do it.</p>
<p>You can try to use Spring post-processor. If you register instance of <a href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/beans/factory/config/InstantiationAwareBeanPostProcessor.html">InstantiationAwareBeanPostProcessor </a>you can use method <a href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/beans/factory/config/InstantiationAwareBeanPostProcessor.html#postProcessPropertyValues(org.springframework.beans.PropertyValues,%20java.beans.PropertyDescriptor[],%20java.lang.Object,%20java.lang.String)">postProcessPropertyValues</a> to manipulate with property values just before Spring attempts to inject them. So you can inject the values into fields by yourself. And it works. The trouble is that you have to do property instantiation and conversion by yourself too. I almost  managed to do it when I encountered a big problem - inner beans. In Spring, you can define a bean inside another bean. In order to inject the inner bean to the outer bean, the inner bean has to be already instantiated. But  <code>postProcessPropertyValues</code> method is called before inner bean instantiation. So that is a blind alley. </p>
<p>OK, post-processor can not be used, let&#8217;s do it more hard-core. Spring has something called <code><a href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/beans/BeanWrapper.html">BeanWrapper</a></code>. It is used by Spring for setting bean properties. Great, that is the point where I can force Spring to inject into the fields. The only thing I need to do, is to inject my  BeanWrapper implementation into Spring. There is only one small trouble. It is not possible to do it. Unsurprisingly, dependency injection does not work inside the dependency injection code. I tried hard, but did not find any simple and safe way how to replace default BeanWrapper implementation.  (If you know how to do it, please let me know)</p>
<p>So, if it is not possible to force Spring to inject without set method, let&#8217;s give him what he is asking for. The final solution is simple. When instantiating beans, I do not instantiate the original class but a  subclass that is generated in the runtime and has all needed set methods.  For the class generation I use <a href="http://www.csg.is.titech.ac.jp/~chiba/javassist/">Javassist</a>, it is simple and powerful. To make the integration with Spring as simple as possible, I use factory bean. So the Spring XML config file looks like this</p>
<pre name="code" class="xml">
	&lt;bean id="beanFactory" class="net.krecan.beanfactory.SetMethodGeneratingBeanFactory"/&gt;
	&lt;bean id="sampleClass"
		      factory-bean="beanFactory"
		      factory-method="createBean"&gt;
		&lt;constructor-arg value="net.krecan.beanfactory.Sample"/&gt;
		&lt;property name="textProperty" value="test.txt"/&gt;
		&lt;property name="intProperty" value="123"/&gt;
		&lt;property name="simpleSample"&gt;
			&lt;bean factory-bean="beanFactory"
			   factory-method="createBean"&gt;
				&lt;constructor-arg value="net.krecan.beanfactory.SimpleSample"/&gt;
				&lt;property name="textProperty" value="hallo"/&gt;

			&lt;/bean&gt;

		&lt;/property&gt;
	&lt;/bean&gt;
</pre>
<p>Instead of providing class name in the bean definition, factory-bean attribute is used. Spring than calls method createBean on the factory bean with parameter taken from the constructor-arg element. It contains the class name of the bean. The result of the method call is used as a bean instance and all the properties are set by Spring. </p>
<p>Of course, you do not have to write it this way every time you want to instantiate this kind of bean. Simple custom namespace can be created in order to simplify the syntax.</p>
<p>In the future, when my customer realize that setters are a good thing, the factory can be easily replaced by a dummy implementation. </p>
<p>To reiterate, direct injection of dependencies from XML to the fields without using set methods is not supported by Spring. You can choose between XML based configuration using set methods or annotation based configuration. It is extremely hard to change default Spring behavior. And maybe it is a good thing. So if you need to do ugly XML based field injection, your only choice is to generate set methods in the runtime. Or maybe something else, but I have no idea what.</p>
<p><span id="more-78"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.krecan.net/2008/06/17/spring-field-injection/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Joel o software</title>
		<link>http://blog.krecan.net/2008/06/09/joel-o-software/</link>
		<comments>http://blog.krecan.net/2008/06/09/joel-o-software/#comments</comments>
		<pubDate>Mon, 09 Jun 2008 18:11:45 +0000</pubDate>
		<dc:creator>Lukáš Křečan</dc:creator>
		
		<category><![CDATA[Knihovnička SE]]></category>

		<guid isPermaLink="false">http://blog.krecan.net/?p=77</guid>
		<description><![CDATA[V porovnání s řízením týmu lidí jsou C++ šablony triviální.
Dneska budu psát o něčem co asi všichni znáte. O sérii Joel on Software, kterou jsem měl příležitost přečíst si v knižní podobě.
A začnu rovnou chválou. Je to nejlepší knížka, kterou jsem o psaní programů kdy četl. Joel nejen že tomu rozumí, on umí navíc i [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>V porovnání s řízením týmu lidí jsou C++ šablony triviální.</p></blockquote>
<p>Dneska budu psát o něčem co asi všichni znáte. O sérii <a href="http://www.joelonsoftware.com/Archive.html">Joel on Software</a>, kterou jsem měl příležitost přečíst si v <a href="http://www.amazon.com/Joel-Software-Occasionally-Developers-Designers/dp/1590593898/">knižní podobě</a>.</p>
<p>A začnu rovnou chválou. Je to nejlepší knížka, kterou jsem o psaní programů kdy četl. Joel nejen že tomu rozumí, on umí navíc i psát. A to vtipně. Takže se střídají okamžiky, kdy se člověk směje s okamžiky kdy si říká „Tak takhle to je“. </p>
<p>Kniha je rozdělena do několika základních částí. Joel v ní probírá témata týkající se programování, managementu, strategie a ekonomie softwarových projektů. Zakončuje částí o .NETu, která je docela zajímavá i pro Javistu. Mě obvykle přestávají podobné knihy po polovině bavit. Připadá mi, že se autor už jen opakuje. U této knihy tomu tak nebylo. Takže jsem ochoten mu odpustit i to, že je prašivý Microsofťák.</p>
<p>Knize uděluji deset hvězdiček z deseti a vyhlašuji ji jako povinnou literaturu. Až vás příště potkám, tak si vás jen tak zběžně přezkouším. Běda tomu kdo ji nebude umět nazpaměť. Ale vážně, pokud pro vás programování není jenom dočasný způsob obživy, přečtěte si to. Když už ne knižně, tak alespoň online. Většina textů je <a href="http://www.joelonsoftware.com/Archive.html">ke stažení</a> na internetu.</p>
<p>No a nebyl bych to já, kdybych se nedopustil neodpustitelného porušení autorských práv neautorizovanou citací <a href="http://www.joelonsoftware.com/articles/fog0000000043.html">Joelova testu</a>, kterým si můžete zjistit, jak na tom je vaše firma</p>
<ol>
<li>Používáte source control?</li>
<li>Jste schopni udělat build v jednom kroku?</li>
<li>Děláte denní build? </li>
<li>Máte databázi chyb?</li>
<li>Opravujete chyby před tím než píšete nový kód?</li>
<li>Máte aktualizovaný plán?</li>
<li>Máte specifikaci?</li>
<li>Mají programátoři tiché pracoviště?</li>
<li>Používáte nejlepší nástroje, které se dají koupit?</li>
<li>Máte testery?</li>
<li>Píší uchazeči o zaměstnání kód během pohovoru?</li>
<li>Děláte testy použitelnosti za pomocí lidí odchycených na chodbě?</li>
</ol>
<p>Za každou kladnou odpověď si přičtěte bod. Joel tvrdí, že většina organizací se pohybuje kolem tří bodů. Ale neradujte se, že máte pět bodů. Výsledek 10 a nižší je prý také špatný. Ale abych vás potěšil, v knize se dočtete i to, jak to <a href="http://www.joelonsoftware.com/articles/fog0000000332.html">můžete právě vy</a> napravit. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.krecan.net/2008/06/09/joel-o-software/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Sníme v kódu</title>
		<link>http://blog.krecan.net/2008/06/05/snime-v-kodu/</link>
		<comments>http://blog.krecan.net/2008/06/05/snime-v-kodu/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 19:13:17 +0000</pubDate>
		<dc:creator>Lukáš Křečan</dc:creator>
		
		<category><![CDATA[Knihovnička SE]]></category>

		<guid isPermaLink="false">http://blog.krecan.net/?p=76</guid>
		<description><![CDATA[Software is hard. [Donald Knuth]
	Tak jsem tu zas s další pidirecenzí knihy pro úchyly jako jsem já a doufám že i vy. V originále se jmenuje Dreaming in Code, a napsal ji Scott Rosenberg. Její podtitul mluví za vše: „Dva tucty programátorů, tři roky, 4 732 chyb a jedna výprava za výjimečným programem.“
	O čem, že [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Software is hard. [Donald Knuth]</p></blockquote>
<p>	Tak jsem tu zas s další pidirecenzí knihy pro úchyly jako jsem já a doufám že i vy. V originále se jmenuje <a href="http://www.dreamingincode.com/">Dreaming in Code</a>, a napsal ji Scott Rosenberg. Její podtitul mluví za vše: „Dva tucty programátorů, tři roky, 4 732 chyb a jedna výprava za výjimečným programem.“<br />
	O čem, že to je? Pan <a href="http://www.kapor.com/bio/index.html">Mitchell Kapor</a>, zakladatel Lotusu, si vydělal nějakých sto milionů dolarů na Lotusu 1-2-3. No a jelikož nevěděl co s penězi, tak se rozhodl, že založí Open Source projekt, který vyřeší jeho a ostatně i naše trable s MS Outlookem. Že napíše něco mnohem lepšího. Program, který změní svět. Který úplně převrátí náš pohled na na PIM programy. Převratný programu <a href="http://chandlerproject.org/">Chandler</a>. Že jste o něm nikdy neslyšeli? Není divu. Ono se to moc nepodařilo. O to je ta kniha zajímavější.<br />
	Autor po tři roky sledoval marnou snahu týmu, tento program napsat. A musím přiznat, že je to čtení jen pro silné nátury. Je to čtení o  tom, jak se neustále dohadovali, co vlastně chtějí naprogramovat, jak to chtějí naprogramovat, co to bude dělat, jak to bude vypadat, jaké knihovny použít. V prvním roce v podstatě nenapsali nic užitečného. K první použitelné verzi se blížili asi po třech letech! To už to ovšem autor knihy vzdal a šel dělat něco užitečnějšího. Podobně otřesný zážitek jsem zažil naposled, když jsem sledoval Sin City ve Francouzštině.<br />
	Co knihu dělá stravitelnou a i užitečnou jsou citace a četné <a href="http://www.dreamingincode.com/endnotes/">odkazy </a>na další literaturu. Autor často odbočí, problémy Chendleru zobecňuje a píše, co o problému kdo zajímavého napsal. Takže, až vás příště budu ohromovat nějakým citátem, tak víte, kde jsem ho našel.<br />
	Takže abych to shrnul, pokud vás zajímá vývoj software, máte silný žaludek a nemáte dost odstrašujících příkladů z vlastní praxe, kniha Dreaming in Code je pro vás ta pravá. Dávám jí chabých 6 hvězdiček z deseti. A dovolte mi zakončit citátem, který knihu docela vystihuje. Jde o odpověď, kterou dal Linus Torvalds na <a href="http://web.archive.org/web/20041106193140/http://www.linuxtimes.net/modules.php?name=News&#038;file=article&#038;sid=145">otázku</a>, jakou radu by dal lidem, kteří se pouštějí do velkého projektu. </p>
<blockquote><p>
Nikdo by se neměl pouštět do velkých projektů. Začněte s malým, triviálním projektem a nikdy neočekávejte, že bude velký. Když to budete čekat, jenom ho předimenzujete a budete si myslet, že  je důležitější, než  pravděpodobně v dané fázi je. Nebo ještě hůř,  představa té hromady práce vás může úplně odradit. Takže začněte v malém a myslete na detaily. Nemyslete na velký obraz a fantastický design. Pokud to neřeší okamžitou potřebu, je to zcela jistě předimenzováno.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.krecan.net/2008/06/05/snime-v-kodu/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
