<?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>Zdroják &#187; Články</title>
	<atom:link href="http://www.zdrojak.cz/clanky/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zdrojak.cz</link>
	<description>o tvorbě webových stránek a aplikací</description>
	<lastBuildDate>Fri, 17 May 2013 11:31:47 +0000</lastBuildDate>
	<language>cs-CZ</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Dlaždice a oznámení aplikací pro Windows Store v HTML5</title>
		<link>http://www.zdrojak.cz/clanky/zaciname-psat-aplikace-pro-windows-store-v-html5-dil-5/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=zaciname-psat-aplikace-pro-windows-store-v-html5-dil-5</link>
		<comments>http://www.zdrojak.cz/clanky/zaciname-psat-aplikace-pro-windows-store-v-html5-dil-5/#comments</comments>
		<pubDate>Thu, 16 May 2013 22:00:16 +0000</pubDate>
		<dc:creator>Štěpán Bechynský</dc:creator>
				<category><![CDATA[Různé]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[windows 8]]></category>
		<category><![CDATA[Windows Store]]></category>

		<guid isPermaLink="false">http://www.zdrojak.cz/clanky/?p=8299</guid>
		<description><![CDATA[ <div><img width="100" height="100" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/html5-windows-store-100px.png" class="attachment-post-thumbnail wp-post-image" alt="Html5 windows Store 100px" /></div>V dnešním díle se budeme věnovat dlaždicím a oznámením. Dlaždice jsou unikátní funkčnost Windows 8. Kromě základní funkce, spouštění Windows Store aplikací, slouží také k zobrazování informací. Např. aplikace Počasí zobrazuje aktuální situaci přímo na dlaždici. Tyto dlaždice se označují jako živé.]]></description>
				<content:encoded><![CDATA[ <div><img width="100" height="100" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/html5-windows-store-100px.png" class="attachment-post-thumbnail wp-post-image" alt="Html5 windows Store 100px" /></div><p>Oznámení slouží k okamžitému informování uživatele, např. na nový e-mail. Oznámení se zobrazují vždy na vrchu i v případě, že uživatel pracuje v desktopovém prostředí.</p>
<p>Obě funkce, živé dlaždice a oznámení, může uživatel vypnout.</p>
<p><img class="aligncenter size-full wp-image-8305" alt="Dlaždice" src="http://www.zdrojak.cz/wp-content/uploads/2013/05/image1.png" width="249" height="121" /></p>
<h2>Dlaždice</h2>
<p>Dlaždice vám poskytuje dvě vrstvy, na které můžete vypisovat informace. Základní vrstva je určena pro komplexní informace a stará se o ni objekt TileUpdateManager. Druhá vrstva, která je řízena objektem BadgeUpdateManager, vám umožňuje do pravého dolního rohu vložit číslo od 1 do 99+ nebo jeden z <a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh779719.aspx">jedenácti symbolů</a>.</p>
<p>Barvu pozadí dlaždice a textu na dlaždici nastavujete v souboru package.appxmanifest.</p>
<p><a href="http://www.zdrojak.cz/wp-content/uploads/2013/05/image2.png" rel="lightbox-8299"><img class="aligncenter size-medium wp-image-8306" alt="Barva dlaždice" src="http://www.zdrojak.cz/wp-content/uploads/2013/05/image2-450x115.png" width="450" height="115" /></a></p>
<h3>Šablony dlaždic a oznámení</h3>
<p>Rozvržení obsahu na dlaždici nebo oznámení je řízeno pomocí šablon. Šablony jsou popsány pomocí XML.</p>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh761491.aspx">Katalog šablon pro dlaždice</a>.</li>
<li><a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh761494.aspx">Katalog šablon pro oznámení</a>.</li>
</ul>
<h3>Možnosti aktualizace dlaždic</h3>
<p>Dlaždici může změnit běžící aplikace tak, že do fronty zařadí vzhledy dlaždic a je možné určit dobu platnosti a kdy se má dlaždice zobrazit (ScheduledTileNotification). Další možnost je vytvořit tzv. periodickou aktualizaci. Obsah dlaždice je generován na serveru a systémová služba TileUpdateManager si v pravidelném intervalu stahuje nový vzhled dlaždice. Na serveru se vlastně <a href="http://stepanb.azurewebsites.net/GetTile.cshtml">generuje xml soubor</a>, který odpovídá vybrané šabloně. Poslední možností je využití <a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh913756.aspx">Windows Notification Service</a>.</p>
<h3>TileUpdateManager</h3>
<p>Princip je velmi jednoduchý. Stačí si vybrat šablonu, naplnit ji, vytvořit dlaždici a tu předat systémové službě. V následujícím příkladu si ukážeme využití periodických aktualizací:</p>
<pre><code>var notifications = Windows.UI.Notifications; notifications.TileUpdateManager.createTileUpdaterForApplication().startPeriodicUpdate(
    new Windows.Foundation.Uri("http://stepanb.azurewebsites.net/GetTile.cshtml"),
    notifications.PeriodicUpdateRecurrence.halfHour);</code></pre>
<h3>BadgeUpdateManager</h3>
<p>Podle toho, jestli chcete zobrazit číslo nebo znak, si musíte vybrat příslušnou šablonu, kterou pak naplníte.</p>
<p><b>Číslo:</b></p>
<pre><code>var badgeXml = Notifications.BadgeUpdateManager.getTemplateContent(Notifications.BadgeTemplateType.badgeNumber);
var badgeAttributes = badgeXml.getElementsByTagName("badge");
badgeAttributes[0].setAttribute("value", "7"); </code></pre>
<p><b>Symbol:</b></p>
<pre><code>var badgeXml = Notifications.BadgeUpdateManager.getTemplateContent(Notifications.BadgeTemplateType.badgeGlyph);
var badgeAttributes = badgeXml.getElementsByTagName("badge");
badgeAttributes[0].setAttribute("value", "newMessage");</code></pre>
<p>Takto vytvořený Bage Tile přidáte na dlaždici:</p>
<pre><code>var badgeNotification = new Notifications.BadgeNotification(badgeXml);
Notifications.BadgeUpdateManager.createBadgeUpdaterForApplication().update(badgeNotification);</code></pre>
<h2>Oznámení</h2>
<p>Princip oznámení je velmi podobný jako u dlaždic. Výjimkou jsou periodické aktualizace, ty nelze použít pro oznámení. Oznámení musíte také povolit v package.appxmanifest.</p>
<p><a href="http://www.zdrojak.cz/wp-content/uploads/2013/05/image3.png" rel="lightbox-8299"><img class="aligncenter size-medium wp-image-8307" alt="Oznámení" src="http://www.zdrojak.cz/wp-content/uploads/2013/05/image3-450x206.png" width="450" height="206" /></a></p>
<pre><code>var notifications = Windows.UI.Notifications;

var template = notifications.ToastTemplateType.toastImageAndText01;
var toastXml = notifications.ToastNotificationManager.getTemplateContent(template);

var toastTextElements = toastXml.getElementsByTagName("text");
toastTextElements[0].appendChild(toastXml.createTextNode("Hello World!"));

var toastImageElements = toastXml.getElementsByTagName("image");
toastImageElements[0].setAttribute("src", "ms-appx:///images/logo.png");
toastImageElements[0].setAttribute("alt", "red graphic");

var toast = new notifications.ToastNotification(toastXml);

var toastNotifier = notifications.ToastNotificationManager.createToastNotifier();
toastNotifier.show(toast);
</code></pre>
<h2> Přiložené zdrojové kódy ukázek</h2>
<ul>
<li><a href="http://www.zdrojak.cz/wp-content/uploads/2013/05/5-Badge-TileJavascript.zip">Badge TileJavascript</a></li>
<li><a href="http://www.zdrojak.cz/wp-content/uploads/2013/05/5-TemperatureLoggerClient.zip">TemperatureLoggerClient</a></li>
<li><a href="http://www.zdrojak.cz/wp-content/uploads/2013/05/5-ToastNotificationBasicJS.zip">ToastNotificationBasicJS</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.zdrojak.cz/clanky/zaciname-psat-aplikace-pro-windows-store-v-html5-dil-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vytváříme Hello World pro WebGL</title>
		<link>http://www.zdrojak.cz/clanky/vytvarime-hello-world-pro-webgl/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=vytvarime-hello-world-pro-webgl</link>
		<comments>http://www.zdrojak.cz/clanky/vytvarime-hello-world-pro-webgl/#comments</comments>
		<pubDate>Tue, 14 May 2013 22:00:32 +0000</pubDate>
		<dc:creator>Ondřej Žára</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[WebGL]]></category>

		<guid isPermaLink="false">http://www.zdrojak.cz/clanky/?p=8124</guid>
		<description><![CDATA[ <div><img width="100" height="100" src="http://www.zdrojak.cz/wp-content/uploads/2013/05/webgl.png" class="attachment-post-thumbnail wp-post-image" alt="WebGL" /></div>Když jsem se před časem poprvé ponořil do světa WebGL, začínal jsem na zelené louce. Kdybych chtěl mít rychle nějaký výstup, jistě bych sáhnul po hotovém řešení, poskytujícím přímo graf scény (například vynikající <a href="http://threejs.org/">three.js</a>). Já chtěl ale vědět, jak a proč ty věci fungují; každou funkci si vyzkoušet a pochopit její účel. Své poznatky budu sepisovat, kdyby se náhodou někomu hodily...]]></description>
				<content:encoded><![CDATA[ <div><img width="100" height="100" src="http://www.zdrojak.cz/wp-content/uploads/2013/05/webgl.png" class="attachment-post-thumbnail wp-post-image" alt="WebGL" /></div><p><a href="http://en.wikipedia.org/wiki/WebGL">WebGL</a> asi není třeba dlouze představovat &#8211; jde o JavaScriptové API pro akcelerované vykreslování grafiky do HTML canvasu; rozhraní je navrženo tak, aby bylo architektonicky identické s <a href="http://en.wikipedia.org/wiki/OpenGL_ES">OpenGL ES 2.0</a>. Pokud tedy máte s OpenGL nějakou zkušenost (já neměl žádnou), bude pro vás tento článek možná zbytečný a nezáživný.</p>
<h2>Co vývojáře po prvních pár experimentech s WebGL nejvíce zaujme?</h2>
<ul>
<li><a href="http://caniuse.com/#feat=webgl">Podpora prohlížečů</a> je dobrá, ale může se lišit v závislosti na konkrétním hardwaru či operačním systému.</li>
<li>WebGL je kromobyčejně ukecané, v porovnání s typickým JS API. To je daň za ohromnou flexibilitu a výkon.</li>
<li>WebGL se mizerně ladí; zpravidla je lepší postupovat po malých krůčcích a dokázat případné problémy redukovat a izolovat.</li>
<li>Na WebGL i OpenGL není skoro nic <em>trojrozměrné</em>; většinu 3D věcí si človek musí zařídit sám.</li>
</ul>
<p>Během tohoto úvodního článku zkusíme vytvořit nejmenší funkční ukázku WebGL: nakreslíme jeden barevný bod. Něco takového je v tradičním 2D canvasu otázkou tří řádků kódu (viz článek <a href="http://www.zdrojak.cz/clanky/canvas-rikejme-tomu-plocha-na-kresleni/">Canvas – říkejme tomu plocha na kreslení</a>); řešení ve WebGL je o poznání složitější a okouknout ho můžeme na této adrese: <a href="http://jsfiddle.net/ondras/qt7sk/">http://jsfiddle.net/ondras/qt7sk/</a>.</p>
<h3>Pojďme se nejprve podívat, co všechno WebGL potřebuje, aby mohlo něco vykreslit:</h3>
<ol>
<li>Souřadnice prvků, které chceme vykreslovat. Můžou být jedno- až čtyřrozměrné; v našem případě to bude jeden dvourozměrný bod.</li>
<li>Vertex shader; program, jehož úkolem je zejména přepočítat naše vlastní souřadice do tzv. <em>clipspace</em>, souřadného systému pro vykreslování v canvasu.</li>
<li>Fragment shader (někdy též méně korektně nazývaný <em>pixel shader</em>); program, jehož úkolem je spočítat barvu jednotlivých bodů všech vykreslovaných objektů.</li>
</ol>
<p>Abychom mohli s WebGL cokoliv dělat, musíme nejprve z HTML canvasu získat kontext:</p>
<pre><code>var gl = document.querySelector("canvas").getContext("experimental-webgl");</code></pre>
<p>Všechna následná volání budou metody objektu <code>gl</code>. Název &#8222;experimental-webgl&#8220; je dočasný (i když jej používají všechny současné prohlížeče) a bude v budoucnu nahrazen plnohodnotným &#8222;webgl&#8220;.</p>
<h2>Shadery</h2>
<p>Vertex i fragment shader jsou programy v jazyce, který byl velmi originálně nazván <a href="http://en.wikipedia.org/wiki/GLSL">GLSL</a> (GL Shading Language). Tyto programy jsou vykonávány přímo na GPU <em>(přesněji: ovladač grafické karty je kompiluje do kódu, který je vykonáván na GPU),</em> a proto jsou extra rychlé. Pro nás to bohužel znamená nutnost naučit se krom WebGL API ještě další jazyk, ale naštěstí to není nic složitého. Jeho syntaxe je podobná C a pro náš testovací program budou oba shadery triviální. Zdrojový kód shaderů se ve WebGL předává jako řetězec; můžeme ho proto uložit do JS stringu, do externího souboru (XHR) nebo do uzlu <code>&lt;script&gt;</code> ve stránce. Pro naše účely bude bohatě stačit předání v JS řetězci. Ve WebGL musíme shader nejprve vytvořit, pak mu předat zdrojový kód a pak ho zkompilovat. Jak bude vypadat ten náš?</p>
<pre><code>attribute vec2 pos;

void main(void) {
    gl_Position = vec4(pos, 0.0, 1.0);
    gl_PointSize = 5.0;
}
</code></pre>
<p>Jeho vstupem je proměnná (dvourozměrné pole) <code>pos</code>; hlavním úkolem vertex shaderu je naplnit pro každý vstupní bod vestavěnou proměnnou <code>gl_Position</code>, která odpovídá výslednému umístění bodu. Zajímavé je, že <code>gl_Position</code> je čtyřrozměrné pole; proto k našemu dvourozměrnému doplníme nulu (na ose Z; tato hodnota nás vůbec nezajímá) a jedničku. Jednička na konci je důležitá: <code>gl_Position</code> je tzv. <a href="http://en.wikipedia.org/wiki/Homogeneous_coordinates">homogenní souřadnice</a>, která u bodů v prostoru potřebuje poslední hodnotu právě jedna. <em>(Proč? Více o tomto v některé z dalších kapitol, kde si povíme o tom, jak přesně probíhá výpočet pozice v canvasu.)</em> Jako bonus ještě nastavíme vestavěnou hodnotu <code>gl_PointSize</code>, aby náš bod vypadal větší než jeden pixel.</p>
<p>A můžeme jít na další shader:</p>
<pre><code>void main(void) {
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
</code></pre>
<p>Fragment shader je ještě jednodušší: do vestavěné proměnné <code>gl_FragColor</code> akorát přiřadí červenou. Barvy se zapisují též jako čtyřrozměrné vektory; čtvrtá složka je průhlednost (1 = žádná průhlednost). Všechny složky jsou hodnoty mezi nulou a jedničkou.</p>
<p>Následně z obou shaderů vytvoříme tzv. <em>OpenGL program</em> a nastavíme jej jako aktivní. To proto, že v praxi budeme chtít mít k dispozici programů/shaderů celou řadu:</p>
<pre><code>var program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.useProgram(program);
</code></pre>
<p>Dále si &#8222;sáhneme&#8220; na vstupní hodnotu vertex shaderu (<code>pos</code>) a řekneme, že její hodnotu budeme definovat pomocí JS pole:</p>
<pre><code>var posLoc = gl.getAttribLocation(program, "pos");
gl.enableVertexAttribArray(posLoc);
</code></pre>
<p>Většina příprav je za námi, jde se renderovat! Vlastně ne, ještě jsme nikam nezadali naši geometrii, respektive souřadnice našeho jediného bodu. Pro tento účel se musíme seznámit s <em>buffery</em>.</p>
<h2>Buffery</h2>
<p>Veškerá data, předávaná do GPU, jsou uložena v tzv. bufferech &#8211; kusech paměti, rychle přístupných z grafické karty. Práce s buffery může vypadat podivně, protože připomíná stavový automat: nejprve nastavíme buffer jako aktivní (<code>bindBuffer</code>) a tím říkáme, že všechny následné operace budou prováděny právě nad ním. Žádné předávání bufferů jako parametrů.</p>
<pre><code>var posBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, posBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0.5, 0.5]), gl.STATIC_DRAW);
</code></pre>
<p>Konstantou <code>gl.ARRAY_BUFFER</code> specifikujeme, že chceme pracovat s obecným polem. Ještě je tu varianta <code>gl.ELEMENT_ARRAY_BUFFER</code>, o které si povíme někdy příště. Voláním <code>bufferData</code> nahrajeme zadané JS pole (musí to být <a href="https://developer.mozilla.org/en-US/docs/JavaScript/Typed_arrays">typované pole</a>, v našem případě <code>Float32Array</code>) do paměti grafické karty. Třetí parametr (<code>gl.STATIC_DRAW</code>) říká, jak máme v plánu tato data využívat a měnit: v našem případě říkáme, že je nechceme měnit vůbec.</p>
<pre><code>gl.vertexAttribPointer(posLoc, 2, gl.FLOAT, false, 0, 0);
</code></pre>
<p>Tímto voláním provážeme právě aktivní buffer (ten, kde jsou souřadnice našeho bodu) s vstupem vertex shaderu. Dalšími parametry říkáme, že se z bufferu bude číst po dvou hodnotách, že to jsou destinná čísla, že je nechceme normalizovat, že nechceme žádné hodnoty přeskakovat a že budeme číst od začátku bufferu. Uff!</p>
<pre><code>gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.POINTS, 0, 1);
</code></pre>
<p>Konečně jsme něco namalovali! Voláním <code>clearColor</code> nastavujeme barvu, kterou se má canvas vymazat (černou). Voláním <code>clear</code> plátno vymažeme a vposled dáme pokyn k vykreslení. Naši geometrii chceme vykreslovat jako prosté body (<code>gl.POINTS</code>), začneme na prvním a vykreslíme jeden. Vidíme červený čtvereček, hurá!</p>
<div class="rs-tip-major">
<h2>Celý zdrojový kód z tohoto článku</h2>
<p>Ve spustitelné podobě ho najdete na <a href="http://jsfiddle.net/ondras/qt7sk/">http://jsfiddle.net/ondras/qt7sk/</a>, kde s ním můžete dále experimentovat (třeba při řešení domácího úkolu).</p>
<pre><code>var gl = document.querySelector("canvas").getContext("experimental-webgl");

var vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, 'attribute vec2 pos; void main(void) { gl_Position = vec4(pos, 0.0, 1.0); gl_PointSize = 5.0;}');
gl.compileShader(vertexShader);

var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, 'void main(void) {gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);}');
gl.compileShader(fragmentShader);

