GeSHi - obarvěte si svoje zdrojáky
Včera v noci, poté, co jedna milá kamarádka odešla domů k rodičům (musí zítra do školy), jsem se náhodou dostal ve dvě hodiny ráno na web GeSHi. GeSHi je prima věc, barevná. GeSHi umí obarvit automaticky Vaše zdrojáky v actionscript, ada, apache, asm, asp, bash, c, caddcl, cadlisp, cpp, css, delphi, geshi, html4strict, java, javascript, lisp, lua, nsis, oobas, pascal, perl, php-brief, php, python, qbasic, sql, vb, visualfoxpro, xml.
A ona GeSHi nejenom barví, ale rovněž, pokud ji k tomu mírně přinutíte, udělá třeba pro PHP funkce automaticky odkazy na manuál PHP. Dokonalé. Stejně se dá přinutit i k odkazům na HTML či CSS.
Použití je potom triviálně jednoduché, místo <pre>
zadáte <pre language>
.
Napsal jsem si k tomu samozřejmě plugin pro BLOG:CMS, pod názvem NP_GeSHi, funguje dvěma způsoby, buď při ukládání článku (parse-and-save), nebo online (realtime), používám přitom tu nej-geniálnější funkci PHP, tedy preg_replace_callback
.
include('geshi.php'); class NP_Geshi extends NucleusPlugin { function parseString(&$content) { $keys=array('body','more'); foreach ($keys as $key) $content[$key] = preg_replace_callback ( '/<pre\s(.*?)>(.*?)<\/pre>/si', array(&$this,'replaceString'), $content[$key] ); } function replaceString($r){ global $DIR_PLUGINS; $geshi = new GeSHi($r[2],$r[1],$DIR_PLUGINS."geshi/"); $geshi->enable_classes(); $geshi->set_header_type(GESHI_HEADER_PRE); $geshi->set_overall_class('code'); $geshi->set_link_target($this->_linktarget); return $geshi->parse_code(); } } // NP_Geshi
Sub-kategorie v XHTML a JS
Doplňoval jsem včera sub-kategorie do BLOG:CMS, kvůli zpřehlednění větších webů, a narazil jsem na problém, jak řešit reprezentaci a formátování sub-kategorií v XHTML, a zároveň skrývání/odkrývání skupin v JavaScriptu.
Skoro automatické řešení je použít zde tagy ul
, li
,
nicméně, nakonec se mi jako sémanticky správnější zdálo použití dl
, dt
, dd
,
navíc obaleno jedním div
, kvůli formátování a XHTML validitě (a MSIE).
Tag dl
se zde používá jako formátovací "obal" pro CSS
pro skupinu, tag dt
je název skupiny, a tagy dd
jsou
sub-kategorie zařazené v dané skupině. Vypadá to celé nějak takto:
- Skupina 2
- Kategorie 4
- Kategorie 5
Je to řešení sémantické, XHTML validní, jednoduše nastylovatelné, a poskytující prostor i pro JavaScriptové skrývání/odkrývání skupin kategorií, třeba tímto jednoduchým skriptem:
// strom je zobrazen var categoryhidden = false; // schovat strom function categoryfold(){ categoryhidden = true; var i=1; var ele; while (ele=document.getElementById('group'+i++)) ele.style.display='none'; } // rozbalit strom function categoryexpand(){ categoryhidden=false; var i=1; var ele; while (ele=document.getElementById('group'+i++)) ele.style.display='block'; } // prepnout strom function categorytoogle(){ if (categoryhidden) categoryexpand(); else categoryfold(); } // zobrazit jednu kategorii function categoryswitch(j){ if (categoryhidden) { categoryexpand(); return; } var i=1; var ele; while (ele=document.getElementById('subcat'+i)) if (i++==j) ele.style.display='block'; else ele.style.display='none'; categoryhidden=true; }
Celé to řešení je vtipné v tom, že funguje na libovolné množství kategorií,
ve chvíli kdy ele=document.getElementById('group'+i++)
vrátí false
,
je jasné, že se jedná o poslední skupinu kategorií.
Řešení je implementováno v nejnovější verzi BLOG:CMS, jako plugin NP_SubCategories.php.
Je škoda, že zaostalý MSIE nepodporuje
v CSS konstrukce následujícího typu, podobné věci by šlo stylovat v CSS mnohem
lépe, bez divů
, a rovněž zpracovávat bez hromady id
identifikátorů
pro JavaScript, jen pomocí DOMu…
div#subcat dl dt>a{color: black; display: block;}
Bajka o zasviněném okně
Představte si, že si v bazaru koupíte slušné a zachovalé auto. Máte kupní smlouvu, všechno je skoro růžové. Auto není sice žádný zázrak, ale do práce s ním prostě jezdit musíte. Je podzim, venku prší, je bláto, a vy máte za chvíli tak špinavé okno, že přes něj nevidíte na cestu. Vystoupíte a jdete si ho umýt.
A v tu chvíli se objeví původní majitel a řekne vám, že ho umýt nesmíte. Když mu řeknete, že kupní smlouva žádnou podobnou restrikci neobsahovala, tak vám ten chytrák odpoví, že ji dopsal právě teď na lísteček na nákup pro svou manželku - a že prostě musíte poslechnout, protože je silnější, má rudého kamaráda, a společně vám jinak namlátí.
Že vám to připomíná aktuální zákaz transformace nemocnic, dopsaný do zákona o regulaci hluku?
Máte pravdu, je to stejně absurdní. Tak mějte rozum, a vyberte si příště auto od jiného majitele.
Databázový layer
Představuji k volnému použití (licence GNU GPL) jednoduchý dababázový layer, který je určen pro MySQL 3.23 až 4.0 (mysql), MySQL 4.1 (mysqli), SQLite a PostgreSQL.
Tento layer je záměrně psán neobjektově. Proč? Je určen pro úpravu starých skriptů, které jsou natvrdo psány pro MySQL 4.0, aby co nejdříve fungovaly s DB-layerem (na libovolné open-source databázi).
Názvy funkcí layeru jsou navrženy tak, aby byly shodné se syntaxí MySQL funkcí,
jen místo mysql
budete psát sql
, tedy například místo mysql_connect
budete
psát sql_connect
. Teoreticky je tak možné na Vašem skriptu udělat
hromadný search-and-replace slov mysql_
na sql_
,
a Vaše aplikace by měla fungovat s DB-layerem.
Pro nový vývoj je samozřejmě vhodnější použít DB-layer objektový, uvedu jej zde zítra.
Zdrojové kódy layeru jsou zde.
Použití layeru pro MySQL:
Typické použití pro MySQL 4.1 bude spočívat ve vytvoření souboru config.php
s
tímto obsahem:
Příklad pro SQLite:
Prefix tabulek:
Uvedený skript počítá rovněž s prefixem tabulek. Ten je velice důležitý, typicky máte na web-hostingu povolenou jen jednu MySQL/PGSQL databázi, a potom je nezbytně nutné jednotlivé instalace stejné aplikace odlišit právě prefixem v názvech tabulek.
Použití tohoto skriptu?
Náš index.php
může vypadat například takto, a bude fungovat na
MySQL 4.0, MySQL 4.1, SQLite a PostgreSQL:
Čeština není matematika
Zatímco v matematice je jasně dané, že 1+1=10
(binární soustava),
v češtině tomu tak není. I když si Ústav
pro jazyk český myslí, že by se mělo psát Nizozemsko, místo Nizozemí,
nikdy bych první zmíněný termín nepoužil. Neexistuje jediný rozumný důvod, proč
to udělat.
Stejně tak není kritické, pro pochopení textu, když místo výjimka napíšete vyjímka. Chcete-li vypadat, že si z hodin češtiny něco pamatujete, musíte psát to prvé, jiný důvod v tom ale těžko budeme hledat…
Moje osobní znásilňování českého pravopisu je vedeno navíc gramatikou anglickou a čímsi, co nazývám pragmatickým smyslem pro gramatiku. Sem patří mírné zneužívání interpunkce tam, kde sice dle "uznávaných" pravidel čárka či středník být nemá, ale dle mého názoru přispívá k lepšímu pochopení a rozčlenění textu.
Pár čtenářů v internetových diskusích dokáže rovněž vytočit do ruda, pokud místo byste použijete by jste. Proč proboha? Nemělo by být cílem ÚJČ AV obraty, které jsou masově používány, standardizovat? Pokud 99% lidí mluví a píše jinak než ÚJČ AV velí, chyba zjevně nebude v lidech. Jazyk český není zákon, ale živá bytost, neustále se měnící. ÚJČ je, naopak, těleso neskutečně strnulé (a dle mého názoru i zbytečně placené z našich daní).
Pokud nebudete tedy trvat zrovna na tom, že 1+1=11
, a Vaše čeština
bude "rozumně správná", čtenářům srozumitelná, a články výstižné, je řada
komentářů a výkřiků na mnoha českých fórech, poukazujících (často vulgárně)
na jednu gramatickou "chybu" v článku,
zcele nesmyslných.
Autor takového komentáře si tím jen zvyšuje svoje ego, aniž by článek pochopil, či snažil se jej pochopit…
Tento článek je přímou reakcí na seriál vycházející na Interval.cz.
SEO URLs without mod_rewrite and FilesMatch
Many CMSs solve the need for Fancy
URLs (URLs that are easy to follow by the user, and favoured by Search
Engines as well) by using mod_rewrite
, and/or FilesMatch
(available
only on Apache), or both.
Common solutions:
E.g., to get $itemid
from URL like http://../article/this-is-a-title
we
need to create following .htaccess
file:
<FilesMatch "^article$"> ForceType application/x-httpd-php </FilesMatch>
In this example we are forcing /article/
part of the URL to be
processed as a PHP application.
Next, we will create a new PHP file called article
(without .php
extension), which will process the URL, and determine proper article number,
and pass the control to our CMS.
<?php // some internal function include ('somecommonfncs.php'); // get article id $itemid = getItemIdFromName($_SERVER['REQUEST_URI']); // and process it processIt(); ?>
Seems easy, right? Well, this solution has several big problems in real-life, especially when open-source projects and code portability are concerned.
Pragocentrismus neexistuje

