R S  

www.
Webylon.info
3. ledna 2006
  Offline verze  
 
 
(§ S00)

Řešení obsah

Zveřejněno 15. července 2004

Každý problém má své řešení. I velký a zamotaný problém může mít řešení malé a prosté.

Obsah části S

Veškeré zdrojové kódy uvedené v této části můžete užívat i upravovat dle libosti. Složitějším projektům poslouží spíše jako vodítko k vlastním implementacím.

 
(§ S01)

Použití řešení

Zveřejněno 20. srpna 2004

Domníváte se, že rozlišování prohlížeče při ošetřování každé drobnosti musí být složité? Ano? Pak vám tento článek dokáže, že se mýlíte.

Funkce Bake (§ S02) pracuje jako filtr aplikovaný na generovaný výstup serverového skriptu. Její činnost bývá zařízena konfiguračním souborem serveru. Je nezávislá na dílčích stránkách/stylech/skriptech, proto není webmaster nucen dělat složité uprávy v každém souboru, kde ji chce využít.

Užívaná syntaxe

K určení prohlížeče, pro nějž je určena následující část výstupu, je používán speciální přepínač. Jeho zjednodušená definice by mohla vypadat takto:

#( [ [+ | -] <prohlížeč>+ ] ) [ <výstup> ]

Symbol <prohlížeč> je jednoznakovým vyjádřením prohlížeče, ke kterému se přepínač vztahuje (dále jen „znak prohlížeče”). Z definice je zřejmé, že v přepínači může být takto uvedeno libovolné množství znaků prohlížečů. Možné znaky a k nim příslušné prohlížeče jsou:

  • I - Explorer počínaje verzí 5.5 a jiné prohlížeče založené na jádru Trident
  • M - Mozilla a jiné prohlížeče založené na jádru NGLayout (Gecko)
  • O - Opera počínaje verzí 7.0
  • E - Explorer 5.0
  • X - jiné prohlížeče než I, M, O, E.
  • * (hvězdička) - všechny prohlížeče (tedy I nebo M nebo O nebo E nebo X)

Čtvero pravidel

(1)  Není-li v přepínači hned před znaky prohlížečů uveden symbol plus nebo mínus, znamená to, že následující <výstup> bude poslán pouze v prohlížečům, jejichž znaky jsou v přepínači uvedeny.

(2)  Je-li v přepínači hned před znaky prohlížečů uveden symbol plus, znamená to, že následující <výstup> bude poslán nejen v prohlížečům, jejichž znaky jsou v přepínači uvedeny, ale i prohlížečům, kterým byl poslán <výstup> předcházející.

(3)  Je-li v přepínači hned před znaky prohlížečů uveden symbol mínus, znamená to, že následující <výstup> bude poslán jen těm prohlížečům, kterým byl poslán <výstup> předcházející a zároveň jejich znaky nejsou v přepínači uvedeny.

(4)  Výchozí stav na počátku každého výstupu je, že následující <výstup> bude poslán všem prohlížečům.

Příklad použití

Pár názorných ukázek je pro člověka mnohdy přínosnější než stovka definic.

Ukázková HTML stránka:

<html>
<head>
    <title>Vítejte na této stránce#(OMIE) odladěné pro
    #(O)Operu#(M)Mozillu#(IE)Explorer#(*)!</title>
    <link rel="stylesheet" type="text/css" href="#stylopis.css">
</head>
<body>
    <h1>Ahoj světe!</h1>
    <p>Tato stránka ví, co používáte za prohlížeč.
       Může skvěle počítat s jeho chováním.</p>
    <h2>S čím konkrétně?</h2>
    <ul>
#(OM)   <li>s CSS vlastnostmi max/min-width/height</li>
#(OMI)  <li>s PNG obrázky včetně alfakanálu 
            #(-OM) bez nutnosti skriptování #(+OM)</li>
#(MIE)  <li>se skriptovatelnou HTTP komunikací</li>
#(OMI)  <li>s kompletní podporou ECMAScriptu</li>
#(OMIE) <li class="sRukou">se spolehlivě nastavitelným 
                           kurzorem „ruka” přes CSS</li>
#(IE)   <li>s ActiveX (např. kalendáře, posuvníky)</li>
#(OMIE) <li>s fixním pozicováním#(-OM) (emulací)#(+OM)</li>
#(*)    <li>... možností je spousta</li>
    </ul>
#() Tento text nikdy nikdo neuvidí. Může sloužit jako pomocný
    komentář pro webmastera. Narozdíl od komentáře <!-- -->
    není stahován návštěvníkem (beztak je mu k ničemu). #(*)
</body>
</html>

... a její ukázkový stylopis:

