Televize Z1: čirá amatérština

Zpravodajská televizní stanice Z1 začala vysílat 1. června.

Sláva! Zpravodajské televize a online zpravodajství mají další konkurenci. Nevadí, že ji málokdo chytí, nevadí, že web jim moc nefunguje, cení se hlavně snaha. Černo-rudá barevná kombinace i ozvěna symbolu SS v logu naznačují, že se snad konečně můžeme těšit na vyhraněně pravicovou stanici, která na našem trhu citelně chybí. Držme jim palce, ať se i přes svůj kostrbatý začátek v éteru udrží.

Pominu raději nepříjemně flekatý „oldskúl“ design webu a soustředím se na technickou stránku věci. A uvidím věci nevídané! JS framework MooTools funguje spolehlivě se všemi moderními browsery, a přesto ho webdesignéři stanice Z1 dokázali použít nějak fikaně a zařídit, že jejich web funguje jen v IE (a to ještě ne vše a všude, mně třeba nejde zvuk). S Mozillou, Operou nebo Safari se moc nepobavíte. Ryzí amatérština, jak si s něčím takovým někdo troufne vylézt v dnešní době na veřejnost, vůbec nechápu.

Kolik slov na webu můžete škrtnout?

Přetéká váš komerční web písmenky? Hlavně ty důležité stránky: homepage, představení produktu, landing stránky? Musíte toho návštěvníkům musíte říct hrozně moc a máte tak málo místa? Víte, jak si škodíte?

Exaktněji se tomu ve svém aktuálním sloupku věnuje Jakob Nielsen: Jak málo uživatelé čtou?. Odpověď není nijak překvapivá: málo, maličko. Čím víc toho na stránku dáte, tím toho přečtou méně.

Jedna věc jsou autorské stránky – většinou jde o webovou podobu literárních útvarů, povídky, reportáže, komentáře atd. – kam si čtenář přijde skutečně počíst stejně jako by si otevřel časopis nebo knihu. Ale co platí pro časopisecký útvar, už neplatí třeba pro zpravodajství. Jedna z prvních věcí, co se naučí každý novinář, je psát zprávy hierarchicky: v první větě shrnout vše podstatné, v prvním odstavci sdělit hlavní detaily, v dalších pak zjemňovat a přidávat podrobnosti. Správně napsanou novinovou zprávu můžete bez přemýšlení odmazávat od konce, v krajním případě si vystačíte s první větou nebo dokonce jen s titulkem.

Pro stránku v navigaci produktového webu, eshopu nebo obchodní prezentace platí ještě drastičtější zákonitosti: tyhle stránky totiž skoro nikdo nečte.

Uživatelé text skenují (prolétnou a zachytí jen několik klíčových slov a vizuálně silnější prvky), delší a na pohled méně důležité pasáže často přeskočí úplně. Čím méně slov na stránce je, tím víc si jich návštěvníci přečtou. Napište jen 7 výstižných slov a máte jistotu, že si je přečtou téměř všichni. Dejte si tam ukecaný román a máte zaručeno, že polovina návštěvníků odejde, aniž by to vůbec četli.

Použít tři – byť ne zcela přesná slova – je skoro vždy lepší než exaktně bezchybná ukecaná věta na dva řádky.

Web je pro nás holt pořád nové médium, máme ho málo pod kůží a pořád s ním pracujeme jako se statickou tištěnou informací. Pořád se snažíme na jedno místo narvat maximum informací najednou. Jenže web není statický. Web má vrstvy, odkazy, umí zobrazit dodatečné informace na požádání, tu rozbalit boxík, tu vyčarovat v prostoru tabulky, grafy, obrázky a animace, otevřít stránku s podrobnostmi, nabídnout sadu odkazů do takové hloubky, z nichž se případnému zájemci a detaily zatočí hlava. A na úvodní straně můžou zůstat jen ta tři nepřesná, ale velmi úderná slova.

Kolik slov ze svého webu můžete škrtnout?

Javascript: Reference na mateřský objekt v event handlerech