Nechápu nářky lidí, co bydlí mimo Prahu, že prý existuje nějaký “pragocentrismus”. Není mi vlastně ani jasné, co to onen “pragocentrismus” má být, a to jsem se přitom narodil na malé vesničce na Moravě, a prožil tam 18 let. Pro dítě je vesnice ideální. Pro mě alespoň byla. Obrovská soukromá zahrada a les (několik desítek hektarů), kde se dá hrát fotbal a tenis, rybník na zahradě, kde se dá v létě plavat, a v zimě bruslit, ale také spousta práce na tom, aby to celé nějak fungovalo.
“Pragocentrismus” je pojem rozhodně negativní, označuje závist a nenávist člověka, který v něj věří. Hnusné vlastnosti. Moji rodiče tento pojem nepoužívají. Já jej nepoužívám. Už 12 let bydlím v Praze, tedy pokud jsem v ČR, cítím se být Pražákem, nicméně, v mém pojetí označuje “pragocentrismus” styl života, nikoliv nějakou závist, či nenávist k ostatním, či pohrdání vesnicí.
Bydlím v Praze prostě proto, že to je největší vesnice v ČR. Mám rád kolem sebe lidi, zábavu, možnost dělat co chci třeba i ve 2:00 ráno. Kdykoliv. 24/7. Občas pracuji do 3:00 ráno, a pak někomu zavolám, a jdeme na zelnou polévku do Solidní nejistoty, nebo si zahrát air-hockey. V menších vesnicích, než je Praha, bych to udělat nemohl. Brno, Ostrava, Pardubice, či Olomouc jsou všechno, na potřeby mého životního stylu, menší vesnice, které mi nenabídnou to, co při svém životním stylu chci a potřebuji.
Ani Praha, místní největší vesnice, se ovšem nemůže rovnat s velko-městy jako je 15-ti miliónový New York, 20-ti miliónový Bangkok, či třeba miliónový Amsterodam (fantastické město, kde je mix různých národností, které mezi sebou nemají rasové předsudky, ale skutečně spolu žijí, bez segregace, a vytváření “národnostních čtvrtí”, a funguje 24 hodin denně).
Chápu lidi, co se stěhují na vesnici, protože jim to vyhovuje, chápu lidi, co se stěhují do Prahy, protože chtějí. Nechápu ale malé, závistivé a hloupé lidi, co věří, že existuje nějaký “pragocentrismus”.
GPRS od T-Mobile na vesnici

