Zápisník

Neděle, 29. listopad 2009

Mýval

Nudíte se? Kupte si medvídka mývala! Já bohužel nemůžu (nemáme tu pro něj podmínky), ale někdo z vás třeba ano.


Neděle, 22. červen 2008

JavaScript: Převod barevných složek RGB do tvaru RRGGBB

Při tvorbě jakékoli aplikace je dobré vyvažovat přehlednost zápisu kódu s jeho efektivitou. Protože interprety JavaScriptu bohužel nejsou z nejrychlejších, přichází velmi často ke slovu právě faktor druhý, na úkor intuitivnosti zápisu. Jako třeba u následujícího problému:

Máme barevné složky R, G a B, z nichž každá je vyjádřena desetinným číslem v intervalu <0; 1>. Z těch potřebujeme získat řetězec ve tvaru RRGGBB. Složky bude tedy třeba zvětšit do rozsahu 0–255, zaokrouhlit, převést na čísla šestnáctková a jednoznakové výsledky zleva doplnit nulou, aby sestavený řetězec měl vždy právě šest znaků. Jak ale splnit poslední požadavek co nejrychleji a bez podmíněného přidávání nuly?

Metoda číslo.toString(16) sice převede číslo do šestnáctkové soustavy, ale k doplnění počáteční nuly ji přimět nelze. Na sprintf() můžeme zapomenout a co se týče regulárních výrazů, jejich vyhodnocení je pomalé. Nabízí se vkládat nulu vždy a potom z řetězce zprava vytáhnout dva znaky, tedy ('0'+cislo).substr(-2), jenže IE záporný offset nepodporuje.

Nedávno mě trklo zajímavé řešení. K číslům nejprve přičteme 256, čímž po převodu získáme vždy nejméně 10016 a nejvíce 1FF16. Pak zbývá jen oříznout počáteční jedničku. Jak jsem zmínil na začátku, přehlednost takového algoritmu je na pováženou, ale za tu efektivitu jistě stojí:

function rgbToHex(R, G, B) {
    return (
        Math.round(256 + 255*R).toString(16).substr(1) +
        Math.round(256 + 255*G).toString(16).substr(1) +
        Math.round(256 + 255*B).toString(16).substr(1)
    )
}

Pátek, 29. únor 2008

70 řádkové Smarty – nač dělat ze šablon vědu?

Šablony jsou běžnou součástí dynamických webů. Není proto divu, že dosud vzniklo nemalé množství šablonovacích systémů, více či méně vydařených. Smarty osobně řadím do té druhé skupiny, myslím, že se jedná o nepraktický molouch spatlaných regulárních výrazů. Místo dalšího hanobení Smarty zneužiji jeho nestydaté velikosti a dám ji do kontrastu se svým skromným šablonovacím uzlíčkem o cca 70 řádcích.

Žádná odlehčená syntaxe, nic se nekompiluje, šablonu představují běžné PHP soubory, které bych se koderovi bez znalosti PHP zdráhal svěřit. Nezní to příliš přesvědčivě, že? Přinejmenším pro vlastní projekty je to ale báječná věc. Ono to totiž má i výhody.

Pořád ještě ho chcete vidět?

Ten šablonovací skript jestli chcete vidět. Ano? Tak tady je (pro PHP5).

A tuhle je ukázka, jak se s ním bezva pracuje:

require_once('Template.inc.php');

$doc = new Template('tpl/'); // šablony jsou v adresáři tpl/
$doc->nazev 'Hudební nástroje'// nastavíme nadpis stránky

$nastroje[] = array('nazev'=>'Harmonika''ladeni'=>'C#');
$nastroje[] = array('nazev'=>'Příčná flétna''ladeni'=>'F');
// zparsujeme seznam nástrojů
foreach($nastroje as $nastroj) {
    
$doc->parse('nastroj.php''.NASTROJE'$nastroj);
}
// tisknout šablonu stranka.php
$doc->parse('stranka.php'Template::dstPrint);

