MyEgo.cz - Radek Hulán webzine

MyEgo.cz

home foto blogy mywindows.cz kontakt

PHP: convert named entities to decimal Unicode

PHP 10.11.2004

This script was written to overcome validation problems with RSS 0.9/1.0/2.0 and Atom 0.3 feeds which may not contain (X)HTML entities, otherwise widely used. Usage is very simple, function entity_to_decimal_value() will return a Unicode encoded string, with entities it does not recognise replaced for spaces.

There are also other two useful functions, for converting (X)HTML entities back to their original representation (makes &lt; again <), and for Unicode decoding of an URL string.

/* convert HTML entities back */
function unhtmlentities ($string)  {
  $trans_tbl = get_html_translation_table (HTML_ENTITIES);
  $trans_tbl = array_flip ($trans_tbl);
  return strtr ($string, $trans_tbl);
}

/* decodes URL into Unicode string */
function unicode_decode($txt) {
  $txt = ereg_replace('%u0([[:alnum:]]{3})', '&#x\1;',$txt);
  $txt = ereg_replace('%([[:alnum:]]{2})', '&#x\1;',$txt);
  return urldecode($txt);
}

Firefox 1.0 je ve finální verzi

Technologie 10.11.2004

Byla vydána finální verze Firefoxu 1.0, a to včetně její české verze. Zareagoval na to i google, můžete totiž nově hledat na google.com/firefox :-)

Firefox je nejlepší open-source browser, určený pro masovou veřejnost. O tom, jak si dokonale nakonfigurovat Firefox, jsem psal již dříve.

O tom, jak si dokonale nakonfigurovat Operu 7.60, nejlepší (komerční) browser pro profesionály, si můžete přečíst zde.

GeSHi - obarvěte si svoje zdrojáky

PHP 09.11.2004

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

Webdesign, CMS 07.11.2004

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

PHP 04.11.2004

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

Technologie 31.10.2004

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

Big City

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 “pragocentrismusstyl ž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

Technologie 29.10.2004
TMobile GPRS

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.