Archiv rubriky: Ostatní

Udělej rozhodnutí a nauč se s ním žít

Dlouho jsem přemýšlel, co byly věci, které mě v životě hodně posunuly. Zlomové věci, které člověka raketově vyhodí dál v životě, práci atd. Byly to rozhodnutí, které jsem udělal.

Všichni v životě děláme rozhodnutí. A pak se s nimi musíme naučit žít. A nebo se nám to nedaří a věčně o nich přemítáme. Udělal jsem chybu? Mohl jsem se rozhodnout lépe? Mohl být můj dosavadní život lepší, kdybych se v dané situaci rozhodl jinak?

My lidé máme neobvyklou schopnost obhájit si svoje špatná rozhodnutí. Hlavně ta rozhodnutí, za která se stydíme. Najdeme si tisíc důvodů, proč vlastně nebyla tak špatná nebo proč byla správná. až tomu sami začneme věřit. Hitler by mohl vyprávět 🙂

Proč to ale je, že nejsme schopni sami sobě obhájit svá pozitivní nebo jen neutrální rozhodnutí? Proč jim nejsme schopni věřit a neustále o nich přemítáme? Proč nevěříme, že jsou ta nejlepší, které jsme v dané situaci mohli udělat?

Pokud se chceme v životě posunout dál a něco vybudovat, nesmíme ztrácet čas věčným přemítáním. Musíme začít věřit svým rozhodnutím a dělat další. Naučit se žít s rozhodnutími, která jsme již udělali, neboť ty už nezměníme.

Jak zrychlit PrestaShop 1.6 s minimem úprav

Dlouhé roky pro zákazníky dělám rychlostní optimalizace webových aplikací. Nejčastěji se přitom jedná o různý Open Source software. V případě eshopu je to o to horší, že dlouhé načítání snadno odradí zákazníky od nákupu.

PrestaShop je v dnešní době asi nejlepším Open Source eshopem vůbec. To nic nemění na tom, že pokud to myslíte s online prodejem vážně, měli byste se mu obloukem vyhnout. Nebudu se tu dnes zabývat tím, proč tomu tak je. To je téma na jiný článek. Dnes si řekneme, jak s dobou jeho načítání jednoduše něco udělat pár úpravami, pokud jej již nasazen máte.

Často zákazníkům radím, že levnější než sahat do kódu je jít na to „hrubou silou™“. Tedy pořídit výkonnější server nebo VPS. V tomto případě ale ani přesun na výkonný server dobu načítání příliš nezkrátil. Chtěl jsem tedy zkusit, co se s tím dá udělat v rámci zákazníkova malého rozpočtu.

Tento návod je pro verzi PrestaShop 1.6.1.6, ale pravděpodobně bude fungovat i na ostatní verze PrestaShop 1.6. Vliv úprav jsem měřil pomocí nástroje Blackfire.io, který byl v odhalování nejhorších prohřešků velmi nápomocen. Veškeré testy byly prováděny s vypnutou cache, abych dostal relevantní výsledky. Také jsem se primárně zaměřil jen na výpis kategorie, který trval nejdéle. Provedené úpravy však často pomůžou i v jiné části shopu.

Něco málo o množství dat v databázi eshopu:

  • 95 900 produktů
  • 3 700 kategorií
  • 129 000 obrázků
  • Jen minimum variant
  • Jen minimum vlastností produktů
  • Bez příslušenství
  • 3 základní uživatelské skupiny
  • 4 jazyky
  • Aktivovaný modul „Blok Filtrování zboží dle parametrů“ (blocklayered)

VPS server, na kterém shop běžel:

  • 8 virtuálních jader
  • 16 GB paměti RAM
  • 240 GB místa na disku (RAID10, SATA 7200rpm)

Počáteční stav načítání kategorie před úpravami vypadal takto:

Jak zrychlit PrestShop 1.6 s minimem úprav 1

Problém 1