Neboli:

  • Vytvoříme instanci $doc. Potom můžeme nastavit její vlastnosti – říkejme jim z pohledu šablony globální proměnné, i když tento termín má obecně jiný význam. Globální proto, že jsou přístupné ve všech šablonách parsovaných tímto objektem.
  • Následuje jednoduchý seznam hudebních nástrojů reprezentovaný asociativními poli. Ta dále použijeme při parsování jako lokální proměnné. Lokální proto, že budou dostupné jen v dané šabloně a taky že mají přednost před globálními.
  • Cyklem foreach dvakrát zparsujeme šablonu tpl/nastroj.php. Výsledek se připojí do proměnné $doc->NASTROJE (Připojí se díky té tečce na začátku, kdyby tam nebyla, tak tu proměnnou přepíšeme.)
  • Nakonec parsujeme šablonu tpl/stranka.php, přičemž ji pomocí speciální konstanty Template::dstPrint namísto uložení tiskneme. Někdy se může hodit Template::dstReturn, čímž, jak jistě tušíte, obdržíme výsledek návratovou hodnotou.

Šablona tpl/stranka.php

<html>
<head>
    <title><?=htmlspecialchars($nazev)?></title>
</head>
<body>
<h1><?=htmlspecialchars($nazev)?></h1>
<ul>
<?=$NASTROJE?>
</ul>
</body>
</html>

Šablona tpl/nastroj.php

<li><strong><?=htmlspecialchars($nazev)?></strong> - ladění <?=$ladeni?></li>

V obou šablonách jsem záměrně použil stejnou proměnnou $nazev, aby bylo vidět, že lokální proměnné mají přednost.

Příklad: Parsování vrácených řádků MySQL

$res mysql_query('SELECT jmeno, prijmeni FROM uzivatele');

while(
$row mysql_fetch_assoc($res)) {
    
$doc->parse('uzivatel.php''.UZIVATELE'$row);
}

Metody init(), check() a clear()

Metodu Template::init() voláme na začátku šablony, když je třeba určit, které rozšiřující funkce šablona používá (třeba pro práci s URL). Nedělá nic jiného než require_once všech skriptů, které jsou uvedeny jako parametry. Hledá je ve stejném adresáři, kde je umístěna třída a na konec automaticky doplňuje koncovku .inc.php. Je-li např. třída umístěna v adresáři lib/, pak Template::init('string')
provede require_once('lib/string.inc.php')

Template->check() ověřuje dostupnost šablony. Vrací TRUE pokud daná šablona existuje a lze ji přečíst.

Template->clear() čistí všechny nastavené vlastnosti objektu.

A ty výhody?

Zpracování šablon je pekelně rychlé (hlavně proto, že se nemusejí kompilovat). Dále, spousta šablonovacích systémů používá k nastavení proměnných nějakou funkci, nejčastěji assign(). Nemohou tak dělat psí kusy jako třeba list($doc->id$doc->nazev) = mysql_fetch_row($res), což tady možné je.

Zde popsaný bastl nepovažuji za průlomové dílo, ostatně pár hodně podobných jsem už viděl. Na svou jednoduchost mi ale přijde nesmírně efektivní a jistě bude pro někoho alespoň inspirací.

V rubrice PHP, 00.33 | Trvalý odkaz | Komentáře (6)

Pondělí, 18. únor 2008

jscolor – Co mi na formulářích chybělo a teď už ne

HTML definuje celou řadu formulářových prvků, některé situace ale vyžadují komfortnější ovládání než tato základní sada nabízí. Ke slovu se pak dostává DHTML, které se se základními prvky vhodně smísí. Často ve formulářích postrádám textové pole výhradně pro celočíselnou hodnotu, se šipkami pro inkrementaci a dekrementaci po pravé straně (v řeči Visual Basicu by to byl TextBox provázaný s objektem UpDown). To ale nechme na jiný článek…

