Tabletizer – Generování HTML tabulek z PHP polí

Při výpisu objemných PHP polí byli mými nejlepšími společníky funkce print_r() a var_dump(). Výpis z nich se navíc musí dále obalit přinejmenším do tagů pre, aby výstup byl alespoň trochu čitelný. Navíc postup, který jsem k tomu používal:

echo "<pre>";print_r($promenna);echo "<pre>";

se mi v kódu vůbec nelíbil. Proto jsem si vytvořil třídu, která formátování obstará za mě. Tak vznikla třída Tabletizer. Díky ní je vytvoření pěkné tabulky otázkou pár řádků:

$table = new Tabletizer();
echo $table->fromArray($promenna);

A to je vše. Výstupem může být třeba i takováto tabulka.

Výstup v podobě tabulky

Díky tomu, že hlavní tabulce je přiřazena třída .tabletizer, je velice jednoduché vytvořit si jakýkoli styl, který sedí do okolního "prostředí". Vzhled tabulky si je možné jakkoli přizpůsobit.

Odkaz ke stažení, spolu s návodem a seznamem změn je možné najít na této stránce.

Instalace SyntaxHighlighter: XregExp not defined

Pokud jste při instalaci zvýrazňovače kódů pro webové stránky stejně jako já narazili na chybu: XregExp not defined, je pravděpodobně na vině špatná dokumentace. V ní se sice uvádí, že máte použít soubor shCore.js, ale již se nezmiňují, kde máte tyto soubory vzít. Po rychlém prohledání adresářů a jejich obsahu pravděpodobně vložíte ten z /src. Bohužel, to je kámen úrazu. Ve složce /scripts se totiž soubor shCore.js nachází také.

Pro vyřešení tohoto problému stačí do stránky vložit soubor shCore.js ze složky /scripts.

Jak v C++ zjistit, zda soubor existuje?

Každý jistě při programování "Úžasné megalomanské aplikace/hry, která mu zajistí milióny" narazil na problém. Jak zjistit, zda soubor, který chci načíst existuje? V případě, že chceme ze souboru jen přečíst data, jde o problém celkem triviální. Stačí se pokusit tento soubor otevřít. Cest je opět několik:
// Funkce bere za parametr jméno souboru
bool fileExists(const std::string &file_name) {
    // Pokusí se soubor otevřít
    ifstream file(file_name.c_str());

    // Pokud se otevření zdařilo
    if (file.good()) {
        // Uzavře soubor, uvolní paměť
        file.close();
        // a vrátí true
        return true;

    // Pokud se otevření nezdařilo
    } else {
        // Uzavře soubor, uvolní paměť
        file.close();
        // a vrátí false
        return false;
    }
} // bool fileExists()
Takový postup bude ve většině případů plně dostačující. Pro úplnost uvedu ještě příklad s využitím funkce access:
// Funkce bere za parametr jméno souboru
bool fileExists(const std::string &file_name) {
    // Pokud soubor existuje
    if ( access( file_namename.c_str(), F_OK ) != -1 ) {
        // Vrátí true
        return true;
    // V opačném případě
    } else {
        // Vrátí false
        return false;
    }
}
Co ale dělat v případě, že chceme o souboru zjistit více informací? Je soubor spustitelný? Jaká je jeho velikost? Jaké je ID vlastníka? V takovém případě se můžeme opřít o funkci stat
// Funkce bere jako parametr jméno souboru a ukazatel na strukturu do které má doplnit data
int stat(const char *filename, struct stat *buf);
Obsah struktury stat (EN):
  • st_dev - ID zařízení, na kterém je soubor uložen
  • st_ino - Číslo inode
  • st_mode - Obsahuje práva k souboru
  • st_nlink - Počet pevných odkazů
  • st_uid - ID vlastníka
  • st_gid - ID skupiny ve, které je vlastník
  • st_rdev
  • st_size - Celková velikost v bytech
  • st_atime - Čas posledního přístupu k souboru
  • st_mtime - Čas poslední změny
  • st_ctime - Poslední změna statusu (= změna čísla inode)
  • st_blksize - Velikost bloků
  • st_blocks - Počet alokovaných bloků
Pro nás bude nejdůležitější obsah st_mode. Pro testování jeho obsahu jsou zavedeny mimo jiné (EN) tyto masky:
  • S_IFREG - Jde o soubor
  • S_IFLNK - Jde o symbolický odkaz
  • S_IFDIR - Jde o adresář
  • S_IRUSR - Práva pro čtení vlastníkem
  • S_IWUSR - Práva pro zápis vlastníkem
  • S_IXUSR - Práva pro spuštění vlastníkem
