Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

Jak zabít procesor

Nedávno jsem uvažoval, jak pracuje takový překladač PHP. Napadlo mě napsat zdrojový kód, který by jej odstřelil. V případě PHP4 se mi to povedlo – stáhněte si a vyzkoušejte tento příklad. PHP5 už umí vstupní data ošetřit lépe a namísto smrti ohlásí Parse error: parser stack overflow (pro pětku použijte upravený příklad).

Na webové prohlížeče lze zaútočit i na další frontě. Například je nechat zobrazit extrémně velký obrázek. Pro experiment bude stačit bitmapa o velikosti např. 1024×768, ke zvětšení použijeme HTML:

<img width="9000000" height="9000000"
src="wallpaper.jpg" />

Jak si s tím poradí trojlístek IE, Firefox a Opera? První dva jmenovaní se pokusí vyhovět zadání a počítač vytíží natolik, že bude připomínat mrtvý stroj (zkuste zarolovat). Opera rozměry zdaleka nedodrží (má limit někde kolem 30.000 pixelů) a k přetížení nedojde. Co je důležité, žádný z prohlížečů nezačne bezhlavě alokovat kvanta paměti a vždy jen přepočítá zobrazovaný výřez.

Můžete si to sami vyzkoušet – ale klikejte jen s vědomím všech rizik!

Ještě dodávám, že testy jsem dělal na Windows 2000 SP4 s Apache 2.0.48, PHP 4.4.0 & 5.0.4, IE 6 SP1, Firefoxem 1.0.4 a Operou 8.01. Jinde se může chování lišit.

clock 14. 7. 2005 pencil PHP comments Komentáře: 41


Když je spoluautorem automat

Nemám rád automaticky generované vysvětlivky. Tím myslím strojové podtržení určitých zkratek (např. HTML nebo CSS) a doplnění o vysvětlivku v title. Dopadá to asi takto:

Ta přednáška o prasatech je v HTML a najdeš ji na adrese http://www.la-trine.cz/HTML/ksc­m.php – tak se na to podívej.

Tato „feature“ nepřináší čtenáři žádnou přidanou hodnotu. Spíš naopak, odpoutává pozornost od textu. Autor by měl vědět, pro koho píše a sám se rozhodnout, jestli je třeba zkratku vysvětlit, kde tak učinit a jakým způsobem. Tohle automat nevymyslí.

Bohužel, spoustě uživatelů připadá jako skvělý nápad si do svého CMS automatický vysvětlovač nainstalovat. Vážně si myslíte, že člověka nechápavě hledícího na zkratku CSS, přivede title=Cascading Style Sheet k prozření? Nebo že v pojednání o plovoucích boxech je nutné čtenáři význam CSS připomenout?

p.s. Počítačoví odborníci, víte, co znamená PCI?

clock 27. 5. 2005 pencil HTML & CSS comments Komentáře: 35


Jak zredukovat PHP skripty?

Občas je třeba zmenšit PHP skripty na minimum. Odstranit komentáře, zredukovat bílé místo. Zkrátí se doba nahrávání na server, mírně zrychlí provádění a program se stane hůře čitelný pro nepovolané osoby.

Existují sice nástroje, které tento úkol řeší téměř dokonale (Zend Encoder, SourceGuardian atd.), mají však svá „ale“. Buď v podobě závratné ceny, specifických nároků na hosting, nebo v prostém zatajení faktu, že existují i zpětné dekodéry.

Ukážu vám jeden směšně jednoduchý postup, jak vypustit ze skriptů zbytečné znaky. Používám jej pro texy-compact.php, kde dosahuji úspory cca 50% velikosti. A v žádném případě to neovlivní jeho funkčnost.

// Dgx's PHP shrinker

// PHP 4 & 5 compatibility
if (!defined('T_DOC_COMMENT'))
  define ('T_DOC_COMMENT', -1);

if (!defined('T_ML_COMMENT'))
  define ('T_ML_COMMENT', -1);

// read input file
$input = file_get_contents('script.php');

$space = $output = '';
$set = '!"#$&\'()*+,-./:;<=>?@[\]^`{|}';
$set = array_flip(preg_split('//',$set));

foreach (token_get_all($input) as $token)  {
  if (!is_array($token))
    $token = array(0, $token);

  switch ($token[0]) {
    case T_COMMENT:
    case T_ML_COMMENT:
    case T_DOC_COMMENT:
    case T_WHITESPACE:
      $space = ' ';
      break;

    default:
      if (isset($set[substr($output, -1)]) ||
          isset($set[$token[1]{0}])) $space = '';
      $output .= $space . $token[1];
      $space = '';
  }
}


// write shrinked file
fwrite(
  fopen('output.php', 'w'),
  $output
);

Nevím, jestli to potřebuje podrobnější komentář, každopádně hlavní magie se skrývá ve funkci token_get_all, kterou doporučuji nastudovat.

Online PHP shrinker

clock 19. 5. 2005 pencil PHP comments Komentáře: 30


PHP hádanka VII.: rovný a rovnější

Najdete všechny hodnoty, kterých může nabývat proměnná $value, aby byla následující podmínka vyhodnocena kladně?

$value = ???

if ($value=="ahoj") echo 'rovnost platí';

clock 18. 5. 2005 pencil PHP comments Komentáře: 27


Hlásí XML: error undefined entity?

XML

Podle specifikace zná XML pouze pět předdefinovaných entit. Jsou to &lt; &gt; &amp; &quot; &apos;. Všechny ostatní je třeba buď definovat, nebo (lépe) zapisovat v číselné podobě či rovnou jako znak. Takto doporučuji psát i &apos;, kteroužto entitu Internet Explorer nezná.

XHTML samozřejmě používá i další entity, ale pokud pracujeme s textem, který má být přístupný zároveň v prohlížeči jako XHTML a kupříkladu ve čtečce jako RSS, je třeba se přizpůsobit neužšímu místu.

Číselná podoba zápisu entity má tvar &#xxx;, kde xxx je ordinální hodnota znaku. Takže třeba entitu &shy;, která odpovídá znaku s kódem 173, zapíšeme jako &#173; (desítkově) nebo &#xAD; (šestnáctkově). Při převodech pozor na to, že ekvivalentní jsou i zápisy &#0173; &#xad; &#xAd;.

Dále lze přímo zapsat znak (třeba ten s kódem 173). Obecně ale tento postup aplikujte jen v případě, že kódujete dokument v unicode. V jiných kódováních totiž nemá spousta entit své jednoznakové protějšky.

Příklad převodní tabulky najdete v tomto fóru.

Ještě bych dodal, že pro určité výstupy bývá vhodné zaměnit typografické znaky za jejich ASCII alternativy. Tedy namísto „českých uvozovek“ použít "počítačové", taktéž pevnou mezeru zaměnit za obyčejnou a pomlčky za spojovníky. Dělá se to kvůli neschopnosti cílového zařízení správně tyto znaky interpretovat.

clock 5. 5. 2005 pencil HTML & CSS comments Komentáře: 6


phpFashion © 2004, 2012 David Grudlo webu

Pokud není uvedeno jinak, podléhá obsah těchto stránek licenci Creative Commons BY-NC-ND Creative Commons License BY-NC-ND

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.