V Javascriptu se mi často stává, že mám vytvořenou nějakou objektovou strukturu a nějakou metodu takového objektu chci použít jako ovladač události (event handler). Ale zde nastává problém v tom, že klíčové slovo this odpovídá při volání handleru ne mateřskému objektu, kterému patří metoda, ale objektu, který vyvolal událost. Příklad:

function myObject(data) {
   this.Data = data;
   this.clickHandler = function() {
      alert(this);
      }
   // ...
   }

var obj = new myObject(data);
someElement.onclick = obj.clickHandler;

Pokud nastane událost someElement.onclick, zavolá se sice „metoda“ objektu obj.clickHandler, ale this bude v tom okamžiku znamenat objekt someElement, na které událost vznikla.

Často je v těchto handlerech potřeba pracovat s mateřským objektem – ostatně většinou takovéto konstrukce píšeme coby nějaké obecné knihovny či komplexní struktury a chceme využívat hlavní výhody objektového programování: tedy uzavřenost a kontext, kdy si každý podobjekt spravuje své věci, nemíchá se do jiných činností a nikdo se zase nemíchá do té jeho. Tento nedostatek a chybějící zpětná reference na mateřský objekt se dá různými způsoby obejít. Nejčastěji doplněním reference do potenciálních event triggerů – tedy objektů, které můžou vyvolat danou událost a přes které se pak lze na mateřský objekt dostat, např.:

// ...
   this.clickHandler = function() {
      alert(this.owner);
      }
// ...
someElement.onclick = obj.clickHandler;
someElement.owner = obj;

V tomto případě bude při vyvolání události v handleru hodnotou this.owner právě mateřský objekt obj. Jenomže ne vždycky je možné takové přiřazení udělat – objektů je vytvořených mnoho a v daném okamžiku nevíme, se kterým se právě pracuje, nebo event trigger není dostupný, abychom do něj mohli něco doplnit atd. Typicky se to stává při použití externích knihoven a frameworků. Vezměme jako příklad třeba jQuery a načítání dat přes ajax:

function myObject() {
   this.load = function() {
      $.get( this.URL, this.Params, this.onloadHandler );
      }
   this.onloadHandler = function(data) {
     /* this.Data = data ??? */
      }
   // ...
   }

var obj = [];
for (var i=0;i<objCnt;i++) obj[i] = new myObject(data);
// ...
obj[x].load();

Zde je po úspěšném načtení ajaxových dat opět coby handler zavolána metoda obj.onloadHandler, ale tentokrát v ní this odpovídá instanci interního objektu jQuery.ajax, ke kterému se (slušně) nedostaneme a nedá se do něj nic přidávat. Instancí MyObject je také mnoho a nemůžeme zjistit, který to právě je. A konečně volání ajaxu je asynchronní a může jich probíhat současně několik, takže nějaká globální proměnná nás taky nezachrání.

Je zde ale jedna věc, která není na první pohled vůbec zřejmá: ačkoli je dotyčný handler volán cizím objektem zvnějšku a je jakoby „vytržen“ ze svého kontextu v mateřském objektu, pořád zůstává jeho „metodou“ a při volání má jeho kontext a jmenný prostor. Jsou zde tedy dostupné všechny proměnné definované lokálně v rámci mateřského objektu. A dá se toho využít:

function myObject() {
   var thisObj = this;
   this.load = function() {
      $.get( this.URL, this.Params, this.onloadHandler );
      }
   this.onloadHandler = function(data) {
      thisObj.Data = data;
      thisObj.doAnythingElse();
      }
   // ...
   }

V lokální proměnné thisObj má objekt uloženu referenci sám na sebe, a tato reference bude dostupná i event handleru zavolanému úplně jiným objektem. Bude zde platit, že this je objekt, který vygeneroval událost (event trigger), a thisObj je objekt sám.

Doplnění:

Díky Davidovi za skvělý nápad v komentářích! Ještě jsem ho trochu upravil a vzniklo tak zatím nejlepší a formálně asi nejčistší řešení:

