<?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>Tominator</title>
	<atom:link href="http://tominator.comper.sk/feed/" rel="self" type="application/rss+xml" />
	<link>http://tominator.comper.sk</link>
	<description>A všetko čo ho zaujíma</description>
	<lastBuildDate>Tue, 28 Oct 2014 13:49:05 +0000</lastBuildDate>
	<language>sk</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.0.38</generator>
	<item>
		<title>Píšeme testy so Sugar.php</title>
		<link>http://tominator.comper.sk/2014/07/piseme-testy-so-sugar-php/</link>
		<comments>http://tominator.comper.sk/2014/07/piseme-testy-so-sugar-php/#comments</comments>
		<pubDate>Wed, 09 Jul 2014 17:08:56 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://tominator.comper.sk/?p=283</guid>
		<description><![CDATA[Keď som naposledy písal o testovaní nezmienil som žiaden testovací nástroj pre PHP. Pretože som nikdy v PHP testy nepísal. Dobre, nejaké som napísal, ale bolo to zlé. Pri programovaní v PHP používam framework CodeIgniter. Preto, keď som potreboval, tak najjednoduchšie bolo použiť jeho Unit Test triedu. Potom, keď som začal programovať v Node,js, začal som aj húfne [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Keď som naposledy písal o testovaní nezmienil som žiaden testovací nástroj pre PHP. Pretože som nikdy v PHP testy nepísal. Dobre, nejaké som napísal, ale bolo to zlé. Pri programovaní v PHP používam framework CodeIgniter. Preto, keď som potreboval, tak najjednoduchšie bolo použiť jeho Unit Test triedu. Potom, keď som začal programovať v Node,js, začal som aj húfne písať testy. Teraz som však mal na chvíľku dôvod písať v PHP a chcel som v písaní testov pokračovať. Zistil som, že pre PHP nie je žiaden dobrý nástroj na testovanie, žiaden mi nevyhovoval. Tak som si napísal vlastný, volá sa Sugar.php. V tomto príspevku by som chcel ukázať nejaký príklad a popísať jeho výhody.</p>
<pre class="brush: php; title: ; notranslate">
describe( '#htmlspecialchars', function()
{
    it ('should replace chosen characters', function()
    {
        a('htmlspecialchars')-&gt;with('&lt;')-&gt;should-&gt;be('&amp;lt;');
        a('htmlspecialchars')-&gt;with('&gt;')-&gt;should-&gt;be('&amp;gt;');
        a('htmlspecialchars')-&gt;with('&amp;')-&gt;should-&gt;be('&amp;amp;');
        a('htmlspecialchars')-&gt;with('&quot;')-&gt;should-&gt;be('&amp;quot;');
        a('htmlspecialchars')-&gt;with('\'')-&gt;should-&gt;be('\'');
    });

    it ('should leave double quotes when flag ENT_NOQUOTES is set', function()
    {
        a('htmlspecialchars')-&gt;with('&quot;', ENT_NOQUOTES)-&gt;should-&gt;be('&quot;');
    });

    it ('should protect single quote when flag ENT_QUOTES is set', function()
    {
        a('htmlspecialchars')-&gt;with('\'', ENT_QUOTES )-&gt;should-&gt;be('&amp;#039;');
    });

    // ...

});

sugar();
</pre>
<h2>Výhody</h2>
<p>Sugar.php je navrhnutý tak, aby ste mohli písať testy čo najrýchlejšie &#8211; žiadne volanie tried, len veľmi krátke funkcie. Tak isto sa snaží, aby každý test vyzeral ako veta, takže už len čítaním viete povedať, čo daný test robí. Zabaľuje jednotlivé testy do väčších celkov, čím zvyšuje celkovú prehľadnosť a tiež šetrí váš čas popisovaním každého jedného testu. Keď to zhrnieme:</p>
<ul>
<li>Písanie testov skoro ľudskou rečou</li>
<li>Väčšia prehľadnosť kódu rozčlenením testov do skupín</li>
<li>Kratší zápis</li>
<li>Chytanie chýb</li>
<li>Spätné dohľadanie chyby (error tracking)</li>
<li>Možnosť spustiť len špecifické testy</li>
</ul>
<h2>Začíname so Sugar.php</h2>
<p>Predstavme si, že testujeme model, ktorý sa stará o objednávky. Má niekoľko metód (create, read, update, delete) a pracuje s databázou. Začnime metódou create. Jej úlohou je vložiť novú objednávku do systému. Prvou vecou ktorú spravíme je volanie <strong>describe()</strong>. Describe slúži na popísanie aktuálne testovaných funkcií, v našom prípade funkcie create. Druhým parametrom je callback (úplne presne closure), ktorý obsahuje jednotlivé testy tejto funkcie.</p>
<pre class="brush: php; title: ; notranslate">
require 'sugar.php';
require 'order_model.php'; // Model pre objednávky
require 'db.php'; // Trieda starajúca sa o DB, v kóde bude fungovať ako Active Record v Codeigniter

describe( '#create', function(){});
</pre>
<p>Teraz by sme radi vytvorili nejaké testy, tie vytvárame pomocou it(). V popise uvedieme, ako by sme chceli, aby sa funkcia správala, a ako druhý parameter uvedieme jednotlivé testy, ktoré overujú, že sa tak naozaj správa.</p>
<pre class="brush: php; title: ; notranslate">
// ... requires

describe( '#create', function()
{
    it( 'should add new entry, when data are ok', function()
    {
        a( [ $model, 'create' ] )-&gt;with( [ 'seller_id' =&gt; 5, 'product_id' =&gt; 6 ] )-&gt;should-&gt;be-&gt;ok();

        $order = $db-&gt;get( 'order' )-&gt;result_array();

        a( $order )-&gt;should-&gt;have-&gt;length( 1 ); // V DB by mal byť iba jedna objednávka
        a( $order[0] )-&gt;should-&gt;have-&gt;properties( [ 'seller_id', 'product_id' ] );
        a( $order[0]-&gt;seller_id )-&gt;should-&gt;be( 5 );
        a( $order[0]-&gt;buyer_id )-&gt;should-&gt;be( 10 );
    });

    it( 'should add new entry, when product_id is missing', function()
    {
        a( [ $model, 'create' ] )-&gt;with( [ 'seller_id' =&gt; 5 ] )-&gt;should-&gt;fail();

        $order = $db-&gt;get( 'order' )-&gt;result_array();

        a( $order )-&gt;should-&gt;have-&gt;length( 0 ); // V DB by nemala byť ani jedna objednávka
    });
});
</pre>
<p>Ako je možné vidieť, jednotlivé testy sa zapisujú pomocou funkcie a(), do ktorej vložíme požadovanú hodnotu, a nato ďalej nabaľujeme požadovanú funkčnosť. Avšak druhý test nám neprejde. A to preto, lebo v DB bude jedna objednávka a to tá z prvého testu. Ak chceme aby sa nám nejaký kód, napríklad vyprázdnenie DB, spustil pred každým testom použijeme funkciu <strong>before_each()</strong>, ktorú napíšeme hneď za describe:</p>
<pre class="brush: php; title: ; notranslate">
// ... requires

describe( '#create', function()
{
    before_each(function()
    {
        $db-&gt;truncate( 'order' ); // Vyprázdni tabuľku order
    });

    it( 'should add new entry, when data are ok', function()
    {
        a( [ $model, 'create' ] )-&gt;with( [ 'seller_id' =&gt; 5, 'product_id' =&gt; 6 ] )-&gt;should-&gt;be-&gt;ok();

        $order = $db-&gt;get( 'order' )-&gt;result_array();

        a( $order )-&gt;should-&gt;have-&gt;length( 1 ); // V DB by mal byť iba jedna objednávka
        a( $order[0] )-&gt;should-&gt;have-&gt;properties( [ 'seller_id', 'product_id' ] );
        a( $order[0]-&gt;seller_id )-&gt;should-&gt;be( 5 );
        a( $order[0]-&gt;product_id )-&gt;should-&gt;be( 6 );
    });

    it( 'should add new entry, when product_id is missing', function()
    {
        a( [ $model, 'create' ] )-&gt;with( [ 'seller_id' =&gt; 5 ] )-&gt;should-&gt;fail();

        $order = $db-&gt;get( 'order' )-&gt;result_array();

        a( $order )-&gt;should-&gt;have-&gt;length( 0 ); // V DB by nemala byť ani jedna objednávka
    });
});
</pre>
<p>Na podobnom princípe funguje <strong>after_each()</strong>.</p>
<h2>Closures</h2>
<p>Môže sa stať, že vo svojich testoch budete potrebovať nejakú premennú &#8220;z vonku&#8221;. Môžete použiť globálne premenné, ale to by bolo zbytočné. Sugar.php totižto pracuje na systéme Closures. Neviem to preložiť, ale princíp je v tom, že closure sa správa ako funkcia ale berie ešte parametre &#8220;z vonku&#8221;, poďme si ukázať príklad (všimnite si use() pri volaní it()):</p>
<pre class="brush: php; title: ; notranslate">
describe( '#read', function()
{
    $buyer_id = 10;

    it( 'should find order when after it was created', function() use( $buyer_id )
    {
        // ... create order

        a( [ $model, 'read' ] )-&gt;with( [ 'user_id' =&gt; $buyer_id ] )-&gt;should-&gt;be-&gt;ok();

        // .. another tests
    });
});
</pre>
<p>Takto jednoducho. Samozrejme use() akceptuje viac parametrov.</p>
<h2>Testujeme funkcie a metódy</h2>
<p>Okrem bežných hodnôt môžeme so Sugar.php testovať aj priebeh funkcií &#8211; či zlyhali alebo či vrátili očakávaný výstup. Používame k tomu kľúčové slovo <strong>.with()</strong>. Do a() vložíme názov funkcie a do with() vložíme parametre. Vyzerá to ako kód vyššie:</p>
<pre class="brush: php; title: ; notranslate">
a('htmlspecialchars')-&gt;with('&lt;')-&gt;should-&gt;be('&amp;lt;');
</pre>
<p>Ak chceme testovať metódu nejakého objektu, vložíme <a href="http://www.php.net/manual/en/language.types.callable.php" target="_blank">callbackový zápis</a>.</p>
<pre class="brush: php; title: ; notranslate">
a( array( $object, 'method' ) )-&gt;with( 'hello' )-&gt;should-&gt;be( 'hello' );
</pre>
<h2>Záver</h2>
<p>Zvyšok je už o skladaní funkcií dokopy. Popis a použitie jednotlivých funkcií nájdete na<a href="https://github.com/tomasbonco/sugar.php" target="_blank"> stránke projektu: https://github.com/tomasbonco/sugar.php</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://tominator.comper.sk/2014/07/piseme-testy-so-sugar-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prečo píšem testy?</title>
		<link>http://tominator.comper.sk/2014/06/preco-pisem-testy/</link>
		<comments>http://tominator.comper.sk/2014/06/preco-pisem-testy/#comments</comments>
		<pubDate>Sat, 07 Jun 2014 15:36:45 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://tominator.comper.sk/?p=273</guid>
		<description><![CDATA[V živote programátora dojde ku situácií, kedy začne čítať o testoch, a neviem ako vy, ale keď som sa s tým stretol prvý krát, netušil som, načo to je. Ako som tak na to začal narážať častejšie, porozumel som síce načo to je, ale neporozumel som ako ich správne písať &#8211; čo testovať. Tento príspevok [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>V živote programátora dojde ku situácií, kedy začne čítať o testoch, a neviem ako vy, ale keď som sa s tým stretol prvý krát, netušil som, načo to je. Ako som tak na to začal narážať častejšie, porozumel som síce načo to je, ale neporozumel som ako ich správne písať &#8211; čo testovať. Tento príspevok by mal pomôcť všetkým, ktorý buď nevedia prečo ich písať, alebo nevedia ako ich písať.</p>
<h2>Čo sú automatizované testy?</h2>
<p>Poznáte to &#8211; napíšete kód, potom ho spustíte, nastavíte nejak premenné (prípadne vstupy), počkáte si na výsledok a overíte, či sa zhoduje s tým, čo máte v hlave. No a myšlienka je v tom &#8211; prečo to nezautomatizovať? Prečo nenapísať, aký výsledok z funkcie očakávate pri daných nastaveniach? A preto vznikli testy. Popravde, vysvetlil som to tak rýchlo, až sa pýtam sám seba, či to potrebovalo vlastný nadpis :).</p>
<h2>Výhody testovania</h2>
<blockquote><p>Život je príliš krátky, na písanie testov.<br />
<small> &#8211; hlupák</small></p></blockquote>
<p>Testovanie má hneď niekoľko výhod:</p>
<ol>
<li>Viete, na čom ste &#8211; viete na koľko % máte daný script hotový, či funguje, alebo nie. Ak prechádza všetkými testami, môžete si byť istý, že s celkom bude dobre zapadať.</li>
<li>Šetrí to čas &#8211; horeuvedený citát je asi najčastejší protiargument, s ktorým sa stretávam. Avšak je mylný. Ručné testovanie prebieha niekoľko sekúnd a môže trvať aj niekoľko minút, zatiaľ čo automatické testy trvajú pár milisekúnd. Ak script obsahuje chybu, testami nato príde okamžite. Ak sa ku scriptu vraciate, s tým, že potrebujete upraviť nejakú funkciu, akú máte istotu, že neohrozíte, nejakú inú kritickú časť projektu? S dobre napísanými testami, máte 100% istotu. Testy vám ušetria skutočne hromadu času.</li>
<li>Radosť z programovania &#8211; váš script práve prešiel všetkými testami, možno neveríte ale je to super pocit!</li>
<li>Dokumentácia &#8211; najhoršie na dokumentácií je, keď je stará, alebo nie je. Lenže testy sa píšu spolu s kódom (alebo pred ním), takže nemôžu byť staré. Ak nimi script prechádza, stačí sa na ne pozrieť a viete, ako ho používať.</li>
<li>Triedi myšlienky &#8211; pri písaní testov si v hlave utriedite, čo potrebuje a ako to chcete použiť.</li>
</ol>
<h2>Ako ich písať?</h2>
<p>Ako som už spomenul, moje začiatky neboli práve slávne, testy som pchal do funkcie a testoval, či mi do nej chodia premenné v správnom tvare. Dnes už viem, že to nemá riešiť test, to má riešiť samotná funkcia. Testy slúžia na otestovanie veľkých celkov &#8211; funkcií a tried. Testy simulujú ich volanie z vonku na štandardné (očakávané) ale aj chybné vstupy a overujú, či sa testovaná jednotka zachovaná tak, ako chceme. Veľmi dobrou radou je písať testy ešte pred samotným kódom. Tak si utriedite v hlave, ako to má fungovať, viete, ako overíte výsledky výstupov a rovnako vám to pomáha aj v motivácií, pretože viete, že 3 metódy v danej triede už máte hotové a ďalšie 2 vám ešte treba spraviť. Každý test by mal byť celok, nepredpokladajte spustenie jedného testu po druhom. Každý test by si mal inicializovať to, čo potrebuje a vyčistiť, s čím pracoval.</p>
<h2>Problémy s testovaním</h2>
<p>Niekedy nie je jednoduché písať testy. Napríklad v prípade komunikácie medzi Serverom-&gt;Klientom (AJAX, &#8230;). V takom prípade je veľmi dobrým nápadom, simulovať odpoveď servera. V JS sa to môže vyriešiť napríklad prepísaním funkcie obsluhujúcej AJAX tak, aby vracala predom pripravené odpovede, pre potreby testovania. Ušetríte tým čas strávený čakaním na serverovú odpoveď a tiež pripravíte script na prácu s dobrou aj zlou odpoveďou.</p>
<p>Tiež som narazil na problém s ukladaním dát. Funkcia ukladá dáta a treba overovať, č ich správne uložila a pracovať s týmito dátami ďalej. Náročná vec na testovanie. Problém, ktorému som čelil bola práve databáza. Ak by som použil tú, na ktorej som skúšal svoju aplikáciu, musel by som ju buď po každom teste zmazať, čo je neprípustné, alebo by som musel testy písať veľmi opatrne, s ohľadom na existujúce dáta, čo naozaj nie je dobrý nápad. Riešením bolo vytvoriť novú databázu, za účelom testovania. Táto mohla byť zakaždým vymazaná, zatiaľ čo pôvodná ostala nedotknutá.</p>
<h2>Čím testovať?</h2>
<p>Verím tomu, že pre každý jazyk už existuje nejaký dobrý nástroj na testovanie. Pre moje účely mi v C++ veľmi dobre vystačil <a href="https://github.com/philsquared/Catch" target="_blank">Catch</a>. Pre JavaScript používam <a href="http://visionmedia.github.io/mocha/" target="_blank">Mocha</a>. Pre C som si napísal svoj vlastný testovací script. Podľa čoho určujem, či je to dobrý nástroj? V prvom rade komunitou. Čím väčšia komunita nástroj využíva, tým viac sa s ním stretnete. Používať práve najpoužívanejší testovací nástroj vám umožní čítať testy ostatných rýchlo a tiež môžete predpokladať, že je overený. Druhým veľkým kritériom je jednoduchosť použitia, niekedy je na škodu mať príliš veľa funkcií, inokedy vám niektoré funkcie chýbajú, môže sa tiež stať, že testy sa zapisujú neuveriteľne komplikovane. S testovacím nástrojom budete pracovať veľa, zvoľte si taký, s ktorým sa vám bude pracovať dobre. V poslednom rade pozerám na dokumentáciu. Aby ste vedeli využiť silu testovacieho nástroja, potrebuje mu rozumieť a to sa bez dobrej dokumentácie nedá.</p>
<h2>Záver</h2>
<p>Dúfam, že som vás navnadil k písaniu testov. V niektorom z ďalších blogpostov by som sa rád zameral na písanie testovateľného serverového kódu v JavaScripte.</p>
]]></content:encoded>
			<wfw:commentRss>http://tominator.comper.sk/2014/06/preco-pisem-testy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript a ukazovatele</title>
		<link>http://tominator.comper.sk/2014/06/javascript-a-ukazovatele/</link>
		<comments>http://tominator.comper.sk/2014/06/javascript-a-ukazovatele/#comments</comments>
		<pubDate>Fri, 06 Jun 2014 15:43:12 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://tominator.comper.sk/?p=265</guid>
		<description><![CDATA[Ak v PHP napíšete a spustíte nasledujúci kód, čo nám vypíše? Ak hádate &#8216;value&#8217;, tak hádate správne. Ako však dosiahnuť, aby jedna premenná odkazovala na druhú, bola iba akousi ikonou? V PHP to nie je náročné, stačí pri priradzovaní (2. riadok) dať po rovná sa (=) znak ampersandu (&#38;): Ako to funguje na pozadí, vysvetlím o [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ak v PHP napíšete a spustíte nasledujúci kód, čo nám vypíše?</p>
<pre class="brush: php; title: ; notranslate">
$a = array( 'key' =&gt; 'value' ); // Nastavíme pole $a
$b = $a; // Skopírujeme pole $a do poľa $b
$a['key'] = 'value2'; // Zmeníme hodnotu 'key' v $a
echo $b['key']; // Vypíšeme hodnotu 'key' v $b
</pre>
<p>Ak hádate &#8216;value&#8217;, tak hádate správne. Ako však dosiahnuť, aby jedna premenná odkazovala na druhú, bola iba akousi ikonou? V PHP to nie je náročné, stačí pri priradzovaní (2. riadok) dať po rovná sa (=) znak ampersandu (&amp;):</p>
<pre class="brush: php; title: ; notranslate">
$a = array( 'key' =&gt; 'value' );
$b = &amp;$a; // $b odkazuje na rovnaké miesto kde $a
$a['key'] = 'value2';
echo $b['key']; // value2
</pre>
<p>Ako to funguje na pozadí, vysvetlím o chvíľu, mám totiž ďalšiu otázku, čo sa stane v JavaScripte, keď napíšete nasledujúci kód?</p>
<pre class="brush: jscript; title: ; notranslate">
a = { key: &quot;value&quot; };
b = a;
a.key = &quot;value2&quot;;
console.log( b.key ); // value2
</pre>
<p>Na konzolu sa vypíše &#8216;value2&#8242;. Dôvod, prečo sa to deje, ako nadpis prezrádza, je, že JavaScript nekopíruje, JavaScript ukazuje. Nie vždy. Pokým čísla, reťazce a bool budú vždy skopírované, polia a objekty budú odkazované.</p>
<h2>Prečo sa to deje? Ako to skopírovať?</h2>
<p>Myslím si, že túto vlastnosť zdedil JavaScript po jazyku C/C++. Však nakoniec práve do C++ sa JavaScript kompiluje (platí pre V8). V jazyku C/C++ si vytvoríte premennú (nazvime ju a), ktorá je automaticky ukazovateľom, následne (nie nutne v rovnakom riadku) potrebuje vyhradiť kus pamäte na ktorú bude novo vytvorená premenná odkazovať. Premenná teda odkazuje na kus pamäte. Keď vytvoríte druhú premennú (b) a priradíte ju ku prvej ( b = a), tak sa skopíruje adresa na ktorú ukazuje a obe budú ukazovať na rovnaké miesto. A to je presne správanie, ktoré vidíme v JavaScripte, ale chválabohu nám aspoň odpadla tá práca s pamäťou. Lenže, ako dáta skopírujeme?</p>
<p>Ak to budete niekedy hľadať, nazýva sa to &#8220;deep copy&#8221;, ale ľudia radi hovoria o klonovaní. jQuery má nato funkciu $.extend, ale v súčastnosti sa ako najefektívnejší spôsob ukazuje zkonvertovať to do JSON a späť:</p>
<pre class="brush: jscript; title: ; notranslate">
a = { key: &quot;value&quot; };
b = JSON.parse( JSON.stringify( a ));
a.key = &quot;value2&quot;;
console.log( b.key ); // value
</pre>
<p>Funguje to pre objekty aj polia. Azda jediný problém by to teoreticky mohlo mať s <a href="http://stackoverflow.com/questions/11616630/json-stringify-avoid-typeerror-converting-circular-structure-to-json" target="_blank">cyklickými štruktúrami, ale aj to sa dá čiastočne riešiť</a>.</p>
<h2>Kedy to nefunguje?</h2>
<p>Niekedy sa stáva, že sa ponáhľate a všetko vyzerá veľmi nádejne. Avšak práve vtedy sa niečo pokazí. V tomto prípade to pravdepodobne bude súvisieť s nasledujúcim kódom:</p>
<pre class="brush: jscript; title: ; notranslate">
a = { key: &quot;value&quot; };
b = a;
c = b;
a = { another_key: &quot;value2&quot; } // Nastavíme a na inú hodnotu
console.log(a); // { another_key: &quot;value2&quot;}
console.log(b); // { key: value }
console.log(c); // { key: value }
</pre>
<p>Či už sa pokúsite a zresetovať  ( <code>a = {};</code> ), alebo priradiť úplne inú hodnotu ( <code>a = other_value;</code> ), ocitnete sa v rovnakej situácií. Popíšme si prečo.</p>
<p>Na začiatku priradíme do <code>a</code> hodnotu, následne vytvoríme <code>b</code>, ktoré bude ukazovať na <code>a</code>, a potom vytvoríme <code>c</code>, ktoré bude ukazovať na <code>b</code>. Nie tak úplne. To, čo sa skutočne stane je, že <code>b</code> a <code>c</code> budú odkazovať <strong>na rovnakú pamäť</strong> ako <code>a</code>, <strong>nie na premennú</strong> <code>a</code>. Následne ale, vytvoríme novú pamäť s inou adresou (adresa je označenie nejakej konkrétnej časti pamäte), ktorú priradíme do <code>a</code>. A keďže <code>b</code> a <code>c</code>, neodkazujú na premennú <code>a</code> ale na tú adresu, na ktorú kedysi odkazovalo <code>a</code>, ich hodnota sa nezmení. Je to komplikované, preto radšej prikladám obrázok:</p>
<p><a href="http://tominator.comper.sk/wp-content/uploads/javascript_pointers.png"><img class="aligncenter size-full wp-image-268" src="http://tominator.comper.sk/wp-content/uploads/javascript_pointers.png" alt="javascript_pointers" width="600" height="500" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://tominator.comper.sk/2014/06/javascript-a-ukazovatele/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ako vyzerá stránka na mobilných zariadeniach?</title>
		<link>http://tominator.comper.sk/2014/06/ako-vyzera-stranka-na-mobilnych-zariadeniach/</link>
		<comments>http://tominator.comper.sk/2014/06/ako-vyzera-stranka-na-mobilnych-zariadeniach/#comments</comments>
		<pubDate>Tue, 03 Jun 2014 07:00:30 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://tominator.comper.sk/?p=253</guid>
		<description><![CDATA[Či už robíte stránky špeciálne pre mobily, alebo vytvárate responzívny dizajn (ktorý sa prispôsobí zariadeniu) narazíte na problém, že vlastne neviete, ako to bude na koncom zariadení vyzerať. Ja mám napríklad iba iPhone 4 a nemám tablet. Ako sa môžem usitiť, že moja stránka vyzerá dobre na Samsung Galaxy S4, iPhone 5s alebo novom iPade? Tento [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Či už robíte stránky špeciálne pre mobily, alebo vytvárate responzívny dizajn (ktorý sa prispôsobí zariadeniu) narazíte na problém, že vlastne neviete, ako to bude na koncom zariadení vyzerať. Ja mám napríklad iba iPhone 4 a nemám tablet. Ako sa môžem usitiť, že moja stránka vyzerá dobre na Samsung Galaxy S4, iPhone 5s alebo novom iPade? Tento jednoduchý tip vám prezradí, ako nato.</p>
<h2>Google Chrome &#8211; nástroje pre vývojára</h2>
<p>Možno ste to ani netušili, ale riešenie ste mali celý čas na očiach. Google Chrome totižto dokáže emulovať rôzne zariadenia, rôzne veľkosti displejov, dokonca môžete emulovať aj náklon zariadenia. Všetko to nájdete v Nástrojoch pre vývojára. K nim sa dostanete buď tak, že kliknete pravým tlačidlom myši a zvolíte poslednú možnosť <em>&#8220;Preskúmať prvok&#8221;</em>, alebo cez<em> Nastavenia -&gt;Nástroje -&gt; Nástroje pre vývojárov</em> (Ctrl+Shift+I), moja najobľúbenejšia metóda však je stlačiť <strong>F12</strong>.</p>
<p>V pravom hornom rohu si prosím všimnite tri ikonky, zprava &#8211; Pripnúť k oknu (to nás veľmi nezaujíma), Nastavenia a  nakoniec<strong> &#8220;Enable drawer&#8221;</strong>. Po kliknutí na túto nič nehovoriacu poslednú ikonku (prvú zľava), sa vám dole objaví nový panel. Zvoľte kartu <strong>&#8220;Emulation&#8221;</strong>, vyberte si zariadenie a kliknite na &#8220;<strong>Emulate&#8221;</strong>. Odporúčam ešte refreshnúť stránku, aby sa poslali aj správne hlavičky na server (a teda server zaslal verziu pre dané zariadenie). A to je všetko, verím, že tento krátky tip vám ušetrí veľa času a hlavne peňazí.</p>
<p><a href="http://tominator.comper.sk/wp-content/uploads/chrome_tip.png"><img class="aligncenter size-large wp-image-254" src="http://tominator.comper.sk/wp-content/uploads/chrome_tip-1024x552.png" alt="Chrome Tip" width="650" height="350" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://tominator.comper.sk/2014/06/ako-vyzera-stranka-na-mobilnych-zariadeniach/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kraken.js a Socket.IO</title>
		<link>http://tominator.comper.sk/2014/06/kraken-js-a-socket-io/</link>
		<comments>http://tominator.comper.sk/2014/06/kraken-js-a-socket-io/#comments</comments>
		<pubDate>Mon, 02 Jun 2014 09:22:02 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://tominator.comper.sk/?p=230</guid>
		<description><![CDATA[UPDATE [SK]: Tento blog platí pre verziu Krakana 0.7.3. Môže byť užitočný aj pre ďalšie verzie, avšak odporúčam prečítať odpoveď v tomto issue. UPDATE[EN]: This blogpost is based on Kraken 0.7.3. If you are using version higher than that, you might still find it usefull, but I recommend to follow this asnwer. V predchádzajúcom blogu som [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><strong>UPDATE [SK]:</strong> Tento blog platí pre verziu Krakana 0.7.3. Môže byť užitočný aj pre ďalšie verzie, avšak odporúčam prečítať <a href="https://github.com/krakenjs/kraken-js/issues/213#issuecomment-44869430" target="_blank">odpoveď v tomto issue</a>.<br />
<strong>UPDATE[EN]:</strong> This blogpost is based on Kraken 0.7.3. If you are using version higher than that, you might still find it usefull, but I recommend to<a href="https://github.com/krakenjs/kraken-js/issues/213#issuecomment-44869430" target="_blank"> follow this asnwer</a>.</p>
<p>V predchádzajúcom blogu som písal o svojej voľbe frameworku a o problémoch, ktoré ma postretli pri používaní Kraken.js. V tomto blogu by som rád dal návod, ako vyriešiť jeden z nich &#8211; prepojiť Kraken.js so Socket.IO. Tento problém som riešil zhruba týždeň voľným tempom (keďže mám skúškové). V prvom rade, čo je to Socket.IO?</p>
<h2>Socket.IO</h2>
<p>Socket.IO je knižnica, ktorá umožňuje komunikáciu clienta so serverom pomocou websocketov. Ak nie je možné použiť websockety, pokúsi sa celú komunikáciu presúvať na kanál, ktoré obe strany podporujú, čím zaručuje, že ak ste pripojený, správy dorazia. V dobe písania tohto blogu akurát vyšla verzia 1.0, takže celé riešenie bude už pre verziu 1.0. Na úspešnú komunikáciu potrebujete ako knižnicu Socket.IO pre klienta tak pre Node.js server. Princíp fungovania spočíva v tom, že na serveri vytvoríte websocket server, ktorý bude načúvať a posielať správy a na clientovi vytvoríte prostredie, ktoré  bude tiež načúvať a posielať správy. Avšak rád by som zdôraznil dva fakty. Websocket server rieši požiadavky sám a teda aj keď pošlete svoje správy v tvare URL (/person/get/17), váš Node.js server ich nebude analyzovať. Druhým faktom je, že Socket.IO ponúka len samotnú komunikáciu, s kým však komunikujete, musíte zistiť vy. Ako?  Aj o tomto je tento blog.</p>
<h2>Zdroje</h2>
<p>Zdrojov na túto tému je veľmi málo. Takže uvediem z čoho som čerpal a kam ma to až dostalo. Celý týždeň v kocke. Uvádzam to pre prípad, keby niekto používal iný framework, chcel si prečítať diskusie alebo mal pocit, že moje riešenie nie je ideálne (v tokom prípade treba určite zanechať komentár). A uvádzam tiež len to, čo považujem za kvalitné, teda nie všetko, čo som musel prečítať. Celý príbeh začína na <a href="https://github.com/krakenjs/kraken-js/issues/39">Issue #39</a>. Zdá sa to celkom jednoduché, takto vytvoríte server. Ako ale zistiť s kým hovoríte? Je to platný request? Je ten človek prihlásený? Tak na vyriešenie tohto problému odporúčam <a href="http://www.danielbaulig.de/socket-ioexpress/" target="_blank">tento blogpost</a>. Problém na ktorý tiež narazíte je, že kým Issue je pre Socket 0.9, tak riešenie je pre Express 2 (čiže nie pre Kraken, ktorý mimochodom beží na Express 3).</p>
<h2>Server</h2>
<p>V prvom rade je potrebné nainštalovať Socket.IO modul:</p>
<pre class="brush: xml; title: ; notranslate">
npm install --save socket.io
</pre>
<p>V druhom kroku upravíme index.js (nakoľko používam CoffeeScript, svoje riešenie uvádzam v CoffeeScripte). V úvode načítame knižnicu. Následne po vytvorení aplikácie previažeme Kraken so Socketmi, ako sme videli v Issue.</p>
<p><strong>/index.coffee (index.js)<br />
</strong></p>
<pre class="brush: jscript; title: ; notranslate">
'use strict';

require 'coffee-script/register'

## Loading Socket.IO
## Making this global so it will be accessible from controller
global.io = new ( require 'socket.io' )

kraken = require 'kraken-js'
db = require './lib/database'
app = {}

...

if require.main == module

	kraken.create(app).listen (err, server)-&gt;

		console.error err.stack if err

		io.attach server    # Connecting to Krakenom

module.exports = app
</pre>
<p>Hotovo. Teda aspoň zdanlivo. Prichádza ťažšia časť &#8211; zistiť s kým komunikujeme. To prebieha nejako takto: Socket pošle svoje Cookies a s nimi aj session_id. Socket.IO overí, či sú platné a v prípad, že vyzerajú dobre, pozrie sa do už vytvorených sessions, či tam má session s daným ID. Session je relácia medzi užívateľom a serverom, ktorá si uchovávate informácie o užívateľovi (či je prihlásený, aké ma ID, alebo čo má v košíku). Zaniká zatvorením prehliadača, ale viete ju vypnúť (prípadne zmeniť) manuálne. PHP a Apache sa o to staralo samé na pozadí, s tým, že vždy bola dostupná premenná $_SESSION. V Krakenovi to nie je také jednoduché. <del>Popravde získať aktuálne databázu aktuálnych sessions je aj pre mňa problém, preto som vytvoril<a href="https://github.com/krakenjs/kraken-js/issues/213" target="_blank"> tento Issue</a>. Dokým dostanem nejakú rozumnú odpoveď od autorov, musíme použiť malý hack:</del></p>
<p><strong>Update</strong>: Odpoveď som dostal, ale pre novšiu verziu Krakena, takže si myslím, že hack je stále na mieste:</p>
<p><strong>/node_modules/kraken-js/lib/middleware/session.js<br />
</strong></p>
<pre class="brush: jscript; title: ; notranslate">
module.exports = function (settings) {
    var override, Store;

    override = util.tryRequire(settings &amp;&amp; settings.module);
    if (override) {
        Store = override(express);
        settings.store = new Store(settings.config);

        global.sessionStore = settings.store; // This is our hack
    }

    return express.session(settings);
};
</pre>
<p><strong> </strong>Teraz keď už máme v globálnej premennej zoznam všetkých sessions, stačí znovu upraviť index.js a pridať nejaký middleware, ktorý sa o to postará:</p>
<p><strong>/index.coffee (index.js)</strong></p>
<pre class="brush: jscript; title: ; notranslate">
app.configure = (nconf, next)-&gt;

    # Configure sockets

    io.use (socket, next)-&gt;

        return next(&quot;No cookie transmitted.&quot;, false) if ! socket.handshake.headers.cookie

        # Parse cookies and find our session_id

        session_id = require('express/node_modules/cookie').parse socket.handshake.headers.cookie
        session_id = require('express/node_modules/cookie-signature').unsign session_id['connect.sid'].substring(2), nconf.get(&quot;middleware&quot;).session.secret

        return next( 'Unknown cookie.', false ) if ! session_id

        # Find session_id in sessionStore

        global.sessionStore.load session_id, (err, session) -&gt;

            next( 'Not valid session.', false ) if err or ! session

            ## Save session to socket, that way we can access user data later using socket.session
            socket.session = session

            next null, true

    next()
</pre>
<p>V poslednom rade, ešte musíme nastaviť secret. Secret je kód pomocou ktorého sa naše cookies &#8220;šifrujú&#8221;. A práve v 14 riadku sme to kontrolovali.<br />
<strong>/config/middleware.json<br />
</strong></p>
<pre class="brush: jscript; title: ; notranslate">
{
    &quot;middleware&quot;: {
        &quot;session&quot;: {
            &quot;module&quot;: &quot;memory&quot;,
            &quot;secret&quot;: &quot;35cb2890c5560878c7199d88b92457776b7ecd9e&quot; // Change this
        }
    }
}
// Source: https://github.com/lmarkus/Kraken_Example_Shopping_Cart/blob/master/config/middleware.json
</pre>
<p>Náš server je už pripravený, k dokonalosti nám ešte chýba nejaká tá samotná komunikácia:</p>
<pre class="brush: jscript; title: ; notranslate">
'use strict';

module.exports = ( io )-&gt;

    io.on 'connection', ( socket )-&gt;		

        socket.emit 'hello'

        socket.on 'foo', ()-&gt;
            return 'foobar'
</pre>
<h2>Klient</h2>
<p>To najťažšie je už za nami, teraz si zlížeme smotanu vytvorím klienta. V prvom rade stiahnite socket.io pre klienta alebo použite cdn:</p>
<pre class="brush: xml; title: ; notranslate">&lt;script type=&quot;text/javascript&quot; src=&quot;https://cdn.socket.io/socket.io-1.0.2.js&quot;&gt;&lt;/script&gt;</pre>
<p>Teraz už len stačí vytvoriť napísať pár riadkov:</p>
<pre class="brush: jscript; title: ; notranslate">
socket = io 'http://localhost:1339' # Change your port to match your server!

socket.on 'connect', ()-&gt;

    console.log 'Websockets established and running!'

socket.on 'hello', ()-&gt;

    console.log 'Hello sir!'
</pre>
<h2>Hotovo</h2>
<p>Pokiaľ ste všetko spravili správne, mali by ste po pripojení na server vidieť v konzole &#8216;Hello sir!&#8217;. Tento návod rieši problematiku prepojenia Socket.IO a Kraken.js, overenie platnosti cookies a načítanie session. Priestor na zlepšenie vidím ešte v tom, aby sa Sockety mapovali na Routing v Krakenovi. Čiže, aby sa dali zo socketu rovno volať controllery. Keď niekto budete mať hotové toto riešenie, určite sa oň podeľte. Tak isto všetky námety, ako zlepšiť kvalitu tohto riešenia rád uvítam v diskusií. Dúfam, že som nejednému z vás uľahčil život a možno aj vyjasnil, ako niektoré moduly fungujú.</p>
]]></content:encoded>
			<wfw:commentRss>http://tominator.comper.sk/2014/06/kraken-js-a-socket-io/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Začíname s Node.js: Voľba Frameworku</title>
		<link>http://tominator.comper.sk/2014/06/zaciname-s-node-js-volba-frameworku/</link>
		<comments>http://tominator.comper.sk/2014/06/zaciname-s-node-js-volba-frameworku/#comments</comments>
		<pubDate>Sun, 01 Jun 2014 12:10:45 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://tominator.comper.sk/?p=223</guid>
		<description><![CDATA[Keď už raz viete celkom obstojne programovať v nejakom jazyku, po prechode na iný jazyk &#8220;vyžadujete&#8221; aspoň podobný komfort. Dlho som vyvíjal v PHP. Používal som CodeIgniter s ORM. Keď som začal pracovať s Node, hľadal som niečo podobné. Nemal som čas a ani chuť si to písať sám &#8211; radšej som sa pozrel nato, čo [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Keď už raz viete celkom obstojne programovať v nejakom jazyku, po prechode na iný jazyk &#8220;vyžadujete&#8221; aspoň podobný komfort. Dlho som vyvíjal v PHP. Používal som CodeIgniter s ORM. Keď som začal pracovať s Node, hľadal som niečo podobné. Nemal som čas a ani chuť si to písať sám &#8211; radšej som sa pozrel nato, čo ponúkajú ostatní &#8211; tí, čo robia v Node dlhšie.</p>
<h2>Express.js</h2>
<p>Express je snáď základný pilier celého vývoja webu v Node. Je to minimalistický framework a myslím, že nebudem preháňať ak poviem, že najpoužívanejší. Rozhodne odporúčam prečítať základy, porozumieť, ako funguje, pretože na ňom stavajú ďalšie frameworky. A práve tie ďalšie frameworky sú zaujímavé.</p>
<h2>Sails.js</h2>
<p>Sails.js vychádza z Expressu a bol to môj výber číslo jedna. Bol som z neho nadšený, pretože mal ORM, mal štruktúru priečinkov, tým, že od základu podporoval CRUD som vedel veľmi rýchlo vytvárať nové modely/controllery a naplniť ich dátami a v neposlednom rade sa mi páčila práca so socketami. Časom som však narážal na problém nedostatočnej alebo neexistujúcej dokumentácie. Sails využíva vlastné ORM &#8211; Waterline, ale nevedel som nikde nájsť ako do neho vložiť podobjekty, takže som ho musel prestať využívať a moje dáta teda pri ukladaní neboli validované. Ďalej som narazil na problém so socketmi &#8211; hoc sú v Sails zapracované vynikajúco, kým sa ich naučíte používať bude to stáť veľa snaženia a skúšania, hľadania a čítania. Mojím ďalším problémom bolo debugovanie. Vypisovať si všetko do konzoly, nepatrí medzi tie najlepšie spôsoby debugovania, ale dá sa to zvládnuť, dokým nepotrebujete analyzovať väčšie výpisy &#8211; veľké štruktúry. Keď sa to stane, opýtate sa &#8211; nejde to lepšie? Samozrejme, že ide! Ale nie so Sails. Hovorím konkrétne o riešení node-inspector, ktoré som ani napriek zisťovaniu čísel portov nemohol spojazdniť. Takže problémy sa nahromadili a ja som si povedal, že kým Sails sa mi páči, potrebuje nejaký čas, aby sa dopísala dokumentácia a vyriešili problémy. Dovtedy využijem iný framework.</p>
<h2>Kraken.js</h2>
<p>Prešiel som na Kraken. Kraken vytvoril tím, pracujúci v PayPal (alebo eBay). Povedal som si, že títo páni potrebujú stabilné, bezpečné a rýchle prostredie pre tvorenie aplikácií, rovnako ako ja, a majú prostriedky na jeho vytvorenie, tak prečo to nevyužiť? V prvom rade Kraken sa miestami nazýva frameworkom ale miestami prizná farbu &#8211; že on vlastne tak úplne framework nie je, je to trošku vylepšený Express. Kraken sa mi tiež zapáčil. Vyriešil problémy, ktoré som mal so Sails. Mongoose aj napriek tomu, že ocenenie za najlepšiu dokumentáciu nezíska, je dostatočne intuitívny. Moje dáta konečne boli 100% validované. Tak isto som (aspoň pocitovo) získal väčší priestor pre testovanie (rozumej unit testy, automatizované testy). Mal som spočiatku problém, ako otestovať jednotlivé modely, ale netrvalo dlho a vyriešil som ho (návod hodím najbližšie). Nakoniec, a čo ma veľmi potešilo bola možnosť konečne využiť node-inspector, takže konečne som mohol začať dobre debugovať. Po čase som však začal narážať aj na tienisté stránky. Kraken je dosť nízko položený, chcem tým povedať, že poskytuje základ, a keď chcete niečo naviac, tak si to musíte dorobiť sami. Sails podporoval písanie zdrojakov v CoffeeScripte. Kraken nie. Sails aj napriek biednej dokumentácií mal vynikajúcu podporu pre Socket.IO. Kraken nie, popravde, nenájdete o tom veľa návodov &#8211; ak vôbec nejaký a rozbehať to je naozaj problém. Všetky tieto veci minimálne spomaľujú vývoj, ale je to cena, ktorú treba zaplatiť za používanie Krakenu. Zatiaľ pri ňom ostávam a v ďalších blogoch sa budem venovať riešeniu týchto problémov.</p>
<h2>Zhrnutie</h2>
<p>V tomto krátkom blogposte, som sa zameral na Sails.js a Kraken.js. Bolo by nefér rozoberať iné frameworky &#8211; nemám s nimi skúsenosti, stručne som si nimi prešiel, keď som hľadal ideálny.</p>
<p>Zoznam väčšiny Node.js frameworkov: <a href="http://nodeframework.com/" target="_blank">http://nodeframework.com/</a></p>
<p>Express.js: <a href="http://expressjs.com/" target="_blank">http://expressjs.com/</a><br />
Sails.js: <a href="http://sailsjs.org/" target="_blank">http://sailsjs.org/</a><br />
Kraken.js: <a href="http://krakenjs.com/" target="_blank">http://krakenjs.com/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tominator.comper.sk/2014/06/zaciname-s-node-js-volba-frameworku/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pokračujem</title>
		<link>http://tominator.comper.sk/2014/05/pokracujem/</link>
		<comments>http://tominator.comper.sk/2014/05/pokracujem/#comments</comments>
		<pubDate>Sat, 24 May 2014 22:45:35 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Vývoj hry]]></category>

		<guid isPermaLink="false">http://tominator.comper.sk/?p=217</guid>
		<description><![CDATA[Keď som písal úvodný článok, hra bola ešte v plienkach. Bolo to niekoľko mesiacov premýšľania a stál som pred obrovskou výzvou spraviť to. Začal som a hneď v prvom týždni som zistil, že som začal nesprávne. Pripravujem webovú hru. Je to celkom logická voľba &#8211; dlhé roky pracujem s webom. Mám nejaké skúsenosti s C [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Keď som písal úvodný článok, hra bola ešte v plienkach. Bolo to niekoľko mesiacov premýšľania a stál som pred obrovskou výzvou spraviť to. Začal som a hneď v prvom týždni som zistil, že som začal nesprávne. Pripravujem webovú hru. Je to celkom logická voľba &#8211; dlhé roky pracujem s webom. Mám nejaké skúsenosti s C a C++ ale hru by som si v nich robiť netrúfal. Ja nechcem spraviť projekt pri ktorom sa učím tvoriť hry, alebo jazyk. Áno bude to vedľajší produkt, ale v prvom rade mám nápad na úžasnú hru a chcem ho zrealizovať. Chcem ho predať masám. Spočiatku som chcel hru robiť v PHP a MySQL (server) a v JavaScripte klienta, pretože to je niečo, v čom som naozaj dobrý a robím v tom dlhé roky. Lenže, ako som už písal, po krátkom rozhovore na vysokej škole som zistil, že toto asi nie je správny smer. Facebook, Twitter, Google, PayPal, eBay &#8211; skutočne obrovské stránky totižto používajú ako databázu NoSQL nie MySQL, prečo? Čo je to NoSQL? To určite priblížim v niektorom z ďalších blogpostov, ale zatiaľ stačí vedieť, že je to iný prístup k ukladaniu dát. A dostávame sa k problému: PHP nie je na NoSQL pripravené. Aspoň podľa mňa. Problémom sú frameworky a materiály, ktoré nie sú. Rozhodol som sa, že miesto PHP použijem Node.js a ako NoSQL databázu použijem MongoDB.</p>
<p>S Node.js som predtým nepracoval. Áno, je to JavaScript, s ktorým pracujem už roky, ale aj napriek tomu, sú tu isté odlišnosti. Akým smerom budem ďalej blogovať? V prvom rade by som chcel hovoriť o svojej hre, ako postupuje vývoj, ale na druhej strane Node.js je nová technológia, každý týždeň prekonám nejaký problém, ktorý môže trápiť iných vývojárov a rád by som hovoril aj o tejto &#8211; technickej stránke projektu. To je zatiaľ všetko, v najbližšom čase budú vychádzať nové blogy, dúfam, že to bude zaujímavé čítanie.</p>
]]></content:encoded>
			<wfw:commentRss>http://tominator.comper.sk/2014/05/pokracujem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Začíname. Znovu</title>
		<link>http://tominator.comper.sk/2013/11/zaciname-znovu/</link>
		<comments>http://tominator.comper.sk/2013/11/zaciname-znovu/#comments</comments>
		<pubDate>Mon, 11 Nov 2013 15:15:35 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Vývoj hry]]></category>

		<guid isPermaLink="false">http://tominator.comper.sk/?p=191</guid>
		<description><![CDATA[Založil som novú kategóriu &#8211; Tvorba hry, pretože hru tvorím a chcel sa podeliť o všetky faily, ktoré počas toho prežívam. Nápad vytvoriť hru ma chytil už na strednej škole, vtedy som si však ešte nevedel predstaviť realizáciu. V prvom ročníku na vysokej som začal veľmi tuho premýšľať o inej hre. &#8220;Nápad&#8221; môjho spolubývajúceho, ktorý [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Založil som novú kategóriu &#8211; Tvorba hry, pretože hru tvorím a chcel sa podeliť o všetky faily, ktoré počas toho prežívam. Nápad vytvoriť hru ma chytil už na strednej škole, vtedy som si však ešte nevedel predstaviť realizáciu. V prvom ročníku na vysokej som začal veľmi tuho premýšľať o inej hre. &#8220;Nápad&#8221; môjho spolubývajúceho, ktorý raz poznamenal &#8211; takáto hra tu nie je a rád by som ju hral. Uvedomil som si, že ja ju nielen viem vytvoriť, ale hneď ma napadala hromada možností, ako ju vylepšiť. Keď som o nej hovoril svojím kamarátom, páčila sa im (a aj mne!). Začal som teda zháňať tím. Problém je, že v svojom okolí poznám veľmi málo programátorov, ktorím verím a majú zručnosti a čas na vybudovanie takejto hry. Podarilo sa mi ale získať dvoch úplne úžasných grafikov (aby som bol presný úžasnú grafičku a úžasného grafika) a bolo to práve v čase, keď na škole začali visieť plagáty na súťaž o investíciu. Vytvárali sme podklady, aby bolo čo prezentovať a zistili sme, že sme prešvihli termín na registráciu o 10 dní. A tu nastal koniec. Rozmýšľal som, ako pokračovať (do tých investícií som vložil veľa nádeje), keď som si uvedomil, že ten nápad je zlý. Po polroku. Sedel som s kamarátom na pive a dostal som otázku &#8211; koľko si do hry ochotný investovať ty sám? A uvedomil som si, že keď do nej nie som ochotný investovať peniaze ja, tak prečo by mal investor?</p>
<h1>Začíname znovu</h1>
<p>Nuž po krátkej depresívnej chvíľke som si opäť spomenul na hru zo strednej školy. Vtedy som ju nevedel vytvoriť, ale dnes už áno. A keď som do nej domiešal nápady zo zrušeného projektu, dostal som obraz skvelej hry! Nie len skvelej, ale tak úžasnej, že možno zmení celý priemysel (treba trošku preháňať :)). Je to hra, ktorú ťažko popísať slovami: &#8220;Je to ako &#8230; ale inak&#8221;. A tak som opäť zašiel za kamarátmi a predstavil im novú hru (veľmi si týchto ľudí vážim a som im vďačný, že počúvajú všetky moje nápady). A tento nápad sa páčil každému. Začalo nové kolo plánovania &#8211; aké technológie, aké herné mechanizmy, aké funkcie, ako vyťažiť z nápadu čo najviac, čo sa bude robiť prvé, ako znížiť riziko neúspechu, ako to predávať. Proste veľa veľa premýšľania. Až som si povedal dosť &#8211; treba začať.</p>
<h1>Done is better than perfect &#8211; alebo nie?</h1>
<p>Keď vytvárate nejaký nový projekt, mali by ste sa týmto mottom riadiť. To, čo potrebujete, je čo najskôr uviesť produkt na trh. Nemusí byť dokonalý. Čím dlhšie ho totiž vyvíjate, tým je drahší, a čím neskôr ho uvediete na trh, tým väčšia to bude škoda, ak neuspeje. Okrem toho, keď sa snažíte o perfekcionizmus a necháte svoju bujnú fantáziu premýšľať o všetkých cool featurach, dostanete sa do večného kruhu, kde vkuse prerábate svoju prácu a nikdy nič na trh neuvediete, lebo to ešte nie je hotové/dokonalé. Nespočetne veľa projektov pohorelo práve na tom, že toľko nových a zbytočných funkcií implementovali, že sa nakoniec na míle vzdialili od pôvodného plánu a po niekoľkých rokoch vývoja vlastne nič nemali.</p>
<p>Oveľa lepší prístup je najskôr si celý nápad premyslieť, potom si napísať, čo sa bude kedy implementovať a držať sa toho. A že to nie je dokonalé? Nevadí! Keď to vypustíte na trh, a ukáže sa, že o váš produkt je záujem, dostane finančné prostriedky, ktoré vám umožnia ho vyšperkovať. Cieľom je, čo najskôr vypustiť verziu, ktorá sa môže predávať (aby ste vedeli, či o produkt vôbec je záujem).</p>
<p>Na druhej strane, čím neskôr sa na chybu príde, tým viac stojí jej oprava. A hoc je motto Done is better than perfect super, keby som sa ho slepo držal stálo by ma to veľa peňazí, takže som musel na chvíľu zvoliť iné start-up motto.</p>
<h1>Adapt or die</h1>
<p>Čas. Keď robíte hru snažíte sa ju urobiť rýchlu &#8211; nikto predsa nemá rád hry, ktoré sekajú, chcete hrať, nie čakať. A síce v trošku inej podobe, ale aj som tomuto problému čelil. Ako informovať hráča o zmene? Nakoľko posielanie správ by som outsourcoval, za každú správu by som platil. Príliš časté posielanie by spôsobovalo obrovskú záťaž na server a generovalo by veľa správ. Príliš pomalé posielanie by mohlo miestami spôsobovať hráčove nepohodlie. Treba optimalizovať. Prvé plány hovorili, že odkedy sa niečo stane (alebo malo by sa stať) až dokým sa to hráč dozvie prejdú max. 4 sekundy. Stačilo hráča informovať, že vec sa vykoná o nejaký čas + 4 sekundy, a nič by si nevšimol. Ale, prečo to nerobiť rýchlejšie? Uvedomil som si, že aj napriek tomu, že staviam na technológiách, ktoré používam roky, s optimalizovaním pre veľkú záťaž vážne nemám skúsenosti. Takže som začal hľadať spôsoby, ako čas skrátiť a podarilo sa mi ho skrátiť na 2 sekundy. Samozrejme vedel by som ho ešte skrátiť, ale 2 sek, by mali byť stabilné (nebola by to enormná záťaž na server). A tiež som vymyslel spôsob ako poslať o nekonečne mnoho správ menej, ale prinášalo to bezpečnostné otázky. Stále to nestačilo. Ak je možnosť ako to posielať rýchlejšie a efektívnejšie, chcem to vedieť už teraz. A keďže som ešte stále na vysokej škole, prečo to nevyužiť? Zhodou okolností mám v tomto semestri príbuzný predmet, takže som sa šiel spýtať o nejaké cenné rady. Nuž dostal som viac, než som čakal. Po týždni tvorenia základných pilierov hry, som si po troch vetách cvičiaceho uvedomil, že asi nepoužívam ideálnu technológiu. Ale to je predsa technológia, ktorú dobre poznám a dlho používam! Adapt or die.</p>
<h1>Začíname znovu</h1>
<p>Po veľmi rýchlom zoznamovaní sa s novou technológiou, som zistil, že by bolo lepšie ešte zmeniť aj všetky ostatné doteraz používané technológie. Neostal kameň na kameni a celú svoju doterajšiu prácu som mohol rovno zahodiť. Teraz je týždeň druhý od momentu, čo som začal hru vyvíjať. Staviam ju na technológií, ktorú poznám 4 dni. Možno to znie divne, ale boli to dni strávené čítaním dokumentácií, pozeraním online seminárov a nakoniec tá technológia nevyšla úplne z holej lúky. Je to niečo, čo s radosťou využívam už dlho, akurát na mieste, kde som to ešte nepoužil. A aké to má výhody? V prvom rade a predovšetkým sa mi podarilo skrátiť čas na niekoľko desiatok milisekúnd. Spolu s tým prestala potreba outsourcovať posielanie správ a teda som ušetril hneď niekoľko tisíc dolárov (teda z pohľadu na budúcnosť samozrejme). Rovnako nová technológia by mala byť aj menej náročná na výpočtový výkon, takže som ušetril aj na serveroch. Samé plusy <img src="http://tominator.comper.sk/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p>Končí druhý týždeň, opäť programujem základné mechanizmy a aj napriek tomu, že škola si vyžaduje veľa času veľmi sa teším na ďalší vývoj.</p>
]]></content:encoded>
			<wfw:commentRss>http://tominator.comper.sk/2013/11/zaciname-znovu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ako vyexportovať LESS do CSS</title>
		<link>http://tominator.comper.sk/2012/06/ako-vyexportovat-less-do-css/</link>
		<comments>http://tominator.comper.sk/2012/06/ako-vyexportovat-less-do-css/#comments</comments>
		<pubDate>Wed, 27 Jun 2012 09:11:29 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://tominator.comper.sk/?p=180</guid>
		<description><![CDATA[V predchádzajúcom článku som písal o LESS. V skratke je to rozšírené CSS o funkcie, premenné a dedičnosť, ale má jednu drobnú chybičku krásy. Užívateľ najskôr uvidí vašu stránku rozhodenú až ho momentu, kým JavaScript nesparsuje LESS. To pri väčších projektoch môže zabrať nejakú chvíľku a preto je dobré, keď vypúšťate projekt do sveta vyexportovať [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>V predchádzajúcom článku som písal o LESS. V skratke je to rozšírené CSS o funkcie, premenné a dedičnosť, ale má jednu drobnú chybičku krásy. Užívateľ najskôr uvidí vašu stránku rozhodenú až ho momentu, kým JavaScript nesparsuje LESS. To pri väčších projektoch môže zabrať nejakú chvíľku a preto je dobré, keď vypúšťate projekt do sveta vyexportovať LESS do CSS. Otázka znie &#8211; ako?</p>
<h2>Update &#8211; 18.1.2014</h2>
<p>Nie dlho potom, čo som tento článok publikoval som narazil na dva oveľa elegantnejšie spôsoby.</p>
<ol>
<li><a href="http://alphapixels.com/prepros/" target="_blank">Prepos App</a> &#8211; vynikajúca malá aplikácia, ktorá kompiluje ako LESS, tak aj Coffeescript a hromadu ďalších. Vynikajúca voľba.</li>
<li>Skrz node.js &#8211; pracnejšia verzia, kde najskôr potrebujete nainštalovať node.js a cez NPM nainštalovať LESS plugin. V ďalšom kroku odporúčam nainštalovať si rozšírenie rovno do editora. Viac informácií nájdete priamo na stránkach LESS.</li>
</ol>
<h2><del>1. Aplikácie</del></h2>
<p><del>Prvým riešením je použiť nejakú aplikáciu, ktorá to spraví za nás. Na internete som narazil na dve, veľmi zaujímavé aplikácie.</del></p>
<p><del><a href="http://incident57.com/less/">Code</a><strong><a href="http://incident57.com/less/">Kit</a> </strong>- Je to aplikácia určená pre Mac OS X, vyzerá celkom slušne a ľudia si ju pochvaľujú</del><br />
<del> <a href="http://wearekiss.com/simpless">SimpLESS</a> &#8211; Druhá aplikácia je per všetky platformy a má  roztomilý interface</del></p>
<p><del>Osobne som skúšal SimpLESS. Prostredie sa mi páčilo, bolo to celkom jednoduché ale mal som problém sparsovať Bootstrap. Vždy mi to hádzalo nejaké chyby, hoc v prehliadači mi to pekne fungovalo.</del></p>
<h2><del>2. Webové stránky</del></h2>
<p><del>Počas môjho Googlenia som narazil na stránku <a href="http://leafo.net/lessphp/lessify/">Lessify</a>, ktorá pomocou PHP skompiluje  LESS. Bohužiaľ ani v tomto prípade som sa nedočkal žiadaného výsledku. Tu by mohla znieť rada, aby ste si sami prebehli Google, ale podľa mňa je to úplne zbytočné, existuje jedna úžasné ľahká cesta.</del></p>
<h2><del>3. Google Chrome</del></h2>
<p><del>Google Chrome v tomto prípade poskytuje jednu nehorázne dobrú featurku. Pointa je totiž v tom, že prehliadač predsa niekde musí mať uložený skompilovanú verziu súboru. A to miesto je <strong>Local Storage</strong>. Takže ako nato?</del></p>
<ol>
<li><del>Otvorte si svoju stránku s LESS</del></li>
<li><del>Kliknite na ňu pravým tlačítkom myši a zvoľte &#8220;Preskúmať prvok&#8221;</del></li>
<li><del>Prepnite sa do druhej karty &#8211; &#8220;Resources&#8221;</del></li>
<li><del>Z ponuky napravo rozbaľte &#8220;Local Storage&#8221; (ja tam mám ešte položku Localhost)</del></li>
<li><del>Vidíte páry &#8211; Key &#8211; Value, nájdite ten svoj, a skopírujte pole Value do nového súboru</del></li>
<li><del>Skontrolujte si linky na obrázky (pozadí), na fonty a podobne</del></li>
<li><del>Uložte súbor</del></li>
</ol>
<p><del>Je to jednoduchá procedúra, nevyžaduje žiadne špeciálne programy a máte istotu, že to čo vidíte, aj dostanete.</del></p>
<h2>Záver</h2>
<p>Trošku kratší príspevok, ale verím, že nápomocný.</p>
]]></content:encoded>
			<wfw:commentRss>http://tominator.comper.sk/2012/06/ako-vyexportovat-less-do-css/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS vs. JS animácie</title>
		<link>http://tominator.comper.sk/2012/05/css-vs-js-animacie/</link>
		<comments>http://tominator.comper.sk/2012/05/css-vs-js-animacie/#comments</comments>
		<pubDate>Sat, 12 May 2012 16:49:31 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://tominator.comper.sk/?p=162</guid>
		<description><![CDATA[Po 2 týždňoch som sa rozhodol napísať tento príspevok. Teraz počas maturít nemám veľa času na testovanie, ale myslím si, že toto je skutočne zaujímavá téma. Väčšina z nás doteraz pravdepodobne animovala prvky pomocou JavaScriptu. Dnes vieme urobiť jednoduché animácie aj pomocou CSS a v niektorých prípadoch sú mimoriadne efektívne. Ako to funguje? Animácie v [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Po 2 týždňoch som sa rozhodol napísať tento príspevok. Teraz počas maturít nemám veľa času na testovanie, ale myslím si, že toto je skutočne zaujímavá téma. Väčšina z nás doteraz pravdepodobne animovala prvky pomocou JavaScriptu. Dnes vieme urobiť jednoduché animácie aj pomocou CSS a v niektorých prípadoch sú mimoriadne efektívne.</p>
<h2>Ako to funguje?</h2>
<p>Animácie v JavaScripte robím pomocou frameworku jQuery. Je to veľmi jednoduché. Najskôr vyberiete prvok, ktorý chcete animovať, potom poviete čo sa má animovať a nakoniec ako dlho to potrvá. Ukážme si príklad kde budem animovať výšku:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;style&gt; #mydiv { height: 50px; width: 50px; border: 1px solid blue; } &lt;/style&gt;
&lt;div id=&quot;mydiv&quot;&gt;&lt;/div&gt;
&lt;script&gt; $(&quot;#mydiv&quot;).animate({height:&quot;400px&quot;}, 500); &lt;/script&gt;
</pre>
<p><span style="font-family: Consolas, Monaco, monospace; font-size: 12px; line-height: 18px;"><br />
Nakoniec ešte môžeme pridať &#8216;easing&#8217; a teda spôsob prelínania. V základe sú len dva easingy a pre viac je potrebné používať plugin. Teraz skúsim vysvetliť princíp CSS3 animácie. Animácia nastáva pri zmene vlastnosti. Zmena vlastnosti môže nastať buď prejdením myšou ponad objekt, JavaScriptom alebo nejakým iným eventom. Bolo by zaujímavé zisťovať, čo všetko sa dá spraviť. Ukážme si nejaký príklad:</span></p>
<pre class="brush: xml; title: ; notranslate">
&lt;style&gt;
 #mydiv
 {
    -webkit-transition: all 0.3s ease-in-out;
    -moz-transition: all 0.3s ease-in-out;
    -o-transition: all 0.3s ease-in-out;
    -ms-transition: all 0.3s ease-in-out;
    transition: all 0.3s ease-in-out;

    height: 50px;
    width: 50px;
    border: 1px solid blue;
 }

 #mydiv:hover
 {
    height: 100px;
 }
&lt;/style&gt;
&lt;div id=&quot;mydiv&quot;&gt;&lt;/div&gt;
</pre>
<p>Trošku dlhší zápis, avšak výsledok je perfektný. Keď prejdeme myšou ponad objekt spustí sa animácia, pri ktorej sa nám zanimuje výšku. Čo sme ale vlastne napísali? Prvý parameter je vlasnosť, ktorá sa animuje, v predĺženom zápise to je -webkit-transition-property. Ja som dal all a teda všetky vlastnosti, ale mohol som napísať len height. Takto môžete vytvárať rôzne animácie rôznych vlastností (urobíte sekundovú animáciu pre výšku, dvojsekundovú pre šírku).  Pre zápis viacerých vlastností používajte čiarku.</p>
<p>Druhý parameter je dĺžka animácie. Udáva sa v sekundách, záporné hodnoty sú neplatné a defaultná hodnota je 0. Predĺžený zápis je -webkit-transition-duration. Teraz prichádza finta:</p>
<pre class="brush: css; title: ; notranslate">
-webkit-transition-property: height, width;
-webkit-transition-duration: 0.5s, 2s;
</pre>
<p>Tento zápis spôsobí, že výška sa bude animovať pol sekundy a šírka 2 sekundy. Posledný parameter je spôsob animácie. Možnosti sú nasledovné:</p>
<ul>
<li>linear &#8211; rovnomerný pohyb</li>
<li>ease-in &#8211; má zrýchlenie na začiatku</li>
<li>ease-out &#8211; má spomalenie na konci</li>
<li>ease-in-out &#8211; má zrýchlenie na začiatku a spomalenie na konci</li>
<li>cubic-bezier &#8211;  je opísanie pohybu pomocou beziérovej krivky. Odporúčam využívať <a href="http://cubic-bezier.com/">http://cubic-bezier.com</a></li>
</ul>
<h2>Výhody CSS</h2>
<p>Za jednu z najväčších výhod CSS animácie je, že môžete animovať prakticky čokoľvek veľmi jednoducho. To neplatí pri JS animácií. jQuery v základe nedokáže animovať farby. To isté platí aj o tieňoch (a môžete naraziť aj na iné vlastnosti). Takže napísanie animácie mocou CSS je oveľa jednoduchšie. Druhá výhoda je, že si môžete nastaviť svoj vlastný easing. Určite sa to bude dať urobiť v jQuery, ale ešte som sa v tom veľmi nehrabal. Určite to však nebude také jednoduché ako v CSS. Poslednou výhodou je kratší zápis.</p>
<h2>Príklad</h2>
<p>Nakoniec by som chcel ukázať jeden príklad. Podľa mňa je to vynikajúci nápad a vlastne kvôli nemu som sa začal CSS animáciami venovať. Vytváram knižnicu na uploadovanie obrázkov. Ako však dať užívateľovi vedieť, že sa obrázok načítava a pritom nerobiť to štandardným koliečkom? Napadlo ma animovať oranžový &#8220;tieň&#8221;. Naprogramoval som JS riešenie, avšak musím používať externé knižnice na farby (skúšal som aj meniť farbu tieňa) a knižnicu na animovanie tieňa. Tu je ukázaný princíp, je to dosť zjednodušené. Využívam 4 kroky, ale v praxi sa mi viac páči riešenie s 8 krokmi a menším tieňom. Chcem však ukázať na kontrast medzi CSS a JS riešením, preto aj tento príklad využite viac na inšpiráciu než na hotové riešenie.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;style type=&quot;text/css&quot;&gt;

div
{
width: 100px;
height: 100px;
}

&lt;/style&gt;

&lt;div&gt;&lt;/div&gt;

&lt;button id=&quot;btn-1&quot;&gt; Start &lt;/button&gt;
&lt;button id=&quot;btn-2&quot;&gt; Stop &lt;/button&gt;

&lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/jquery.min.js&quot;&gt;&lt;/script&gt;&lt;!-- jQUery --&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://www.bitstorm.org/jquery/shadow-animation/jquery.animate-shadow-min.js&quot;&gt;&lt;/script&gt;&lt;!-- Animovanie tieňa: box-shadow --&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://gsgd.co.uk/sandbox/jquery/easing/jquery.easing.1.3.js&quot;&gt;&lt;/script&gt;&lt;!-- Easing funkcie --&gt;

&lt;script type=&quot;text/javascript&quot;&gt;

    var interval;
    var time = 1000;
    var i = 1;

    $('#btn-1').click( function()
    {
        interval = setInterval( 'animateShadow()', time );
    });

    $('#btn-2').click( function()
    {
        clearInterval( interval );
        $('div').animate( { boxShadow: 'none' }, time*3, 'easeInOutExpo' );
    });

    function animateShadow()
    {
        switch ( i )
         {
            case 1:
                 shadow = '0px -10px 15px';
                 break;
            case 2:
                 shadow = '10px 0 15px';
                 break;
            case 3:
                shadow = '0 10px 15px';
                break;
            case 4:
                shadow = '-10px 0 15px';
                i = 0;
                break;
        }

        shadow += ' #ffa500';
        $('div').animate( { boxShadow: shadow}, time );

        i++;
     }

&lt;/script&gt;
</pre>
<p>Zhruba to isté v CSS verzií vyzerá takto:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;style type=&quot;text/css&quot;&gt;

@-webkit-keyframes slider {
    0% { box-shadow: 0 -10px 15px orange; }
    25% { box-shadow: 10px 0 15px orange; }
    50% { box-shadow: 0px 10px 15px orange; }
    75% { box-shadow: -10px 0 15px orange; }
    100% { box-shadow: 0 -10px 15px orange; }
 }

div
 {
    width : 100px;
    height : 100px;
    margin-left: 100px;
    float: left;
    border: 1px solid green;
 }

.anim
 {
    -webkit-animation: slider 5s infinite normal cubic-bezier(.3,.56,.46,.71);
 }

&lt;/style&gt;

&lt;div id=&quot;id-1&quot;&gt;&lt;/div&gt;

&lt;button id=&quot;btn-1&quot;&gt;Start&lt;/button&gt;
&lt;button id=&quot;btn-2&quot;&gt;Stop&lt;/button&gt;

&lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
    $(&quot;#btn-1&quot;).click( function(){ $(&quot;#id-1&quot;).addClass('anim'); } );
    $(&quot;#btn-2&quot;).click( function(){ $(&quot;#id-1&quot;).removeClass('anim'); } );
&lt;/script&gt;
</pre>
<p>Môžete si všimnúť ešte aj -webkit-keyframes a animácie. Ak by som chcel podporu Mozilly musel by som napísať @-moz-keyframes, pre Operu by to bolo -o- a pre IE -ms-.</p>
<h2>Viac informácií</h2>
<p>Ak vás táto téma zaujala viac informácií nájdete na:</p>
<ul>
<li><a href="http://www.webkit.org/blog/138/css-animation/">http://www.webkit.org/blog/138/css-animation/</a></li>
<li><a href="http://css-tricks.com/snippets/css/webkit-keyframe-animation-syntax/">http://css-tricks.com/snippets/css/webkit-keyframe-animation-syntax/</a></li>
<li><a href="http://css3.bradshawenterprises.com/">http://css3.bradshawenterprises.com/</a></li>
</ul>
<div>Našiel som ešte zbierku zaujímavých predvyrobených animácií, možno sa zíde:</div>
<div><a href="http://daneden.me/animate/">http://daneden.me/animate/</a></div>
<h2>Záver</h2>
<p>Animovanie pomocou CSS3 je podľa mňa veľmi zaujímavá možnosť. Nepodporuje to iba IE (i keď od 10 by mal), ale predstavuje jednoduchší, prehľadnejší a krajší zápis. Pekné na tom je, že animujeme priamo v jazyku v ktorom design vytvárame. Dúfam, že som vám týmto článkom spravil chuť a teším sa opäť o &#8220;týždeň&#8221; (veľmi mi to nevychádza, keďže maturujem).</p>
]]></content:encoded>
			<wfw:commentRss>http://tominator.comper.sk/2012/05/css-vs-js-animacie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