Modul blockcategories volá v metodě getTree() pro každou jednotlivou kategorii metodu Link::getCategoryLink() (soubor classes/Link.php). Nepředává jí ovšem instanci kategorie, ale jen její id a link_rewrite. V metodě Link::getCategoryLink() pak najdeme takovýto kód:

public function getCategoryLink($category, $alias = null, $id_lang = null, $selected_filters = null, $id_shop = null, $relative_protocol = false)
{
    if (!$id_lang) {
        $id_lang = Context::getContext()->language->id;
    }

    $url = $this->getBaseLink($id_shop, null, $relative_protocol).$this->getLangLink($id_lang, null, $id_shop);

    if (!is_object($category)) {
        $category = new Category($category, $id_lang);
    }

    // Set available keywords
    $params = array();
    $params['id'] = $category->id;
    $params['rewrite'] = (!$alias) ? $category->link_rewrite : $alias;
    $params['meta_keywords'] =    Tools::str2url($category->getFieldByLang('meta_keywords'));
    $params['meta_title'] = Tools::str2url($category->getFieldByLang('meta_title'));

    // Selected filters is used by the module blocklayered
    $selected_filters = is_null($selected_filters) ? '' : $selected_filters;

    if (empty($selected_filters)) {
        $rule = 'category_rule';
    } else {
        $rule = 'layered_rule';
        $params['selected_filters'] = $selected_filters;
    }

    return $url.Dispatcher::getInstance()->createUrl($rule, $id_lang, $params, $this->allow, '', $id_shop);
}

Tedy pro každou z 3700 kategorií se vytvoří instance třídy Category a její data se načtou z databáze! Také máte pocit, že se páni vývojáři PrestaShopu někde museli upsat? Jak by tedy metoda měla vypadat?

public function getCategoryLink($category, $alias = null, $id_lang = null, $selected_filters = null, $id_shop = null, $relative_protocol = false)
{
    if (!$id_lang) {
        $id_lang = Context::getContext()->language->id;
    }

    $url = $this->getBaseLink($id_shop, null, $relative_protocol).$this->getLangLink($id_lang, null, $id_shop);

    if (!is_object($category) && !$alias) {
        $category = new Category($category, $id_lang);
    }

    // Set available keywords
    $params = array();
    $params['id'] = is_object($category) ? $category->id : $category;
    $params['rewrite'] = (!$alias) ? $category->link_rewrite : $alias;
    // $params['meta_keywords'] =    Tools::str2url($category->getFieldByLang('meta_keywords'));
    // $params['meta_title'] = Tools::str2url($category->getFieldByLang('meta_title'));

    // Selected filters is used by the module blocklayered
    $selected_filters = is_null($selected_filters) ? '' : $selected_filters;

    if (empty($selected_filters)) {
        $rule = 'category_rule';
    } else {
        $rule = 'layered_rule';
        $params['selected_filters'] = $selected_filters;
    }

    return $url.Dispatcher::getInstance()->createUrl($rule, $id_lang, $params, $this->allow, '', $id_shop);
}

Co jsme upravili?

  • Zakomentovali jsme načtení kategorie do objektu a tím snížili nápor na databázi o 3700 SQL dotazů. Samotné instanciování třídy Category nám také dost času ušetří.
  • Upravili jsme řádek 13, aby se do pole $params správně nastavilo id kategorie v závislosti na tom, zda nám do metody přijde objekt, nebo jen id.
  • Zakomentovali jsme přiřazení parametrů meta_keywords a meta_title do pole $params. Dalším zkoumáním kódu jsem zjistil, že jsou potřeba jen v případě, že si je nastavíte do pole „Cesta ke kategoriím“ v nastavení eshopu. Vůbec mě nenapadá, proč by někdo něco takového chtěl dělat, když má k dispozici parametr rewrite 🙂