function dynamicHandler(obj,method) {
   return function(){ method.apply(obj,arguments) };
   }
// ...
function myObject() {
   // ...
   this.load = function() {
      $.ajax({
         url: this.URL,
         data: this.Params,
         success: dynamicHandler(this,this.onloadHandler),
         error: dynamicHandler(this,this.onerrorHandler)
         });
      }
   this.onloadHandler = function(Data) {
      // ...
      }
   this.onerrorHandler = function(XHR,ErrorString,Exception) {
      // ...
      }
   }

Jak je asi vidět, takhle to řešení funguje i s libovolným počtem parametrů, což je docela důležité. Standardní event handlery sice předávají obvykle parametr jen jeden (event), ale např. jQuery už vrací parametrů více (třeba callback $.ajax.error vrací argumenty až tři).

Mudrlanti

Je to takový blogerský evergreen. Založíte si svůj vlastní blog a pak si na něj píšete, co vás zrovna napadne. Ale protože vám na něm záleží, neplácáte pâté přes deváté, ale dobře si témata vybíráte. Ale ať napíšete cokoli jakkoli, dřív nebo později se objeví mudrlant, který ví daleko lépe než vy, co na svém blogu máte psát, jak to máte psát a kdy to máte psát. Nejčastěji je ten mudrlant anonymní a jeho mateřštinou je l33t. Osobně si jej představuju jako uhrovitého teenagera.

Řekněme třeba, že s několika známými už se nějaký ten pátek průběžně bavíte o Problematice Vaření Rýže. K tomu ještě jinde narazíte na intenzivní diskusi a zjistíte, že poměrně hodně lidí to zajímá. Napíšete tedy do své rubriky věnované výhradně vaření příspěvek o vaření rýže. Někoho to zajímá, někoho ne, tak to logicky nečte. Ostatně těm, co vaření psaní o něm vysloveně nesnášejí, jsem kdysi vyšel vstříc a na stránce mám k dispozici kategorie i RSS, kde jsou příspěvky o vaření vynechány. Nicméně to ničemu nebrání: logicky následuje příchod mudrlanta.

t0m4s3: Skoda takychto clankov (o vareni mozneho aj nemozneho), varenie moc nemusim a ryzu uz vobec nie.

Většinou to jen bez dalšího mažu – někdy je ale Den D, všechno se to sejde a další blbeček do sbírky člověka už jen dorazí. Takže se čas od času neudržíte a ještě dotyčnému odpovíte.

Vážený pane,

tak co na můj blog vůbec lezete, když se vám to nelíbí? Přijít, odplivnout si a odejít, to je normální křupanství, nic jiného. Když se mi něco nelíbí, tak si toho nevšímám a jdu jinam, ne?

Petr Staníček

Většinou to stačí, ale někdy mudrlant i reaguje.

t0m4s3: Myslel som to tak, ze je skoda, ze uz nevychadzaju clanky ako predtym. Je to same varenie… Dakujem ze ste si tiez ulavil

To pak většinou odpovím taky.

Kdybych speciálně kvůli takovým remcalům, co vědí lépe než já sám, o čem mám psát, nedělal ty extra odkazy a RSS na všechny články s vynechaným vařením… Hledejte v menu a v patičce. PetrS

No jo, já vůl. Proč v takové situaci vždycky tak snadno zapomenu, že nejednám s člověkem, ale s blbem?

t0m4s3: Ak neznesiete nazor ineho cloveka, nepiste. Nemoze sa kazdemu pacit vsetko, ale kazdy sa snad moze vyjadrit. Asi som vam slapol na ego alebo co…

Stále musíme mít na paměti, že svým čtenářům hodně dlužíme!

Vady nových Pravidel přístupnosti

Na podobě původních Pravidel přístupnosti pro weby veřejné správy jsem v době jejich vzniku spolupracoval. Každý z bodů jsme tehdy intenzivně diskutovali, precizovali a každý tam měl své místo i nikoli nepodstatný důvod existence. Po čase se ale v EU a na ministerstvu rozhodlo, že jiná pravidla budou víc cool a ta stávající že se tedy předělají.