Co mi vpravdě až donedávna chybělo víc byl dialog pro výběr barvy. Velká část uživatelů hexadecimální zápis barvy neovládá a je dobré jim výběr odstínu usnadnit nějakým jednoduchým rozhraním, jednodušším než Vyber barvu v Photoshopu a zkopíruj ji. Tedy, ne že by takových rozhraní k dnešnímu dni už desítky neexistovaly, povětšinou ale bývají realizována jako klikatelné matice 216 web-safe barev, což je hodně málo – proč nedopřát uživateli více volnosti? A tak, hnán moudrým heslem, rozhodl jsem se vytvořit color picker vlastní, minimalistický, avšak s volbou barvy velejemnou.

Do světa tedy dnes vypouštím nástroj jscolor. Nechť má spokojených uživatelů, jako je konkurenčních projektů, a ať poskytne hezkých barev alespoň z půlky tolik, kolik při ladění padlo nadávek na IE.

Pozadí: Text:

jscolor.com


Neděle, 27. leden 2008

Regulární výraz - MySQL TIMESTAMP

Tímhle článkem bych rád započal svou občasnou knihovnu regulárních výrazů, i když vím že podobné projekty se už nějaký ten pátek po internetu válejí.

Na úvod jsem si šetřil časovou známku. Výraz propustí téměř všechny platné formáty, kterými lze v MySQL nastavovat sloupec TIMESTAMP. Kromě formátu kontroluje také platost data a času, a věřte nebo ne, poradí si i s přestupnými roky. Možná proto je tak nevkusně dlouhý. Zadané datum a čas mohou být v rozmezí 1970-01-01 00:00:002037-12-31 23:59:59. Výraz pečlivě zkontrolován cyklem v celém rozsahu :-)

Regexp

/^((((19)?[7-9][0-9]|(20)?([0-2][0-9]|3[0-7]))[[:punct:]]+(0?2[[:punct:]]+(0?[1-9]|1[0-9]|2[0-8])|
(0?[469]|11)[[:punct:]]+(0?[1-9]|[12][0-9]|30)|(0?[13578]|10|12)[[:punct:]]+(0?[1-9]|[12][0-9]|3[01])))|
((19)?(8[048]|[79][26])|(20)?([02][048]|[13][26]))[[:punct:]]+0?2[[:punct:]]+29)([[:punct:]\s]+([01]?[0-9]|2[0-3])
([[:punct:]]+([0-5]?[0-9])([[:punct:]]+([0-5]?[0-9]))?)?)?$/

Souhlasí

1970-01-21
2037-3#24  16&39
08-3-24 16:39:42
2008?03+24@!_16%39?42

Nesouhlasí

200803-24-16-39-42
20080324163942


Sobota, 19. leden 2008

Převracení boolean sloupce v administraci

U administrace je třeba ve většině případů počítat s tím, že ji může používat i více uživatelů naráz. Je zřejmé, že provedou-li změnu stejné databázové buňky současně, poslední zápis přepisuje ostatní. O tomhle problému se v souvislosti s PHP rozepsal Jakub Vrána.

Jsou ale situace, kdy pravidlo poslední vyhrává je tím nejmenším zlem. Jednou takovou je triviální převrácení boolean sloupce. Mějme například výpis článků u nichž je tlačítko publikovat, které se kliknutím přepíná na nepublikovat a zase zpět. URL takového tlačítka může vypadat takto:

  1. ?clanek=70&akce=prohodPublik
  2. ?clanek=70&akce=publikovat pro nepublikovaný článek
    ?clanek=70&akce=nepublikovat pro publikovaný článek

První zápis je jednoduchý a univerzální, protože ve výpisu měníme jenom ID článku a akce zůstává stejná. Převrátit boolean sloupec v databázi je také snadné. Přesto takové řešení nelze doporučit, protože převracejí-li uživatelé A a B hodnotu současně, vše se takhle zamotá:

  1. A i B vidějí článek nepublikováný
  2. A chce článek publikovat a prohodí jeho stav
  3. článek je nyní publikovaný, B který neobnovil stránku ho vidí jako nepublikovaný
  4. B chce článek publikovat a prohodí jeho stav
  5. článek je nyní nepublikovaný, což ani jeden z uživatelů nechtěl, navíc A ho vidí jako publikovaný

