<?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>vojtěch vondra &#187; PHP</title>
	<atom:link href="http://www.vojtechvondra.cz/category/programovani/feed" rel="self" type="application/rss+xml" />
	<link>http://www.vojtechvondra.cz</link>
	<description></description>
	<lastBuildDate>Sat, 28 Jan 2012 12:33:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Nette Templates pro Zend</title>
		<link>http://www.vojtechvondra.cz/programovani/nette-templates-pro-zend</link>
		<comments>http://www.vojtechvondra.cz/programovani/nette-templates-pro-zend#comments</comments>
		<pubDate>Sun, 13 Feb 2011 14:13:31 +0000</pubDate>
		<dc:creator>Vojtěch Vondra</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.ameeck.net/?p=436</guid>
		<description><![CDATA[Netťácké šablony jsem si hned oblíbil a používal je nejen s kompletním frameworkem. Zend Framework umožňuje vcelku nahradit výchozí &#8220;šablonovací&#8221; systém jiným a vzhledem k existujícím projektům, které spravuji a kde by se mi Nette šablony hodily, jsem vytvořil vcelku jednoduchou přemosťující třídu, která umožňuje použít Nette Templates v Zend Frameworku. Stažení Třídy včetně příkladu [...]]]></description>
			<content:encoded><![CDATA[<p>Netťácké šablony jsem si hned oblíbil a používal je nejen s kompletním frameworkem. Zend Framework umožňuje vcelku nahradit výchozí &#8220;šablonovací&#8221; systém jiným a vzhledem k existujícím projektům, které spravuji a kde by se mi Nette šablony hodily, jsem vytvořil vcelku jednoduchou přemosťující třídu, která umožňuje použít Nette Templates v Zend Frameworku.<br />
<span id="more-436"></span></p>
<h2>Stažení</h2>
<p>Třídy včetně příkladu implementace lze najít <a href="https://github.com/vvondra/Nette-Zend-View">v repozitáři na Githubu</a>.</p>
<h2>Použití</h2>
<p>Do aplikace si stačí nahrát Nette Framework (celý) a dvě třídy (jedna pro samotnou implementaci šablon, druhá pro doplnění maker, které nebudou v původní formě fungovat). Pak už je jen potřeba nahradit původní Zend_View šablonami z Nette.</p>
<p>V repozitáři to nemám úplně pěkně uděláne. Narozdíl od Nette, kde bych na to použil společný presenter, je v Zendu lepší vyčlenit inicializaci do Controller pluginu. Každopádně až na umístění pár drobností bude implementace vypadat stejně jako příklad v repozitáři.</p>
<h2>Layouty</h2>
<p>Systém nebude fungovat s Layoutovými třídami ze ZF. Je potřeba je vypnout a layout si vytvořit sami přes bloky a makro {extends}. V šabloně pohledu bude tedy např.:</p>
<pre>{extends '../../../layouts/scripts/layout.phtml'}
{block content}
obsah ....
</pre>
<p>a layout budu mít definovaný takto:</p>
<pre>&lt;html&gt;
	&lt;head&gt;
		&lt;title&gt;
			Nette View in Zend Test
		&lt;/title&gt;
	&lt;/head&gt;
	&lt;body&gt;
		{include #content}
	&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>Funkčnost maker</h2>
<p>V současné implementaci mám pouze základní podporu pro makro <code>{link}</code>, zápis odkazu se ale spíš blíží použití klasického URL helperu ze Zend_View. Chtělo by to ještě dodělat podporu pro {ifCurrent}</p>
<p>{control} přirozeně nefunguje.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vojtechvondra.cz/programovani/nette-templates-pro-zend/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Nezkušený programátor aneb jak zabít článek</title>
		<link>http://www.vojtechvondra.cz/postrehy/nezkuseny-programator-aneb-jak-zabit-clanek</link>
		<comments>http://www.vojtechvondra.cz/postrehy/nezkuseny-programator-aneb-jak-zabit-clanek#comments</comments>
		<pubDate>Thu, 16 Sep 2010 16:54:44 +0000</pubDate>
		<dc:creator>Vojtěch Vondra</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Postřehy]]></category>

		<guid isPermaLink="false">http://www.ameeck.net/?p=381</guid>
		<description><![CDATA[Michal Maňák si na svém blogu postěžoval, v jakém stavu dostal do rukou projekt postavený v PHP na Nette frameworku. Čekal jsem slibný článek o best-practices, který by mohl (zvlášť při publikaci na Weblogy.cz) přimět pár programátoru (co třeba s Nette nebo MVC začínají), aby přehodnotili některé své přístupy a podívali se na alternativní varianty [...]]]></description>
			<content:encoded><![CDATA[<p>Michal Maňák si na svém blogu <a href="http://www.manakmichal.cz/blog/clanek/8">postěžoval</a>, v jakém stavu dostal do rukou projekt postavený v PHP na Nette frameworku. Čekal jsem slibný článek o best-practices, který by mohl (zvlášť při publikaci na Weblogy.cz) přimět pár programátoru (co třeba s Nette nebo MVC začínají), aby přehodnotili některé své přístupy a podívali se na alternativní varianty řešení problémů.</p>
<p>Autor se zabývá margináliemi, u kterých se sám s potýká s menšími či většími problémy. Když se pustím do někoho jiného, dám si sakra pozor, abych sám neměl někde nějakou hloupost, čtenáři si při hodnocení kritického článku málokdy berou servítky a komentáře pod článkem to reflektují poměrně dobře.<br />
<span id="more-381"></span></p>
<h3>Vytváříme model (pořádně)</h3>
<p>Nejde mi o to celý článek rozebrat, spíš se ale zaměřit na drobnosti, které se v něm objevily a které dobrotu rozhodně v žádné aplikaci nenadělají. Přejděme tedy k ukázce č. 1:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> ObjektModel <span style="color: #000000; font-weight: bold;">extends</span> BaseModel <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getData<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> dibi<span style="color: #339933;">::</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SELECT * FROM tabulka'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetchALL</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>BaseModel většina Nettistů používá jako abstraktní třídu, která obstarává základní CRUD operace přes dibi nebo jiný databázový layer. Potomci jen nadefinují klíč a tabulku a dědí většinu metod. V tom je tedy první připomínka: proč ji třída <code>ObjektModel</code> definuje znovu? Nic nad rámec toho, co pravděpodobně bude v BaseModelu tam rozhodně nebude. Za druhé se autor zbytečně omezuje použitím <code>fetchAll()</code>, v takto jednoduchém rozvržení modelů je mnohem výhodnější nechat fetch*() metody až na presenter a vytáhnout si tak data, které potřebuji.</p>
<blockquote><p>Není na ní nic špatného, ale změnil bych použití databázové vrstvy dibi na přehlednější zápis dibi::select(&#8216;*&#8217;)->from(&#8216;tabulka&#8217;)->fetchALL();. Dotaz je podle mě přehlednější a je také jisté, že se na nic při skládání dotazu nezapomene. </p></blockquote>
<p>Tak tohle je už jen taková obecná polemika, sama na závadu není, názor nikomu brát nemohu, je ale škoda, že přehlcuje článek úplně o nečem jiném. Spousta programátorů zas DibiFluent přeceňuje a často se do ní zamotají tak, že nevidí, že dibi::query() by bylo mnohokrát snadnější. </p>
<p>Trochu lepší řešení by mohlo být třeba toto, přestože je poměrně schematické, je funkční a čistší. V PHP 5.3 by šlo uvažovat nad tím využít Late Static Binding a $table mít staticky nadefinovaný, stejně tak jako celý BaseModel.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">abstract <span style="color: #000000; font-weight: bold;">class</span> BaseModel <span style="color: #000000; font-weight: bold;">extends</span> Object <span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$table</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
    * Vytáhne data z tabulky
    * @return DibiResult
    */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getData<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> dibi<span style="color: #339933;">::</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SELECT * FROM %sql'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">table</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> ObjektModel <span style="color: #000000; font-weight: bold;">extends</span> BaseModel <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">table</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'tabulka'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Nakonec si vytáhneme data jak jen potřebujeme.</span>
<span style="color: #000088;">$m</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ObjektModel<span style="color: #339933;">;</span>
<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$m</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getData</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetchPairs</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>Nebastlíme divoké funkce</h3>
<p>Podívejme se třeba na následující volání, co si myslíte, že vrací metoda zkontrolujHeslo()? Ja bych tipnul true/false.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$uzivatel</span> <span style="color: #339933;">=</span> VlastníModel<span style="color: #339933;">::</span><span style="color: #004000;">zkontrolujHeslo</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<ul>
<li>Metoda by měla vrátit hodnotu, která odpovídá jejímu pojmenování</li>
<li>Oproti řešení minulého programátora už tak striktně netrvá na validaci vstupních dat, které vstupují do databáze.</li>
</ul>
<p>Navíc tam u každé ukázky proběhnou takové nepodložené zvolání:</p>
<blockquote><p>Mně se takový zápis dotazů rozhodně nelíbí, je to zbytečně složité a jde to mnohem jednodušeji. Chyba je samozřejmě už v presenteru, kde se data už měla odeslat jako array() a v dotazu pouze zapsat dotaz. Model byl vypadal takto:</p></blockquote>
<p>Proč? Co nám brání mít funkci s dvěma parametrama? Uvítal bych třeba jeden jediný důvod, třeba:<br />
<em>Aplikaci chceme postavit maximálně modulárně. Vzhledem k tomu, že může existovat více možný způsobů ověření přihlašovacích údajů, interface, které definuje jak se má obstarat kontrola přihlášení (např. metodou zkontrolujUdaje()), necháme přijmout pole a ne pevně danou sadu argumentů, které mohou platit jen pro nekteré případy.</em></p>
<p>Nebo třeba o pár řádku výše psané:</p>
<blockquote><p>
To, že se pak zpracovával formulář bez zachytávání výjimek try {} catch {}, ale pouze s kombinací if(funkce()){}, někdy i bez ní, nepřijde nutné ani komentovat a taky mi to nepřipadá zrovna nejvhodnější a bezpečné pro zpracování dat.
</p></blockquote>
<p>WTF? Od kdy je zachytávání výjimek <i>výše</i> než podmínkový blok? Každé má své specifické použití a podobné zvolání je jen nefunkční generalizace.</p>
<h3>Konec dobrý, všechno dobré</h3>
<p>Na článku je několik pozitivních věcí. Připomenout, že se formulář dá plnit vlastní metodou a získat hodnoty z něj taktéž, může někomu ušetřit minuty hledáním dokumentace třídy Nette\Form. Ukázat lidem, že existuje poměrně příjemná třída DibiFluent, může leckomu rozšířit obzory. Podnítit ostatní, aby nenechali podobné kraviny ležet ladem, snad zabrání, aby se někdo na podobných článcích učil programovat.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vojtechvondra.cz/postrehy/nezkuseny-programator-aneb-jak-zabit-clanek/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Kontrola syntaxe PHP skriptů</title>
		<link>http://www.vojtechvondra.cz/programovani/kontrola-syntaxe-php-skriptu</link>
		<comments>http://www.vojtechvondra.cz/programovani/kontrola-syntaxe-php-skriptu#comments</comments>
		<pubDate>Thu, 09 Sep 2010 07:45:09 +0000</pubDate>
		<dc:creator>Vojtěch Vondra</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.ameeck.net/?p=370</guid>
		<description><![CDATA[Na Albeři jsem před týdnem slyšel dobrou historku o tom, jak se muselo počítat s chybama v minulosti. Matfyzák si napsal program, poctivě naděrkoval a strčil do stroje. Po nějaké době chroustání doběhl o dvě patra výše pro výpis chyb a začal na novo. Pořádně si rozmyslel jestli for začne od nuly nebo od jedničky. [...]]]></description>
			<content:encoded><![CDATA[<p>Na Albeři jsem před týdnem slyšel dobrou historku o tom, jak se muselo počítat s chybama v minulosti. Matfyzák si napsal program, poctivě naděrkoval a strčil do stroje. Po nějaké době chroustání doběhl o dvě patra výše pro výpis chyb a začal na novo. Pořádně si rozmyslel jestli <strong>for</strong> začne od nuly nebo od jedničky.<br />
<span id="more-370"></span><br />
Sám procedurální části kódu v PHP často píšu tak, že si dám dohromady celý kód, a pokud nemám k dispozici IDE, které mi rovnou syntax errory zvýrazní, skript nechám běžet a zjistim, jestli v něm nejsou chyby. Samozřejmě má ten přístup své nevýhody: často mi unikne chybějící čárka či středník v knihovně, kterou nespouštím přímo, nebo prostě mi jeden nebo víc souborů uteče.</p>
<p>Standarní PHP CLI binárka má šikovný parametr -l (lint), který bere jako argument PHP soubor a vypíše, jestli v něm nění nějaký Parser error. Pro pohodlnost lze použít tento příkaz, který projede rekurzivně všechny soubory v současném adresáři a zkontroluje u nich syntaxi:</p>
<div class="wp_syntax">
<div class="code">
<pre>find -type f -name '*.php' -exec php -l {} \; | grep "Parse error"</pre>
</div>
</div>
<p>Výsledkem pak může být třeba:</p>
<div class="wp_syntax">
<div class="code">
<pre>vojta@vvondra-laptop:~/public_html$ sh syntax.sh
PHP Parse error:  syntax error, unexpected T_STRING in ./app/extensions.php on line 10
PHP Parse error:  syntax error, unexpected T_REQUIRE in ./app/bootstrap.php on line 14</pre>
</div>
</div>
<h3>Pomocník automatický</h3>
<p>Ještě šikovnější věc jsem ale viděl v našem repozitáři pro phpBB na GitHubu, <a href="http://github.com/phpbb/phpbb3/blob/develop-olympus/git-tools/hooks/pre-commit">pre-commit hook, který zabrání commitu</a>, pokud je v nějakém souboru syntax error.</p>
<p>To už je jen na vás, jak zpracujete.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vojtechvondra.cz/programovani/kontrola-syntaxe-php-skriptu/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nezobrazují se JPEGy v IE a Chromu</title>
		<link>http://www.vojtechvondra.cz/programovani/nezobrazuji-se-jpegy-v-ie-a-chromu</link>
		<comments>http://www.vojtechvondra.cz/programovani/nezobrazuji-se-jpegy-v-ie-a-chromu#comments</comments>
		<pubDate>Thu, 12 Aug 2010 09:35:05 +0000</pubDate>
		<dc:creator>Vojtěch Vondra</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.ameeck.net/?p=357</guid>
		<description><![CDATA[Na současném projektu jsme dokončili rozhraní pro správu bannerů a klient už nám po několika minutách volal s chybou, že se nahraný obrázek nezobrazí. Podíval jsem se na něj ve Firefoxu a v Opeře a vše v pořádku. Ptám se tedy na prohlížeč a zjištuji, že jde o IE8. Po chvilce na Google jsem přišel [...]]]></description>
			<content:encoded><![CDATA[<p>Na současném projektu jsme dokončili rozhraní pro správu bannerů a klient už nám po několika minutách volal s chybou, že se nahraný obrázek nezobrazí. Podíval jsem se na něj ve Firefoxu a v Opeře a vše v pořádku. Ptám se tedy na prohlížeč a zjištuji, že jde o IE8.</p>
<p>Po chvilce na Google jsem přišel na příčinu, která by mě rozhodně dříve nenapadla. Některé (třeba starší IE s tím nemají problém) verze Internet Exploreru a Chromu (snad i starší Firefox byl postižen) mají problém s <strong>renderováním JPEGů uložené s CMYK barvami</strong>.<br />
<span id="more-357"></span><br />
Řešení je snadné, pokud jde o designové prvky na webu, které máte pod palcem, a pokud máte po ruce Photoshop nebo GIMP. U obou shodně přejděte v menu na <em>Obrázek / Image > Režim / Mode</em> a zvolte RGB, GIMP dokonce nic jiného neumí.</p>
<p>Problém je, pokud to uživatelé nahrávají na web. Pak je potřeba obrázek načíst přes GD a znovu uložit. Nejnovější funkce imagecreatefromjpeg() a imagejpeg() to převedou do RGB. GD s CMYK pracovat neumí a nevýhoda tohoto řešení je ztráta kvality při změně barev.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$image</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecreatefromjpeg</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/cesta/k/souboru'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">imagejpeg</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$image</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'/cesta/k/souboru'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Detekovat jestli je obrázek RGB nebo CMYK lze snadno s funkcí getimagesize()</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$info</span> <span style="color: #339933;">=</span> <span style="color: #990000;">getimagesize</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/cesta/k/souboru'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">sizeof</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$info</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'channels'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'RGB!'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$info</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'channels'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'CMYK!'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.vojtechvondra.cz/programovani/nezobrazuji-se-jpegy-v-ie-a-chromu/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IDF2010 &#8211; moje postřehy</title>
		<link>http://www.vojtechvondra.cz/postrehy/idf2010-moje-postrehy</link>
		<comments>http://www.vojtechvondra.cz/postrehy/idf2010-moje-postrehy#comments</comments>
		<pubDate>Thu, 08 Apr 2010 13:29:06 +0000</pubDate>
		<dc:creator>Vojtěch Vondra</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Postřehy]]></category>

		<guid isPermaLink="false">http://www.ameeck.net/?p=324</guid>
		<description><![CDATA[Přestože jsem včera stačil dorazit až na půlku přednášky Davida Grudla o webových aplikací, druhá část programu na mě stihla udělat docela dojem. Jednoznačně jsem byl potešený organizací, snad jedině clip-on mikrofony chyběly a brzdilo to některé přednášky. Skvělá byla i spontaneita přednášejících, např. u Jirky Knesla bylo rozhodně zajímavé koukat i na psání kódu [...]]]></description>
			<content:encoded><![CDATA[<p>Přestože jsem včera stačil dorazit až na půlku přednášky Davida Grudla o webových aplikací, druhá část programu na mě stihla udělat docela dojem. Jednoznačně jsem byl potešený organizací, snad jedině clip-on mikrofony chyběly a brzdilo to některé přednášky. Skvělá byla i spontaneita přednášejících, např. u Jirky Knesla bylo rozhodně zajímavé koukat i na psání kódu a přednášku to rozhodně nebrzdilo.</p>
<p>Většina prezentací by si zasloužila hodiny dvě. U Davida Grudla by mi přišla přednáška prázdná. Na to, jak vytvořit v Nette autocomplete by se mohl udělat stránkový tutorial. Chtělo by se to spíše zaměřit na konkrétnější a zajímavější věci.</p>
<p>Až na výjimky vypadali přednášející připraveně, někde mohl být projev plynulejší nebo přednáška mohla být lépe strukturovaná. Honza Král povídající o NoSQL by mohl začátek prezentace udělat přehlednější, byl určen lidem, co neznají základní pojmy u databází a právě pro ty to mohlo být špatně srozumitelné.</p>
<p>Je mi dost líto, že jsem nestihl přednášku D. Steigerwalda o objektech v JavaScriptu, ohlasy u oběda byly docela pozitivní. Pro mě nejpřínosnější byly příklady z praxe od Jirky Knesla, zvlášť co se komunikace týče. Zároveň mě přesvědčil, abych důkladněji se věnoval testům u svých aplikací.<br />
<img alt="" src="http://i.iinfo.cz/images/430/idf-2010-54.jpg" title="Já na IDF (ten blonďatý nahoře)" class="aligncenter" width="450" style="text-align:center;" /><br />
Celkově mi příšlo IDF jako výcuc, který mohl mít na třídenní přednáškovou konferenci se skvělým obsahem. Příště by to chtělo stejnou či lepší úroveň přednášejících, delší a hlubší příspěvky, klidně více specializované. Přednášky by měly konceptuálně navazovat, systém &#8220;od všecho trochu&#8221; mi přijde trochu nešťastný. Vyhozených (studentských) šest stovek to ale nebylo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vojtechvondra.cz/postrehy/idf2010-moje-postrehy/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Seznam CAPTCHA plug-in pro phpBB</title>
		<link>http://www.vojtechvondra.cz/programovani/seznam-captcha-plug-in-pro-phpbb</link>
		<comments>http://www.vojtechvondra.cz/programovani/seznam-captcha-plug-in-pro-phpbb#comments</comments>
		<pubDate>Thu, 04 Feb 2010 21:54:23 +0000</pubDate>
		<dc:creator>Vojtěch Vondra</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[phpBB]]></category>

		<guid isPermaLink="false">http://www.ameeck.net/?p=292</guid>
		<description><![CDATA[S vydáním phpBB 3.0.6 přibyla výrazná nová funkce, možnost vytvořit plug-iny pro alternativní CAPTCHA systémy. Kromě toho Seznam (tim myslím Seznam.cz) vydal už před delší dobou velmi jednoduché API pro čitelnou a použitelnou CAPTCHU. Já se rozhodl ty dvě věci spojit dohromady. Naštěstí to moc práce není. Rozhraní pro implementaci plug-inu je pouze o využití [...]]]></description>
			<content:encoded><![CDATA[<p>S vydáním phpBB 3.0.6 přibyla výrazná nová funkce, možnost vytvořit plug-iny pro alternativní CAPTCHA systémy. Kromě toho Seznam (tim myslím Seznam.cz) vydal už před delší dobou velmi <a href="http://captcha-api.seznam.cz/">jednoduché API</a> pro čitelnou a použitelnou CAPTCHU. Já se rozhodl ty dvě věci spojit dohromady.<br />
<span id="more-292"></span><br />
Naštěstí to moc práce není. Rozhraní pro implementaci plug-inu je pouze o využití několika funkcí definovaných v abstraktní třídě captcha_abstract.php a přizpůsobit kód způsobu kontroly zadaného kódu.</p>
<p>Celý zdroj je k <a href="http://github.com/ameeck/Seznam-CAPTCHA-plug-in-for-phpBB">dispozici na GitHub</a> a je uveřejněný pod MIT licencí. Dejte si ale pozor na <a href="http://captcha-api.seznam.cz/agreement/">smluvní podmínky</a> od Seznamu, které například omezují použití CAPTCHY pro komerční účely. Na webu API najdete celé znění podmínek. Limity pro využití jsou nastaveny následovně: max. 500 dotazů za 10 sekund, nebo 1 000 dotazů za 60 sekund.</p>
<p>CAPTCHA nabízí i odkaz pro přehraní kódu zvukově, což je příjemné pro handicapované uživatele.</p>
<p><a href="http://github.com/ameeck/Seznam-CAPTCHA-plug-in-for-phpBB/downloads">Stáhnout Seznam CAPTCHA plug-in pro phpBB</a><br />
<a href="http://www.phpbb.cz/viewtopic.php?t=18565">Diskuze na phpBB.cz</a></p>
<p>Rozhodně bych uvítal minimálně slovenský překlad, pokud má někdo možnost i jiných, rozhodně dejte vědět.</p>
<p><a href="http://www.ameeck.net/wp-content/uploads/2010/02/register_captcha.png"><img src="http://www.ameeck.net/wp-content/uploads/2010/02/register_captcha-300x147.png" alt="register_captcha" title="register_captcha" width="300" height="147" class="alignleft size-medium wp-image-294" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.vojtechvondra.cz/programovani/seznam-captcha-plug-in-pro-phpbb/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why it&#8217;s wrong to implement features by popularity</title>
		<link>http://www.vojtechvondra.cz/postrehy/why-its-wrong-to-implement-features-by-popularity</link>
		<comments>http://www.vojtechvondra.cz/postrehy/why-its-wrong-to-implement-features-by-popularity#comments</comments>
		<pubDate>Fri, 29 Jan 2010 19:34:54 +0000</pubDate>
		<dc:creator>Vojtěch Vondra</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[phpBB]]></category>
		<category><![CDATA[Postřehy]]></category>

		<guid isPermaLink="false">http://www.ameeck.net/?p=274</guid>
		<description><![CDATA[Over at the Area51 forums on phpBB.com, where most of the public discussion around phpBB4 development is held, I overheard an argument saying that we should deploy a page where user incentives to new features should be listed and it would be possible to vote on them. While the idea of developing a products accustomed [...]]]></description>
			<content:encoded><![CDATA[<p>Over at the Area51 forums on phpBB.com, where most of the public discussion around phpBB4 development is held, I overheard an argument saying that we should deploy a page where user incentives to new features should be listed and it would be possible to vote on them. While the idea of developing a products accustomed to users using their own opinions is nice, it simply will not work.<br />
<span id="more-274"></span><br />
There are several issues which I find blocking such a workflow. First it is the participation of the users themselves. Only a handful of users from the whole userbase of phpBB participates in the development discussions and they do not represent a significant part of the community. This is natural, as following the background discussions of every piece of software you use is simply impossible. What more, these users (I often include myself in this description) usually have a deformed view of what the product should look like and lack the necessary distance which could give them a better and more general view of what the product needs. Having a vote on a feature suggestion will certainly not bring a representative result usable to make a decision about implementing a feature.</p>
<p>There have been a few very interesting ideas that came up in the discussion of the new product. One of them was the separation of core features and moving them to a pluggable level. The main positive effect of this measure I see is that the already feature-filled interface can be simplified on each installation giving administrators an option to opt-out from using some of phpBB&#8217;s features and not bloating their board with them.</p>
<p>Most of the features that users will suggest and have suggested in similar experiments before were basically adding up of new features that would be useful for only a limited amount of users. Such features and add-ons should be provided in form of modifications, which allow every administrator to customize his board. The phpBB development team on the other hand should provide an intuitive and working modification interface, which would easily allow users to add such modifications.</p>
<p>If I return to the example of the current discussion about phpBB4, in my opinion, the discussion should be led about key structural and feature concepts. Feature themselves should be kept to a minimum. To bring up a topic and proposal that will be implemented, it is necessary to provide a well thought through concept. This means thinking about the target audience, the effect on the board as whole, maintainability and usability. It certainly is not about getting a long list of users to support your idea.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vojtechvondra.cz/postrehy/why-its-wrong-to-implement-features-by-popularity/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Skript na kontrolu dostupnosti domény</title>
		<link>http://www.vojtechvondra.cz/programovani/skript-na-kontrolu-dostupnosti-domeny</link>
		<comments>http://www.vojtechvondra.cz/programovani/skript-na-kontrolu-dostupnosti-domeny#comments</comments>
		<pubDate>Sun, 24 Jan 2010 17:51:09 +0000</pubDate>
		<dc:creator>Vojtěch Vondra</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.ameeck.net/?p=262</guid>
		<description><![CDATA[Jednoduchá třída pro kontrolu dostupnosti domény. Podporuje nejpoužívanější TLD a dokáže vypsat WHOIS informace.]]></description>
			<content:encoded><![CDATA[<p>Pro potřeby jinde jsem před časem dal dohromady jednoduchý skript na kontrolu dostupnosti domény.</p>
<p>Je to napsané v PHP a obalené v třídě, která se o všechno postará.</p>
<p>V tuto chvíli podporuje tyto TLD: cz, info, com, net, de, eu, biz, name, org, sk</p>
<p>Ukázka použití:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$d</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DomainChecker<span style="color: #009900;">&#40;</span><span style="color: #000088;">$domain</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$d</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isAvailable</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'volná'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">else</span>
<span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;registrovaná, informace o majiteli:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
 <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$d</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getDomainData</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong><a href="http://www.ameeck.net/files/DomainChecker.zip">Stáhnout</a></strong></p>
<p><a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-sa/3.0/88x31.png" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.vojtechvondra.cz/programovani/skript-na-kontrolu-dostupnosti-domeny/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Náhodné řazení v různých databázích</title>
		<link>http://www.vojtechvondra.cz/programovani/nahodne-razeni-v-ruznych-databazich</link>
		<comments>http://www.vojtechvondra.cz/programovani/nahodne-razeni-v-ruznych-databazich#comments</comments>
		<pubDate>Sun, 03 Jan 2010 10:21:45 +0000</pubDate>
		<dc:creator>Vojtěch Vondra</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.ameeck.net/?p=253</guid>
		<description><![CDATA[Jak řadit náhodně data v různých relačních databázových systémech.]]></description>
			<content:encoded><![CDATA[<p>Pro jednu modifikaci jsem nedávno řešil jeden z dalších problémů implementace jedné funkce v různých databázových systémech. Šlo o klasický ORDER BY RAND() z MySQL.</p>
<p>Kód jsem tvořil pro phpBB, které podporuje následující: MySQL, PgSQL, MSSQL, Oracle, SQLite, Firebird.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sql_layer</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'mssql'</span><span style="color: #339933;">:</span>
        <span style="color: #000088;">$random</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'NEWID()'</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'postgres'</span><span style="color: #339933;">:</span>
    <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'sqlite'</span><span style="color: #339933;">:</span>
        <span style="color: #000088;">$random</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'RANDOM()'</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
        <span style="color: #000088;">$random</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'RAND()'</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'SELECT something FROM some_table ORDER BY '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$random</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Oracle mi přichystal trochu nepříjemnou záležitost, nutný sub-select:</p>

<div class="wp_syntax"><div class="code"><pre class="oracle11" style="font-family:monospace;"><span style="color: #993333; font-weight: bold; text-transform: uppercase;">SELECT</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">COLUMN</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FROM</span>
<span style="color: #66cc66;">&#40;</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">SELECT</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">COLUMN</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FROM</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">TABLE</span>
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">ORDER</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">BY</span> dbms_random.<span style="color: #993333; font-weight: bold; text-transform: uppercase;">VALUE</span> <span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">WHERE</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">ROWNUM</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span></pre></div></div>

<p>To jsem ale nezkoumal Firebird. Nejdříve je potřeba definovat vlastní funkci:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">DECLARE</span> EXTERNAL <span style="color: #993333; font-weight: bold;">FUNCTION</span> rand <span style="color: #993333; font-weight: bold;">RETURNS</span> <span style="color: #993333; font-weight: bold;">DOUBLE</span> <span style="color: #993333; font-weight: bold;">PRECISION</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #993333; font-weight: bold;">VALUE</span> ENTRY_POINT <span style="color: #ff0000;">'IB_UDF_rand'</span> MODULE_NAME <span style="color: #ff0000;">'ib_udf'</span>;</pre></div></div>

<p>a poté použít klasický ORDER BY RAND();</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vojtechvondra.cz/programovani/nahodne-razeni-v-ruznych-databazich/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programátorovo čisté svědomí</title>
		<link>http://www.vojtechvondra.cz/programovani/programatorovo-ciste-svedomi</link>
		<comments>http://www.vojtechvondra.cz/programovani/programatorovo-ciste-svedomi#comments</comments>
		<pubDate>Thu, 20 Aug 2009 19:02:37 +0000</pubDate>
		<dc:creator>Vojtěch Vondra</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.ameeck.net/?p=219</guid>
		<description><![CDATA[Při vytváření aplikací nebo jednoduchých skriptů se vždy snažím držet zásady, že práci bych se nebál ukázat jinému, v oboru znalému, člověku. Napsaný kód by měl být čistý, přehledný, čitelný a snadno upravitelný. Usnadní to život vám i jiným, kteří na něj musí po vás sáhnout.]]></description>
			<content:encoded><![CDATA[<h3>Počítejte s různými prostředími</h3>
<p>Nedávno jsem měl v práci možnost opravovat jednoduchý skript (jednoduchá objednávka s odesláním mailu) a pousmál jsem se, co vytvořilo ten humbuk. Stačilo přesunutí na nový server, kde měla direktiva error_reporting v PHP jinou výchozí hodnotu. Téměř celý web se ocitl v jedné chybě jen proto, že byly najednou zobrazeny chyby úrovně E_NOTICE.</p>
<p>Přestože většinou tyto zprávy neovlivní chod aplikaci s omezeným error reportingem, jsou známkou špatného programování, ať už z uspěchanosti, unavenosti nebo pouhé lenosti. Kód by měl být vždycky takový, že se tyto zprávy vypisovat nebudou.</p>
<p>Ukázkový příklad je získání proměnné z globálního pole $_GET nebo $_POST, což je velmi často využíváno při zpracování formulářů (spíše téměř vždy):<br />
<code>$message = $_GET['message'];</code><br />
Nyní si zapněte výpis E_NOTICE a koukněte co se stane, pokud stránku načtete; PHP vás varuje, že pouíváte nedefinovaný index pole $_GET.</p>
<p>Správný zápis vypadá následovně. V této fázi se rovněž uplatní zkontrolovat datový typ, který očekáváte, hlavně u integerů.<br />
<code>$message = isset($_GET['message']) ? $_GET['message'] : '';</code></p>
<p>Kromě nedefinovaného indexu pole je druhou nejčastější chybou nedefinovaná proměnná. PHP je v tomto ohledu velmi flexibilní, až mi někdy přijde, že je to příliš. Pokud kontrolujete hodnotu proměnné, ujistěte se, jestli vůbec byla definovaná. Ještě lépe vždy proměnnou sami definujte, kontrola neinicializovaných proměnných může být s zapnutou direktivou register_globals velmi nebezpečná.</p>
<p>Dalším případem může být zapisovatelnost adresáře nebo souboru, se kterými vaše skripty počítájí. Místo toho, abyste byli nemale překvapeni, když skript nenajde to co potřebuje, nejdříve zkontrolujte, zda-li má dostatečná oprávnění. V takovém to výčtu mohu jít mnohem dál, pokud bych shrnul nejčastější prohřešky v tomto ohledu, tak si představím toto:</p>
<ul>
<li>Počítejte s všemi možnými situacemi, váše aplikace by měla běžet bez chyb nehledě na prostředí (pokud není stanoveno jinak v požadavcích, například přítomnost určitého rozšíření nebo binárky)</li>
<li>Dávejte si pozor s čím pracujete, nepokládejte za samozřejmé, že je proměnná definovaná, ověřte si, že funkce dává výstup jaký očekávejte</li>
<li>Vhodně a včas zachyťte výjimky a zpracujte je</li>
</ul>
<h3>Nenechte vaše skripty, aby se vám vymkly z rukou</h3>
<p>Uživatelé na vašem webu mohou být hraví, mohou zkoušet různé parametry (např. pokud máte někde script.php?action=delete), zadávat nesmyslné hodnoty, budou se pokoušet probourat do vaši aplikaci. Nenechte je, a postavte vaši aplikaci tak, aby jste ji ovládali vy a vědeli co dělá. Musíte to ale udělat tak, aby to co nejméně zasáhlo samotného uživatele.</p>
<p>Na formulářích je to vidět ze všeho nejlépe, vždy si ověřte zadávané hodnoty. Využijete regulérní výrazy, kontrolu délky, někdy postačí jen kontrola datového typu. Pokud uživatel něco zadá špatně, buďte vlídní a přesměrujte ho zpátky a naveďte ho na správné řešení. </p>
<p>Pokud je možno více druhů zápisu nějakého pole, zkuste je zpracovat více způsoby a pokud i tehdy nebudou zadaná data dávat smysl, přesměrujte uživatele zpět a mile ho upozorněte.</p>
<p>Opomenutím tohoto bodu se často můžete vystavit nepříjemným věcem jako jsou XSS útoky, z nedávné doby jistě každý ví o co jde. Hlavní pravidlo tedy zní:</p>
<p><strong>Předpokládejte, že uživatel může udělat cokoliv na vašem webu, dovolte mu provést jen to, co by měl!</strong></p>
<h3>Nepodceňte bezpečnost</h3>
<p>Toto téma jenom zmíním ve zkratce, zaslouží si mnohem více prostoru než zde můžu poskytnout a mnoho lidí už napsalo lepší články, než bych dokázal já.</p>
<p>Při návrhu a psaní aplikace je potřeba dbát na bezpečnost vašich skriptů, různé zkratky jako XSS, CSRF nebo třeba SQL Injection jsou vám jistě známé. </p>
<p>Při tom stačí velmi málo, abyste jim zabránili. Ověřujte veškeré uživatelské proměnné a pro různé případy escapujte obsah podle potřeby.</p>
<p>S tímto okruhem je často spojena jedna otázka, a to jestli povolit HTML v uživatelských formulářích. V tomhle ohledu je moje stanovinsko ne, všechny způsoby filtrování značek nejsou stoprocentní a už vůbec nejsou flexibilní. Na místě je použít nějaký alternativní značkovací jazyk, jako je Texy nebo vlastní implementace známého BBCode</p>
<h3>Závěřem</h3>
<p>Pokud tvoříte nějakou aplikaci, piště ji s co nejlepším svědomím a snažte se dodržet všechny principy, které jsem tu sepsal. Zároveň se ale nebojte své nedokonalosti, mnoho mých skriptů by někdo napsal mnohem lépe a už mnohokrát by pomohl kritický pohled jiného člověka. Nebojte se vaši práci konzultovat s někým jiným a nechat si poradit s efektivnějšími postupy.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vojtechvondra.cz/programovani/programatorovo-ciste-svedomi/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