Krom masek existuje ještě několik maker. Jako jediný parametr m se jim předává st_mode. Návratovou hodnotou maker je buď 0, v případě že test neuspěl nebo nenulová hodnota pokud test uspěl.
  • S_ISBLK(m)
  • S_ISCHR(m)
  • S_ISDIR(m) - Jde o adresář
  • S_ISFIFO(m) - Jde o rouru nebo speciální soubor FIFO
  • S_ISREG(m) - Jde o soubor
  • S_ISLNK(m) - Jde o symbolický adresář
Nyní si ukážeme použití funkce stat v akci:
#include <sys/stat.h>
#include <sys/types.h>
#include <iostream>

int main() {
    // Struktura s informacemi o souboru
    struct stat info;

    // Pokud se načtení informací povedlo
    if ( stat( "test.txt", &info ) == 0 ) {
        std::cout << "Jde o soubor: " << S_ISREG(info.st_mode) << std::endl;
        std::cout << "Jde o adresář: " << S_ISDIR(info.st_mode) << std::endl;
        std::cout << "Velikost: " << info.st_size << "b" << std::endl;
        std::cout << "Má vlastník právo na čtení: " << info.st_mode&S_IRUSR << std::endl;
        std::cout << "Má vlastník právo ke spuštění: " << info.st_mode&S_IXUSR << std::endl;
    
    } else {
        std::cout << "Soubor se nezdařilo otevřít" << std::endl;
        std::cout << "Zkontrolujte, zda existuje, nebo zda není v adresáři, ke kterému nemáte přístup" << std::endl;
    }
} // main()

World of Tanks API

Aktuálně dělám na webu o hře WoT. Plánuji ho pojmout jako CSFD pro tanky. Tedy přidat možnost hodnocení každého tanku, modulu a schopností posádky. Pokud by to někoho zajímalo, může si přečíst více zde.

Jedna z funkcí by mělo být propojení účtu na tomto webu s účtem na tancích - v profilu se poté zobrazí procentuální vítězství, počet bitev a další užitečné informace. Narazil jsem ale na problém. Jak data získat? První co mne napadlo bylo odeslání požadavek na stránku s profilem a poté si z ní vytáhnout, co mne zajímá.

   $raw_user_data = file_get_contents('http://www.example.com/');
   // ... zpracování

Protože jsem dost líný, radši jsem věnoval další čas hledání nějakého pohodlnějšího řešení, než psaní kódu na zpracování. Nakonec se na mě usmálo štěstí a já našel WoT account API. V zásadě jde o to, že po zadání určité adresy do prohlížeče vám API vyhledá uživatele/klan a vytvoří JSON výstup.

Vyhledávání hráčů:

http://api.worldoftanks.eu/community/accounts/api/API_VER/?source_token=TOKEN&search=JMENO&offset=0&limit=LIMIT

  • JMENO - Jméno hledaného hráče
  • LIMIT - Počet hráčů, které chcete zobrazit. Zadejte 1 pro zobrazení nejlepší shody.

Profil konkrétního hráče:

http://api.worldoftanks.eu/community/accounts/ID_HRACE/api/API_VER/?source_token=TOKEN

  • ID_HRACE - Jedinečné číslo, které určuje hráče. Je možné ho zjistit z adresy vašeho profilu na webu Worldoftanks.eu

Vyhledávání klanu:

http://api.worldoftanks.eu/community/clans/api/API_VER/?source_token=TOKEN&search=JMENO_KLANU&offset=0&limit=LIMIT

  • JMENO_KLANU - Jméno hledaného klanu. Stačí i tag.
  • LIMIT - Počet požadovaných výsledků. Zadejte 1 pro zobrazení nejlepší shody.

Profil konkrétního klanu:

http://api.worldoftanks.eu/community/clans/ID_KLANU/api/API_VER/?source_token=TOKEN

  • ID_KLANU - Jedinečné číslo identifikující klan. Je možné ho zjistit z adresy profilu vašeho klanu na Worldoftanks.eu

API_VER

Verze API. Každá verze se tím, co poskytuje.
  • Vyhledávání hráčů: 1.0, 1.1
  • Zobrazení konkrétního profilu: 1.0, 1.1, 1.2, 1.3, 1.4, 1.5. 1.6, 1.7, 1.8, 1.9
  • Vyhledávání klanů: 1.0
  • Zobrazení konkrétního klanu: 1.0, 1.1

TOKEN

Tokeny určují, co všechno bude vypsáno.
  • WG-WoT_Assistant-1.1.2
  • WG-WoT_Assistant-1.2.2
  • WG-WoT_Assistant-1.3.2
  • WG-WoT_Assistant-1.4
  • Intellect_Soft-WoT_Mobile-site
  • Intellect_Soft-WoT_Mobile