var program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.useProgram(program);

var posLoc = gl.getAttribLocation(program, "pos");
gl.enableVertexAttribArray(posLoc);

var posBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, posBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0.5, 0.5]), gl.STATIC_DRAW);
gl.vertexAttribPointer(posLoc, 2, gl.FLOAT, false, 0, 0);

gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.POINTS, 0, 1);
</code></pre>
<div class="cb"></div>
</div>
<h2>Domácí úkol</h2>
<p>Na konec této kapitoly můžeme zvážit nějaká drobná vylepšení za domácí úkol:</p>
<ul>
<li><strong>Změnit barvu bodu?</strong> Jasně, stačí upravit fragment shader.</li>
<li><strong>Změnit pozici bodu?</strong> Jasně, stačí upravit pole souřadic, předávané v metodě <code>bufferData</code>.</li>
<li><strong>Vykreslit více bodů?</strong> Jasně, přidat další souřadnice do pole bodů a zvýšit jejich počet v metodě <code>drawArrays</code>.</li>
<li><strong>Vykreslit body jako kolečka?</strong> Pokud se čtverečky nelíbí, bude to obtížnější. Takovou úpravu bychom provedli ve fragment shaderu (který je vykonáván pro každý vykreslovaný pixel). Přidali bychom test hodnoty <code>gl_PointCoord</code>, která nabývá hodnot mezi nulou a jedničkou a určuje vzdálenost od středu vykreslovaného vrcholu. Pokud by vzdálenost od středu byla vyšší než zadaný poloměr, bod bychom vykreslili jinou barvou (např. průhlednou).</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.zdrojak.cz/clanky/vytvarime-hello-world-pro-webgl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScriptové MVC frameworky (reakce na článek Ondřeje Žáry)</title>
		<link>http://www.zdrojak.cz/clanky/javascriptove-mvc-frameworky-reakce-na-clanek-ondreje-zary/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=javascriptove-mvc-frameworky-reakce-na-clanek-ondreje-zary</link>
		<comments>http://www.zdrojak.cz/clanky/javascriptove-mvc-frameworky-reakce-na-clanek-ondreje-zary/#comments</comments>
		<pubDate>Sun, 12 May 2013 22:00:23 +0000</pubDate>
		<dc:creator>Daniel Steigerwald</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://www.zdrojak.cz/clanky/?p=8149</guid>
		<description><![CDATA[Jaký je současný stav MVC frameworků v JavaScriptu. Jsou tou správnou cestou? Minule nám svůj <a href="http://www.zdrojak.cz/clanky/javascriptove-mvc-frameworky/">subjektivní pohled</a> předložil Ondřej Žára, dnes na něj reaguje Daniel Steigerwald. ]]></description>
				<content:encoded><![CDATA[<p>Ondřej Žára předminulý týden napsal <a href="http://www.zdrojak.cz/clanky/javascriptove-mvc-frameworky/">článek</a>, který mne zaujal. Předně, považuji Onřeje za špičkového programátora, ale v některých názorech s ním nesouhlasím. A nebo jen špatně čtu mezi řádky, i to je možné. Co se týká přehledu frameworků, ten by vydal na samostatný článek. Mimochodem, zrovna minulý víkend jsem na podobné téma přednášel na pardubickém <a href="http://pardubice.devfest.cz/">DevFestu</a>.</p>
<h2>Proč dávám přednost šablonám před DOM manipulací</h2>
<p>Kdysi dávno jsem šablony také nepoužíval. Teď je používám skoro vždy. Proč?</p>
<h3>Bezpečnost, XSS a vůbec</h3>
<p>Známá věc, programátor zapomene někde escapovat string, a je problém. Se šablonovacím systémem na to myslet nemusím (tolik), viz také <a href="https://developers.google.com/closure/templates/docs/security">developers.google.com/closure/templates/docs/security</a>.</p>
<h3>Rychlost</h3>
<p>innerHTML je stále nejrychlejší. V Google Closure se šablony kompilují do funkcí. Celá aplikace je tedy jeden JavaScript. Ten obsahuje kód, HTML v šablonách, texty. Třeba takový <a href="http://tapomat.cz">tapomat.cz</a>, celá aplikace má jen pár desítek kb.</p>
<h3>Události</h3>
<p>Opravdu není nutné registrovat onclick na každý řádek tabulky. Máme event bubbling a event delegation. V Este vyrenderuji třeba seznam objednávek, a click (respektive <a href="https://coderwall.com/p/bdxjzg">tap</a> event) dostane v listeneru <a href="https://github.com/Steida/este-library/blob/master/demos/app/todomvc/js/todos/list/view.coffee#L74">přímo model konkrétní objednávky</a>. Registrace bublajících událostí je velmi jednoduchá, viz <a href="http://este.jit.su/bower_components/este-library/demos/component.html">demo</a>. Díky bublání eventů můžeme obsah elementu přerenderovávat přes innerHTML kolikrát chceme, a není nutné eventy deregistrovat.</p>
<h3>Lokalizace</h3>
<p>V Google Closure Templates mám perfektní podporu lokalizace. Stačí si pamatovat vždy použít <code>&lt;msg&gt;</code> pro šablony a <code>goog.getMsg</code> pro kód, a lokalizace je hračka, i když se aplikaci rozhodnete lokalizovat poté, co je rok ve vývoji. Mimochodem, nepoužité překlady Closure Compiler při kompilaci odstraní, takže není třeba řešit bobtnání slovníků.</p>
<h3>Pořádek</h3>
<p>Každá šablona, respektive vykompilovaná funkce z ní, je umístěná ve svém namespace. Aplikace se skládá z features, a pomocí feature toggle a Closure Compileru můžu vykompilovat jen to, co je třeba. Příklad, mobilní verze nebude mít administraci. Jeden projekt, dva vykompilované soubory pro každé zařízení zvlášť. Veliký pokrok proti script tagům v HTML stránce!</p>
<h3>Budoucnost a Angular</h3>
<p>Angular se od všech ostatních MVC frameworků liší tím, že používá něco, co bude jednou součástí nativního api prohlížeče (takže to bude používat i Ondrej Žára ). Ano, šablonovací systém Angularu je něco jako polyfill pro <a href="https://github.com/toolkitchen/mdv">github.com/toolkitchen/mdv</a>. To je mimochodem důvod, proč Este nemá něco jako Angulaří šablony. Este má svoje vlastní postupy a časem bude zahrnovat i vlastní <acronym title="Model-driven Views">MDV</acronym> polyfill.</p>
<div class="rs-tip-major">
<p>Jmenuji se Daniel Steigerwald a pomáhám firmám i jednotlivcům s vývojem webových aplikací. Pořádám školení, která si můžete objednat na <a href="http://javascript-skoleni.cz/">javascript-skoleni.cz</a>. Pokud máte dotazy, <a href="mailto:daniel@steigerwald.cz">napište mi</a>.</p>
<div class="cb"></div>
</div>
<h2>MVC Frameworky</h2>
<p>Framework není nic jiného, než předprogramovaná aplikace. Zajímavé je, že v Google Closure žádný jeden univerzální MVC framework není. Proč Closure nemá jeden MVC framework? Protože v Googlu má každý tým vlastní framework. Jeden pro mapy, další pro Google Docs, a tak dále. Většina JS programátorů ale nepíše mapy nebo Google Docs. Chtějí SPA (Single Page Applications). A tam narazí na mnoho již vyřešených problémů. Například routing. Ten mimochodem naprostá většina MVC frameworků řeší <a href="https://medium.com/joys-of-javascript/4353246f4480">špatně</a>, (krom <a href="https://github.com/Steida/este-library/tree/master/app">Este MVC</a> samozřejmě).</p>
<p>Onřej má tedy pravdu, že na specifické příklady se hodí framework vlastní. Ale na 80 % zbytku je dobré postavit se na záda někomu, kdo SPA MVC aplikaci už psal.</p>
<p>Existuje ještě třetí možnost. Pokud MVC framework není monolitický bastl, můžu si půjčit jen to, co potřebuji. Příklad. Este MVC používá este.Model, este.Collection, este.Router, este.este.storage.* a tak dále. Nicméně, ve vaší aplikaci můžete využít třeba jen <a href="http://este.jit.su/bower_components/este-library/demos/routerhtml5.html">este.Router</a> a <a href="http://este.jit.su/bower_components/este-library/demos/storage/local.html">este.storage.Local</a>.</p>
<h2>Onřej Žára TODO MVC</h2>
<p><a href="https://github.com/ondras/todomvc/tree/gh-pages/vanilla-examples/vanillajs-ondras">TodoMVC Ondřeje Žáry</a> je technologická hříčka. Tímto způsobem se píší příspěvky do soutěže <a href="http://js1k.com">js1k.com</a>. Psát takto něco většího by byla katastrofa. Co když budeme chtít vyrenderovat todo v jiném pohledu? Budeme muset rozdělit soubor todo.js na model a jeho view. Co když budeme chtít zpracovávat více cest, napíšeme si vlastní router? A tak dále, ale já myslím, že Ondřej tohle ví, a zmiňuji to zde hlavně proto, aby někoho nenapadlo psát JS aplikaci podobným způsobem. Frameworky jsou dobrá věc. Neřešte, co už je vyřešené.</p>
<h2>Este TODO MVC</h2>
<p>TodoMVC <a href="http://este.jit.su/bower_components/este-library/demos/app/todomvc/">demo</a> napsané nad <a href="https://github.com/Steida/este-library/tree/master/app">este.App</a>. Možná vás zarazí velikost &#8211; 496 kb JavaScriptu! Ale to je v pořádku. V Closure můžeme psát velkoryse, není třeba se omezovat. Klidně můžeme použít takovouhle obří <a href="http://este.jit.su/bower_components/closure-library/closure/goog/dom/tagname.js">enumeraci</a>, nebo implementaci <a href="http://este.jit.su/bower_components/closure-library/closure/goog/storage/mechanism/ieuserdata.js">localStorage pro IE 6 a 7</a>. Nemyslete si ale, že jsem musel explicitně ten kód volat, přidávat <code>script</code> tag, nebo něco takového. Stačilo <code>goog.require('este.storage.Local');</code> a můžu používat svou vlastní <a href="https://github.com/Steida/este-library/blob/master/storage/local.coffee">local storage</a>. Closure a Este se postará o zbytek. Tento mód používáme při vývoji. Pro nasazení použijeme vykompilovanou verzi. Vykompilovaná Este TodoMVC app má 22 kb (po gzipu). Mimochodem, nemá smysl řešit velikost bez gzipu. Ten podporují všechny prohlížeče, a Closure Compiler navíc optimalizuje kód tak, aby se dobře kompresil. 22 kb se šablonama, logikou, podporou IE, MVC frameworkem, lokalizací <a href="http://closure-library.googlecode.com/svn/docs/closure_goog_i18n_pluralrules.js.source.html#line32">plural rules</a> a mnoho další. Pro srovnání, samotné jQuery má něco kolem 32 kb.</p>
<h2>Závěr</h2>
<p>Onřej Žára napsal pěkný článek, který snad pomůže vybrat si framework. Líbí se mi, jak šel do architektonických detailů. S jeho závěry však nesouhlasím. Zkusil jsem si oba způsoby vývoje, psát si všechno sám a reuse, a neměnil bych. V Google Closure Library je tak neskutečné množství perfentního otestovaného kódu, že by byla fakt veliká škoda jej nevyužít. Velikost a rychlost výsledné aplikace je díky Closure Compileru naprosto bezkonkurenční. Většina aplikací je menší než samotné jQuery.</p>
<h3>Odpovědi na <a href="http://www.zdrojak.cz/clanky/javascriptove-mvc-frameworky/#mvc-otazky">otázky z předchozího článku</a>:</h3>
<p class="rs-question">Rozumím tomu nástroji dobře? Dokážu v implementaci ospravedlnit existenci každé řádky svého kódu a vysvětlit, proč ho používám?</p>
<p class="rs-answer">Ano, v Closure i Este mám všude podrobné testy a dema. Nevím o jiné knihovně tak dobře pokryté testy a zdokumentované.</p>
<p class="rs-question">Bude výslednému kódu rozumět i ten, kdo k němu přijde po mně? I za dva roky?</p>
<p class="rs-answer">Jasně, Closure je v produkci už od roku 2007. Většina kódu se vůbec nemění, knihovna je stabilizovaná, breaking change jsem nezažil. Co se týká Este, snažím se psát hodně malých tříd, a minimalizovat breaking change. Změna signatury metody například, je navíc díky compileru bezpečná.</p>
<p class="rs-question">Volím framework proto, že je to nejlepší řešení mého problému? Nebo jen proto, že mi ho někdo doporučil a/nebo je zrovna in něco takového používat?</p>
<p class="rs-answer">Volím Google Closure, a nad ním postavené <a href="http://github.com/Steida/este">Este</a>, protože jsem napsal zilióny řádků v jQuery, Mootools, YUI, a dalších. Špatné cesty jsem si poctivě prošlapal.</p>
<p class="rs-question">Ospravedlní mi těch pár uspořených kilobajtů aplikačního kódu přítomnost frameworku, který leckdy sahá na několik set kilobajtů?</p>
<p class="rs-answer">Je to naopak. :) S Closure jsou moje aplikace řádově menší než aplikace jiných frameworků. Zdrojáky jsou obrovské, ale výsledný kompilovaný script maličký.</p>
<p class="rs-question">Je pro mne práce s DOMem skutečně tolik obtížná a repetitivní, že kvůli ní musím klesnout k užití string-based šablon?</p>
<p class="rs-answer">Ani ne, ale používám ji tam, kde to dává smysl. Třeba když přepínám pohledy, píšu komponentu (ale ta též může využívat šablony), a podobně. Když jde o HTML strukturu, šablony používám vždy. Je to velmi praktické a pohodlné.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zdrojak.cz/clanky/javascriptove-mvc-frameworky-reakce-na-clanek-ondreje-zary/feed/</wfw:commentRss>
		<slash:comments>48</slash:comments>
		</item>
		<item>
		<title>JavaScriptové MVC frameworky</title>
		<link>http://www.zdrojak.cz/clanky/javascriptove-mvc-frameworky/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=javascriptove-mvc-frameworky</link>
		<comments>http://www.zdrojak.cz/clanky/javascriptove-mvc-frameworky/#comments</comments>
		<pubDate>Fri, 03 May 2013 09:00:53 +0000</pubDate>
		<dc:creator>Ondřej Žára</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://www.zdrojak.cz/clanky/?p=8047</guid>
		<description><![CDATA[Subjektivní pohled Ondřeje Žáry na současný stav MVC frameworků v JavaScriptu. Jsou opravdu tou správnou cestou?]]></description>
				<content:encoded><![CDATA[<h2>0 Varování</h2>
<p>Tento text odráží osobní názory a je pravděpodobné, že s ním <a href="http://xkcd.com/386/">nebudete souhlasit</a>. Když ale dočtete až ke <a href="#tretikapitola">třetí kapitole</a>, budete moci osobní názory objektivně konfrontovat přímo s konkrétní implementací.</p>
<h2>1 Historický exkurz</h2>
<p>MVC jako paradigma psaní webových aplikací existuje od nepaměti. Studentům každý rok do hlavy vtloukáme, že dokud bude výsledkem jejich práce spaghetti code, nelze mluvit o udržovatelnosti, čitelnosti a podobně.</p>
<p>Na MVC přitom nic objevného není &#8211; je to jen konkrétní aplikace <a href="http://en.wikipedia.org/wiki/Single_responsibility_principle">SRP</a>, <a href="http://en.wikipedia.org/wiki/Separation_of_concerns">SoC</a> a podobně v prostředí interaktivního uživatelského rozhraní, syceného daty z nějakého (DB) úložiště. Právě proto se při tradičním psaní webů žádný MVC framework nepoužívá (a přesto to MVC je): prostě se výsledné HTML renderuje šablonou (view), data se papají z nějak abstrahované databáze (model) a zbytek &#8211; což může být párřádkový skript i všechoschopný moloch &#8211; se stará o logiku spolupráce těchto dvou (controller).</p>
<p>Veškeré serverové logice se samosebou občas říka framework (Nette, Zend, &#8230;); to je ale proto, že tím autor dává najevo, že jeho kód se umí postarat o všechny aspekty zpracovávání požadavků (jinak by to byl toolkit, knihovna, nebo něco obdobného). A zrovna náhodou při implementaci použil MVC, proč ne.</p>
<p>Během boomu JavaScriptových aplikací (čti: webových stránek, ve kterých logiku zpracovávání interakce a zobrazování dat realizuje klientský JavaScript) však kdosi přichází s myšlenkou, že “serverové MVC” by z jakéhosi důvodu mělo mít svůj klientský komplement &#8211; když to dobře fungovalo v místě A, jistě to bude skvěle fungovat i v místě B. (“Polsko jsme zabrali bez problémů. Co takhle to zkusit ještě s Ruskem?”)</p>
<p>Jaké argumenty v takových chvílích slýcháme?</p>
<ol>
<li>“Vyrábět větší kusy HTML JavaScriptem je opruz. Proto potřebujeme JS šablony.”</li>
<li>“Můj web už obsahuje více než N řádků JS, z čehož je patrné, že se JavaScript stal hlavní komponentou stránky. Je na čase použít nějaký nástroj, který mi usnadní jeho psaní a zařídí, abych toho kódu nemusel psát tolik.”</li>
<li>“Programátoři na backendu používají MVC. Jaká ostuda, že já se svým JavaScriptem také nemám něco tak prďáckého!”</li>
</ol>
<p>Za těchto okolností proto světlo světa spatřují JavaScriptové šablonovací systémy: klientské skripty, které na vstupu dostávají strukturovaná data a pseudo-HTML šablonu; provedou substituci a vrátí výsledný fragment HTML dokumentu. Nikdo pořádně neví, jak to dělat &#8211; kolik logiky v šablonách nabízet (<a href="http://mustache.github.io/">mustache</a>: logic-less templates), jestli duplikovat serverovou syntaxi (<a href="http://embeddedjs.com/">ejs</a>, <a href="http://underscorejs.org/">underscore</a>), jak napasovat nutnost šablonovacích direktiv na fragmenty HTML (<a href="https://github.com/flatiron/plates">plates</a>, <a href="http://beebole.com/pure/documentation/get-started/">PURE</a>). Ve <a href="http://www.google.com/trends/explore#q=%22javascript+template%22">finále</a> je <a href="http://stackoverflow.com/search?q=javascript+templates">rozhodně</a> z <a href="http://garann.github.io/template-chooser/">čeho</a> <a href="https://developer.mozilla.org/en-US/docs/JavaScript_templates">vybírat</a>.</p>
<p><a href="http://www.zdrojak.cz/wp-content/uploads/2013/05/javascript-template.png" rel="lightbox-8047"><img class="aligncenter size-full wp-image-8056" alt="javascript template" src="http://www.zdrojak.cz/wp-content/uploads/2013/05/javascript-template.png" width="796" height="376" /></a></p>
<h2>2 Šablony a jejich zásadní nedostatek</h2>
<p>Použití šablonovacího systému na serverové straně bylo posledním krokem před dokončením zpracování požadavku: typický controller měl na svém posledním řádku něco jako template.render(data). Ve světě JavaScriptových šablon ale nekončíme vykreslením; jedná se o interaktivní aplikaci, a proto je nutné na vzniklou DOM strukturu ještě navěsit relevantní posluchače. Tím se dostáváme k zásadnímu problému všech šablonovacích systémů, jejichž výstupem je řetězec: není možné přímočaře pracovat s posluchači. Z výsledku je prve nutno postavit strom (<code>innerHTML</code>), ten procházet (<code>querySelector</code>) a přidávat události (<code>addEventListener</code>). A právě procházení je pracné a vyžaduje jasně a jednoznačně definované API mezi stránkou a JS (například pomocí atributů ID či class). Tato skutečnost je hlavním koncepčním nedostatkem samotných JavaScriptových šablon.</p>
<p>V tuto chvíli je možná na místě připomenout, že zmiňovaný neduh vůbec nepřipadá v úvahu při tradičním psaní JavaScriptu, známém též jako DOM manipulation. Uzly, které vyrobím pomocí createElement (nebo nějaké nadstavby), mám okamžitě k ruce a ve vhodnou chvíli na nich události pořeším.</p>
<p>A nyní přichází konfrontace s prvním argumentem, zmiňovaným v předchozí kapitole &#8211; totiž že DOM manipulation je opruz, je to pracné, je to zdlouhavé a ušetřený čas by se mohl věnovat něčemu užitečnějšímu. Jaké stanovisko k tomuto zaujmout?</p>
<p>Autor tohoto textu píše JavaScriptové aplikace zhruba <a href="http://ajaxian.com/archives/www-sql-designer">osm let</a> a zastává názor, že zmiňovaný argument je prázdná fráze. Proč?</p>
<ol>
<li>Práce s DOMem může být pracná, ale k tomu slouží různá syntaktická zjednodušení, která abstrahují tyto úkony, nabízí zkrácený zápis a řeší kompatibilitu. Týká se to jak tvorby značek (<code>create(“input”, {type:“button”, value:“A”, id:“b”, color:“red”})</code>), tak konstrukce stromu (<code>ul( li(), li( a() ), li()</code>).</li>
<li>Vývojářův čas, strávený psaním DOM manipulation, je minimální v porovnání s ostatními aspekty JS aplikace: logikou zpracování událostí, komunikací s backendy, psaním chytrých algoritmů na zpracování dat. Správní vývojáři jsou <a href="http://www.hhhh.org/wiml/virtues.html">líní</a> a mohu potvrdit, že se při práci snažím maximum času přemýšlet (nad algoritmy, nad logikou toku programu, &#8230;) a jen čas od času něco málo skutečně napsat. Nikdy mi nepřišlo, že bych měl optimalizovat právě čas věnovaný tvorbě těch pár pitomých odstavců, divů a formulářových prvků.</li>
</ol>
<p>Ve světle toho, jak málo mne DOM manipulation obtěžuje, nevidím mnoho přínosů pro JavaScriptové šablonovací systémy.</p>
<p>Občas se ještě objevuje myšlenka, že oddělené šablony pak mohou spravovat úplně jiní lidé a cenný čas JS programátora může být pálen psaním hardcore JS logiky. Ani náhodou, říkám: šablona je s přidruženým JavaScriptem symbioticky provázána a jakmile do ní začne sahat někdo cizí, dříve nebo později provede nekompatibilní změnu takovou, že si na takto “opravené” šabloně vyláme kód zuby. Nebo naopak, samosebou.</p>
<p>Pojďme se nyní podívat, jakým způsobem na zmiňovaný nedostatek klientského šablonování zareagovali <a href="http://psupopculture.files.wordpress.com/2011/10/hipster_fucks.jpg" rel="lightbox-8047">chytří chlapci a děvčata</a> na Internetu.</p>
<h2 id="tretikapitola">3 MVC framework</h2>
<p>Vítejte ve světě JS MVC: nástrojů, které vzaly šablonování a doplnily do něj události. Jedná se o <a href="http://www.google.com/trends/explore#q=%22javascript%20mvc%20framework%22&amp;cmpt=q">bleeding edge technologii</a>; nové rostou jako houby po dešti a opět <a href="http://todomvc.com/">je z čeho vybírat</a>. Bylo by nespravedlivé tyto frameworky označit jen za vylepšené šablony &#8211; zpravidla toho s sebou nesou ještě mnohem více, typicky podporu pro HTTP, práci s URL a data binding. Ve finále však ale všechny sdílí jeden základní společný rys: berou nějaký šablonovací systém a dovolují vzniklé HTML počůrat tak, aby se nad ním dalo komfortně (čti: semi-automaticky) pracovat s událostmi.</p>
<p><a href="http://www.zdrojak.cz/wp-content/uploads/2013/05/javascript-mvc-frm.png" rel="lightbox-8047"><img class="aligncenter size-full wp-image-8054" alt="JavaScript MVC framework" src="http://www.zdrojak.cz/wp-content/uploads/2013/05/javascript-mvc-frm.png" width="798" height="371" /></a></p>
<p>Pokud to doposud nebylo zcela patrné, tak je nejvyšší čas odhalit hlavní sdělení tohoto článku: Dle mého názoru jsou JS MVC frameworky nafouklá bublina, která vznikla opakovaným záplatováním jednoho konkrétního nádoru. Pojďme se podívat na mé argumenty:</p>
<ol>
<li>Zmiňované počůrání HTML šablony je nekoncepční a vzniklo jako ctnost z nouze, způsobené nedostatkem JS šablonování. Více o tomto níže, u konkrétních ukázek.</li>
<li>MVC frameworky způsobují fragmentaci vývojářů. Nesdílí společná API ani vývojová paradigmata; každý je postavený dle nejlepšího vědomí a svědomí svého autora. Řadu let se JS komunita těší na konvergenci JS API v prohlížečích, aby se daly tradiční cross-browser problémy (addEventListener, querySelector, XHR, &#8230;) řešit bez zastřešujících můstků. A do této skvělé doby, kdy nekompatibilní prohlížeče skutečně mizí z trhu, najednou přichází desítky nových nástrojů se zcela odlišným zevnějškem. Hledáte JS vývojáře? Možná vám dříve stačilo, když měl skvělé povědomí o jazyce, znal prototypovou dědičnost, chápal uzávěry a event loop. Dnes už musí navíc hovořit tím dialektem JS, ve kterém je psaný firemní MVC framework &#8211; protože firemní MVC framework nectí operátor new ani klíčové slovo this; používá vlastní abstrakci, která sere na prototypy a věci, které jsou původnímu JavaScriptu blízké.</li>
</ol>
<p>V rámci férovosti je nyní dobrá chvíle pozorovat některé populární JS MVC frameworky v jejich přirozeném prostředí. Ideální je pro to služba <a href="http://todomvc.com/">TodoMVC</a>, která ukazuje implementaci triviální aplikace pomocí řady frameworků. Musíme ale opatrně &#8211; delší expozice vede k depresím z toho, v jakém marasmu se situace kolem frameworků nyní nachází.</p>
<h3>3a <a href="https://github.com/addyosmani/todomvc/tree/gh-pages/architecture-examples/emberjs">Ember.js</a></h3>
<p>Používá šablony Handlebars, což je syntaxe Mustache + další featury (explicitní IF a podobně). Ve <a href="https://github.com/addyosmani/todomvc/blob/gh-pages/architecture-examples/emberjs/index.html">vzorovém HTML</a> jsou šablony vychytrale uloženy v uzlu <code>&lt;script&gt;</code>, což jednak není pravda (není to skript, ale hybrid HTML + custom markup), a za druhé to spolehlivě zmate většinu syntax highlighterů.</p>
<p>Události jsou provázány pomocí tagu či atributu action, kterému v šabloně upřesníme DOM událost a sdělíme název metody controlleru, která ji bude zpracovávat. Zatímco dříve bylo fujfujfuj napsat <code>&lt;label ondblclick=”editTodo()”&gt;</code>, nyní je hujhujhuj varianta<code> &lt;label {{action "editTodo" on="doubleClick"}}&gt;</code>.</p>
<p>V JavaScriptové části kódu je zcela zavrhnuto new a namísto toho věci vyrábíme různými variantami extend() a create(). Nomenklatura používá různé automagické konvence; můžeme si o nich přečíst v <a href="http://emberjs.com/guides/concepts/naming-conventions/">dokumentaci</a>. Například controller <a href="https://github.com/addyosmani/todomvc/blob/gh-pages/architecture-examples/emberjs/js/controllers/todos_controller.js">TodosController</a>, který je mj. zodpovědný za přidání nové položky, je sice definován s tímto jménem, ale jinak se jeho název už nikde dále v kódu nepoužívá (což neznamená, že ho můžeme pojmenovat jak chceme &#8211; aplikace očekává, že s ohledem na pojmenování okolních věcí bude něco s tímto názvem existovat. Data binding je realizován explicitním voláním set() na controlleru, který následně notifikuje posluchače o změně hodnoty.</p>
<p>Implementační zajímavost: v Ember.js mají funkce <a href="https://github.com/addyosmani/todomvc/blob/gh-pages/architecture-examples/emberjs/js/controllers/todos_controller.js#L34">prototypovou metodu property</a>, která jim definuje metadata (závislosti), na kterých volání této funkce závisí. Mimo jiné i kvůli tomu není možno používat tradiční prototypový přístup, kdy je jedna funkce sdílena spoustou různých objektů.</p>
<h3>3b <a href="https://github.com/addyosmani/todomvc/tree/gh-pages/architecture-examples/backbone">Backbone.js</a></h3>
<p>Backbone nepoužívá žádné vestavěné šablonování, ale zhusta závisí na low-level knihovně Underscore. K provázání DOM událostí definuje <a href="https://github.com/addyosmani/todomvc/blob/gh-pages/architecture-examples/backbone/js/views/todos.js#L19">vlastní syntaxi</a>, podobnou CSS selektorům prefixovaným názvem události; zároveň s tím nabízí <a href="http://backbonejs.org/#Events">implementaci vzoru observer</a> a tím pádem i užívání vlastních událostí.</p>
<p>To, čemu se jinde říká Controller, je v Backbone nazýváno View. Vlastní vyrábíme voláním create(), na prototypy můžeme zapomenout. Spolupráce s URL je zcela oddělená součást frameworku; jedná se o prosté mapování vzorů URL na vlastní funkce či události.</p>
<p><strong>Zajímavost #1</strong>: ke zdrojovému kódu Backbone existuje <a href="http://backbonejs.org/docs/backbone.html">anotace téměř ke každému řádku</a>.</p>
<p><strong>Zajímavost #2</strong>: Backbone jako jeden z mála nástrojů nenabízí vlastní abstrahovaný super; namísto toho <a href="http://backbonejs.org/#Model-extend">zodpovědně vybízí</a> k používání čistě JavaScriptového volání předka.</p>
<h3>3c <a href="https://github.com/addyosmani/todomvc/tree/gh-pages/architecture-examples/angularjs">Angular.js</a></h3>
<p>Tento super-heroic framework používá vlastní šablonovací jazyk, založený na speciálních HTML značkách a atributech (které z nějakého důvodu začínají na ng a připomínají tak, že až se do šablon někdo podívá za deset let, jistě mu budou připadat velmi New Generation). <a href="https://github.com/addyosmani/todomvc/blob/gh-pages/architecture-examples/angularjs/index.html">Výsledný mix</a> HTML a NG je špatně čitelná směs. Vzpomínáte, jak se říkalo, že <code>&lt;form onsubmit=”...”&gt;</code> je fuj? Tak dnes frčí <code>&lt;form ng-submit=”...”&gt;</code>.</p>
<p>Hlavním tahounem Angularu je jeho obousměrný data-binding, totiž automatické reagování na změny v datech, se kterými se pracuje (ať už iniciované Angularem, nebo uživatelem). Realizace funguje na bázi opakovaného monitorování dat: funkcí $watch říkáme, která data chceme sledovat; (implicitním) voláním funkcí $apply a $digest dochází k ověření změny hodnot a automatickým aktualizacím. Více o těchto konceptech je k vidění v <a href="http://docs.angularjs.org/guide/concepts">dokumentaci</a>.</p>
<p>Implementační zajímavost #1: K detekci změn v datech dochází často (vlastně skoro pořád &#8211; po každém požadavku, po každé události); pro účely této detekce se musí data jednak porovnávat a druhak kopírovat (nutno si někde pamatovat minulý stav). To může mít samosbou dost neblahý vliv na výkon celé aplikace (mousemove? objemnější datové struktury?).</p>
<p>Implementační zajímavost #2: po změně ve watchovaných datech je volán relevantní posluchač (zpravidla ten, který má nová data vykreslit či jinak zpracovat). Jeho volání může ovšem způsobit změnu v datech někde jinde; proto je celý proces $digest potenciálně rekurzivní. Autoři tuto rekurzi omezili magickou konstantou 10, takže je nutné s daty dokonvergovat do stabilního stavu nejvýše na 10 iterací.</p>
<h3>3d <a href="https://github.com/addyosmani/todomvc/tree/gh-pages/architecture-examples/canjs">CanJS</a></h3>
<p>Tento nástroj je postaven na spolupráci (a tedy i prerekvizitě) s jedním z low-level JS toolkitů: jQuery, Zepto, Dojo, YUI či Mootools. Nativně podporuje šablony EJS (syntaxe ve stylu ASP, v šabloně tedy vidíme např. <code>&lt;% todos.each(function( todo ) { %&gt;</code> či) a k dispozici je též plugin pro Mustache.</p>
<p>Posluchače událostí se definují vlastní CSS-like syntaxí (ať už pro <a href="https://github.com/addyosmani/todomvc/blob/gh-pages/architecture-examples/canjs/js/todos/todos.js#L19">DOM události</a> či <a href="https://github.com/addyosmani/todomvc/blob/gh-pages/architecture-examples/canjs/js/todos/todos.js#L32">realizaci observeru)</a>. Pokud v šabloně použijeme výpis hodnoty, která je Observable (typicky .each nebo .attr), dojde v rámci šablony k navěšení posluchače na změnu tohoto Observable; při této se pak automaticky přerenderuje relevantní část šablony.</p>
<p>Dle dokumentace je <a href="http://canjs.com/#can_ejs-element_callbacks">doporučováno</a> provazování HTML uzlů s datovými objekty &#8211; tato pochybná technika je <a href="https://github.com/addyosmani/todomvc/blob/gh-pages/architecture-examples/canjs/js/todos/todos.js#L55">k vidění</a> v ukázkové aplikaci.</p>
<p>Zajímavost: autoři CanJS používají nezvykle obskurní techniku předávání undefined jako (nedefinovaného) parametru do všudepřítomné obalující anonymní funkce (viz první a poslední řádky <a href="https://github.com/addyosmani/todomvc/blob/gh-pages/architecture-examples/canjs/js/todos/todos.js">zdrojových souborů</a>).</p>
<h3>3e <a href="https://github.com/addyosmani/todomvc/tree/gh-pages/architecture-examples/knockoutjs">KnockoutJS</a></h3>
<p>Namísto tradičního šablonování si KnockoutJS počůrává části HTML atributem data-bind, ve kterém je možno specifikovat provázání obsahu prvku s daty i vyšší logiku (cykly, podmínky). Zápis</p>
<pre><code>&lt;a data-bind="css: { selected: showMode() == 'all' }" href="#/all"&gt;All&lt;/a&gt;</code></pre>
<p>tedy prvku přidá <code>class=”selected”</code>, pokud vykonání fragmentu JS vrátí pravdivou hodnotu. Implementace takového chování s sebou přirozeně nese takové radosti jako <a href="https://github.com/SteveSanderson/knockout/blob/master/src/binding/bindingProvider.js#L58">vnořené with a Function constructor</a> (techniky, které patří k těm nejméně doporučovaným vůbec).</p>
<p>Automatická aktualizace HTML probíhá na základě vzoru Observer; voláním ko.observable() (implicitně při data-bind) vytvoříme hodnotu, která při své změně notifikuje posluchače. Sympatické je, že Model je zcela v režii uživatele a zpravidla to bývá tradiční JS konstrukční funkce. Jen ta data, která se následně propagují do HTML, jsou obalena jako ko.observable.</p>
<p>KnockoutJS nenabízí žádnou vestavěnou podporu pro práci s URL. Namísto Controller se v něm říká ViewModel, ale to je jen terminologický blázinec.</p>
<h3>3z <a href="https://github.com/ondras/todomvc/tree/gh-pages/vanilla-examples/vanillajs-ondras">VanillaJS</a></h3>
<p>Bylo by nezodpovědné jen hodnotit cizí práci a nepředvést nic vlastního. V rámci projektu TodoMVC existuje čistokrevná vanilla verze, ale není udržovaná a obyčejnému JavaScriptu dělá spíše medvědí službu. Naimplementoval jsem proto vlastní variantu ukázkové úlohy, na které je vidět, jakým způsobem k této problematice přistupujeme bez nutnosti nějakých MVC nástrojů.</p>
<p>Kód je rozdělen do dvou souborů &#8211; todo.js odpovídá jedné položce úkolovníku, udržuje její data i vizuální reprezentaci, zpracovává události. app.js zastřešuje celou aplikaci, aplikuje filtry, přistupuje k localStorage. Jak je vidno, hlavní manipulace s DOMem se odehrává ve funkci Todo.prototype._build &#8211; a není to nijak hrozné. Nabízejí se tato další rozšíření kódu:</p>
<ol>
<li>Helper pro tvorbu DOM prvků (pomocí výčtu vlastností v objektu nebo CSS selektorem),</li>
<li>oddělení vizuální reprezentace do vlastního objektu (např. Todo.Visual), která by se starala výhradně o DOM a události; data by držel stávající objekt Todo.</li>
</ol>
<h2>4 Závěr</h2>
<p>Zastánci MVC frameworků argumentují tím, že tyto nástroje dokážou zastřešit a provázat práci s individuálními komponentami a knihovnami aplikace. Dle mého názoru je tato výpomoc vágní, protože aplikační kód (controller) si člověk musí vždy vyrobit sám; to za něj žádný framework neudělá.</p>
<p>Naštěstí ale máme k dispozici návrhové vzory a hotová řešení pro všechny elementární úkony (práce s URL, RPC, Promise, DOM, Storage, Template, události, &#8230;) &#8211; proto mi přijde, že přidávání dalších úrovní indirekce/abstrakce má jen velmi malou přidanou hodnotu.</p>
<p id="mvc-otazky">Až budete zvažovat použití nějakého JS MVC frameworku, zkuste si zodpovědět tyto otázky:</p>
<ol>
<li>Rozumím tomu nástroji dobře? Dokážu v implementaci ospravedlnit existenci každé řádky svého kódu a vysvětlit, proč ho používám?</li>
<li>Bude výslednému kódu rozumět i ten, kdo k němu přijde po mně? I za dva roky?</li>
<li>Volím framework proto, že je to nejlepší řešení mého problému? Nebo jen proto, že mi ho někdo doporučil a/nebo je zrovna in něco takového používat?</li>
<li>Ospravedlní mi těch pár uspořených kilobajtů aplikačního kódu přítomnost frameworku, který leckdy sahá na několik set kilobajtů?</li>
<li>Je pro mne práce s DOMem skutečně tolik obtížná a repetitivní, že kvůli ní musím klesnout k užití string-based šablon?</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.zdrojak.cz/clanky/javascriptove-mvc-frameworky/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>Zážitky a rozumy z GTD konference</title>
		<link>http://www.zdrojak.cz/clanky/zazitky-a-rozumy-z-gtd-konference/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=zazitky-a-rozumy-z-gtd-konference</link>
		<comments>http://www.zdrojak.cz/clanky/zazitky-a-rozumy-z-gtd-konference/#comments</comments>
		<pubDate>Mon, 29 Apr 2013 22:00:33 +0000</pubDate>
		<dc:creator>Lukáš Burkoň</dc:creator>
				<category><![CDATA[Různé]]></category>
		<category><![CDATA[Akce]]></category>
		<category><![CDATA[GTD]]></category>

		<guid isPermaLink="false">http://www.zdrojak.cz/clanky/?p=8023</guid>
		<description><![CDATA[ <div><img width="100" height="100" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/100x100.gif" class="attachment-post-thumbnail wp-post-image" alt="GTD konference" /></div>V sobotu 27. dubna se v prostorách Národní Technické Knihovny v Praze konala GTD konference. Zřejmě první svého druhu u nás, určená fanouškům i čerstvým nováčkům metody osobní produktivity Mít Vše Hotovo. Byl jsem u toho. A byl jsem tam rád :)]]></description>
				<content:encoded><![CDATA[ <div><img width="100" height="100" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/100x100.gif" class="attachment-post-thumbnail wp-post-image" alt="GTD konference" /></div><p>Více jak dekádu je tu s námi nyní již velmi oblíbená metoda osobní produktivity <a href="http://www.davidco.com/" target="_blank">Getting Things Done</a> Davida Allena. Přes svou celosvětovou popularitu metody však má Západ stále nad námi náskok v jejím rozšíření mezi běžnými lidmi, který však postupně doháníme. <a href="http://www.gtdkonference.cz/" target="_blank">GTD konference</a> odehrávající se v pražských Dejvicích a jejích více než 200 účastníků tomu byla pěknou ukázkou.</p>
<p>Pořadatelská agentura <a href="http://www.iconmedia.cz/" target="_blank">IconMedia</a> vsadila na kartu GTD, což se jí vyplatilo, a odvedla perfektní práci jak z pohledu programu, tak i organizace. Konferencí nás provázel zkušený moderátor Rostislav Kocman, který nejenže zajišťoval plynulé přechody mezi jednotlivými přednáškami, ale zároveň i zručně moderoval diskuze, kterými byla konference až nebývale prošpikována.</p>
<p>Pojďme se nyní blíže podívat na přednášky, které mě zaujaly, pokusím se doplnit i odkazy na užitečné zdroje.</p>
<p><a href="http://www.zdrojak.cz/wp-content/uploads/2013/04/gtdk13-22.jpg" rel="lightbox-8023"><img class="aligncenter size-medium wp-image-8030" alt="GTD konference" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/gtdk13-22-450x300.jpg" width="450" height="300" /></a></p>
<h2>Co je to GTD &#8211; představení metody (Petr Mára + Lukáš Gregor)</h2>
<p>Potěšujícím faktem bylo, že většina publika již s GTD zkušenosti měla, nicméně našli se i tací, pro které to byla premiéra. Proto úvodní spíše diskuze <a href="http://gtdskoleni.cz/" target="_blank">Petra Máry</a> a <a href="http://www.lukasgregor.cz/" target="_blank">Lukáše Gregora</a> na téma základů a přínosů GTD byla příjemným zahřívacím kolečkem.</p>
<p>Po úvodním představení pánů, jak se kdo ke GTD dostal, jaké s ním má zkušenosti a jak jej praktikuje, se již začaly řešit obecnější témata na úvod.</p>
<p>Především jsme se dozvěděli, jak vůbec s GTD začít. Pánové se shodli na tom, že začít s celým GTD ze dne na den je holý nesmysl. Metoda je natolik komplexní, že by zbytečně rychlý začátek člověka spíše odradil, proto je dobré začíná krůček po krůčku a postupně si tvořit důležité návyky a stavět z nich funkční systém.</p>
<p>Prvním asi nejdůležitějším návykem je zavedení inboxu. Tzn. místa, ať už fyzického nebo virtuálního, kam bude člověk průběžně dávat veškeré nápady, úkoly a povinnosti, které se ho týkají a potřebuje je řešit. Není problémem mít inboxů i vícero, což již velmi záleží na charakteru práce a života každého člověka. Já mám např. inboxy čtyři &#8211; inbox ve svému online <a href="http://todoist.com/" target="_blank">Todoist úkolovníku</a>, jednoduché poznámky v mobilu, když jsem mimo počítač, složku na papíry ve své pracovní tašce, pokud jsem mimo domov, a domácí pořadač na papírové a fyzické věci jako dopisy, účtenky apod.</p>
<p>Lukáš Gregor, jako správný Moravák, radil udělat si příjemnou neděli, otevřít si víno a na papír vysypat z hlavy veškeré úkoly, které se mě týkají a potřebuji se jim věnovat. Velmi užitečný je v tomto směru <a href="http://www.davidco.com/pdfs/implementation_guide-sample.pdf" target="_blank">Implementation Guide</a> od tvůrce GTD Davida Allena, podle něhož může člověk snadno krok po kroku začít s praktikováním GTD.</p>
<p>Zároveň jsme dostali i upozornění na problémy, které z využívání GTD vyplývají. Jednak se dle Rostislava Kocmana GTD nesmí stát fetišem, čili samotná administrativa GTD procesu nesmí překročit únosnou míru. GTD tu není proto, aby nás zaměstnávalo, ale aby nám v zaměstnání pomáhalo.</p>
<p>Dalším velmi častým problémem, se kterým se také potýkám, je lenivění krátkodobé paměti, jejíž nespolehlivost GTD proces řeší natolik dobře, že jí člověk potřebuje opravdu jen minimálně, což má za následek situace, kdy má člověk pocit, že by si měl raději napsat seznam, co si chce vzít z ledničky, aby na to, než tam dorazí, nezapomněl.</p>
<p>Zajímavým tématem byla i genderová otázka. Dle průzkumů jsou uživatelé GTD z 86 % muži a ze 14 % ženy, což si pánové vysvětlují tak, že muži si rádi hrají s procesy, nástroji a potřebují systém, zatímco ženy to dělají intuitivně.</p>
<p><a href="http://www.zdrojak.cz/wp-content/uploads/2013/04/gtdk13-26.jpg" rel="lightbox-8023"><img class="aligncenter size-medium wp-image-8034" alt="GTD konference" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/gtdk13-26-450x300.jpg" width="450" height="300" /></a></p>
<h2>Online a offline nástroje GTD (Josef Jasanský + Ondřej Nekola)</h2>
<p>Podobným formátem diskuze se nesla i další přednáška věnující se nástrojům v GTD procesu.</p>
<p><a href="http://21slov.cz/" target="_blank">Josef Jasanský</a>, coby zástupce Apple světa, nedá dopustit na vlajkovou loď GTD v Apple prostředí, a tedy na nástroj <a href="http://www.omnigroup.com/products/omnifocus/" target="_blank">OmniFocus</a>, který je z důvodů své robustnosti vhodný spíše pro pokročilé uživatele GTD, kterým však nabízí velkou flexibilitu a možnost nastavit si GTD proces přesně na míru, což má za následek vysokou efektivitu práce.</p>
<p>Nižší penetraci GTD nástrojů ve Windows světě si Josef vysvětluje jako nižší ochotu Windows uživatelů platit za software a zároveň i existencí Outlooku, který lidé, hojně a v korporacích zpravidla z povinnosti, využívají. Pro Windows uživatele však je k dispozici velmi šikovný <a href="http://www.mitvsehotovo.cz/2010/01/stahnete-si-serial-gtd-v-outlooku-jednoduse-a-prakticky-jako-ebook-zdarma/" target="_blank">seriál o využití GTD pomocí Outlooku</a>.</p>
<p>Uživatelům ne-Apple platforem <a href="http://www.nekola.cz/" target="_blank">Ondřej Nekola</a> poradil využít projekt <a href="http://www.alternative.to/" target="_blank">Alternative.to</a>, pomocí něhož mohou snadno a rychle nalézt alternativu vybraného softwaru na jiné platformě. Ondřej zároveň i varoval před využitím <a href="https://evernote.com/" target="_blank">Evernote</a> pro potřeby GTD, nepřijde mu to dostatečně přirozené. Na druhou stranu nástroje jako <a href="http://www.wunderlist.com" target="_blank">Wunderlist</a>, <a href="http://culturedcode.com/things/" target="_blank">Things</a> nebo již zmíněný OmniFocus by pánové doporučili.</p>
<p>Velkou otázkou ještě je, zda řešit GTD elektronicky nebo na papír. V tomto směru se pánové shodují, že jde o velmi individuální záležitost, každý člověk se musí rozhodnout, co mu více vyhovuje. Nicméně jako jednoduchou formulku, jak se rozhodnout, poradili pánové, že když člověku vyhovuje práce v Gmailu, organizování složek apod., pak je velká pravděpodobnost, že bude mít raději GTD elektronicky.</p>
<h2>Panelová diskuze (Mára, Gregor, Jasanský, Nekola)</h2>
<p>Závěr prvního bloku konference zakončila společná diskuze všech předešlých řečníků. Zajímavé závěry můžeme shrnout následovně.</p>
<p>Nemůžete-li se rozhodnout, který GTD nástroj vybrat, může vám pomoci <a href="http://priacta.com/Articles/Comparison_of_GTD_Software.php" target="_blank">srovnání více než 150 GTD nástrojů</a>.</p>
<p>Cross-platformní řešení např. pro vlastníky Mac a zároveň Android zařízení mohou být nástroje <a href="http://www.rememberthemilk.com/" target="_blank">Remember the Milk</a> či <a href="http://doit.im/" target="_blank">Doit.im</a>.</p>
<p>Petr Mára popisoval svou cestu k OmniFocusu. Nejprve ho zavrhl, po čase se k němu vrátil, ale zabralo mu dva intenzivní týdny ho pořádně pochopit a nastavit si ho dle svých potřeb, k čemuž mu výrazně pomohla knížka <a href="http://www.usingomnifocus.com/" target="_blank">Creating Flow with OmniFocus</a>.</p>
<p>Využití GTD v týmu je velký oříšek. Obecné principy jako dimenze pomáhají, ale konkrétnější věci jako např. kontexty jsou již problémem. Petr Mára má však velmi pozitivní zkušenost z firmy, kde GTD používali z přesvědčení, ne z donucení, všichni, cítil se tam prý jako v zenovém království. :)</p>
<h2>Perspektivy a role v GTD (Jiří Knesl)</h2>
<p>Po první přestávce si pro nás <a href="http://www.knesl.com/" target="_blank">Jirka Knesl</a> přichystal sice krátkou, ale za to pěkně zacílenou přednášku. Jirka mluvil o rolích, které zaujímáme (např. programátor, otec, potápeč apod.), resp. o rolích, které bychom zaujímat chtěli.</p>
<p>Nejsme schopni zvládat vše, a proto bychom měli dle Paretova pravidla 80/20, o kterém vyšla např. zajímavá <a href="http://www.amazon.com/The-80-20-Principle-Achieving/dp/0385491743/" target="_blank">knížka od Richarda Kocha</a>, eliminovat své činnosti a zaměřovat se pouze na to, co dává přidanou hodnotu ve směru našich cílů, kýžených rolí.</p>
<p>Jirka radil si na papír sepsat veškeré své role, ve kterých aktuálně jsme a ve kterých bychom být chtěli, a ke každé si poznačit, jak moc se jí aktuálně věnujeme, resp. jak moc bychom se jí věnovat chtěli. Na základě toho pak snadno vidíme, kde máme problém, a tam kde je největší propast bychom měli věnovat většinu své energie. Tento postup můžeme v iteracích postupně aplikovat a dosahovat tak svých cílů. Výrazný postup se dle Jirky neděje na denní bázi, ale pouze v delších časových úsecích.</p>
<p style="text-align: center;"><a href="http://www.zdrojak.cz/wp-content/uploads/2013/04/gtdk13-69.jpg" rel="lightbox-8023"><img class="aligncenter  wp-image-8031" alt="GTD konference" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/gtdk13-69-682x1024.jpg" width="307" height="460" /></a></p>
<h2>Život jako disciplína (Jaroslav Homolka + Petr Mára)</h2>
<p>Kouč <a href="http://gro.cz/" target="_blank">Jaroslav Homolka</a> si ke své přednášce přizval na pomoc Petra Máru a společně odlehčenou formou v motivačním duchu diskutovali na téma disciplíny a sebeorganizace, což je podle Jaroslava klíčovou schopností úspěšných lidí.</p>
<p>Jaroslav z kraje pozvedl publiku náladu svým kvartetem lenocha, kterým by se člověk měl řídit, než se vůbec rozhodne, že bude nějakou činnost dělat:</p>
<ol>
<li><span style="line-height: 1.714285714; font-size: 1rem;">Proč bych to měl dělat, má to vůbec smysl?</span></li>
<li><span style="line-height: 1.714285714; font-size: 1rem;">Když to má smysl, tak proč právě já?</span></li>
<li><span style="line-height: 1.714285714; font-size: 1rem;">Když už já, tak proč právě teď?</span></li>
<li><span style="line-height: 1.714285714; font-size: 1rem;">Proč právě takhle?</span></li>
</ol>
<p>Společně s Petrem Jaroslav diskutoval různá témata, jejichž závěry je možné shrnout následovně:</p>
<ul>
<li><span style="line-height: 1.714285714; font-size: 1rem;">vybrat si pár věcí (3 &#8211; 5 rolí), těm se věnovat naplno a zbytek nechat plavat</span></li>
<li><span style="line-height: 1.714285714; font-size: 1rem;">budovat efektivní síť vztahů, společně toho lidé dosáhnou mnohem více, být sám je velmi těžké</span></li>
<li><span style="line-height: 1.714285714; font-size: 1rem;">lidé si často pletou management a leadership, nicméně většina lidí ještě stále potřebuje být řízena</span></li>
<li><span style="line-height: 1.714285714; font-size: 1rem;">introverti by v sobě měli budovat extrovertní složku, a naopak</span></li>
<li><span style="line-height: 1.714285714; font-size: 1rem;">velká rozhodnutí neuspěchat, ale dělat je s jasným záměrem</span></li>
<li><span style="line-height: 1.714285714; font-size: 1rem;">držet směr a soustředit se na měřitelné výsledky jako zdroj poznání</span></li>
<li><span style="line-height: 1.714285714; font-size: 1rem;">GTD je úžasný nástroj sebevzdělávání, dává neustálý feedback, co vedlo k cíli a co ne</span></li>
<li><span style="line-height: 1.714285714; font-size: 1rem;">soustředit se na aktuální moment, popř. budoucnost, minulost již nezměníme</span></li>
<li><span style="line-height: 1.714285714; font-size: 1rem;">vytrvat do vítězného konce, věci zpravidla nevyjdou hned, je potřeba je alespoň 3x zkusit</span></li>
</ul>
<h2>Work life balance (Pavel Trojánek + Ondřej Kubera)</h2>
<p><a href="http://www.osobniproduktivita.cz/" target="_blank">Pavel Trojánek s Ondřejem Kuberou</a> jsou zjevně zkušení v přípravě interaktivních workshopů, přednášku jsme totiž začali velmi netradičně &#8211; míčkovou válkou :)</p>
<p>Dostali jsme zpočátku tři otázky:</p>
<ol>
<li><span style="line-height: 1.714285714; font-size: 1rem;">Trávím v práci více času, než bych chtěl?</span></li>
<li><span style="line-height: 1.714285714; font-size: 1rem;">Chtěl bych trávit více času se svými přáteli?</span></li>
<li><span style="line-height: 1.714285714; font-size: 1rem;">Mám dostatek času na své zájmy?</span></li>
</ol>
<p>Kdo měl alespoň s jednou z otázek problém, měl hodit míček na Pavla. Zbytek lidí na Ondřeje. Ano, tušíte správně, zhruba 90 % zásahů schytal chudák Pavel :)</p>
<p>Výsledky evropského průzkumu na tyto dotazy vyšly následovně:</p>
<ul>
<li><span style="line-height: 1.714285714; font-size: 1rem;">27 % lidí tráví moc času v práci</span></li>
<li><span style="line-height: 1.714285714; font-size: 1rem;">36 % lidí by chtělo trávit více času s přáteli</span></li>
<li><span style="line-height: 1.714285714; font-size: 1rem;">51 % lidí by chtělo více času na své zájmy</span></li>
<li><span style="line-height: 1.714285714; font-size: 1rem;">méně než 10 % necítí žádný konflikt mezi prací a osobním životem</span></li>
</ul>
<p>A jak z tohoto problému ven? Eliminace je samozřejmě třeba, ale i ta má své limity. Pánové proto přicházejí s konceptem integrace.</p>
<p>Stěžuje si váš přítel / vaše přítelkyně, že trávíte čas v posilovně místo s ní? Naučte jí chodit do posilovny s vámi a zabili jste dvě mouchy jednou ranou ;)</p>
<p>V podobném duchu jsme si prakticky vyzkoušeli zintegrovat více našich rolí dohromady, tak aby to dávalo smysl a lépe jsme tak využili svého času.</p>
<p><a href="http://www.zdrojak.cz/wp-content/uploads/2013/04/gtdk13-79.jpg" rel="lightbox-8023"><img class="aligncenter size-medium wp-image-8036" alt="GTD konference" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/gtdk13-79-450x300.jpg" width="450" height="300" /></a></p>
<h2>GTD v praxi vedení firem (Tomáš Baránek + Jan Straka)</h2>
<p>Závěr konference se nesl opět v duchu diskuze, tentokrát na téma zkušeností se zaváděním principů GTD do fungování firmy. Diskutujícími byli Tomáš Baránek, majitel vydavatelství <a href="http://www.melvil.cz/" target="_blank">Jan Melvil Publishing</a>, které mj. přeložilo původní knížku Davida Allena do české podoby Mít Vše Hotovo, čemuž se se věnuje i jejich stejnojmenný <a href="http://www.mitvsehotovo.cz/" target="_blank">informační portál</a>. Druhým diskutujícím byl <a href="http://www.janstraka.cz/" target="_blank">Jan Straka</a>, podnikatel v oblasti reklamní a grafické tvorby a tisku.</p>
<p>Jan zaváděl GTD ve dvou týmech. V jednom úspěšně, ve druhém však odešel s nepořízenou. Úspěch dle Jana závisel primárně na tom, že si do prvního týmu lidi vybral sám, vybíral si tedy lidi, kteří mu osobně sednou, jsou s ním na vlně a díky tomu neměl problém s komunikací a zaváděním principů GTD.</p>
<p>Na denní bázi používají <a href="http://www.toodledo.com/" target="_blank">Toodledo</a> pro seznam projektů, kontextů a úkolů (co zaměstnanec, to kontext), Dropbox pro sdílení souborů a Evernote pro zbytek GTD. Zajímavostí je jejich sdílený seznam “waiting for”, který má praktický následek takový, že na něm nikdo nechce být, tudíž každý na tomto seznamu příslušnou práci co nejdříve udělá, aby na něj kolega nemusel dlouho čekat.</p>
<p>Tomášovi se zase osvědčilo zavedení GTD principů pomocí pozitivních a negativních příkladů. Když např. jeho kolegové, dle jeho slov “chaotici”, na vlastní oči viděli, jak rychle ve svých papírových složkách našel potřebné materiály, hned chtěli mít to samé. Na druhou stranu, když na obálku jedné z knih zapomněli přidat čárové kódy, které museli následně dolepovat ručně, všichni rádi uvítali zavedení šablon s checklisty.</p>
<p>Tomáš má také dobré zkušenosti s metodou <a href="http://en.wikipedia.org/wiki/Kaizen" target="_blank">Kaizen</a>, Japonci navrženou po Druhé světové válce, která slouží pro zavádění velkých změn pomalou, postupnou cestou, cyklicky krůček po krůčku.</p>
<p>Oběma pánům se osvědčilo zavádět GTD ne procesně, ale přes firemní hodnoty. Zároveň si velmi chválí cestu jednoduchosti, čili ořezat GTD systém na úplné minimum, aby nebyl problém s odlišnou mentalitou lidí v týmu.</p>
<p><a href="http://www.zdrojak.cz/wp-content/uploads/2013/04/gtdk13-7.jpg" rel="lightbox-8023"><img class="aligncenter size-medium wp-image-8035" alt="GTD konference" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/gtdk13-7-450x300.jpg" width="450" height="300" /></a></p>
<h2>Shrnutí</h2>
<p>První ročník GTD konference se rozhodně povedl a já už se těším na další :) Pro mě osobně bylo nejhodnotnější si uvědomit své role, zhodnotit, kde jsem teď a kde bych chtěl být, a zároveň si rozmyslet, jak jednotlivé role eliminovat, resp. integrovat, abych byl schopen ten hrozen svých činností lépe a více v pohodě zvládat.</p>
<p>Byli jste na GTD konferenci i vy? Jaký jste z ní měli dojem? Co se vám líbilo a co byste jak zlepšili?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zdrojak.cz/clanky/zazitky-a-rozumy-z-gtd-konference/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Aplikace pro Windows Store v HTML5 &#8211; kontrakty</title>
		<link>http://www.zdrojak.cz/clanky/aplikace-pro-windows-store-v-html5-kontrakty/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=aplikace-pro-windows-store-v-html5-kontrakty</link>
		<comments>http://www.zdrojak.cz/clanky/aplikace-pro-windows-store-v-html5-kontrakty/#comments</comments>
		<pubDate>Thu, 25 Apr 2013 22:00:16 +0000</pubDate>
		<dc:creator>Štěpán Bechynský</dc:creator>
				<category><![CDATA[Různé]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[windows 8]]></category>
		<category><![CDATA[Windows Store]]></category>

		<guid isPermaLink="false">http://www.zdrojak.cz/clanky/?p=7970</guid>
		<description><![CDATA[ <div><img width="100" height="100" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/html5-windows-store-100px.png" class="attachment-post-thumbnail wp-post-image" alt="Html5 windows Store 100px" /></div>V tomto díle se zaměříme na kontrakty. Kontrakty jsou specifické pro Windows Store aplikace a umožňují vám integrovat vaši aplikaci do operačního systému.]]></description>
				<content:encoded><![CDATA[ <div><img width="100" height="100" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/html5-windows-store-100px.png" class="attachment-post-thumbnail wp-post-image" alt="Html5 windows Store 100px" /></div><p>Základní kontrakty jsou:</p>
<ul>
<li>Hledání</li>
<li>Sdílení</li>
<li>Nastavení</li>
</ul>
<h2>Vyhledávání</h2>
<p>Pomocí tohoto kontraktu můžete hledání ve vaší aplikaci integrovat přímo do systémového hledání. Uživatel pak hledá informace z jednoho místa.</p>
<p><img class="aligncenter size-full wp-image-7977" alt="image1" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/image12.png" width="800" height="450" /></p>
<p>Nejdříve je potřeba integraci do systémového vyhledávání deklarovat v package.appxmanifest.</p>
<p><img class="aligncenter size-full wp-image-7978" alt="image2" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/image22.png" width="872" height="334" /></p>
<p>Pak je třeba zaregistrovat událost, kterou vyvolává systémové hledání. Těchto událostí je několik, podle toho, jaký komfort chcete uživateli nabídnout, např. našeptávání. Pokud chcete jen základní vyhledávání, stačí zaregistrovat událost <i>onquerysubmitted</i>.</p>
<pre><code>Windows.ApplicationModel.Search.SearchPane.getForCurrentView().onquerysubmitted = function (eventObject) {
    txtSearch.innerText = eventObject.queryText;
};</code></pre>
<p><a href="http://code.msdn.microsoft.com/windowsapps/Search-app-contract-sample-118a92f5">Search contract sample</a> obsahuje další příklady použití kontraktu hledání.</p>
<h2>Sdílení</h2>
<p>Pomocí kontraktu sdílení můžete předávat informace z jedné aplikace do druhé. Princip je velmi podobný schránce. Aplikace může být zdrojem sdílení. Zdroj sdílení naplní datový balíček, který je pak předán aplikaci, která se označuje jako cíl sdílení. Na následujícím snímku obrazovky je zdrojem sdílení aplikace Mapy a cílem sdílení je aplikace Pošta.</p>
<p><a href="http://www.zdrojak.cz/wp-content/uploads/2013/04/image32.png" rel="lightbox-7970"><img class="aligncenter size-large wp-image-7981" alt="image3" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/image32-1024x575.png" width="625" height="350" /></a></p>
<h2>Typ sdílených dat</h2>
<p>Sdílet můžete jakýkoliv typ dat. Pro některé typy, jako je např. text, URL, obrázek, jsou přímo připravené vlastnosti objektu <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.applicationmodel.datatransfer.datarequest.aspx?cs-save-lang=1&amp;cs-lang=javascript">DataRequest</a>. Pokud potřebujete sdílet jiný typ dat, např. poštovní adresu, musíte tento typ dat nějak popsat. Můžete použít třeba MIME Type nebo obecně uznávané slovníky ze <a href="http://schema.org/">schema.org</a>. Zdroj sdílení jen naplní datový balíček, ale cíl sdílení musí v package.appxmanifest deklarovat, jakým typům dat rozumí.</p>
<p><img class="aligncenter size-full wp-image-7982" alt="image4" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/image42.png" width="891" height="517" /></p>
<h2>Zdroj sdílení</h2>
<p>U zdroje sdílení stačí opět zaregistrovat příslušnou událost, v které pak naplníte datový balíček informacemi, které chcete sdílet.</p>
<pre><code>Windows.ApplicationModel.DataTransfer.DataTransferManager.getForCurrentView().ondatarequested = function (eventObject) {
    var request = eventObject.request;

    request.data.properties.title = "MSDN Blog"; // musite nastavit!
    request.data.setText("MSDN Blog");
    request.data.setUri(new Windows.Foundation.Uri("http://blogs.msdn.com/b/vyvojari/"));
};</code></pre>
<h2>Cíl sdílení</h2>
<p>Vytvořit cíl sdílení je již komplexnější úloha, pro kterou budete muset vytvořit i uživatelské rozhraní. Podívejte se na příklad <a href="http://code.msdn.microsoft.com/windowsapps/Sharing-Content-Target-App-e2689782">Sharing content target app sample</a>.</p>
<h2>Nastavení</h2>
<p>Nastavení je vlastně jediný kontrakt, který budete muset implementovat. Do nastavení musíte minimálně přidat typické „O aplikaci&#8220;, kde uživatel najde kontakt na technickou podporu a případně odkaz na dokument o ochraně osobních údajů, pokud ho aplikace vyžaduje.</p>
<p><img class="aligncenter size-full wp-image-7986" alt="image5" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/image51.png" width="800" height="450" /></p>
<p>Integrace do nastavení se opět děje pomocí události.</p>
<pre><code>app.onsettings = function (e) {
    e.detail.applicationcommands = {    
        "about": {
            href: "/pages/about/about.html",
            title: "About"
        }
    }
    WinJS.UI.SettingsFlyout.populateSettings(e);
};</code></pre>
<p>Tím jsme vytvořili položku s textem About v nastavení, která odkazuje na stránku <i>/pages/about/about.html</i>. Stránka <i>about</i> musí obsahovat element s id <i>about</i>, který je ovládací prvek <i>WinJS.UI.SettingsFlyout</i>.</p>
<pre><code>&lt;body&gt;
    &lt;div id="about" data-win-control="WinJS.UI.SettingsFlyout" data-win-options="{width: 'narrow'}"&gt;
        &lt;div class="SettingsPane"&gt;
            &lt;div class="win-label"&gt;
                &lt;button onclick="WinJS.UI.SettingsFlyout.show()" class="win-backbutton"&gt;
                &lt;/button&gt;
                &lt;span class="SettingsTitle"&gt;About&lt;/span&gt;
            &lt;/div&gt;
            &lt;article class="SettingsContent"&gt;
                &lt;h2&gt;Kontrakty&lt;/h2&gt;
            &lt;/article&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/body&gt;</code></pre>
<p>POZOR! Výchozí barva textu je bílá na bílem pozadí. Je třeba změnit pozadí #about.</p>
<p>Zdrojové kódy z tohoto článku <a href="http://www.zdrojak.cz/wp-content/uploads/2013/04/4-BasicContractsJS.zip">ke stažení</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zdrojak.cz/clanky/aplikace-pro-windows-store-v-html5-kontrakty/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mDevCamp 2013: Největší česko-slovenská konference pro mobilní vývojáře</title>
		<link>http://www.zdrojak.cz/clanky/mdevcamp-2013/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mdevcamp-2013</link>
		<comments>http://www.zdrojak.cz/clanky/mdevcamp-2013/#comments</comments>
		<pubDate>Sun, 21 Apr 2013 22:00:20 +0000</pubDate>
		<dc:creator>Redakce</dc:creator>
				<category><![CDATA[PR Články]]></category>

		<guid isPermaLink="false">http://www.zdrojak.cz/clanky/?p=7901</guid>
		<description><![CDATA[ <div><img width="100" height="100" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/mdevcamp.png" class="attachment-post-thumbnail wp-post-image" alt="mDevCamp" /></div>Pokud chcete proniknout do hlubin vývoje aplikací a her pro Android, iOS, nebo Windows Phone, podívat se na odvrácenou stranu mobilních platforem, nebo zjistit jak na aplikacích vydělat opravdové peníze, navštivte mDevCamp 2013.]]></description>
				<content:encoded><![CDATA[ <div><img width="100" height="100" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/mdevcamp.png" class="attachment-post-thumbnail wp-post-image" alt="mDevCamp" /></div><p dir="ltr">Mobilní aplikace jsou pro vývojáře stále přitažlivější, především kvůli tomu, že i z domova může šikovný programátor vytvořit aplikace, které se dostanou k milionům uživatelů po celém světě.</p>
<p dir="ltr">Pokud chcete proniknout do hlubin vývoje aplikací a her pro Android, iOS, nebo Windows Phone, podívat se na odvrácenou stranu mobilních platforem, nebo zjistit jak na aplikacích vydělat opravdové peníze, navštivte mDevCamp 2013. Konferenci navazující na <a href="http://mdevcamp.cz/2012/">velmi úspěšný předchozí ročník</a> s návštěvností přesahující 300 vývojářů ze všech koutů České Republiky i Slovenska.</p>
<p dir="ltr"><img class="aligncenter size-full wp-image-7915" alt="mdevcamp pruh" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/bdevcamppruh.png" width="657" height="176" /></p>
<p dir="ltr">Připraven je celodenní program rozdělený do tří sálů, který bude doslova nabitý zajímavými speakery a přednáškami. Těšit se můžete například na povídání o tom, jak se vyvíjí aplikace u slavných Madfinger Games, v podání Petra Benýška, David Vávra (Inmite) povypráví o vývoji pro Google Glass, Jan Ilavský a Vladimír Hrinčár (Hyperbolic Magnetism) představí blok o frameworcích pro vývoj mobilních her. Nahlédneme na pokročilá témata z vývoje pro iOS pohledem Roberta Vojty (Tapmates), nebo zkušenosti s monetizací nezávislých Android aplikací Tomáše Hubálka. Chybět nebude ale ani blok o přístupnosti mobilních aplikací napříč platformami, povídání Radka Pavlíčka, Daniela Kuneše (BIGLauncher) a dalších. A to ještě zdaleka není vše, několik dalších hvězdných speakerů bude <a href="http://mdevcamp.cz/">na webu</a> zveřejněno v průběhu nadcházejících týdnů.</p>
<p dir="ltr">Konference se odehraje v sobotu 25.5. v Praze, předprodej vstupenek bude zahájen už v průběhu tohoto týdne. Chcete-li být mezi prvními, kdo se o předprodeji dozví, registrujte se na webu <a href="http://www.mdevcamp.cz/">mDevCamp.cz</a> do newsletteru.</p>
<p dir="ltr"><a href="http://www.zdrojak.cz/wp-content/uploads/2013/04/mdevcampfoto.jpg" rel="lightbox-7901"><img class="aligncenter size-medium wp-image-7917" alt="mDevCamp foto" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/mdevcampfoto-450x299.jpg" width="450" height="299" /></a></p>
<p dir="ltr">Pořadatelem konference je společnost <a href="http://www.inmite.eu">Inmite</a>, hlavními partnery konference mDevCamp 2013 jsou <a href="http://www.google.cz/">Google ČR</a> a <a href="http://nadacevodafone.cz/">Nadace Vodafone Česká republika</a>. Hlavními mediálními partnery jsou portály <a href="http://www.svetandroida.cz/">SvetAndroida.cz</a> a <a href="http://www.zdrojak.cz">Zdroják.cz</a>.</p>
<h2>Další odkazy:</h2>
<ul>
<li>fotky z loňského ročníku: <a href="http://goo.gl/5vYUl">http://goo.gl/5vYUl</a></li>
<li>web konference: <a href="http://mdevcamp.cz/">http://mdevcamp.cz/</a></li>
<li>web loňského ročníku: <a href="http://mdevcamp.cz/2012/">http://mdevcamp.cz/2012/</a></li>
<li>přihlášení do newsletteru: <a href="http://goo.gl/sCCXe">http://goo.gl/sCCXe</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.zdrojak.cz/clanky/mdevcamp-2013/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vícestránkové Windows Store aplikace a navigace</title>
		<link>http://www.zdrojak.cz/clanky/vicestrankove-windows-store-aplikace-a-navigace/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=vicestrankove-windows-store-aplikace-a-navigace</link>
		<comments>http://www.zdrojak.cz/clanky/vicestrankove-windows-store-aplikace-a-navigace/#comments</comments>
		<pubDate>Thu, 18 Apr 2013 22:00:01 +0000</pubDate>
		<dc:creator>Štěpán Bechynský</dc:creator>
				<category><![CDATA[Různé]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[windows 8]]></category>
		<category><![CDATA[Windows Store]]></category>

		<guid isPermaLink="false">http://www.zdrojak.cz/clanky/?p=7868</guid>
		<description><![CDATA[ <div><img width="100" height="100" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/html5-windows-store-100px.png" class="attachment-post-thumbnail wp-post-image" alt="Html5 windows Store 100px" /></div>Tento díl je věnovaný aplikacím, které se skládají z více stránek, navigaci mezi stránkami a všemu, co k tomu patří. Vyjdeme ze šablony <em>Navigation App</em>, která je vhodným výchozím bodem pro vytvoření vícestránkové aplikace.]]></description>
				<content:encoded><![CDATA[ <div><img width="100" height="100" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/html5-windows-store-100px.png" class="attachment-post-thumbnail wp-post-image" alt="Html5 windows Store 100px" /></div><h1>Navigace</h1>
<p><a href="http://www.zdrojak.cz/wp-content/uploads/2013/04/image11.png" rel="lightbox-7868"><img class="aligncenter size-medium wp-image-7888" alt="Navigace" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/image11-450x274.png" width="450" height="274" /></a></p>
<p>Stránka <i>default.html</i> slouží pro základní inicializaci aplikace a vlastně představuje aplikaci jako celek. Pomocí <i>PageControlNavigater</i> vkládáte do existující, hlavní stránky, stránky jiné.</p>
<pre><code>&lt;div id="contenthost" data-win-control="Application.PageControlNavigator" data-win-options="{home: '/pages/home/home.html'}"&gt;&lt;/div&gt;
</code></pre>
<p>Jednotlivé stránky aplikace jsou pak definované v dalších html, css a js souborech:</p>
<p><a href="http://www.zdrojak.cz/wp-content/uploads/2013/04/image21.png" rel="lightbox-7868"><img class="aligncenter size-full wp-image-7889" alt="Soubory" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/image21.png" width="233" height="348" /></a></p>
<p>Pokud se podíváte do js souborů jednotlivých stránek, tak tam najdete následující definici:</p>
<pre><code>WinJS.UI.Pages.define("/pages/home/home.html", {
    …
}</code></pre>
<p>Tím vytvoříte objekt stránky s pevně daným URI. Na takto vytvořenou stránku se pak odkazujete pomocí stále stejného URI.</p>
<pre><code>about.addEventListener("click", function () {
    WinJS.Navigation.navigate("/pages/about/about.html");
});
</code></pre>
<p>Obrazovka je pak složena vlastně z několika stránek:</p>
<p><a href="http://www.zdrojak.cz/wp-content/uploads/2013/04/image31.png" rel="lightbox-7868"><img class="aligncenter size-full wp-image-7890" alt="Stránky" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/image31.png" width="295" height="230" /></a></p>
<p>Pro návrat na předchozí stránku pak použijete:</p>
<pre><code>btnBack.addEventListener("click", function () {
  if (WinJS.Navigation.canGoBack) {
    WinJS.Navigation.back();
  }
});
</code></pre>
<p>Jak vidíte, o veškerou navigaci ve vaší aplikaci se stará <i>WinJS.Navigation</i>. Tento princip výrazně zvyšuje výkon aplikace, protože není třeba vždy sestavovat komplet nový DOM a zpracovávat CSS a Javascript od nuly.</p>
<p>Pokud chcete použít element a ze specifikace HTML, tak je doporučeno na stránce vytvořit vlastní událost, která bude kliknutí na odkaz zpracovávat.</p>
<p>Událost:</p>
<pre><code>linkClickEventHandler: function (eventInfo) {
    eventInfo.preventDefault();
    var link = eventInfo.target;
    WinJS.Navigation.navigate(link.href);
}</code></pre>
<p>Registrace události (v události <i>ready</i> stránky):</p>
<pre><code>WinJS.Utilities.query("a").listen("click", this.linkClickEventHandler, false);</code></pre>
<p><span style="color: #000000;"><span style="font-family: Consolas,serif;"><span style="font-size: small;"> </span></span></span>Tím zajistíte, že se bude stránka správně řadit do fronty pro navigaci.</p>
<h1>Aplikační lišta pro navigaci</h1>
<p>Aplikační lišta je náhrada za klasickou nabídku. Může být na obrazovce nahoře nebo dole.</p>
<p><a href="http://www.zdrojak.cz/wp-content/uploads/2013/04/image41.png" rel="lightbox-7868"><img class="aligncenter size-large wp-image-7891" alt="Aplikační lišta" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/image41-1024x575.png" width="625" height="350" /></a></p>
<p>Do aplikační lišty můžete umístit libovolné ovládací prvky. Aplikační lištu vložíme do stránky <i>default.html</i> bude tak vždy dostupná.</p>
<pre><code>&lt;div id="appbar" data-win-control="WinJS.UI.AppBar"&gt;
  &lt;button data-win-control="WinJS.UI.AppBarCommand" data-win-options="{id:'cmd', label:'Command', icon:'placeholder'}" type="button"&gt;&lt;/button&gt;
&lt;/div&gt;</code></pre>
<p>Přiřazení události pak uděláte v inicializaci stránky, tedy v události <i>activated</i>.</p>
<pre><code>var appbar = document.getElementById("appbar").winControl;

var homeButton = appbar.getCommandById("homeButton");
homeButton.addEventListener("click", goToHomePage, false);
</code></pre>
<p>Zdrojové kódy z článku <a href="http://www.zdrojak.cz/wp-content/uploads/2013/04/3-BasicNavigation.zip">ke stažení</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zdrojak.cz/clanky/vicestrankove-windows-store-aplikace-a-navigace/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GTD i u vás</title>
		<link>http://www.zdrojak.cz/clanky/gtd-i-u-vas/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gtd-i-u-vas</link>
		<comments>http://www.zdrojak.cz/clanky/gtd-i-u-vas/#comments</comments>
		<pubDate>Mon, 15 Apr 2013 22:00:38 +0000</pubDate>
		<dc:creator>Jiří Knesl</dc:creator>
				<category><![CDATA[PR Články]]></category>
		<category><![CDATA[Akce]]></category>
		<category><![CDATA[GTD]]></category>

		<guid isPermaLink="false">http://www.zdrojak.cz/clanky/?p=7839</guid>
		<description><![CDATA[ <div><img width="100" height="100" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/100x100.gif" class="attachment-post-thumbnail wp-post-image" alt="GTD konference" /></div>Měl jsem to štěstí poznat pár firem, kde se používalo GTD ve větším a v týmech si lidi pomáhali. Někde jsem to GTD i sám zavedl. O tom ale dnes psát nechci. Chci psát o tom, jak jim to pomohlo zredukovat byrokracii a zrychlilo komunikaci. Proč právě tady na Zdrojáku? Techniky samotné jsou sice platné i mimo IT, ale právě v IT firmách jsem byl ze své praxe svědkem toho všeho. ]]></description>
				<content:encoded><![CDATA[ <div><img width="100" height="100" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/100x100.gif" class="attachment-post-thumbnail wp-post-image" alt="GTD konference" /></div><h2>GTD i u vás</h2>
<p>Měl jsem to štěstí poznat pár firem, kde se používalo GTD ve větším a v týmech si lidi pomáhali. Někde jsem to GTD i sám zavedl. O tom ale dnes psát nechci.<br />
Chci psát o tom, jak jim to pomohlo zredukovat byrokracii a zrychlilo komunikaci. Proč právě tady na Zdrojáku? Techniky samotné jsou sice platné i mimo IT, ale právě v IT firmách jsem byl ze své praxe svědkem toho všeho.</p>
<p><img class="aligncenter size-full wp-image-7854" alt="GTD" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/aby_vse_klapalo.jpg.scaled.500.jpg" width="500" height="409" /></p>
<h2>Hoď mi to do inboxu</h2>
<p>Jedním z prvních kroků, které člověk dělá, když implementuje GTD, je uvědomění si svých inboxů. To máme: e-mail, informační systém, osobní e-mail, lístečky kolem monitoru, inbox v nástroji na sebeorganizaci, krátkodobá paměť (Slíbil jsi, že to uděláš! Ne neslíbil!), kolikrát i mobilní telefon.</p>
<p>Někdy umí člověk počet inboxů zredukovat (vždy se eliminuje paměť) na nezbytné minimum. V každém případě ale ví, jaké má inboxy. A tak když někomu řekne: &#8222;Hoď mi to do e-mailu/systému/na papír na stůl&#8220;, tak že na to nezapomene. Uvědomění všech inboxů je první krok, druhý je kontrola všech inboxů. Tedy člověk nekouká jen do e-mailu nebo IS, ale kontroluje všechny zdroje úkolů soustavně, a to je tím kouzlem, proč lidé v GTD vypadají, jako by nikdy nic nezapomněli.</p>
<h2>Dej mi vědět, až to bude</h2>
<p>No a když už nám tedy něco přistálo v inboxu, ještě není vůbec jasné, že jsme my ti praví, kdo mají danou událost udělat.</p>
<p>Máme 2 varianty:</p>
<ol style="list-style-type: lower-alpha;" type="a">
<li>úkol přistál na špatném stole, má ho řešit někdo jiný</li>
<li>úkol přistál u nás, my sice danou činnost nemáme dělat, ale záleží nám na výsledku</li>
</ol>
<p>Pokud platí a), úkol předáme do inboxu někomu jinému. Dál se o věc nemusíme starat.</p>
<p>Pokud nás ale zajímá, jak dopadl výsledek, přidáme dotyčnému do inboxu zprávu, &#8222;až bude hotovo, dej mi vědět&#8220; a přidáte si záležitost na seznám Čekám na. Pak máte jistotu, že se na věc nezapomene a že ji máte pod kontrolou.</p>
<h2>Jednání, méně, lépe, efektivně</h2>
<p>Když už musíte jednat, je dobré držet se několika pravidel.</p>
<ul>
<li>výsledkem jednání musí být, jaké jsou další kroky a kdo za ně zodpovídá, jinak se vaše jednání rozpliznou a nebudou mít ideální výsledek</li>
<li>na jednání jde tak málo lidí, jak je to možné</li>
<li>nejednat, pokud není o čem</li>
</ul>
<h2><img class="aligncenter  wp-image-7856" alt="Jiří Knesl" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/knesl.png" width="432" height="287" /></h2>
<h2>Efektivně na e-mail</h2>
<p>GTD minimalizuje počet inboxů. To znamená eliminovat filtry, které vám rozhazují e-maily do různých složek. Místo toho jeden inbox, který je pravidelně celý vyprázdněn a zpracován.</p>
<p>Návod, jak na e-mail:</p>
<ul>
<li>1 inbox &#8211; čím méně e-mailů ke kontrole, tím lepší přehled na jeden pohled</li>
<li>držte počet mailů ve schránce velmi nízký &#8211; průběžně objasňujte úlohy a rozhodujte se, jaké kroky podniknete</li>
<li>nepracujte s e-mailem jako se seznamem úkolů &#8211; lidí, kteří používají e-mail jako seznam úkolů, je možná víc, než těch, kdo dělají GTD. Bohužel! E-mail neobsahuje žádnou evidenci toho, jaký chci výsledek, v jaké fázi úkol je a jestli jsem mezitím něco nezadal dalším lidem i jinými komunikačními kanály.</li>
</ul>
<h2>Víc informací</h2>
<p>GTD je metoda, která se orientuje především na kroky spojené s řízením pracovního procesu. Cílem metody je vytvořit a udržovat spolehlivý a funkční přehled všech úkolů, které potřebujete udělat, a tyto úkoly přenést z paměti například na papír nebo do elektronické aplikace a mozek nadále používat jen ke kreativitě a dalšímu konstruktivnímu myšlení.<br />
Chcete se o GTD dozvědět víc? Přijďte na <a href="http://www.gtdkonference.cz/?utm_source=clanek&amp;utm_medium=Zdrojak.cz&amp;utm_campaign=Zdrojak.cz">GTD konferenci</a>, kde budu přednášet o tom, jak probíhá plánování v GTD a jak se GTD staví k delším časovým horizontům. Konference probíhá v Praze 27.4., tedy už co nevidět. <a href="http://www.gtdkonference.cz/?utm_source=clanek&amp;utm_medium=Zdrojak.cz&amp;utm_campaign=Zdrojak.cz">Zaregistrovat se můžete zde</a>.</p>
<p><a href=" http://www.gtdkonference.cz/?utm_source=clanek&amp;utm_medium=Zdrojak.cz&amp;utm_campaign=Zdrojak.cz"><img class="aligncenter size-medium wp-image-7851" alt="GTD konference" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/logo11-450x180.gif" width="450" height="180" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zdrojak.cz/clanky/gtd-i-u-vas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ovládací prvky specifické pro Windows Store aplikace a PLM</title>
		<link>http://www.zdrojak.cz/clanky/ovladaci-prvky-specificke-pro-windows-store-aplikace-a-plm/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ovladaci-prvky-specificke-pro-windows-store-aplikace-a-plm</link>
		<comments>http://www.zdrojak.cz/clanky/ovladaci-prvky-specificke-pro-windows-store-aplikace-a-plm/#comments</comments>
		<pubDate>Thu, 11 Apr 2013 22:00:05 +0000</pubDate>
		<dc:creator>Štěpán Bechynský</dc:creator>
				<category><![CDATA[Různé]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[windows 8]]></category>
		<category><![CDATA[Windows Store]]></category>

		<guid isPermaLink="false">http://www.zdrojak.cz/clanky/?p=7793</guid>
		<description><![CDATA[ <div><img width="100" height="100" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/html5-windows-store-100px.png" class="attachment-post-thumbnail wp-post-image" alt="Html5 windows Store 100px" /></div>V tomto díle si vysvětlíme, jak se používají prvky uživatelského rozhraní, které nejsou součástí specifikace HTML5 a jsou specifické pro Windows Store aplikace. Ukážeme si také Process Lifetime Management (PLM) aplikací.]]></description>
				<content:encoded><![CDATA[ <div><img width="100" height="100" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/html5-windows-store-100px.png" class="attachment-post-thumbnail wp-post-image" alt="Html5 windows Store 100px" /></div><h2>Ovládací prvky ze specifikace HTML5</h2>
<p>Ovládací prvky ze specifikace HTML5 používáte naprosto identicky, jako u běžných webových aplikací. Jejich design je však přizpůsoben pro dotykové ovládání. Dalo by se říct, že výchozí styl ovládacího prvku je upraven tak, aby odpovídal požadavkům pro ovládání doteky. Pro toto chování nemusíte vůbec nic měnit ani nastavovat. K těmto ovládacím prvkům přistupujete stejně jako u běžné webové stránky.</p>
<h2>Specifické ovládací prvky</h2>
<p>Windows Runtime vám nabízí celou řadu ovládacích prvků, které usnadňují vývoj aplikace, ale nejsou součástí specifikace HTML5. Je to podobné, jako když pracuje např. s jQuery UI. Ovládací prvek je do stránky vložen pomocí Custom Data Attributes.</p>
<pre><code>&lt;div data-win-control="WinJS.UI.ToggleSwitch"
     data-win-options="{title: 'Wi-fi'}"
     id="myToggle"&gt;
&lt;/div&gt;</code></pre>
<p>Atribut <i>data-win-control</i> odkazuje na ovládací prvek <i>ToogleSwitch</i>, který je specifický pro Windows Store aplikace a nemá obdobu ve specifikaci HTML5. Tento ovládací prvek je ale ve finále samozřejmě vykreslen pomocí HTML5. Atributem <i>data-win-options</i> nastavujete vlastnosti ovládacího prvku.</p>
<p>Během inicializace aplikace je třeba všechny <i>Custom Data Attributes</i> zpracovat. O to se stará kód v události <i>onactivated</i>. Tento kód je součástí šablony.</p>
<pre><code>args.setPromise(WinJS.UI.processAll());</code></pre>
<p>Metoda <i>processAll</i> projde DOM a hledá elementy s atributem <i>data-win-control</i>, které zamění za příslušné prvky uživatelského rozhraní. <i>ToogleSwitch</i> je například reprezentován takto:</p>
<pre><code>&lt;div class="win-title" id="ms__id1" role="note"&gt;Wi-fi&lt;/div&gt;
&lt;div style="display: -ms-grid;"&gt;
  &lt;div&gt;On&lt;/div&gt;&lt;div class="win-label"&gt;Off&lt;/div&gt;&lt;input class="win-switch" role="checkbox" aria-checked="false" aria-disabled="false" aria-labelledby="ms__id1" type="range" max="1" step="1"&gt;
&lt;/div&gt;</code></pre>
<h2>ListView</h2>
<p>Představte si, že máte pole objektů, které jsou například vygenerovány z databáze nebo RSS Feed, a toto pole potřebujete zobrazit.</p>
<pre><code>[{ title: "Banana Blast", text: "Low-fat frozen yogurt", picture: "/images/60Banana.png" },
 { title: "Lavish Lemon Ice", text: "Sorbet", picture: "/images/60Lemon.png" },
 { title: "Marvelous Mint", text: "Gelato", picture: "/images/60Mint.png" },
 { title: "Creamy Orange", text: "Sorbet", picture: "/images/60Orange.png" },
 { title: "Succulent Strawberry", text: "Sorbet", picture: "/images/60Strawberry.png" }]</code></pre>
<p>Abyste nemuseli generovat DOM v nějakém cyklu, tak jak to bylo běžné v začátcích PHP, můžete použít ovládací prvek <i>ListView</i>.</p>
<pre><code>&lt;div id="smallListIconTextTemplate"data-win-control="WinJS.Binding.Template"style="display: none"&gt;
  &lt;div class="smallListIconTextItem"&gt;
    &lt;img src="#"class="smallListIconTextItem-Image"data-win-bind="src: picture"/&gt;
    &lt;div class="smallListIconTextItem-Detail"&gt;
      &lt;h4 data-win-bind="innerText: title"&gt;&lt;/h4&gt;
      &lt;h6 data-win-bind="innerText: text"&gt;&lt;/h6&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div id="listView"
     class="win-selectionstylefilled"
     data-win-control="WinJS.UI.ListView"
     data-win-options="{
       itemDataSource: myData.dataSource,
       itemTemplate: smallListIconTextTemplate,
       selectionMode: 'none',
       tapBehavior: 'none',
       swipeBehavior: 'none',
       layout: { type: WinJS.UI.GridLayout }
     }"
&gt;&lt;/div&gt;</code></pre>
<p>Princip je velmi jednoduchý. Pro každý prvek pole vytvoříte tzv. itemTemplate. Je to vlastně šablona, která se zkopíruje tolikrát, kolik je položek v poli a použije se pro vykreslení položek pole. Propojení šablony a objektu v poli se využívá datová vazba pomocí atributu <i>data-win-bind</i>. Datová vazba propojí vlastnost elementu s vlastností objektu. Detailní příklad najdete v příkladu <a href="http://code.msdn.microsoft.com/windowsapps/ListView-basic-usage-sample-fcc451db">HTML ListView essentials sample</a>. Zdrojové kódy výše uvedeného příkladu najdete v <a href="http://www.zdrojak.cz/wp-content/uploads/2013/04/2-ToogleSwitchJavascript.zip">příloze toho článku</a>.</p>
<h2>Process Lifetime Management – PLM</h2>
<p>Windows Store aplikace jsou svým chováním podobné aplikacím na mobilních telefonech. Pokud není aplikace na popředí (Running), tak aplikace neběží (Suspended) a její vlákna na procesoru jsou zastavena, ale aplikace je stále zavedena v paměti. Mezi stavy Running a Suspended aplikace přechází vlastně okamžitě, stačí spustit její vlákna na procesoru. Aplikace je o přechodu mezi jednotlivými stavy obeznámena pomocí událostí.</p>
<p><img class="aligncenter size-full wp-image-7805" alt="Process Lifetime Management" src="http://www.zdrojak.cz/wp-content/uploads/2013/04/plm.png" width="553" height="460" /></p>
<p>Pokud začnou docházet systémové zdroje, tak je aplikace definitivně ukončena. Je odstraněna z paměti a jsou zrušena její vlákna na procesoru. Protože je již aplikace v režimu Suspended (neběží), tak se o přechodu do stavu <i>Not running</i> <b>nedozví</b>. O tom, že byla aplikace „násilně“ ukončena se dozví až při dalším startu. Tato informace je uchována ve vlastnosti <span style="color: #000000;"><span style="font-family: Consolas,serif;"><span style="font-size: small;">args.detail.previousExecutionState</span></span></span><span style="color: #000000;"><span style="font-family: Consolas,serif;"><span style="font-size: small;">.</span></span></span></p>
<p>Je na vás, na programátorech, abyste při události Suspending uložili rozdělanou práci uživatele a při dalším startu, pokud se aplikace dostala až do stavu <i>Not running</i>, jste uživatelovu rozdělanou práci obnovili.</p>
<pre><code>app.onactivated = function (args) {
  if (args.detail.kind === activation.ActivationKind.launch) {
    if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
      // TODO: This application has been newly launched. Initialize
      // your application here.
    } else {
      // TODO: This application has been reactivated from suspension.
      // Restore application state here.
    }
    args.setPromise(WinJS.UI.processAll());
  }
};

app.oncheckpoint = function (args) {
  // TODO: This application is about to be suspended. Save any state
  // that needs to persist across suspensions here. You might use the
  // WinJS.Application.sessionState object, which is automatically
  // saved and restored across suspension. If you need to complete an
  // asynchronous operation before your application is suspended, call
  // args.setPromise().
};</code></pre>
<h2>Může běžet aplikace na pozadí?</h2>
<p>Ano i ne. Pokud potřebujete, aby vaše aplikace dělala nějakou činnost na pozadí, tak pro tuto činnost musíte najít vhodnou systémovou službu a té práci předat. Například, když víte, že budete stahovat velký objem dat, tak tuto práci nebude dělat vaše aplikace, ale předá ji systémové službě <a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh452979.aspx">BackgroundTransfer</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zdrojak.cz/clanky/ovladaci-prvky-specificke-pro-windows-store-aplikace-a-plm/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
