./blog.sh

Skin, který přežije git pull

Obléci web jinak dřív znamenalo upravit soubor, který vlastní engine. Fungovalo to, přesně do příštího git pull, což je chvíle, kdy zjistíš, že přizpůsobení a aktualizace byly celou dobu týž soubor.

Čtyři věci, které potřebovaly upravenou šablonu, jsou teď nastavení.

Oba tyhle weby jsou tento engine, sestavený z téhož commitu téhož večera:

Číst dál

./blog.sh 1.3.1

./blog.sh 1.3.1 je venku – vydání na GitHubu.

Opravné vydání o zdrženlivosti. Cron naplánované publikace teď odmítá oznámení, která nemůže vzít zpět: zpětně datovaný příspěvek se publikuje bez oznámení a příspěvek, který už nese adresu svého oznámení, se nikdy neoznámí znovu – ani cronem, ani přes publish, ani přes toot, ať ta adresa žije na kterékoli síti. Fronta si také bere zámek na každý zápis, takže běh, který přistane uprostřed úpravy, nemůže vrátit příspěvek, který právě publikoval.

První hodina čerstvé instalace přestala mást: preview a publish vypisují adresu, která se skutečně otevře, místo example.com, nasazení mluví jazykem webu a ukázková konfigurace už za tebe nevybírá Mastodon – síť je volba.

A prázdnota je teď odpověď, v obou směrech: vyprázdněná sekce si vezme svůj nadpis s sebou, místo aby shodila sestavení nebo nechala selhat doctor, a nadpis nad obsahem, který zůstává, jde konečně vypnout.

Nic k migraci – git pull, nové sestavení, nasazení. Úplné poznámky →

Co potichu hnije

./blog.sh doctor se ptá, jestli je instalace v pořádku, a trvá to vteřinu. Nemá co říci k archivu čtyř tisíc příspěvků, ve kterém se jeden obrázek nikdy nestáhl, tři trvalé odkazy nikam nevedou a dva příspěvky si nárokují tutéž starou adresu.

./blog.sh check to všechno projde a řekne.

Co hledá

Každý nález pojmenuje příspěvek a slug – něco, kam jít a co opravit – a nese řádek, co s tím udělat.

Číst dál

Ohvězdičkuj to a zveřejní se to

Komentáře pod těmihle příspěvky jsou odpovědi na toot. To byl celý systém od začátku a jeho jediné slabé místo bylo vždy to, že je to všechno, nebo nic: objeví se každá odpověď, nebo jsou komentáře vypnuté.

comments.approval: fav je třetí odpověď. Odpověď se pod článkem objeví, jakmile ji označím jako oblíbenou, z kteréhokoli klienta, který mám zrovna otevřený.

Žádná fronta, žádný panel

To je smysl toho dělat to takhle. Moderační fronta je druhé rozhraní, s druhým přihlášením, kam chodíš zvlášť – což znamená, že tam chodíš pozdě, nebo vůbec. Tady je rozhraním aplikace, ve které komentáře už bydlí. Odpověď čtu tam, kde bych ji četl tak jako tak, a schválení je jedno ťuknutí na témže místě.

Dvě pravidla drží výsledek čitelný, ne jen přefiltrovaný. Moje vlastní odpovědi hvězdičku nepotřebují, protože nikdo si nehvězdičkuje sám sebe a polovina každé výměny by jinak zmizela. A odpověď se ukáže, jen když se ukáže i všechno mezi ní a oznámením – schválená odpověď na zamítnutý komentář neodpovídá na nic.

Co to stojí, a ty ceny jsou skutečné

Číst dál

Cesta ven se dodává s ním

Engine, který ti nedokáže vrátit tvoje psaní, je hostingová služba s kroky navíc. Importéry vždy mířily jedním směrem – dvaadvacet zdrojů, všechno domů. ./blog.sh export je druhý směr a měl tu být jako první.

Co vyjde ven

Celý archiv jako strom markdownových souborů s hlavičkou YAML, v rozvržení, které čte Jekyll: _posts/2026-05-01-slug.md, _drafts/, stránky v kořeni, média pod assets/<rok>/<slug>/. Staré adresy cestují jako redirect_from, v tvaru, kterému plugin jekyll-redirect-from už rozumí, se sloučením obou druhů – kde příspěvek bydlel na platformě, ze které přišel, a kde bydlel tady před přejmenováním. Namiř na tu složku statický generátor a sestaví se.

./blog.sh export ~/my-blog-export        # všechno, včetně konceptů
./blog.sh export ~/public-copy --no-drafts
./blog.sh export ~/somewhere --dry-run   # spočítá, nezapíše nic

Tento web, spočítaný, ne zapsaný:

Číst dál

./blog.sh 1.3

./blog.sh 1.3 je venku.

Obléci web už neznamená upravovat engine: vlastní stylesheet, menu, postranní panel a úvodní obrázky jsou teď nastavení. Příspěvky se seskupují do sérií, stránky vystupují z proudu a každá úprava si nechává verzi před sebou.

