<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Mirin's blog</title>
        <description>Blog nejen o programování</description>
        <lastBuildDate>Mon, 14 Nov 2016 16:32:00 +0100</lastBuildDate>
        <link>https://www.mirin.cz/</link>
        <language>cs</language>
        <atom:link href="https://www.mirin.cz/rss.xml" rel="self" type="application/rss+xml" />

        <item>
            <title>Po sedmi letech s Nette</title>
            <pubDate>Mon, 14 Nov 2016 16:32:00 +0100</pubDate>
            <link>https://www.mirin.cz/blog/po-sedmi-letech-s-nette</link>
            <description>
Nette, potažmo PHP jsem se věnoval posledních téměř 7 let. Aktuálně to vypadá, že se od PHP a Nette minimálně na nějakou dobu odpoutám. Takže budu trochu bilancovat a shrnul bych svoje zkušenosti s ním a trochu se pokusil zhodnotit jak to s Nette vypadá aktuálně a co si myslím o tom, jak to půjde dále.
</description>
            <content:encoded><![CDATA[

<p>
Nette, potažmo <acronym title="Hypertext Preprocessor">PHP</acronym> jsem se věnoval posledních téměř 7 let. Aktuálně to vypadá, že se od <acronym title="Hypertext Preprocessor">PHP</acronym> a Nette minimálně na nějakou dobu odpoutám. Takže budu trochu bilancovat a shrnul bych svoje zkušenosti s ním a trochu se pokusil zhodnotit jak to s Nette vypadá aktuálně a co si myslím o tom, jak to půjde dále.
</p>

<h2 class="heading2"><a name="headerId" id="headerId">Pozvolný vzestup</a></h2>
<div class="level2">

<p>
Před téměř deseti lety se mi už stávající špagetové programování v <acronym title="Hypertext Preprocessor">PHP</acronym> nelíbilo. Sháněl jsem něco, co by mě umožnilo psát udržovatelnější aplikace. Dospěl jsem k tomu, že MVC framework je určitě ta správná cesta, ale psát nějaký svůj vlastní jsem zavrhl hned od počátku. Na to prostě nemám. V té době přicházelo v úvahu myslím CakePHP a právě začínal Zend Framewok. Je zajímavé, že o Symfony v té době moc slyšet nebylo. Začal jsem tedy se Zend Frameworkem, říkal jsem si, že Zend bude to správné řešení, když za ním stojí taková firma, která má zájem o samotné <acronym title="Hypertext Preprocessor">PHP</acronym>. <acronym title="Hypertext Preprocessor">PHP</acronym> samotné bylo někde kousek za 5.2. Se Zend Frameworkem to šlo dobře. Dokumentace a podpora ze strany Zendu a komunity byla už od počátku výborná. Na Internetu se začalo objevovat spousty návodů, článků.
</p>

<p>
Pak jsem nastoupil do firmy, kde se místo Zend Frameworku používalo Nette v nějaké úplně ranné verzi, ještě stažené ze SVN nebo bůh ví odkud. Proti tomu, co jsem znal ze Zendu to byl poměrně velký krok zpět. Bylo to dáno hlavně tím, jaká to bylo ranná verze.  O nějaké podpoře jako bylo u Zendu se nám nemohlo ani zdát, v podstatě jsme se pořád jen přehrabovali ve zdrojácích a zkoumali, jak co funguje. Koncept komponent jsme v té době ještě ani pořádně nechápali, používali jsem v podstatě jen presentery a šablony a v nich dokonce nějaký svůj šablonovací systém. Takže funkčně mi to přišlo i dost za tím, co bylo aktuálně v Zend Frameworku.
</p>

<p>
Takhle to vypadalo asi tak nějak do doby, než se Nette přesunulo na GitHub. To jsme teprve pořádně pochopili koncept komponent a přešli na Latte. To nám přineslo možnosti, jaké v Zendu nebyly, nebo se v něm dosahovaly velmi těžko. To bylo někde okolo vydání Nette 2.0. O Zend už jsem se prakticky přestal zajímat, jednak bylo jasné, že technologicky jsou na tom oba frameworky dost podobně a pak jsem ani neměl příliš času navíc, přišli rodinné a jiné životní peripetie.
</p>

<p>
Zhruba nějak v té době se začalo více mluvit o Symfony, které se na poli frameworků začalo stávat hvězdou. Jeden z důvodů byl možná ten, že poměrně rychlo začalo adoptovat Doctrine jako modelovou vrstvu a vůbec se stavělo k integraci různých dalších částí od jiných frameworků celkem pozitivně. Ostatní frameworky šly spíše svou vlastní cestou a pokoušely se o nějaká vlastní řešení pro modely. Nette nebylo výjimkou, vymýšlelo vlastní databázovou vrstvu, testovací framework atp.
</p>

<p>
Pak přišla doba dependency injection a její nástup do <acronym title="Hypertext Preprocessor">PHP</acronym>, potažmo frameworků. Tady opět udalo krok Symfony, Nette přišlo až později, kdy se z velké části nechalo právě Symfony inspirovat.
</p>

<p>
Dnes je situace taková, že v tom, co Nette umí, je technologicky v podstatě srovnatelné s konkurencí. Navíc si ponechalo celkem unikátní vlastnosti, které jinde nenajdete, zejména třeba právě komponenty, šablonovací systém Latte. Hodně pomáhá Tracy, která i bez IDE dokáže udělat práci s laděním aplikace poměrně pohodlnou a výrazně tak zlepšuje efektivitu práce v <acronym title="Hypertext Preprocessor">PHP</acronym>. Teoreticky by tak Nette mělo být na špičce v nástrojích a frameworcích pro <acronym title="Hypertext Preprocessor">PHP</acronym>, ale není to tak.
</p>

</div>

<h2 class="heading2"><a name="headerId1" id="headerId1">Stagnace</a></h2>
<div class="level2">

<p>
Světu <acronym title="Hypertext Preprocessor">PHP</acronym> dnes jednoznačně dominuje Symfony, následováno Laravelem, pak možná Zend a dalšími. O Nette moc nezavadíte. Přitom práce např. s některými částmi Laravelu bez možnosti dependency injection je když ne přímo problematická, tak minimálně až moc magická. V Čechách je to přitom přesně opačně než ve světě, tady Nette zatím pořád dominuje. Ale i u nás doma se začínají karty obracet. O tom dále.
</p>

<p>
Podle mě je to pořád o tom samém, jak jsem už <a href="http://www.mirin.cz/blog/zend-vs-nette" class="urlextern" title="http://www.mirin.cz/blog/zend-vs-nette">psal před 7 lety</a>. Za tu dobu se nepodařilo najít žádný model, který by Nette dal jasný výhled do budoucna a záruku současného stabilního stavu, což je to, co firma potřebuje, když si volí na čem postaví svůj produkt. Všechno si pořád dělá z velké části <a href="https://davidgrudl.com" class="urlextern" title="https://davidgrudl.com">David Grudl</a> jako hlavní autor sám a nikoho moc nepustí ke slovu, všechno pak začíná a končí na tom, co posvětí on a co ne. K čemu se nějak zásadně nepřihlásí, to tak nějak skomírá na okraji. Za tu dobu se nepodařilo okolo frameworku vybudovat nějaký ekosystém firem, přispěvatelů, školení, autorů komponent. Osoba autora sama o sobě je podle mě také dost kontroverzní a problematická, což také adopci frameworku nepomáhá. Když autor opakovaně vyhlašuje - mám být někde ale jsem někde úplně jinde a v neidentikovatelném stavu - tak pokud je někdo takový tím, kdo je jediný zodpovědný za osud frameworku, tak takový framework si dost možná nezvolím do firmy pro svůj nový produkt. A je celkem jedno, jestli ty hlášky jsou myšleny jako humor nebo ne.
</p>

<p>
Existuje sice <a href="https://github.com/Kdyby" class="urlextern" title="https://github.com/Kdyby">Kdyby</a>, <a href="https://nextras.org" class="urlextern" title="https://nextras.org">Nextras</a> jako sady komponent. Jsou srazy Posledních sobot, ale nějak to Nette nepomáhá k tomu, aby se prosadilo mimo svou hlavní doménu, což jsou freelaceři a web agentury. Už jsme viděli několik pokusů o to řešit různé komerční způsoby podpory, placené verze atp. Všechno vyšumělo, což opět posiluje chápání frameworku jako one man show a bere mu body při rozhodování o budoucím frameworku pro firemní projekt.
</p>

<p>
Hlavní problémy, které jsem Nette vytýkal - nedostatečná dokumentace, špatná zpětná kompatibilita, nepředvídatelnost budoucího vývoje - se podařilo vyřešit jen částečně. Hodně se toho zlepšilo, zejména dokumentace je už alespoň nějaká. Ale je na tom hrozně vidět, že tohle jsou oblasti, které autora nebaví, nedělá je tedy rád a nevěnuje jim pozornost, jakou zasluhují. Jediné, co ho baví je programovat a vymýšlet nová vylepšení frameworku. Bohužel nikdo ale do poslední chvíle pořádně neví, co zrovna vymyslí, kdy to vymyslí a kolik toho tím rozbije. Poslední aktualizace - verze 2.4 - měla být původně jen malá aktualizace s ohledem na budoucí dopřednou kompatibilitu a vyklubal se z toho ohromný interní update, který např. komplet překopal Latte, takže pokud má někdo svá vlastní složitější makra tak se bude asi dost divit.
</p>

</div>

<h2 class="heading2"><a name="headerId2" id="headerId2">Budoucnost</a></h2>
<div class="level2">

<p>
Jak jsem napsal na začátku, sám se aktuálně nejen od Nette, ale i od <acronym title="Hypertext Preprocessor">PHP</acronym> samotného chystám minimálně na nějakou dobu vzdálit. Ohlížel jsem se na trhu práce a je vidět sílící trend, že větší projekty často staví na Symfony, případně Laravelu jako základu a z Nette využívají tak možná Tracy, občas DI. Takže Nette ztrácí body už i v Čechách, kde je tradičně nejsilnější. Pokud se tedy Nette za chvíli nemá smrsknout na pár šikovných nástrojů, které jsou sice fajn, ale dá se bez nich obejít, tak by to chtělo něco s tím udělat. 
</p>

<p>
Pořád si myslím, že bez komerční podpory, tedy zaštítění nějakou firmou, se Nette neobejde. Je celkem jedno, jestli firmu založí nějaká skupina lidí okolo frameworku, nebo se toho ujme nějaká stávající firma, která má do Nette hodně nainvestováno. Jisté je, že se do toho bude muset zapojit i sám autor. Je ale velkou otázkou jak. Manažerskou a řídící roli evidentně dělat nechce. Pokud to ale bude dělat někdo jiný, tak z Davida by se v podstatě měl stát zaměstnanec, který se bude muset podřídit tomu, co chce management a držet se něčeho, na čem se s managementem minimálně shodne. Něco takového si ale moc nedokážu představit, že po těch letech &quot;zábavy&quot; s programováním bude schopen dělat.
</p>

<p>
Nedávno jsme se na Twitteru mohli dočíst, že Nette konečně po letech hledání čeká něco nového, tak se nechme překvapit jestli to Nette pomůže zabránit v pomalém vyklízení dalších pozic nebo ne.
</p>

</div>

            ]]></content:encoded>
            <guid isPermaLink="false">article-111@https://www.mirin.cz/</guid>
        </item>
        <item>
            <title>Jak se řeší 404ky, 500ky v Nette</title>
            <pubDate>Thu, 20 Oct 2016 14:01:00 +0200</pubDate>
            <link>https://www.mirin.cz/blog/jak-se-resi-404ky-500ky-v-nette</link>
            <description>