Druhý zápis si ve stejné situaci vede znamenitě. Uplatňuje ono pravidlo poslední vyhrává:

  1. A i B vidějí článek nepublikováný
  2. A chce článek publikovat a nastaví ho jako publikovaný
  3. článek je nyní publikovaný, B který neobnovil stránku ho vidí jako nepublikovaný
  4. B chce článek publikovat a nastaví ho jako publikovaný
  5. článek je nyní publikovaný, A i B ho vidějí správně
V rubrice PHP, 11.29 | Trvalý odkaz | Komentáře (0)

Pátek, 18. leden 2008

Vypnutí PHP v určitém adresáři

Neboli PHP, dost! Možná to bude pro někoho novinka, ale PHP se dá taky vypnout. V takovém případě server odešle skripty tak jak leží a běží. Jde mimochodem o skvělý způsob, jak zajistit bezpečnost při uploadování souborů formulářem. Doteď, když jsme se chtěli vyhnout spuštění cizího PHP skriptu na serveru, museli jsme (někteří) precizně kontrolovat koncovku či vyhodnocovat obsah. Ale ono stačí udělat v daném adresáři soubor .htaccess obsahující:

php_flag engine off

Všechny PHP skripty kolem takového .htaccess (včetně podadresářů) ztrácejí na své skriptovitosti. Stávají se z nich obyčejné textové soubory které nikomu ani v nejmenším nevadí. Tři věci je třeba mít na zřeteli:

  1. nemusí to fungovat na každém serveru (ani v takovém případě ovšem nehrozí riziko spuštění cizího PHP skriptu, protože server odmítne poslušnost se slovy Internal Server Error)
  2. pozor, ať uživatel neuploaduje vlastní .htaccess namísto původního… to by byl docela trapas :-)
  3. server může obsluhovat i jiné skriptovací jazyky, např. Python či Ruby
V rubrice PHP, 16.23 | Trvalý odkaz | Komentáře (1)

Úterý, 8. leden 2008

Gradient v CSS za pomoci PHP a mod_rewrite

To jsem jednou potřeboval udělat barevný přechod. Ale ne GIMPárnu na jedno použití, nóbrž přechod dynamický, něco jako že by se zavolal soubor a vono se to vygenerovalo a tvářilo jako obrázek. S PHP a knihovnou GD je věc snadná a přidá-li se i mod_rewrite, pak i velmi slušivá. Laťku jsem si nastavil zhruba do téhle výše:

  1. možnost prolnutí více než dvou barev v libovolných vzdálenostech
  2. výběr mezi vertikální a horizontální orientací
  3. ukládání obrázku do cache
  4. bezpečnost z hlediska zatížení serveru či přeplnění cache

Co se týče bodu 1, skript dostane seznam klíčových barev a velikosti mezer které má mezi nimi proložit přechodem. Jako oddělovač takového seznamu jsem zvolil znak + který asi nejlépe znázorňuje spojování. Vaše komentáře mě přiměly změnit oddělovač na spojovník "-" Klíčové barvy se zapisují šesti velkými hexadecimálními číslicemi, mezery desítkově. Aby se mezera odlišila od barvy, může mít maximálně pět cifer – v praxi se použijí nanejvýš čtyři. Zbývá ještě rozlišit orientaci (bod 2). Tak co třeba jedním malým písmenem na začátku? A bude to buď x pro horizontálně se opakující přechod nebo y pro přechod s opakováním vertikálním.

Bod 3: Skript na konci, pokud je to možné, uloží výsledek do souboru. Název souboru má stejný tvar s jakým pracuje mod_rewrite, takže při příštím požadavku už soubor fyzicky existuje a má přednost. Když vím, že obrázek potřebuju jenom jednou a je zbytečné ho cachovat (třeba jako v testovacím rámečku níž), přidám na konec parametr ?tmp. Jelikož parametry nejsou součástí názvu souboru, mají cachované soubory opět přednost. A proč je to cachování tak nechutně důmyslné? Protože přepisování URL je nastaveno case-sensitive, takže v cache nevzniknou duplicity – každý přechod je jednoznačně identifikován. Nuže a bod 4 vyřešíme omezením délky celého přechodu – dejme tomu na 5000px?

Zápis gradientu