Poslední bod by samozřejmě šel řešit mnohem elegantněji, podobně jako řádek 13. Museli bychom však zajistit, že nám tyto parametry přijdou už na vstupu. To by znamenalo upravit veškeré SQL dotazy, jejichž výsledky vstupují do metody Link::getCategoryLink() napříč celým shopem. To by ovšem bylo na delší dobu a nebylo to tím pádem předmětem zakázky.

Jak tato jednoduchá úprava pomohla? Zkrátili jsme načítání kategorie o 4,6 vteřiny!

Jak zrychlit PrestShop 1.6 s minimem úprav 2

Problém 2

Modul blocktopmenu volá v metodě generateCategoriesMenu() (soubor modules/blocktopmenu/blocktopmenu.php) opět naši známou Link::getCategoryLink(), jen schovanou do metody Category::getLink(). Tentokrát ale nenechává instanciování třídy Category na metodě getCategoryLink(), ale vytváří ji sám. Zkrácený kód metody vypadá takto:

protected function generateCategoriesMenu($categories, $is_children = 0)
{
    $html = '';

    foreach ($categories as $key => $category) {
        if ($category['level_depth'] > 1) {
            $cat = new Category($category['id_category']);
            $link = Tools::HtmlEntitiesUTF8($cat->getLink());
        } else {
            $link = $this->context->link->getPageLink('index');
        }

        // kód zkrácen
    }

    return $html;
}

Přitom potřebný link_rewrite ve výsledku SQL dotazu již máme. Můžeme tedy jednoduše instanciování třídy Category opět vynechat a předat metodě Link::getCategoryLink() pouze potřebné údaje:

protected function generateCategoriesMenu($categories, $is_children = 0)
{
    $html = '';

    foreach ($categories as $key => $category) {
        if ($category['level_depth'] > 1) {
            //$cat = new Category($category['id_category']);
            //$link = Tools::HtmlEntitiesUTF8($cat->getLink());
            $link = $this->context->link->getCategoryLink($category['id_category'], $category['link_rewrite']);
        } else {
            $link = $this->context->link->getPageLink('index');
        }

        // kód zkrácen
    }

    return $html;
}

Jak nám tato úprava pomohla? Zkrátili jsme načítání kategorie o dalších 700 ms! Není to již tolik jako předtím, ale dostáváme se už na vcelku přijatelné 2 vteřiny dvěma jednoduchými úpravami.

Jak zrychlit PrestShop 1.6 s minimem úprav 3

Problém 3

Modul blockcategories vybírá z databáze v metodě hookFooter() (soubor modules/blockcategories/blockcategories.php) celý strom kategorií. Přitom v šabloně, kterou zákazník použil, jsou v patičce stránky vypsány jen top-level kategorie. Je tedy trochu zbytečné vybírat kategorie všechny. Co myslíte? Můžeme tedy řádek:

$maxdepth = Configuration::get('BLOCK_CATEG_MAX_DEPTH');

snadno upravit takto:

$maxdepth = 2;

Pokud máte v patičce stránky i podkategorie, upravte hodnotu $maxdepth dle vlastního uvážení a potřebné hloubky.

Jak nám tato úprava pomohla? Snížili jsme načítání kategorie o dalších 600 ms!

Jak zrychlit PrestShop 1.6 s minimem úprav 4

Nyní už se výpis kategorie načítá vcelku přijatelných 1,39 vteřin. Moje práce pro zákazníka tedy po 2,5 hodině ladění končí. Dalo by se jistě pokračovat mnohem dál. A nejen na výpisu kategorie, ale i jiných stránkách, které mají zase svoje vlastní specifika.

Pro zajímavost ještě ukážu, jak rychle se kategorie načte po zapnutí cache:

Jak zrychlit PrestShop 1.6 s minimem úprav 5

Výkonovému ladění zdar!

Jak na vybírání pošty z jiných schránek do Seznamu