Když jsem teď převáděl blog na Nette, tak jsem se docela zasekl na chybových stránkách - stránky, kde HTTP Response kód je 500 a 404. Typicky se jim říká &amp;quot;pětiskova&amp;quot;, &amp;quot;500&amp;quot;, případně &amp;quot;ISE&amp;quot; a &amp;quot;čtyřista-čtyřka&amp;quot;, &amp;quot;404&amp;quot;. Překvapivě celkem jednoduchá záležitost mě docela potrápila. V dokumentaci se toho příliš o tom, jak chybové stránky řeší Nette a na co si dát pozor mnoho není. Takže se hodí trochu se o tom zmínit. A proč ne zrovna na blogu, kde jsem to musel řešit .
</description>
            <content:encoded><![CDATA[

<p>
Když jsem teď převáděl blog na Nette, tak jsem se docela zasekl na chybových stránkách - stránky, kde <acronym title="Hyper Text Transfer Protocol">HTTP</acronym> Response kód je 500 a 404. Typicky se jim říká &quot;pětiskova&quot;, &quot;500&quot;, případně &quot;ISE&quot; a &quot;čtyřista-čtyřka&quot;, &quot;404&quot;. Překvapivě celkem jednoduchá záležitost mě docela potrápila. V dokumentaci se toho příliš o tom, jak chybové stránky řeší Nette a na co si dát pozor mnoho není. Takže se hodí trochu se o tom zmínit. A proč ne zrovna na blogu, kde jsem to musel řešit <img class="smiley" src="https://www.mirin.cz//images/smileys/icon_smile.gif" alt=":-)" />.
</p>

<h2 class="heading2"><a name="headerId" id="headerId">Nette a ošetření chyb</a></h2>
<div class="level2">

<p>
Problém už je v tom, jak se klasická Nette aplikace vlastně vyvíjí. Většinou jedete podle <a href="https://github.com/nette/sandbox" class="urlextern" title="https://github.com/nette/sandbox">sandboxu</a>, kde se vám hned na začátku v boostrapu nahodí Tracy a ta za vás všechny výjimky a chyby v aplikaci řeší a k nějakým chybovým stránkám se tak vlastně vůbec nedostanete. To je <em>vývojový režim</em>.
</p>

<p>
Pokud je Nette aplikace v <em>produkčním režimu</em>, tak to funguje tak, že výjimky propadnou celou vaší aplikací až na začátek, kde si Nette vyjímku zachytí a zavolá se speciální presenter - <em>ErrorPresenter</em> - který se o výjimky musí postarat. Ten má pak na starost i vykreslení našich 404 a 500 stránek. První a nejdůležitější věc je tedy nezapomenout na testování aplikace v produkčním režimu před tím, že ji nasadíte. Ideálně samozřejmě to mít někde v testovacím prostředí vyřešené pomocí testů. Pokud děláte typicky nějaké malé weby, tak si to prostě pamatovat a vyzkoušet. Když to neuděláte a zapomenete na to, tak můžete dopadnout dost špatně, propadnou vám tam nějaké staré ErrorPresentery, typicky ty ještě z toho výchozího sandboxu, pak jsou v nich špatné namespaces a celá aplikace skončí právě tou 500, ačkoli na vývojovém prostředí všechno funguje. Další věc je, že výchozí sandboxové šablony chybových stránek chtějí využívat společný layout a tam vám to také spadne na tom, že v layoutu používáte už nějaké společné komponenty nebo věci, o kterých ErrorPresenter také neví.
</p>

</div>

<h2 class="heading2"><a name="headerId1" id="headerId1">Produkční režim při vývoji</a></h2>
<div class="level2">

<p>
Takže jste si na to vzpomněli a jdete přes nasazením otestovat aplikaci v produkčním režimu. Nejjednodušší je změnit na chvíli ip adresu v boostrapu, např. místo <em>127.0.0.1</em>, tam dát <em>128.0.0.1</em> - <code>$configurator-&amp;gt;setDebugMode([&amp;quot;128.0.0.1&amp;quot;]);</code>. Jsme tedy v produkčním režimu při vývoji. Pak už jen otevřít v prohlížeči nějakou neexistující stránku vaší aplikace a &hellip; nestačíte se divit. Stránku 500 nasimulujete nejsnáze tak, že si do nějakého existující Presenteru vrazíte hned někam na začátek nějaké <code>throw new \Exception(&amp;quot;test&amp;quot;);</code>.
</p>

<p>
Tenhle produkční režim při vývoji je ale dost nepřátelský, samozřejmě nesmíte zapomenout na ty testovací výjimky, ale já jsem ještě narazil ještě na to, že v tomhle režimu se automaticky nepromazává keš šablon. Takže když v tomhle režimu ladíte vzhled stránky 404 v latte šabloně, tak pozor nato, že při její změně je potřeba ručně promazávat keš šablon.
</p>

<p>
<em>Pozn. Podle komentářů od D. Grudla se zdá, že není třeba vůbec používat produkční režimem při vývoji. Pro vývoj error presenterů stačí nastavit v konfiguraci &#039;applications: catchExceptions: yes&#039;. Pak místo toho, aby se při výskytu výjimek používalo Tracy, tak výjimky začnou propadávat do error presenterů a můžete je tak pohodlně odladit přímo ve vývojovém režimu.</em>
</p>

<p>
Ještě více srandy si užijete při výskytu chyb ve vlastním ErrorPresenteru. To je z hlediska frameworku poměrně komplikovaná věc, když si člověk uvědomí, že vlastně řeší případ, kdy v ErrorPresenteru, který zpracovává výjimku se vyskytne výjimka. Co jsem měl možnost vyzkoušet, tak to dopadne tak, že chybu chytí Tracy, která tam i v produkčním režimu evidentně pořád někde zůstává a čeká kromě logování i na tenhle případ. Vtip je v tom, že Tracy vyhodí téměř na chlup stejnou stránku jako máte v sandboxu pro ErrorPresenter, takže na první pohled jste naprosto zmatení. V logách Tracy je naštěstí vidět, kde je problém.
</p>

<p>
K logám - to je další věc - je sice fajn jak loguje Tracy, ale co když nastane chyba přímo v Tracy, nebo logy přetečou? Přeci jen to Tracy logování se trochu vymyká tomu standarnímu formátu unix logů. Bohužel Tracy se nedrží toho, že by respektovala <em>error_log</em> direktivu <acronym title="Hypertext Preprocessor">PHP</acronym>, naopak ji potlačuje. Určitě by mě přišlo vhodné, aby Tracy respektovala <em>error_log</em> a posílala tak chyby dále do standarního <acronym title="Hypertext Preprocessor">PHP</acronym> logu. Onehdá jsme na to měli do Tracy nějaké patche, ale s přechodem na Sentry v produkci jsme je zrušili a do Sentry se nám podařilo prosadit <a href="https://github.com/getsentry/sentry-php/issues/177" class="urlextern" title="https://github.com/getsentry/sentry-php/issues/177">změny</a>, které logují chyby do <acronym title="Hypertext Preprocessor">PHP</acronym> logu.
</p>

</div>

<h2 class="heading2"><a name="headerId2" id="headerId2">Více možností ošetření chyb 404</a></h2>
<div class="level2">

<p>
Pokud máte rozsáhlejší aplikaci, tak máte v zásadě dvě možnosti, jak ošetřovat chyby 404, obecně jakékoli jiné než 500.  
</p>
<ul>
<li class="level1"><div class="li"> vyhozením výjimky - typicky <code>Application\BadRequestException</code> pro 404</div>
</li>
<li class="level1"><div class="li"> forwardováním na specifický ErrorPresenter</div>
</li>
</ul>

<p>
 První možnost je jasná, vyhodí se výjimka a skončíme v našem hlavním ErrorPresenteru kde výjimku ošetříme.
</p>

<p>
Druhá možnost se používá u větších aplikacích, kdy potřebujete odlišit od sebe stránky různých &quot;neexistujících věcí&quot;, protože každá se snaží uživatele vrátit zpět na do aplikace jiným způsobem. Typicky stránka pro neexistující produkt se bude lišit od stránky pro neexistují kategorii produktu, neexistujícího uživatele atd. Typicky se pro tyto případy použije jeden abstraktní pro specifické stránky a další specifické ErrorPresentery od něj pak dědí kvůli vlastním šablonám a případně další logice, jak navést uživatele zpět na web.
</p>

<p>
Tyto specifické ErrorPresenty jsou ale dost často zdrojem chyb, protože používají různé sidebary a layouty s komponentami, které se pak neumí vytvořit. Takže z nich padají výjimky, kterých si při vývoji normálně nevšimnete, protože jedete v klasickém vývojovém režimu.
</p>

</div>

<h2 class="heading2"><a name="headerId3" id="headerId3">Chování ErrorPresenterů</a></h2>
<div class="level2">

<p>
ErrorPresentery si také zaslouží trochu více pozornosti. První věc je, že ten <a href="https://github.com/nette/sandbox/blob/3b30090ae000ba940099b293cab6b6bab5e22e90/app/presenters/ErrorPresenter.php" class="urlextern" title="https://github.com/nette/sandbox/blob/3b30090ae000ba940099b293cab6b6bab5e22e90/app/presenters/ErrorPresenter.php">sandboxový</a>, ze kterého budete vycházet, se mi zdá nějaký podivný, např. nedědí od <code>UI\Presenter</code>, nemá svou šablonu, jen phtml soubor a všechny 4xx výjimky posílá na další presentery. Cílem asi je mít obsluhu chyby 500 - fatální selhání aplikace - opravdu co nejrychleji a nejbezpečněji odbavené, i když ten forward rozhodně není jednoduchá záležitost. Jednodušší řešení mi přijde mít jeden klasický ErrorPresenter s renderdefault metodou, kde se podle výjimky, která přijde v parametru <code>exception</code>, rozhodneme pro šablonu a tu vykreslíme. Nemusíme nic forwardovat a máme k dispozici latte i pro chybu 500.
</p>

<p>
Pak je tu další nepříjemná věc, která platí jak pro hlavní ErrorPresenter, tak pro případné specifické <strong>neumějí obsloužit url pro signály</strong>. Nevím tedy jak je to v aktuálním Nette 2.4, ale v Nette 2.1 to platilo. Pokud jste v šabloně ErrorPresenteru volali komponentu, která vytvářela url pro nějaký svůj signál - nějaké latte volání <code>{link signal!}</code>, tak to v ErrorPresenteru skončí chybou. Je to tím, že ErrorPresentery nemají routy. Tohle je dost nepříjemná vlastnost, které se nedá moc předcházet, protože ve složitější aplikaci se šablony různě includují do sebe a lehce se tak stane, že nějaká komponenta z nějakého sidebaru probublá i do ErrorPresenteru. Řešením je např. udržovat šablony pro ErrorPresentery oddělené, aby se do nich takové komponenty nedostávaly, nebo podmínkovat kód těchto komponent tak aby typicky pro <acronym title="Hyper Text Transfer Protocol">HTTP</acronym> Response kódy 404 prostě url se signálem nezobrazovalo.
</p>

</div>

<h2 class="heading2"><a name="headerId4" id="headerId4">Doporučení</a></h2>
<div class="level2">

<p>
Na závěr doporučení pro ošetřování error stránek a tvorbu ErrorPresenterů 
</p>
<ul>
<li class="level1"><div class="li"> Nezapomínat testovat ErrorPresentery a jejich chování. Ideálně automatizovaně. </div>
</li>
<li class="level1"><div class="li"> Produkční režim při vývoji má svá úskalí, např. se neinvaliduje keš šablon.</div>
</li>
<li class="level1"><div class="li"> ErrorPresentery neumí obsloužit url pro signály.</div>
</li>
</ul>

<p>
 Z toho pak plynou další doporučení, která nám ulehčí udržování aplikace.  
</p>
<ul>
<li class="level1"><div class="li"> Minimalizovat použití specifických ErrorPresenterů, idálně mít jen jeden hlavní ErrorPresenter. Pak se také všude dá použít jednoduché vyhazování výjimky <code>BadRequestException</code>.</div>
</li>
<li class="level1"><div class="li"> Mít šablony ErrorPresenterů jednoduché a samostatné, aby pokud možno nezávisely na dalších šablonách. Zabrání se tak zavlečení různých částí aplikace, které ErrorPresenter neumí obsloužit, zejména signálů, ale i různých komponent, které ErrorPresenter neumí vytvořit.</div>
</li>
</ul>

<p>
 Něco by se určitě dalo zlepšit i v samotném Nette, potažmo v sandboxu Nette aplikace na GitHubu 
</p>
<ul>
<li class="level1"><div class="li"> Zjednodušit ErrorPresentery v sandboxu, aby měly samostatné šablony bez závislosti na layoutu, případně aby dědily od <code>UI\Presenter</code> jako obyčejné presentery.</div>
</li>
<li class="level1"><div class="li"> Nějak se pokusit vyřešit url na signály u Presenterů bez rout, pokud to tedy již není vyřešené.</div>
</li>
<li class="level1"><div class="li"> Zkusit vymyslet nějaké opatření ať už v sandboxu nebo ve frameworku, které by zlepšilo možnosti vývoje ErrorPresenterů.</div>
</li>
<li class="level1"><div class="li"> Pokusit se designově odlišit 500ku v Tracy a v sandboxu, aby člověk nebyl při vývoji zmatený, na co vlastně kouká.</div>
</li>
<li class="level1"><div class="li"> Zvážit, zda nechat Tracy přes vše ostatní nakonec logovat do standarního <acronym title="Hypertext Preprocessor">PHP</acronym> logu, je to standard, minimálně administrátoři jsou na to zvyklí.</div>
</li>
<li class="level1"><div class="li"> Doplnit někam nějaké best practices pro ErrorPresentery, pokud se tedy na něčem komunita shodne, tohle může sloužit jako odrazový můstek <img class="smiley" src="https://www.mirin.cz//images/smileys/icon_smile.gif" alt=":-)" />.</div>
</li>
</ul>

</div>

            ]]></content:encoded>
            <guid isPermaLink="false">article-110@https://www.mirin.cz/</guid>
        </item>
        <item>
            <title>Do háje s empty</title>
            <pubDate>Sun, 30 Aug 2015 19:02:37 +0200</pubDate>
            <link>https://www.mirin.cz/blog/do-haje-s-empty</link>
            <description>