Jak je popsáno výše, na začátku musí být malé písmeno x/y, za nímž následují klíčové barvy a číselně vyjádřené mezery mezi nimi. Pokud mezi barvami prolnutí být nemá (tedy nulová mezera), pak se zapíše ihned další barva, např. yFF00FF-00FF00 jsou fialový a zelený pixel vedle sebe. Jednoduchý gradient pro svislé opakování (y) získáme třeba pod tímhle názvem:

Způsob zápisu gradientu

Délku celého pruhu spočítáme součtem klíčových barev (3) a mezer mezi nimi (5+2). Pruh je tedy dlouhý 10px.

Jak se to teda používá

  1. adresář gradient/ si zkopírujete kam je pohodlno
  2. má-li fungovat cachování, je třeba povolit do něj zápis
  3. teď už v adresáři najdete jakýkoli obrázek gradientu, např. gradient/y00FF00-300-0000FF.png je 302px dlouhý přechod od zelené k modré

Kdo náhodou nemá k dispozici mod_rewrite, může skript volat přímo: gradient/gradient.php?repeat=y&grad=00FF00-300-0000FF

A proč se pruh roztahuje na 5px

… když by stačil 1px? Tučňákům nestačí. A možná i tygrům, přiznám se, že jsem po tom příliš nepátral. Problém je v hladkosti přechodu. Zatímco pod Windows je opakovaný přechod stejný při jakékoli šířce pruhu, FF/Linux ukáže 1px proužek při nižší barevné hloubce jako nekoukatelně ohyzdné čáry. Zjevně nejprve obrázek proloží a teprve potom ho opakuje. Je tedy jasné, že jednorozměrný přechod nemůže proložit nikterak rozmanitě, ovšem dostane-li větší plochu, stane se s ním přibližně tohle:

Opakovaný černobílý přechod při 8-bitové hloubce (FF/Linux)
Opakovaný černobílý přechod při 8-bitové hloubce (FF/Linux)

K pěti pixelům jsem došel po sáhodlouhém zkoušení. Vše do 3px je bída, 4px začínají být přijatelné a pět – bingo! Vyšší hodnoty samosebou přinášejí výsledek o špetku lepší, ale to už je příliš na úkor velikosti souboru (ačkoli nijak drasticky, PNG komprese se celkem vytáhla). A protože těch 5px je krásná a vždy použitelná hodnota, dal jsem ji na pevno do hlavičky skriptu namísto do URL, které je tím jednodušší. Připomínám, že fujtajblproužkový problém se týká jen nížších barevných hloubek (do 16 bitů).

Zkouška

gradient/.png

Předvolby: B/W B/W/B R/G/B Černý panel Aqua moje :-)

A proč je v nadpisu "CSS"?

body {
  background:url('gradient/x664477-600-CC99FF.png') left top repeat-x fixed #CC99FF;
}

Download

gradient.zip

V rubrice PHP, 02.47 | Trvalý odkaz | Komentáře (9)

Pondělí, 5. listopad 2007

Screenshot.cz – instantní archiv obrázků

Nová služba screenshot.cz je konečně v provozuschopném stavu.

  • Hele ten obrázek mi to nechce přijmout. Dej ho na screenshot.cz!
  • Ludvo, proč vždycky vyskočí tahle hláška? screenshot.cz/ABCD/
  • … a mnohá další využití

Screenshot.cz


Neděle, 19. srpen 2007

Překlad odkazů v prohlížečích

Která spojení lze v obci internetové prohlásit za profláknutější, než hypertextové odkazy, linky, URL, URI. Říkejme jim jak chceme. Odkazy jsou zkrátka veskrze běžná věc, přesto v ní ale prohlížeče nejsou tak docela zajedno. Třeba prachobyčejný prázdný odkaz. Jak ho browser pochopí? Co myslíte, skočí na index adresáře nebo zůstane na aktuálním dokumentu? A co ?řetězec_dotazu a #fragment, zůstanou či zmizí?

A tak vznikla tabulka, která experimentálně naznačuje pravidla, jimiž se takový převod řídí. Jak se můžeme přesvědčit, třeba právě takový prázdný odkaz je chápán naprosto odlišně.


