Uvědomuji si, že jsem se zabývám programováním už 28 let. Ano, bylo to ZX Spectrum, pokud vás to zajímá. Ve 14ti letech jsem si začal hrát s Basicem, pak jsem rychle přešel k assembleru, Pascalu, následovalo Céčko, …, až jsem nakonec na dlouhou dobu zakotvil u Javy, která mě živí.
Poslední dobou se nemůžu zbavit pocitu, že v některých oblastech stále používáme způsoby a koncepty programování, které nejsou hodny možností dnešních technologií. Dovolím si uvést pár příkladů, které mě nejvíc dráždí.
Při tvorbě softwaru si občas připadám hloupě, protože většinu času programuju některou z těchto oblastí: ukládání dat, načítání dat, přenášení dat nebo konverze dat. Jsem v tu chvíli degradován na jakéhosi vidláka, který nepřehazuje hnůj, ale nuly a jedničky. Sedím pak u notebooku a v podstatě se nudím, protože se musím soustředit na to, abych neudělal syntaktickou chybu v SQL selectu a abych dobře poskládal data do řady.
Proč není možné mít podporu persistence přímo v programovacím jazyku? Na to se ptám už minimálně 5 let. Pokud si tady začnu vymýšlet virtuální Javu mých snů, tak bych chtěl mít možnost napsat tohle:
persistent Company mojeFirma;
if (mojeFirma == null) mojeFirma = new Company(“Firma s.r.o.”);
Dostal bych proměnnou mojeFirma a v ní bych měl uložený objekt Company tak dlouho, jak bych jen potřeboval. Nechci také mazat data z žádné databáze. V okamžiku, kdy bych udělal tohle:
mojeFirma = null;
tak by objekt s textem “Firma s.r.o.” zmizel, protože by na něj nebyl žádný odkaz. Fungoval by prostě jakýsi garbage collector, ale ne jen pro RAM paměť, ale prostě pro paměť jako takovou. Čímž se vlastně dostávám k problému, který se týká neustálého rozlišování volatilní rychlé paměti a permanentní pomalé paměti. Já fakt nechci neustále přehazovat data mezi dvěma typy pamětí.
Dle mého názoru musí SQL databáze (v podobě, v jaké je známe dnes) vychcípat. Když se nad tím zamyslíte, tak v oblasti ukládání dat děláme pořád to, co jsme v RAM paměti přestali dělat před 15ti lety. Když chceme uložit objekt Address do databáze, tak si napřed musíme nachystat skrukturu ( create table), pak to tam vložit ( insert) a až to nepotřebujeme, tak musíme myslet na odstranění záznamu ( delete). Já už hodně dlouho nemusím řešit uvolňování RAM paměti, tak proč to musím řešit jinde?
Práce s SQL databází mi připomíná low-level práci s přidělováním paměti. Zjistíte si, jak je velká struktura, pak si přidělíte pole bytů, nakopírujete tam data a po skončení pole uvolníte.
Dál tuhle kapitolku asi nemá cenu rozvádět. Jako programátor chci pouze přemýšlet o tom, který objekt si chci nechat na delší dobu a který potřebuju jen dočasně. Nechci přemýšlet o volatilní a ne-volatilní paměti.
Komunikace po síti je networ, se kterým nechci neustále bojovat. Je to vlastně podobný problém. Proč bych měl řešit, jestli se nějaký kus dat nachází na lokálním heapu a nebo někde jinde na jiném stroji. Co, kdyby šlo třeba napsat:
mojeFirma = new Company();
a jako programátoři byste nemuseli řešit, kde jsou data fyzicky uložena. Všichni dobře víme, že proměnná je ve skutečnosti ukazatel do nějaké paměti. Proč nemůže existovat univerzální ukazatel (pointer), který by byl schopen adresovat data v RAMce, na disku nebo někde v oblacích.
Ano, uvědomuji si, že odstínění programátora od konceptu disku nebo sítě přináší nové výzvy, ale domnívám se, že i ty jsou uspokojivě řešitelné. Jako programátoři jsme zvyklí, že řádek:
speed = maxSpeed / 2;
nemůže vyhodit žádnou výjimku. Pokud ale bude možné, že maxSpeed je kus dat v cloudu nebo na nějakém jiném zařízení, tak může klidně nastat IO error. Stejně tak je trochu problém, že nemůžeme udělat žádný předpoklad o tom, jak rychle tento příkaz proběhne a tím pádem se dostávám k dalšímu bodu.
Jako programátoři jsme zvyklí neustále pracovat sekvenčně a synchronně. Jelikož jsem už ve 14ti letech psal na ZX Spectru v assembleru, tak si dokážu představit, co procesor dělá, když se napíše:
speed = maxSpeed/2;
CPU vezme integer z RAMky, kam ukazuje pointer maxSpeed a uloží jej do registru, tam udělá shift, čím jej podělí dvěma a obsah registru přesune do RAMky na místo, kde ukazuje speed. Celá operace se provede za 35 nanomžiků. Pokud po tomto řádku dojde ke změně proměnné maxSpeed, na speed už to nemá žádný vliv.
Mozek takhle nefunguje, protože příroda možná sama vyhodnotila, že to je stupidní způsob. Pokud bychom měli v mozku dva neurony s názvem maxSpeed a speed, určitě by se neuron speed neptal neustále toho předchozího, jestli se nezměnil stav. Všechna data jsou tlačena dopředu, nikoliv tahána zezadu. Jakmile je neuron maxSpeed excitován, okamžitě informuje následující neuron, který provede dělení dvěma a hned pošle neuronu speed nový výsledek. Mozek prostě pracuje jen když musí.
Když šlápneme bosou nohou na kus skla, tak noha prostřednictvím nervů vyšle do mozku “event” a mozek ihned reaguje. Kdyby byl Bůh programátor, tak by mozek možná fungoval takhle:
do {
Connection con = Noha.connect();
PainStatus ps = con.readPainStatus();
if (ps.isPain()) { sayAu(); }
Thread.sleep(100);
} while (true);
To by Bůh pěkně podělal, protože se tam nezavírá con. Když se vrátím zpátky k počítačům a nechám mozek stranou, tak se teď pokusím vysvětlit, co je dle mého názoru správný způsob. Řádek
speed = maxSpeed/2;
by neměl být vnímán jako jednorázová operace, ale spíše jako vytvoření malinké asynchronní sítě, která spojuje uzel maxSpeed s uzlem dělení a dále na uzel speed. Uzel maxSpeed může být klidně persistentní hodnota na jiném stroji v cloudu a když jiný klient zapíše do maxSpeed nové číslo, chci aby se mi automaticky změnilo to, co je v uzlu speed. Když udělám webovou stránku, ve které budu mít napsáno tohle:
<div>Vaše rychlost je <b>{{speed}}</b> km/h</div>
tak se mi s přiměřenou prodlevou projeví změna v browseru. Jenom se musím postarat, aby browser věděl, co je speed.
Programy, které teď běžně píšeme, vlastně dělají opakovaně tuto posloupnost:
Takhle se dneska běžně programuje a inteligentnost celého řešení bych přiblížil následující metaforou:
Naštěstí v oblasti, o které mluvím v tomto budě se už začíná něco dít. Doufám, že funkcionální programování a tzv. reaktivní programování nás posune správným směrem.
Snad se dočkám toho, že přestaneme přešmodrchávat data mezi diskem, pamětí a sítí. Doufám, že za deset let už nebudu muset trávit čas tím, že budu řešit, jak z SQL dat udělat objekty, ty pak předělat na JSON, ten pak přesunout přes HTTP(s) a pak z toho zase vyrobit jiné objekty a z těch zase udělat DOM, atd.
Smrt SQL. Smrt HTTP. :-)
Programováním se zabývám trochu kratší dobu, ale zřejmě jste se nezabýval programováním dostatečně.
1) Persistence přímo v programovacím jazyku funguje. Račte se pěkně prosím seznámit s programovacím jazykem Smalltalk, který pracuje podobně jak o tom sníte z hlediska persistence.
2) Networking přes (dokonce paměťové pointery) už je také řadu desetiletí vyřešený, a to technologiemi zvanými ORB (Object Request Broker). Například známá je CORBA, byť starší provenience. Ale stejně funguje třeba Windowsovské DCOM.
Nutno podotknout, že mikrokernelové operační systémy fungují na několika počítačích najednou, třeba na celé síti už z podstaty, a komunikace mezi počítači je naprosto přirozená. Kromě zastaralých konceptů, jako je monolitický Linux či trochu lépe navržené Windows, jde budoucnost spíše směrem mikrokernelu. Například QNX, wxWorks, Plan9, atd.
3) Ohledně tahání dat versus tlačení. Myslím, že za 28 let byste mohl pochopit naprostý základ, a to že existují imperativní programovací jazyky, kde to musíte tlačit, a pak procedurální programovací jazyky, kde se data sama táhnou. Počet imperativních a počet procedurálních programovacích jazyků je tak půl na půl.
Dále už jsem nečetl. Spíše mi přijde, že autor zná jen Javu a z toho usuzuje.
Chybí základy programátorských znalostí
Máte úplnou pravdu, zcela souhlasím. Ono, nechť to autor přijme jako konstruktivní, byť je to od člověka, který "tahal kačera v době, kdy on už programoval (pro) MacOS", ale:
1) Java vznikla v roce 1998, takže má své nedostatky, které se bohužel ukázaly až časem a s nimi v rozjetém vlaku toho už mnoho nenaděláte, když jsou hotové aplikace. Viz například JAR balíčky a jejich verzování. Hotová lahůdka udržet to v nějakém souladu a přehledu. Program složený z komponent třetích stran, kde jedna využívá verzi 1, druhá verzi 2, třetí verzi 1.1., atp.. Zkrátka Windows má DLL hell, Java zase JAR hell, bohužel, nemůžu si pomoci. Ostatně i proto v Javě programuji jen velmi nerad a jen, když se jí nemůžu vyhnout.
2) Persistence opravdu funguje v řadě jazyků, možná to chce jinou technologii, která toto podporuje. I když, řekl bych, že i Java už tohle podporuje.
3) Pokud jde o SQL databáze a manipulace s SQL daty, zajisté jste slyšel o (dynamicky generovaných) objektových datových rámcích, například nHibernate. Má sice svou značnou režii, ale nebudete se muset tolik dřít s funkcemi, objekty mapujícími DB tabulky, atd. Vše byste "tahal" a tvořil v diagramu a framework by se postaral o tvorbu na pozadí. Režie u NHibernate je (aspoň svého času byla) sice značně velká, ale používat se dá, když to ušetří práci.
Vy, programátoři v Javě, jste na vyšší paměťové nároky svých aplikací dozajista zvyklí. Kromě Data Manageru od Oracle jsem totiž neviděl žádnou, z hlediska práce se zdroji, efektivně napsanou aplikaci. Sotva se nahraje do paměti, hned máte minimálně 128 MB zabraných. Co to je? U .NETu je to obvykle u srovnatelné aplikace tak 1/4 tohoto, ale dá se s tím fungovat.
Pokud jde o SQL databáze, nečekejte, že se budou zásadně měnit. Jsou tu už dobrých 30 let nejméně. Rozšíření? Možná. Zásadní změny? Nepravděpodobné. Jestli se Vám nelíbí SQL databáze, zkuste noSQL databáze (http://cs.wikipedia.org/wiki/NoSQL), ale i tam, obávám se, budete aspoň někde potřebovat SQL. A ve výhyn SQL databází nedoufejte, nanejvýš ustoupí do menšiny oproti noSQL, ale ani to se možná nestane. Poměr obou typů bude podle mě někde 60 : 40 ve prospěch standardního SQL.
Pokud jde o tvorbu struktur, tak to je nezbytnost. Jak si to vlastně představujete? Že ta DB bude sama detekovat, jestli to a to mohu převést na číslo nebo datum? Jak pozná ze řetězce binární obsah? Jak pozná rozsahy datového typu? To je bude měnit pokaždé, co tam něco dáte? A když budete dávat různá data různých struktur, tak se bude rozšiřovat počet polí a dodávat NULL tomu, co zrovna v těch datech není nastaveno? Nereálné. Používejte tedy v takovém případě serializaci. MS.NET ji umí a Java taky. Pokud jde o SQL databázi, můžete použít i nějakou embedded - SQL Lite a podobně. Tam si tvořte, co jen chcete a protože je to souborové, dá se to i pohodlně smazat diskovou operací, až budou uzavřené handlery, vynulované pointery a uzavřená spojení.
4) Networking: tady není pomoci, Java je prostě Java a má řadu svých specifických tříd (.NET to má stejné) dědících z jedné nadřízené. Možná zkuste zvážit, zdali by nebyla použitelná ta nadřízená s pomocí přetypování. Nevím, jak postupujete, těžko se pak radí. Pokud Vám vadí testy na vyjímky, těm se také nevyhnete (nejen v Javě, ale kdekoli), má li program správně fungovat. Nevím, zkusil jste si třeba vytvořit třídu s proměnnými a specifickými get metodami, kde byste si podobné věci (sken po zařízeních, pamětech, heapu, atp.)? Napsal byste to jednou a revyužil v budoucnu v jiných projektech a měl byste později půl práce.
5) Tahání dat místo tlačení:
Pokud jde o dotazování, už nevím jak to bylo v Javě, ale v .NETu máte možnost "připojovat" funkce objektů na delegáta se shodným funkčním předpisem a poté, když objekt něco provede, aktivuje delegáta a tím i všechny na něj napojené funkce z cizích objektů. O vzoru Observer jste zajisté už musel slyšet (dávno dříve, než my jsme začali tahat toho kačera :-)). Neříkejte, že v Javě nejde provést obdobná věc.
6) To, že se v Javě dělají některé věci viditelně hůř než jinde, jak jste sám částečně naznačil, s tím se nedá nic dělat. Je to prostě jazyk, který byl ve svých začátcích na tu dobu převratný a často tehdy "dláždil" cestu jiným (například: MS.NET) a tím samozřejmě odkrýval nedokonalosti, slepé cesty, těžkopádná řešení, atp. To tak zkrátka je a každý jazyk/technologie se jednou přežije a musí nastoupit nová, která ty věci bude zvládat lépe a pružněji. To je vývoj.
6) Existuje řada (dynamicky typovaných a třeba i skriptovacích) jazyků, například Python, který Vám vezme řadu "sv*nstev" a "nezjančí" se z toho, jako Java, která zkrátka všude potřebuje try ... catch, aby ustála případné problematické stavy. Případně můžete použít všeobecný Exception a tu vyjímku "zahladit" prázdným obslužným blokem a pokračovat dál. Sprosté a dělat se to nemá, ale program bude fungovat i dál.
7) Jazyk nemusí být virtuální, vytvořte si svůj a udělejte všechny konstrukty tak, jak Vám vyhovují. Práce plno, běh na dlouhou trať a s každou verzí každého systému aby se to pomalu předělalo, ale pak budete spokojen. Pokud se do toho rozhodnete jít, klobouk dolů.
8) Jak byste nahradil HTTP, SQL, JSON a DOM? Jsou nějaké náhrady? Kromě XML nebo XSLT specifikace a XML z ní?
1. Co autora nutí pořád psát to samé SQL? Pokud jde jen o persistenci, může použít jednu z mnoha knihoven, napsat si vlastní dle svých představ, použít jiný prostředek komunikace než SQL atd.
2. Proč by mělo SQL brzo vychcípat? Na některé operace (např. komplikované dotazy nad množstvím dat, která nemohu přenášet po síti) je celkem dobré.
3. Univerzální ukazatel do sítě: URL tu už je hodně let, krom jiných metod. Má-li se síťový objekt chovat jako lokální, proč jej nepřipojit nějakým síťovým filesystémem? A na některé typy síťových objektů (SSH tunely apod.) to stejně nedává smysl.
4. Tahání: co brání autorovi psát kód tak, aby data tlačil, a při updatu položky vždy provedl i update těch závislých? Dělají to třeba tabulkové kalkulátory.
It is such a cool thing. Does anybody know where to buy it? I know the cool place where you can buy custom essays.
Luar biasa sekali informasinya,,,Ciri Atau Gejala Penyakit Meningitis Radang Selaput Otak
Di tunggu informasi bagus lainny ya gan Cara Mengatasi Nyeri Haid Dan Keputihan Dengan Cepat
Témata, do kterých si troufám kecat, jsou CRM (protože jedno dělám), zpravodajské agregátory (protože to dělám taky), řízení firmy (protože mám strach to nedělat – musím), jídlo (protože jej mám rád a občas o něm píšu), Apple (protože jsem programoval Mac ještě v době, kdy jste tahali kačera), Java (protože to je můj šálek kávy), webové technologie (protože bez nich by to teda nešlo), grafika a kreslení (protože bych na to chtěl mít víc času).
Warning
File: .../stable/php-libs/appShare/libs/Blogs/BlogsSelection.php:147
137: ->where("opinions.status = %s", "active") 138: ->orderBy("opinions.insert_date DESC") 139: ->limit($count); 140: $data = $query->fetchAll(); 141: foreach ($data as $row) { 142: $row->user_deleted = null; 143: if ($row->user_id) { 144: $user = dibi::getConnection('usersys') 145: ->query('SELECT * FROM users WHERE user_id = %i', $row->user_id) 146: ->fetch(); 147: $row->user_deleted = $user->deleted; 148: } 149: } 150: // ulozeni do CACHE 151: $cache->save($cacheKey, $data, array(
22: protected $commentsCount = 5; 23: 24: public function __construct($blogId = 0) { 25: $this->blogId = $blogId; 26: } 27: 28: public function render() { 29: if (!$this->blogId) return; 30: 31: // [future] Zrefaktorovat komponentu tak, aby se jí daly předávat závislosti 32: $this->getTemplate()->opinions = BlogsSelection::getLastOpinionsForBlog($this->blogId, $this->commentsCount, $this->getPresenter()->getContext()->getByType(CacheFactory::class), $this->getPresenter()->getContext()->getByType(Shared_Blogs_Helper::class)); 33: // render sablony zajisti predek 34: parent::render(); 35: } 36:
| $blogId | 1783
|
|---|---|
| $count | 5
|
| $cacheFactory | |
| $blogsHelper |
90: $control->setExtraParameters($parameters[\Shared_BaseComponent::EXTRA_PARAM_NAME]); 91: unset($parameters[\Shared_BaseComponent::EXTRA_PARAM_NAME]); 92: } else { 93: $control->clearExtraParameters(); 94: } 95: } 96: 97: if ($isDebug) { 98: // call method this way is much faster 99: // see http://grokbase.com/t/php/php-internals/115qyp1bjk/call-user-func-performance-and-dynamic-code 100: if (!$parameters) $control->$method(); 101: else call_user_func_array([$control, $method], array_values($parameters)); 102: return; 103: } 104:
87: ob_end_clean(); 88: } else { 89: echo ob_get_clean(); 90: } 91: } 92: ob_start(function () {}); 93: try { 94: echo '<div class="section section--sidebar-in">'; 95: ob_start(); 96: try { 97: IInfo\LatteMacros::renderControl("lastBlogComments", "render", [], $this->global->uiControl); 98: } finally { 99: $ʟ_ifc[3] = rtrim(ob_get_flush()) === ''; 100: } 101: echo '</div>
1: {extends '../@default.latte'} 2: 3: 4: {block sidebarMain-aboveWrapper} 5: {control footerInfo} 6: {/block} 7: 8: 9: {block sidebarMain-content} 10: <div class="page-block--actualities page-block design-box"> 11: {control blogAuthorInfo} 12: <div class="section section--sidebar-in" n:ifcontent>{control htmlBadges}</div> 13: <div class="section section--sidebar-in" n:ifcontent>{control mostReadBlogArticles}</div> 14: <div class="section section--sidebar-in" n:ifcontent>{control lastBlogComments}</div> 15: <div class="section section--sidebar-in" n:ifcontent>{control blogsLabelsTagcloud}</div>
| $control | |
|---|---|
| $method | 'render'
|
| $parameters | array (0)
|
| $container |
299: 300: if (!$block) { 301: $hint = ($t = Latte\Helpers::getSuggestion($this->getBlockNames($layer), $name)) 302: ? ", did you mean '$t'?" 303: : '.'; 304: $name = $layer ? "$layer $name" : $name; 305: throw new Latte\RuntimeException("Cannot include undefined block '$name'$hint"); 306: } 307: 308: $this->filter( 309: function () use ($block, $params): void { reset($block->functions)($params); }, 310: $mod, 311: $block->contentType, 312: "block $name" 313: );
| $ʟ_args | null
|
|---|
354: $block->functions = array_merge($block->functions, $functions); 355: } 356: 357: 358: /** 359: * @param string|\Closure|null $mod content-type name or modifier closure 360: */ 361: private function filter(callable $function, $mod, string $contentType, string $name): void 362: { 363: if ($mod === null || $mod === $contentType) { 364: $function(); 365: 366: } elseif ($mod instanceof \Closure) { 367: echo $mod($this->capture($function), $contentType); 368:
302: ? ", did you mean '$t'?" 303: : '.'; 304: $name = $layer ? "$layer $name" : $name; 305: throw new Latte\RuntimeException("Cannot include undefined block '$name'$hint"); 306: } 307: 308: $this->filter( 309: function () use ($block, $params): void { reset($block->functions)($params); }, 310: $mod, 311: $block->contentType, 312: "block $name" 313: ); 314: } 315: 316:
| $function | |
|---|---|
| $mod | null
|
| $contentType | 'html'
|
| $name | 'block sidebarMain-content'
|
89: public function blockSidebarMain_adverts_sticky_1(array $ʟ_args): void 90: { 91: extract($this->params); 92: extract($ʟ_args); 93: unset($ʟ_args); 94: echo '<div class="page-block--ad_square1 page-block design-box"> 95: '; 96: IInfo\LatteMacros::renderControl("ad", "render", ['sidebar-sticky-1'], $this->global->uiControl); 97: $this->renderBlock('sidebarMain-adverts--sticky-1-aditional-content', get_defined_vars()) /* line 13 */; 98: echo "\n"; 99: $this->renderBlock('sidebarMain-content', get_defined_vars()) /* line 14 */; 100: echo ' 101: </div> 102: '; 103: }
4: 5: {block content}{* [future] possibly remove this block completely since the layout (DOM structure) of all pages should be the same. difference(s) should be present in CSS if needed *} 6: <div id="sidebar" class="js-sticker-wrapper sidebar layout-columns__item--sidebar layout-columns__item design-sidebar design-tile--version-2 design-tile"> 7: 8: {block sidebarMain-adSidebarPartner} 9: {control ad 'sidebar-partner'} 10: {/block} 11: 12: {block sidebarMain-aboveContent}{/block} 13: 14: <div class="js-sticker-wrapper__items"> 15: {block sidebarMain-adverts--sticky-1} 16: <div class="page-block--ad_square1 page-block design-box"> 17: {control ad 'sidebar-sticky-1'} 18:
| $name | 'sidebarMain-content'
|
|---|---|
| $params |
299: 300: if (!$block) { 301: $hint = ($t = Latte\Helpers::getSuggestion($this->getBlockNames($layer), $name)) 302: ? ", did you mean '$t'?" 303: : '.'; 304: $name = $layer ? "$layer $name" : $name; 305: throw new Latte\RuntimeException("Cannot include undefined block '$name'$hint"); 306: } 307: 308: $this->filter( 309: function () use ($block, $params): void { reset($block->functions)($params); }, 310: $mod, 311: $block->contentType, 312: "block $name" 313: );
| $ʟ_args | null
|
|---|
354: $block->functions = array_merge($block->functions, $functions); 355: } 356: 357: 358: /** 359: * @param string|\Closure|null $mod content-type name or modifier closure 360: */ 361: private function filter(callable $function, $mod, string $contentType, string $name): void 362: { 363: if ($mod === null || $mod === $contentType) { 364: $function(); 365: 366: } elseif ($mod instanceof \Closure) { 367: echo $mod($this->capture($function), $contentType); 368:
302: ? ", did you mean '$t'?" 303: : '.'; 304: $name = $layer ? "$layer $name" : $name; 305: throw new Latte\RuntimeException("Cannot include undefined block '$name'$hint"); 306: } 307: 308: $this->filter( 309: function () use ($block, $params): void { reset($block->functions)($params); }, 310: $mod, 311: $block->contentType, 312: "block $name" 313: ); 314: } 315: 316:
| $function | |
|---|---|
| $mod | null
|
| $contentType | 'html'
|
| $name | 'block sidebarMain-adverts--sticky-1'
|
47: extract($ʟ_args); 48: unset($ʟ_args); 49: echo '<div id="sidebar" class="js-sticker-wrapper sidebar layout-columns__item--sidebar layout-columns__item design-sidebar design-tile--version-2 design-tile"> 50: '; 51: $this->renderBlock('sidebarMain-adSidebarPartner', get_defined_vars()) /* line 5 */; 52: echo "\n"; 53: $this->renderBlock('sidebarMain-aboveContent', get_defined_vars()) /* line 8 */; 54: echo ' 55: <div class="js-sticker-wrapper__items"> 56: '; 57: $this->renderBlock('sidebarMain-adverts--sticky-1', get_defined_vars()) /* line 10 */; 58: echo "\n"; 59: $this->renderBlock('sidebarMain-adverts--sticky-2', get_defined_vars()) /* line 28 */; 60: echo "\n"; 61: $this->renderBlock('sidebarMain-adverts--sticky-3', get_defined_vars()) /* line 36 */;
1: {block sidebar__default--columnMainAdditionalContent}{/block} 2: </div> {* for "layout-columns" and related to $isLayoutPageColumnsClosed in "@footer--RootLike.latte" *} 3: 4: 5: {block content}{* [future] possibly remove this block completely since the layout (DOM structure) of all pages should be the same. difference(s) should be present in CSS if needed *} 6: <div id="sidebar" class="js-sticker-wrapper sidebar layout-columns__item--sidebar layout-columns__item design-sidebar design-tile--version-2 design-tile"> 7: 8: {block sidebarMain-adSidebarPartner} 9: {control ad 'sidebar-partner'} 10: {/block} 11: 12: {block sidebarMain-aboveContent}{/block} 13: 14: <div class="js-sticker-wrapper__items"> 15: {block sidebarMain-adverts--sticky-1}
| $name | 'sidebarMain-adverts--sticky-1'
|
|---|---|
| $params |
299: 300: if (!$block) { 301: $hint = ($t = Latte\Helpers::getSuggestion($this->getBlockNames($layer), $name)) 302: ? ", did you mean '$t'?" 303: : '.'; 304: $name = $layer ? "$layer $name" : $name; 305: throw new Latte\RuntimeException("Cannot include undefined block '$name'$hint"); 306: } 307: 308: $this->filter( 309: function () use ($block, $params): void { reset($block->functions)($params); }, 310: $mod, 311: $block->contentType, 312: "block $name" 313: );
| $ʟ_args | null
|
|---|
354: $block->functions = array_merge($block->functions, $functions); 355: } 356: 357: 358: /** 359: * @param string|\Closure|null $mod content-type name or modifier closure 360: */ 361: private function filter(callable $function, $mod, string $contentType, string $name): void 362: { 363: if ($mod === null || $mod === $contentType) { 364: $function(); 365: 366: } elseif ($mod instanceof \Closure) { 367: echo $mod($this->capture($function), $contentType); 368:
302: ? ", did you mean '$t'?" 303: : '.'; 304: $name = $layer ? "$layer $name" : $name; 305: throw new Latte\RuntimeException("Cannot include undefined block '$name'$hint"); 306: } 307: 308: $this->filter( 309: function () use ($block, $params): void { reset($block->functions)($params); }, 310: $mod, 311: $block->contentType, 312: "block $name" 313: ); 314: } 315: 316:
| $function | |
|---|---|
| $mod | null
|
| $contentType | 'html'
|
| $name | 'block content'
|
13: public function main(): array 14: { 15: extract($this->params); 16: if ($this->getParentName()) { 17: return get_defined_vars(); 18: } 19: $this->renderBlock('sidebar__default--columnMainAdditionalContent', get_defined_vars()) /* line 1 */; 20: echo ' 21: </div> 22: '; 23: $this->renderBlock('content', get_defined_vars()) /* line 3 */; 24: return get_defined_vars(); 25: } 26: 27:
1: {block sidebar__default--columnMainAdditionalContent}{/block} 2: </div> {* for "layout-columns" and related to $isLayoutPageColumnsClosed in "@footer--RootLike.latte" *} 3: 4: 5: {block content}{* [future] possibly remove this block completely since the layout (DOM structure) of all pages should be the same. difference(s) should be present in CSS if needed *} 6: <div id="sidebar" class="js-sticker-wrapper sidebar layout-columns__item--sidebar layout-columns__item design-sidebar design-tile--version-2 design-tile"> 7: 8: {block sidebarMain-adSidebarPartner} 9: {control ad 'sidebar-partner'} 10: {/block} 11: 12: {block sidebarMain-aboveContent}{/block} 13: 14: <div class="js-sticker-wrapper__items"> 15: {block sidebarMain-adverts--sticky-1}
| $name | 'content'
|
|---|---|
| $params |
161: /** 162: * Renders template. 163: * @internal 164: */ 165: public function render(?string $block = null): void 166: { 167: $level = ob_get_level(); 168: try { 169: $this->prepare(); 170: if (!$this->doRender($block)) { 171: $this->main(); 172: } 173: 174: } catch (\Throwable $e) { 175: while (ob_get_level() > $level) {
193: 194: if ($this->referenceType === 'import') { 195: if ($this->parentName) { 196: throw new Latte\RuntimeException('Imported template cannot use {extends} or {layout}, use {import}'); 197: } 198: 199: } elseif ($this->parentName) { // extends 200: ob_start(function () {}); 201: $this->params = $this->main(); 202: ob_end_clean(); 203: $this->createTemplate($this->parentName, $this->params, 'extends')->render($block); 204: 205: } elseif ($block !== null) { // single block rendering 206: $this->renderBlock($block, $this->params); 207:
| $block | null
|
|---|
160: 161: /** 162: * Renders template. 163: * @internal 164: */ 165: public function render(?string $block = null): void 166: { 167: $level = ob_get_level(); 168: try { 169: $this->prepare(); 170: if (!$this->doRender($block)) { 171: $this->main(); 172: } 173: 174: } catch (\Throwable $e) {
| $block | null
|
|---|
53: $this->createTemplate(IInfo\LatteMacros::getTemplateDestination('sidebar/ArchiveModule/actualities.latte', $this->getName(), false), ['isErrorPage' => $isErrorPage] + $this->getParameters(), "includeX")->render(); 54: } elseif ($isSidebarTypeArchiveLabelDetail) /* line 45 */ { 55: $this->createTemplate(IInfo\LatteMacros::getTemplateDestination('sidebar/ArchiveModule/detail.latte', $this->getName(), false), ['isErrorPage' => $isErrorPage] + $this->getParameters(), "includeX")->render(); 56: } elseif ($isSidebarTypeArticle) /* line 47 */ { 57: $this->createTemplate(IInfo\LatteMacros::getTemplateDestination('sidebar/TextModule/article.latte', $this->getName(), false), ['isErrorPage' => $isErrorPage] + $this->getParameters(), "includeX")->render(); 58: } elseif ($isSidebarTypeGeneralText) /* line 49 */ { 59: $this->createTemplate(IInfo\LatteMacros::getTemplateDestination('sidebar/TextModule/generalText.latte', $this->getName(), false), ['isErrorPage' => $isErrorPage] + $this->getParameters(), "includeX")->render(); 60: } elseif ($isSidebarTypeBlogs) /* line 51 */ { 61: $this->createTemplate(IInfo\LatteMacros::getTemplateDestination('sidebar/BlogsModule/shared.latte', $this->getName(), false), ['isErrorPage' => $isErrorPage] + $this->getParameters(), "includeX")->render(); 62: } elseif ($isSidebarTypeBlogsDetail) /* line 53 */ { 63: $this->createTemplate(IInfo\LatteMacros::getTemplateDestination('sidebar/BlogsModule/detail.latte', $this->getName(), false), ['isErrorPage' => $isErrorPage] + $this->getParameters(), "includeX")->render(); 64: } elseif ($isSidebarTypeBlogsIndex) /* line 55 */ { 65: $this->createTemplate(IInfo\LatteMacros::getTemplateDestination('sidebar/BlogsModule/index.latte', $this->getName(), false), ['isErrorPage' => $isErrorPage] + $this->getParameters(), "includeX")->render(); 66: } elseif ($isSidebarTypeDatabaseCatalog) /* line 57 */ { 67: $this->createTemplate(IInfo\LatteMacros::getTemplateDestination('sidebar/DatabaseNew/catalog.latte', $this->getName(), false), ['isErrorPage' => $isErrorPage] + $this->getParameters(), "includeX")->render();
1: {default $isSidebarTypeActuality = false} 2: {default $isSidebarTypeAnniversaryComics = false} 3: {default $isSidebarTypeArchiveActualities = false} 4: {default $isSidebarTypeArchiveLabelDetail = false} 5: {default $isSidebarTypeArticle = false} 6: {default $isSidebarTypeAwards = false} 7: {default $isSidebarTypeBlogs = false} 8: {default $isSidebarTypeBlogsDetail = false} 9: {default $isSidebarTypeBlogsIndex = false} 10: {default $isSidebarTypeConsultingDetail = false} 11: {default $isSidebarTypeConsultingQuestions = false} 12: {default $isSidebarTypeDatabaseCatalog = false} 13: {default $isSidebarTypeDatabaseView = false} 14: {default $isSidebarTypeDiscussionDetail = false} 15: {default $isSidebarTypeIndex = false}
161: /** 162: * Renders template. 163: * @internal 164: */ 165: public function render(?string $block = null): void 166: { 167: $level = ob_get_level(); 168: try { 169: $this->prepare(); 170: if (!$this->doRender($block)) { 171: $this->main(); 172: } 173: 174: } catch (\Throwable $e) { 175: while (ob_get_level() > $level) {
193: 194: if ($this->referenceType === 'import') { 195: if ($this->parentName) { 196: throw new Latte\RuntimeException('Imported template cannot use {extends} or {layout}, use {import}'); 197: } 198: 199: } elseif ($this->parentName) { // extends 200: ob_start(function () {}); 201: $this->params = $this->main(); 202: ob_end_clean(); 203: $this->createTemplate($this->parentName, $this->params, 'extends')->render($block); 204: 205: } elseif ($block !== null) { // single block rendering 206: $this->renderBlock($block, $this->params); 207:
| $block | null
|
|---|
160: 161: /** 162: * Renders template. 163: * @internal 164: */ 165: public function render(?string $block = null): void 166: { 167: $level = ob_get_level(); 168: try { 169: $this->prepare(); 170: if (!$this->doRender($block)) { 171: $this->main(); 172: } 173: 174: } catch (\Throwable $e) {
| $block | null
|
|---|
110: '; 111: IInfo\LatteMacros::renderControl("similarArticles", "render", [], $this->global->uiControl); 112: echo '</div> 113: '; 114: if (isset($opinionsListing) && $opinionsListing) /* line 80 */ { 115: $_HT_macro_arg = $opinionsListing /* line 81 */; 116: IInfo\LatteMacros::renderLazyControl($this->global->uiPresenter, $_HT_macro_arg, []); 117: } 118: echo '</div> 119: '; 120: $this->createTemplate(IInfo\LatteMacros::getTemplateDestination('../../../footer.latte', $this->getName(), false), ['isSidebarTypeBlogsDetail' => true] + $this->getParameters(), "includeX")->render(); 121: return get_defined_vars(); 122: } 123: 124:
1: {includeX '../../../header.latte'} 2: 3: 4: {includeShared '/common/additionalCssResolver.inc.latte', 5: isPageWithFancyBox => true, 6: } 7: {includeShared '/common/additionalJsResolver.inc.latte', 8: isPageWithEasing => true, 9: isPageWithMouseWheel => true, 10: isPageWithFancyBox => true, 11: } 12: 13: 14: <div class="design-tile--version-1 design-tile"> 15:
161: /** 162: * Renders template. 163: * @internal 164: */ 165: public function render(?string $block = null): void 166: { 167: $level = ob_get_level(); 168: try { 169: $this->prepare(); 170: if (!$this->doRender($block)) { 171: $this->main(); 172: } 173: 174: } catch (\Throwable $e) { 175: while (ob_get_level() > $level) {
193: 194: if ($this->referenceType === 'import') { 195: if ($this->parentName) { 196: throw new Latte\RuntimeException('Imported template cannot use {extends} or {layout}, use {import}'); 197: } 198: 199: } elseif ($this->parentName) { // extends 200: ob_start(function () {}); 201: $this->params = $this->main(); 202: ob_end_clean(); 203: $this->createTemplate($this->parentName, $this->params, 'extends')->render($block); 204: 205: } elseif ($block !== null) { // single block rendering 206: $this->renderBlock($block, $this->params); 207:
| $block | null
|
|---|
160: 161: /** 162: * Renders template. 163: * @internal 164: */ 165: public function render(?string $block = null): void 166: { 167: $level = ob_get_level(); 168: try { 169: $this->prepare(); 170: if (!$this->doRender($block)) { 171: $this->main(); 172: } 173: 174: } catch (\Throwable $e) {
| $block | null
|
|---|
92: 93: /** 94: * Renders template to output. 95: * @param object|mixed[] $params 96: */ 97: public function render(string $name, $params = [], ?string $block = null): void 98: { 99: $template = $this->createTemplate($name, $this->processParams($params)); 100: $template->global->coreCaptured = false; 101: ($this->probe)($template); 102: $template->render($block); 103: } 104: 105: 106: /**
| $block | null
|
|---|
40: /** 41: * Renders template to output. 42: */ 43: public function render(?string $file = null, array $params = []): void 44: { 45: Nette\Utils\Arrays::toObject($params, $this); 46: if (\cfg::$debug['tmplDump']) { 47: $filePath = strstr($file ? : $this->file, "templates/"); 48: echo '<pre class="nette-dump"><span class="nette-dump-object">' . get_class($this->control) . ": $filePath" . '</span></pre>'; 49: } 50: $this->latte->render($file ?: $this->file, $this); 51: } 52: 53: 54: /**
| $name | '/www/virtual/martin/stable/lupa/app/templates/BlogsModule/ArticleModule/Article/default.latte'
|
|---|---|
| $params |
40: return $this->source; 41: } 42: 43: 44: /** 45: * Sends response to output. 46: */ 47: public function send(Nette\Http\IRequest $httpRequest, Nette\Http\IResponse $httpResponse): void 48: { 49: if ($this->source instanceof Nette\Application\UI\Template) { 50: $this->source->render(); 51: 52: } else { 53: echo $this->source; 54: }
161: 162: Arrays::invoke($this->onPresenter, $this, $this->presenter); 163: $response = $this->presenter->run(clone $request); 164: 165: if ($response instanceof Responses\ForwardResponse) { 166: $request = $response->getRequest(); 167: goto process; 168: } 169: 170: Arrays::invoke($this->onResponse, $this, $response); 171: $response->send($this->httpRequest, $this->httpResponse); 172: } 173: 174: 175: public function processException(\Throwable $e): void
| $httpRequest | |
|---|---|
| $httpResponse |
80: } 81: 82: 83: /** 84: * Dispatch a HTTP request to a front controller. 85: */ 86: public function run(): void 87: { 88: try { 89: Arrays::invoke($this->onStartup, $this); 90: $this->processRequest($this->createInitialRequest()); 91: Arrays::invoke($this->onShutdown, $this); 92: 93: } catch (\Throwable $e) { 94: Arrays::invoke($this->onError, $this, $e);
| $request |
|---|
13: !empty($_SERVER["HTTPS"]), 14: 'http://forum.lupa.cz/', 15: trim(AppConfig::$modulesUrl['blogs'], '/'), 16: true 17: ); 18: $redirector->injectDibiConnections($bootstrap->getContext()->getService('dibiConnections')); 19: $redirector->redirectUrl(); 20: unset($redirector); 21: 22: $bootstrap->setupRouting(); 23: $bootstrap->getApplication()->run(); 24:
| HTTPS | 'on'
|
|---|---|
| SCRIPT_URL | '/bizwiz/co-me-sere-na-programovani/'
|
| SCRIPT_URI | 'http://blog-lupa-martin.imho.cz/bizwiz/co-me-sere-na-programovani/'
|
| TZ | 'Europe/Prague'
|
| HTTP_HOST | 'blog-lupa-martin.imho.cz'
|
| HTTP_ACCESS_CONTROL_ALLOW_ORIGIN | '*'
|
| HTTP_REFERRER_POLICY | 'no-referrer-when-downgrade'
|
| HTTP_X_REAL_IP | '216.73.216.123'
|
| HTTP_CONNECTION | 'close'
|
| HTTP_ACCEPT | '*/*'
|
| HTTP_USER_AGENT | 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)'
|
| HTTP_ACCEPT_ENCODING | 'gzip, br, zstd, deflate'
|
| HTTP_REFERER | 'https://blog-lupa-martin.imho.cz/bizwiz/co-me-sere-na-programovani'
|
| HTTP_COOKIE | 'tracy-session=8d692a5a69; _nss=1'
|
| HTTP_X_HTTPS | '1'
|
| PATH | '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
|
| LD_LIBRARY_PATH | '/opt/mozjpeg/lib64'
|
| SERVER_SIGNATURE | |
| SERVER_SOFTWARE | 'Apache/2.4.38 (Debian)'
|
| SERVER_NAME | 'blog-lupa-martin.imho.cz'
|
| SERVER_ADDR | '127.0.0.1'
|
| SERVER_PORT | '80'
|
| REMOTE_ADDR | '216.73.216.123'
|
| DOCUMENT_ROOT | '/www/virtual/martin/stable/lupa/document_root/'
|
| REQUEST_SCHEME | 'http'
|
| CONTEXT_PREFIX | ''
|
| CONTEXT_DOCUMENT_ROOT | '/www/virtual/martin/stable/lupa/document_root/'
|
| SERVER_ADMIN | '[no address given]'
|
| SCRIPT_FILENAME | '/www/virtual/martin/stable/lupa/document_root/index.php'
|
| REMOTE_PORT | '43644'
|
| GATEWAY_INTERFACE | 'CGI/1.1'
|
| SERVER_PROTOCOL | 'HTTP/1.0'
|
| REQUEST_METHOD | 'GET'
|
| QUERY_STRING | ''
|
| REQUEST_URI | '/bizwiz/co-me-sere-na-programovani/'
|
| SCRIPT_NAME | '/bizwiz/co-me-sere-na-programovani/'
|
| PHP_SELF | '/bizwiz/co-me-sere-na-programovani/'
|
| REQUEST_TIME_FLOAT | 1762312741.307472
|
| REQUEST_TIME | 1762312741
|
| __NF | Nette Session |
|---|
| Nette.Http.UserStorage/ | null
|
|---|
| APP_DIR | '/www/virtual/martin/stable/lupa/app'
|
|---|---|
| APP_LIB_DIR | '/www/virtual/martin/stable/lupa/app/libs'
|
| LIB_DIR | '/www/virtual/martin/stable/php-libs'
|
| APP_SHARED_DIR | '/www/virtual/martin/stable/php-libs/appShare'
|
| APP_SHARED_LIB_DIR | '/www/virtual/martin/stable/php-libs/appShare/libs'
|
| APP_TEMPLATE_DIR | '/www/virtual/martin/stable/lupa/app/templates'
|
| APP_SHARED_TEMPLATE_DIR | '/www/virtual/martin/stable/php-libs/appShare/templates'
|
| WWW_DIR | '/www/virtual/martin/stable/lupa/document_root'
|
| RAMDISK | '/mnt/ramdisk'
|
| WORK_DIR | '/www/virtual/martin/stable/lupa/work'
|
| CACHE_DIR | '/www/virtual/martin/stable/lupa/work/cache'
|
| NETTE_CACHE_DIR | '/www/virtual/martin/stable/lupa/work/cache.nette'
|
| LOCAL_CACHE_DIR | '/www/virtual/martin/stable/lupa/work/cache.local'
|
| CHARSET | 'utf-8'
|
| DB_CHARSET | 'utf8'
|
| DB_ERROR_DUPLICATE_ENTRY | 1062
|
| MYSQLI_REFRESH_REPLICA | 64
|
| HTMLPURIFIER_PREFIX | '/www/virtual/martin/stable/lupa/vendor/ezyang/htmlpurifier/library'
|
| GEOIP_COUNTRY_BEGIN | 16776960
|
| GEOIP_STATE_BEGIN_REV0 | 16700000
|
| GEOIP_STATE_BEGIN_REV1 | 16000000
|
| GEOIP_STANDARD | 0
|
| GEOIP_MEMORY_CACHE | 1
|
| GEOIP_SHARED_MEMORY | 2
|
| STRUCTURE_INFO_MAX_SIZE | 20
|
| DATABASE_INFO_MAX_SIZE | 100
|
| GEOIP_COUNTRY_EDITION | 1
|
| GEOIP_PROXY_EDITION | 8
|
| GEOIP_ASNUM_EDITION | 9
|
| GEOIP_NETSPEED_EDITION | 10
|
| GEOIP_REGION_EDITION_REV0 | 7
|
| GEOIP_REGION_EDITION_REV1 | 3
|
| GEOIP_CITY_EDITION_REV0 | 6
|
| GEOIP_CITY_EDITION_REV1 | 2
|
| GEOIP_ORG_EDITION | 5
|
| GEOIP_ISP_EDITION | 4
|
| SEGMENT_RECORD_LENGTH | 3
|
| STANDARD_RECORD_LENGTH | 3
|
| ORG_RECORD_LENGTH | 4
|
| MAX_RECORD_LENGTH | 4
|
| MAX_ORG_RECORD_LENGTH | 300
|
| GEOIP_SHM_KEY | 1329681409
|
| US_OFFSET | 1
|
| CANADA_OFFSET | 677
|
| WORLD_OFFSET | 1353
|
| FIPS_RANGE | 360
|
| GEOIP_UNKNOWN_SPEED | 0
|
| GEOIP_DIALUP_SPEED | 1
|
| GEOIP_CABLEDSL_SPEED | 2
|
| GEOIP_CORPORATE_SPEED | 3
|
| GEOIP_DOMAIN_EDITION | 11
|
| GEOIP_COUNTRY_EDITION_V6 | 12
|
| GEOIP_LOCATIONA_EDITION | 13
|
| GEOIP_ACCURACYRADIUS_EDITION | 14
|
| GEOIP_CITYCOMBINED_EDITION | 15
|
| GEOIP_CITY_EDITION_REV1_V6 | 30
|
| GEOIP_CITY_EDITION_REV0_V6 | 31
|
| GEOIP_NETSPEED_EDITION_REV1 | 32
|
| GEOIP_NETSPEED_EDITION_REV1_V6 | 33
|
| GEOIP_USERTYPE_EDITION | 28
|
| GEOIP_USERTYPE_EDITION_V6 | 29
|
| GEOIP_ASNUM_EDITION_V6 | 21
|
| GEOIP_ISP_EDITION_V6 | 22
|
| GEOIP_ORG_EDITION_V6 | 23
|
| GEOIP_DOMAIN_EDITION_V6 | 24
|
| CITYCOMBINED_FIXED_RECORD | 7
|
| FULL_RECORD_LENGTH | 50
|
| TEXY_ALL | true
|
| TEXY_NONE | false
|
| TEXY_CONTENT_MARKUP | |
| TEXY_CONTENT_REPLACED | |
| TEXY_CONTENT_TEXTUAL | |
| TEXY_CONTENT_BLOCK | |
| TEXY_VERSION | '2.9.3'
|
| TEXY_HEADING_DYNAMIC | 1
|
| TEXY_HEADING_FIXED | 2
|
| TEXY_CHAR | 'A-Za-z\x{C0}-\x{2FF}\x{370}-\x{1EFF}'
|
| TEXY_MARK | '\x14-\x1F'
|
| TEXY_MODIFIER | |
| TEXY_MODIFIER_H | |
| TEXY_MODIFIER_HV | |
| TEXY_IMAGE | |
| TEXY_LINK_URL | |
| TEXY_LINK | |
| TEXY_LINK_N | |
| TEXY_EMAIL | |
| TEXY_URLSCHEME | '[a-z][a-z0-9+.-]{0,20}:'
|
| Apache Version | Apache/2.4.38 (Debian) |
| Apache API Version | 20120211 |
| Server Administrator | [no address given] |
| Hostname:Port | lupa-martin.imho.cz:0 |
| User/Group | www-data(33)/33 |
| Max Requests | Per Child: 0 - Keep Alive: on - Max Per Connection: 100 |
| Timeouts | Connection: 300 - Keep-Alive: 5 |
| Virtual Server | Yes |
| Server Root | /etc/apache2 |
| Loaded Modules | core mod_so mod_watchdog http_core mod_log_config mod_logio mod_version mod_unixd mod_access_compat mod_alias mod_auth_basic mod_authn_core mod_authn_file mod_authz_core mod_authz_groupfile mod_authz_host mod_authz_user mod_autoindex mod_cache mod_cgi mod_deflate mod_dir mod_env mod_expires mod_fcgid mod_file_cache mod_filter mod_headers mod_include mod_mime prefork mod_negotiation mod_php mod_proxy mod_proxy_connect mod_proxy_fcgi mod_proxy_http mod_remoteip mod_reqtimeout mod_rewrite mod_setenvif mod_slotmem_shm mod_socache_shmcb mod_ssl mod_status mod_userdir |
| Directive | Local Value | Master Value |
|---|---|---|
| engine | On | On |
| last_modified | Off | Off |
| xbithack | Off | Off |
| Variable | Value |
|---|---|
| HTTPS | on |
| SCRIPT_URL | /bizwiz/co-me-sere-na-programovani/ |
| SCRIPT_URI | http://blog-lupa-martin.imho.cz/bizwiz/co-me-sere-na-programovani/ |
| TZ | Europe/Prague |
| HTTP_HOST | blog-lupa-martin.imho.cz |
| HTTP_ACCESS_CONTROL_ALLOW_ORIGIN | * |
| HTTP_REFERRER_POLICY | no-referrer-when-downgrade |
| HTTP_X_REAL_IP | 216.73.216.123 |
| HTTP_CONNECTION | close |
| HTTP_ACCEPT | */* |
| HTTP_USER_AGENT | Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com) |
| HTTP_ACCEPT_ENCODING | gzip, br, zstd, deflate |
| HTTP_REFERER | https://blog-lupa-martin.imho.cz/bizwiz/co-me-sere-na-programovani |
| HTTP_COOKIE | tracy-session=8d692a5a69; _nss=1 |
| HTTP_X_HTTPS | 1 |
| PATH | /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin |
| LD_LIBRARY_PATH | /opt/mozjpeg/lib64 |
| SERVER_SIGNATURE | <address>Apache/2.4.38 (Debian) Server at blog-lupa-martin.imho.cz Port 80</address> |
| SERVER_SOFTWARE | Apache/2.4.38 (Debian) |
| SERVER_NAME | blog-lupa-martin.imho.cz |
| SERVER_ADDR | 127.0.0.1 |
| SERVER_PORT | 80 |
| REMOTE_ADDR | 216.73.216.123 |
| DOCUMENT_ROOT | /www/virtual/martin/stable/lupa/document_root/ |
| REQUEST_SCHEME | http |
| CONTEXT_PREFIX | no value |
| CONTEXT_DOCUMENT_ROOT | /www/virtual/martin/stable/lupa/document_root/ |
| SERVER_ADMIN | [no address given] |
| SCRIPT_FILENAME | /www/virtual/martin/stable/lupa/document_root/index.php |
| REMOTE_PORT | 43644 |
| GATEWAY_INTERFACE | CGI/1.1 |
| SERVER_PROTOCOL | HTTP/1.0 |
| REQUEST_METHOD | GET |
| QUERY_STRING | no value |
| REQUEST_URI | /bizwiz/co-me-sere-na-programovani/ |
| SCRIPT_NAME | /bizwiz/co-me-sere-na-programovani/ |
| HTTP Request Headers | |
|---|---|
| HTTP Request | GET /bizwiz/co-me-sere-na-programovani/ HTTP/1.0 |
| Host | blog-lupa-martin.imho.cz |
| HTTP_X_FORWARDED_PROTO | https |
| Access-Control-Allow-Origin | * |
| Referrer-Policy | no-referrer-when-downgrade |
| X-Real-IP | 216.73.216.123 |
| Connection | close |
| accept | */* |
| user-agent | Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com) |
| accept-encoding | gzip, br, zstd, deflate |
| referer | https://blog-lupa-martin.imho.cz/bizwiz/co-me-sere-na-programovani |
| cookie | tracy-session=8d692a5a69; _nss=1 |
| X-HTTPS | 1 |
| HTTP Response Headers | |
| X-Powered-By | Nette Framework 3 |
| X-Frame-Options | SAMEORIGIN |
| Set-Cookie | _nss=1; path=/; secure; HttpOnly; SameSite=Strict |
| Vary | X-Requested-With,Accept-Encoding |
| Content-Security-Policy | upgrade-insecure-requests |
| Content-Encoding | gzip |
| Referrer-Policy | no-referrer-when-downgrade |
| Access-Control-Allow-Origin | * |
| Access-Control-Allow-Headers | * |
| Connection | close |
| Content-Type | text/html; charset=utf-8 |
| BCMath support | enabled |
| Directive | Local Value | Master Value |
|---|---|---|
| bcmath.scale | 0 | 0 |
| BZip2 Support | Enabled |
| Stream Wrapper support | compress.bzip2:// |
| Stream Filter support | bzip2.decompress, bzip2.compress |
| BZip2 Version | 1.0.6, 6-Sept-2010 |
| Calendar support | enabled |
| PHP Version | 8.0.30 |
| Directive | Local Value | Master Value |
|---|---|---|
| allow_url_fopen | On | On |
| allow_url_include | Off | Off |
| arg_separator.input | & | & |
| arg_separator.output | & | & |
| auto_append_file | no value | no value |
| auto_globals_jit | On | On |
| auto_prepend_file | no value | no value |
| browscap | no value | no value |
| default_charset | UTF-8 | UTF-8 |
| default_mimetype | text/html | text/html |
| disable_classes | no value | no value |
| disable_functions | pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, | pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, |
| display_errors | On | Off |
| display_startup_errors | Off | Off |
| doc_root | no value | no value |
| docref_ext | no value | no value |
| docref_root | no value | no value |
| enable_dl | Off | Off |
| enable_post_data_reading | On | On |
| error_append_string | no value | no value |
| error_log | no value | no value |
| error_prepend_string | no value | no value |
| error_reporting | 32767 | 22527 |
| expose_php | Off | Off |
| extension_dir | /usr/lib/php/20200930 | /usr/lib/php/20200930 |
| file_uploads | On | On |
| hard_timeout | 2 | 2 |
| highlight.comment | #998; font-style: italic | #FF8000 |
| highlight.default | #000 | #0000BB |
| highlight.html | #06B | #000000 |
| highlight.keyword | #D24; font-weight: bold | #007700 |
| highlight.string | #080 | #DD0000 |
| html_errors | Off | On |
| ignore_repeated_errors | Off | Off |
| ignore_repeated_source | Off | Off |
| ignore_user_abort | Off | Off |
| implicit_flush | Off | Off |
| include_path | .:/usr/share/php:/www/virtual/martin/stable/php-libs:/www/virtual/martin/stable/lupa/app/libs:/www/virtual/martin/stable/php-libs/appShare/libs | .:/usr/share/php |
| input_encoding | no value | no value |
| internal_encoding | no value | no value |
| log_errors | Off | On |
| log_errors_max_len | 1024 | 1024 |
| mail.add_x_header | Off | Off |
| mail.force_extra_parameters | no value | no value |
| mail.log | no value | no value |
| max_execution_time | 3600 | 3600 |
| max_file_uploads | 20 | 20 |
| max_input_nesting_level | 64 | 64 |
| max_input_time | 60 | 60 |
| max_input_vars | 1000 | 1000 |
| max_multipart_body_parts | -1 | -1 |
| memory_limit | 256M | 256M |
| open_basedir | no value | no value |
| output_buffering | 4096 | 4096 |
| output_encoding | no value | no value |
| output_handler | no value | no value |
| post_max_size | 128M | 128M |
| precision | 14 | 14 |
| realpath_cache_size | 4096K | 4096K |
| realpath_cache_ttl | 120 | 120 |
| register_argc_argv | Off | Off |
| report_memleaks | On | On |
| report_zend_debug | Off | Off |
| request_order | GP | GP |
| sendmail_from | no value | no value |
| sendmail_path | /usr/sbin/sendmail -t -i | /usr/sbin/sendmail -t -i |
| serialize_precision | -1 | -1 |
| short_open_tag | Off | Off |
| SMTP | localhost | localhost |
| smtp_port | 25 | 25 |
| sys_temp_dir | no value | no value |
| syslog.facility | LOG_USER | LOG_USER |
| syslog.filter | no-ctrl | no-ctrl |
| syslog.ident | php | php |
| unserialize_callback_func | no value | no value |
| upload_max_filesize | 128M | 128M |
| upload_tmp_dir | no value | no value |
| user_dir | no value | no value |
| user_ini.cache_ttl | 300 | 300 |
| user_ini.filename | .user.ini | .user.ini |
| variables_order | GPCS | GPCS |
| xmlrpc_error_number | 0 | 0 |
| xmlrpc_errors | Off | Off |
| zend.assertions | -1 | -1 |
| zend.detect_unicode | On | On |
| zend.enable_gc | On | On |
| zend.exception_ignore_args | Off | On |
| zend.exception_string_param_max_len | 0 | 0 |
| zend.multibyte | Off | Off |
| zend.script_encoding | no value | no value |
| zend.signal_check | Off | Off |
| ctype functions | enabled |
| cURL support | enabled |
| cURL Information | 7.64.0 |
| Age | 4 |
| Features | |
| AsynchDNS | Yes |
| CharConv | No |
| Debug | No |
| GSS-Negotiate | No |
| IDN | Yes |
| IPv6 | Yes |
| krb4 | No |
| Largefile | Yes |
| libz | Yes |
| NTLM | Yes |
| NTLMWB | Yes |
| SPNEGO | Yes |
| SSL | Yes |
| SSPI | No |
| TLS-SRP | Yes |
| HTTP2 | Yes |
| GSSAPI | Yes |
| KERBEROS5 | Yes |
| UNIX_SOCKETS | Yes |
| PSL | Yes |
| HTTPS_PROXY | Yes |
| MULTI_SSL | No |
| BROTLI | No |
| Protocols | dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, ldaps, pop3, pop3s, rtmp, rtsp, scp, sftp, smb, smbs, smtp, smtps, telnet, tftp |
| Host | x86_64-pc-linux-gnu |
| SSL Version | OpenSSL/1.1.1d |
| ZLib Version | 1.2.11 |
| libSSH Version | libssh2/1.8.0 |
| Directive | Local Value | Master Value |
|---|---|---|
| curl.cainfo | no value | no value |
| date/time support | enabled |
| timelib version | 2020.03 |
| "Olson" Timezone Database Version | 0.system |
| Timezone Database | internal |
| Default timezone | Europe/Berlin |
| Directive | Local Value | Master Value |
|---|---|---|
| date.default_latitude | 31.7667 | 31.7667 |
| date.default_longitude | 35.2333 | 35.2333 |
| date.sunrise_zenith | 90.833333 | 90.833333 |
| date.sunset_zenith | 90.833333 | 90.833333 |
| date.timezone | no value | no value |
| DOM/XML | enabled |
| DOM/XML API Version | 20031129 |
| libxml Version | 2.9.14 |
| HTML Support | enabled |
| XPath Support | enabled |
| XPointer Support | enabled |
| Schema Support | enabled |
| RelaxNG Support | enabled |
| EXIF Support | enabled |
| Supported EXIF Version | 0220 |
| Supported filetypes | JPEG, TIFF |
| Multibyte decoding support using mbstring | enabled |
| Extended EXIF tag formats | Canon, Casio, Fujifilm, Nikon, Olympus, Samsung, Panasonic, DJI, Sony, Pentax, Minolta, Sigma, Foveon, Kyocera, Ricoh, AGFA, Epson |
| Directive | Local Value | Master Value |
|---|---|---|
| exif.decode_jis_intel | JIS | JIS |
| exif.decode_jis_motorola | JIS | JIS |
| exif.decode_unicode_intel | UCS-2LE | UCS-2LE |
| exif.decode_unicode_motorola | UCS-2BE | UCS-2BE |
| exif.encode_jis | no value | no value |
| exif.encode_unicode | ISO-8859-15 | ISO-8859-15 |
| FFI support | enabled |
|---|
| Directive | Local Value | Master Value |
|---|---|---|
| ffi.enable | preload | preload |
| ffi.preload | no value | no value |
| fileinfo support | enabled |
| libmagic | 539 |
| Input Validation and Filtering | enabled |
| Directive | Local Value | Master Value |
|---|---|---|
| filter.default | unsafe_raw | unsafe_raw |
| filter.default_flags | no value | no value |
| FTP support | enabled |
| FTPS support | enabled |
| GD Support | enabled |
| GD headers Version | 2.3.3 |
| GD library Version | 2.2.5 |
| FreeType Support | enabled |
| FreeType Linkage | with freetype |
| GIF Read Support | enabled |
| GIF Create Support | enabled |
| JPEG Support | enabled |
| PNG Support | enabled |
| WBMP Support | enabled |
| XPM Support | enabled |
| XBM Support | enabled |
| WebP Support | enabled |
| BMP Support | enabled |
| TGA Read Support | enabled |
| Directive | Local Value | Master Value |
|---|---|---|
| gd.jpeg_ignore_warning | 1 | 1 |
| GetText Support | enabled |
| gmp support | enabled |
| GMP version | 6.1.2 |
| hash support | enabled |
| Hashing Engines | md2 md4 md5 sha1 sha224 sha256 sha384 sha512/224 sha512/256 sha512 sha3-224 sha3-256 sha3-384 sha3-512 ripemd128 ripemd160 ripemd256 ripemd320 whirlpool tiger128,3 tiger160,3 tiger192,3 tiger128,4 tiger160,4 tiger192,4 snefru snefru256 gost gost-crypto adler32 crc32 crc32b crc32c fnv132 fnv1a32 fnv164 fnv1a64 joaat haval128,3 haval160,3 haval192,3 haval224,3 haval256,3 haval128,4 haval160,4 haval192,4 haval224,4 haval256,4 haval128,5 haval160,5 haval192,5 haval224,5 haval256,5 |
| MHASH support | Enabled |
| MHASH API Version | Emulated Support |
| iconv support | enabled |
| iconv implementation | glibc |
| iconv library version | 2.28 |
| Directive | Local Value | Master Value |
|---|---|---|
| iconv.input_encoding | no value | no value |
| iconv.internal_encoding | no value | no value |
| iconv.output_encoding | no value | no value |
| igbinary support | enabled |
| igbinary version | 3.2.13 |
| igbinary APCu serializer ABI | 0 |
| igbinary session support | yes |
| Directive | Local Value | Master Value |
|---|---|---|
| igbinary.compact_strings | On | On |
| imagick module | enabled |
|---|---|
| imagick module version | 3.6.0 |
| imagick classes | Imagick, ImagickDraw, ImagickPixel, ImagickPixelIterator, ImagickKernel |
| Imagick compiled with ImageMagick version | ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org |
| Imagick using ImageMagick library version | ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org |
| ImageMagick copyright | © 1999-2019 ImageMagick Studio LLC |
| ImageMagick release date | 20190101 |
| ImageMagick number of supported formats: | 242 |
| ImageMagick supported formats | 3FR, 3G2, 3GP, AAI, AI, ART, ARW, AVI, AVS, BGR, BGRA, BGRO, BIE, BMP, BMP2, BMP3, BRF, CAL, CALS, CANVAS, CAPTION, CIN, CIP, CLIP, CMYK, CMYKA, CR2, CRW, CUR, CUT, DATA, DCM, DCR, DCX, DDS, DFONT, DJVU, DNG, DOT, DPX, DXT1, DXT5, EPDF, EPI, EPS, EPS2, EPS3, EPSF, EPSI, EPT, EPT2, EPT3, ERF, EXR, FAX, FILE, FITS, FRACTAL, FTP, FTS, G3, G4, GIF, GIF87, GRADIENT, GRAY, GRAYA, GROUP4, GV, H, HALD, HDR, HEIC, HISTOGRAM, HRZ, HTM, HTML, HTTP, HTTPS, ICB, ICO, ICON, IIQ, INFO, INLINE, IPL, ISOBRL, ISOBRL6, J2C, J2K, JBG, JBIG, JNG, JNX, JP2, JPC, JPE, JPEG, JPG, JPM, JPS, JPT, JSON, K25, KDC, LABEL, M2V, M4V, MAC, MAGICK, MAP, MASK, MAT, MATTE, MEF, MIFF, MKV, MNG, MONO, MOV, MP4, MPC, MPEG, MPG, MRW, MSL, MSVG, MTV, MVG, NEF, NRW, NULL, ORF, OTB, OTF, PAL, PALM, PAM, PANGO, PATTERN, PBM, PCD, PCDS, PCL, PCT, PCX, PDB, PDF, PDFA, PEF, PES, PFA, PFB, PFM, PGM, PGX, PICON, PICT, PIX, PJPEG, PLASMA, PNG, PNG00, PNG24, PNG32, PNG48, PNG64, PNG8, PNM, PPM, PREVIEW, PS, PS2, PS3, PSB, PSD, PTIF, PWP, RADIAL-GRADIENT, RAF, RAS, RAW, RGB, RGBA, RGBO, RGF, RLA, RLE, RMF, RW2, SCR, SCT, SFW, SGI, SHTML, SIX, SIXEL, SPARSE-COLOR, SR2, SRF, STEGANO, SUN, SVG, SVGZ, TEXT, TGA, THUMBNAIL, TIFF, TIFF64, TILE, TIM, TTC, TTF, TXT, UBRL, UBRL6, UIL, UYVY, VDA, VICAR, VID, VIFF, VIPS, VST, WBMP, WEBP, WMF, WMV, WMZ, WPG, X, X3F, XBM, XC, XCF, XPM, XPS, XV, XWD, YCbCr, YCbCrA, YUV |
| Directive | Local Value | Master Value |
|---|---|---|
| imagick.allow_zero_dimension_images | 0 | 0 |
| imagick.locale_fix | 0 | 0 |
| imagick.progress_monitor | 0 | 0 |
| imagick.set_single_thread | 1 | 1 |
| imagick.shutdown_sleep_count | 10 | 10 |
| imagick.skip_version_check | 1 | 1 |
| IMAP c-Client Version | 2007f |
| SSL Support | enabled |
| Kerberos Support | enabled |
| Directive | Local Value | Master Value |
|---|---|---|
| imap.enable_insecure_rsh | Off | Off |
| Internationalization support | enabled |
|---|---|
| ICU version | 65.1 |
| ICU Data version | 65.1 |
| ICU Unicode version | 12.1 |
| Directive | Local Value | Master Value |
|---|---|---|
| intl.default_locale | cs-CZ | no value |
| intl.error_level | 0 | 0 |
| intl.use_exceptions | Off | Off |
| json support | enabled |
| LDAP Support | enabled |
| Total Links | 0/unlimited |
| API Version | 3001 |
| Vendor Name | OpenLDAP |
| Vendor Version | 20447 |
| SASL Support | Enabled |
| Directive | Local Value | Master Value |
|---|---|---|
| ldap.max_links | Unlimited | Unlimited |
| libXML support | active |
| libXML Compiled Version | 2.9.14 |
| libXML Loaded Version | 20912 |
| libXML streams | enabled |
| Multibyte Support | enabled |
| Multibyte string engine | libmbfl |
| HTTP input encoding translation | disabled |
| libmbfl version | 1.3.2 |
| mbstring extension makes use of "streamable kanji code filter and converter", which is distributed under the GNU Lesser General Public License version 2.1. |
|---|
| Multibyte (japanese) regex support | enabled |
| Multibyte regex (oniguruma) version | 6.9.1 |
| Directive | Local Value | Master Value |
|---|---|---|
| mbstring.detect_order | no value | no value |
| mbstring.encoding_translation | Off | Off |
| mbstring.http_input | no value | no value |
| mbstring.http_output | no value | no value |
| mbstring.http_output_conv_mimetypes | ^(text/|application/xhtml\+xml) | ^(text/|application/xhtml\+xml) |
| mbstring.internal_encoding | no value | no value |
| mbstring.language | neutral | neutral |
| mbstring.regex_retry_limit | 1000000 | 1000000 |
| mbstring.regex_stack_limit | 100000 | 100000 |
| mbstring.strict_detection | Off | Off |
| mbstring.substitute_character | no value | no value |
| MysqlI Support | enabled |
|---|---|
| Client API library version | mysqlnd 8.0.30 |
| Active Persistent Links | 0 |
| Inactive Persistent Links | 0 |
| Active Links | 3 |
| Directive | Local Value | Master Value |
|---|---|---|
| mysqli.allow_local_infile | Off | Off |
| mysqli.allow_persistent | On | On |
| mysqli.default_host | no value | no value |
| mysqli.default_port | 3306 | 3306 |
| mysqli.default_pw | no value | no value |
| mysqli.default_socket | /var/run/mysqld/mysqld.sock | /var/run/mysqld/mysqld.sock |
| mysqli.default_user | no value | no value |
| mysqli.max_links | Unlimited | Unlimited |
| mysqli.max_persistent | Unlimited | Unlimited |
| mysqli.reconnect | Off | Off |
| mysqli.rollback_on_cached_plink | Off | Off |
| mysqlnd | enabled |
|---|---|
| Version | mysqlnd 8.0.30 |
| Compression | supported |
| core SSL | supported |
| extended SSL | supported |
| Command buffer size | 4096 |
| Read buffer size | 32768 |
| Read timeout | 86400 |
| Collecting statistics | Yes |
| Collecting memory statistics | No |
| Tracing | n/a |
| Loaded plugins | mysqlnd,debug_trace,auth_plugin_mysql_native_password,auth_plugin_mysql_clear_password,auth_plugin_caching_sha2_password,auth_plugin_sha256_password |
| API Extensions | mysqli,pdo_mysql |
| ODBC Support | enabled |
|---|---|
| Active Persistent Links | 0 |
| Active Links | 0 |
| ODBC library | unixODBC |
| ODBCVER | 0x0380 |
| ODBC_CFLAGS | -I/usr/include |
| ODBC_LFLAGS | -L/usr/lib |
| ODBC_LIBS | -lodbc |
| Directive | Local Value | Master Value |
|---|---|---|
| odbc.allow_persistent | On | On |
| odbc.check_persistent | On | On |
| odbc.default_cursortype | Static cursor | Static cursor |
| odbc.default_db | no value | no value |
| odbc.default_pw | no value | no value |
| odbc.default_user | no value | no value |
| odbc.defaultbinmode | return as is | return as is |
| odbc.defaultlrl | return up to 4096 bytes | return up to 4096 bytes |
| odbc.max_links | Unlimited | Unlimited |
| odbc.max_persistent | Unlimited | Unlimited |
| OpenSSL support | enabled |
| OpenSSL Library Version | OpenSSL 1.1.1d 10 Sep 2019 |
| OpenSSL Header Version | OpenSSL 1.1.1n 15 Mar 2022 |
| Openssl default config | /usr/lib/ssl/openssl.cnf |
| Directive | Local Value | Master Value |
|---|---|---|
| openssl.cafile | no value | no value |
| openssl.capath | no value | no value |
| PCRE (Perl Compatible Regular Expressions) Support | enabled |
| PCRE Library Version | 10.39 2021-10-29 |
| PCRE Unicode Version | 14.0.0 |
| PCRE JIT Support | enabled |
| PCRE JIT Target | x86 64bit (little endian + unaligned) |
| Directive | Local Value | Master Value |
|---|---|---|
| pcre.backtrack_limit | 1000000 | 1000000 |
| pcre.jit | 1 | 1 |
| pcre.recursion_limit | 100000 | 100000 |
| PDO support | enabled |
|---|---|
| PDO drivers | firebird, mysql, odbc, sqlite, sqlsrv |
| PDO Driver for Firebird | enabled |
|---|---|
| Client Library Version | LI-V6.3.5.33100 Firebird 3.0 |
| PDO Driver for MySQL | enabled |
|---|---|
| Client API version | mysqlnd 8.0.30 |
| Directive | Local Value | Master Value |
|---|---|---|
| pdo_mysql.default_socket | /var/run/mysqld/mysqld.sock | /var/run/mysqld/mysqld.sock |
| PDO Driver for ODBC (unixODBC) | enabled |
|---|---|
| ODBC Connection Pooling | Enabled, strict matching |
| PDO Driver for SQLite 3.x | enabled |
|---|---|
| SQLite Library | 3.27.2 |
| pdo_sqlsrv support | enabled |
|---|---|
| ExtensionVer | 5.11.0 |
| Directive | Local Value | Master Value |
|---|---|---|
| pdo_sqlsrv.client_buffer_max_kb_size | 10240 | 10240 |
| pdo_sqlsrv.log_severity | 0 | 0 |
| pdo_sqlsrv.report_additional_errors | 1 | 1 |
| pdo_sqlsrv.set_locale_info | 2 | 2 |
| Phar: PHP Archive support | enabled |
|---|---|
| Phar API version | 1.1.1 |
| Phar-based phar archives | enabled |
| Tar-based phar archives | enabled |
| ZIP-based phar archives | enabled |
| gzip compression | enabled |
| bzip2 compression | enabled |
| Native OpenSSL support | enabled |
|
Phar based on pear/PHP_Archive, original concept by Davey Shafik. Phar fully realized by Gregory Beaver and Marcus Boerger. Portions of tar implementation Copyright (c) 2003-2009 Tim Kientzle. |
| Directive | Local Value | Master Value |
|---|---|---|
| phar.cache_list | no value | no value |
| phar.readonly | On | On |
| phar.require_hash | On | On |
| POSIX support | enabled |
| PSpell Support | enabled |
| Readline Support | enabled |
|---|---|
| Readline library | EditLine wrapper |
| Directive | Local Value | Master Value |
|---|---|---|
| cli.pager | no value | no value |
| cli.prompt | \b \> | \b \> |
| Reflection | enabled |
| Session Support | enabled |
| Registered save handlers | files user |
| Registered serializer handlers | php_serialize php php_binary igbinary |
| Directive | Local Value | Master Value |
|---|---|---|
| session.auto_start | Off | Off |
| session.cache_expire | 180 | 180 |
| session.cache_limiter | nocache | nocache |
| session.cookie_domain | no value | no value |
| session.cookie_httponly | no value | no value |
| session.cookie_lifetime | 0 | 0 |
| session.cookie_path | / | / |
| session.cookie_samesite | no value | no value |
| session.cookie_secure | 0 | 0 |
| session.gc_divisor | 1000 | 1000 |
| session.gc_maxlifetime | 1440 | 1440 |
| session.gc_probability | 0 | 0 |
| session.lazy_write | On | On |
| session.name | PHPSESSID | PHPSESSID |
| session.referer_check | no value | no value |
| session.save_handler | files | files |
| session.save_path | /var/lib/php/sessions | /var/lib/php/sessions |
| session.serialize_handler | php | php |
| session.sid_bits_per_character | 5 | 5 |
| session.sid_length | 26 | 26 |
| session.upload_progress.cleanup | On | On |
| session.upload_progress.enabled | On | On |
| session.upload_progress.freq | 1% | 1% |
| session.upload_progress.min_freq | 1 | 1 |
| session.upload_progress.name | PHP_SESSION_UPLOAD_PROGRESS | PHP_SESSION_UPLOAD_PROGRESS |
| session.upload_progress.prefix | upload_progress_ | upload_progress_ |
| session.use_cookies | 1 | 1 |
| session.use_only_cookies | 1 | 1 |
| session.use_strict_mode | 0 | 0 |
| session.use_trans_sid | 0 | 0 |
| shmop support | enabled |
| SimpleXML support | enabled |
| Schema support | enabled |
| NET-SNMP Support | enabled |
| NET-SNMP Version | 5.7.3 |
| Soap Client | enabled |
| Soap Server | enabled |
| Directive | Local Value | Master Value |
|---|---|---|
| soap.wsdl_cache | 1 | 1 |
| soap.wsdl_cache_dir | /tmp | /tmp |
| soap.wsdl_cache_enabled | On | On |
| soap.wsdl_cache_limit | 5 | 5 |
| soap.wsdl_cache_ttl | 86400 | 86400 |
| Sockets Support | enabled |
| sodium support | enabled |
|---|---|
| libsodium headers version | 1.0.18 |
| libsodium library version | 1.0.18 |
| SPL support | enabled |
|---|---|
| Interfaces | OuterIterator, RecursiveIterator, SeekableIterator, SplObserver, SplSubject |
| Classes | AppendIterator, ArrayIterator, ArrayObject, BadFunctionCallException, BadMethodCallException, CachingIterator, CallbackFilterIterator, DirectoryIterator, DomainException, EmptyIterator, FilesystemIterator, FilterIterator, GlobIterator, InfiniteIterator, InvalidArgumentException, IteratorIterator, LengthException, LimitIterator, LogicException, MultipleIterator, NoRewindIterator, OutOfBoundsException, OutOfRangeException, OverflowException, ParentIterator, RangeException, RecursiveArrayIterator, RecursiveCachingIterator, RecursiveCallbackFilterIterator, RecursiveDirectoryIterator, RecursiveFilterIterator, RecursiveIteratorIterator, RecursiveRegexIterator, RecursiveTreeIterator, RegexIterator, RuntimeException, SplDoublyLinkedList, SplFileInfo, SplFileObject, SplFixedArray, SplHeap, SplMinHeap, SplMaxHeap, SplObjectStorage, SplPriorityQueue, SplQueue, SplStack, SplTempFileObject, UnderflowException, UnexpectedValueException |
| SQLite3 support | enabled |
|---|---|
| SQLite Library | 3.27.2 |
| Directive | Local Value | Master Value |
|---|---|---|
| sqlite3.defensive | On | On |
| sqlite3.extension_dir | no value | no value |
| sqlsrv support | enabled |
|---|---|
| ExtensionVer | 5.11.0 |
| Directive | Local Value | Master Value |
|---|---|---|
| sqlsrv.ClientBufferMaxKBSize | 10240 | 10240 |
| sqlsrv.LogSeverity | 0 | 0 |
| sqlsrv.LogSubsystems | 0 | 0 |
| sqlsrv.SetLocaleInfo | 2 | 2 |
| sqlsrv.WarningsReturnAsErrors | On | On |
| Dynamic Library Support | enabled |
| Path to sendmail | /usr/sbin/sendmail -t -i |
| Directive | Local Value | Master Value |
|---|---|---|
| assert.active | On | On |
| assert.bail | Off | Off |
| assert.callback | no value | no value |
| assert.exception | On | On |
| assert.warning | On | On |
| auto_detect_line_endings | Off | Off |
| default_socket_timeout | 60 | 60 |
| from | no value | no value |
| session.trans_sid_hosts | no value | no value |
| session.trans_sid_tags | a=href,area=href,frame=src,form= | a=href,area=href,frame=src,form= |
| unserialize_max_depth | 4096 | 4096 |
| url_rewriter.hosts | no value | no value |
| url_rewriter.tags | form= | form= |
| user_agent | no value | no value |
| sysvmsg support | enabled |
| sysvsem support | enabled |
| sysvshm support | enabled |
| Tidy support | enabled |
| libTidy Version | 5.6.0 |
| libTidy Release | 2017/11/25 |
| Directive | Local Value | Master Value |
|---|---|---|
| tidy.clean_output | no value | no value |
| tidy.default_config | no value | no value |
| Tokenizer Support | enabled |
| Version | 3.2.1 |
| Support Xdebug on Patreon, GitHub, or as a business | |
| Enabled Features (through 'xdebug.mode' setting) | ||
|---|---|---|
| Feature | Enabled/Disabled | Docs |
| Development Helpers | ✘ disabled | ⊕ |
| Coverage | ✘ disabled | ⊕ |
| GC Stats | ✘ disabled | ⊕ |
| Profiler | ✘ disabled | ⊕ |
| Step Debugger | ✔ enabled | ⊕ |
| Tracing | ✘ disabled | ⊕ |
| Optional Features | |
|---|---|
| Compressed File Support | no |
| Clock Source | clock_gettime |
| 'xdebug://gateway' pseudo-host support | yes |
| 'xdebug://nameserver' pseudo-host support | yes |
| Systemd Private Temp Directory | /tmp/systemd-private-3221d60dabd645c689c09873db6cf172-apache2.service-95ACom |
| Debugger | enabled |
|---|---|
| IDE Key | no value |
| Directive | Local Value | Master Value |
|---|---|---|
| xdebug.auto_trace | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.cli_color | 0 | 0 |
| xdebug.client_discovery_header | HTTP_X_FORWARDED_FOR,REMOTE_ADDR | HTTP_X_FORWARDED_FOR,REMOTE_ADDR |
| xdebug.client_host | localhost | localhost |
| xdebug.client_port | 9003 | 9003 |
| xdebug.cloud_id | no value | no value |
| xdebug.collect_assignments | Off | Off |
| xdebug.collect_includes | (setting removed in Xdebug 3) | (setting removed in Xdebug 3) |
| xdebug.collect_params | (setting removed in Xdebug 3) | (setting removed in Xdebug 3) |
| xdebug.collect_return | Off | Off |
| xdebug.collect_vars | (setting removed in Xdebug 3) | (setting removed in Xdebug 3) |
| xdebug.connect_timeout_ms | 200 | 200 |
| xdebug.coverage_enable | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.default_enable | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.discover_client_host | On | On |
| xdebug.dump.COOKIE | no value | no value |
| xdebug.dump.ENV | no value | no value |
| xdebug.dump.FILES | no value | no value |
| xdebug.dump.GET | no value | no value |
| xdebug.dump.POST | no value | no value |
| xdebug.dump.REQUEST | no value | no value |
| xdebug.dump.SERVER | no value | no value |
| xdebug.dump.SESSION | no value | no value |
| xdebug.dump_globals | On | On |
| xdebug.dump_once | On | On |
| xdebug.dump_undefined | Off | Off |
| xdebug.file_link_format | no value | no value |
| xdebug.filename_format | no value | no value |
| xdebug.force_display_errors | Off | Off |
| xdebug.force_error_reporting | 0 | 0 |
| xdebug.gc_stats_enable | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.gc_stats_output_dir | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.gc_stats_output_name | gcstats.%p | gcstats.%p |
| xdebug.halt_level | 0 | 0 |
| xdebug.idekey | no value | no value |
| xdebug.log | no value | no value |
| xdebug.log_level | 7 | 7 |
| xdebug.max_nesting_level | 256 | 256 |
| xdebug.max_stack_frames | -1 | -1 |
| xdebug.mode | debug | debug |
| xdebug.output_dir | /tmp | /tmp |
| xdebug.overload_var_dump | (setting removed in Xdebug 3) | (setting removed in Xdebug 3) |
| xdebug.profiler_append | Off | Off |
| xdebug.profiler_enable | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.profiler_enable_trigger | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.profiler_enable_trigger_value | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.profiler_output_dir | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.profiler_output_name | cachegrind.out.%p | cachegrind.out.%p |
| xdebug.remote_autostart | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.remote_connect_back | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.remote_enable | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.remote_host | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.remote_log | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.remote_log_level | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.remote_mode | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.remote_port | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.remote_timeout | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.scream | Off | Off |
| xdebug.show_error_trace | Off | Off |
| xdebug.show_exception_trace | Off | Off |
| xdebug.show_local_vars | Off | Off |
| xdebug.show_mem_delta | (setting removed in Xdebug 3) | (setting removed in Xdebug 3) |
| xdebug.start_upon_error | default | default |
| xdebug.start_with_request | default | default |
| xdebug.trace_enable_trigger | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.trace_enable_trigger_value | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.trace_format | 0 | 0 |
| xdebug.trace_options | 0 | 0 |
| xdebug.trace_output_dir | (setting renamed in Xdebug 3) | (setting renamed in Xdebug 3) |
| xdebug.trace_output_name | trace.%c | trace.%c |
| xdebug.trigger_value | no value | no value |
| xdebug.use_compression | 0 | 0 |
| xdebug.var_display_max_children | 128 | 128 |
| xdebug.var_display_max_data | 512 | 512 |
| xdebug.var_display_max_depth | 3 | 3 |
| XML Support | active |
| XML Namespace Support | active |
| libxml2 Version | 2.9.14 |
| XMLReader | enabled |
| XMLRPC extension version | 1.0.0RC3 |
| core library version | xmlrpc-epi v. 0.54 |
| author | Dan Libby |
| homepage | http://xmlrpc-epi.sourceforge.net |
| open sourced by | Epinions.com |
| XMLWriter | enabled |
| XSL | enabled |
| libxslt Version | 1.1.32 |
| libxslt compiled against libxml Version | 2.9.4 |
| EXSLT | enabled |
| libexslt Version | 1.1.32 |
| Opcode Caching | Up and Running |
| Optimization | Disabled |
| SHM Cache | Enabled |
| File Cache | Disabled |
| JIT | Disabled |
| Startup | OK |
| Shared memory model | mmap |
| Cache hits | 13222203 |
| Cache misses | 2620 |
| Used memory | 76890920 |
| Free memory | 57326808 |
| Wasted memory | 0 |
| Interned Strings Used memory | 6290976 |
| Interned Strings Free memory | 16 |
| Cached scripts | 2166 |
| Cached keys | 2785 |
| Max keys | 16229 |
| OOM restarts | 0 |
| Hash keys restarts | 0 |
| Manual restarts | 0 |
| Directive | Local Value | Master Value |
|---|---|---|
| opcache.blacklist_filename | no value | no value |
| opcache.consistency_checks | 0 | 0 |
| opcache.dups_fix | Off | Off |
| opcache.enable | On | On |
| opcache.enable_cli | Off | Off |
| opcache.enable_file_override | Off | Off |
| opcache.error_log | no value | no value |
| opcache.file_cache | no value | no value |
| opcache.file_cache_consistency_checks | On | On |
| opcache.file_cache_only | Off | Off |
| opcache.file_update_protection | 2 | 2 |
| opcache.force_restart_timeout | 180 | 180 |
| opcache.huge_code_pages | Off | Off |
| opcache.interned_strings_buffer | 8 | 8 |
| opcache.jit | no value | no value |
| opcache.jit_bisect_limit | 0 | 0 |
| opcache.jit_blacklist_root_trace | 16 | 16 |
| opcache.jit_blacklist_side_trace | 8 | 8 |
| opcache.jit_buffer_size | 0 | 0 |
| opcache.jit_debug | 0 | 0 |
| opcache.jit_hot_func | 127 | 127 |
| opcache.jit_hot_loop | 64 | 64 |
| opcache.jit_hot_return | 8 | 8 |
| opcache.jit_hot_side_exit | 8 | 8 |
| opcache.jit_max_exit_counters | 8192 | 8192 |
| opcache.jit_max_loop_unrolls | 8 | 8 |
| opcache.jit_max_polymorphic_calls | 2 | 2 |
| opcache.jit_max_recursive_calls | 2 | 2 |
| opcache.jit_max_recursive_returns | 2 | 2 |
| opcache.jit_max_root_traces | 1024 | 1024 |
| opcache.jit_max_side_traces | 128 | 128 |
| opcache.jit_prof_threshold | 0.005 | 0.005 |
| opcache.lockfile_path | /tmp | /tmp |
| opcache.log_verbosity_level | 1 | 1 |
| opcache.max_accelerated_files | 10000 | 10000 |
| opcache.max_file_size | 0 | 0 |
| opcache.max_wasted_percentage | 5 | 5 |
| opcache.memory_consumption | 128 | 128 |
| opcache.opt_debug_level | 0 | 0 |
| opcache.optimization_level | 0 | 0x7FFEBFFF |
| opcache.preferred_memory_model | no value | no value |
| opcache.preload | no value | no value |
| opcache.preload_user | no value | no value |
| opcache.protect_memory | Off | Off |
| opcache.record_warnings | Off | Off |
| opcache.restrict_api | no value | no value |
| opcache.revalidate_freq | 2 | 2 |
| opcache.revalidate_path | Off | Off |
| opcache.save_comments | On | On |
| opcache.use_cwd | On | On |
| opcache.validate_permission | Off | Off |
| opcache.validate_root | Off | Off |
| opcache.validate_timestamps | On | On |
| Zip | enabled |
| Zip version | 1.19.5 |
| Libzip version | 1.7.3 |
| BZIP2 compression | Yes |
| XZ compression | No |
| ZSTD compression | No |
| AES-128 encryption | Yes |
| AES-192 encryption | Yes |
| AES-256 encryption | Yes |
| ZLib Support | enabled |
|---|---|
| Stream Wrapper | compress.zlib:// |
| Stream Filter | zlib.inflate, zlib.deflate |
| Compiled Version | 1.2.11 |
| Linked Version | 1.2.11 |
| Directive | Local Value | Master Value |
|---|---|---|
| zlib.output_compression | Off | Off |
| zlib.output_compression_level | -1 | -1 |
| zlib.output_handler | no value | no value |
| Module Name |
|---|
array (3)0 => array (7)| 'name' => 'default output handler' | 'type' => 0 | 'flags' => 20592 | 'level' => 0 | 'chunk_size' => 4096 | 'buffer_size' => 159744 | 'buffer_used' => 30611 => array (7)| 'name' => 'Closure::__invoke' | 'type' => 1 | 'flags' => 113 | 'level' => 1 | 'chunk_size' => 0 | 'buffer_size' => 16384 | 'buffer_used' => 412 => array (7)| 'name' => 'default output handler' | 'type' => 0 | 'flags' => 112 | 'level' => 2 | 'chunk_size' => 0 | 'buffer_size' => 16384 | 'buffer_used' => 0
| Host | 'blog-lupa-martin.imho.cz'
|
|---|---|
| HTTP_X_FORWARDED_PROTO | 'https'
|
| Access-Control-Allow-Origin | '*'
|
| Referrer-Policy | 'no-referrer-when-downgrade'
|
| X-Real-IP | '216.73.216.123'
|
| Connection | 'close'
|
| accept | '*/*'
|
| user-agent | 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)'
|
| accept-encoding | 'gzip, br, zstd, deflate'
|
| referer | 'https://blog-lupa-martin.imho.cz/bizwiz/co-me-sere-na-programovani'
|
| cookie | 'tracy-session=8d692a5a69; _nss=1'
|
| X-HTTPS | '1'
|
empty
empty
| tracy-session | '8d692a5a69'
|
|---|---|
| _nss | '1'
|
| X-Powered-By | 'Nette Framework 3'
|
|---|---|
| Content-Type | 'text/html; charset=utf-8'
|
| X-Frame-Options | 'SAMEORIGIN'
|
| Set-Cookie | '_nss=1; path=/; secure; HttpOnly; SameSite=Strict'
|
| Vary | 'X-Requested-With'
|
| Content-Security-Policy | 'upgrade-insecure-requests'
|
Headers have been sent, output started at .../templates-common-@HtmlDocument--RootLike.inc.latte--3f2affa234.php:97 source
87: IInfo\LatteMacros::renderControlX($this->global->uiControl, "Shared_Ipn_PaginationLinks", "render", []); 88: IInfo\LatteMacros::renderControlX($this->global->uiControl, "Shared_Favicons", "render", []); 89: $this->renderBlock('common__HtmlDocument--rss', get_defined_vars()) /* line 53 */; 90: echo "\n"; 91: if ($rssFeeds) /* line 54 */ { 92: $iterations = 0; 93: foreach ($rssFeeds as $rssFeed) /* line 55 */ { 94: echo '<link rel="alternate" title="'; 95: echo LR\Filters::escapeHtmlAttr($rssFeed['title']) /* line 56 */; 96: echo '" href="'; 97: echo LR\Filters::escapeHtmlAttr(LR\Filters::safeUrl($rssFeed['url'])) /* line 56 */; 98: echo '" type="application/rss+xml"> 99: '; 100: $iterations++; 101: }