Často se setkávám s tím, že lidé, kterým píšu, mají nastaveno přesměrování z mailu na vlastní doméně do mailu na seznamu. Je to jistě nejjednodušší způsob, jak mít všechny maily v Seznam schránce, pokud jste na ni zvyklí. Mám to ale jedno úskalí. Pokud má člověk, který vám píše nastaveno zabezpečení své domény pomocí SPF, vrátí se mu chybová zpráva a mail, který vám psal, nebude doručen.

K čemu je SPF dobré a proč by vás to mělo zajímat? V dnešní době všichni bojujeme se spamem. SPF a další technologie, jako je např. DKIM přispívají k tomu, aby nám do schránek chodilo spamu méně. SPF funguje tak, že řekne cílovému serveru (v našem případě Seznamu), z jakých serverů smí přijímat emaily od daného odesílatele. Díky tomu spamer, který by chtěl poslat email vaším jménem (podvrhnout jako odesílatele vaši emailovou adresu), nepochodí, protože jeho server není povolený odesílatel pro danou emailovou adresu.

Proč tedy vadí, že si necháte přeposílat maily ze své domény na Seznam? Pokud vám pošlu mail, řekněme z adresy mujmail@mojedomena.cz na vaši adresu vasmail@vasedomena.cz a ten je přesměrován do schránky Seznamu, pochopitelně zůstane jako odesílatel mailu nastaven mujmail@mojedomena.cz. Pokud mám však svoji doménu zabezpečenou pomocí SPF, váš server není oprávněn odesílat maily z mojedmena.cz a Seznam tedy mail vyhodnotí jako spam. Vám mail nepřijde a mě přijde jen chybová zpráva.

Jak to napravit? Na Seznamu si můžete nastavit vybírání pošty z jiných schránek. Seznam pak přímo stahuje maily z vaší domény a nedochází k nežádoucímu přesměrování. Jak toto vybírání pošty nastavit?

Nejprve se přihlaste do své schránky na Seznamu. Nahoře vpravo pak klikněte na Nastavení.

Seznam_vyber_posty_1

V nově otevřeném okně klikněte v levém menu na položku Účty a import. Poté na tlačítko Přidat další účet pod nadpisem Propojení schránek.

Seznam_vyber_posty_2

V select boxech vyberete v prvním Doručené (do této složky vám budou maily z vaší domény chodit) a v druhém Jiný. Doplníte váš email, heslo ke schránce a adresu POP3 serveru. Tuto adresu by vám měl sdělit váš poskytovatel, nebo ji najdete v administraci vaší domény (tam kde si zakládáte schránky), pokud takovou od poskytovatele máte. Port by v závislosti na tom, zda mailový server na vaší doméně podporuje šifrovanou komunikaci, měl být 995. Pokud ji nepodporuje, port bude 110. Tuto informaci by vám opět měl sdělit váš poskytovatel. Je samozřejmě vždy bezpečnější používat šifrovanou komunikaci.

Seznam_vyber_posty_3

Po kliknutí na Uložit účet by mělo být vybírání schránky nastaveno.

Seznam_vyber_posty_4

Člověk si chce jednou za čas udělat něčím radost, např. novou grafickou kartou. Tak jsem si takhle vyhlédl a objednal MSI GTX 960 GAMING 2G. Karta se mi moc zamlouvala a dnes dorazila domů. To bych to ale měl moc jednoduché, abych ji jen nainstaloval a začala fungovat 🙁 Karta zdá se není kompatibilní s mojí deskou, která je hádejte co – taky MSI 🙂 Konkrétně Z77A-GD65. Ať laboruji jak chci (upgrade BIOSu, reset CMOS, jiný PCI-E slot), karta ne a ne fungovat.

GTX 960 Gaming 2G

I rozhodl jsem se, že napíšu přímo na podporu MSI. Jsou to přeci obojí jejich produkty, tak snad poradí, no ne? Abych mohl položit dotaz, musím ale projít registrací. Registrace už tak sama o sobě zdlouhavá, kde po vás chtěji vědět kde co, ale dá se to přežít. Nakonec nabídne registraci produktu, tak si říkam, když už jsem došel sem, proč ne. Zadal jsem tedy sériové číslo, ale to jim nestačilo. Chtěli ještě sériové číslo 2. Po důkladném hledání a opisování každého čísla, které jsem na krabici nebo kartě viděl, jsem se nakonec dobral k tomu, že jde o ten nejmenší, bez silné lupy naprosto nečitelný štítek.