Tak se tu něco škrtlo, tam něco změnilo, tuhle něco dopsalo a jsou tu Pravidla nová. A bohužel podle mě horší, než ta předchozí. Anebo spíš „horší“ – jak pro koho.

Když se podíváme na zdůvodnění a znění mnoha nových bodů těchto Pravidel, je zřejmé, směrem ke komu byly dělány především vstřícné kroky. Ne k postiženým a už vůbec ne k lidem s technickými omezeními. Úlitby se dělají především pánům webmasterům a úředníkům, kteří mají weby veřejné správy na starosti. Aplikace tohoto pravidla se v řadě případů ukázala být velice složitou, pravidlo bylo různě interpretováno, pravidlo je náročné na implementaci, z hlediska potřeb zrakově postižených se neprokázalo, že je nutné pravidlo aplikovat jako povinné atd. – čteme porůznu ve zdůvodněních. Na jedné straně protežování zrakově postižených (a to již na úrovni WCAG) na úkor všech ostatních postižení a omezení, na straně druhé „veřejnoprávně“ webmasterská lobby. To slepecké čtečce nevadí, to můžeme vyhodit. Ono je to těžké implementovat, to požadovat nebudeme. Co na tom, že tím hážeme klacky pod nohy třeba barvoslepým nebo lidem s minoritním technickým vybavením.

Vybral jsem proto několik nejmarkantnějších bodů, které byly z Pravidel vypuštěny nebo změněny do příliš benevolentní podoby, a vyrobil ukázkovou stránku, která možné důsledky neexistence přísnějších pravidel demonstruje. Třeba si řeknete, že to je přehnané. Jistěže je, na všechny uvedené problémy nakumulované na jediné stránce ve skutečnosti těžko narazíte. Ale se všemi jednotlivě jsem se už někdy – více či méně často – v reálu setkal. A protože co není (Pravidly) zakázáno, je povoleno, nic nebrání tomu, aby se tyto, podobné a mnohé další věci dály a abychom se s nimi potkávali třeba na webech ministerstev, magistrátů a státních úřadů.

Oklestit dobrá a prospěšná pravidla jen proto, že se to někomu nehodí do krámu (protože se to nesnadno implementuje) nebo proto, že se někomu udělal názor, že jiná pravidla budou lepší a tvůrci WCAG jsou nejmoudřejší hlavy na světě, je přinejmenším škoda. Ne-li hůř.

What I’m missing in CSS

In fact, there is only one thing I'm missing in CSS. But I miss it virtually every day: a kind of reusable parameters. What does it mean? Very often, I create a large stylesheets for a large project. A color palette is given and color codes are repeated many times through the stylesheet. It would be very nice to be able to predefine those colors as parameters (or user-defined keywords) at the beginning of the stylesheet, and then only use these symbolic values. Something like this (the syntax doesn't matter now):

@define {
   baseText: #003366;
   canvas: #f0f0f0;
   }

body {
   color: @baseText;
   background: @canvas;
   }
a:hover {
   color: @canvas;
   background: @baseText;
   }

If I need to replace a color in whole CSS, I could only edit one value in the @define section. If I want to change the color palette of the web site at once, I could edit only these predefined values.

Or, why use it for colors only? These substitutions could be useful in many ways.

@define {
   textColor: #003366;
   emphColor: #660000;
   canvasColor: #f0f0f0;
   baseFont: "palatino linotype", palatino, serif;
   titleFont: "Helvetica Narrow Black", Impact, Techno, sans-serif;
   stdPadding: 0.2em 2em 0.3em 1em;
   }
@define {
   stdBorder: 1px solid @textColor;
   }

body {
   color: @textColor;
   background: @canvasColor;
   font: 1em/1.67 @baseFont;
   }
h1 {
   color: @emphColor;
   font: 250%/1 @titleFont;
   }
.box {
   padding: @stdPadding;
   border: @stdBorder;
   }

Something like this would be very helpful in CSS 3.

