<?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.ameeck.net/category/programovani/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ameeck.net</link>
	<description>osobní blog</description>
	<lastBuildDate>Thu, 09 Sep 2010 07:47:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Kontrola syntaxe PHP skriptů</title>
		<link>http://www.ameeck.net/programovani/kontrola-syntaxe-php-skriptu</link>
		<comments>http://www.ameeck.net/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.

Sám [...]]]></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.ameeck.net/programovani/kontrola-syntaxe-php-skriptu/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nezobrazují se JPEGy v IE a Chromu</title>
		<link>http://www.ameeck.net/programovani/nezobrazuji-se-jpegy-v-ie-a-chromu</link>
		<comments>http://www.ameeck.net/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 na [...]]]></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: #f9ba37;">$image</span> <span style="color: #fff;">=</span> <span style="color: #0099ff;">imagecreatefromjpeg</span><span style="color: #fff;">&#40;</span><span style="color: #99ff00;">'/cesta/k/souboru'</span><span style="color: #fff;">&#41;</span><span style="color: #fff;">;</span>
<span style="color: #0099ff;">imagejpeg</span><span style="color: #fff;">&#40;</span><span style="color: #f9ba37;">$image</span><span style="color: #fff;">,</span> <span style="color: #99ff00;">'/cesta/k/souboru'</span><span style="color: #fff;">&#41;</span><span style="color: #fff;">;</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: #f9ba37;">$info</span> <span style="color: #fff;">=</span> <span style="color: #0099ff;">getimagesize</span><span style="color: #fff;">&#40;</span><span style="color: #99ff00;">'/cesta/k/souboru'</span><span style="color: #fff;">&#41;</span><span style="color: #fff;">;</span>
<span style="color: #0099ff;">if</span> <span style="color: #fff;">&#40;</span><span style="color: #0099ff;">sizeof</span><span style="color: #fff;">&#91;</span><span style="color: #f9ba37;">$info</span><span style="color: #fff;">&#91;</span><span style="color: #99ff00;">'channels'</span><span style="color: #fff;">&#93;</span><span style="color: #fff;">&#41;</span> <span style="color: #fff;">==</span> <span style="color: #99ff00;">3</span><span style="color: #fff;">&#41;</span>
<span style="color: #fff;">&#123;</span>
    <span style="color: #0099ff;">echo</span> <span style="color: #99ff00;">'RGB!'</span><span style="color: #fff;">;</span>
<span style="color: #fff;">&#125;</span>
<span style="color: #0099ff;">else</span> <span style="color: #0099ff;">if</span> <span style="color: #fff;">&#40;</span><span style="color: #0099ff;">sizeof</span><span style="color: #fff;">&#40;</span><span style="color: #f9ba37;">$info</span><span style="color: #fff;">&#91;</span><span style="color: #99ff00;">'channels'</span><span style="color: #fff;">&#93;</span> <span style="color: #fff;">==</span> <span style="color: #99ff00;">4</span><span style="color: #fff;">&#41;</span><span style="color: #fff;">&#41;</span>
<span style="color: #fff;">&#123;</span>
    <span style="color: #0099ff;">echo</span> <span style="color: #99ff00;">'CMYK!'</span><span style="color: #fff;">;</span>
<span style="color: #fff;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.ameeck.net/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.ameeck.net/postrehy/idf2010-moje-postrehy</link>
		<comments>http://www.ameeck.net/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.ameeck.net/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.ameeck.net/programovani/seznam-captcha-plug-in-pro-phpbb</link>
		<comments>http://www.ameeck.net/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í několika [...]]]></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.ameeck.net/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.ameeck.net/postrehy/why-its-wrong-to-implement-features-by-popularity</link>
		<comments>http://www.ameeck.net/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[Postřehy]]></category>
		<category><![CDATA[phpBB]]></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.ameeck.net/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.ameeck.net/programovani/skript-na-kontrolu-dostupnosti-domeny</link>
		<comments>http://www.ameeck.net/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: #f9ba37;">$d</span> <span style="color: #fff;">=</span> <span style="color: #0099ff; font-weight: bold;">new</span> DomainChecker<span style="color: #fff;">&#40;</span><span style="color: #f9ba37;">$domain</span><span style="color: #fff;">&#41;</span><span style="color: #fff;">;</span>
&nbsp;
<span style="color: #0099ff;">if</span> <span style="color: #fff;">&#40;</span><span style="color: #f9ba37;">$d</span><span style="color: #fff;">-&gt;</span><span style="color: #fff;">isAvailable</span><span style="color: #fff;">&#40;</span><span style="color: #fff;">&#41;</span><span style="color: #fff;">&#41;</span>
<span style="color: #fff;">&#123;</span>
 <span style="color: #0099ff;">echo</span> <span style="color: #99ff00;">'volná'</span><span style="color: #fff;">;</span>
