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

<channel>
	<title>linkedin &#8211; Jiří Kratochvíl</title>
	<atom:link href="https://jiri.kratochvil.eu/tag/linkedin/feed/" rel="self" type="application/rss+xml" />
	<link>https://jiri.kratochvil.eu</link>
	<description>Kráťovo občasník</description>
	<lastBuildDate>Sun, 26 May 2013 10:18:22 +0000</lastBuildDate>
	<language>cs</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.1</generator>

<image>
	<url>https://jiri.kratochvil.eu/wp-content/uploads/2018/10/kratochvil-logo-100x100.png</url>
	<title>linkedin &#8211; Jiří Kratochvíl</title>
	<link>https://jiri.kratochvil.eu</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">10187198</site>	<item>
		<title>Recenze: Chytré hodinky Pebble</title>
		<link>https://jiri.kratochvil.eu/recenze-chytre-hodinky-pebble/</link>
					<comments>https://jiri.kratochvil.eu/recenze-chytre-hodinky-pebble/#respond</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Sun, 26 May 2013 10:18:22 +0000</pubDate>
				<category><![CDATA[Události]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[Pebble]]></category>
		<category><![CDATA[recenze]]></category>
		<category><![CDATA[Tipy]]></category>
		<category><![CDATA[Ze života]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=446</guid>

					<description><![CDATA[Před týdnem mi konečně domů dorazily hodinky Pebble. Projekt, který jsem, stejně jako desetisíce jiných, objevil na Kickstarteru před více než rokem. Koncept hodine, které [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Před týdnem mi konečně domů dorazily hodinky Pebble. Projekt, který jsem, stejně jako desetisíce jiných, objevil na Kickstarteru před více než rokem. Koncept hodine, které jsou jakousi prodlouženou rukou mobilního telefonu mě okamžitě zaujal a já přispěl projektu Pebble částkou 150 dolarů a těšil se na to, až hodinky budu nosit na svém zápěstí. Celý koncept vyvolal nejen u mě obrovské očekávání. Po týdnu používání jsem se rozhodl sepsat recenzi.</p>
<p><span id="more-446"></span></p>
<p>Vytvořit chytré hodinky se snaží hromada výrobců. Nekterým se to daří lépe a některým hůře. U Pebble na to šli trochu jinak. Hodinky jsou v podstatě pouze externí zobrazovací jednotkou pro mobilní telefon a navíc umějí zobrazovat kolik je aktuálně hodin. Nic víc, nic míň. Faktem zůstává, že ve chvíli, kdy výrobce konečně uvolní SDK hodinek a bude možné vytvářet vlastní aplikace, hodinky se možná stanou nečím více. Další věcí, kterou celý koncept hodinek trpí jsou různá softwarová omezení operačních systémů mobilních telefonů, které zážitek z používání hodinek trochu kazí. Ale pojďme se na ne podívat podrobněji.</p>
<h2><b>Design</b></h2>
<p>Design na první pohled působí levným a strohým dojmem, který se na první pohled neliší od jiných levných digitálních hodinek. Celoplastová konstrukce, která je z vnější strany lesklá je okamžitě plná otisků prstů a pokud své hodinky nebudete pravidelně čistit, budou působit upatlaným dojmem, což jim na exkluzivitě nepřidá. Gumový pásek hodinek exkluzivnímu vzhledu také moc nepřidá.</p>
<p><a href="http://jiri.kratochvil.eu/wp-content/2013/05/IMG_25413.jpg"><img decoding="async" class="aligncenter size-thumbnail wp-image-443" alt="Pebble" src="http://jiri.kratochvil.eu/wp-content/2013/05/IMG_25413-150x150.jpg" width="150" height="150" /></a></p>
<p>Hodinky mají zaoblený tvar, který je doplněn o čtveřici tlačítek, kterými je možné hodinky ovládat. Na levém boku je tlačítko Zpět, kterým je zároveň možné aktivovat podsvícení displeje. Na straně druhé jsou tlačítka tři. Horní a dolní slouží o posun textu, popř. pohyb v menu nebo přepnutí typu zobrazovaného číselníku hodinek. Prostřední tlačítko slouží pro vstup do menu. Tlačítka jsou velká s dobře hmatatelná i po slepu. Na levé straně se, kromě tlačítka zpět, nacházejí ještě magnetické kontakty pro dobíjení, podobně jako u Mac booků je konektor MagSafe. Zde bych si dovolil výtku k síle použitých magnetů, která je nedostatečná a nabíjecí konektor se i při sebemenším pohybu hodinek odpojí.</p>
<p>Displej je černobílý a dobře čitelný. Proklamace, že se jedná o e-Paper displej je poněkud matoucí. Může totiž vyolat dojem, že se jedná o displej, který používají elektronické čtečky knih (např. Amazon Kindle). V Pebble je použit transreflektivní LCD displej. Ten je také dobře čitelný na slunci a spotřebu má minimální. O proti eInk technologii navíc umožňuje animaci a není potřeba při překreslování obnovit celý displej.</p>
<p>Přijemnou vecí je vestavěný akcelerometr, který v současnosti slouží pouze k aktivování podsvícení displeje pohybem rukou nebo klepnutím na displej hodinek. Potěší i vybrační motorek, který signalizuje příchozí hovory, SMS a podobně. Jen by na můj vkus mohl být jemnější. Přeci jen, zápěstí je dostatečně citlivé a nepotřebuji při každé SMS mít pocit, že se mi někdo snaží utrhnout ruku.</p>
<h2>Spolupráce s telefonem</h2>
<p>Pebble se vůči telefonu tváří jako klasické Bluetooth zařízení. A v tom je také kámen úrazu. Nevím, jak to funguje na Androidích telefonech, ale u iPhonu je nastavování spolupráce hodinek s telefonem hromada omezení a workaroundů. Aplikace Pebble, kterou je nutné nainstalovat v neumí zatím nic jiného než instalovat nové ciferníky a aktualizovat software hodinek. Vše ostatní je nutno provést ručně a troufám sí říci, že laik by s tím nemusí umět poradit. Zejména i pro to, že některé chování je úplně nestandardní.</p>
<p>Faktem je, že ty standarní notifikace, jako je příjem hovorů, SMS nebo iMessage, vše funguje korektně a správně. Když vám někdo volá, pohledem na hodinky zjistite kdo a pomocí příslušného tlačítka na hodinkách hovor můžete odmítnout nebo přijnout. To samé je se zprávami, které si můžete číst přímo na displeji hodinek. Pěkné.</p>
<p>U ostatních aplikací je to jinak. A bohužel horší. Obecně nastavování notifikací na hodinkách je v případě iOS řešeno jistým workaroundem, a to, že musíte vypnout a zapnout zobrazování notifikací na zamčené obrazovce, když máte připojené hodinky přes bluetooth. Pak vše funguje tak, jak má. Jenže pokud se hodinkami vzdálíte od telefonu a spojení mezi telefonem se přeruší, musíte toto kolečno pro všechny aplikace absolvovat znovu a znovu, kdykoliv se spojení přeruší. Opruz, který mě přestal okamžitě bavit. Abych byl fér, je potřeba se v tomto zastat Pebble. Jedná se o omezení operačního systému telefonu a nejšíš tedy neřešitelný problém.</p>
<p>A když už jsme u notifikací, je to ještě jedna věc. A tou je diakritika. Znaky s háčkem nebo čáskou se na displeji hodinek zobrazují jako čtverečky. Ale na to si už našinec muse chtě nechtě zvyknout.</p>
<h2><b>Používání</b></h2>
<p>K dílenskému zpracování jsem se už vyjádřil. Teď ještě ke gumovému pásku, který jsem už zmiňoval. Prostě není dobrý. Ruka se pod mín potí. Navíc je řemínek tak krátký, že ho musím mít zapnutý na předposlední dírce. Přeska, která pak má držet konec pásku tak, aby netrčel a nepřekážel, přestává plnit svou funkci.</p>
<p>Co je však dokonalé je to, kvůli čemu hodinky vznikly. Zobrazování notifikací z telefonu. Celý zažitek je pak umocněn v kombinaci s hands-free, kdy hovor můžete zvednout pomocí hodinek, SMS jízdenku revizorovi ukázat na hodinkách. Můžete si pouštět, přepínat a zastavovat muziku (aktuálně přehrávaná písnička se zobrazuje na displeji hodinek). Telefon má autonomní budík, který budí vybracemi. Výhodou je vodotěsnost hodinek do pěti atmosfér. Na potápění to není, ale zaplavat si do bazénu klidně.  Fajn je také možnost měnit si ciferníky hodinek podle nálady a věřím, že až se uvolní SDK, spusta vývojářů (včetně mě) se pustí do vývoje aplikací, který umocní zážitek z používání hodinek. Potenciál ne nekonečný. Běžci, cyklisté, bruslaři. Ti všichni by ocenili mít aktuální informace o svém výkonu na svém zápěstí.</p>
<p><a href="http://jiri.kratochvil.eu/wp-content/2013/05/IMG_2544.jpg"><img decoding="async" class="aligncenter size-thumbnail wp-image-444" alt="Pebble ve vodě" src="http://jiri.kratochvil.eu/wp-content/2013/05/IMG_2544-150x150.jpg" width="150" height="150" /></a></p>
<p>Výdrž baterií je podle výrobce týden. Já musel baterii nabíjet po čtyřech dnech. Výrobce však tvrdí, že se jedná o chybu ve firmware, a že ji opraví updatem. Kde jsem to jen už slyšel?</p>
<h2><b>Závěrem</b></h2>
<p>Na hodinky jsem si velice rychle zvykl a i přes některé omezení jsou skvělým doplňkem, díky kterému nebudete muset při každém zazvonění telefonu jej vytahovat z kapsy, ale jen pohledem na ruku zjistíte, jestli má smysl se v danou chvíli telefonem zabývat. Na škodu je jeho laciný vzhled (díky použítí lesklých plastů). Uvidíme, jak budou vypada barevné varialnty, ale obávám se, že lakovaný plast nebude o moc větší výhrou. Ovšem to, co se skrývá uvnitř plastového šasi, překoná veškeré nedostatky. Koupit, či nekoupit? Na tuhle otázku nelze jednoznačně odpovědět. Asi bych poradil počkat ještě pár měsící. Cena jistě půjde dolů, výrobce vychytá některé mouchy a začnou vznikat nové aplikace.</p>
<p>Pebble mají před sebou obrovský potenciál, ale i dlouhou cestu k dokonalosti. A já jsem rád, že jsem u toho díky Kickstarteru mohl být.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/recenze-chytre-hodinky-pebble/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">446</post-id>	</item>
		<item>
		<title>Snězte žábu aneb dělejte ty nejdůležitější úkoly ráno</title>
		<link>https://jiri.kratochvil.eu/snezte-zabu/</link>
					<comments>https://jiri.kratochvil.eu/snezte-zabu/#respond</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Thu, 09 May 2013 11:20:34 +0000</pubDate>
				<category><![CDATA[Návody]]></category>
		<category><![CDATA[GTD]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[Metodiky]]></category>
		<category><![CDATA[Ze života]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=433</guid>

					<description><![CDATA[Jedna z vynikajicích knížek o produktivitě se jmenuje Eat That Frog od Briana Tracyho. Hlavní myšlenka téhle knížky je, že ty nejdůležitější úkoly  by měly být [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Jedna z vynikajicích knížek o produktivitě se jmenuje <a href="http://amzn.to/16iSa9M">Eat That Frog</a> od Briana Tracyho. Hlavní myšlenka téhle knížky je, že ty nejdůležitější úkoly  by měly být řešeny hned jako první věc, kterou se ráno rozhodneme udělat, protože zbytek dne se pak bude jevit jako snadný. Brian Tracy tuhle činnost ve své knize nazývá &#8222;snězení žáby&#8220; (ating your frog), k čemu, podle svých slov, došel tak, že &#8222;pokud první věcí, kterou ráno uděláte, bude snězení živé žáby, zbytek dne budete trávit s vědomím, že s největší pravděpodobností již máte za sebou tu nejhorší věc, která vás tento den mohla potkat.&#8220;</p>
<p><span id="more-433"></span></p>
<p>Vaše &#8222;žába&#8220; je ten nejdůležitější a možná i nejkomplikovanější úkol, který musíte vyřešit. Jakmile se zbavíte tohoto úkolu, ty ostatní úkoly bude snadné dokončit. Stejně tak to můžete brát tak, že vaše dnešní práce už je hotová.Brian to celé staví do kontextu boje s prokrastinací. Já osobně jsem si tenhle přístup velmi oblíbil a úspěšně si navykl tuhle metodu využívat. Totiž začít úkolem, který bych s největší pravděpodobnosti odkládal, způsobí, že ty ostatní úkoly, bude jednoduché dokončit, protože v porovnání s tím prvním jsou snadné a jsou tak vlastně za odměnu.</p>
<p>A tuhle metodu můžeme posunout ještě na vyšší úroveň tím, že první věc, kterou bychom měli dělat je ta, která přiblíží k dokončení našeho velkého úkolu nebo dosažení cíle. Brian tento, řekněme rozšířený přístup, stručně ve své knize zmiňuje, ale ze zkušenosti vím, že tenhle přístup je mnohem více zaměřen na plnění úkolů než je jen boj s prokrastinací.</p>
<h2><b>Návyk plnění nejdůležitějšího úkolu jako prvního</b></h2>
<p>Jedná se o velmi jednoduchý návyk, který je však extrémně účinný, pokud jej aplikujete každý den. Pracováním na vašem největším úkolu každý den, nevyhnutelně vede k tomu, že  se dostaví úspěch. Obzvláště, pokud se zaměříte na ty nejdůležitější úkoly a dáte do nich veškerou energii. Ke splnění vašich cílů se pak dostanete mnohem rychleji než čekáte. Tenhle zvyk má totiž řada úspěšných lidí a podle mého názoru tohle je právě ta vlastnost, která je činí úspěšnými. A pracovat dopoledne je pro většinu lidí snadnější zejména z těchto úkolů:</p>
<ul>
<li>V této části dne máte nejvíc energie (zejména pokud jste se dobře vyspali)</li>
<li>Jste mnohem méně vyrušováni</li>
<li>Jste mnohem více koncentrován</li>
</ul>
<p>Další výhodou &#8222;jezení žáby&#8220; každý den je to, že se prakticky okamžitě zbavíte stresu z nesplněných úkolů a váš mozek se nebude muset zabývat tím, co je nutno ještě během dne zvládnout. Jen si to představte, jak je stresující vědomí, že na konci dne nemáte hotové X, Y a Z, oproti tomu, když jste tyto úkoly splnili už ráno, kdy jste měli ještě spoustu energie a nikdo vás u toho nevyrušoval.</p>
<p>Největším problémem &#8222;jezení žády&#8220; má většina lidí v tom, že neumí určit úkol, na který se zaměřit. Abyste to zvládli musíte se naučit definovat vaše cíle. Pár pěkných knížek k tomuto tématu je na amazonu (<a href="http://amzn.to/10HZnaU">Goals!</a> a <a href="http://amzn.to/YGXaCB">The Power of Story</a>). Já se tomuto tématu budu věnovat v některém z dalších článků. Pro začátek, pokud pracujete v běžné firmě, zkuste se zeptat svého nadřízeného na jaký úkol byste se měli zaměřit. Je důležité uvědomit si, co je vlastně produktivita a jak ji docílit. Produktivním se stanete ve chvíli, kdy svůj čas trávíte na úkolech, které vás <b>posunují směrem ke splnění vámi stanovených cílů</b>.Takže abyste byli produktivní, musíte pracovat na tom, co vede k jakémukoliv cíli v budoucnosti, ideálně v tak, abyste ke splnění cílů spotřebovali co možná nejméně času. Toho docílíte tím, že strávíte váš nejproduktivnější čas plněním právě nejdůležitějších úkolů.</p>
<h2><b>Ráno nemám čas!</b></h2>
<p>Chápu ten problém. Ráno se probudíte v sedm hodin a v devět dorazíte do práce. Kde najít čas na pracování na osobních projektech, které máte naplánovány, když je mám dělat ráno? Řešení je jednoduché, prostě vstávejte dříve. Hromada lidí díky tomu slaví úspěch, a to včetně mě. V jednom z mých připravovaných článků se zabývám ranním vstáváním detailněji. Teď jen v kostce. Ranní vstávání je zvyk stejně jako cokoliv jiného. Začátky bolí, ale když si na to zvyknete, bude to snadné. Uvědomte si, že pokud vstanete jen o hodinu dříve, váš den se okamžitě prodlouží o jednu hodinu, za kterou se dá zvládnout hromada věcí!</p>
<p>Uvědomte si, že vaše investice se ve výsledku násobí. Už Albert Einstein napsal, že <em>&#8222;úrok z úroku je tu největší silou ve vesmíru.&#8220;</em> Začněte dne, vstávejte dříve a pracujte hned z rána na nejdůježitějších úkolech a zvládnete i ty největší cíle.</p>
<p>Jak už jsem uvedl, klíčem k tomu, abyste byli schopni vstávat dříve, je rozklíčovat náš spánkový režim. Kolik hodin spánku ve skutečnosti potřebujete? Potřebná doba spánku u dospělého člověka se pohybuje mezo 7-9 hodinami. Naplánujte si svůj čas v posteli podle toho. Řekněme, že chodíváte spát kolem půlnoci, vstáváte v sedm a v práci jste v devět. Zkuste vstát o hodinu dříve, tedy v šest. Aniž bychom snížili dobu našeho spánku, měli bychom být v posteli už v jedenáct. Hodina v noci vám stejně chybět nebude. Sáhněme si do svědomí, jak takový čas obyčejně trávíme. Nebudu daleko od pravdy, když budu hádat televizi, počítačové hry a podobně, že?</p>
<h2><b>Uvedení do praxe</b></h2>
<p>Myšlenka &#8222;jezení žáby&#8220; může být aplikována nejen na vaše osobní projekty, ale zejména i práci. Hned, jak přijdete do práce, začněte pracovat na těch nejdůležitějších úkolech. Prostě, jakmile &#8222;sníte žáby svých osobních projektů&#8220;, je čas udělat to samé i v práci.</p>
<p>Osobně jsem zvyklý pracovat od v režimu 9:00-17:00 a vstávám ráno kolem šesté. V půl sedmé je čas pracovat na svých osobních projektech, večer jsem totiž moc unavený na nich pracovat, a kromě toho mi v tom brání i rodinné důvody, takže ráno, zatímco ostatní spí, já se věnuji svým soukromým projektům. Je to jedno z nejlepších rozhodnutí, které jsem kdy v životě udělal.</p>
<p>Ráno si můžu jít zaběhat, protože se chystám na maraton. To mi zabere tak 50 minut včetně sprchy. Pak se vrhnu na své další osobní aktivity. Může to být cokoliv. Zaplatit účty, zkontrolovat probíhající rekonstrukci domu a zahrady, uklidit garáž. A než dorazím do práce, mám skvělý pocit z toho, že jsem už zvládl udělat hromadu skvělé práce. A protože tento trend nechci pokazit rovnou se vrhám na své žáby v práci a během následujících dvou hodit se soustředím na své největší pracovní úkoly.</p>
<p>Mezitím se přiblíží poledne a s ním čas na oběd s kolegy. A teprve potom si pustím emailový klient a vyřeším kupu e-mailů, které se mi za dopoledne nahromadily. Určitě jste to už slyšeli, ale hlavně nekontrolujte svou e-mailovou schránku hned poté, co dorazíte do práce. Neexistuje lepší zabíječ produktivity než právě toto.</p>
<h2><b>Jak začít</b></h2>
<p>V následující části se podíváme na to, jak začít používat tuto techniku.</p>
<p><b>1. Sepište seznam úkolů, na které se chystáte během zítřka, a které vedou ke splnění vašich cílů (nejprve se pusťte do soukromých projektů a pak to samé udělejte i pro pracovní část svého života).</b> Zkuste si položit následující otázky:</p>
<ul>
<li>Jaké aktivity mi přinášejí největší užitek?</li>
<li>Co mohu udělat pouze já, a pokud to udělám správně, budu cítit velký rozdíl?</li>
<li>S činnosti považujete za nejefektivněji strávený čas aby vás posunul nejruchleji k vašim aktuálním cílům?</li>
</ul>
<p><b>2. Odpověď na poslední otázku je vaše největší žába.</b> S tímhle úkolem začnete hned zítra ráno.</p>
<p><b>3. Připravte sami sebe na zítřejší plnění úkolu.</b> Naplánujte si, jakým způsobem splníte tento úkol zítra ráno. Připravte si všechny potřebné nástroje a pomůcky.</p>
<p>Což pro některé úkoly to může znamenat, vstát dříve nebo dorazit do kanceláře o něco dříve. Uděljte to, pokud si myslíte, že se tím zvýší pravděpodobnost, že nebudete ničím a nikým rozptylováni a vy se budete moci plně soustředit na splnění úkolu.</p>
<p><b>4. Na konci pracovního dne, pokračujte opět od bodu 1.</b> Každý (pracovní) den.</p>
<p>Celé tohle vám zabere maximálně pět minut, ale změní to dramaticky váš život. Zkuste to a dejte vědět, jak vám tahle jednoduchá technika pomohla zvýšit vaši produktivitu.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/snezte-zabu/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">433</post-id>	</item>
		<item>
		<title>Testování JMS v unit testech</title>
		<link>https://jiri.kratochvil.eu/testovani-jms-v-unit-testech/</link>
					<comments>https://jiri.kratochvil.eu/testovani-jms-v-unit-testech/#respond</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Tue, 29 Mar 2011 19:03:46 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Návody]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[JMS]]></category>
		<category><![CDATA[JNDI]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Messaging]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Tipy]]></category>
		<category><![CDATA[Transaction Manager]]></category>
		<category><![CDATA[Unit test]]></category>
		<category><![CDATA[Weblogic]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=389</guid>

					<description><![CDATA[Dnes jsem strávil skoro celý den tím, že jsem potřeboval vyřešit následující problém. Mám aplikaci, která poměrně sofistikovaně využívá několik JMS front pro asynchronní zpracování [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Dnes jsem strávil skoro celý den tím, že jsem potřeboval vyřešit následující problém. Mám aplikaci, která poměrně sofistikovaně využívá několik JMS front pro asynchronní zpracování požadavků z klientských aplikací. Celé je to postavené nad serverem Weblogic a aplikace využívá frameworku Spring. Další komplikací je, že veškeré fronty jsou v aplikačním kontextu získávány z JNDI, včetně konektivity do databáze. Na následujících řádcích zkusím popsat, jak jsem se s tímto problémem popasoval. Budu rád za jakékoliv reakce, co jsem měl udělat lépe a co jsem udělal špatně.<br />
<span id="more-389"></span><br />
Abych se vyhnul polemice, co je a co není unit testování a jestli nemám špatně navrženou aplikaci, když musím řešit JMS, JNDI apod., pak vězte, že implementaci jsem nepsal a implementaci jsem nesměl refaktorovat, protože se jednalo o celkem zásadní funkcionalitu, která se nachází těsně před ostrým nasazením a můj projektový vedoucí se obával toho, že kdybych provedl nějaký větší refactoring, mohlo by to způsobit v této fázi projektu více škody nežli užitku. </p>
<p>Ale i přesto bylo potřeba do této implementace doimplementovat několik požadavků. Rozhodl jsem se nejprve stávající implementaci pokrýt testy tak, abych tím, co tam doplním nerozbil to, co již funguje. A zde jsem trochu narazil. Implementace tohoto modulu je velice těsně spjata s JMS implementací Weblogicu a navíc tak, že se jedná o několik front, které jsou vzájemně propojeny a zpráva zkrze ně postupně &#8222;propadává&#8220; podle definovaných pravidel. </p>
<p>Abych to celé byl tedy schopen spustit jako unit test, musel jsem vyřešit pár &#8222;drobností&#8220;, a to poskytovatele <strong>JNDI kontextu</strong>, <strong>transaction manager</strong> a vlastní implementaci <strong>JMS</strong>. Pro JNDI kontextu jsem jednoduše využil prostředků Springu. Pro transakční manager jsem využil <a href="http://docs.codehaus.org/display/BTM/Home">Bitronix Transaction Manager</a> a pro messagingové služby padlo rozhodnutí na <a href="http://activemq.apache.org/">Apache ActiveMQ</a>.</p>
<h2>JNDI kontext</h2>
<p>Vytvoření vlastního JNDI kontextu je ve Springu triviální úloha. Já jsem si pro to napsal jednoduchou utilitku, která mi ji ještě více zjednodušuje:</p>
<pre lang="java">
package eu.kratochvil.utils.spring;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.mock.jndi.SimpleNamingContextBuilder;

import java.util.HashMap;
import java.util.Map;

/**
 * Simple implementation of JNDI context that should be used in unit-tests
 * within Spring context.
 * <p/>
 * Basic usage is simple:
 * 
 * &lt;bean id="jndiContext" class="cz.isvs.reg.ros.ws.repository.util.MockSpringJndiContext"&gt;
 *   &lt;property name="jndiContext"&gt;
 *      &lt;map&gt;
 *          &lt;entry key="ros.VstupniFronta" value-ref="destinationVstupniFronta"/&gt;
 *          &lt;entry key="ros.VystupniFronta" value-ref="destinationVystupniFronta"/&gt;
 *          &lt;entry key="weblogic.jms.XAConnectionFactory" value-ref="activeMQConnectionFactory"/&gt;
 *      &lt;/map&gt;
 *   &lt;/property&gt;
 * &lt;/bean&gt;
 *
 * There isn't needet to use something like <code>jndi.properties</code> because jndi context is define
 * directly inside spring context. 
 *
 * @author Jiri Kratochvil (jiri.kratochvil@jetminds.com)
 */
public class MockSpringJndiContext implements InitializingBean {

    public static final Logger logger = LoggerFactory.getLogger(MockSpringJndiContext.class);

    Map<String, Object> jndiContext = new HashMap<String, Object>();

    public void setJndiContext(Map<String, Object> jndiContext) {
        this.jndiContext = jndiContext;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        logger.info("Initializing JNDI context");
        SimpleNamingContextBuilder builder = SimpleNamingContextBuilder.emptyActivatedContextBuilder();
        for (Map.Entry entry : jndiContext.entrySet()) {
            logger.debug("Binding {} in JNDI context", entry.getKey().toString());
            builder.bind(entry.getKey().toString(), entry.getValue());
        }
    }
}
</pre>
<p>Použití je pak naprosto triviální:</p>
<pre lang="xml">
    <bean id="jndiContext" class="cz.isvs.reg.ros.ws.repository.util.MockSpringJndiContext">
        <property name="jndiContext">
            <map>
                <entry key="jms.queue1" value-ref="destinationQueue1"/>
                <entry key="jms.queue2" value-ref="destinationQueue2"/>
                <entry key="weblogic.jms.XAConnectionFactory" value-ref="connectionFactory"/>
            </map>
        </property>
    </bean>
</pre>
<p>Inicializací tohoto springového beanu se vytvoří JNDI kontext, který obsahuje dvě JMS fronty a ještě connection factory, o které budu mluvit dále. Pokud použijete Spring není potřeba dále definovat jak se k JNDI kontextu připojit, což se běžně dělá pomocí property souboru <code>jndi.properties</code> umístěném na classpath.</p>
<h2>JMS server</h2>
<p>Dále tedy potřebujeme vytvořit instanci embedovaného JMS serveru. Pro mé účely jsem zvolil <a href="http://activemq.apache.org/">Apache ActiveMQ</a>, který jde snadno inicializovat pomocí Springu, kde to vypadá následovně:</p>
<pre lang="xml">
   <!-- Definice message brokeru -->
    <amq:broker useJmx="false" persistent="false">
        <amq:transportConnectors>
            <amq:transportConnector uri="tcp://localhost:8888"/>
        </amq:transportConnectors>
    </amq:broker>

    <!-- Connection Factory pro message broker -->
    <bean id="activeMQConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://localhost:8888"/>
    </bean>

    <!-- Vlastni definice front -->
    <amq:queue id="destinationQueue1" physicalName="jms.queue1"/>
    <amq:queue id="destinationQueue2" physicalName="jms.queue2"/>

    <!-- listener pro zachytavani vyjimek z JMS (implemetnace rozhrani javax.jms.ExceptionListener) -->
    <bean id="jmsExceptionListener" class="eu.kratochvil.blog.ukazky.JmsExceptionListenerImpl" />

    <!-- Springova implementace connection factory, ktera bude vyuzita pro registraci listeneru a pro 
            posilani zprav prostrednictvim springove JmsTemplate -->
    <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
        <constructor-arg ref="activeMQConnectionFactory"/>
        <property name="exceptionListener" ref="jmsExceptionListener"/>
        <property name="sessionCacheSize" value="100"/>
    </bean>
</pre>
<p>Popis co a proč je použito v předchozím listingu jsou přímo v něm, tedy ve stručnosti. Vytvořili jsme si instanci message brokeru, který nám nahrazuje vlastní JMS server v aplikačním serveru, následně jsme zadefinovali jednotlivé fronty, které jsou použity ve vlastní implementaci business logiky a konečně connection factory, která nám umožní napojení vlastních listenerů JMS front a zároveň přes ni budeme posílat testovací zprávy z našit unit testů. </p>
<p>Nyní bych se ještě vrátil k tomu, proč jsem do JNDI kontextu umístil <code>weblogic.jms.XAConnectionFactory</code>. Důvod je takový, že aplikace, které využívají JMS ve Weblogiku by měli referenci na connection factory získávat právě z JNDI. </p>
<h2>Transaction Manager</h2>
<p>Poslední věc, kterou musíme vyřešit bez aplikačního serveru je transaction manager &#8211; tedy &#8222;něco&#8220;, co nám bude řídit vlastní transakce. Na to jsem použil <a href="http://docs.codehaus.org/display/BTM/Home">Bitronix Transaction Manager</a> což je celkem mocná implementace transakčního manažeru. Pro naše účely bude použití triviální:</p>
<pre lang="xml">
      <!--  Bitronix Transaction Manager embedded configuration -->
    <bean id="btmConfig" factory-method="getConfiguration" class="bitronix.tm.TransactionManagerServices">
        <property name="serverId" value="spring-btm" />
        <property name="journal" value="null" />
    </bean>

    <!-- create BTM transaction manager -->
    <bean id="bitronixTransactionManager" factory-method="getTransactionManager"
        class="bitronix.tm.TransactionManagerServices" depends-on="btmConfig,dataSource"
        destroy-method="shutdown" />

    <bean id="transactionManager"
        class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="transactionManager" ref="bitronixTransactionManager" />
        <property name="userTransaction" ref="bitronixTransactionManager" />
        <property name="allowCustomIsolationLevels" value="true" />
    </bean>
</pre>
<h2>Závěrem</h2>
<p>Kouzlo tohoto použití je v tom, že nyní stačí spustit unit test, který inicializuje springový kontext a zároveň načte definici kontextu vlastní aplikace, která právě využívá JNDI pro získání referencí na fronty a vše by mělo fungovat stejně, jako kdybychom tuto implementaci měli deployovanou přímo na aplikačním serveru. Pro úplnost dodávám ukázku definice kontextu přímo v aplikaci:</p>
<pre lang="xml">
    <!-- ===================== JNDI =========================================== -->
    <jee:jndi-lookup id="jmsConnectionFactory" jndi-name="weblogic.jms.XAConnectionFactory"/>
    <jee:jndi-lookup id="vstupniFronta" jndi-name="jms.queue1"/>
    <jee:jndi-lookup id="vystupniFronta" jndi-name="jms.queue2"/>

    <!-- JTA transakce -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

    <!-- ===================== FRONTY ========================================= -->
    <bean id="jmsTemplate" class="corg.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="jmsConnectionFactory"/>
        <property name="messageConverter" ref="simpleMessageConverter"/>
    </bean>

    <bean id="simpleMessageConverter" class="org.springframework.jms.support.converter.SimpleMessageConverter"/>

    <bean id="destinationResolver" class="org.springframework.jms.support.destination.BeanFactoryDestinationResolver"/>

    <jms:listener-container connection-factory="jmsConnectionFactory" transaction-manager="transactionManager"
                            destination-resolver="destinationResolver"
                            message-converter="simpleMessageConverter">
        <jms:listener destination="destinationQueue1" ref="messageBroker" method="processVstupni"
                      selector="MessageType='test1'"/>
        <jms:listener destination="destinationQueue2" ref="messageBroker" method="processVystupni"
                      selector="MessageType='test2'"/>
    </jms:listener-container>

    <bean id="messageBroker" class="eu.kratochvil.blog.ukazky.MyMessageBroker" />
</pre>
<p>Na celém tomto cvičení je pěkné to, že jednoduchou springovou konfigurací jsme schopni rozchodit určitou část aplikace, která za normálních okolností nelze bez aplikačního serveru spustit, a my si tak můžeme napsat testy, které lze snadno spouštět bez neustálého a otravného redeploymentu na aplikační server.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/testovani-jms-v-unit-testech/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">389</post-id>	</item>
		<item>
		<title>Autentizace webových služeb JAX-WS na Weblogicu</title>
		<link>https://jiri.kratochvil.eu/autentizace-webovych-sluzeb-jax-ws-na-weblogicu/</link>
					<comments>https://jiri.kratochvil.eu/autentizace-webovych-sluzeb-jax-ws-na-weblogicu/#respond</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Tue, 01 Mar 2011 19:22:26 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Návody]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Weblogic]]></category>
		<category><![CDATA[WS]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=369</guid>

					<description><![CDATA[V dnešním návodu se zaměřím na to, jakým způsobem zajistit autentizaci webových služeb vystavených na Weblogicu ve verzi 10.3.3, i když tento návod bude fungovat [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>V dnešním návodu se zaměřím na to, jakým způsobem zajistit autentizaci webových služeb vystavených na Weblogicu ve verzi 10.3.3, i když tento návod bude fungovat i ve verzích vyšších (a i nižších). Cílem je použít pouze standardní prostředky aplikačního serveru. A jako drobný bonus bude ukázka, jak vystavit webovou službu.<br />
<span id="more-369"></span><br />
Nejprve si tedy vystavíme libovolnou webovou službu pomocí JAX-WS. Základem je do našeho mavenního projektu přidat potřebné knihovny: </p>
<pre lang="xml">
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   ...
    <dependencies>
   ...
        <dependency>
            <groupId>javax.xml</groupId>
            <artifactId>jaxws-api</artifactId>
            <version>2.0EA3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.sun.xml</groupId>
            <artifactId>jaxws-rt</artifactId>
            <version>2.0EA3</version>
            <scope>provided</scope>
        </dependency>
   ...
    </dependencies>
 </project>
</pre>
<p>Jako <em>scope</em> těchto knihoven uvedeme, že jsou provided, což v praxi znamená, že knihovny budou použity pro kompilaci, ale nezaintegrují se do výsledného balíku. To proto, že Weblogic má tyto knihovny vlastní a naším cílem je použít právě implementaci aplikačního serveru. </p>
<h2>Implementace webových služeb</h2>
<p>Nyní si vytvořime a vystavíme vlastní webové služby. Služby budou definovány svým rozhraním a implementací. Rozhraní webové služby pak může vypadat třeba takto:</p>
<pre lang="java">
package eu.kratochvil.clanky.ws;

import javax.jws.*;

@WebService(targetNamespace = "http://schema.kratochvil.eu", name = "TestService")
public interface TestService {

    @WebMethod
    String sayHello(@WebParam(name = "name") String name);

}
</pre>
<p>A ještě implementace vlastní &#8222;business logiky&#8220;:</p>
<pre lang="java">
package eu.kratochvil.clanky.ws;

import javax.jws.WebService;

@WebService(endpointInterface = "eu.kratochvil.clanky.ws.TestService")
public class TestServiceImpl implements TestService {

    @Override
    public String sayHello(String name) {
        return "Hello " + name + "!";
    }
}
</pre>
<p>Z implementace je zřejmé, co naše služba dělá a není potřeba nějak složitě popisovat. Důležité jsou anotace <em>WebService</em> a <em>WebMethod</em>, které nám popisují vlastní rozhraní webové služby. Další anotace, jako je například <em>WebParam</em> a podobně složí k přesnému popsání a definici kontraktu webové služby a v budoucnu o tom napíšu nějaký článek. Do té doby doporučuji použít <a href="http://jax-ws.java.net/">dokumentaci</a>.</p>
<p>Posledním krokem je konfigurace našeho webového archívu. K tomu slouží znamý <em>web.xml</em>, který je klasicky umístěn v adresáři WEB-INF naší aplikace a ještě <em>sun-jaxws.xml</em>.</p>
<p>Soubor _web.xml_ bude obsahovat následující:</p>
<pre lang="xml">
    <listener>
        <listener-class>
            com.sun.xml.ws.transport.http.servlet.WSServletContextListener
        </listener-class>
    </listener>
    <servlet>
        <servlet-name>jaxws</servlet-name>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>jaxws</servlet-name>
        <url-pattern>/testService</url-pattern>
    </servlet-mapping>
</pre>
<p>Tímto donutíme weblogic, aby vystavil servlet, který bude handlovat naše webové služby. Samozřejmě je možné použít v definici patternu znaky wildcard například takto:</p>
<pre lang="xml">
    <servlet-mapping>
        <servlet-name>jaxws</servlet-name>
        <url-pattern>/ws/*</url-pattern>
    </servlet-mapping>
</pre>
<p>Pak budou servletem pro webové služby zpracován jakýkoliv požadavek, podle zadané masky (například <em>/ws/users</em> nebo <em>/ws/loans</em>). </p>
<p>Poslední konfigurační soubor, který musíme vytvořit, aby nám začaly korektně fungovat webové služby je <em>sun-jaxws.xml</em>, který je také umístěn v adresáři WEB-INF naší aplikace. Jeho podoba je následující:</p>
<pre lang="xml">
<endpoints
        xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime'
        version='2.0'>
    <endpoint
            name='myService'
            implementation='eu.kratochvil.clanky.ws.TestServiceImpl'
            url-pattern='/testService'/>
</endpoints>
</pre>
<h2>Zabezpečení webové služby</h2>
<p>Nyní se konečně dostáváme k tomu, jak zabezpečit webové služby pomocí standardních prostředků aplikačního serveru Weblogic. Nejprve se přihlásíme do konzole aplikačního serveru, kde se proklikáme na správu uživatelů přes menu pomocí položky <em>Security Realms</em>. Následně vybereme konkrétní realm (defaultně <em>myrealm</em>). Na záložce <em>Users and Groups</em> si založíme uživatele, kterým se chceme autentizovat pro využívání našich webových služeb. </p>
<p><a href="http://jiri.kratochvil.eu/wp-content/2011/03/Screen-shot-2011-03-01-at-19.57.10.png"><img fetchpriority="high" decoding="async" src="http://jiri.kratochvil.eu/wp-content/2011/03/Screen-shot-2011-03-01-at-19.57.10-300x267.png" alt="" title="Nový uživatel" width="300" height="267" class="aligncenter size-medium wp-image-377" /></a></p>
<p>V našem případě jsme si vytvořili uživatele test, kterého zařadíme do nějaké, námi vytvořené skupiny (například <em>TestGroup</em>). </p>
<p><a href="http://jiri.kratochvil.eu/wp-content/2011/03/Screen-shot-2011-03-01-at-19.58.10.png"><img loading="lazy" decoding="async" src="http://jiri.kratochvil.eu/wp-content/2011/03/Screen-shot-2011-03-01-at-19.58.10-300x206.png" alt="" title="Zařazení uživatele do skupiny" width="300" height="206" class="aligncenter size-medium wp-image-380" /></a></p>
<p>Tímto máme základní konfiguraci aplikačního serveru hotovou a dalším krokem bude nastavení naší aplikace. Úplně nejjednodušší cestou je přidání následujících několika řádků do souboru <em>web.xml</em>:</p>
<pre lang="xml">
    <security-constraint>
        <display-name>Security for WS</display-name>
        <web-resource-collection>
            <web-resource-name>WSPOST</web-resource-name>
            <description>
            </description>
            <url-pattern>/testService</url-pattern>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>TestGroup</role-name>
        </auth-constraint>
    </security-constraint>
    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>myrealm</realm-name>
    </login-config>
    <security-role>
        <role-name>TestGroup</role-name>
    </security-role>
</pre>
<p>Zde definujeme, co chceme zabezpečit, jaká skupina uživatelů je oprávněna používat naše služby apod. Pokud náš projekt nyní zkompilujeme a nasadíme na aplikační server, měli bychom být dotázání na heslo ve chvíli, kdy se pokusíme zavolat naši webovou službu, což si můžete vyzkoušet například pomocí skvělého nástroje <a href="http://www.soapui.org/">SoapUI</a>.</p>
<p>V článku jsem záměrně nepoužíval nic jiného než jen <em>JAX-WS</em>, tedy žádný Spring Security ani nic podobného. Výhodou je, že se vám tímto přístupem zjednoduší deployment a hlavně získáte skvělé možnosti, jak vaší aplikaci zaintegrovat do firemní infrastruktury, bez složitého nastavování. Weblogic vám totiž nastaví admin serveru, který Vám zároveň vytvoří i nějakou roli, kterou pak následně budete ve své aplikaci využívat. No a správa uživatelů a hesel pro aplikace, které vaše služby budou využívat je také věc administrátora. Navíc lze samozřejmě aplikační server klientské aplikace nastavit tak, aby autentizaci prováděl pro aplikaci transparentně, takže odpadá složitá správa hesel na obou stranách, ale o tom zase někdy příště.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/autentizace-webovych-sluzeb-jax-ws-na-weblogicu/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">369</post-id>	</item>
		<item>
		<title>Generated sources by JAXB and problem with encoding</title>
		<link>https://jiri.kratochvil.eu/generated-sources-by-jaxb-and-problem-with-encoding/</link>
					<comments>https://jiri.kratochvil.eu/generated-sources-by-jaxb-and-problem-with-encoding/#comments</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Mon, 21 Feb 2011 18:03:23 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Návody]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[linkedin]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=359</guid>

					<description><![CDATA[I recently had to solve the problem with JAXB to generate bad source from XSD. The problem was basically that the XSD source from which [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I recently had to solve the problem with JAXB to generate bad source from XSD. The problem was basically that the XSD source from which they were subsequently generated Java code contained in the tag <xs:documentation> Czech diacritics characters, and unfortunately, the output files were not generated in the UTF-8, but the native format of operating system of my laptop, which is MacCentralEurope.<br />
<span id="more-359"></span><br />
What hapened when I then started building my code with Maven, I obviously &#8211; I had got exception that the generated files contain non-UTF characters. So I started investigation how to force the JAXB to generate source code in UTF-8 instead of using platform specific encoding.</p>
<p>A quick look into the source code JAXB again assured me that JAXB is not (politely spoken) the best written piece of software because there is something like this:</p>
<pre lang="java">
private final CharsetEncoder encoder = EncoderFactory.createEncoder(bw.getEncoding());
</pre>
<p>This piece of code always returns encoder by platform depend encoding and there is no way, how to force different encoding and only one way is to tell JVM wat encoding is the right one.</p>
<p>Fortunately, the solution is easy. Just set the system variable MAVEN_OPTS like this:</p>
<pre lang="Bash">
export MAVEN_OPTS="$MAVEN_OPTS -Dfile.encoding=UTF-8"
</pre>
<p>What surprised me that this issue is not documented, and even Google could not help me. So I hope these few lines will help to someone.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/generated-sources-by-jaxb-and-problem-with-encoding/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">359</post-id>	</item>
		<item>
		<title>SSL in Jetty plug-in</title>
		<link>https://jiri.kratochvil.eu/ssl-in-jetty-plug-in/</link>
					<comments>https://jiri.kratochvil.eu/ssl-in-jetty-plug-in/#respond</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Wed, 20 Oct 2010 06:00:11 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Návody]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Tipy]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=342</guid>

					<description><![CDATA[Yesterday I had a chat with my colleague. We talked about how the Maven Jetty plug-ins enable SSL. In my last article I described how [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Yesterday I had a chat with my colleague. We talked about how the Maven Jetty plug-ins enable SSL. In my last article I described how to enable SSL in Tomcat, so now let&#8217;s see how to achieve the same result in the Jetty plugin.<br />
<span id="more-342"></span><br />
It is a few simple steps.</p>
<p>At first we have to create a keystore with a server certificate:</p>
<pre lang="bash">
keytool-genkey-alias-jetty6 keyalg RSA-keystore target / jetty-ssl.keystore-storepass changeit-keypass changeit-DNAME "CN = Your Domain Name"
</pre>
<p>Then modify the configuration of the Maven pom.xml:</p>
<pre lang="xml">
<plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>maven-jetty-plugin</artifactId>
    <configuration>
        <contextPath>/context</contextPath>
        <scanIntervalSeconds>5</scanIntervalSeconds>
        <connectors>
            <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
                <port>8080</port>
                <maxIdleTime>60000</maxIdleTime>
            </connector>
            <connector implementation="org.mortbay.jetty.security.SslSocketConnector">
                <port>8443</port>
                <maxIdleTime>60000</maxIdleTime>
                <keystore>${project.build.directory}/jetty-ssl.keystore</keystore>
                <password>changeit</password>
                <keyPassword>changeit</keyPassword>
            </connector>
        </connectors>
    </configuration>
</plugin>
</pre>
<p>In the previous configuration, we defined the connection on port 8080 and port 8443 for SSL connections.</p>
<p>If we did not want to manually generate a server certificate, you can use other Maven plugin as shown below.</p>
<pre lang="xml">
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>keytool-maven-plugin</artifactId>
    <executions>
        <execution>
            <phase>generate-resources</phase>
            <id>clean</id>
            <goals>
                <goal>clean</goal>
            </goals>
        </execution>
        <execution>
            <phase>generate-resources</phase>
            <id>genkey</id>
            <goals>
                <goal>genkey</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <keystore>${project.build.directory}/jetty-ssl.keystore</keystore>
        <dname>cn=localhost</dname>
        <keypass>changeit</keypass>
        <storepass>changeit</storepass>
        <alias>jetty6</alias>
        <keyalg>RSA</keyalg>
    </configuration>
</plugin>
</pre>
<p>Now, when we invoke <code>mvn jetty: run</code> command, plug-in automatically creates a certificate that is then used in Jetty.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/ssl-in-jetty-plug-in/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">342</post-id>	</item>
		<item>
		<title>How to enable HTTPS on Tomcat</title>
		<link>https://jiri.kratochvil.eu/https-on-tomcat/</link>
					<comments>https://jiri.kratochvil.eu/https-on-tomcat/#respond</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Mon, 11 Oct 2010 09:12:41 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Návody]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Tomcat]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=332</guid>

					<description><![CDATA[In this article I would like to describe how to enable SSL support in Tomcat. Basically it is a few steps, but there will be [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>In this article I would like to describe how to enable SSL support in Tomcat. Basically it is a few steps, but there will be recorded for cases when some of my colleague asked me <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br />
<span id="more-332"></span><br />
The first step is  creating a server certificate. It is possible to create in two different ways. Either you can create &#8222;self-signed certificate&#8220; or you can import certificate issued by some certification authority.</p>
<p>In this article we will create a self-signed certificate and then configure Tomcat to use the certificate. This configuration is enough for development.</p>
<p>For creating a server certificate, we will use <code>keytool</code> utility  of the JDK.</p>
<p>On Windows</p>
<pre lang="bash">%JAVA_HOME%binkeytool-genkey-alias tomcat-keyalg RSA</pre>
<p>On Linux</p>
<pre lang="bash">$JAVA_HOME/bin/keytool-genkey-alias tomcat-keyalg RSA</pre>
<p>Then uncomment the file server. (XML configuration file of Tomcat) this section:</p>
<pre lang="xml">
<!-- Define a SSL HTTP/1.1 Connector on port 8443          
        This connector uses the JSSE configuration, when using APR, the           
        connector should be using the OpenSSL style configuration           
       described in the APR documentation -->
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
</pre>
<p>And thats all. Your server supports both in SLL and non-SSL connections.</p>
<h2>Forcing SSL</h2>
<p>In case you need to make all connections to your application has been secured with SSL, and even when a user enters the address only as <strong>http</strong> you can use the following. </p>
<p>Edit the web.xml file of your application by adding the following element:</p>
<pre lang="xml">
<security-constraint>
        <display-name>AppOverSSL</display-name>
        <web-resource-collection>
            <web-resource-name>
                ResourceName
            </web-resource-name>
            <url-pattern>/</url-pattern>
            <http-method>POST</http-method>
            <http-method>GET</http-method>
        </web-resource-collection>
        <user-data-constraint>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
    </security-constraint>
</pre>
<p>Don&#8217;t forget to define right port number for SSL in your server.xml file in attribute <strong>redirectPort</strong> of element that is defined your unsecured connection:</p>
<pre lang="xml">
    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL HTTP/1.1 Connector on port 8080
    -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
</pre>
<p>Now when users use non-secured connection is redirected on HTTPS connection.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/https-on-tomcat/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">332</post-id>	</item>
		<item>
		<title>Problem with Java Server Faces on JDK 1.6</title>
		<link>https://jiri.kratochvil.eu/problem-with-java-server-faces-on-jdk-1-6/</link>
					<comments>https://jiri.kratochvil.eu/problem-with-java-server-faces-on-jdk-1-6/#respond</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Tue, 21 Sep 2010 08:34:36 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Návody]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[Tipy]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=325</guid>

					<description><![CDATA[On my new project, I had a problem with the web application deployment, which consisted of the classic combination of Java Server Faces, Spring Framework, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>On my new project, I had a problem with the web application deployment, which consisted of the classic combination of Java Server Faces, Spring Framework, iBatis. I guess it was because I asked Google&#8217;s bad, but I spent it, how to solve this problem, some time, so they deserve an entry in my blog.</p>
<p>So what was the problem? Once I tried to deploy to Tomcat, I got this error message:</p>
<pre lang="inifile">
java.lang.ClassNotFoundException: [Ljava.lang.String;
at org.apache.catalina.loader.WebappClassLoader.loadClass (WebappClassLoader.java: 1645)
at org.apache.catalina.loader.WebappClassLoader.loadClass (WebappClassLoader.java: 1491)
at com.sun.faces.config.ConfigureListener.configure (ConfigureListener.java: 635)
at com.sun.faces.config.ConfigureListener.configure (ConfigureListener.java: 422)
        ...
</pre>
<p>I tried various queries, but I was not successful. When I lost hope, I found the following link, which is described <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6434149"> bug in JDK </a>.</p>
<p>Before I come across this error, because the last one was a web application to JDK 1.5, where everything works fine. So if anybody knows this bug, I offer the &#8222;official workaround.</p>
<p>Just pass the JVM startup parameter:</p>
<pre lang="shell">-Dsun.lang.ClassLoader.allowArraySyntax = true</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/problem-with-java-server-faces-on-jdk-1-6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">325</post-id>	</item>
		<item>
		<title>JAX-WS a SOAP Attachments</title>
		<link>https://jiri.kratochvil.eu/jax-ws-a-soap-attachments/</link>
					<comments>https://jiri.kratochvil.eu/jax-ws-a-soap-attachments/#respond</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Sat, 06 Feb 2010 06:08:16 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Návody]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[JAX-WS]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[MTOM]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SOAP-Attachment]]></category>
		<category><![CDATA[Tipy]]></category>
		<category><![CDATA[Weblogic]]></category>
		<category><![CDATA[WS]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=253</guid>

					<description><![CDATA[Pokud potřebujete poslat přes webovou službu trochu víc dat, než je pár detailů o klientovi, je dobré tyto data posílat jako SOAP attachment a ne [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Pokud potřebujete poslat přes webovou službu trochu víc dat, než je pár detailů o klientovi, je dobré tyto data posílat jako SOAP attachment a ne přímo v nějakém tagu samotné zprávy. A přesně to, jsem se snažil řešit na projektu. Používáme JAX-WS a aplikace běží to na Weblogicu Server. Weblogic je znamý tím, že si &#8222;sem-tam&#8220; některé knihovny upraví k obrazu svému a pak se výsledek může chovat trochu jinak, než by člověk mohl čekat. Nevím, zda se v mém případě jednalo o nějakou lahůdku Weblogicu, ale postup k cíli nebyl vůbec přímočarý.<br />
<span id="more-253"></span><br />
Typická služba vypadá takto:</p>
<pre lang="java">
import ...

@WebService(targetNamespace = "http://schemas/wsdl")
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL)
public interface Documentation {

    @WebMethod
    @WebResult(name = "receiveDocument")
    @XmlMimeType("application/octet-stream")
    DataHandler getDocument(
            @WebParam(name = "documentId",
                    targetNamespace = "http://schemas/wsdl",
                    mode = WebParam.Mode.IN) Integer documentId);
}
</pre>
<p>a následná implementace:</p>
<pre lang="java">
import ...

@WebService(serviceName = "Documentation", endpointInterface = "Documentation")
@SchemaValidation
public class DocumentationImpl  implements Documentation {

    @Override
    public DataHandler getDocument(Integer documentId) {
        return getService().getDocument(documentId);
    }
}
</pre>
<p>Pokud chceme používat SOAP attachmentů, můžeme využít implementace od SUNu (vlastně teď Oraclu). Souhrnně se této technice říká <a href="http://en.wikipedia.org/wiki/Message_Transmission_Optimization_Mechanism">Message Transmission Optimization Mechanism</a> (zkráceně MTOM) a právě SUN nabízí pro tyto účely implementaci pro JAX-WS (upozorňuji, že třeba v AXISu to funguje úplně jinak).</p>
<p>Vše se tváří naprosto triviálně &#8211; stačí jako jeden výstupní parametr použít s typem <code>javax.activation.DataHandler</code>, nastavit u tohoto parametru pomocí <code>javax.xml.bind.annotation.XmlMimeType</code> správný content type a celou třídu oanotovat pomocí <code>@MTOM</code>. Vše by mělo zázračně začít fungovat. Jenže ono to nefunguje.</p>
<p>Ač o tom není v dokumentaci ani zmínka záleží na tom, kde se anotace umístí. Tato anotace se totiž neumisťuje do interface, kde bych to očekával, ale přímo do třídy, která implementuje naše rozhraní této webové služby. Abychom nám začali fungovat attachmenty, upravíme příklad, který jsem uvedl na začátku tohoto článku:</p>
<pre lang="java">
import ...

@MTOM
@StreamingAttachment(parseEagerly = true, memoryThreshold = 40000L)
@WebService(serviceName = "Documentation", endpointInterface = "Documentation")
@SchemaValidation
public class DocumentationImpl  implements Documentation {

    @Override
    public DataHandler getDocument(Integer documentId) {
        return getService().getDocument(documentId);
    }
}
</pre>
<p>Přidal jsem dvě anotace: <code>@MTOM</code> a <code>@StreamingAttachment(...)</code>. Ta první aktivuje tuto funkčnost a od nyní se všechny atributy typu <code>DataHandler</code> budou přenášet jako SOAP attachment. Anotaci <code>@StreamingAttachment(...)</code> využijeme v případě, že budeme přenášet skutečně velké soubory a posílání souboru nám bere moc paměti. A ještě jedna chytrá věc-v anotaci <code>@MTOM</code> je parametr <code>threshold</code>, který říká, od jaké velikosti se daný element pošle jako SOAP attachment a kdy se pošle přímo v elementu samotné zprávy.</p>
<p>Na závěr ještě ukázku, jak pak vypadají data ze služby:</p>
<pre lang="XML">
HTTP/1.1 200 OK
Date: Sat, 06 Feb 2010 07:46:28 GMT
Transfer-Encoding: chunked
Content-Type: multipart/related;start="<rootpart*783e56c7-ff09-40d8-91cd-d0ec0ce9555e@example.jaxws.sun.com>";type="application/xop+xml";boundary="uuid:783e56c7-ff09-40d8-91cd-d0ec0ce9555e";start-info="text/xml"
X-Powered-By: Servlet/2.5 JSP/2.1

--uuid:783e56c7-ff09-40d8-91cd-d0ec0ce9555e
Content-Id: <rootpart*783e56c7-ff09-40d8-91cd-d0ec0ce9555e@example.jaxws.sun.com>
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"
Content-Transfer-Encoding: binary

<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Body>
    <ns2:getDocumentResponse xmlns:ns2="http://schemas/wsdl">
      <receiveDocument>
        <Include xmlns="http://www.w3.org/2004/08/xop/include" href="cid:383e4726-8e85-4a46-a917-23811ec4ef3e@example.jaxws.sun.com"/>
      </receiveDocument>
    </ns2:getDocumentResponse>
  </S:Body>
</S:Envelope>
--uuid:783e56c7-ff09-40d8-91cd-d0ec0ce9555e
Content-Id: <383e4726-8e85-4a46-a917-23811ec4ef3e@example.jaxws.sun.com>
Content-Type: application/pdf
Content-Transfer-Encoding: binary

%PDF-1.4
.
.
.
%%EOF

--uuid:783e56c7-ff09-40d8-91cd-d0ec0ce9555e-
</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/jax-ws-a-soap-attachments/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">253</post-id>	</item>
		<item>
		<title>Řízení vývoje – Metodika Scrum</title>
		<link>https://jiri.kratochvil.eu/rizeni-vyvoje-metodika-scrum/</link>
					<comments>https://jiri.kratochvil.eu/rizeni-vyvoje-metodika-scrum/#comments</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Mon, 18 Jan 2010 02:28:00 +0000</pubDate>
				<category><![CDATA[Návody]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[Agilní programování]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[Metodiky]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Tipy]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=245</guid>

					<description><![CDATA[Před nedávnem jsme na projektu zavedli metodiku Scrum. Jedná se o metodiku, která se řadí mezi agilní metodiky pro řízení vývoje. Zájímavé na této metodice [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Před nedávnem jsme na projektu zavedli metodiku Scrum. Jedná se o metodiku, která se řadí mezi agilní metodiky pro řízení vývoje. Zájímavé na této metodice je to, že částečně eliminuje roli projektového managera a zodpovědnost za dodávku nechává v rukou samotných vývojářů.<br />
<span id="more-245"></span><br />
Na první pohled může to, co jsem uvedl znít &#8222;divoce&#8220;, ale už za pár dní jsem nabyl pocitu, &#8222;ze to může fungovat&#8220;. </p>
<p>Nejprve trochu terminologie. Samotný termín Scrum je odvozen od názvu tzv. mlýnu, který sportovní fanoušci mohou znát z rugby. Pro nesportovce (jako jsem třeba já)- jedná se o takový útvar, kdy se hráči postaví do zástupu a rozehrávají hru tím, že se mezi ně hodí míč a oni se o něj poperou. Dalšími termíny jsou pigs (prasata) a chickens (kuřata). Pigs jsou programátoři a chicken ti nad nimi (projekťáci, architekti, sponzoři projektu&#8230;).   </p>
<p>Celý proces vývoje se dělí na tzv. sprinty, což jsou období dlouhá několik týdnů (obyčejně tři až čtyři, ale může to být i delší). Pro tento sprint existuje plán úkolů, který se připraví do tzv. backlogu. V rámci sprintu si programátoři berou jeden úkol za druhým a postupně je realizují. Důležité je, aby doba realizace jednotlivých úkolů trvala ideálně jeden den. Navíc programátoři mohou do backlogu přidávat další úkoly, které je nutné realizovat během vývoje. </p>
<h2>Jak to celé funguje?</h2>
<p>Na počátku každého sprintu/etapy se svolá plánovací schůzka. Výsledkem této schůzky je plán pro příští sprint v takové formě, že s ním souhlasí každý člen týmu. Tento plánovací meeting je naplánován na celý den a povinně se účastní všichni &#8222;pigs&#8220;. Mohou být pozváni i zástupci z řad &#8222;chicken&#8220;, ti však nejsou oprávněni diskutovat. Je také vhodné pozvat zástupce z řad &#8222;business vlastníka&#8220; (zadavatel nebo analytik)</p>
<p>Tento meeting může být rozdělen do dvou částí. V první části se prochází jeden úkol backlogu za druhým a diskutuje se o tom, jak jej implementovat, co to má vlastně dělat apod. Jak bylo již uvedeno, právě pro tuto fázi je ideální, aby se této části meetingu zúčastnili i zástupci z business analytiků. Ti jsou tak však pouze od toho, aby zodpovídali dotazy.</p>
<p>V druhé části se jednotlivé úkoly ohodnocují body podle náročnosti. K tomuto účelu jsme s výhodou využili klasických hracích karet, kdy každý z členů měl k dispozici karty v hodnotě A, 2, 3, 5, 8 a K. Karty (kromě K) značí bodovou hodnotu, Král znamená &#8222;nelze realizovat&#8220;. Členové týmu u každého požadavku naráz ukáží kartu s jejich předpokladem (naráz proto, aby se nemohli ovlivňovat). Tuto &#8222;hru&#8220; můžeme nazvat třeba &#8222;hodnotící poker&#8220;. Důležité je, aby ve výsledku všichni členové týmu souhlasili s výslednou bodovou hodnotou. Tyto hodnoty se zapisují ke každému požadavku a stávají se závaznými. V našem týmu jsme tyto dvě etapy sloučili do jedné a přišlo mi to efektivnější.</p>
<p>Při hodnocení je důležité určit si převodní jednotku &#8211; tedy to, co vlastně znamená právě jeden bod. U nás je problém, že se nám nepodařilo úkoly rozdělit na tak atomické úkoly, že by měl jeden zabrat maximálně jeden den. Stanovili jsme tedy, že jeden bod znamená 0,5MD. </p>
<p>Dalším důležitým krokem určení tzv. velocity, což je zjednodušeně řečeno výkonnost týmu. Ta se počítá v různých jednotkách. V našem případě ji přepočítáváme na body, které reflektují pracnost úkolu, kterou jsme si určili na plánovacím meetingu pomocí hodnotícího pokeru. Vlastní velocita pak říká, kolik těchto bodů jsme schopni zrealizovat během jedné iterace (sprintu). </p>
<p>Během vlastní iterace(sprintu) se každý den uspořádá schůzka, které se říká scrum a vede ji Scrummaster. Délka této schůzky je striktně omezena na 15 minut. Během této schůzky každý vývojář odpoví na tři otázky: </p>
<ul>
<li>Co jsi udělal od poslední schůzky?</li>
<li>Co plánuješ udělat dnes? </li>
<li>Vyskytly se nějaké překážky, které bránily dokončení Tvého předhozího úkolu?</li>
</ul>
<p>Důležité je, že na této schůzce se případné problémy pouze identifikují, jejich řešení probíhá mimo scrum. Důvod je logický &#8211; nebudeme zdržovat ostatní členy týmu záležitostmi, které se jich přímo nedotýkají. A poslední věc: Scrumy je potřeba provádět ve stoje. Důvod je jednoduchý, relativně snadno se tím zabrání tomu, aby se účastníci scrumu rozpovídali (pokud nezabírá pořádat scrum ve stoje, pořádejte ho třeba v ruštině-uvidíte, že všichni budou rázem stručnější). Pokud je více týmů/scrumů, pořádá se ještě tzv. Scrum of Scrum. Na této schůzce Scrummasteři reportují problémy a status ze &#8222;svých&#8220; scrumů. A ještě jedna důležitá věc ke scrumům. Scrumy jsou určeny pouze pro členy týmů-projekťáci, sponzoři apod. se zúčastnít mohou, ale nesmí do schůzky nikterak zasahovat.</p>
<p>Na konci sprintu se pak uspořádá schůzka, kde se zhodnotí uplynulá iterace a diskutují se problémy, které se vyskytly během právě uplynulé iterace a hledá se jejich řešení. </p>
<p>Výhodou této metodiky je to, že zapojíme programátory přímo do procesu vývoje, navíc programátoři získají část zodpovědnosti za realizaci díla, termíny a kvalitu. Díky tomu nemají pocit, že by byli jen cvičenými opicemi. Další celkem důležitou záležitostí je fakt, že manažeři projektu ztratí část pravomocí, které se deleguje přímo na projektový tým. Manager pak má pouze funkci kontrolní, což ne vždy může být pro projektového manažera akceptovatelné. S tím se pojí nejdůležitější věc na celém procesu zavedení této metodiky. Vedení projektu musí plně důvěřovat vývojovému týmu, tomuto procesu vývoje a nesnažit se zavádět do této metodiky postupy, které znají ze své běžné praxe. </p>
<p>Uvidíme na konci projektu, jestli nám tato metodika pomohla lépe a s větší efektivitou zvládnout tu obrovskou horu práce, kterou realizujeme-určitě pak podám report. A co Vy? Používáte nějaké agilní metodiky vývoje (nebo i konzervativní)? Pokud ano, jaké s nimi máte zkušenosti?</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/rizeni-vyvoje-metodika-scrum/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">245</post-id>	</item>
	</channel>
</rss>