Až nepoměrně často se v PHP kódech setkávám s jedním zlozvykem. Použitím empty konstrukce téměř všude kde je to jen možné. Přitom je to podle mě jedna nejvíce zneužívaných věcí v PHP, která ne jen že snižuje výkon ale je i nebezpečná.
</description>
            <content:encoded><![CDATA[

<p>
Až nepoměrně často se v <acronym title="Hypertext Preprocessor">PHP</acronym> kódech setkávám s jedním zlozvykem. Použitím <code>empty</code> konstrukce téměř všude kde je to jen možné. Přitom je to podle mě jedna nejvíce zneužívaných věcí v <acronym title="Hypertext Preprocessor">PHP</acronym>, která ne jen že snižuje výkon ale je i nebezpečná.
</p>

<p>
Celkem běžně je možné se setkat s <acronym title="Hypertext Preprocessor">PHP</acronym> projekty, které v podstatě vůbec nepoužívají běžné porovnání <code>if ($var)</code> místo toho je všude <code>if (!empty($var))</code> a byl jsem nemile překvapen jak je tohle zakořeněné i u lidí, kteří dělají v <acronym title="Hypertext Preprocessor">PHP</acronym> několik let a nelze je tedy považovat za začátečníky. Podle mě to vzniká tak, že to prostě někde odkoukali z nějakého podobného projektu a tak narvou empty naprosto všude, vždyť ono to funguje, tak co si s tím lámat hlavu. Dost často ani nevědí, že např. deklarované třídní proměnné mají implicitně hodnotu  NULL, takže použití empty je pak naprosto zbytečné.
</p>

<p>
Další důvod bude ten, že když narazí na nějaký kód, ze kterého se sypou NOTICE chyby o nedeklarovaných proměnných nebo properties, tak tam prostě zase dají vyzkoušené empty a tak se tenhle zlozvyk dále rozvíjí a upevňuje. Tohle by ale určitě zkušenější programátor neměl dělat.
</p>

<p>
Empty je takový mladší brácha isset a společně jsou <a href="http://www.boyter.org/2011/03/list-of-most-commonly-used-php-functions" class="urlextern" title="http://www.boyter.org/2011/03/list-of-most-commonly-used-php-functions"> nejpoužívanějšími</a> konstrukcemi v <acronym title="Hypertext Preprocessor">PHP</acronym> vůbec. Což bohužel potvrzuje vžitou představu o <acronym title="Hypertext Preprocessor">PHP</acronym> vývojářích jako bastličích. Nemá cenu popisovat k čemu vlastně tyhle konstrukce jsou jen pár vlastností, na které se těchto konstrukcí často zapomíná 
</p>
<ul>
<li class="level1"><div class="li"> isset vrací FALSE i v případě, že proměnná existuje a má hodnotu NULL</div>
</li>
<li class="level1"><div class="li"> isset může mít více než jeden parametr</div>
</li>
<li class="level1"><div class="li"> mohlo by se zdát, že se uvnitř isset a empty se nemohou zavolat žádné funkce, ani před <acronym title="Hypertext Preprocessor">PHP</acronym> 5.5 to nebyla tak úplně pravda</div>
</li>
</ul>

<p>
 K poslednímu bodu, vždy bylo možné volat funkce a testovat až výsledná pole a objekty, např. tedy <code>empty($this-&amp;gt;getItems()-&amp;gt;first[&amp;quot;title&amp;quot;]); isset(filterNames(&amp;quot;name&amp;quot;)[0]-&amp;gt;surname)</code>. Pak se také funkce mohou zavolat &quot;skrytě&quot;, empty a isset na objektech mohou volat magické funkce __isset apod., v nich se už může dít cokoli. Možná by jste to ani neřekli, tohle
</p>
<pre class="php codeOutput"><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$sessionNamespace</span><span class="sy0">-&gt;</span><span class="me1">items</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre>
<p>
volání nad <a href="https://api.nette.org/2.2/Nette.Http.SessionSection.html" class="urlextern" title="https://api.nette.org/2.2/Nette.Http.SessionSection.html"> session</a> zavolá spousty funkcí a metod a nakonec klidně i nastartuje session.
</p>

<p>
A teď k tomu nejdůležitějšímu, proč empty nepoužívat a jaké jsou jeho vedlejší efekty
</p>

<h2 class="heading2"><a name="headerId" id="headerId">Empty vám zamaskuje překlepy</a></h2>
<div class="level2">

<p>
Pokud použijete  
</p>
<pre class="php codeOutput"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">configuration</span><span class="br0">&#91;</span><span class="st0">&quot;payment&quot;</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="re0">$type</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&quot;isFree&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></pre>
<p>
A v konfiguraci při nějaké úpravě změníte náhodou &quot;payment&quot; např. &quot;payments&quot;, tak se klidně může stát že všichni vaši zákazníci u vás dostanou najednou všechno zdarma. Samozřejmě že jim to vadit nebude ale vašeho nadřízeného to asi moc nepotěší a on vás pak asi také moc nepotěší. Váš kód bude ale naprosto v pořádku, bez žádných chyb a NOTICES. Podobných případů a situací může být nekonečně. Tohle platí stejně pro isset. 
</p>

</div>

<h2 class="heading2"><a name="headerId1" id="headerId1">Dvojité skryté podmínky</a></h2>
<div class="level2">

<p>
Zejména empty je v podstatě dvojitá podmínka, která se ovšem tváří navenek jako jedna, takže i když testy máte  všechny empty volání pokryté, aplikace vám nakonec stejně nefunguje.
</p>

</div>

<h2 class="heading2"><a name="headerId2" id="headerId2">Empty s kladným výsledkem je vlastně zápor</a></h2>
<div class="level2">

<p>
Tohle je spíše subjektivní záležitost, ale řekl bych, že nebudu sám. Kód s empty je sám o sobě čitelný, ale špatně se opravuje právě tam, kde bylo empty použité zbytečně.  Zápis s empty se &quot;tváří&quot; jako běžná funkce a většina  funkcí vrací TRUE když je všechno v pořádku a FALSE, když je to chyba. Ale u empty je to přesně naopak.  Už se mi párkrát stalo, že <code>if (empty($var))</code>, jsem nahradil za <code>if ($var)</code>, přitom správně je <code>if (!$var)</code>
</p>

<p>
Určitě se tedy vyplatí proměnné inicializovat, jak už několikrát poukazoval J. Vrána. Pak se výrazně redukuje použití empty i isset. Skoro bych řekl, že pokud je váš projekt prolezlý voláním empty, tak je něco špatně a měli by jste to změnit.
</p>

<p>
Osobně se pořád ještě uchyluji k tomu, že neinicializuji proměnné, které se použijí někde hluboko v zanoření nebo v cyklech
</p>
<pre class="php codeOutput"><span class="kw2">function</span> getItems<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
   <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">.....</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="sy0">....</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
      <span class="re0">$items</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$item</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
   <span class="br0">&#125;</span>
 <span class="br0">&#125;</span>
&nbsp;
 <span class="kw1">return</span> <a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$items</span><span class="br0">&#41;</span> ? <span class="re0">$items</span> <span class="sy0">:</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre>
<p>
 Prostě proto, protože píši tak, jak se tvoří kód a neřeším nic zpětně. Zas za nějak extra velký problém to nepovažuji. Ale pokud se i v těchto případech provede inicializace před cyklem, je to určitě lepší. 
</p>

</div>

            ]]></content:encoded>
            <guid isPermaLink="false">article-109@https://www.mirin.cz/</guid>
        </item>
        <item>
            <title>Firemní PHP žigulík</title>
            <pubDate>Sat, 09 Aug 2014 23:09:55 +0200</pubDate>
            <link>https://www.mirin.cz/blog/firemni-php-zigulik</link>
            <description>