Pátek, 27. červenec 2007

WebZdarma a očůrání reklamy

Teda, ne úplně, protože jak administrátoři WebZdarma tvrdí, skryjete-li reklamu, máte po ptákách.

Chci se zaměřit na následující situaci:

  • Jste donuceni snížit se k umístění PHP stránek na WebZdarma
  • Potřebujete do skriptů vkládat třeba soubor config.php s citlivými údaji, jako je login k MySQL apod.

Nejprve něco k bezpečnosti. Nejlepší řešení je samozřejmě umístit citlivé soubory mimo DocumentRoot, to ale na WZ nejde. Je tedy nanejvýš vhodné, aby config.php měl koncovku .php, protože koncovka jiná, třeba .inc, by stačila k tomu, aby kdokoli zadal do prohlížeče http://superstranky.wz.cz/config.inc a hesla viděl v celé jejich kráse (server nepozná, že soubor má prohnat skrz PHP a běžně ho odešle). Pro všechny případy není od věci takovému souboru ještě zakázat přístup zvenčí pomocí .htaccess. Jistota je jistota.

V čem je problém? Protože jeden podobný web spravuji, všiml jsem si, že WebZdarma řeší vkládání reklamy při uploadu PHP souboru – prostě ji prasácky mrskne na konec (je to potom rychlé). Když do skriptu includujete 10 .php souborů a máte nastaveno zobrazování reklamy na stránce dole, uvidíte ve výsledku celkem 11 reklam na jediné stránce. Samozřejmě, každý soubor obsahoval reklamu. Jedno z řešení je použít funkce na řízení výstupu:

<?php
ob_start
(); require_once('config.php'); ob_end_clean();
?>

Ale s mírou, protože tahle metoda zhltne veškerý výstup skriptu, včetně případných chyb. Ostatním vkládaným souborům které nemusejí být nutně skryté je lepší dát koncovku .lib či podobně. Tím se zamezí automatickému připojení reklamy, pročež není třeba je dál ošetřovat.

Tak, a teď ještě jedna možnost. Stačí dát na konec každého includovaného souboru return;, čímž se vkládání ukončí. Dejte ale pozor, aby se jednalo skutečně o vkládané soubory, protože pokud půjde o opravdickou stránku, nezobrazí se reklama ani na ní a vystavujete se riziku, že vám web smažou. Sice nemohu ručit za to, že se to v ostatních případech nestane, ale podle mě je tohle naprosto korektní ošetření závažného nedostatku. Cílem přece je, aby se na stránce zobrazovala právě jedna reklama.

Aktualizace

Jiří Počta poznamenává, že stačí zvolit v administraci ruční vkládání reklamy.

V rubrice PHP, 11.00 | Trvalý odkaz | Komentáře (6)

Úterý, 10. červenec 2007

mysqldump pro PHP

V knihovně mysqldump.php [ZIP] najdete dvě funkce:

  • fmysqldump() – zapisování MySQL dumpu do souboru
  • mysqldump() – tisk MySQL dumpu na výstup

Syntax

bool fmysqldump ( resource $fp [, resource $link [, mixed $data_for [, mixed $struct_for]]] )

mixed mysqldump ( [ resource $link [, mixed $data_for [, mixed $struct_for [, bool $return ]]]] )

$fpukazatel na otevřený soubor, do něhož se má dump zapisovat.
$linkotevřené MySQL spojení s vybranou databází. Pokud není uvedeno nebo je NULL, použije se poslední spojení.
$data_forpole s názvy tabulek, jejichž data mají být dumpována. Např. array('tabulka1', 'tabulka2') Hodnota TRUE je výchozí a znamená všechny tabulky, array() pak znamená žádné tabulky.
$struct_forpole s názvy tabulek, jejichž struktura má být dumpována. Hodnota TRUE je výchozí a znamená všechny tabulky, array() pak znamená žádné tabulky.
$returnnamísto tisku na výstup vracet dump návratovou hodnotou. Pozor na přetečení paměti, dumpy bývají veliké.