Potřeboval jsem si dnes nutně stáhnout WinCVS, a pár dalších programů, na jedné malé vesnici na Moravě, poměrně dost daleko od “civilizace” (nejbližší malé město je 15km daleko), k internetu připojen za pomoci i-Tec Bluetooth adaptéru a Siemens SX1 telefonu (tedy GPRS). Síla signálu pouhé 1 až 2 čárky z 5.
Nicméně, přenosová rychlost při stahování souboru byla v průměru 8.8 KB/s, což je fantastické! Ve spojení s GPRS Speed Plus, proxy cache / komprimace pro normální brouzdání webu, a použití AdBlocku ve Firefoxu pro blokování reklam, se reálná rychlost dostane i na 15-16 KB/s. A to je již vcelku použitelné, a hlavně, existuje na to paušál.
Zpráva o stavu internetu v Čechách

V posledních několika týdnech elektronická média a weblogy hodně spekulují o tom, jak moc je potřeba rychlý internet, a jak moc lidem chybí. Také jsem zastával tento názor. Nicméně, dnes jsem si jej poněkud přetvořil.
Pro rychlý internet chybí obsah, není na něj čas, a není po něm masová poptávka. Rychlý internet potřebuje (kromě profesionálů a internetových maniaků) primárně zloděj na P2P sítích, který krade ripovaná DVD do DivX, popřípadě programy a hudbu na DC++ či BitTorrentu.
Normální člověk rychlý internet nepotřebuje, tomu stačí dial-up. Uvedu dva příklady, proč tomu tak je.
Přijel jsem dnes, po delší době, s dcerou, šestiletým prvňáčkem, na Moravu, na prodlužený víkend k rodičům. Máma měla předělanou kuchyň, a v ní nové spotřebiče, troubu, myčku, a pár dalších věcí. Vše kvalitní značky, nerez ocel, trojité sklo, a tak dál…
“Kde jsi to kupovala?”, zeptal jsem se jí. “No přece na internetu, je to tam levnější!”, automaticky odpověděla. “A poradila jsem to i lidem z práce, mají radost, že ušetřili…”, dodává… Moji rodiče, máma 50 let, táta 56 let, co mají doma počítač hlavně kvůli mě (a ode mě), abych nedostal bez-internetový absťák, když tam občas přijedu, a používají internet 2 hodiny týdně, přes dial-up, si automaticky jdou sice vyhlédnout a vyzkoušet zboží do kamenného obchodu, ale pak přes google.com a seznam.cz hledají, kde to samé zboží koupí o 30% levněji, a s dovozem zdarma příští den.
Mám rád Tesco!