Debian: Problém s locale

Po dlouhé době spokojeného používání debianu jsem dnes po troše šťourání se v systémových knihovnách znovu instaloval. Při "apt-get dist-upgrade" jsem ale narazil na následující chybovou hlášku:
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
Řešením nakonec bylo nainstalovat balík locales a locales-all a spustit příkaz:
locale-gen
Při hledání řešení jsem také narazil na možnost, že není uveden seznam lokalizací, ze kterých se má vybírat. V takovém případě editujte soubor /etc/locale.gen a odkomentujte (odstraňte znak # na začátku řádku) řádky s vaší lokalizací. Například v mém případě to je:
cs_CZ.UTF-8 UTF-8
Teprve pak je možné spustit příkaz locale-gen.

Obecné základy programování: Úvod

Tento seriál je určen především těm, kteří s programováním nemají žádné, nebo jen malé zkušenosti. Budu se snažit jednoduchým způsobem vysvětlit základy principů nutných pro programování. Předem děkuji za jakoukoli kritiku nebo nápady.

V dnešním díle si popíšeme, co vlastně programování je a co k němu bude potřeba.

Continue reading "Obecné základy programování: Úvod"

Menu nad flash videem

V poslední době jsem se setkal se zajímavým problémem. V diskusi žadatel uváděl, že na stránce má dynamické menu vytvořené pomocí JavaScriptu. Na stejné stránce bylo umístěno i video z Youtube.com. Problém nastal, pokud jednotlivé položky menu přesáhly nad video. Jednotlivé položky pak po najetí myší mizely.

Pokud byste se s podobným problémem setkali i vy, můžete použít následující dvě řešení. V obou případech se bude menu zobrazovat korektně a nebude mizet. Prvním řešením je uvedení

?wmode=opaque

za adresu videa.

Kód pro vložení videa pak bude vypadat následovně:

<iframe width="420" height="315" src="http://www.youtube.com/embed/Zhawgd0REhA?wmode=opaque" frameborder="0" allowfullscreen></iframe>

Druhou možností, je použít starý způsob vkládání videa pomocí tagu object, do kterého vložíte param s nastavením wmode (2. řádek).

<object width="420" height="315">
	<param name="wmode" value="opaque">
	<param name="movie" value="http://www.youtube.com/v/Zhawgd0REhA?version=3&amp;hl=cs_CZ">
	<param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always">
	<embed src="http://www.youtube.com/v/Zhawgd0REhA?version=3&amp;hl=cs_CZ" type="application/x-shockwave-flash" width="420" height="315" allowscriptaccess="always" allowfullscreen="true"></embed>
</object>

Pokud by někoho zajímalo, co wmode způsobuje, doporučuji si přečíst celkem detailní popis na této anglické stránce. Pro ty, kteří nechtějí marnit čas, zkusím uvést krátké shrnutí. wmode určuje, jak bude flash do stránky vykreslen. V základním nastavení (wmode=window) se flash video vykresluje do vlastního "okna". To je následně umístěno tam, kde se má v prohlížeči video přehrát. Takové okno je samozřejmě nad veškerým obsahem stránky. Hodnoty wmode=opaque a wmode=transparent naopak vykreslují přímo do okna prohlížeče.

Poznámka:
Pokud ve videu již je nějaký parametr, nebude tento způsob fungovat. Otazník je nutné nahradit &.

A ještě jedna rada na konec. Na většině stránek se slepě doporučuje používání wmode=transparent. Není to špatně a problém to vyřeší. Může to ale zpomalit přehrávání videa. V tomto módu se totiž pozadí stránky bude zobrazovat v průhledných částech videa. Stránka reálně "vidět" skrz video nebude, protože nemá žádné průhledné části. Flash se o to ale stejně bude snažit. To může zpomalit vykreslování.

Mnemotechnická pomůcka – Periodická tabulka

Věty pro lepší zapamatování si pořadí prvků v I.A - VIII.A.

I.A

Helenu bal na krk robustní cestář Franc

H Li Na K Rb Cs Fr

II. A

žela Magda caňonem, srážela balvany ramenem.

Be Mg Ca Ba Sr Ra

III. A

Boxer Ali galantně inkasoval tlapou.

B Al Ga In Tl

IV. A

Co si Getrůdo snědla proboha?

C Si Ge Sn Pb

V. A

Náš pan asistent sboural biograf.

N P As Sb Bi

VI. A

O slečno, sejměte ž podprsenku.

O S Se Te Po

VII. A

Filip cloumal bradou indického ataše.

F Cl Br I At

VIII. A

Hektor nechtěl armádní krasavici Xenu ranit.

He Ne Ar Kr Xe Ra