Jednou jsem měl v práci přidat to stávajícho systému novou vlastnost, o co přesně jde je celkem jedno, ale součástí stávajícího řešení je metoda, kterou jsem označil za prásarnu, nejdřív se podíváme, jak ten kód vypadá v IDE, protože to je už dnes ve firmách, jež na nějakém rozsáhlejším PHP kódu zavisí, téměř nutnost.
</description>
            <content:encoded><![CDATA[

<p>
Jednou jsem měl v práci přidat to stávajícho systému novou vlastnost, o co přesně jde je celkem jedno, ale součástí stávajícího řešení je metoda, kterou jsem označil za prásarnu, nejdřív se podíváme, jak ten kód vypadá v IDE, protože to je už dnes ve firmách, jež na nějakém rozsáhlejším <acronym title="Hypertext Preprocessor">PHP</acronym> kódu zavisí, téměř nutnost.
</p>

<p>
<a href="http://mirin.cz/media/articles/addItemCode.jpg" class="media" title="http://mirin.cz/media/articles/addItemCode.jpg"><img src="http://mirin.cz/media/articles/addItemCode.jpg" class="mediacenter" title=" parameters WTF " alt=" parameters WTF " /></a>
</p>

<p>
Bez hlubšího zkoumání si člověk řekne WTF, k čemu tam je ta hromada argumentů, když se vůbec nepoužívají (šedivé argumenty IDE označuje jako nepoužité). Ale pozor, raději si to přepíšeme &quot;na papír&quot; a hned je jasnější, o co kráčí.
</p>
<pre class="php codeOutput"><span class="kw2">public</span> <span class="kw2">function</span> addItem<span class="br0">&#40;</span><span class="re0">$sku</span><span class="sy0">,</span> <span class="re0">$name</span><span class="sy0">,</span> <span class="re0">$price</span><span class="sy0">,</span> <span class="re0">$category</span> <span class="sy0">=</span> <span class="kw4">null</span><span class="sy0">,</span> <span class="re0">$quantity</span> <span class="sy0">=</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
 <span class="re0">$product</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
 <span class="kw1">foreach</span> <span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'sku'</span><span class="sy0">,</span> <span class="st_h">'name'</span><span class="sy0">,</span> <span class="st_h">'category'</span><span class="sy0">,</span> <span class="st_h">'price'</span><span class="sy0">,</span> <span class="st_h">'quantity'</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re0">$arg</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$$arg</span> <span class="sy0">!==</span> <span class="kw4">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
   <span class="re0">$product</span><span class="br0">&#91;</span><span class="re0">$arg</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$$arg</span><span class="sy0">;</span>
  <span class="br0">&#125;</span>
 <span class="br0">&#125;</span>
&nbsp;
 <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">transaction</span><span class="br0">&#91;</span><span class="st_h">'transactionProducts'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">transaction</span><span class="br0">&#91;</span><span class="st_h">'transactionProducts'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
 <span class="br0">&#125;</span>
 <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">transaction</span><span class="br0">&#91;</span><span class="st_h">'transactionProducts'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$product</span><span class="sy0">;</span>
 <span class="kw1">return</span> <span class="re0">$this</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre>
<p>
   Celé je to v podstatě o úplně triviální věci, nasypat hodnoty z argumentů do pole a to pak někam uložit. Nicméně i tahle triviální věc se tady dělá &quot;trikováním&quot;, jména proměnných, v našem případě dokonce argumentů, jejichž obsah potřebujeme uložit, jsou v poli řetězců, a výsledná hodnota se ukládá pomocí speciální konstrukce <a href="http://cz.php.net/variables.variable" class="urlextern" title="http://cz.php.net/variables.variable"> variable variable</a> - <code>$$arg</code>.
</p>

<p>
Proč uvádím &quot;dokonce argumentů&quot;? Protože když se změní <strong>jméno</strong> argumentu, tak je tady nepřímá závislost nějaké interní struktury funkce na jméně argumentu, není vůbec triviální odhalit co a jak opravit.
</p>

<p>
Zkušenější programátor v php by také měl vědět, že dynamické konstrukce typu variable variable, variable functions, jsou takový zakuklený eval, tím pádem pomalé, žádnou optimalizaci php dělat nemůže, musí udělat lookup všude možně, aby nalezl odpovídající proměnnou, funkci atd.
</p>

<p>
Zkrátka přišlo mi to jako dost typická ukázka práce <a href="http://php.vrana.cz/mazany-a-liny-programator.php" class="urlextern" title="http://php.vrana.cz/mazany-a-liny-programator.php">
mazaného a líného</a> programátora. I když tady to je spíš špatný pokus být mazaný. Tupé řešení
</p>
<pre class="php codeOutput"><span class="kw2">public</span> <span class="kw2">function</span> addItem<span class="br0">&#40;</span><span class="re0">$sku</span><span class="sy0">,</span> <span class="re0">$name</span><span class="sy0">,</span> <span class="re0">$price</span><span class="sy0">,</span> <span class="re0">$category</span> <span class="sy0">=</span> <span class="kw4">null</span><span class="sy0">,</span> <span class="re0">$quantity</span> <span class="sy0">=</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span class="re0">$product</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
   <span class="st0">&quot;sku&quot;</span> <span class="sy0">=&gt;</span> <span class="re0">$sku</span><span class="sy0">,</span>
   <span class="st0">&quot;name&quot;</span> <span class="sy0">=&gt;</span> <span class="re0">$name</span><span class="sy0">,</span>
   <span class="st0">&quot;price&quot;</span> <span class="sy0">=&gt;</span> <span class="re0">$price</span><span class="sy0">,</span>
   <span class="st0">&quot;category&quot;</span> <span class="sy0">=&gt;</span> <span class="re0">$category</span><span class="sy0">,</span>
   <span class="st0">&quot;quantity&quot;</span> <span class="sy0">=&gt;</span> <span class="re0">$quantity</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
  <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$product</span> <span class="kw1">as</span> <span class="re0">$parameter</span> <span class="sy0">=&gt;</span> <span class="re0">$value</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
   <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$value</span> <span class="sy0">===</span> <span class="kw4">null</span><span class="br0">&#41;</span> <a href="http://www.php.net/unset"><span class="kw3">unset</span></a><span class="br0">&#40;</span><span class="re0">$product</span><span class="br0">&#91;</span><span class="re0">$parameter</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  <span class="br0">&#125;</span>
&nbsp;
  <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">transaction</span><span class="br0">&#91;</span><span class="st_h">'transactionProducts'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
   <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">transaction</span><span class="br0">&#91;</span><span class="st_h">'transactionProducts'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  <span class="br0">&#125;</span>
  <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">transaction</span><span class="br0">&#91;</span><span class="st_h">'transactionProducts'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$product</span><span class="sy0">;</span>
  <span class="kw1">return</span> <span class="re0">$this</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre>
<p>
Se určitě dá vylepšit, ale už to rozhodně není prasečina a trikování. IDE s ním nemá problém, přejmenovat parametr je triviální a bude to určitě i celé mnohem rychleji fungovat.
</p>

<p>
Pravda je, že stávající řešení je funkční, kdyby to bylo v nějaké jednorázovém skriptu, pomocné utilitě, testu atp., neřeknu, ale tohle je produkční kód, který se za den vykoná velmi často, tak jsem se ozval, že mi to připadá jako prasácké trikování.   Autor kódu je současný manažer, který si občas zaprogramuje v php, dříve byl i pokročilý java programátor.  Ten odpověděl, že to jen zkopíroval (a vskutku jsem to pak našel ještě na několika dalších místech), ale nepřijde mu, že to není OK, a vůbec že nemá čas to řešit. No a náš vrchní vývojář - &quot;samozřejmě, že to je OK a není nejmenší důvod to předělávat. Máme dost jiné práce&quot;.
</p>

<p>
Pokud u vás píšete testy a neklikáte pořád dokola v prohlížeči, píše se rozumná dokumentace,  když se něco nahackuje (naprasí), tak se neplácáte po zádech, jak jste to zmákli,  ale pravidelně to čistíte a nenecháváte na &quot;někdy&quot; a nedejbože i  funguje continuos integration a dokonce děláte i smysluplné code review, které zlepšuje kvalitu práce vás i kolegů,  tak to si můžete <a href="https://www.youtube.com/watch?v=aobLAlMGwFA" class="urlextern" title="https://www.youtube.com/watch?v=aobLAlMGwFA"> pískat jako
Don Číčo</a> a nemusíte žrať žiadnu rižu, protože tu bižu, kterou v práci potřebujete, už dávno máte. 
</p>

            ]]></content:encoded>
            <guid isPermaLink="false">article-108@https://www.mirin.cz/</guid>
        </item>
        <item>
            <title>Neberte nám zbraně, zaplatíme boj s terorizmem</title>
            <pubDate>Thu, 02 May 2013 09:58:04 +0200</pubDate>
            <link>https://www.mirin.cz/blog/neberte-nam-zbrane-zaplatime-boj-s-terorizmem</link>
            <description>