Note: I'm sorry for this english spot on a non-english blog. I have no better place for it now. Comments in english only, please (if one is able to publish a comment through a Czech form).

Javascriptový problém: pojmenování obsahu pole

Narazil jsem na docela zajímavou otázku v Javascriptu a zajímalo by mě, jak takovou věc co nejelegantněji vyřešit. Řekněme, že mám funkci, která od nějkaého cizího externího zdroje dostává jediný parametr, který je pole. Pořadí a význam jeho položek jsou pevně dány, délka pole je proměnná (nemusí být uvedeny všechny definované položky) a podobu a způsob předávání toho parametru nemohu nijak ovlivnit. Otázka zní, jak co nejlépe načíst toto pole tak, abych na jeho položky nepřistupoval přes indexy, ale přes nějaká smysluplná jména.

V PHP to udělám snadno:

list($jmeno,$prijmeni,$datum,...,$status) = $arr;

V Javascriptu ale (pokud vím) podobný konstrukt není. Úplně nejpitomější řešení je nasnadě:

function X(arr) {
   var jmeno = arr[0];
   var prijmeni = arr[1];
   var datum = arr[2];
// ...
   var status = arr[arr.length-1];
// ...
   alert(prijmeni);
   }

Což je vážně docela hloupé. Malinko lepší (nebo spíš čistší) se jeví přiřazení do objektu:

function X(arr) {
   var osoba = {
      jmeno: arr[0],
      prijmeni: arr[1],
      datum: arr[2],
//    ...
      status: arr[arr.length-1]
      }
// ...
   alert(osoba.prijmeni);
   }

Taky si můžu ty názvy předdefinovat a přiřazení zautomatizovat:

function X(arr) {
   var def = ['jmeno','prijmeni','datum', ..., 'status'];
   var n = def.length;
   if (arr.length<n) n = arr.length;
   var osoba;
   for (var i=0;i<n;i++) osoba[def[i]] = arr[i];
// ...
   alert(osoba['prijmeni']);
   }

anebo rovnou jako správný drsoň:

Array.prototype.addKeys = function(def) {
   var n = Math.min(def.length, this.length);
   for (var i=0;i<n;i++) this[def[i].toString()] = this[i];
   }
function X(arr) {
   arr.addKeys(['jmeno','prijmeni','datum', ..., 'status']);
// ...
   alert(arr.prijmeni);
   }

Ale určitě existuje nějaký lepší, elegantnější způsob, jak si ten obsah pole pojmenovat. Napadne někoho něco?


Update: Moc pěkné řešení

Kolega wiki přišel na poměrně elegantní a podle mě vtipné řešení: předat pole, které funkce dostane, jako standardní parametry druhé funkci, která už s nimi bude pracovat normálně. Nejlépe ukázat na příkladu:

function X(arr) {
   X2.apply(null,arr);
   }
function X2(jmeno,prijmeni,datum,...,status) {
// ...
   alert(prijmeni);
   }

Podle potřeby bych si to mohl upravit do nějakých sofistikovanějších tvarů, ale princip zůstává. Ve finále by to mohlo vypadat například takhle:

function X(arr) {
   (function (jmeno,prijmeni,datum,...,status) {
//    ...
      alert(prijmeni);
      }).apply(null,arr);
   }

Má to jen malou mušku v tom, že to funguje až v Javascriptu 1.3, resp. JScriptu 5.5, tedy od IE 5.5 (v 5.0× to chodit nebude), ale to už by dnes nemělo skoro nikoho trápit. Díky moc za supr nápad.

Lekli jste se?

Nostalgie… Listoval jsem tuhle svým starým blogem Pixylophone a skutečně se mi zastesklo po tom starém oranžovém designu, který se mnou dobré dva roky žil. Ostatně i ten panák rohu mi docela přirostl k srdci a chybí mi. Občas ho sice někde použiju jako ikonku, ale není to ono. Takže se, prosím, nedivte, že jsem měl tu potřebu a předělal jsem i tyhle wordpressové šablony do podobného stylu.

