<?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>Pavel-novak.net</title>
	<atom:link href="http://pavel-novak.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://pavel-novak.net</link>
	<description>EXPERIENTIA EST OPTIMA RERUM MAGISTRA.</description>
	<lastBuildDate>Thu, 25 Aug 2011 23:53:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Android Sudoku Solver</title>
		<link>http://pavel-novak.net/2011/android-sudoku-solver/</link>
		<comments>http://pavel-novak.net/2011/android-sudoku-solver/#comments</comments>
		<pubDate>Thu, 25 Aug 2011 23:18:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Nezařazené]]></category>
		<category><![CDATA[algoritmus]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[dialog]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[menu]]></category>
		<category><![CDATA[řešení]]></category>
		<category><![CDATA[sudoku]]></category>
		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://pavel-novak.net/?p=40</guid>
		<description><![CDATA[Napsal jsem jednoduchou aplikaci pro OS Android, která umí vyřešit zadané sudoku. Tento sudoku řešič jsem psal z nudy a dlouhého čekání na můj Samsung Galaxy S, který je stále na reklamaci. V tomto příspěvku nebudu rozvádět celý zdrojový kód, jen rozvedu pár drobností. Zdrojový kód a samotnou aplikaci (pokud si ji chcete vyzkoušet na [...]]]></description>
			<content:encoded><![CDATA[<p>Napsal jsem jednoduchou aplikaci pro OS <strong>Android</strong>, která umí vyřešit zadané <strong>sudoku</strong>. Tento sudoku <em>řešič</em> jsem psal z nudy a dlouhého čekání na můj Samsung Galaxy S, který je stále na reklamaci. V tomto příspěvku nebudu rozvádět celý zdrojový kód, jen rozvedu pár drobností. Zdrojový kód a samotnou aplikaci (pokud si ji chcete vyzkoušet na svém Android zařízení) si můžete stáhnout na konci tohoto příspěvku.</p>
<p><strong>Ukázka programu</strong></p>
<p><iframe src="http://www.youtube.com/embed/qHLTzH67HXg" frameborder="0" width="420" height="345"></iframe></p>
<p><strong>Použitý algoritmus</strong></p>
<p>Algoritmus pro řešení sudoku zde nebudu vůbec rozebírat. Lze použít jakýkoliv jiný algoritmus pro řešení sudoku. Já použil tento, protože jsem jeho zdrojový kód měl na svém disku. Tento algoritmus jsme napsali s mými spolužáky (Martinem Paroubkem a Lukášem Matějů) jako semestrální práci na předmět <em>Teorie grafů a her</em>. Algoritmus původně hledal všechna možná řešení, ale pro tuto aplikaci jsem ho upravil tak, aby vracel pouze první korektní nalezené řešení. Použitý algoritmus využívá metody hladového barvení, přičemž pořadí vrcholů v cyklu volí podle stupně nasycení. Při implementaci algoritmu jsem nejspíše přišel na chybnost algoritmu, která zpomaluje výpočet, ale zatím jsem se chybu nepokoušel nalézt.</p>
<p><strong>Mřížka sudoku</strong></p>
<p>Na mřížku sudoku jsem si napsal vlastní widget. Tento widget vykresluje kromě mřížky také vyplněná čísla a obstarává reakci na dotek displeje. Po vyvolání události <em>onTouchEvent</em> této komponenty se otevře dialog, který umožní výběr čísla na danou pozici.</p>
<p><strong>Dialogy a čekání na návratovou hodnotu</strong></p>
<p>Že zavoláme u dialogu metodu <em>show()</em>, počkáme až skončí a načteme poté data z dialogu? Ale kdepak. Každý si u vývoje GUI v operačním systému Android uvědomit, že se vše děje asynchronně. Na zmíněný problém nám ale postačí <em>OnDismissListener()</em>. Jak jej použít je znázorněnu na následujícím útržku kódu.</p>
<pre class="brush: java">numberSelectDialog.setOnDismissListener(new OnDismissListener() {
   public void onDismiss(DialogInterface dialInterface) {
      //reaguj na to, ze byl dialog zavren
   }
});</pre>
<p>Tato událost je vyvolána v případě, že je dialog ukončen metodou <em>dismiss()</em>. V případě, že je dialog ukončován metodou <em>cancel()</em>, můžeme použít<code></code> <em>OnCancelListener</em>.</p>
<p><strong>Menu</strong></p>
<p>Jak vytvořit menu v Android aplikaci je snadné. Jako demonstrace skvěle poslouží <a href="http://developer.android.com/guide/topics/ui/menus.html">Creating Menus</a>.</p>
<p><strong>Soubory ke stažení</strong></p>
<p>Zdrojové kódy programu Sudoku Solver &#8211; <a href="http://pavel-novak.net/wp-content/uploads/SudokuSolverSource.zip">SudokuSolverSource.zip</a><br />
Instalační soubor Sudoku Solver &#8211; <a href="http://pavel-novak.net/wp-content/uploads/SudokuSolverApk.zip">SudokuSolverApk.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://pavel-novak.net/2011/android-sudoku-solver/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java pong</title>
		<link>http://pavel-novak.net/2011/java-pong/</link>
		<comments>http://pavel-novak.net/2011/java-pong/#comments</comments>
		<pubDate>Fri, 19 Aug 2011 15:10:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Nezařazené]]></category>
		<category><![CDATA[double buffering]]></category>
		<category><![CDATA[hra]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[pong]]></category>

		<guid isPermaLink="false">http://pavel-novak.net/?p=32</guid>
		<description><![CDATA[Napsat hru Pong v Javě by mě nyní ani nenapadlo. Chtěl jsem původně napsat Pong pro OS Android, ale asi v půlce vývoje mi odešel telefon, takže je nyní na reklamaci. Jen mimo řeč bych rád zmínil, že program Kies od Samsungu opravdu stojí za to. Je tak dobře napsaný, že mu nedělá problémy spadnout [...]]]></description>
			<content:encoded><![CDATA[<p>Napsat hru Pong v Javě by mě nyní ani nenapadlo. Chtěl jsem původně napsat Pong pro OS Android, ale asi v půlce vývoje mi odešel telefon, takže je nyní na reklamaci. Jen mimo řeč bych rád zmínil, že program Kies od Samsungu opravdu stojí za to. Je tak dobře napsaný, že mu nedělá problémy spadnout při aktivitě, jako je například upgrade firmwaru telefonu. Ano, přesně z tohoto důvodu putuje můj telefon po servisním oddělení společnosti Samsung. Samozřejmě existovala možnost nahrát nějakou neoficiální ROM, ale pomyšlení na ztrátu záruky v případě poruchy telefonu mi to nedovolilo. Nyní zase k věci. Telefon není doma, provádět všechny testy v AVD se mi nechtělo, tak jsem se rozhodl, že dopíši Pong prozatím v Java SE. Hra není úplně dolazena a má nedostatky, víceméně jsem její tvorbou jen zabíjel čas.</p>
<p>Nebudu v tomto příspěvku rozvádět každý kousek kódu. Celý zdrojový kód včetně výsledné aplikace si můžete stahnout z odkazů umístěných na konci příspěvku. Hlavní logika hry, vykreslování, ovládání klávesnicí se nachází ve třídě <em>Pong.java</em>, která obsahuje asi 150 řádků kódu. Nejedná se tedy o nic složitého. Dále se pokusím poukázat na pár detailů, které by se mohli programátorům začátečníkům hodit &#8211; aby měl tento příspěvěk alespoň nějaký význam <img src='http://pavel-novak.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><strong>Double buffering</strong></p>
<p>Předpokládám, že není třeba termín vysvětlovat. Pokud někdo přeci jen neví oč jde, může se podívat například <a href="http://download.oracle.com/javase/tutorial/extra/fullscreen/doublebuf.html">sem</a>. Jak v Javě řešit tento problém existuje více způsobů. Jeden způsob je zmíněn v odkazu, který je umístěn  na začátku odstavce. Já použil trošku jiný styl řešení. Kreslím vše do obrázku. Pokud je vše vykresleno, tak tento obrázek vykreslím na obrazovku. To bohatě stačí k zamezení protivného problikávání obrazu způsobeného neustálým překreslováním při kreslení dalších a dalších tvarů.</p>
<pre class="brush: java">Image bufferImage = createImage(getWidth(), getHeight());
Graphics buffer = bufferImage.getGraphics();</pre>
<p>Tímto kódem se vytvoří obrázek &#8211; instance třídy <em>Image</em>, který poté bude vykreslován na obrazovku (v tomto případě do panelu <em>JPanel</em>) a instance třídy Graphics, pomocí níž jsme schopni do obrázku kreslit základní tvary atd.</p>
<pre class="brush: java">@Override
public void paint(Graphics g) {
    buffer.drawString("Ahoj :]", 20, 20);
    g.drawImage(bufferImage, 0, 0, this);
}</pre>
<p>Zde je už jen příklad přetížené metody <em>paint</em>, ve které do &#8222;bufferovaného&#8220; obrázku zakreslíme řetězec a následně je vykreslen &#8222;bufferovaný&#8220; obrázek.</p>
<p><strong>Stisk více klávec najednou</strong></p>
<p>Tento problém jsem vyřešil tak, že jsem ho vlastně moc neřešil. Na nějakém fóru jsem zahlédl jedno řešení a to použil. Nejedná se ovšem o moc použitelnou variantu, což si každý může v aplikaci vyzkoušet. Nicméně to funguje o level lépe, než kdyby se to neřešilo vůbec.</p>
<pre class="brush: java">private Set pressedKeys = new HashSet();
@Override
public void keyPressed(KeyEvent e) {
    pressedKeys.add(e.getKeyCode());
    if (pressedKeys.size() &gt; 0) {
            for (int i : pressedKeys) {
                switch (i) {
                    case KeyEvent.VK_UP:
                    //do something
                    .
                    .
                    .
                }
            }
     }
}

@Override
public void keyReleased(KeyEvent e) {
    pressedKeys.remove(e.getKeyCode());
}</pre>
<p>Jde jen o registraci instance třídy <em>HashSet</em>, přičemž se do ní ukládá kód stishnuté klávesy. Jestliže je vyvolána událost <em>keyReleased</em>, která nastane pokud pustíme stiknutou klávesu, tak se z kolekce její kód odebere. Pokud jsou nějaké klávesy stishnuny, je volána obslužná metoda <em>keyPressed</em> a v ní je možno iterovat stisknuté klávesy, které jsou uloženy v kolekci typu <em>HashSet</em>.</p>
<p><strong>Náhodná hodnota z výčtu (enum)</strong></p>
<p>Pro směr míčku jsem si udělal výčet směrů. Když jsem poté řešil, jak elegantně vyřešit návrat náhodného směru, tak jsem došel k následujícímu řešení.</p>
<pre class="brush: java">public enum Direction {

    RIGHT_DOWN,
    RIGHT_UP,
    LEFT_DOWN,
    LEFT_UP;

    private static final List VALUES = Arrays.asList(values());
    private static final int SIZE = VALUES.size();
    private static final Random RANDOM = new Random();

    public static Direction randomDirection() {
        return VALUES.get(RANDOM.nextInt(SIZE));
    }
}</pre>
<p>Zdrojové kódy hry Pong &#8211; <a href="http://pavel-novak.net/wp-content/uploads/PongSE.zip">PongSE.zip</a><br />
Hra Pong &#8211; <a href="http://pavel-novak.net/wp-content/uploads/PongSE-jar.zip">PongSE-jar.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://pavel-novak.net/2011/java-pong/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Kreslení v Androidu</title>
		<link>http://pavel-novak.net/2011/kresleni-v-androidu/</link>
		<comments>http://pavel-novak.net/2011/kresleni-v-androidu/#comments</comments>
		<pubDate>Thu, 04 Aug 2011 12:58:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Nezařazené]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[drawCircle]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[kreslení]]></category>

		<guid isPermaLink="false">http://pavel-novak.net/?p=22</guid>
		<description><![CDATA[Kreslení v Androidu není žádná složitost. Stačí vytvořit třídu, která bude dědit od třídy View. To je třída, která je předkem všech grafických komponent systému Android &#8211; tzv. widgetů. V naší třídě poté stačí přetížit metodu onDraw, která má vstupní parametr instanci třídy Canvas. Na tomto objektu již můžeme provádět kreslící &#8222;kousky&#8220; . Takováto ukázková [...]]]></description>
			<content:encoded><![CDATA[<p>Kreslení v Androidu není žádná složitost. Stačí vytvořit třídu, která bude dědit od třídy <em>View</em>. To je třída, která je předkem všech grafických komponent systému Android &#8211; tzv. widgetů. V naší třídě poté stačí přetížit metodu <em>onDraw</em>, která má vstupní parametr instanci třídy <em>Canvas</em>. Na tomto objektu již můžeme provádět kreslící &#8222;kousky&#8220; <img src='http://pavel-novak.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Takováto ukázková třída může vypadat takto:</p>
<pre class="brush: java">public class Platno extends View {

    Paint paint = new Paint();

    public Platno(Context context) {
        super(context);
    }

    @Override
    public void onDraw(Canvas canvas) {
        paint.setColor(Color.BLUE);
        canvas.drawRect(new Rect(0, 0, 50, 100), paint);
        paint.setColor(Color.RED);
        canvas.drawCircle(100, 100, 50, paint);
    }
}</pre>
<p>Poté stačí vytvořit instanci této třídy, například v základní třídě projektu a nastavit <em>ContentView</em> na vytvořenou instanci.</p>
<pre class="brush: java">public class CanvasTest extends Activity
{
    Platno platno;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        platno = new Platno(this);
        platno.setBackgroundColor(Color.GRAY);
        setContentView(platno);
    }
}</pre>
<p>Výsledek v tomto případě vypadá takto:</p>
<p><a href="http://pavel-novak.net/wp-content/uploads/canvas.png"><img class="alignnone size-medium wp-image-23" title="canvas" src="http://pavel-novak.net/wp-content/uploads/canvas-300x202.png" alt="ukázka výstupu" width="300" height="202" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://pavel-novak.net/2011/kresleni-v-androidu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Změna stránek</title>
		<link>http://pavel-novak.net/2011/zmena-stranek/</link>
		<comments>http://pavel-novak.net/2011/zmena-stranek/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 20:36:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Nezařazené]]></category>

		<guid isPermaLink="false">http://pavel-novak.net/?p=13</guid>
		<description><![CDATA[Se svými starými, již 2 roky neaktualizovanými, stránkami jsem již nebyl spokojen. Rozhodl jsem se tedy, že stránky potřebují velkou úpravu. Z lennosti jsem využil redakční systém WordPress. Staré stránky jsou stále aktivní, ale nyní pod jinou doménou. Odkaz můžete nalézt v pravém postraním panelu v sekci odkazy. Na starých stránkách je mnoho návodů, které [...]]]></description>
			<content:encoded><![CDATA[<p>Se svými starými, již 2 roky neaktualizovanými, stránkami jsem již nebyl spokojen. Rozhodl jsem se tedy, že stránky potřebují velkou úpravu. Z lennosti jsem využil redakční systém WordPress. Staré stránky jsou stále aktivní, ale nyní pod jinou doménou. Odkaz můžete nalézt v pravém postraním panelu v sekci odkazy. Na starých stránkách je mnoho návodů, které mohou pomoci začínajícím programátorům, kteří upřednostňují jazyk Java. Musím ale zdůraznit, že na mnoho stránkách se nachází ne úplně pravdivý obsah &#8211; přece jen jsem stránky psal na střední škole se znalostmi, které nebyly moc slavné.</p>
<p>Tím, že jsem tyto stránky &#8222;renovoval&#8220; bych nerad skončil. Čas od času mám v plánu nějaký ten příspěvek přidal. Většinou by se jednalo o příspěvky z oboru programování, momentálně i z programování aplikací pro OS Android.</p>
<p>Také bych tímto příspěvkem rád poděkoval &#8222;stálým návštěvníkům&#8220;, kteří i na přes 2 roky neaktualizovaném webu odebírají RSS kanál. Díky <img src='http://pavel-novak.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://pavel-novak.net/2011/zmena-stranek/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