Celý Boston byl nedávno paralyzován honem na teroristy, kteří byli podezřelí z bombových útoků při Bostonském maratonu. Bostonské ulice vypadaly přesně jako v post-apokalyptických zombie filmech. Prázdné ulice, zavřené školy, zrušené veřejné zápasy, zavřené obchody. To vše kvůli 19-ti letému podezřelému, který prchal pěšky a jehož podobu znal každý Američan.
</description>
            <content:encoded><![CDATA[

<p>
Celý Boston byl nedávno paralyzován honem na teroristy, kteří byli podezřelí z bombových útoků při Bostonském maratonu. Bostonské ulice vypadaly přesně jako v post-apokalyptických zombie filmech. Prázdné ulice, zavřené školy, zrušené veřejné zápasy, zavřené obchody. To vše kvůli 19-ti letému podezřelému, který prchal pěšky a jehož podobu znal každý Američan.
</p>

<p>
Jistě, akce, kterou provedli dva bratři Tsarnaevové při maratonu byla odporná, celkem 4 lidé zemřeli a 100 lidí bylo zraněno, někteří velmi vážně. Na druhou stranu obyvatelé Londýna při útocích IRA zažívali podobné a ještě mnohem horší teroristické útoky roky a že by byl život ve městech tak paralyzován jako v Bostonu o tom lze pochybovat. Srovnávat to s tím, jak na podobné teroristické akce reagují lidé v Afgánistánu, Iráku už nelze vůbec. Terorizmus jako devastující hrozba, která má potenciál zničit všechno a všechny, tak to vnímá USA a křičí tuhle zprávu do celého světa prostřednictvím svých médií. 
</p>

<p>
Je ironií, že zrovna ve dnech, kdy probíhal hon na pachatele útoků, senátem neprošlo rozhodnutí o zpřísnění kontroly při vydávání střelných zbraní, které mělo zákony upravovat tak, aby se zbraně nedostaly do rukou psychicky narušeným jedincům nebo bývalým kriminálníkům. 90% samotných Američanů s reformou souhlasí, 56 senátorů ze 100 také, ale přesto se o změnách díky Republikánům ani nehlasovalo. Jako obvykle by se přece jednalo o útok na svobodu jedince.
</p>

<p>
Každoročně umírá v USA více jak 30 000 lidí násilnou smrtí způsobenou střelnou zbraní. Na následky teroristických činů jich loni zemřelo 17. Mnohem horší je fakt, jak rutinní a všední se stalo umírání v důsledku střelby šílenců. Nedávný masakr ve školce v Connecticutu pronikl do médií, ale každodenní zabíjení v amerických ulicích už nikoho moc nevzrušuje.
</p>

<p>
Stejný den, kdy výbuchy na maratónu paralyzovaly USA, bylo zastřeleno 11 lidí, těhotná Breshauna Jackson v Dallasu byla zabita svým přítelem, Jamesa Tuckera z Kalifornie při jízdě na kole zastřelil neznámý útočník, 13-ti letý hoch také z Kalifornie si vzal život pravděpodobně kvůli šikaně ve škole, použil zbraň svého otce. V Brooklynu propuštěná policistka zabila sebe, svého přítele a svou roční dceru služební zbraní, která nikomu nechyběla. Během nahánění útočníků z Bostonu zemřelo v USA smrtí způsobenou střelnou zbraní více jak 38 lidí.
</p>

<p>
Je až neuvěřitelné, jak vládní místa a na ně napojená média všude šíří propagandu strachu proti terorizmu, který ve skutečnosti ničí životy obyvatel mnohem méně, než v uvozovkách ochrana práv a svobod. Není to jen problematický trh se zbraněmi, nedávný výbuch v továrně na hnojiva v Texasu byl zapříčiněn zejména opomenutím kontroly federálních úřadů, o tom, že drtivá většina lidí zemře na onemocnění spojená se srdečními problémy, cukrovkou, rakovinou a chronickými dýchacími potížemi už se nemluví vůbec. Změny ve zdravotnictví, které by pomohly dostat se ke zdravotnímu pojištění 30 milionům obyvatel však nejsou na pořadu dne. Nedovedu si moc vysvětlit, že lidé, nebo alespoň ta mlčící většina, přijali skutečnost, že vyhazovat miliardy na mašinérii spojenou s terorizmem je v pořádku ale udělat něco proto, aby člověk nemusel být celý život invalida, až ho postřelí nějaký psychopat nebo aby se invalidním nestal v důsledku toho, že nebude mít na léčbu cukrovky, to by bylo ohrožení svobod a práv jedince.
</p>

<p>
Volně přeloženo z článku <a href="http://www.guardian.co.uk/commentisfree/2013/apr/21/boston-marathon-bombs-us-gun-law" class="urlextern" title="http://www.guardian.co.uk/commentisfree/2013/apr/21/boston-marathon-bombs-us-gun-law"> Why does America lose its head over &#039;terror&#039; but ignore its daily gun deaths</a>. 
</p>

            ]]></content:encoded>
            <guid isPermaLink="false">article-107@https://www.mirin.cz/</guid>
        </item>
        <item>
            <title>Břidlice nás nezachrání</title>
            <pubDate>Thu, 25 Oct 2012 16:21:56 +0200</pubDate>
            <link>https://www.mirin.cz/blog/bridlice-nas-nezachrani</link>
            <description>
