<?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 &#187; Web</title>
	<atom:link href="http://tominator.comper.sk/category/web/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>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>
		<item>
		<title>Škriatkovia alebo CSS Sprites a LESS</title>
		<link>http://tominator.comper.sk/2012/04/skriatkovia-alebo-css-sprites-a-less/</link>
		<comments>http://tominator.comper.sk/2012/04/skriatkovia-alebo-css-sprites-a-less/#comments</comments>
		<pubDate>Sat, 14 Apr 2012 19:34:26 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://tominator.comper.sk/?p=153</guid>
		<description><![CDATA[Skoro každý týždeň vyriešim nejaký problém. Prečo sa s riešeniami nepodeliť? Rozhodol som sa, že raz za týždeň napíšem nejaký príspevok, s riešením nejakého problému. Každý týždeň naprogramujem/nakreslím nejakú drobnosť, ktorá by pre niekoho (možno teba) mohla byť užitočná. Ak nejaký týždeň s riešením neprídem, tak buď ma nič nenapadlo, alebo som nemal čas spísať [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Skoro každý týždeň vyriešim nejaký problém. Prečo sa s riešeniami nepodeliť? Rozhodol som sa, že raz za týždeň napíšem nejaký príspevok, s riešením nejakého problému. Každý týždeň naprogramujem/nakreslím nejakú drobnosť, ktorá by pre niekoho (možno teba) mohla byť užitočná. Ak nejaký týždeň s riešením neprídem, tak buď ma nič nenapadlo, alebo som nemal čas spísať to, no budem sa snažiť.</p>
<p><img class="alignright" title="Glaphicons - Sprite" alt="" src="http://glyphicons.com/wp-content/themes/glyphicons/images/glyphicons_halflings.png" width="328" height="111" /></p>
<h2>CSS Sprites</h2>
<p>Na tento týždeň som si pripravil jednoduchý zlepšovák pri používaní Sprites napísaný v LESS. Podstatou CSS Sprites je, že miesto ukladania obrázkov jednotlivo, ich nasukáte do jedného veľkého súboru. Kratšie sa to vysvetliť hádam ani nedá. Pre úplne pochopenie by bolo asi najlepšie vidieť nejaký hotový sprite, takže tu je. Môžete si pomyslieť, že to je somarina, alebo dokonca, že to nie je efektívne, ale opak je pravdou. Poďme si vysvetliť výhody:</p>
<ol>
<li>Oveľa menej HTTP requestov &#8211; až pri parsovaní HTML prehliadačom sa začnú sťahovať jednotlivé obrázky. Vaša stránka sa so Spritami načíta rýchlejšie</li>
<li>Menšia veľkosť. 20 png obrázkov má totiž dohromady väčšiu veľkosť, než jeden veľký obrázok</li>
<li>Prístupnosť. Obrázky sa totižto načítajú až keď sú potrebné. Toto je dedičstvo od dôb z pomalým internetom. Pre nás to však znamená, že ak chcete v menu po prechode myšou zmeniť obrázok pozadia, musíte počkať, kým sa načíta (začne sa načítávať až potom že naň nadídete myšou). Dá sa to riešiť aj inak, ale Sprites sú nato priam ideálne</li>
</ol>
<p>Sprites majú však aj jednu veľkú nevýhodu. Ak chcete pridať novú ikonu, musíte ju vložiť do súboru. Je len na vás, či zvolíte postup postupného pridávania, alebo na konci projektu zabalíte všetky ikony do Spritu.</p>
<p>Keď ste už správne navnadený na používanie škriatkov (takýto preklad mi dal translator) môžem vám ukázať ako sa používajú. Je to strašne jednoduché. Používa sa totižto atribút background-position. Povedzme, že by sme chceli zobraziť prvú ikonu:</p>
<pre class="brush: css; title: ; notranslate">
.icon
{
background: url('sprite.png') 0 0 no-repeat;
width: 16px;
height: 16px;
}
</pre>
<p>No nie je to jednoduché? Dobre skúsme si dať ikonu č.2:</p>
<pre class="brush: css; title: ; notranslate">
.icon
{
background: url('sprite.png') -16px 0 no-repeat;
width: 16px;
height: 16px;
}
</pre>
<p>Takýmto spôsobom sa môžeme dostať k ľubovoľnej ikone. Poďme ďalej &#8211; predstavme si LESS.</p>
<h2>LESS</h2>
<p>Less je parádne rozširuje možnosti CSS. Nájdete ho na stránke projektu http://lesscss.org a v súčastnosti vyžaduje len pridanie JavaScriptovej knižnice (predtým bolo potrebný inštalovať knižnice na server). Prečo je ale LESS zaujímavé?</p>
<ol>
<li>Dokážete vytvárať premenné. Túto schopnosť oceníte nielen vtedy, keď používate na viacerých miestach rovnaké farby/veľkosti</li>
<li>Umožňuje vytvárať jednoduché funkcie. Túto schopnosť veľmi často oceníte, hlavne keď píšete moderné CSS3 zápisy. Nižšie bude ukážka.</li>
<li>Vytvárate stromové zápisy s dedičnosťou. Priam kľúčový element, ktorý vám umožní vytvárať vzhľad naozaj efektívne.</li>
</ol>
<p>Viac informácií, spôsob inštalácie a použitie nájdete na stránkach projektu (link pod nadpisom). Poďme horeuvedené spojiť dokopy a pozrime sa nato, ako môžeme vykresľovať Sprites efektívnejšie.</p>
<h2>Showtime</h2>
<p>Cieľom tohtotýždňového &#8220;scriptu&#8221; je uľahčiť si vyrátavanie pozície. Chceme CSSku jednoducho povedať: &#8220;Daj mi z piateho radu tretiu ikonu.&#8221; Začnime tým, že si vytvoríme premenné, kde si uložíme veľkosť našich budúcich ikon. Tieto veľkosti závisia od konkrétneho Spritu. Glaphyicons (obrázok) používajú rozmer 24x24px.</p>
<pre class="brush: css; title: ; notranslate">
@sprite_w : 24px;
@sprite_h : @sprite_w; /* výška je rovnaká ako šírka */
</pre>
<p>Teraz poďme na samotnú funkciu. Rozmer vyrátame v podstate jednoducho. Ak chceme, 1. ikonu, tak jej pozícia (background-position) je 0. Ak chceme, aby sa zobrazila druhá, potrebujeme aby sa obrázok posunul o 24px doľava a následne si z neho zobrazíme štvorec 24&#215;24. Ak chceme 3 ikonu, tak výpočet je v podstate jednoduchý &#8211; 24 * 2 (šírka ikonu * počet ikon stojacich pre ňou) odrátame od nuly (aby sme dostali záporné číslo a teda posun vľavo). Výsledná funkcia teda bude vyzerať nasledovne:</p>
<pre class="brush: css; title: ; notranslate">
.sprite( @image, @y, @x )
{
background: url( '@{image}' ) ( 0 - ( @x - 1) * @sprite_w ) ( 0 - ( @y - 1 ) * @sprite_h ) no-repeat;
width: @sprite_w;
height: @sprite_h;
}
</pre>
<p>Už nám stačí len porozumieť ako sa to používa, tak poďme nato:</p>
<pre class="brush: css; title: ; notranslate">
.icon1
{
.sprite('glyphicons-halflings.png', 1, 1); /* z prvého radu prvá ikona */
}

.icon2
{
.sprite('glyphicons-halflings.png', 2, 5); /* z druhého radu piata ikona */
}
</pre>
<p>Je to parádne, že? Teším sa na vás opäť o týždeň.</p>
<p><strong>Viac informácií:<br />
</strong>LESS &#8211; <a href="http://lesscss.org/">http://lesscss.org/</a><br />
CSS Sprites &#8211; <a href="http://css-tricks.com/css-sprites/">http://css-tricks.com/css-sprites/</a> , <a href="http://www.w3schools.com/css/css_image_sprites.asp">http://www.w3schools.com/css/css_image_sprites.asp</a></p>
<p>(PS: Svoje feedbacky, námety a tipy môžete hádzať do komentárov)</p>
]]></content:encoded>
			<wfw:commentRss>http://tominator.comper.sk/2012/04/skriatkovia-alebo-css-sprites-a-less/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prečo sú programátori takí drahí?</title>
		<link>http://tominator.comper.sk/2012/03/preco-su-programatori-taki-drahi/</link>
		<comments>http://tominator.comper.sk/2012/03/preco-su-programatori-taki-drahi/#comments</comments>
		<pubDate>Fri, 09 Mar 2012 22:13:34 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://tominator.comper.sk/?p=145</guid>
		<description><![CDATA[Počujete v správach &#8211; stránka za 25 tisíc eur, pozriete si inzeráty, kde skripty stoja stovky eur, alebo ponuky práce, kde sú ITčkari veľmi štedro odmeňovaný. Prečo? Nie je to za napísaný text Programovanie vo väčšine prípadov znamená zapisovať príkazy pre počítač, ktoré sa v určitej postupnosti vykonajú. A príkazov je mnoho. Hlavne, ak s tým začínate, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Počujete v správach &#8211; stránka za 25 tisíc eur, pozriete si inzeráty, kde skripty stoja stovky eur, alebo ponuky práce, kde sú ITčkari veľmi štedro odmeňovaný. Prečo?</p>
<h2>Nie je to za napísaný text</h2>
<p>Programovanie vo väčšine prípadov znamená zapisovať príkazy pre počítač, ktoré sa v určitej postupnosti vykonajú. A príkazov je mnoho. Hlavne, ak s tým začínate, máte dojem, že ich je príšerne veľa. Mohli by ste nadobudnúť názor, že programovať môže hocikto, kto sa naučí príkazy, no mýlite sa. <strong>Programovanie je podľa mňa spôsob myslenia.</strong> Inými slovami, dobrý programátor sa od zlého odlišuje okrem iného aj tým, akým spôsobom ku kódu pristupuje. Ak chcete aby počítač niečo vykonal, musíte mu zadať správne príkazy, v správnej postupnosti a nato musíte myslieť ako počítač. Aby som bol porozumený správne, tak sa pokúsim uviesť príklad z reálnejšieho sveta. Ak chcete, aby vás pes poslúchol, musíte rozmýšľať ako pes a teda, musíte si celú činnosť, rozsekať na drobné etapy, ktoré už pes pozná nato, aby vo výsledku vykonal činnosť, ktoré je pre neho nová. Predstavme si, že chcete aby vám z chladničky doniesol mlieko (ak si myslíte, že to je na psa veľa, tak si predstavte, že to požadujete od robota). Pes však nevie ako vám má priniesť mlieko z chladničky, avšak pozná dielčie postupy. Musíte na chvíľu rozmýšľať ako pes aby ste mu vedeli dať príkazy &#8211; choď rovno, otvor dvere, vyskoč, zober, prines, choď rovno, zatvor dvere, k nohe. To isté platí aj o programátoroch. Viete, aký má byť výsledok a musíte vymyslieť ako sa k nemu dostať. Príkazy sú len kamene na ceste.</p>
<p>Tak sa dostávame k druhému bodu &#8211; efektívnosti. Z bodu A do bodu B môžete urobiť rôzne veľa ciest. Ale od použitých príkazov závisí, či bude cesta z malých kamienkov, alebo dlažbový chodník. Čím viac riadkov napíšete, tým ťažšie sa v nich orientuje. Tým ťažšie je nájsť chybu a tým dlhšie trvá jej opravenie. Umenie programátorov, je nájsť čo možno najefektívnejšie, najjednoduchšie riešenie problému. A to je to začo platíte.</p>
<h2>Programovanie je tvorivá činnosť, nie mechanická</h2>
<p>Podľa rôznych návodov a ideí by sme mohli povedať, že programátori sú ľudia, ktorý len mechanicky pridávajú znaky do programu. Sú tieto návody zlé? Nie tak celkom. Písať kód neoddeliteľne ku programovaniu patrí, ale nato, aby ste ho napísali, musíte najskôr vymyslieť ako bude fungovať. Musíte prekonať množstvo prekážok, aby ste na konci len sadli a napísali program. Programátori sú zvyčajne na seba hrdí, keď vyriešia nejaký komplikovaný problém. Keď dokážu niečo, čo pred nimi nikto iní nespravil, prípadne to spravia lepšie. A to ma vedie v podstate ku hlavnej myšlienke celého dnešného príspevku.</p>
<h2>Väčšina hodnoty je neviditeľná</h2>
<p>To, čo vidíte vy je 50 riadkov kódu. Aké nehorázne! Za 50 riadkov kódu si pýtať 100 eur! Problém je, že nevidíte, čo tým 50 riadkom kódu predchádzalo. Iný programátor by to napísal na 250-500 riadkov &#8211; boli by ste spokojnejší? Za tými 50 riadkami kódu, ktoré napísať trvalo možno 5 min, sú hodiny rozmýšľania, skúšania a prepisovania, preto aby na konci bolo len 50 riadkov kódu.</p>
<p>Raz som sa ocitol v podobnej situácií. Môj spolužiak sa doma vymkol. Nanešťastie ani jeho otec si ráno nezobral kľúče, takže ma zavolal, či mu nepomôžem dostať sa o bytu. Skončilo to tak, že sme volali zámočníka. Zámočník prišiel do pár minút, a za 30 sekúnd otvoril byt, začo si popýtal 100 korún (dnes už 3.3 eura, vtedy dosť veľa). Otec môjho spolužiaka mu sa vyhovoril, že viac pri sebe nemá a dal mu iba 50 a potom sa čudoval, že ako môže niekto za 30 sekúnd práce pýtať až sto korún, zatiaľ, čo iný musia pracovať niekoľko hodín aby zarobili rovnaký obnos. Moja otázka znela: Boli by ste spokojnejší, keby vám dvere otváral niekoľko hodín? Nemyslíte si, že je priam super, že vám ich otvoril len za 30 sekúnd?</p>
<h2>Záver</h2>
<p>Niektorí považujú zdrojové kódy za umelecké diela. Neviem, či tomu prikladám až takú váhu, ale rozhodne to je tvorivá činnosť. Je to činnosť, ktorá sa rok od roka mení. A keď príde na finančnú odmenu, nesmieme zabudnúť na tú najvýznamnejšiu časť, hoc ju nie je vidieť. To je dôvod, prečo sú programátor &#8220;takí drahí&#8221; (to isté platí aj o designéroch).</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><small>Obrázok z: <a href="http://mindmillion.com/MONEY/euro-notes-euro-coins.htm">http://mindmillion.com/MONEY/euro-notes-euro-coins.htm</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://tominator.comper.sk/2012/03/preco-su-programatori-taki-drahi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