Ale nikomu to nenutím násilím – pokud vám tenhle vzhled nevyhovuje, snadno si můžete přepnout styl na ten původní.

Nešahej nám na klikvu!

Většina lidí, když má chuť na něco sladkého, nejčastěji sáhne po čokoládě. V posledních letech ale přibylo také uživatelů sušenek. Už dávno se vzájemně nijak neomezují: spory, jestli je lepší čokoláda, nebo sušenky, už jsou minulostí a dokonce se najde dost lidí, kteří si klidně dají tu čokoládu, tu sušenku – podle chuti nebo podle toho, co je právě po ruce. A nejsou to také jediné sladkosti, kterými si člověk může uspokojit svůj mlsný jazyk. Třeba taková klikvová marmeláda. Většina lidí ji moc nezná, ale existuje poměrně agilní menšina těch, kteří na ni nedají dopustit. Od rána do večera se ládují svou oblíbenou sladkostí a na jiné – obzvlášť na sušenky, nebo dokonce (fuj!) čokoládu – koukají s krajní nelibostí a skrze prsty.

A nejen to. Až nečekaně velká část klikvistů je také nadobyčej militantní. Hlídky dobrovolníků neustále monitorují média a pečlivě kontrolují jakékoli zmínky o klikvách. Brání uraženou čest své oblíbené pochoutky všemi prostředky, chřestí zbraněmi i preventivně. S odvahou a oddaností evangelizátorů také neustále nadšeně prosazují klikvu všude, kde to jde. Obviňují cukrárny, že nabízejí samou čokoládu, reklamy, že propagují příliš sušenek – a klikvy je pořád všude málo. A proč nevyrábět klikvovou čokoládu? Klikvové sušenky? Republice více klikvy!

Konečně proč ne. Já tedy osobně klikvovou marmeládu moc nemusím, na mě je moc kyselá a prodávají ji v příliš úzkých skleničkách, kam se nevejde moje oblíbená lžička. Ale pár jich ve spíži mám, příležitostně si trošku dám, stejně jako kousek čokolády nebo nějakou sušenku (ale nejraději mám stejně sušené banány). Uznávám, že moje pohnutky jsou určitě velmi subjektivní a pro mnohé třeba i zvláštní – určitě bych si klikvu mohl snadno přisladit a vzít si menší lžičku – a většina ostatních má jiné důvody, proč tu klikvu nechtějí. Zajímalo mě to. Čím to, že klikva, natolik zdravá, levná a chutná pochutina je tak málo oblíbená? Lidi, proč ji nemáte rádi?, zeptal jsem se. Nevíte, že vůbec existuje? Nechutná vám? Nelíbí se balení? Jste závislí na čokoládě? Kde je příčina?

Odpovědi na sebe nedaly dlouho čekat. „Co se nám sereš do klikvy! Vždyť je skvělá!“, koukám překvapeně na první reakci. A další následují obratem: „Klikvu všichni milujeme, já bych se jí mohl užrat a ty seš kretén!“ nebo „Ty jsi přece magor, jako by sis nemohl prostě vzít menší lžičku jako my“ nebo „Normální člověk si přece klikvovou marmeládu nejdřív přendá do misky podle vlastního vkusu, aby se mu dobře jedla!“ nebo „Bacha na autora, žere sušený banány, to snižuje IQ o 38 bodů!“… Anebo třeba i takhle:

From: borec.anonym@vykal.biz

kamarade,asi si to s tou klikvou pekne presral,nechtel bych bejt na tvym miste..
http://######­#.com/zobrazit­.php?id=kdo_lze_o_klik­ve
http://######­#.cz/item/proc-uzivatele-nezerou-klikvovou-marmeladu
http://######­#.net/blog/ch­utna-mi-klikva.html

aspon budes priste vedet ze se namas poustet na tenkej led,to se nevyplaci,clovek si jenom nadela nepratele

fuck!

Nic naplat, klikva je prostě supr. Takže ji, parchanti, koukejte pěkně žrát jako my, nebo vám rozbijem hubu!