<span style="color: #fff;">&#125;</span>
<span style="color: #0099ff;">else</span>
<span style="color: #fff;">&#123;</span>
 <span style="color: #0099ff;">echo</span> <span style="color: #99ff00;">&quot;registrovaná, informace o majiteli:<span style="color: #99ff99; font-weight: bold;">\n</span>&quot;</span><span style="color: #fff;">;</span>
 <span style="color: #0099ff;">echo</span> <span style="color: #f9ba37;">$d</span><span style="color: #fff;">-&gt;</span><span style="color: #fff;">getDomainData</span><span style="color: #fff;">&#40;</span><span style="color: #fff;">&#41;</span><span style="color: #fff;">;</span>
<span style="color: #fff;">&#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.ameeck.net/programovani/skript-na-kontrolu-dostupnosti-domeny/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Představuju Genetext</title>
		<link>http://www.ameeck.net/postrehy/predstavuju-genetext</link>
		<comments>http://www.ameeck.net/postrehy/predstavuju-genetext#comments</comments>
		<pubDate>Sun, 17 Jan 2010 21:14:12 +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=259</guid>
		<description><![CDATA[Náš nový projekt, spuštěný k začátků února se jmenuje Genetext. Pomůže vám s optimalizací pro vyhledavače, sledování statistik vašich stránek a porovnáváním s konkurencí. Konečně jednoduchý způsob jak mít všechno pohromadě.]]></description>
			<content:encoded><![CDATA[<p>S očekáváním představuju náš nový projekt pro sledování webů na internetu. Jmenuje se Genetext a měl by usnadnit život všem majitelům a administrátorům stránek i elektronických obchodů.</p>
<p>Více na <a href="http://blog.genetext.cz">http://blog.genetext.cz</a></p>
<p><strong>Co to umí?</strong></p>
<p>Držet web váš i vaší konkurence pod drobnohledem a poskynout vám úplný přehled všech statistik týkajících se marketingu a SEO. Je vám nápomocný v PPC kampaňích a optimalizaci vašich stránek. Dokáže vám ukázat slabá místa vašich stránek a navrhnout změny pro zvýšení efektivity online marketingu.</p>
<p>    * Sledování pozic a ranků webu<br />
    * Pravidelné reporty e-mailem<br />
    * Analýza zdrojového kódu vašich stránek<br />
    * Všechny tyto funkce dostupné i pro konkurenční weby<br />
    * a další…</p>
<p><strong>Kde najdete informace?</strong></p>
<p>Novinky z vývoje, nové screenshoty, plány a termíny vydání, plánované ceníky a další informace týkající se Genetextu najdete na blogu: <a href="http://blog.genetext.cz">http://blog.genetext.cz</a></p>
<p><strong>Kdy to spustíme?</strong></p>
<p>Začátkem února otevřeme registraci a objednávku služeb.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ameeck.net/postrehy/predstavuju-genetext/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.ameeck.net/programovani/nahodne-razeni-v-ruznych-databazich</link>
		<comments>http://www.ameeck.net/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: #0099ff; font-weight: bold;">&lt;?php</span>
<span style="color: #0099ff;">switch</span> <span style="color: #fff;">&#40;</span><span style="color: #f9ba37;">$db</span><span style="color: #fff;">-&gt;</span><span style="color: #fff;">sql_layer</span><span style="color: #fff;">&#41;</span>
<span style="color: #fff;">&#123;</span>
    <span style="color: #0099ff;">case</span> <span style="color: #99ff00;">'mssql'</span><span style="color: #fff;">:</span>
        <span style="color: #f9ba37;">$random</span> <span style="color: #fff;">=</span> <span style="color: #99ff00;">'NEWID()'</span><span style="color: #fff;">;</span>
    <span style="color: #0099ff;">break</span><span style="color: #fff;">;</span>
    <span style="color: #0099ff;">case</span> <span style="color: #99ff00;">'postgres'</span><span style="color: #fff;">:</span>
    <span style="color: #0099ff;">case</span> <span style="color: #99ff00;">'sqlite'</span><span style="color: #fff;">:</span>
        <span style="color: #f9ba37;">$random</span> <span style="color: #fff;">=</span> <span style="color: #99ff00;">'RANDOM()'</span><span style="color: #fff;">;</span>
    <span style="color: #0099ff;">break</span><span style="color: #fff;">;</span>
    <span style="color: #0099ff;">default</span><span style="color: #fff;">:</span>
        <span style="color: #f9ba37;">$random</span> <span style="color: #fff;">=</span> <span style="color: #99ff00;">'RAND()'</span><span style="color: #fff;">;</span>
    <span style="color: #0099ff;">break</span><span style="color: #fff;">;</span>
<span style="color: #fff;">&#125;</span>
&nbsp;
<span style="color: #f9ba37;">$sql</span> <span style="color: #fff;">=</span> <span style="color: #99ff00;">'SELECT something FROM some_table ORDER BY '</span> <span style="color: #fff;">.</span> <span style="color: #f9ba37;">$random</span><span style="color: #fff;">;</span>
<span style="color: #fff; 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;">DECLARE EXTERNAL <span style="color: #993333; font-weight: bold;">FUNCTION</span> rand RETURNS DOUBLE PRECISION <span style="color: #993333; font-weight: bold;">BY</span> VALUE 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.ameeck.net/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.ameeck.net/programovani/programatorovo-ciste-svedomi</link>
		<comments>http://www.ameeck.net/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.ameeck.net/programovani/programatorovo-ciste-svedomi/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