A tři příkazy, které čtou celý archiv: check hlásí, co je rozbité, stats počítá, co tam je, a export to všechno zabalí do rozvržení Jekyllu. Cesta ven se dodává s ním.

#blogsh #ruby #staticsite

Všechno, co je špatně, najednou

Každé přerušení v tomto enginu je správné tam, kde stojí. Každé také hlásí přesně jeden problém – ten první, odkudkoli v kódu, kde si ho náhodou všimlo. Oprav ho, spusť znovu, potkej další. Opakuj, dokud se to nesestaví.

./blog.sh doctor přečte, co je na disku, a řekne ti všechno v jednom průchodu, celými větami, každou s řádkem opravy napsaným pro někoho, kdo neví, ve kterém souboru to nastavení bydlí.

Jde po tichých selháních

Hlasitá chyba se aspoň ohlásí. Problémy, na které se doctor soustředí, jsou ty, které nikdy nic neřeknou:

Číst dál

Procházení archivu

Jeden příspěvek tady nedávno tvrdil, že menu průvodce se zkrátilo, protože operace s příspěvkem patří do příspěvku, ne do menu. To pořád platí. Tohle vydání přesto přidává obrazovku a důvod stojí za vyslovení: najít příspěvek je jiná práce než s ním něco udělat.

./blog.sh browse ukazuje tytéž příspěvky jako list, jako obrazovku, ve které zůstáváš.

Co to je

Šipky a Page Up/Down celým archivem. Filtry podle typu, stavu a štítku, s počtem u každého. A hledání, které filtruje při psaní.

Hledání je vlastní hledání webu. Slova se spojují jako A, "fráze v uvozovkách" se počítá jako jedna, -slovo vylučuje a diakritika nikdy nerozhoduje o shodě. Jazyk dotazu a sjednocování bydlí v lib/search_query.rb, vedle poznámky, že se mění společně s assets/js/search.js – protože dotaz, který v prohlížeči znamená jedno a v terminálu druhé, je horší než nemít hledání v terminálu vůbec.

Prohledává plný text každého příspěvku, takže pod vybraným řádkem je řádek vlastního textu toho příspěvku, který ti ukazuje, proč odpovídá.

Číst dál

Většina tvého Facebooku není tvoje

Importér z Facebooku vznikl nad skutečným exportem „Stáhnout své informace". První užitečná věc, kterou mi řekl, bylo číslo, které jsem nečekal.

Na tom exportu nebylo 95 % příspěvků napsáno na Facebooku. Byly tam zrcadleny – z Twitteru, z Posterousu, z celé éry crosspostů, kdy každá služba zdvořile nabízela, že tě přepošle všude jinde.

Přeskakují se a počítají

Tyhle příspěvky se neimportují. Ne proto, že by byly bezcenné, ale protože platformy, ze kterých skutečně pocházejí, mají vlastní exporty a ty nesou originály: plný text, skutečné časy, média ve velikosti, v jaké byla nahrána. Facebookové zrcadlo tweetu je horší kopie něčeho, co můžeš pořádně naimportovat z archivu Twitteru ležícího v téže složce.

Naimportuj obojí a tvůj archiv se zdvojnásobí, přičemž horší verze vyhraje v polovině případů. Takže se rozpoznají a přeskočí s počtem v souhrnu, a FACEBOOK_CROSSPOSTS=1 to přebije, když nesouhlasíš. Check-iny beze slov a příběhy z aplikací jsou také počítané přeskoky.

Zbývají tvoje vlastní příspěvky, s fotkami a videi z archivu samotného.

Číst dál

Paleta, na kterou se můžeš napřed podívat

Dřívější příspěvek tady vysvětluje, že každá barva na tomto webu pochází ze sedmi klíčů v konfiguračním souboru. Ta část se nezměnila. Změnilo se to, že si už nemusíš představovat, jak těch sedm hodnot bude vypadat, než se k nim zavážeš.

Vybírat mezi čtrnácti hexadecimálními hodnotami je v průvodci přesně tak slepé jako v YAML. Takže ./style.sh ti to ukáže.

Sedm palet, jeden stisk klávesy

Celé palety teď přicházejí v config/palettes.yml, světlé i tmavé:

  • Výchozí modrá, teplá, monochromatická a vysoký kontrast – čtyři z galerie na tomto webu, jejichž světlé režimy jsou přesně to, co ta stránka ukazovala. Jejich tmavé režimy jsou nové; galerie měla vždy jen světlé titulní strany.
  • Slunečnice, krémová a zlatá s olivovými odkazy – zlatavá žlutá zůstává na pilulkách štítků, protože žlutý text na krémové se číst nedá a zvýrazňovací barva je tu především barvou textu.
  • Zahrada, zelené a khaki.
  • Oceán, ocelová modř nad námořnickou.
Číst dál