Paměť

Teoreticky by naráz nemělo být obsazeno o moc víc paměti než je velikost největšího sloupce v dumpovaných tabulkách, ale ve skutečnosti jsem pro tabulky s plně obsazenými sloupci MEDIUMBLOB potřeboval povolit 30 MiB, zřejmě hlavně proto, že některé binární znaky se do mezipaměti ukládají escapované.

Použití v praxi

<?php
require_once('mysqldump.php');

# připojit MySQL
mysql_connect('hostitel''uzivatel''heslo');
mysql_select_db('moje_databaze');

mysql_query('SET CHARACTER SET utf8');

# budeme posílat SQL soubor "zaloha_moji_databaze.sql"
# a chceme prohližeč rovnou vyzvat k uložení (attachment)
header('Content-Type: text/x-sql');
header('Content-Disposition: attachment; filename="zaloha_moji_databaze.sql"');
# neukládat data do cache
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Thu, 30 Jun 1988 12:00:00 +0000 GMT');

# pro MEDIUMBLOB/MEDIUMTEXT sloupce je třeba navýšit paměť
ini_set('memory_limit''32M');

# poslat dump na výstup
mysqldump();
?>

Tenhle skript umožní klientovi stáhnout přes prohlížeč dump všech tabulek v otevřené databázi.

Pozn.: Knihovna mysqldump je šířena v naději, že bude užitečná, avšak bez jakékoli záruky.

V rubrice PHP, 03.17 | Trvalý odkaz | Komentáře (17)

Pondělí, 2. červenec 2007

PHP trik týdne - include() řetězce

<?php
$str 
'Ahoj <?php echo "světe!" ?>';
eval(
'?>'.$str.'<?php ');
?>

Normálně se eval() chová tak, že očekává PHP kód. Vtip je v tom, že ten se dá běžným způsobem uzavřít a na konci znovu otevřít, čímž uprostřed získáváme prostor pro HTML či jiný čistý text. A konečně, ten může znovu obsahovat PHP vsuvky, zkrátka se proměnná zpracuje zrovinka jako by se includoval soubor. Pokud vám zmíněný trik fungovat nebude, budu vděčný, když se v komentářích ozvete. Rád bych si udělal přehled o kompatibilitě. Já testoval na PHP 4.3.10-16 a 4.4.4.

V rubrice PHP, 21.02 | Trvalý odkaz | Komentáře (12)

Úterý, 26. červen 2007

Z bídy ven

To byl root kořen
a kernel panic,
filesystem zbořen,
zbytek dat na nic.

I seslal bůh nesčetně lásky,
přivezl stabilní stroje,
RAID pole, záložní pásky,
náhradní naftové zdroje.

Nyní máme čerstvou manu,
Apač dvojka pěkně lítá,
nová verze Debianu
čistým promptem správce vítá.

V rubrice Linux, 22.01 | Trvalý odkaz | Komentáře (3)

Úterý, 1. květen 2007

Ověření a generování čísla kreditní karty

Jednoduchá utilitka ke kontrole či generování čísla kreditky. Generovaná čísla jsou pouze pseudo-validní, protože identifikátor vydavatele vzniká základě pevného prefixu a náhodného doplňku. Nástroj je postaven na principu Luhnova (mod 10) kontrolního součtu, který je na kreditních kartách používán. Generovaná čísla jsou pro tuto kontrolu validní.

Ověřit

Generovat


Pátek, 13. duben 2007

Stop the Big Brother State

Právě vyšly na svět české titulky k videu Stop the Big Brother State.

Aktualizace 26. 6. 2007

David Scharf přidal český překlad mezi oficiální titulky.


Pátek, 30. březen 2007

Jak takovou stránku vytvořiti, která pravidlům všelijakým vyhovovati bude

Pro začátek přijměme fakt, že aby byla internetová prezentace úspěšná, musí zákonitě obsahovat mnoho obdélníčků různých velikostí a funkcí, a hrát co nejrozmanitější škálou barev, nejlépe jako z pohádky o ptáku Ohnivákovi sledované kaleidoskopem přes hranol.