V poslední době naši socialisté často diskutují o různých omezeních. Socialisté totiž chtějí programově omezovat naši osobní svobodu… Jedním z takovýchto nepochopitelných omezovacích blábolů je i návrh na změnu 24-hodinové otevírací doby v supermarketech Tesco. Tedy, pod tou změnou je míněn prachsprostý zákaz ;)
Jejich argumentace? Prý je to dobré pro zaměstnance… Aha. To je ale podivný důvod… Dobré pro zaměstnance? V čem proboha???
Žádný zákaz, žádné omezení svobod, žádné omezení volby člověka zákonem (volby, která neškodí někomu jinému) není a nemůže být, principiálně dobré. Jen… komunisticky hloupé. Zakážeme-li Tescu mít otevřeno po 10:00 hodině večerní, tak… pár lidí přijde o práci! Pár lidí, co dělají až do pozdního večera (a je jich dost!), si nebude moci nakoupit. A jeden hloupý poslanec bude rád, že… on něco prosadil. Bude rád, že omezil naše svobody.
V této stranické linii bychom mohli rovnou zakázat jezdit taxíkářům v noci (vždyť ti chudáci by se měli vyspat, ne?), jezdit vlakům, zakázat práci i řidičům tramvají, řidičům metra, ba i osobní dopravu autem bychom po 10:00 hodině večerní měli zakázat. Připomíná Vám to stanné právo? No jasně! Pracovat v noci dle některých (post-komunistických) poslanců není dobré, a zvláště v Tescu ne!! Poslanci to vědí nejlépe.
V čem je Tesco tak odlišné oproti těm mnoha a mnoha jiným profesím, které v noci normálně pracují??? V čem je jiné, když taxíkář, lékař, policista, majitel restaurace, majitel diskotéky, či barman, nebo i programátor, a mnozí další, v noci normálně pracují, ale prodavačka v Tescu, to ne!! To je špatně!!
Není to špatně. Možnost volby je vždy dobrá. Vždy!
Já osobně většinou nakupuji ve 2:00 hodiny ráno. Mám Tesco moc rád. Bydlím sice na Praze 1 (pro nepražáky, v centru), ale i tak jedu autem na Zličín (pro nepražáky, dálnice na Plzeň), a v pohodě, bez front a spěchu, nakoupím. A ve 3:00 ráno jdu spát.
Pokud opět budete číst o nějaké (stupidní) regulaci, tak zkuste přemýšlet, k čemu je to vlastně dobré a komu to slouží. Dle mého názoru, tento konkrétní návrh na omezení svobod občanů pochází od konkurence Tesca :) A většina jiných návrhů na omezení svobod a práv občanů pochází z touhy po moci. Ne z touhy sloužit lidem.
Mám rád Tesco. Mám rád svobodu a možnost volby.