Jak jsem začal psát blog

6. 11. 2016

S počítačem pracuji asi od roku 2000. Začal jsem s Visual Basic, pak chvíli nic. Před maturitou jsem zkusil PHP a když jsem šel na VŠ, pohltilo mě to a nezbyl už na ni čas. Od roku 2012 se živím jako PHP developer na full-time. Těch 5 let není mnoho, ale stačí na to, aby se člověk někam posunul a nastřádal nějaké know-how. Už nějaký čas si tu a tam napíšu nějakou poznámku o něčem, co bych chtěl trošku rozepsat, rozebrat, podělit se o to a třeba dostat nějaký feedback od ostatních. Jenže jsem si nenašel (nebo nechtěl najít) čas a energii začít o tom blogovat. Tak to zkusím konečně změnit. Ale proč vůbec? Nejsem vidět!


Je jedno co umíš - když nejsi vidět

Vývojářův blog je asi něco jako výloha obchůdku.

Sebelepší obchůdek v temné uličce, beze jména, bez výlohy a bez vystaveného zboží uvnitř příliš prosperovat nebude. Nebudou v něm lidi nakupovat, protože o něm nebudou vědět. Někdy o něm zaslechnou, ale dokud opravdu nepůjdou dovnitř a nebudou se aktivně ptát co nabízí, bude to jen anonymní podnik bez zákazníků. Někdo tam přeci jen může chodit. Někdo, kdo ten obchůdek už delší dobu zná, ví o jeho kvalitách a přístupu. Takových zákazníků ale bude málo. Může být jen jeden. Ten obchůdek bude odkázaný čistě na toho jednoho zákazníka. Postupně bude cíle a sny přizpůsobovat právě jemu. Stane se na něm příliš závislí. Obchůdek bude chtít nabízet nový produkt. Ale nebude moci, protože jeho jediný zákazník nic takového chtít nebude. Časem se může stát, že obchůdek už bude bez vlastních cílů a snů a bude dělat vše jen pro jednoho zákazníka. Nebude inovovat pokud nebude chtít inovovat zákazník. Obchůdek může být nešťastný, ale stále má jednoho zákazníka. I když může nabízet široký sortiment kvalitního zboží, je mu to k ničemu. Nikdo (až na jednoho zákazníka) o jeho kvalitách a sortimentu neví. To může být pro obchůdek i zákazníka do budoucna fatální. Jsou totiž i jiné obchůdky kam může zákazník odejít. Je ale také spoustu zákazníků, kteří by mohli do obchůdku chodit, nebo jej alespoň inspirovat, udržovat mu přehled na trhu. Do obchůdku ale jiný zákazník nepřijde. Je schovaný, neviditelný.

A tak si obchůdek zkusí osvětlit uličku, začne budovat jméno, zkusí se tu a tam někde ukázat (třeba pomůže jinému obchůdku). A taky vybourá kus zdi a místo ni udělá průhlednou výlohu. Do výlohy začne postupně umisťovat sortiment na který je pyšný. O kterém si myslí, že jiné obchůdky nenabízejí. Nebo ne v takové kvalitě. Doufá, že si ho někdy všimnou i jiní zákazníci. Ne proto, aby mohl toho loajálního nahradit. Ale proto, aby si udržel zdravou nabídku, aby nezamrzl v minulosti. Aby věděl, co chtějí jiní. Aby nebyl na tom jednom zákazníkovi až tak moc závislý. Aby se nestal ze zákazníka majitel obchůdku. Taky si jeho sortimentu začnou všímat okolní obchůdky. A mohou spolupracovat. Mohou si vyměňovat zkušenosti - už o sobě ví. Sortiment se bude lepšit a to bude prospěšné pro všechny strany.

Co mi blog přinese

  • budu (snad) trochu víc vidět
  • lepší CV
  • urovnám si myšlenky
  • můžu dostat feedback
  • zjistím vlastní nedostatky
  • naučím se (lépe) psát
  • po pár letech se můžu zasmát :-)