Dále se smiřme s tím, že každý, byť krátký text musí mít svou samostatnou stránku, na niž se uživatel dostane rozkliknutím příslušného odkazu. Uživatelé rádi klikají a jsou hraví, mnohdy si pro naše stránky vyhradí několik hodin, aby prozkoumali každý jejich koutek. Největší hloupost je naskládat několik textů k sobě a potom se na ně odkazovat mřížkovými záložkami.

Co je také důležité je hlavička – nesmí být aktivní, jako že by se na ni snad klikalo. Měla by být co největší, co do rozměrů i kapacity, protože každý už stejně doma máme 2 MiB připojení a LCD monitor s nativním rozlišením 1600×1200px. Kdo ne, je sto let za opicema a jeho chyba.

Tak jako hlavička má být pestrá, tak i patička skýtá prostor k vyjádření a vyřádění se. Důležité jsou zejména ikonky jako "Napsáno ve VIMu", "Vytvořeno GIMPem", "Validní CSS a XHTML", "Sláva Firefoxu" a "Podporujeme vývoz rajčatového protlaku do Rakouska".

Na každém pořádném webu nesmí chybět grafické počítadlo. A ať je vidět, že nejste žádná lama, můžete přidat i JavaScriptové hodiny, klidně i analogové. Dále je zapotřebí přimíchat kvalitní anketu – dnes je jich k mání bezpočet. Můžete se tak zeptat třeba jestli má uživatel doma kočku nebo radši klávesnici.

Vždycky když chci vědět, kdo má zrovna svátek, začnu listovat náhodně vybranými osobními weby. Nakonec po několika hodinách uspěji. Ani vy byste proto neměli opomenout tuto informaci na viditelné místo vystavit. Vhodné je použít efekt blikání.

Nedílnou součástí moderních webů jsou tzv. animace a MARQUEE efekty. Jejich význam poslední dobou lavinovitě vzrůstá, především proto, že mají velmi vysokou informační hodnotu a zároveň uživatele nerozptylují okolním textem.

Pokud vám na konec zbyde něco času, můžete napsat i trochu obsahu jako takového. Není třeba se s ním nikterak párat, pište rychle, nadpisy nedělejte (nikdo je nečte) a na chyby se neohlížejte (většinu jich opraví Word a jádro věci beztak pochopí každý). V podstatě jde jen o to, vyplnit prostor kolem obrázků. A že ho je tam potvory habaděj. V nouzi lze bloky textu nakopírovat za sebe, línější autoři se mohou na konci odkázat zpět na začátek (ovšem nepůsobí to kýžený grafický efekt, nehledě k tomu, že lecjaký rozčarovaný čtenář by mohl uvíznout ve smyčce).

Tak to je vše, přátelé. Pro uklidnění (hlavně své), dodávám, že kdyby to někdo nepochopil, všechna uvedená tvrzení jsou ve skutečnosti blábol, Ironův IE, a aby byla užitečná, žádají si negace. Nemají být ovšem výsměchem nikomu, neboť každý někdy začíná, někteří začínáme stále.


Pondělí, 12. březen 2007

NCE – Nymburk Classic Entertainment

Mladý nadaný nymburský režisér Dan Bartoš vryl do patnáctiletého stromku českého internetu čerstvý nápis NCE – Nymburk Classic Entertainment, prezentaci své filmové tvorby včetně několika informací o sobě. Máte-li rádi film nebo alespoň vlastníte televizi, doporučuji prolistovat.


Pátek, 9. březen 2007

Dva vlaky

Proti sobě jedou dva vlaky, počáteční vzdálenost mezi nimi je 120 km. Jeden jede rychlostí 160 km/h, druhý, který vyjel o 20 min. později, má rychlost 200 km/h. Za jak dlouho myslíte, že sakra budou velikonoční prázdniny?

Pátek, 2. březen 2007

Tempie zveřejněna

Tempie jest GNU šablonový engine pro PHP. Odedneška jej naleznete na http://tempie.org.

V rubrice PHP, 23.10 | Trvalý odkaz | Komentáře (11)

Rubriky

Navigace

Hledání