Poslední tři roky média, dokonce i ta mainstreamová, vykřikovala, že problémy s energií jsou pryč díky novému &amp;quot;zázraku&amp;quot; - plynu a ropě z břidlic - a způsoby jejich těžby tzv. horizontálním vrtům a frakčnímu stěpení. Mnoho nového plynu začalo proudit zejména z USA a titulky hlásaly nadcházející staletí levné energie z plynu.
</description>
            <content:encoded><![CDATA[

<p>
Poslední tři roky média, dokonce i ta mainstreamová, vykřikovala, že problémy s energií jsou pryč díky novému &quot;zázraku&quot; - plynu a ropě z břidlic - a způsoby jejich těžby tzv. horizontálním vrtům a frakčnímu stěpení. Mnoho nového plynu začalo proudit zejména z USA a titulky hlásaly nadcházející staletí levné energie z plynu.
</p>

<p>
Všichni to chtěli slyšet, po cenách okolo 150 dolarů za barel se už už začínalo zdát, že těch pár šílenců, kteří hlásají ropný zlom jako už probíhající a civilizaci ohrožující problém, má možná i pravdu. To přeci není možné, aby člověk, nejchytřejší tvor na světě, poháněný silou neviditelné ruky trhu, nepřišel včas na to, jak s problémy s energií vypořádat. Autority hlásaly - všechno předělat na plyn, nové způsoby těžby plynu přináší novou energetickou nezávislost (zejména do USA), Clifford Krauss v New York Times napsal legendární článek <a href="http://www.foreignpolicy.com/articles/2011/04/27/how_goldman_sachs_created_the_food_crisis" class="urlextern" title="http://www.foreignpolicy.com/articles/2011/04/27/how_goldman_sachs_created_the_food_crisis"> There Will Be Fuel</a>. Vy bubáci zalezte zpátky do děr, jdeme slavit!
</p>

<p>
Už na začátku se začaly objevovat názory, že není co slavit, např. Art Berman a geolog David Hughes začali <a href="http://www.theoildrum.com/node/6785" class="urlextern" title="http://www.theoildrum.com/node/6785"> troubit na poplach</a>, že <a href="http://www.postcarbon.org/report/331901-report-will-natural-gas-fuel-america" class="urlextern" title="http://www.postcarbon.org/report/331901-report-will-natural-gas-fuel-america">není důvod</a> k žádnému optimismu. Oba poukazují na to, že velká produkce plynu není hnána žádnými zázračnými objevy ani v technologiích těžby, ani v nějakých nových nalezištích břidlicového plynu nebo ropy, ale jen cenou, která vystřelila v roce 2005 na 13 dolarů za BTU (když předtím se dlouho pohybovala okolo 2 dolarů). To umožnilo uvést do provozu velmi drahou technologii a začít těžit dlouho známá ložiska, které se dříve nevyplatila. Vypadá to spíš na nafouklou bublinu &quot;na plynu&quot;, jako dříve na hypotékách, Internetu apod., upozorňovaly kritické články. Nikoho nezajímala negativa, které frakční stěpení přináší, obrovská množství vody, které je k těžbě potřeba, toxický metan unikající do ovzduší, kontaminované a navždy znehodnocené zásoby podzemní vody ze špatně utěsněných vrtů. Novodobí zlatokopové měli našlápnuto k velkým ziskům, investoři povzbuzeni všude deklarovaným optimismem začali do těžby plynu hrnout zahálející hotovost.
</p>

<p>
Netrvalo dlouho a titulky už vypadají zcela jinak, ten samý Krauss v NYT dnes píše něco zcela jiného - v článku <a href="http://www.nytimes.com/2012/10/21/business/energy-environment/in-a-natural-gas-glut-big-winners-and-losers.html?pagewanted=1&amp;tntemail1=y&amp;_r=1&amp;emc=tnt" class="urlextern" title="http://www.nytimes.com/2012/10/21/business/energy-environment/in-a-natural-gas-glut-big-winners-and-losers.html?pagewanted=1&amp;tntemail1=y&amp;_r=1&amp;emc=tnt">Po boomu zemního plynu</a> uvádí, že plynová horečka byla ztráta peněz pro těžební společnosti i tisíce jejich investorů, CEO ExxonMobilu k tomu dodává: &quot;Peníze jsou fuč a neviděli jsem nic, všechno je v červených&quot;. Bublina začíná praskat. Jak začnou investice opadat, těžba začne klesat a plyn opět zdraží.
</p>

<p>
Je tu ještě jedna věc. David Hughes pracuje na novém reportu, který bude zveřejněn na začátku roku 2013, ze kterého vyplývá, že počáteční pokles těžby u nových vrtů je velmi prudký, takže těžební společnosti se budou snažit vymačkat ze stávajících vrtů ještě více a případně rychle otvírat nové vrty a to za snižujících se nákladů na zabezpečení. Dopady na životní prostředí - otrávená podzemní voda, zničená půda - budou mít na lidi přímý dopad, žádná ropná skvrna někde v oceánu.
</p>

<p>
Břidlicový plyn jistě zůstane jako alternativa k dalším fosilním palivům. Důležité je jaké <a href="http://en.wikipedia.org/wiki/EROEI" class="urlextern" title="http://en.wikipedia.org/wiki/EROEI">EROEI</a> vlastně břidlice mají. Žádná studie k tomu ještě neexistuje, ojedinělé průzkumy na pár nalezištích ukazují na něco k 6:1 nebo méně, pak by to znamenalo, že těžba břidlicových plynů a ropy se neobejde bez energie z klasických fosilních zdrojů energie jako konvenční ropa, plyn a uhlí. Konec planých nadějí.
</p>

<p>
Jedno je jasné, energie z břidlic nebude spásou lidstva jako levná a v dostatečném množství dostupná náhrada za současná konvenční fosilní paliva jako je ropa, zemní plyn, uhlí. Nic se také nemění na tom, že levně těžitelné zásoby těchto paliv se stále tenčí a současný moderní životní styl, který na této levné energii závisí, není déle udržitelný.
</p>

<p>
Volně přeloženo z článku Richarda Heinberga <a href="http://www.energybulletin.net/stories/2012-10-22/gas-bubble-leaking-about-burst" class="urlextern" title="http://www.energybulletin.net/stories/2012-10-22/gas-bubble-leaking-about-burst"> Gas Bubble Leaking, About to Burst</a>. 
</p>

            ]]></content:encoded>
            <guid isPermaLink="false">article-106@https://www.mirin.cz/</guid>
        </item>
        <item>
            <title>Hovno kód v Nette?</title>
            <pubDate>Wed, 18 Jul 2012 23:21:26 +0200</pubDate>
            <link>https://www.mirin.cz/blog/hovno-kod-v-nette</link>
            <description>