body    { background: white; color: #(X)black; 
          #(E)darkblue; #(I)blue; #(M)red; #(O)darkred; #(*)}
.sRukou { cursor: #(-IE)pointer#(IE)hand#(*); }

Na této ukázkové stránce se zobrazí návštěvníkovi seznam jen těch možností, které použitý prohlížeč podporuje. Kromě toho bude mít v každém prohlížeči jinou barvu. Taková stránka sice žádný praktický význam nemá, ale snad stačí pro porozumění.

 
(§ S02)

Rozbor řešení

Zveřejněno 20. srpna 2004

Funkce Bake pracuje jako filtr výstupu. Kód, který by měl být jinak poslán návštěvníkovi, je odchycen a poslán návštěvníkovi v upravené formě.

Způsob odchycení je závislý na použitém webovém serveru a skriptovacím/programovacím jazyku. Popis konkrétních řešení včetně zdrojových kódů najdete v jiných článcích.

Proč se ta funkce jmenuje „Bake“? Tento název byl zvolen symbolicky. Staří Babyloňané psali na hliněné desky, které potom pekli. Upečená deska vyhovovala čtenářům lépe.

Připravíme Ingredience

Na vstupu dostává naše funkce řetězec, jenž by běžně putoval k návštěvníkovi. Říkejme mu třeba text. Kromě něj máme díky HTTP hlavičce požadavku k dispozici ještě identifikaci návštěvníkova prohlížeče. Uložme si ji do proměnné agent.

V první části určíme znak prohlížeče z řetězce agent. Stačí nám k tomu jednoduché funkce pro práci s řetězci: vyhodnocení, zda řetězec obsahuje jiný řetězec, případně specifičtější vyhodnocení, zda řetězec začíná na jiný řetězec. Nejužívanější čtyři identifikace lze od sebe neomylně rozlišit i přesto, že se na první pohled maskují.

Správným poskládáním operátorů získáme znak prohlížeče, nazvěme ho ua. Připravíme si novou proměnnou output pro ukládání profiltrovaného výstupu a můžeme zahájit hlavní smyčku.

Vykostíme

V těle hlavní smyčky zjišťujeme a pracujeme s následujícími údaji:

  • Pozice začátku znaků přepínače, pozice znaků prohlížečů a pozice konce znaků přepínače - proměnné p1, p2 a p3
  • Znaky prohlížeče - proměnná bL
  • Předcházející stav - proměnná admit
  • Profiltrovaný výstup - proměnná output

Pozice p1, p2 a p3 zjistíme funkcí vracející pozici řetězce v řetězci, případně ji odvodíme z počtu znaků přepínače. Na začátku těla smyčky rozhodneme, zda má být část textu od předchozího přepínače vložena do outputu. Toto rozhodnutí už vlastně bylo vykonáno při minulém průběhu, kdy se nastavila proměnná admit podle znaků prohlížečů.

Jak tedy vyhodnotit admit? Rozumně, podle čtvera pravidel (§ S01): Pokud se řetězec se znaky prohlížečů týká aktuálního ua, pak se za předpokladu, že před znaky prohlížečů není mínus, nastaví admit na hodnotu true. Naopak, pokud se řetězec se znaky prohlížečů netýká aktuálního ua, pak se za předpokladu, že před znaky prohlížečů je mínus nebo plus, nastaví admit na hodnotu false. Jinak se jeho hodnota nemění. Počáteční hodnota je true.

Po posledním průchodu smyčkou musíme ještě uložit zbytek proměnné text do outputu v závislosti na hodnotě admit.

Podáváme

Proměnná output nakonec obsahuje přesně to, co jsme žádali. Pošleme ji s klidným svědomím do návštěvníkova prohlížeče. Časová i paměťová složitost našeho algoritmu je nejnižší možná. Ve srovnání s tím, co běžné serverové skripty/aplikace provádí, je zanedbatelná.

Podle výše uvedeného obecného postupu můžete funkci Bake implementovat prakticky v libovolném skriptovacím/programovacím jazyku. Můžete využít hotové konkrétní implementace v PHP (§ S03), nebo v ASP.NET v jazycích C# (§ S04) či VB.NET (§ S05).

 
(§ S03)

Řešení v PHP

Zveřejněno 22. července 2004

Funkci Bake (§ S02) můžete aplikovat na výstup všech PHP skriptů. Snadno a rychle, bez zásahu do jednotlivých *.php souborů.

Poslouží vám k tomu konfigurační soubor .htaccess. Ten určuje pravidla pro webový server Apache a vztahuje se vždy k aktuálnímu adresáři (včetně podadresářů). Z toho logicky vyplývá, že provozujete-li PHP na jiném serveru, s vysokou pravděpodobností vám nebude následující řešení fungovat.

.htaccess

AddHandler webylon .php
Action webylon /.webylon
AddType application/x-httpd-php .webylon

Řádek 01 specifikuje, které typy souborů mají být skriptem .webylon zpracovány. Řádek 02 říká, kde se tento skript nachází, a řádek 03 určuje, že s ním bude nakládáno jako s běžným PHP skriptem.

.webylon

<?php
header('Vary: User-Agent');
$file = $_SERVER['PATH_TRANSLATED'];
ob_start();
require($file);
$buffer = ob_get_contents();
ob_end_clean();
echo webylon_bake($buffer);

function webylon_bake($text)
{
    $agent = $_SERVER['HTTP_USER_AGENT'];

    $uaOi = strpos($agent, 'Opera');
    $uaM = strpos($agent, 'Gecko/') !== FALSE;
    $uaI = strpos($agent, 'MSIE 6.0') !== FALSE
        || strpos($agent, 'MSIE 5.5') !== FALSE;
    $uaE = strpos($agent, 'MSIE 5.0') !== FALSE
        && strpos($agent, 'Win') !== FALSE;
    $uaO = $uaOi !== FALSE;
    $ua = $uaO ? 'O' : ($uaM ? 'M' :
         ($uaI ? 'I' : ($uaE ? 'E' : 'X')));
    if ($uaO) if ($agent[$uaOi + 6] < '7') $ua = 'X';

    $admit = TRUE;
    $p1 = 0;
    $p2 = strpos($text, '#(');
    while ($p2 !== FALSE)
    {
        if ($admit) $output .= substr($text, $p1, $p2 - $p1);
        $p3 = strpos($text, ')', $p2 += 2);
        $bL = substr($text, $p2, $p3 - $p2);

        $admit = (strpos($bL, '*') !== FALSE ||
                  strpos($bL, $ua) !== FALSE) ?
              !strstarts($bL, '-') : ((strstarts($bL, '+') ||
               strstarts($bL, '-')) ? $admit : FALSE);

        $p1 = $p3 + 1;
        $p2 = strpos($text, '#(', $p1);
    }
    if ($admit) $output .= substr($text, $p1);
    return $output;
}

function strstarts($str1, $str2)
{
    return substr($str1, 0, strlen($str2)) == $str2;
}
?>

Řádek 02 ve výše uvedeném skriptu zajišťuje, aby proxy servery neposílaly profiltrovaný výstup jiným prohlížečům, než pro které je určen. Viz hlavička Vary protokolu HTTP 1.1.

Využité direktivy a funkce

  • AddHandler - nastaví pro soubory se zadanou příponou druh zpracování
  • Action - nastaví pro určitý druh zpracování akci (např. PHP skript)
  • AddType - přiřadí souborům se zadanou příponou typ
  • ob_start - zapne ukládání výstupu do zásobníku (bufferu)
  • ob_get_contents - vrací současný obsah zásobníku
  • ob_end_clean - ukončí ukládání výstupu do zásobníku a zásobník vymaže
  • strpos - vrací pozici prvního výskytu řetězce v řetězci nebo FALSE
  • strstarts - vrací, zda řetězec začíná na řetězec
  • substr - vrací část řetězce

Ostatní funkce jsou snad dostatečně známé a nevyžadují bližší vysvětlení. Práce s polem $_SERVER a funkcí echo patří k základním znalostem programátora PHP skriptů.

Věnujte prosím pozornost i nedostatkům tohoto řešení (§ S07).

 
(§ S04)

Řešení v C#

Zveřejněno 22. července 2004

Funkci Bake (§ S02) můžete aplikovat na výstup všech ASP.NET skriptů. Snadno a rychle, bez zásahu do jednotlivých *.aspx souborů.

Soubor Global.asax slouží k odchytávání událostí vyšších úrovní. Při první příležitosti ho ASP.NET zkompiluje do dynamické třídy rozšiřující základní třídu HttpApplication. Jeho vykonávání je pak rychlé.

Při odchycení návštěvníkova požadavku můžete změnit přirozený průběh. Víte adresu požadované stránky, víte všechny další parametry požadavku a máte i možnost získat výstup kteréhokoliv skriptu. Můžete vykonat skript dříve, než ho ASP.NET vykoná běžným způsobem, a zároveň mít nad jeho výstupem plnou kontrolu.

Výstup necháte zpracovat funkcí Bake, pak ho pošlete návštěvníkovi. Aby nedorazil k návštěvníkovi ještě podruhé v nezpracované formě, je třeba ještě zastavit výstup.

Global.asax

<script language="C#" runat="server">
protected void Application_BeginRequest(Object sender, EventArgs e)
{
    Response.AddHeader("Vary", "User-Agent");
    System.IO.StringWriter buffer = new System.IO.StringWriter();
    Server.Execute(HttpContext.Current.Request.Path, buffer);
    Response.Write(Webylon_Bake(buffer.ToString()));
    Response.End();
}

String Webylon_Bake(String text)
{
    String agent = Request.UserAgent;

    const String wnBegin = "#(";
    const String wnEnd = ")";

    int uaOi = agent.IndexOf("Opera");
    bool uaM = agent.IndexOf("Gecko/") > -1;
    bool uaI = agent.IndexOf("MSIE 6.0") > -1
            || agent.IndexOf("MSIE 5.5") > -1;
    bool uaE = agent.IndexOf("MSIE 5.0") > -1
            && agent.IndexOf("Win") > -1;
    bool uaO = uaOi > -1;
    char ua = uaO ? 'O' : uaM ? 'M' : uaI ? 'I' : uaE ? 'E' : 'X';
    if (uaO) if (agent[uaOi + 6] < '7') ua = 'X';

    String output = "", bL;
    bool admit = true;
    int p1 = 0, p2, p3;
    p2 = text.IndexOf(wnBegin);
    while (p2 > -1)
    {
        if (admit) output += text.Substring(p1, p2 - p1);
        p3 = text.IndexOf(wnEnd, p2 += wnBegin.Length);
        bL = text.Substring(p2, p3 - p2);

        admit = (bL.IndexOf("*") > -1 || bL.IndexOf(ua) > -1) ?
                !bL.StartsWith("-") : (bL.StartsWith("+") ||
                 bL.StartsWith("-")) ? admit : false;

        p1 = p3 + wnEnd.Length;
        p2 = text.IndexOf(wnBegin, p1);
    }
    if (admit) output += text.Substring(p1);
    return output;
}
</script>

Řádek 04 ve výše uvedeném skriptu zajišťuje, aby proxy servery neposílaly profiltrovaný výstup jiným prohlížečům, než pro které je určen. Viz hlavička Vary protokolu HTTP 1.1.

Využité události a metody

Ostatní metody jsou snad dostatečně známé a nevyžadují bližší vysvětlení. Práce s objekty Request a Response patří k základním znalostem programátora ASP.NET aplikací.

Věnujte prosím pozornost i nedostatkům tohoto řešení (§ S07).

 
(§ S05)

Řešení ve VB.NET

Zveřejněno 16. srpna 2004

Funkci Bake (§ S02) můžete aplikovat na výstup všech ASP.NET skriptů. Snadno a rychle, bez zásahu do jednotlivých *.aspx souborů.

Soubor Global.asax slouží k odchytávání událostí vyšších úrovní. Při první příležitosti ho ASP.NET zkompiluje do dynamické třídy rozšiřující základní třídu HttpApplication. Jeho vykonávání je pak rychlé.

Při odchycení návštěvníkova požadavku můžete změnit přirozený průběh. Víte adresu požadované stránky, víte všechny další parametry požadavku a máte i možnost získat výstup kteréhokoliv skriptu. Můžete vykonat skript dříve, než ho ASP.NET vykoná běžným způsobem, a zároveň mít nad jeho výstupem plnou kontrolu.

Výstup necháte zpracovat funkcí Bake, pak ho pošlete návštěvníkovi. Aby nedorazil k návštěvníkovi ještě podruhé v nezpracované formě, je třeba ještě zastavit výstup.

Global.asax

<script language="VB" runat="server">
Protected Sub Application_BeginRequest()
    Response.AddHeader("Vary", "User-Agent")
    Dim buffer As System.IO.StringWriter
    buffer = new System.IO.StringWriter()
    Server.Execute(HttpContext.Current.Request.Path, buffer)
    Response.Write(Webylon_Bake(buffer.ToString()))
    Response.End
End Sub

Function Webylon_Bake(ByVal text As String) As String
    Dim agent As String = Request.UserAgent

    Const wnBegin As String = "#("
    Const wnEnd As String = ")"

    Dim uaOi As Integer = agent.IndexOf("Opera")
    Dim uaM As Boolean = agent.IndexOf("Gecko/") > -1
    Dim uaI As Boolean = (agent.IndexOf("MSIE 6.0") > -1) _
                      Or (agent.IndexOf("MSIE 5.5") > -1)
    Dim uaE As Boolean = (agent.IndexOf("MSIE 5.0") > -1) _
                     And (agent.IndexOf("Win") > -1)
    Dim uaO As Boolean = uaOi > -1
    Dim ua As Char = IIf(uaO, "O", IIf(uaM, "M", _
                     IIf(uaI, "I", IIf(uaE, "E", "X"))))
    If uaO Then If agent(uaOi + 6) < "7" Then ua = "X"

    Dim output As String = "", bL As String
    Dim admit As Boolean = True
    Dim p1 As Integer = 0, p2 As Integer, p3 As Integer
    p2 = text.IndexOf(wnBegin)
    While p2 > -1
        If admit Then output = output + text.Substring(p1, p2 - p1)
        p2 = p2 + wnBegin.Length
        p3 = text.IndexOf(wnEnd, p2)
        bL = text.Substring(p2, p3 - p2)

        admit = IIf((bL.IndexOf("*") > -1) _
                 Or (bL.IndexOf(ua) > -1), _
                 Not bL.StartsWith("-"), _
                IIf((bL.StartsWith("+") _
                  Or bL.StartsWith("-")), admit, False))

        p1 = p3 + wnEnd.Length
        p2 = text.IndexOf(wnBegin, p1)
    End While

    If admit Then output = output + text.Substring(p1)
    Return output
End Function
</script>

Řádek 03 ve výše uvedeném skriptu zajišťuje, aby proxy servery neposílaly profiltrovaný výstup jiným prohlížečům, než pro které je určen. Viz hlavička Vary protokolu HTTP 1.1.

Využité události, metody a funkce

Ostatní metody jsou snad dostatečně známé a nevyžadují bližší vysvětlení. Práce s objekty Request a Response patří k základním znalostem programátora ASP.NET aplikací.

Věnujte prosím pozornost i nedostatkům tohoto řešení (§ S07).

 
(§ S07)

Možná úskalí

Zveřejněno 17. srpna 2004

Každý nástroj má svá pro a proti. Řešení popisované na tomto webu je také jen nástrojem. Nehraje si na všemocného kouzelníka, nedává vám samo o sobě záruky stoprocentní funkčnosti, neprobouzí plané naděje. Pouze vám usnadňuje práci.

Neopatrnou manipulací s nástrojem si naopak práci můžete přidělat. V horším případě si způsobíte odliv návštěvníků nebo umístění na černou listinu vyhledávačů.

Aby k něčemu takovému nedošlo, stačí dodržet pár základních pravidel.

Důsledně testujte

Správné zobrazení ověřte před vystavením stránky na web ve všech prohlížečích, na něž se vztahuje přepínač. Jste jen člověk (přepokládám), takže jste mohl(a) v přepínači udělat překlep nebo na něco zapomenout. Jako prohlížeč se znakem X doporučuji čtyřkovou verzi Netscapu nebo Exploreru (ten podporuje část CSS 2 a stránka v něm nemusí být čitelná).

Užíváte-li funkci Bake v nezměněné podobě, musíte mít nainstalovaných alespoň pět prohlížečů: Explorer 5.0, Explorer 5.5/6.0, Operu 7 (v adware verzi zdarma), Mozillu a nějaký ten starý exemplář. Nemáte-li Windows, užijte ke spuštění Exploreru unixový API překladač Wine. Nemáte-li ani Linux, ani FreeBSD, ani Solaris, nainstalujte si jeden z nich. Jsou zdarma.

Trpíte-li Macintoshem, dejte si pozor na tamní Explorer 5, s tím windowsovým má společné jen jméno. U Mozilly na nekompatibility mezi platformami nenarazíte, u Opery zpravidla také ne.

Buďte tolerantní

Zapomeňte na váš kladný/záporný vztah k prohlížeči návštěvníka. Málokdo si prohlížeč vybírá sám. Ujasněte si role: Vy nesoudíte návštěvníka, návštěvník soudí vás (§ R01).

Nepoužívejte Webylon jako nástroj k odříznutí konkrétního prohlížeče od nějaké funkce jen proto, že jste líní problém řešit. Pokud řešení existuje, nebojte se ho. Nikdy není tak těžké a složité, jak se na první pohled zdá. Složité problémy totiž neexistují, existuje jen ta lenost.

Snažte se návštěvníkům vyjít vstříc za každých okolností. Jestliže se webdesignem zabýváte profesionálně, pamatujte na to, že vaše konkurence nemusí být líná.

Mimořádně velký pozor si dejte na to, abyste všem návštěvníkům (i těm s neznámým prohlížečem) dodávali totožný obsah. V opačném případě riskujete, že vás brzy vyřadí vyhledávače ze svého indexu.

Sledujte své statistiky

Vaše stránky/webové aplikace mají svůj okruh čtenářů/uživatelů. Bedlivě sledujte rozšíření minoritních prohlížečů. Jakmile se některý z nich více rozšíří a s jeho chování je deterministické, upravte patřičným způsobem funkci Bake.

Rozšířený minoritní prohlížeč můžete přiřadit k některému již existujícímu, pokud je jeho chování dostatečně podobné. Třeba prohlížeč Konqueror/Safari je do značné míry kompatibilní s Mozillou a dokonce to uvádí ve svém User-Agent řetězci.

Má-li váš web opravdu velkou návštěvnost, možná se vám vyplatí optimalizace i pro staré prohlížeče. Ačkoliv Internet Explorer 4 používá méně než promile návštěvníků, můžete také jim brouzdání zpříjemnit. Mezi sto tisíci přístupy denně může mít několik stovek lidí prohlížeč, který nepodporuje CSS 2, ale umí tabulky.

Doporučené znaky pro další prohlížece (abecedně):

  • B - OmniWeb
  • C - Ice Browser
  • A - Internet Explorer 5 pro Macintosh
  • i - iCab
  • K - Konqueror/Safari a jiné prohlížeče založené na jádru KHTML
  • V - WebTV

Nedostatky implementace

Užijete-li skripty bez úprav tak, jak jsem je stvořil, narazíte nejspíš na chyby při generování obrázků. Ty můžete snadno ošetřit tím, že generující skripty podle nějakého pravidla (např. řetězec v cestě) vyřadíte ze zpracování funkcí Bake.

Posledním nebezpečím může být sám návštěvník. Umožníte-li mu vkládat text do stránky, může vložit nežádoucí přepínač. Řešení je snadné: ve vkládaném příspěvku nahradit znak # entitou &#35;.

 
 
(§ R00)

Pravidla obsah

Zveřejněno 24. července 2004

Na World Wide Web lze nahlížet i jako na pozoruhodný ekosystém. Proto v něm neplatí pevně definované zákony, nýbrž pouze zákonitosti.

Obsah části R

 
(§ R01)

Splnitelné přání

Zveřejněno 24. července 2004

Všichni uživatelé sítě WWW mají jedno základní přání. Je to přání staré jak World Wide Web sám. Přání, které podvědomě vyslovuje každý návštěvník. Přání, které doprovází každý odcházející HTTP požadavek. Víte, jaké to je? Jde o přání „prosím, ať ta stránka bezchybně funguje“.

Ne vždy je toto přání vyslyšeno. Webový server pošle návštěvníkovi stránku s bezcitnými slovy „přeber si to“. Není se čemu divit, server je jen program. Za funkčnost stránky odpovídá webmaster. Vždy.

Webmasteři ale trpí různými „webovými chorobami“. Stane se, že jimi spravovaná stránka přání návštěvníka nevyhoví. Někdy se potom dokonce snaží toho hanebného činu zříci a svalit vinu na někoho jiného. Neuvědomují si, že to přání návštěvníka... je svaté.

Obhajoba Webmasterova

Jaké mají webmasteři důvody pro nevyslyšení přání? Inu, upřednostňují zpravidla nějakou „vyšší autoritu“, než je návštěvník. Zapomínají, že žádná vyšší autorita není. Jak se potom před návštěvníkem hájí? Vážený návštěvníku, stránka vám nefunguje bezchybně, protože ...

  • je psána a odladěna pro prohlížeč A a vy používáte B. Je to vaše chyba!
  • máte vypnutý javaskript nebo zobrazování obrázků. Je to vaše chyba! Můžete ji (možná) snadno napravit.
  • využívá technologií prohlížeče A, které v prohlížeči B nejsou, a neposkytuje alternativu. Je to chyba výrobce prohlížeče a taky vaše! Můžete si přeci spustit (nebo nainstalovat) A.
  • dodržuje doporučení W3C, které váš prohlížeč B nedodržuje. Je to chyba výrobce prohlížeče i vaše, oba společně bráníte skvělé W3C standardizaci!
  • trpíte zdravotním postižením a váš prohlížeč se chová jinak, než by měl podle W3C WCAG. Je to chyba výrobce prohlížeče, tedy i vaše!
  • váš prohlížeč B je příliš starý. To není chyba výrobce prohlížeče (v době vydání byl jeho produkt nový), to je jen vaše chyba!

V pomyslné soudní síni, webmaster pronese takovouto obhajobu. Jím oslavovaná vyšší autorita (výrobce prohlížeče A nebo W3C), sedící v hledišti, nadšeně tleská. Spřízněné webmasterské duše přikyvují. V tom se síní rozezní trpké slovo „Vinen“. Tak zní rozsudek soudce, autority nejvyšší. Tak zní rozsudek návštěvníka. Okamžitě po jeho vynesení opouští soudní síň a jde tam, kde bude snad jeho přání vyslyšeno.

Střet Ideálů

Web je založený na principech svobody. Neexistuje žádný patent, který by omezoval lidi v tvoření stránek. Nejsou omezeni ani v tvoření prohlížečů. Každý si může naprogramovat vlastní prohlížeč a není svazován ničím. Nemusí uznávat žádné W3C doporučení, žádný standard. Jen jedinou věc potřebuje k tomu, aby jeho produkt někdo běžně používal: Musí se vypořádat s dostatečným množstvím již existujících stránek.

Pojem „dostatečné množství“ je dosti neurčitý. Může to být zrovna vaše stránka, která se do dostatečného množství daného prohlížeče nevejde. Potom vůbec nebude záležet na tom, zda dodržujete W3C doporučení. Návštěvník je nemilosrdný a nemá-li s dostatečným množstvím stránek problémy, odsoudí vás. Vy jste totiž tím, kdo neumí napsat stránku stejně, jako dostatečné množství jiných.

Konsorcium W3 dlouhodobě utváří mylnou, leč příjemnou představu, že viníkem návštěvníkova zklamání může být výrobce prohlížeče (a nevědomky tedy i jeho uživatel, návštěvník sám):

Použijete-li nekorektní HTML a váš dokument nefunguje v určitém prohlížeči, je to vaše chyba; použijete-li korektní HTML a váš dokument nefunguje, je to chyba v prohlížeči.
Zdroj: www.w3.org/MarkUp/2004/xhtml-faq

Tato uklidňující představa tvoří základ jedné ze dvou nejrozšířenějších webových chorob: víry v jednotný standard. Respektive ve W3C doporučení.

Je to neobyčejně krásná víra. Nejvíce je na ní přitažlivá asi ta jednotnost. Ostatní její krásy, jako jsou „aura standardu“, formální přísnost, původ od otce webu a aktuální móda, ty nejsou zdaleka tak přitažlivé. Jednotnost je alfou i omegou. Není výhodou standardizace, je její základní podmínkou. Nemá zajišťovat eleganci, ale spolupráceschopnost.

Svobodný web ovšem žije vlastním životem. Skutečným. Nebyl jednotný na počátku své existence, nebyl jednotný ani během bouřlivého vývoje v 90. letech 20. století. Konsorcium k onomu chaosu velkou měrou přispělo, když ve svých doporučeních nezohledňovalo novinky rozšířených prohlížečů. Naopak jim záměrně přidělávalo problémy (§ C05).

Jakmile se skutečnost příliš podobá ideálu, je načase se probudit.
Staré webylonské přísloví

Web nebude stoprocentně jednotný nikdy. Je to stinná stránka jeho absolutní svobody.

Střet s realitou

Čím se tedy má webmaster hájit, když jeho stránku navštíví exotický prohlížeč a špatně ji zobrazí? Ničím. Jakákoli obhajoba je zbytečná. Rozsudek bude, bohužel, vždy stejný.

V moci webmastera však je, aby počet smutných rozsudků minimalizoval. Postačí, aby stránka zaručeně bezchybně fungovala téměř všem. Doporučení W3C tuto záruku neposkytují, poněvadž jsou v rozporu s tím, jak se tři nejrozšířenější prohlížeče chovají. Nejzřetelnější odchylky jsou patrné, stejně jako tomu bylo vždy, u majoritního prohlížeče. V současnosti je jím zatím Microsoft Internet Explorer 6.0.

Trojice nejrozšířenějších prohlížečů má odlišné implementace různých technologií. Mnoho užitečných věcí se kvůli nekompatibilitě nepoužívá, případně se jejich funkce složitě obchází. Část z nich je přítomna jen v jednom z trojice. Část ve dvou. Část je ve všech třech. Část je podle doporučení konsorcia, část nikoliv. Musí se webmaster ve své tvůrčí činnosti omezit na průnik schopností? Ne.

Lék

Kromě návštěvníkova svatého přání doprovází každý HTTP požadavek ještě jedna důležitá informace. V jeho hlavičce je vepsána identifikace prohlížeče, položka User-Agent. Dnešní webové servery nejsou hloupé. S vhodným programem umí na přání odpovědět vřelými slovy „vidím, že máš prohlížeč B, zde máš stránku, která ti bude zaručeně fungovat“.

Kdo serveru vysvětlí, aby se takto slušně choval? Přeci webmaster. Může potom vytvořit stránku, kterou skript přizpůsobí tak, aby naprosto přesně vyhovovala návštěvníkovu prohlížeči.

Není třeba psát pro každý detail složitou detekci a větvit podmínky. Není ani třeba dělat pracně několik různých verzí téže stránky. Problém vyřeší jednoduchý přepínač (§ S01), o jehož vyhodnocení se postará jednoduchý filtr výstupu (§ S02).

Nyní má 99,5 % všech internetových brouzdalů prohlížeč, jehož schopnosti můžete skvěle odvodit z jeho identifikace. Můžete se spolehnout na chování Exploreru, Mozilly i Opery. Nemusíte se omezovat na průnik schopností. Můžete využít jejich sjednocení.

 
(§ R02)

Trvanlivá informace

Zveřejněno 24. července 2004

Kupte si potravinu. Doporučuji nějakou chutnou, výživnou a zároveň zdravou. Nyní ji ponechte zavřenou jedno desetiletí ve vypnuté ledničce. Hotovo? Potravina se nejspíš zkazila. Její chuť se změnila. K horšímu. Vašemu zdraví už její konzumace také neprospěje, spíše naopak.

Informace se, na rozdíl od potraviny, nezkazí. Určitě jednou pozbude aktuálnosti, ale její znění zůstane stejné. Proto by ani její dostupnost neměla být omezována na určitou dobu.

Nejstarší dochované stránky na WWW toto pravidlo vcelku dodržují. V té době ještě neexistovaly kaskádové styly. Značky HTML užívané tenkrát stále fungují stejně ve většině prohlížečů. Vždyť také není důvod, aby byla jejich podpora odebrána.

Bez záruky

Kaskádové styly přinesly mnoho revolučních způsobů, jak obsah stránky znepřístupnit. Nebude-li prohlížeč podporovat stejnou implementaci stylů, s jakou webmaster počítá, může dojít k nejhoršímu. Webmasteři zpravidla ověřují funkčnost své stránky jen ve „velké trojce“ prohlížečů a doufají, že v ostatních nedojde k závažným problémům.

Jenže ono k problémům dojít může. Nemusí to být hned, ale třeba za rok. Stačí drobná změna v implementaci: Nadpis nečekaně povyroste do šířky a plovoucí <div> odplave do hlubin, kde by ho nikdo nečekal. Může dojít třeba i k překrytí obsahu. U odlišné implementace jsou možné různé anomálie.

Stačí, aby taková odlišná implementace zobrazila správně dostatečné množství stránek a aby daný prohlížeč měl příjemné uživatelské prostředí. Uživatel si ho nevybere podle podpory standardů, nýbrž právě podle toho, jak příjemně se mu s ním pracuje. Co z toho vyplývá? Že vám nikdo nezaručí, že se prohlížeče budou chovat v budoucnu stále stejně.

Konsorcium W3 iluzi takové záruky vytváří. Iluze nadčasové jednotnosti je pro něj vším. Samo však nemá dostatečnou autoritu mezi výrobci prohlížečů ani nyní.

Příklad ze současnosti: Narazíte na spoustu malých chytrých zařízení, které se s chutí ujmou stylopisu určeného pro klasickou obrazovku. Bohužel, ne vždy umí styly správně zpracovat. Proč to tedy riskují? Protože stránek, které pro ně mají speciální předpis, je málo. Výrobci se vyplatí nehorázně zbořit část propracovanějších webů, když tím alespoň trochu zkrášlí drtivou většinu ostatních.

Úplně bez záruky

Užíváte „CSS hacky“? Ty vycházejí zpravidla z nejisté implikace „odlišnost známého prohlížeče => kód jen pro něj“. Spousta webmasterů oslavujících W3C odmítá optimalizaci stránky pro konkrétní cílové zařízení s tím, že prohlížečů je mnoho, ne jen tři. Přitom naivně doufají, že jimi využitý hack dokonale oddělí právě jeden od zbytku.

Pod pojmem „mnoho prohlížečů“ se v jejich podání skrývají ostatní víceméně neznámé produkty, které (snad) dodržují W3C doporučení, a dosud neexistující verze prohlížečů stávajících. Jak zareagují tyto neznámé na využívanou „odlišnost známého prohlížeče“? Těžko říct, když jsou neznámé. Implikace může působit i na ně. A problém je na světě.

Užívání CSS hacků je snaha o optimalizaci pro konkrétní cílové zařízení, ač si to někteří nepřiznávají. Tato snaha může být kontraproduktivní právě v případě „mnoha prohlížečů“. Teď nebo za pár let.

S lhůtou

Nepropadejte beznaději. Řešení Webylonu (§ S01) vychází z implikace „identifikace známé verze prohlížeče => kód pro něj“. Dodáte-li neznámé verzi prohlížeče jen základní stylopis (písma, základní barvy), bude vaše stránka s vysokou pravděpodobností čitelná úplně všude. A nejen to, bude čitelná vždy, i když se o ni nebudete nadále starat.

Stránky, jejichž obsah je pravidelně a často aktualizován, jsou přibližně jednou za dva roky převlékány do novějšího kabátu. Není možné, aby se během oné krátké doby masově rozšířil nějaký supernový prohlížeč, se kterým by stránka při posledním převlékání nepočítala. Po dvou letech vyhodnotí webmaster statistiky, upraví funkci Bake (§ S02) a může ušít nový kabát, který opět dokonale padne 99 % návštěvníků. Zbývající 1 % přitom určitě neodřízne od obsahu.

Oligopolní jistota

Trh s webovými prohlížeči byl monopolní prostředí, nyní se transformuje do oligopolního. Oligopol je pojem z ekonomiky označující stav, kdy je málo velmi velkých subjektů a mnoho velmi malých.

V tomto stavu již existuje konkurence. Ne velká, ale dostačující k tomu, aby vyprovokovala pokrok. Jakpak dlouho ten oligopol vydrží? Člověk je sociální tvor, rád naslouchá jiným tvorům svého druhu. Někteří brouzdalové milují své prohlížeče a vzájemně si je doporučují. K tomu přičtěme ještě fakt, že napsat kvalitní prohlížeč je extrémně pracné. Proto velké subjekty rostou a malé upadají. Chudým je bráno, bohatým dáváno. Nespravedlivé? Pravdivé. Oligopol z trhu prohlížečů nezmizí nikdy.

Je na něm zajímavá jedna věc: nepotřebuje žádný vyspělý standard, je-li ze strany dodavatelů (zde webmasterů) vůle k individuálnímu přístupu. Nejsnadnějším individuálním přístupem je filtr Webylonu.

Rozumný pragmatik v oligopolu rád upustí od požadavků na obecnost. Zvolí maximální účinnost bez okovů byrokracie. Copak udělá idealista? A copak uděláte vy?


© Chamurappi 2004—2006
Všechna práva vyhrazena