GTX-960-Gaming-2G-SN

Navíc je v tom číslu tečka, ale tu tam zadávat nesmíte, jinak to neprojde 🙂 A to jsem ještě zapomněl dodatat, že když to číslo zadáte špatně, tak ho nestačí umazat. Při pokusu o znovu zadávání se stále cosi načítá, až se to načítat přestane a skončíte na černé obrazovce (jako já s tou kartou). Musíte tedy pokaždé dát zpět (díky bohu se první SN nesmaže) a poté znovu potvrdit, abyste mohli zadávat znovu.

Ale to nejlepší, ten zlatý hřeb nakonec. Už se radujete, jásáte, že máte vše vyplněno, kliknete odeslat a – no chyba 404 🙂 MSI, už nikdy víc.

PS: Ten dotaz jsem nakonec odeslal (musel jsem znovu vyplňovat sériové číslo). Jsem zvědav, zda mi odpoví.

Nastavení DKIM klíče pro Google Apps (Gmail pro firmy)

Seznam.cz oznámil od 1.4.2015 zpřísnění podmínek pro marketéry využívající hromadný e-mailing. Pokud používáte pro firemní poštu Gmail jako já, budete se s tím muset dříve nebo později poprat. Zde uvádím návod, jak DKIM klíč nastavit pro Google Apps.

Nejprve je potřeba se přihlásit do administrace Google Apps:

Google Apps Login

Poté proklikneme na Aplikace:

Google Apps Aplikace

Pokračujeme na Google Apps:

Google Apps Apps

Vybereme Gmail:

Google Apps Gmail Nastavení

Klikneme na Ověřit e-mail:

Google Apps Ověřit email

Klikneme na Vygenerovat nový záznam:

Google Apps Generovat DKIM klíč

Ponecháme předvyplněný selector google a klikneme Generovat:

Google Apps DKIM Selector

Vygenerovaný klíč je poté potřeba přidat do DNS jako TXT záznam:

Google Apps DKIM klíč

Po přidání záznamu do DNS už jen klikneme na Spustit ověření. Je možné, že bude Google chtít nějaký čas počkat kvůli aktualizaci DNS.

Zda máte klíč v DNS nastaven správně si můžete ověřit zde.

Jak se přestat vymlouvat a založit si blog

Už poměrně dlouhou dobu jsem se chystal že si založím blog. Důvody a motivaci jsem měl, ale chuť dotáhnout tu myšlenku nějak chyběla. Dnes se konečně podařilo a tak mám pro vás pár tipů.

  1. Když máte pocit že by něco stálo za sepsání, napište si to do Wordu nebo něčeho podobného co máte po ruce. Pokud zrovna nevíte jak to celé sepsat nebo formulovat, napište si alespoň poznámky, ať se k tomu můžete vrátit později.
  2. Když už se vám to začne hromadit, začnete přemýšlet že už by to teda fakt chtělo někam ven. Chce to doménu. Během času jsem mnohokrát klidně i pár hodin seděl nad ověřovačem domén a zkoušel co mě napadne. Nenapadla mě žádná, co by ještě nebyla obsazená. Dejte tomu čas. Když vás semtam něco napadne, napište si to, ověřit to můžete později. Nemá cenu nad tím trávit hodiny.
  3. Možná byste taky jako já rádi blog svůj vlastní. Nedělejte to. Nainstalujte WordPress, je to za pár minut a nevypadá to špatně. Ono vždycky půjde nějak přejít na vlastní řešení. Stejně tak se nezabývejte šablonou. Na to bude čas až bude chuť. Čtenáři vám na blog nebudou chodit kvůli vzhledu.