Když jsme se nedávno s kolegy konečně dokopali k upgradu Nette, tak na světlo vyplynula jedna trochu nepříjemná skutečnost a to v základu celého frameworku - v komponentovém modelu.
</description>
            <content:encoded><![CDATA[

<p>
Když jsme se nedávno s kolegy konečně dokopali k upgradu Nette, tak na světlo vyplynula jedna trochu nepříjemná skutečnost a to v základu celého frameworku - v komponentovém modelu.
</p>

<p>
Lecos už naznačila ukázka jednoho z pilířů celého frameworku - třídy <code>Nette\Application\UI\Presenter</code>, kterou si dokonce dovolil nějaký neznaboh označit za <a href="http://www.hovnokod.cz/732" class="urlextern" title="http://www.hovnokod.cz/732"> &quot;hovno kód&quot;</a>.
</p>
<pre class="php codeOutput"><span class="kw2">class</span> Presenter
<span class="br0">&#123;</span>
   <span class="sy0">....</span>
   <span class="sy0">....</span>
&nbsp;
    <span class="co4">/**
    * Returns self.
    * @return Presenter
    */</span>
    final <span class="kw2">public</span> <span class="kw2">function</span> getPresenter<span class="br0">&#40;</span><span class="re0">$need</span> <span class="sy0">=</span> <span class="kw4">TRUE</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        <span class="kw1">return</span> <span class="re0">$this</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre>
<p>
Následně byl hned umravněn komentářem ve smyslu &quot;tohle nesmrdí, vždyť přece Presenter dědí od Control, takže je to v pořádku&quot;. Opravdu je to v pořádku?
</p>

<p>
Když se podívá na ukázku kdokoli bez nějakých znalostí frameworku, tak je to minimálně podivné. Volat takovou metodu postrádá přeci smysl, navíc ten nesmyslný parametr. Ať je parametr <code>$need</code> naprosto cokoli, dostanu pokaždé to samé.
</p>

<h2 class="heading2"><a name="headerId" id="headerId">Presenter není komponenta</a></h2>
<div class="level2">

<p>
 Třída <code>Presenter</code> opravdu musí v současnosti implementovat metodu <code>getPresenter</code>, protože dědí od třídy <code>Control</code>. Najdete to dokonce i v <a href="http://doc.nette.org/cs/presenters#toc-presenter-a-komponenty" class="urlextern" title="http://doc.nette.org/cs/presenters#toc-presenter-a-komponenty"> dokumentaci</a> o presenterech. Ale je to skutečně správně?
</p>

<p>
Třída <code>Control</code> představuje to, pro co se v dokumentaci a všude v diskusích okolo Nette používá slovo &quot;komponenta&quot;, ve zkratce je to znovupoužitelná část zobrazené stránky. Právě tuto zobrazenou stránku představuje ve frameworku třída <code>Presenter</code>. Je tedy Presenter - zobrazená stránka - opravdu speciálním případem komponenty - své části - jak je to v současnosti? Presenter podle všeho potřebuje disponovat některými vlastnostmi komponent 
</p>
<ul>
<li class="level1"><div class="li"> obsahovat různé množství jiných komponent, které mohou obsahovat další komponenty - stromová struktura a operace nad ní</div>
</li>
<li class="level1"><div class="li"> být vizuální - umět pracovat se šablonami a vykreslit se</div>
</li>
<li class="level1"><div class="li"> obsluhovat volání akcí představovaných signály (ale šlo by to i bez nich, viz. dále)</div>
</li>
</ul>

<p>
 Naopak nepotřebuje, nebo by dokonce neměl mít, tyto vlastnosti komponent 
</p>
<ul>
<li class="level1"><div class="li"> být obsahem jiné komponenty - představuje stránku, tedy nejvyšší kořen stromu komponent</div>
</li>
<li class="level1"><div class="li"> dohledávat nadřazený presenter (obecně svůj kořen) - pokud hledám sám sebe tak se mnou není něco v pořádku</div>
</li>
</ul>

<p>
 Hlavním úkolem presenteru také není být skladem na komponenty (potažmo komponentou), jeho hlavní odpovědnost je odbavit daný požadavek. K té zmínce o signálech - presenter by obsluhovat signály nemusel, není k tomu důvod, tohle se může klidně přenechat pouze komponentám. Na druhé straně signály v preseterech zjednodušují odbavení některých - zejména nevizuálních - akcí.
</p>

<p>
Z výše uvedeného plyne, že Presenter <strong>nemá</strong> být potomkem komponenty, není jejím speciálním případem a výše uvedené společné vlastnosti má s komponentami sdílet jiným způsobem než prostřednictvím dědičnosti.
</p>

</div>

<h2 class="heading2"><a name="headerId1" id="headerId1">Špatná viditelnost metod</a></h2>
<div class="level2">

<p>
Dalším - možná trochu neočekávaným - důsledkem nevhodnosti dědičnosti presenterů od komponent je použití <code>protected</code> metod presenteru ve třídě Control. Takto to vypadá v <a href="http://api.nette.org/2.0/source-Application.UI.Control.php.html#65" class="urlextern" title="http://api.nette.org/2.0/source-Application.UI.Control.php.html#65"> metodě Control::createTemplate()</a>
</p>
<pre class="php codeOutput"><span class="kw2">protected</span> <span class="kw2">function</span> createTemplate<span class="br0">&#40;</span><span class="re0">$class</span> <span class="sy0">=</span> <span class="kw4">NULL</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
  <span class="re0">$template</span> <span class="sy0">=</span> <span class="sy0">...;</span>
  <span class="re0">$presenter</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">getPresenter</span><span class="br0">&#40;</span><span class="kw4">FALSE</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
  <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$presenter</span> instanceof Presenter<span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="sy0">...</span>
    <span class="re0">$template</span><span class="sy0">-&gt;</span><span class="me1">netteHttpResponse</span> <span class="sy0">=</span> <span class="re0">$presenter</span><span class="sy0">-&gt;</span><span class="me1">getHttpResponse</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  <span class="br0">&#125;</span>
&nbsp;
  <span class="sy0">...</span>
<span class="br0">&#125;</span></pre>
<p>
Problematická je metoda <code>Presenter::getHttpResponse()</code>. Tato metoda je totiž ve třídě Presenter - potomkovi Control - definována jako <code>protected</code>. Ve třídě Control je možné ji zavolat, protože <acronym title="Hypertext Preprocessor">PHP</acronym> samotné umožňuje volat protected metody potomka v předkovi.
</p>

<p>
Problém je v tom, že ve svých aplikacích dědíte své komponenty právě od třídy Control. V těchto vašich komponentách však už <code>Presenter::getHttpResponse()</code> nezavoláte, protože Presenter není potomkem vašich komponent.
</p>

<p>
Těžko říci, kolik toho v tomto případě jde na vrub výše zmíněné vlastnosti <acronym title="Hypertext Preprocessor">PHP</acronym>. Jisté ale je, že pokud by Presenter nebyl potomkem Control, jeho metody volané ze třídy Control by nikdy jako protected nevznikly, musely by být public. Jako řešení je proto nutné protected metody třídy Presenter používané ve svých komponentách učinit ve svých presenterech jako public, případně si udělat drobný patch do frameworku, který se dá přežít.
</p>

<p>
Komponentový model popsaný výše je v Nette od jeho počátku a jeho změna je radikálním krokem, který znamená přepsat základy frameworku. Uvidíme, zda se tak někdy stane. Je pravda, že nějaké zásadní obtíže, které by se nedaly řešit, současné uspořádání nepřináší, takže se nemyslím, že k tomu v dohledné budoucnosti dojde. Na konci zmíněný problém s viditelností některých protected metod presenteru v komponentách je jednoduše řešitelný (změnou na public) i bez zásahu do komponentového modelu.
</p>

<p>
Abych jen nevytahoval nedostatky, je nutné zmínit, že ve verzi 2 Nette ušlo oproti předchozí verzi 0.9 pořádný kus dopředu zejména v oblasti DI a dokumentace se také podstatně vylepšila, upgrade se určitě vyplatí. 
</p>

</div>

            ]]></content:encoded>
            <guid isPermaLink="false">article-105@https://www.mirin.cz/</guid>
        </item>
        <item>
            <title>Redirect direktivy a mod_rewrite</title>
            <pubDate>Tue, 13 Mar 2012 19:46:53 +0100</pubDate>
            <link>https://www.mirin.cz/blog/redirect-direktivy-a-mod_rewrite</link>
            <description>
S nástupem frameworků se stalo trendem používání různých způsobů &amp;quot;routingu&amp;quot; neboli nasměrování určité url na konkrétní třídu (controller), který se stará o odbavení a ve výsledku i zobrazení stránky na daném url. Dříve se na podobné činnosti používal zejména Apache modul mod_rewrite a jeho přepisovací pravidla. Ten se sice ještě stále používá, ale v drtivě většině na to, že nasměrujeme &amp;quot;všechno&amp;quot; do naší php aplikace, která se již postará o zbytek. Proto mě poměrně zásadně nedávno potrápilo použití mod_rewrite společně s  mod_alias pro přesměrování.
</description>
            <content:encoded><![CDATA[

<p>
S nástupem frameworků se stalo trendem používání různých způsobů &quot;routingu&quot; neboli nasměrování určité url na konkrétní třídu (controller), který se stará o odbavení a ve výsledku i zobrazení stránky na daném url. Dříve se na podobné činnosti používal zejména Apache modul mod_rewrite a jeho přepisovací pravidla. Ten se sice ještě stále používá, ale v drtivě většině na to, že nasměrujeme &quot;všechno&quot; do naší php aplikace, která se již postará o zbytek. Proto mě poměrně zásadně nedávno potrápilo použití mod_rewrite společně s  mod_alias pro přesměrování.
</p>

<p>
Naprosto zásadní věcí totiž je, že o přesměrování zapsané v Apache přes direktivy Redirect a spol. se stará nikoli mod_rewrite, ale mod_alias, a to tak, že veškeré tyto přesměrování  se zpracovávají <strong>až po přepisovacích pravidlech z mod_rewrite</strong>.
</p>

<p>
Předpokládejme zhruba tuto konfiguraci:
</p>
<pre class="code">
RewriteEngine On

# framework
RewriteRule ..... /index.php [L]
</pre>

<p>
Za pravidlem se skrývá cokoli, nejčastěji množina pravidel, na tom nezáleží. Jde o to, že  někde v php kódu, který se skrývá hluboko za index.php máme něco, co přesměrovává url <code>/static.xml</code> někam na náš rychlý server se statickým obsahem - <code>http://files.domain.net/static.xml</code>.
</p>

<p>
A teď se z neznámého důvodu rozhodneme optimalizovat výkon a zrychlit přístup k tomuto souboru tak, že přesměrování uděláme přímo v Apache a protože když už optimalizujme, tak pořádně, proto použijeme raději mod_alias a Redirect direktivy, která přeci musí zajistit rychlejší odbavení redirektu než přepisovací záležitosti mod_rewrite. Takže přidáme do konfigurace řádek
</p>
<pre class="code">
RedirectPermanent /static.xml http://files.domain.net/static.xml
RewriteEngine On

# framework
RewriteRule ..... /index.php [L]
</pre>

<p>
v domnění, že se nám ten redirect krásně uplatní před přepisováním. Ale ono smůla. Musíme do přepisovacích pravidel přidat vynechání <code>static.xml</code> z přepisovacích pravidel, protože - jak bylo uvedeno výše - má přepisování z mod_rewrite přednost před přesměrováním z mod_alias.
</p>
<pre class="code">
RewriteEngine On

# framework
RewriteRule !/static.xml ...... /index.php [L]

RedirectPermanent /static.xml http://files.domain.net/static.xml
</pre>

<p>
 Jaký je závěr? Nejraději se na celý proces optimalizace vykašlat a nechat toho co  nejvíce na aplikaci, protože je to jasné duplikování, které může dělat jen potíže. To, co dělá mod_alias s redirektem, dělá i mod_rewrite a také i naše aplikace. Pokud to bude v aplikaci, bude to sice pomalejší, ale to zejména u permanentních redirektů, kterých je většina, to nějak zásadně nevadí. Vyvážené to bude lepší udržovatelností a možnostmi ladění, které jsou u aplikace lepší než ladit redirekty v konfiguraci Apache. Když už něco chtít přesouvat do Apache, tak raději Redirect direktivy z mod_alias vůbec nepoužívat a vše udělat v mod_rewrite direktivách. 
</p>

            ]]></content:encoded>
            <guid isPermaLink="false">article-104@https://www.mirin.cz/</guid>
        </item>
        <item>
            <title>Stále špatným směrem</title>
            <pubDate>Fri, 30 Dec 2011 13:30:07 +0100</pubDate>
            <link>https://www.mirin.cz/blog/stale-spatnym-smerem</link>
            <description>
