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

<channel>
	<title>AspectWorks Blog &#187; Java</title>
	<atom:link href="http://www.aspectworks.com/cs/blog/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.aspectworks.com/cs/blog</link>
	<description>Blog o softwarovém vývoji</description>
	<lastBuildDate>Fri, 23 Jul 2010 07:02:06 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JUnit result interceptor</title>
		<link>http://www.aspectworks.com/cs/blog/2010/07/junit-result-interceptor/</link>
		<comments>http://www.aspectworks.com/cs/blog/2010/07/junit-result-interceptor/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 09:18:40 +0000</pubDate>
		<dc:creator>Luboš Račanský</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Testování]]></category>

		<guid isPermaLink="false">http://www.aspectworks.com/cs/blog/?p=648</guid>
		<description><![CDATA[Před nějakou dobou jsme psali o vlastní anotaci @AfterFailure v JUnit testech. Naší motivací byly screenshoty neúspěšných selenium testů. JUnit od verze 4.7 má svoje řešení jménem TestWatchman.
TestWatchman je v podstatě interceptor, který můžete zavěsit na události failed, finished, starting a succeeded. Ukažme si na následujícím příkladě, jak zareagovat na neúspěšný test a zjistit jméno [...]]]></description>
			<content:encoded><![CDATA[<p>Před nějakou dobou jsme psali o vlastní <a href="http://www.aspectworks.com/cs/blog/2010/04/junit-anotace-afterfailure/">anotaci @AfterFailure v JUnit testech</a>. Naší motivací byly screenshoty neúspěšných selenium testů. JUnit od verze 4.7 má svoje řešení jménem <a href="http://kentbeck.github.com/junit/javadoc/latest/org/junit/rules/TestWatchman.html">TestWatchman</a>.<span id="more-648"></span></p>
<p>TestWatchman je v podstatě interceptor, který můžete zavěsit na události <em>failed, finished, starting a succeeded</em>. Ukažme si na následujícím příkladě, jak zareagovat na neúspěšný test a zjistit jméno třídy a název testu. Tento string používáme jako jméno screenshotu v našich selenium testech. Metoda failed se volá jak při assertationFailed tak při výjimce.</p>
<pre class="brush: java;">
import static junit.framework.Assert.fail;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.MethodRule;
import org.junit.rules.TestWatchman;
import org.junit.runners.model.FrameworkMethod;

public class MyTest {

	@Rule
	public MethodRule watchman = new TestWatchman() {
		@Override
		public void failed(Throwable e, FrameworkMethod method) {
			String methodName = MyTest.this.getClass().getSimpleName() + &quot;.&quot; + method.getName();
			System.out.println(methodName + &quot; has failed!&quot;);
		}
	};

	@Test
	public void testFailed() {
		fail();
	}

}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/cs/blog/2010/07/junit-result-interceptor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Selenium a návrhový vzor Page Objects</title>
		<link>http://www.aspectworks.com/cs/blog/2010/06/selenium-a-navrhovy-vzor-page-objects/</link>
		<comments>http://www.aspectworks.com/cs/blog/2010/06/selenium-a-navrhovy-vzor-page-objects/#comments</comments>
		<pubDate>Tue, 29 Jun 2010 22:08:38 +0000</pubDate>
		<dc:creator>Pavel Müller</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.aspectworks.com/cs/blog/?p=623</guid>
		<description><![CDATA[Selenium používáme úspěšně už několik posledních projektů. Vždycky byly automatizované testy přínosem pro kvalitu aplikace a ušetřily obrovské množství rutinní práce testerům. Představa, že lze vytvořit Selenium test tak, že se &#8220;nakliká&#8221;, a pak ho už budeme jen dokola pouštět, vezme hodně rychle za své. Je jasné, že některé části testů bude potřeba použít několikrát [...]]]></description>
			<content:encoded><![CDATA[<p>Selenium používáme úspěšně už několik posledních projektů. Vždycky byly automatizované testy přínosem pro kvalitu aplikace a ušetřily obrovské množství rutinní práce testerům. Představa, že lze vytvořit Selenium test tak, že se &#8220;nakliká&#8221;, a pak ho už budeme jen dokola pouštět, vezme hodně rychle za své. Je jasné, že některé části testů bude potřeba použít několikrát a že <a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself">DRY princip</a> platí i zde. Nakonec stejně nezbývá nic než použít skriptovací nebo programovací jazyk a Selenium testy udržovat jako každý jiný kód. Jak ale testy navrhovat a strukturovat? S tím jsme se nějakou dobu potýkali. Až jsem objevil návrhový vzor <a href="http://code.google.com/p/selenium/wiki/PageObjects">Page Objects</a>.<br />
<span id="more-623"></span></p>
<p>Pro představu. Máme za úkol pokrýt testy funkčnost založení uživatele. Máme dvě poměrně jednoduché obrazovky:</p>
<p><strong><em>Seznam uživatelů</em></strong>:</p>
<p><a href="http://www.aspectworks.com/cs/blog/wp-content/uploads/2010/06/userList2.png"><img class="alignnone size-medium wp-image-240" title="User List" src="http://www.aspectworks.com/cs/blog/wp-content/uploads/2010/06/userList2.png" alt="" width="600" height="284" /></a></p>
<p><strong><em>Vytvoření nového uživatele</em></strong>:</p>
<p><a href="http://www.aspectworks.com/cs/blog/wp-content/uploads/2010/06/userCreate.png"><img class="size-full wp-image-240 alignleft" title="New User" src="http://www.aspectworks.com/cs/blog/wp-content/uploads/2010/06/userCreate.png" alt="" width="600" height="284" /></a></p>
<p>Jeden test bude na pozitivní scénář založení uživatele. Další test bude na založení uživatele s existujícím uživatelským jménem. Potud je to dobré a vystačili bychom si i s naklikanými testy. Ale jak se začnou množit další scénáře vyžadující založeného uživatele, začínáme se dostávat do problémů. Editovat uživatele, smazat uživatele, zablokovat uživatele, založit požadavek s uživatelem s příslušnou rolí, atd. Původně jsme to řešili privátními metodami v rámci test třídy. To ale nestačí, pokud potřebuji např. založit uživatele v rámci jiného testu. Tak si začnu vytvářet různé helper třídy, ale v tu chvíli v tom začíná být trochu zmatek. Člověk neví, jestli daný kód napsat do helper třídy nebo přímo do testu. Nebyli jsme s tímto stavem spokojeni.</p>
<p>Page Objects návrhový vzor to krásně řeší. Zjednodušeně vytvářím dva druhy tříd. Testy a stránky (Page Object). Page obsahuje metody, které znamenají služby, jaké stránka nabízí z pohledu uživatele. Např. tlačítka, vyplnění formuláře, odkazy, atd. Další metody umožňují zjišťovat stav, v jakém se stránka nachází. Např. počet záznamů v tabulce, přítomnost chybové hlášky, atd. Všechny tyto metody jsou implementovány pomocí Selenium API.</p>
<p>Testy samotné pak naopak nepoužívají Selenium API vůbec. Pouze sestavují testovací scénář voláním sérií služeb na jednotlivých stránkách. A pak také obsahují veškeré asserty. Zjistí stav pomocí metody na stránce a ověří ho. Asserty nepatří do stránky a zase Selenium volání nepatří do testu. S těmito jednoduchými pravidly se dají vytvářet velmi přehledné a čitelné testy.</p>
<p>Tady je příklad na otestování funkce založení uživatele v <a href="http://www.orinoco.cz/">Orinoco</a> platformě.</p>
<p>Stránka odpovídající formuláři na založení uživatele:</p>
<pre class="brush: java;">
@Page
public class CreateUserPage extends AbstractOrinocoPage {

    @Override
    public boolean isValidPage() {
        return selenium.isElementPresent(&quot;page_user__createUser__do&quot;);
    }

    public CreateUserPage fillForm(TestUser user) {
        selenium.type(&quot;username&quot;, user.getUserName());
        selenium.type(&quot;password&quot;, user.getPassword());
        selenium.type(&quot;confirmedPassword&quot;, user.getPassword());
        for (String userType : user.getUserTypes()) {
            selenium.addSelection(&quot;name=roles&quot;, &quot;value=&quot; + userType);
        }
        selenium.type(&quot;firstName&quot;, user.getFirstName());
        selenium.type(&quot;lastName&quot;, user.getSurname());
        selenium.type(&quot;email&quot;, user.getEmail());
        return this;
    }

    public UserListPage create() {
        clickAndWait(&quot;common_action_create_button&quot;);
        return navigateTo(UserListPage.class);
    }

}
</pre>
<p>Jsou tam implementovány dvě &#8220;služby&#8221;. Vyplnění formuláře a stisknutí tlačítka Create. Všimněte si, že zde se přímo používá Selenium API. Dobré bývá také pracovat s daty tak, že jsou zapouzdřené do objektů. Na jednom z projektů jsme dokonce použili přímo DTO objekty, protože už byly hotové a odpovídaly přesně formulářům. Chybí metoda pro Storno tlačítko, ale to nevadí. Doplní se, až bude potřeba pro nějaký scénář. Předek této třídy dává tušit, že bude obsahovat metody odpovídající hlavnímu menu a celému záhlaví.</p>
<p>Takto vypadá Page objekt pro seznam uživatelů:</p>
<pre class="brush: java;">

@Page
public class UserListPage extends AbstractOrinocoPage {

    @Override
    public boolean isValidPage() {
        return selenium.isElementPresent(&quot;page_user__listUsers__do&quot;);
    }

    public CreateUserPage createUser() {
        clickAndWait(&quot;//a[@href='createUser.do']&quot;);
        return navigateTo(CreateUserPage.class);
    }

    public TableControl getUserTable() {
        return getTableControl();
    }

}
</pre>
<p>Je tu implementována jenom jedna metoda na přidání nového uživatele. Za zmínku určitě stojí navigace. Každá metoda, která něco dělá s aplikací, vrací objekt typu Page. Buď vrací novou stránku při přechodu nebo sebe sama, pokud browser zůstává na stejné stránce. Metoda getUserTable() jenom zjišťuje stav na stránce. TableControl je pomocný objekt na práci s tabulkami. Ani na jedné ze stránek není jediný assert. Ten přísluší Test třídě.</p>
<p>Test case pro správu uživatelů:</p>
<pre class="brush: java;">
public class UserManagementTest extends AbstractOrinocoTest {

	private DashboardPage dashboardPage;

	@Before
	public void login() {
		dashboardPage = loginPage.login(&quot;habele&quot;, &quot;a&quot;);
	}

	@Test
	public void createUser() {
		TestUser user = new TestUser(&quot;selAdmin&quot;, &quot;selAdmin&quot;, Arrays.asList(TestUserType.ADMIN),
				&quot;selAdmin&quot;, &quot;selAdmin&quot;, &quot;selAdmin@aspectworks.com&quot;, true);

		UserListPage userListPage = dashboardPage.openSettings().openUserManagement();
		CreateUserPage createUserPage = userListPage.createUser();
		createUserPage.fillForm(user).create();

		TableControl userTable = userListPage.getTableControl();
		TableRow row = userTable.getRow(user);
		assertNotNull(row);
		assertEquals(user.getUserName(), row.getCell(3));
	}

}
</pre>
<p>Test case má standardní průběh. Příprava testovacích dat, provedení testu a kontrola výsledku. Se stránkami se velmi dobře pracuje zřetězeně právě kvůli tomu, že metody zase vrací Page objekty. Test už vůbec nepracuje se Selenium API. Vše nechává uvnitř stránek.</p>
<p>Návrhový vzor Page Objects se velmi osvědčil. Je to přirozený návrh tříd podle uživatelského rozhraní. Testy se velmi snadno tvoří a čtou a znovupoužitelnost je velmi dobrá. Ze stránek se navíc dají tvořit další objekty vyšší úrovně zapouzdřující celé moduly. Lze pak třeba založit uživatele jedním řádkem a pokračovat ve psaní skriptu toho, co zrovna testujeme.</p>
<p>V tomto článku nebylo zmíněno ještě několik součástí, které jsou vidět ze zdrojových kódů. Jak jsou stránky a testy konfigurovány a jak jsou tvořeny instance? Jak probíhá navigace mezi stránkami? Jak ověřit, že se browser nachází na stránce, na které je volána metoda služby? Jak funguje TableControl? O tom zas někdy příště.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/cs/blog/2010/06/selenium-a-navrhovy-vzor-page-objects/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Generátor rodných čísel</title>
		<link>http://www.aspectworks.com/cs/blog/2010/05/generator-rodnych-cisel/</link>
		<comments>http://www.aspectworks.com/cs/blog/2010/05/generator-rodnych-cisel/#comments</comments>
		<pubDate>Thu, 13 May 2010 08:51:43 +0000</pubDate>
		<dc:creator>Pavel Müller</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Testování]]></category>

		<guid isPermaLink="false">http://www.aspectworks.com/cs/blog/?p=589</guid>
		<description><![CDATA[V poslední době se věnuji automatizovaným Selenium testům jednoho obchodního systému. Při vkládání osob do systému je nutné zadat rodné číslo a systém provádí jeho validaci a sleduje, jestli je v systému unikátní. Abych mohl automatizovat funkčnost zakládání osob, tak jsem se rozhodl, že vytvořím generátor rodných čísel. Není vše ale tak jednoduché, jak by [...]]]></description>
			<content:encoded><![CDATA[<p>V poslední době se věnuji automatizovaným Selenium testům jednoho obchodního systému. Při vkládání osob do systému je nutné zadat rodné číslo a systém provádí jeho validaci a sleduje, jestli je v systému unikátní. Abych mohl automatizovat funkčnost zakládání osob, tak jsem se rozhodl, že vytvořím generátor rodných čísel. Není vše ale tak jednoduché, jak by se mohlo zdát.</p>
<p><span id="more-589"></span>Obvykle každý ví, že rodná čísla se tvoří od roku 1954 ve tvaru <em>yymmdd/xxxx</em> a ta starší mají tvar <em>yymmdd/xxx</em>. Pokud je to žena, přičte se k měsíci 50. Také si každý myslí, že by mělo být rodné číslo dělitelné jedenáci. Ale zde je právě kámen úrazu. Vše je trochu jinak.</p>
<p>Poslední desátá číslice přidávaná od roku 1954 je kontrolní a tvoří se tak, že se vydělí devitimístné číslo jedenácti a zbytek po dělení se použije jako desátá kontrolní číslice. Tím je výsledné desetimístné číslo dělitelné jedenácti. Tedy v případě, že zbytek po dělení nebyl 10. V takovém případě je kontrolní číslice rovna 0, ale tím pádem není celé rodné číslo dělitelné jedenácti. Do roku 1985 bylo přiděleno cca 1000 rodných čísel, která nejsou 				dělitelná 11. Není vyloučeno, že se v minimálním počtu vyskytly i po 				tomto roce.</p>
<p>Navíc od roku 2004 je zavedena možnost v případě, že jsou v nějaký den vyčerpána všechna  platná čtyřčíslí, použít alternativní rodné číslo, u kterého mají muži k  číslu měsíce přičteno 20 a ženy 70. A i rodná čísla před rokem 1954 mohou mít čtyřčíslí, pokud se jednalo o dodatečně přidělená rodná čísla (např. při získání občanství).</p>
<p>Více informací třeba na <a title="Wikipedii" href="http://cs.wikipedia.org/wiki/Rodn%C3%A9_%C4%8D%C3%ADslo">Wikipedii</a> nebo na <a href="http://latrine.dgx.cz/jak-overit-platne-ic-a-rodne-cislo">tomto blogu</a>.</p>
<p>Většina aplikací se spokojí s ověřením dělitelnosti jedenácti. Ale to je evidentně špatně. Ještěže nemám tu smůlu a nemám nestandardní rodné číslo <img src='http://www.aspectworks.com/cs/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Napsal jsem pro účely Selenium testů generátor rodných čísel s několika možnostmi, jak číslo generovat:</p>
<ul>
<li>pro konkrétní datum a pohlaví</li>
<li>pro věkové rozpětí &#8211; vhodné třeba pro generování mladistvých</li>
<li>oficiální rodné číslo &#8211; dle výše popsaných pravidel</li>
<li>běžné rodné číslo &#8211; takové, které čeká většina aplikací &#8211; dělitelnost 11, standarní tvary</li>
<li>speciální rodné číslo &#8211; takové, které není běžné &#8211; vhodné pro test validace</li>
</ul>
<p>Ukázka použití generátoru:</p>
<pre class="brush: java;">

// generates random personal number from 1900 till today
String personalNumber = RcGenerator.generateRc();

// men between 18 and 30
personalNumber = RcGenerator.generateRcForAge(18, 30, Gender.MALE);

// common personal number modulo 11 == 0 which passes most validators
personalNumber = RcGenerator.generateRc(RcType.COMMON);
</pre>
<p>Přiložené třídy můžete volně použít. Budu rád, když najdete chyby nebo generátor vylepšíte, rozšíříte funkčnost a s kódem se zase podělíte.</p>
<p><a rel="attachment wp-att-594" href="http://www.aspectworks.com/cs/blog/2010/05/generator-rodnych-cisel/rcgenerator/"></a><a href="http://www.aspectworks.com/cs/blog/wp-content/uploads/2010/05/RcGenerator.zip">RcGenerator.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/cs/blog/2010/05/generator-rodnych-cisel/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>JUnit anotace @AfterFailure</title>
		<link>http://www.aspectworks.com/cs/blog/2010/04/junit-anotace-afterfailure/</link>
		<comments>http://www.aspectworks.com/cs/blog/2010/04/junit-anotace-afterfailure/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 11:07:42 +0000</pubDate>
		<dc:creator>Luboš Račanský</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Testování]]></category>

		<guid isPermaLink="false">http://www.aspectworks.com/cs/blog/?p=545</guid>
		<description><![CDATA[Na automatické testování GUI našeho produktu Orinoco používáme framework Selenium. Pro identifikaci a opravu chyby je často klíčové vědět, co uživatel(respektive selenium test) v okamžiku chyby viděl. Selenium umí uložit snímek obrazovky, ale jak definovat okamžik, kdy ho má vytvořit? Nechtěli jsme mít přesně definované, které obrazovky má pokaždé ukládat. Naopak jsme  chtěli snímek [...]]]></description>
			<content:encoded><![CDATA[<p>Na automatické testování GUI našeho produktu <a href="http://www.orinoco.cz">Orinoco</a> používáme framework <strong>Selenium</strong>. Pro identifikaci a opravu chyby je často klíčové vědět, co uživatel(respektive selenium test) v okamžiku chyby viděl. Selenium umí uložit snímek obrazovky, ale jak definovat okamžik, kdy ho má vytvořit? Nechtěli jsme mít přesně definované, které obrazovky má pokaždé ukládat. Naopak jsme  chtěli snímek jen v případě, když Selenium test selže. A k tomu právě lze využít vlastní anotaci <em>@AfterFailure</em>.<br />
<span id="more-545"></span><br />
Na začátku byla jasná představa: ukládat snímky obrazovky, pokud Selenium test selže. Zbývalo jen   doplnit metodu <i>Selenium#captureScreenshot(String)</i> na správné místo. Narazil jsem na zajímavý článek <a href="https://dev.youdevise.com/YDBlog/index.php?title=capture_screenshots_of_selenium_browser_&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1">Capture Screenshots of Selenium Failures</a>, který popisuje, jak anotaci @AfterFailure a vlastní Runner naprogramovat.</p>
<p>Pozor na pořadí anotací! Řešení popsané ve zmiňovaném článku volá nejprve metodu anotovanou @After a poté teprve @AfterFailure. To samo o sobě není problém, pokud stejně jako my v metodě anotované @After nevoláte metodu <i>Selenium#stop()</i>, která zavírá prohlížeč. To pak vám je získaný snímek obrazovky k ničemu. Rešení je jednoduché, stačí v runneru jen prohodit volání metod v metodě <i>#withAfters(FrameworkMethod, Object, Statement)</i>.
<pre class="brush: java;">
@Override
protected Statement withAfters(FrameworkMethod method, Object target, Statement statement) {
      statement = withAfterFailures(method, target, statement);
      return super.withAfters(method, target, statement);
}
</pre>
<p>Věřím, že vám snímky v případě selhání Selenium testů ušetří čas při opravování bugů.</p>
<p><em>Edit</em><br />
JUnit od verze 4.7 má svoje <a href="http://www.aspectworks.com/cs/blog/2010/07/junit-result-interceptor/">řešení jménem TestWatchman</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/cs/blog/2010/04/junit-anotace-afterfailure/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Unit testy nad in-memory databází</title>
		<link>http://www.aspectworks.com/cs/blog/2010/03/unit-testy-nad-in-memory-databazi/</link>
		<comments>http://www.aspectworks.com/cs/blog/2010/03/unit-testy-nad-in-memory-databazi/#comments</comments>
		<pubDate>Sun, 21 Mar 2010 13:02:31 +0000</pubDate>
		<dc:creator>Richard Šerý</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Testování]]></category>

		<guid isPermaLink="false">http://www.aspectworks.com/cs/blog/?p=496</guid>
		<description><![CDATA[Použití in-memory databází pro testování je poněkud kontroverzní téma, ale nedělejte rychlé soudy &#8211; Tomáš Piňos na svém blogu naznačuje, za jakých okolností má testování za pomoci in-memory databáze svoje opodstatnění. Nenechte si ujít zajímavý článek &#8220;Unit testy nad in-memory databází&#8220;.
]]></description>
			<content:encoded><![CDATA[<p>Použití in-memory databází pro testování je poněkud kontroverzní téma, ale nedělejte rychlé soudy &#8211; Tomáš Piňos na svém blogu naznačuje, za jakých okolností má testování za pomoci in-memory databáze svoje opodstatnění. Nenechte si ujít zajímavý článek &#8220;<a href="http://tom2ee-cs.blogspot.com/2010/02/unit-testy-nad-in-memory-databazi.html">Unit testy nad in-memory databází</a>&#8220;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/cs/blog/2010/03/unit-testy-nad-in-memory-databazi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rozbiješ build, seřve tě Tux!</title>
		<link>http://www.aspectworks.com/cs/blog/2010/03/rozbijes-build-serve-te-tux/</link>
		<comments>http://www.aspectworks.com/cs/blog/2010/03/rozbijes-build-serve-te-tux/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 13:14:38 +0000</pubDate>
		<dc:creator>Pavel Müller</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Jen tak]]></category>

		<guid isPermaLink="false">http://www.aspectworks.com/cs/blog/?p=467</guid>
		<description><![CDATA[
V AspectWorks jsme fanoušky kontinuální integrace. Píšeme unit testy, snažíme se o dobré pokrytí kódu a s každým commitem do SVN spouštíme integrační build. Aktuálně používáme TeamCity jako server na kontinuální integraci. O selhaných buildech nás doteď informovaly emaily,  Jabber, vyskakovací okýnka v Eclipse, atd. Nuda!
Teď jsme si ale pořídili tu správnou vychytávku na [...]]]></description>
			<content:encoded><![CDATA[<p><img  class="imageRight" src="http://www.aspectworks.com/cs/blog/wp-content/uploads/2010/03/tux21.png" alt="Tux Droid" title="Tux Droid" width="150" height="150" class="alignright size-full wp-image-491" /></p>
<p>V AspectWorks jsme fanoušky kontinuální integrace. Píšeme unit testy, snažíme se o dobré pokrytí kódu a s každým commitem do SVN spouštíme integrační build. Aktuálně používáme TeamCity jako server na kontinuální integraci. O selhaných buildech nás doteď informovaly emaily,  Jabber, vyskakovací okýnka v Eclipse, atd. Nuda!</p>
<p>Teď jsme si ale pořídili tu správnou <a href="http://www.kysoh.com/tux-droid">vychytávku</a> na notifikaci o buildech: <a href="http://wiki.waltercedric.com/index.php?title=Tux_Droid_Plugin_For_TeamCity_Continuous_BuildServer">Tux plugin do TeamCity</a>.</p>
<p><span id="more-467"></span></p>
<p>Jak to funguje? Jednoduše &#8211; když někdo rozbije build, tučňák Tux začne křičet, který build selhal. </p>
<p>Pokud nemáte zrovna TeamCity, nevadí &#8211; Tux API je docela jednoduché, takže si můžete celkem rychle udělat plugin pro vlastní build server.</p>
<pre class="brush: java;">
TuxAPI tux = new TuxAPI(ipAdress, port);
tux.server.autoConnect(TuxAPIConst.CLIENT_LEVEL_RESTRICTED, &quot;login&quot;, &quot;password&quot;);
tux.tts.speak(&quot;Text to speach&quot;);
</pre>
<p>Vřele doporučuju nějakou takovou blbinu zavést.</p>
<p><img src="http://www.aspectworks.com/cs/blog/wp-content/uploads/2010/03/tux.png" alt="Tux" title="Tux" width="648" height="418" class="alignright size-full wp-image-482" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/cs/blog/2010/03/rozbijes-build-serve-te-tux/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Spring: podmíněná konfigurace</title>
		<link>http://www.aspectworks.com/cs/blog/2010/02/spring-podminena-konfigurace/</link>
		<comments>http://www.aspectworks.com/cs/blog/2010/02/spring-podminena-konfigurace/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 13:26:47 +0000</pubDate>
		<dc:creator>Luboš Račanský</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[konfigurace]]></category>

		<guid isPermaLink="false">http://www.aspectworks.com/cs/blog/?p=435</guid>
		<description><![CDATA[Při vývoji aplikací ve Springu jste jistě narazili na problém nasazení do různých prostředí. Pravděpodobně jste to řešili vytvořením samostatných buildů. Ovšem ne vždy je to potřeba. Proč nenechat konfiguraci na adminovi? Existuje jednoduché a elegantní řešení jménem BeanReferenceFactoryBean.

BeanReferenceFactoryBean využijete zejména, nastavujete-li specifická prostředí, jako je TaskExecutor pro Scheduling, transakční manažer, autentizaci atd.
Představte si například [...]]]></description>
			<content:encoded><![CDATA[<p>Při vývoji aplikací ve Springu jste jistě narazili na problém nasazení do různých prostředí. Pravděpodobně jste to řešili vytvořením samostatných buildů. Ovšem ne vždy je to potřeba. Proč nenechat konfiguraci na adminovi? Existuje jednoduché a elegantní řešení jménem <strong>BeanReferenceFactoryBean</strong>.<br />
<span id="more-435"></span><br />
BeanReferenceFactoryBean využijete zejména, nastavujete-li specifická prostředí, jako je TaskExecutor pro Scheduling, transakční manažer, autentizaci atd.</p>
<p>Představte si například situaci, kdy v properties vaší aplikace potřebujete nastavit, zda se <strong>Spring Security</strong> bude autentizovat vůči databázi nebo vůči LDAPu. </p>
<h3 class="block">Jak na to?</h3>
<p>Nejdříve nastavte v properties takovýto klíč:<br />
<code>myApplication.authentication.provider=ldap</code></p>
<p>Target beana libovolného jména definovaného v properties bude díky <strong>BeanReferenceFactoryBean</strong> dostupná vždy pod jediným a předem známým id.</p>
<pre class="brush: xml;">
&lt;bean id=&quot;authenticationProvider&quot; class=&quot;org.springframework.beans.factory.config.BeanReferenceFactoryBean&quot;&gt;
	&lt;property name=&quot;targetBeanName&quot;&gt;
		&lt;value&gt;${myApplication.authentication.provider}AuthenticationProvider&lt;/value&gt;
      &lt;/property&gt;
&lt;/bean&gt;
</pre>
<p>Do <em>authentication-manageru</em> nainjektujeme beanu <em>authenticationProvider</em>, jejíž target beana je zvolena právě na základě konfigurace v properties.</p>
<pre class="brush: xml;">
&lt;sec:authentication-manager&gt;
	&lt;sec:authentication-provider ref=&quot;authenticationProvider&quot;/&gt;
&lt;/sec:authentication-manager&gt;
</pre>
<p>Pro úplnost ještě uvádím nástin konfigurace Spring Security vůči databázi a LDAP.</p>
<pre class="brush: xml;">
&lt;bean id=&quot;dbAuthenticationProvider&quot; class=&quot;org.springframework.security.authentication.dao.DaoAuthenticationProvider&quot; lazy-init=&quot;true&quot;&gt;
	&lt;property name=&quot;userDetailsService&quot; ref=&quot;userDetailsService&quot; /&gt;
&lt;/bean&gt;
</pre>
<p>Lazy-init je nastaveno na <em>true</em>, protože pokud si vyberete autentizaci vůči databázi, tak nebudete konfigurovat LDAP a naopak. S nevalidním nastavením by vám pak vůbec nenaběhl aplikační kontext.</p>
<pre class="brush: xml;">
&lt;bean id=&quot;ldapAuthenticationProvider&quot; class=&quot;org.springframework.security.ldap.authentication.LdapAuthenticationProvider&quot; lazy-init=&quot;true&quot;&gt;
	&lt;!-- configuration of LDAP --&gt;
&lt;/bean&gt;
</pre>
<p>Místo nového buildu teď stačí pro změnu konfigurace jen upravit nastavení v properties a restartovat aplikační server.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/cs/blog/2010/02/spring-podminena-konfigurace/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Hledání země nezemě</title>
		<link>http://www.aspectworks.com/cs/blog/2009/10/hledani-zeme-nezeme/</link>
		<comments>http://www.aspectworks.com/cs/blog/2009/10/hledani-zeme-nezeme/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 11:49:24 +0000</pubDate>
		<dc:creator>Tomáš Piňos</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Webdesign]]></category>

		<guid isPermaLink="false">http://www.aspectworks.com/cs/blog/?p=297</guid>
		<description><![CDATA[Kódy zemí, měn, bank, názvy měst a vesnic, poštovní směrovací čísla&#8230; Většina aplikací pracuje s nějakými číselníky. Kde ale vzít jejich hodnoty a nekrást? V tomto blogu chci projít a stručně charakterizovat zdroje, které jsem pro potřeby nedávného projektu našel a které se mi osvědčily. 

Zkusme napřed pojmenovat možné způsoby, jak získat data pro číselníky [...]]]></description>
			<content:encoded><![CDATA[<p>Kódy zemí, měn, bank, názvy měst a vesnic, poštovní směrovací čísla&#8230; Většina aplikací pracuje s nějakými číselníky. Kde ale vzít jejich hodnoty a nekrást? V tomto blogu chci projít a stručně charakterizovat zdroje, které jsem pro potřeby nedávného projektu našel a které se mi osvědčily. </p>
<p><span id="more-297"></span></p>
<p>Zkusme napřed pojmenovat možné způsoby, jak získat data pro číselníky na novém projektu.</p>
<ul>
<li><em>Přebírání číselníků ze staršího projektu, programu, firmy, …</em> &#8211; asi nejrozšířenější praktikou je vzít data tam, kde už jsme je jednou připravili. Může to být jiný projekt, naše internetové bankovnictví, nebo třeba náš účetní systém. Je to správné a legální? Dá se takový postup snadno zopakovat? Jak řešit aktualizace dat?</li>
<li><em>Placený zdroj dat</em> – některé číselníky si můžeme koupit. Existují dodavatelé, kteří se na přípravu a aktualizaci číselníkových dat specializují.</li>
<li><em>Volně dostupné zdroje dat na internetu</em> – mnohé číselníky neobsahují data, o kterých by se dalo mluvit jako o cenných. Náročný bývá spíše způsob, jak jejich hodnoty zkompilovat a udržovat. Proto je přirozená myšlenka hledat pro číselníky volně dostupné zdroje dat. Existuje jich mnoho, na některé se zaměřím.</li>
</ul>
<p>Ve zbytku příspěvku se budu věnovat právě několika dostupným zdrojům dat pro číselníky zemí, bank, měn, měst, ulic, PSČ a adres.</p>
<h3>Země</h3>
<p>Pro číselník zemí existuje standard <a href="http://www.iso.org/iso/country_codes/background_on_iso_3166/what_is_iso_3166.htm">ISO 3166</a>. Standard má tři části, číselníku zemí odpovídá ISO 3166-1 (dvouznakové kódy, pro Českou republiku je to ČR). Další dvě části standardu popisují jemnější členění zemí a země vyřazené z číselníku. Na typickém projektu není důvod tento standard nepoužít.</p>
<ul>
<li><a href="http://www.iso.org/iso/country_codes/iso_3166_code_lists.htm"><em>ISO</em></a> &#8211; Přímo na stránkách ISO organizace se dají najít číselníky zemí v angličtině a francouzštině. Bohužel jen v upper case.
</li>
<li><a href="http://www.czso.cz/csu/klasifik.nsf/i/ciselnik_zemi_(czem)"><em>Český statistický úřad</em></a> &#8211; Na stránkách ČSÚ je možné volně stáhnout xls soubor s daty odpovídajícími normě ISO 3166-1. Číselník obsahuje kódy předepsané standardem, plný a zkrácený český název a plný anglický název.
</li>
</ul>
<p>Na posledním projektu jsme použili data z ČSÚ. Xls soubor jsme zkonvertovali do csv a pak už jej jednoduchým skriptem transformovali do formátu, kterým plníme databázi. To je postup, který se dá snadno zopakovat a v případě potřeby i automatizovat. I když to asi v případě číselníku zemí není nutné. </p>
<h3>Banky a měny</h3>
<p>Dalšími typickými číselníky jsou seznamy bank registrovaných v České republice a seznam měn. Pro měny opět existuje ISO standard – <a href="http://www.currency-iso.org">ISO 4217</a>. Definuje tříznakové kódy, kde první dva znaky odpovídají číselníku zemí definovanému standardem ISO 3166-1. Nevidím důvod, proč se i pro číselník měn nepřidržet tohoto standardu (pokud potřebujeme všechny) .</p>
<ul>
<li><a href="http://www.czso.cz/csu/2004edicniplan.nsf/p/0010-04"><em>Český statistický úřad</em></a> &#8211; ČSÚ je dobrým zdrojem i pro číselník měn. Na uvedeném odkazu se dá specifikace stáhnout jako xls nebo pdf soubor. Xls soubor je snado převoditelný do csv, které už se dá vhodným skriptem rychle zpracovat.
</li>
<li><a href="http://www.cnb.cz/m2export/sites/www.cnb.cz/cs/platebni_styk/ucty_kody_bank/download/kody_bank_CR_127.pdf"><em>Česká národní banka</em></a> &#8211; Obsahově správným zdrojem dat pro číselník bank je určitě ČNB. Ke stáhnutí je zde k dispozici pdf soubor, který se zpracovává hůř, ale možné to je.
</li>
</ul>
<p>Nabízí se i možnost „převzít“ číselník bank z vašeho oblíbeného <em>internetového bankovnictví</em>. Otázkou je, nakolik je to správné a kolik toho vaše svědomí snese. </p>
<h3>Města, ulice, PSČ, adresy, &#8230;</h3>
<p>Poslední skupinou číselníků, které se budu věnovat, jsou města, ulice, PSČ a adresy. Od těchto číselníků si typicky slibujeme provázanost, aktuálnost dat a také možnost aktualizovatelnosti dat. V bankovním prostředí je častý požadavek na ověření existence a správnosti adresy (např. u scoring systémů, kde je zákazník s existující adresou jistě důvěryhodnější).</p>
<ul>
<li><a href="http://www.cpost.cz/cz/sluzby/prodej-na-postach/prodej-datovych-souboru-id293"><em>Česká pošta</em></a> &#8211; Česká pošta nabízí placený číselník adres. Zmiňuji ho jako alternativu k UIR-ADR (viz níže), ale protože jsem na stránkách pošty nenašel možnost stažení vzorku dat, jeho hodnocení se vyhnu.</li>
<li><em>Český statistický úřad</em> &#8211; Několik číselníků měst a PSČ nabízí i ČSÚ. Vždy ale plní nějaký statistický účel (např. sčítání obyvatelstva) a jako obecné číselníky se mi neosvědčily.</li>
<li><a href="http://forms.mpsv.cz/uir"><em>UIR-ADR: Územně identifikační registr adres</em></a> &#8211; Překvapivě kvalitní a volně dostupnou databázi adres spravuje česká státní správa, konkrétně Ministerstvo práce a sociálních věcí.</li>
</ul>
<div class="imageRight">
<a href="http://www.aspectworks.com/cs/blog/2009/10/hledani-zeme-nezeme/uiradr-model/" rel="attachment wp-att-321"><img src="http://www.aspectworks.com/cs/blog/wp-content/uploads/2009/10/uiradr-model-200x192.jpg" alt="UIR-ADR - datový model" width="200" height="192" class="aligncenter size-thumbnail wp-image-321" /></a></p>
<div>
Datový model registru UIR-ADR<br />
(zjednodušený, pouze některé tabulky)
</div>
</div>
<p>Registr UIR-ADR toho nabízí mnoho:</p>
<ul>
<li>Typy dat – UIR-ADR obsahuje číselníky okresů, obcí, částí obce, ulic, stavebních objektů, adresních míst, adresních pošt, pražských obvodů,  městských částí/městských obvodů, oblastí, krajů, správních obvodů a některé další typy dat.</li>
<li>Prohlížení registru na webu – jednoduchá webová aplikace pro prohlížení registru.<br />
Webová služba pro ověřování adres v registru – UIR-ADR poskytuje webovou službu pro ověřování adres. Služba je volně dostupná, ale vyžaduje nejprve registraci.</li>
<li>Možnost udržovat si vlastní kopii registru – zdarma si lze objednat CD s instalací UIR-ADR. Instalace znamená vytvoření instance MS SQL s daty a windows prohlížečkou, nebo inicializaci dat v jiné databázi. CD obsahuje data registru v šesti různých databázových formátech (dBase, FoxPro, Oracle, MS SQL Server, SQL_92, CSV).</li>
<li>Aktualizace registru zdarma – v případě udržování vlastní kopie jsou volně k dispozici aktualizace registru (údajně připravované 1x týdně, ale to jsem neověřoval).</li>
</ul>
<p>Na novém projektu bych rozhodně zvolil vlastní kopii UIR-ADR. Vím o několika bankách a dalších firmách, které registr používají. Standardizace dat podle registru UIR-ADR je trend, takže je tu dobrá šance, že v případě integrace a výměny adresních dat budete mít štěstí a adresy půjdou snadno porovnávat. Poslední poznámka se týká ověřování adres – nesmíme zapomenout, že zde neplatí <a href="//en.wikipedia.org/wiki/Closed_world_assumption">předpoklad uzavřeného světa</a>. Absence adresy v registru ještě nemusí zaručeně znamenat, že adresa skutečně neexistuje.</p>
<h3>Shrnutí</h3>
<p>Příspěvek si kladl za cíl nabídnou několik osvědčených zdrojů dat pro různé číselníky. Řešili jste někdy na projektu zdroje dat pro číselníky? Jakou cestou jste se vydali? Podělte se o své zkušenosti v diskuzi pod článkem.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/cs/blog/2009/10/hledani-zeme-nezeme/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Eclipse efektivně (2.) &#8211; Quick Fix</title>
		<link>http://www.aspectworks.com/cs/blog/2009/10/eclipse-efektivne-2-quick-fix/</link>
		<comments>http://www.aspectworks.com/cs/blog/2009/10/eclipse-efektivne-2-quick-fix/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 09:31:59 +0000</pubDate>
		<dc:creator>Pavel Müller</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.aspectworks.com/cs/blog/?p=233</guid>
		<description><![CDATA[V dnešním díle seriálu pro líné vývojáře (lenost je totiž motorem lidstva), se zaměříme na to, co nám Eclipse nabízí pod pojmy Quick Fix a Quick Assist. Sám nemám o rodílu mezi dvěma pojmy jasno a zdá se mi, že ani samotný Eclipse ne. Je možné, že původně měl Quick Fix sloužit jako rychlá nabídka [...]]]></description>
			<content:encoded><![CDATA[<p>V dnešním díle seriálu pro líné vývojáře (lenost je totiž motorem lidstva), se zaměříme na to, co nám Eclipse nabízí pod pojmy <em>Quick Fix</em> a <em>Quick Assist</em>. Sám nemám o rodílu mezi dvěma pojmy jasno a zdá se mi, že ani samotný Eclipse ne. Je možné, že původně měl Quick Fix sloužit jako rychlá nabídka možností, ale já to používám úplně stejným způsobem jako Content Assist. Tedy k rychlejší tvorbě a úpravám kódu.</p>
<p><span id="more-233"></span></p>
<p>Pojďme se tedy podívat, co lze s Quick Fixem a Quick Assistem dělat a jak se používají. Kdykoli Java editor zaznamená v kódu chybu, červeně jí podtrhne a na levém okraji označí žárovičkou. Po kliknutí na žárovičku nebo po stisku <em>Ctrl+1</em> se zobrazí nabídka, co s danou situací můžeme dělat. Možností je v Eclipse opravdu nepřeberné množství. Zde přehled toho, co považuji za nejužitečnější:</p>
<h3>Rychlý import</h3>
<p>Eclipse poskytuje spoustu cest k vygenerování vhodného importu: Content Assist, chytrý copy-paste, Organize Imports (Ctrl+Shift+O) a i Quick Fix. Vlastně si nepamatuju, že bych někdy v poslední době psal import ručně. S Quick Fixem je to jednoduché. Stačí kliknout na žárovičku nebo stisknout Ctrl+1 a vybrat vhodný import.</p>
<p style="text-align: center;"><img class="size-full wp-image-235 aligncenter" title="import" src="http://www.aspectworks.com/cs/blog/wp-content/uploads/2009/10/import.png" alt="import" width="422" height="256" /></p>
<h3>Opravy chyb &#8211; přetypování</h3>
<p>Okamžik, kdy Quick Fix hodně používám, je když potřebuju napsat přetypování. Je to pravděpodobně jenom takový můj zvyk, kdy si šetřím i tu práci napsat závorky a typ. Prostě napíšu kód bez přetypování a pak pomocí Quick Fixu si nechám přiřazení &#8220;opravit&#8221;. Jsem tak zas o kousek rychlejší, než kdybych to psal ručně <img src='http://www.aspectworks.com/cs/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: center;"><img class="size-full wp-image-238 aligncenter" title="cast" src="http://www.aspectworks.com/cs/blog/wp-content/uploads/2009/10/cast.png" alt="cast" width="575" height="245" /></p>
<h3>Vývoj shora dolů</h3>
<p>Nebo jakým je to vlastně směrem. Prostě implementuju například servisní vrstvu a potřebuju nějakou metodu na DAO objektu. Ale neudělám to tak, že si tu metodu vyvinu předem, ale nechám si jí Quick Fixem vygenerovat.</p>
<p>Například píšu autentizaci ve své aplikaci a potřebuji metodu <em>findByUsername()</em> na <em>UserDao</em>. Neudělám to ale tak, že bych přešel do jiné třídy a začal si to připravovat nejdřív tam. Naopak. Zůstanu ve své vrstvě a nechám si pomoc s doděláváním chybějících metod později. To samé funguje pro privátní metody v té samé třídě a řadu dalších podobných případů.</p>
<p style="text-align: center;"><img class="size-full wp-image-239 aligncenter" title="createMethod" src="http://www.aspectworks.com/cs/blog/wp-content/uploads/2009/10/createMethod.png" alt="createMethod" width="617" height="276" /></p>
<p>Teď tedy máme vygenerovanou metodu na rozhraní, ale je potřeba doplnit implementaci ve třídě <em>HibernateUserDao</em>. A opět jsme líní, tak si necháme metodu předgenerovat. Tento způsob používám i třeba v situaci, kdy existující třídě nechám implementovat rozhraní navíc a potřebuju doplnit několik metod najednou.</p>
<p style="text-align: center;"><img class="size-full wp-image-240 aligncenter" title="methods" src="http://www.aspectworks.com/cs/blog/wp-content/uploads/2009/10/methods.png" alt="methods" width="555" height="273" /></p>
<h3>Změna v signatuře metody</h3>
<p>Stejně jako v případě nové metody lze i změny v parametrech a návratových typech metody dělat pomocí Quick Assistu. Zjistíme např. že do metody z minulého příkladu potřebujeme ještě poslat parametr s heslem. Opět můžeme postupovat obráceným směrem proti kompilátoru. Dokonce se Eclipse snaží hádat název parametru, který bude v tomto případě password. Můžeme parametry i odebírat a měnit návratové hodnoty.</p>
<p style="text-align: center;"><img class="size-full wp-image-241 aligncenter" title="addParam" src="http://www.aspectworks.com/cs/blog/wp-content/uploads/2009/10/addParam.png" alt="addParam" width="646" height="268" /></p>
<h3>Ošetření výjimek</h3>
<p>Pokud metoda vyhazuje výjimku, která se musí ošetřit dává nám Eclipse na výběr několik možností. Můžeme si nechat vygenerovat try-catch blok a nebo nastavit throws na metodě. Případně pokud již existuje try-catch blok, tak Eclipse nabídne možnost, aby se nová výjimka připojila k existujícímu bloku.</p>
<p style="text-align: center;"><img class="size-full wp-image-244 aligncenter" title="throws" src="http://www.aspectworks.com/cs/blog/wp-content/uploads/2009/10/throws.png" alt="throws" width="624" height="272" /></p>
<h3>Odstranění bloku</h3>
<p>Někdy se hodí rychle a bezpečně odstranit obklopující blok kódu. Následující příklad ukazuje možnost odstranění try-catch bloku.</p>
<p style="text-align: center;"><img class="size-full wp-image-245 aligncenter" title="remove" src="http://www.aspectworks.com/cs/blog/wp-content/uploads/2009/10/remove.png" alt="remove" width="560" height="310" /></p>
<h3>Závěr</h3>
<p>Jako v minulém díle nezbývá než konstatovat, že pokud chceme být efektivní, je potřeba se naučit možnosti, které nabízí <a href="http://help.eclipse.org/ganymede/index.jsp?topic=/org.eclipse.jdt.doc.user/reference/ref-java-editor-quickfix.htm">Quick Fix</a> a <a href="http://help.eclipse.org/ganymede/index.jsp?topic=/org.eclipse.jdt.doc.user/reference/ref-java-editor-quickassist.htm">Quick Assist</a>. V příštím díle se budeme věnovat šablonám kódu (Code Templates).</p>
<p><a href="http://www.aspectworks.com/cs/blog/2009/09/eclipse-efektivne-1-content-assist/">Předchozí díl: Eclipse efektivně (1.) &#8211; Content Assist</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/cs/blog/2009/10/eclipse-efektivne-2-quick-fix/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>JBoss Enterprise Platforms</title>
		<link>http://www.aspectworks.com/cs/blog/2009/09/jboss-enterprise-platforms/</link>
		<comments>http://www.aspectworks.com/cs/blog/2009/09/jboss-enterprise-platforms/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 09:12:23 +0000</pubDate>
		<dc:creator>Pavel Müller</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.aspectworks.com/cs/blog/?p=171</guid>
		<description><![CDATA[Ve světě Javy jsou stovky frameworků a knihoven. Jak zajistit, aby komponenty Vašeho projektu bezchybně spolupracovaly? Jak instalovat nové verze či bezpečnostní záplaty těchto komponent, aniž by to mělo negativní dopad na zbytek systému? JBoss nabízí různé platformy pro vývoj enterprise aplikací s podporou aplikačního serveru JBoss, Apache Tomcat a několika známých frameworků (Spring, Hibernate).


Flexibilita [...]]]></description>
			<content:encoded><![CDATA[<p>Ve světě Javy jsou stovky frameworků a knihoven. Jak zajistit, aby komponenty Vašeho projektu bezchybně spolupracovaly? Jak instalovat nové verze či bezpečnostní záplaty těchto komponent, aniž by to mělo negativní dopad na zbytek systému? JBoss nabízí různé platformy pro vývoj enterprise aplikací s podporou aplikačního serveru JBoss, Apache Tomcat a několika známých frameworků (Spring, Hibernate).</p>
<p><span id="more-171"></span></p>
<p><img src="http://www.aspectworks.com/cs/blog/wp-content/uploads/2009/09/jboss2.gif" alt="JBoss" title="JBoss"  class="imageRight" /></p>
<h3>Flexibilita JEE</h3>
<p>Vývoj enterprise aplikací na platformě JEE je zajímavý tím, že lze architekturu a použité technologie velmi dobře přizpůsobit charakteristice i potřebám vyvíjené aplikace. Je vyžadováno vzdálené volání? Můžeme použít EJB komponenty. Je potřeba zvládat mnoho současně pracujících uživatelů? Nasadíme aplikační server s podporou clusteru. Píšeme jen jednoduchou webovou aplikaci? Nepotřebujeme plný aplikační server, postačí jednoduchý webový kontejner, např. Apache Tomcat.</p>
<p>Ještě větší volnost máme ve výběru knihoven a frameworků. Jenom webových frameworků je v Java světě přes sto a každý má navíc velké množství verzí. Podobné je to i s dalšími oblastmi napříč architekturou aplikace. V dnešní době je většina použitých knihoven open-source, což přináší celou řadu dobře známých výhod, od úspory na licencích až po přístup ke zdrojovým kódům.</p>
<h3>Problémy s komponentami třetích stran</h3>
<p>Často je obtížné sladit jednotlivé verze open-source komponent a zajistit jejich kompatibilitu. Problémy mohou nastat už během vývoje, především však později při provozu aplikace. Při provozu je potom vhodné mít podporu výrobce a dostávat záplaty na chyby a bezpečnostní rizika. Open-source komunita má obvykle dobrou odezvu na opravy chyb, ale vydává je pouze v nových verzích. To ovšem není úplně vhodné pro již běžící systém, kde taková náhrada za výrazně novější verzi může mít dopady na zbytek systému. Každá použitá komponenta má teké jiný rytmus při vydávání nových verzí, takže není možné dobře plánovat verze aplikace.</p>
<p><img class="alignnone size-medium wp-image-176" title="JBossEAP" src="http://www.aspectworks.com/cs/blog/wp-content/uploads/2009/09/JBossEAP-648x328.jpg" alt="JBossEAP" width="648" height="328" /></p>
<h3>Řešení a podpora JBossu</h3>
<p>JBoss již delší dobu řeší tyto problémy a dokonce letos rozšířil svou nabídku na poli vývojových platforem o podporu open-source knihoven a frameworků, které nejsou z jeho dílny, ale jsou hojně rozšířené a populární pro vývoj JEE aplikací. Lze se tak rozhodnout pro JBoss Enterprise platformu nejlépe vyhovující  použitým technologiím a profitovat z aktualizací, oprav chyb, podpory a dalších služeb. Společnost <a href="http://www.aspectworks.com">AspectWorks</a> například používá ve velké míře architekturu založenou na Spring Framework, Hibernate a provozovanou na JBoss aplikačním serveru. Nyní jsme schopni mít celé toto portfolio produktů pokryto podporou ze strany JBossu.</p>
<h3>JBoss Enterprise Web Server</h3>
<p>Tato platforma je zaměřená na dlouhodobou podporu a předvídatelný způsob aktualizace.<br />
Kombinuje populární Apache Tomcat s Apache web serverem a konektory, které oba propojují (mod_jk, atp.). Balíček se hodí nejenom pro nejjednodušší JEE aplikace, ale i na tzv. lehké architektury, vyžadující pouze Tomcat server. I na této platformě lze tedy provozovat mission-critical systémy a mít plnou podporu. Více v <a href="http://www.jboss.com/pdf/JB_EWS_web.pdf">JBoss Enterprise Web Server datasheet</a>.</p>
<h3>JBoss Enterprise Web Platform</h3>
<p>Odlehčená varianta <a href="http://www.jboss.com/products/platforms/application/">JBoss Enterprise Application Platform</a> podporující jednodušší JEE aplikace. Je zaměřená na JEE webový profil a tedy používá JBoss AS bez některých enterprise komponent. Přitažlivé je, že v této platformě je obsažena podpora pro populární frameworky a knihovny jako je Spring Framework, Hibernate, Struts, RichFaces, Google Web Toolkit a další. Lze tak dosáhnout podpory od aplikačního serveru přes všechny důležité aplikační frameworky. Sada frameworků je dostupná i samostatně jako <a href="http://www.jboss.com/products/wfk/">JBoss Web Framework Kit</a>.</p>
<h3>JBoss Enterprise Application Platform</h3>
<p>Platforma pro vývoj enterprise aplikací podle JEE standardů pro nejnáročnější nasazení. Zahrnuje JBoss aplikační server s podporou EJB, JTA, cluster, distribuované aplikace, asynchronní komunikací JMS, open-source frameworky a další komponenty. Je to nejvhodnější volba v případě vývoje rozsáhlých řešení na založených na JEE a provozovaných na JBoss produktech. Pro velmi důležité provozní systémy je vhodné doplnit tuto vývojovou platformu i o monitorovací nástroje v podobě <a href="http://www.jboss.com/products/jbosson/">JBoss Operations Network</a>, zahrnující integrované nástroje pro správu, nasazení a monitorování všech komponent <a href="http://www.jboss.com/products/">JBoss Enterprise Middleware</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/cs/blog/2009/09/jboss-enterprise-platforms/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