Jaký blog chci

  • fakt jednoduchý
  • na mojí doméně
  • půjde číst na mobilu i desktopu (to snad ani nemusím psát)
  • článek bude mít název, perex, dlouhý popis a vlastní URL adresu
  • samotný článek nechci psát jako HTML => něco rychlejšího a co už znám => Markdown, resp. Markdown Extended
  • bude umět code syntax highlighting (ideálně vč. Latte šablon)
  • 0 - n štítků/tagů (flexibilnější než kategorie)
  • budu moci upravovat podle aktuálních potřeb (vytvářet a publikovat později, automaticky ukládat rozepsaný draft client-side, ...)
  • Twitter share (Tweet)
  • diskuze pod článkem (Disqus).
  • RSS/Atom
  • LD+JSON

Hledám vhodné řešení

Chvíli jsem přemýšlel, jestli nechci blbosti a nezvolím už nějaké hotové řešení. Nemyslím teď nasadit WordPress, Joomlu atp. Ale publikovat třeba na medium.com. Mohl bych rovnou publikovat a neřešil nějakou aplikaci.

Nerozmýšlel jsem se ale moc dlouho. Mám vlastní doménu, chci nějakou svou image/značku a když budu mít vlastní řešení, nebudu ničím omezen (než mnou samotným).

Píši vlastní řešení

Pro začátek mi stačí něco jednoduchého. Nechci další rok při volných večerech psát aplikaci abych vůbec mohl blogovat.

Vzal bych nette/sandbox. Ale budu interagovat s databází (nechci Nette\Database, o tom třeba někdy příště), chci migrace, nějaké CI/CD atd.

To řeším s každou aplikací. Využiji už dříve napsaný etten/sandbox. Mrkněte na to. Není to nic jiného, než vzájemná integrace několika různých knihoven do něčeho co je vlastně rozšířený nette/sandbox.

Teď už mám většinu práce hotovou, ne?

Jen si dopíši jednoduchý model pro články, administraci, frontend a RSS.

Nebudu tady popisovat jak to řešit, to není smyslem tohohle postu.

Měla by to být otázka několika hodin. Řešil jsem během víkendu.

S čím jsem se zdržel

Přece jen kousek kódu by si zasloužil zmínku: Markdown + code syntax highlighting.

Dostal jsem se ke knihovnám:

Vytvořím si třídu která řeší převod mnou zadaného obsahu. Jde o Markdown převod do HTML vč. podpory zvýraznění syntaxe kódu.

<?php

namespace Project\Markdown;

use FSHL;
use Michelf\MarkdownExtra;
use Nette\Utils\Strings;

class Markdown
{

    /** @var MarkdownExtra|null */
    private $parser;

    public function transform(string $text): string
    {
        return $this->build()->transform($text);
    }

    public function highlight(string $code, string $class): string
    {
        $lexerClass = 'FSHL\Lexer\\' . ucfirst($class);
        if (class_exists($lexerClass)) {
            $fshl = new FSHL\Highlighter(new FSHL\Output\Html, FSHL\Highlighter::OPTION_TAB_INDENT);
            $highlighted = $fshl->highlight($code, new $lexerClass);
        } else {
            $highlighted = htmlspecialchars($code, ENT_NOQUOTES);
        }

        return $highlighted;
    }

    public function toc(string $header): string
    {
        return 'toc-' . Strings::webalize($header);
    }

    private function build(): MarkdownExtra
    {
        if (!$this->parser) {
            $this->parser = $this->doBuild();
        }

        return $this->parser;
    }

    private function doBuild(): MarkdownExtra
    {
        $parser = new MarkdownExtra();

        $parser->header_id_func = [$this, 'toc'];
        $parser->code_block_content_func = [$this, 'highlight'];

        return $parser;
    }

}

Zaregistruji si makro kde potřebuji. Do presenteru co mi řeší detail článku.


protected function createTemplate() { $template = parent::createTemplate(); if ($template instanceof Template) { $markdown = new Markdown(); $latte = $template->getLatte(); $latte->addProvider('markdown', [$markdown, 'transform']); $set = new Latte\Macros\MacroSet($latte->getCompiler()); $set->addMacro('markdown', function (Latte\MacroNode $node, Latte\PhpWriter $writer) { return $writer->write('echo call_user_func($this->global->markdown, %node.args);'); }); } return $template; }

A teď jednoduše použiji v šabloně.

<h1 n:block="title">{$article->name}</h1>
{markdown $article->content}

Toť vše co mě vedlo k tomu abych mohl napsat tenhle můj první blog post.

Příště už snad budu psát něco zajímavějšího.

Have you enjoyed this article?

Tweet