S tím jak končí rok 2011 je možné se trochu poohlédnout zpět a zhodnotit, jak jsme si jako obyvatelé planety Země vedli. Není to vůbec žádná sláva, nic z toho, co mělo přinést zlepšení se nestalo. Ekonomicky a energeticky jsme se pouze přiblížili k okraji propasti představující vleklou krizi a recesi a v důsledku těchto problémů se začaly objevovat další, především sociální nepokoje a nerovnováhy.
</description>
            <content:encoded><![CDATA[

<p>
S tím jak končí rok 2011 je možné se trochu poohlédnout zpět a zhodnotit, jak jsme si jako obyvatelé planety Země vedli. Není to vůbec žádná sláva, nic z toho, co mělo přinést zlepšení se nestalo. Ekonomicky a energeticky jsme se pouze přiblížili k okraji propasti představující vleklou krizi a recesi a v důsledku těchto problémů se začaly objevovat další, především sociální nepokoje a nerovnováhy.
</p>

<h2 class="heading2"><a name="headerId" id="headerId">energie, ropa, zemní plyn</a></h2>
<div class="level2">

<p>
V oblasti těžby ropy a zásob obecně se nic moc nezměnilo. Jasně se ukázalo, jak strategickou surovinou je ropa zejména v souvislosti s problémy v Libyi. Libye ač malý, přesto poměrně důležitý producent velmi kvalitní ropy se stal centrem zájmu USA a zejména evropských zemí. Politické a sociální důvody uváděné jako důvod ozbrojené intervence jsou zejména u evropských států jasnou přetvářkou, protože mnohem horší a krvavější diktatura v Sýrii jim stojí maximálně za vydání rezoluce a &quot;vyjádření znepokojení&quot; nad chováním Syrského režimu.
</p>

<p>
V souvislosti s výpadkem produkce v Libyi se také ukázalo, že se zásobami Saudské Arábie, které jsou &quot;krví&quot; celé západní civilizace to může být všelijaké. Žádné zásadní navýšení produkce se po výpadcích v Libyi nekonalo. Je proto velkou otázkou, jak se produkce SA bude chovat v dalších měsících a letech. Pokud by došlo k nějakému propadu signalizujícímu peak oil v Saudské Arábii, tak by se konec dnešní západní civilizace velmi přiblížil a <a href="http://ourfiniteworld.com/2011/12/05/saudi-arabia-headed-for-a-downfall" class="urlextern" title="http://ourfiniteworld.com/2011/12/05/saudi-arabia-headed-for-a-downfall"> tyto signály</a> už se začínají objevovat
</p>

<p>
V posledních měsících bylo vidět poměrně velké haló ohledně břidlicového plynu, který podle mnohých skrývá novou energetickou spásu a nezávislost zejména pro USA, ale i pro další země. Je to nesmysl a jen další masáž masmédií, která má zakrýt hloubku problému s energií, který dnešní civilizace neumí řešit. Břidlicový plyn je nadějí, že dopady peak oil by nemusely být tak tragické a přináší další možnosti v substituci ropy, ale určitě nepřináší žádné definitivní řešení konce éry levné energie.
</p>

</div>

<h2 class="heading2"><a name="headerId1" id="headerId1">ekonomika</a></h2>
<div class="level2">

<p>
 Ekonomické problémy tento rok zejména v Evropě udeřily v plné síle. Nejen že se žádné ekonomické oživení nekoná, ale naopak balancujeme na kraji rozpadu Eurozóny, krachu bankovního sektory, a jiných naprosto katastrofálních scénářů. A to prosím jen 3 roky po recesi v roce 2008. Přijatá opatření nemají účinnost a dnes už snad nikdo nehovoří o tom, že v dalších letech bude po ekonomické stránce lépe. Platí to samozřejmě i pro naši zem. Zvýšení DPH a stagnace mezd povede k útlumu poptávky, krachům firem a zvyšování nezaměstnanosti. Jestli se pak ještě přidá škrcení sociálního státu, omezování počtu policistů, tak se připravme na zvyšování kriminality a násilí na ulicích.
</p>

<p>
Nejhorší je, že není vůbec jisté, co se vlastně v Evropě stane. To je pro nás jako exportní ekonomiku zejména ve vztahu k Německu zásadní. Krachy Eura by vyústily v problémy v bankách, deflaci a pokud by se bankovní sektor zhroutil o úspory přijdeme, pojištění nepojištění. Pokud ECB začne se záchrannými plány, nastoupí zvyšující se inflace, která úspory znehodnotí. Ani jedna perspektiva není dobrá.
</p>

</div>

<h2 class="heading2"><a name="headerId2" id="headerId2">ekologie, životní podmínky</a></h2>
<div class="level2">

<p>
 Příchod klimatické změny je jistotou, známé jsou i velmi negativní důsledky, které ji budou provázet. Bohužel aktuální situace ve světě nepřeje vůbec tomu, aby jsme jako lidstvo mohli negativnímu působení klimatických změn čelit, zejména snižováním emisí, podporou šetrných technologií, změnám krajiny atd. Dopady změn v podobě záplav, sucha, neúrody, nedostatku potravin, obrovských migrací, budou proto velmi tvrdé a bohužel dopadnou nejvíce na ty nejchudší obyvatele planety.
</p>

</div>

<h2 class="heading2"><a name="headerId3" id="headerId3">změna</a></h2>
<div class="level2">

<p>
 Energetické a ekonomické problémy spolu do velké míry souvisí a působí spolu negativně na celou společnost. Důsledky působení těchto sil na kapitalistickou společnost vyúsťují v omezování sociálního státu, principů solidarity a zvyšují míru sociální nerovnosti. V situaci, kdy se svět blíží svým energetickým limitům, se začínají projevovat limity růstu a bez růstu není možná existence kapitalistických demokratických států tak jak je dnes známe. Změna tak bude muset dříve či později přijít. Od současných vlád a státní moci to nebude, ty jsou závislé na nadnárodním kapitálu a prorostlé korupcí a budou se jakékoli změně bránit co to dá.
</p>

<p>
Jedinou nadějí je podle mne změna k nějakým udržitelným společenstvím, která budou žít na zcela jiných principech, než co jsme zatím poznali. Tato nová společnost musí úplně redefinovat vztah člověka k zemi, přírodě a všemu živému. A to podotýkám, že nejsem žádný ekolog. Dosavadní život člověka od pravěku - kultura lidského společenství - není nic jiného než neustálý boj s přírodou, který nelze nikdy vyhrát, vždy musí skončit katastrofou. Žádná forma lidského společenství toto nezměnila ať už feudálně diktátorská, kapitalistická, komunistická a nakonec demokraticko kapitalistická. Potřebujeme poznat a pochopit vznik a průběh dosavadního konfliktu lidské kultury s přírodou a nastavit jiný řád, život lidského společenství musíme podřídit prosperitě biosféry. V této společnosti je pak možné udržet obyvatelnost Země a vstoupit do věku dospělosti a odpovědnosti.
</p>

<p>
Poslední věty jsem převzal z <a href="http://www.blisty.cz/art/60890.html" class="urlextern" title="http://www.blisty.cz/art/60890.html"> článku </a> J. Šmajse, který doporučuji každému k přečtení. Nezbývá než jen doufat, že se lidé pokusí poznat svou podstatu a změnit své chování co nejdříve, čas se krátí. 
</p>

</div>

            ]]></content:encoded>
            <guid isPermaLink="false">article-103@https://www.mirin.cz/</guid>
        </item>
        <item>
            <title>Ternární operátor v 5.4 vylepšen</title>
            <pubDate>Thu, 03 Nov 2011 13:23:27 +0100</pubDate>
            <link>https://www.mirin.cz/blog/ternarni-operator-v-54-vylepsen</link>
            <description>
Před nedávnem vyšla beta 2 PHP 5.4 a přinesla další zajímavá vylepšení. Jedno  z nich je callable type hint a druhé - světe div se - je vylepšení výkonosti funkce ternárního operátoru.
</description>
            <content:encoded><![CDATA[

<p>
Před nedávnem vyšla beta 2 <acronym title="Hypertext Preprocessor">PHP</acronym> 5.4 a přinesla další zajímavá vylepšení. Jedno  z nich je callable type hint a druhé - světe div se - je vylepšení výkonosti funkce ternárního operátoru.
</p>

<p>
O problému s ternárním operátorem jsem <a href="https://www.mirin.cz//blog/ternarni-operator-muze-byt-velka-brzda" class="internallink"> psal</a>. A voalá, co se nestalo, Arnaud Le Blanc konečně commitnul poměrně monstrózní  <a href="https://github.com/php/php-src/commit/8bdb7a0a5c5466aec576c13f3af9c1a6cacdb35c" class="urlextern" title="https://github.com/php/php-src/commit/8bdb7a0a5c5466aec576c13f3af9c1a6cacdb35c"> patch</a>, mimo jiné i do virtuálního stroje, který upravuje chování pole v ternárním operátoru, takže  už by se pole nemělo pokaždé kopírovat. Extra jsem to netestoval, takže nevím, zda problém s velkými řetězci stále trvá, ale tipnul bych si že ano. Mimochodem <a href="https://github.com/php/php-src/" class="urlextern" title="https://github.com/php/php-src/"> mirror zdrojových kódů php-src</a> na githubu už nějakou delší dobu zase funguje.
</p>

<p>
Další příjemné vylepšení je zavedení nového type hintu <strong>callable</strong> - viz.  <a href="https://wiki.php.net/rfc/callable" class="urlextern" title="https://wiki.php.net/rfc/callable"> rfc na wiki</a>. Pokud nějaká vaše metoda nebo funkce má mít jako parametr callback, tak ho budete moci pomocí tohoto nového type hintu vynutit. Jistě příjemné pro tvůrce knihoven a frameworků.
</p>

<p>
Aktualizace: V php internals mailing listu bylo potvrzeno, že úprava chování ternárního operátoru se týká jak polí, tak řetězců, takže sláva. 
</p>

            ]]></content:encoded>
            <guid isPermaLink="false">article-102@https://www.mirin.cz/</guid>
        </item>
    </channel>
</rss>