Štítekarchiv16

Druhý jazyk, o vydání později

1.9 přineslo druhý jazyk: jeden příspěvek, text v každém jazyce, strom /en/ vedle kořene. První web, který to nasadil naostro, byl ten, na kterém engine vyrostl, a za měsíc provozu se ukázalo, co žádný test neukáže. V changelogu 1.10 je k druhému jazyku přes třicet položek. Tohle není jejich seznam. Je to o tom, co druhý jazyk potřebuje a první ne.

Jméno, které se skloňuje

site.author stojí ve větách: „na osobním webu Daniela Šnora". Čeština jméno skloňuje, takže v konfiguraci je druhý pád, a stránky v angličtině ho převzaly i s pádem. 1.10 přidává site.author_name: jméno tak, jak stojí samo – pod titulkem úvodníku, jako osoba ve strukturovaných datech, na stránkách jiného jazyka než vlastního. Bez něj se dál všude bere author, jako dřív. Jazyk, který neskloňuje, to nikdy nepotřeboval, a proto to nikdo nenapsal.

Série má jméno v každém jazyce

Číst dál

Uloženo beze změny

Oprava překlepu v jednom odstavci. To je celá změna, kterou autor udělal, a tak ji má archiv zapsat: jeden odstavec jinak, ostatní jak byly. Na skutečném archivu, cestou, kterou příspěvky posílá telefon, to engine do 1.9 neuměl. Měřeno 8. října: 101 příspěvků se změnilo tím, že byly uloženy beze změny.

Co markdown neumí říct

Příspěvek je uložený jako bloky, a editor ukazuje text. Mezi tím stojí převod, který většinou nic neztratí – odstavec je odstavec, nadpis je nadpis. Jenže archiv, který přišel z importu, nese na blocích věci, pro které markdown slovo nemá: odstavec, který Tumblr označil jako odsazený, jako položku seznamu nebo jako řádek chatu; u videa jeho poskytovatele a adresu, na které bylo poprvé; přehrávač, který služba předala jako HTML. Text, který editor ukáže, nic z toho nenese. A uložení dosud postavilo každý blok znovu z textu: oprava jednoho překlepu přepsala všechny ostatní bloky příspěvku bez nich. U stolu i z programu stejně; jen u stolu to nikoho nenapadlo měřit.

Otázka naopak

Číst dál

Co teď výpis říká

Výpis je stránka, kterou engine staví nejčastěji a kterou nikdo nepíše. Úvodní stránka, stránka štítku, rok archivu, díly série, výsledky hledání – všechno jsou karty příspěvků za sebou, a to, co karta říká, rozhoduje engine, ne autor. 1.10 na výpisech mění několik věcí najednou, a jedna z nich se změní, aniž by někdo cokoli nastavil. Na tu je dobré se připravit.

Karta obrázkového příspěvku nese obrázek

Karta se řeže na výšku a první blok si nechá, ať váží cokoli. Fotografie pod jedním řádkem slov tak z karty vypadla přesně u příspěvku, který je tou fotografií: na jednom archivu ukazovala první stránka obrázků tři obrázky ve třinácti kartách. Příspěvek druhu obrázek nebo video má teď na kartě napřed své médium a týž řez běží přes to, co následuje. Obrázek na výšku je držený na 22rem místo celé obrazovky a karta si tu výšku účtuje, takže popisek pod fotkou na výšku je na kartě také.

Tohle je ta změna, která se stane sama: každý web s takovými příspěvky ukáže po aktualizaci na výpisech víc obrázků. Článek s fotografií uvnitř zůstává článkem. A kdo chce, aby první karta úvodní stránky vedla obrázkem i u článku, zapne layout.lead_card. Je vypnuté: mění jen jednu kartu a jen na úvodní stránce, a to je rozhodnutí o vzhledu, které engine nedělá za autora.

Číst dál

Archiv promlouvá

Koncem září přišel dopis. Pavel si tímto enginem zálohoval starý blog a napsal, co se při tom dozvěděl: za devět let přes tisíc příspěvků a období, kdy psal každý den. Nevěděl to. Blog byl celou dobu jeho, příspěvky byly celou dobu v něm, a přesto mu to číslo řekl až archiv, když ho poprvé někdo přečetl celý.

Tohle vydání je o tom, co archiv řekne, když se ho zeptáš. Jak se do něj dostane, jak z něj odejde a jak se hlídá, o tom web napsal dost. Tenhle text je o tom, co archiv ví o tobě.

Co archiv spočítá

./blog.sh stats přečte každý příspěvek a odpoví jednou obrazovkou. Na archivu, kolem kterého tento engine vznikl, dnes vypadá takhle:

Archiv
  příspěvků: 6912 — z toho publikovaných 6907, rozepsaných 1, naplánovaných 4
  31. 10. 2003 – 22. 10. 2026, dnů: 8392
  nejvíc toho přibylo v roce 2024 (příspěvků: 642)

Slova
  slov celkem: 425 828, průměrně na příspěvek: 61,6, uprostřed: 22
  nejdelší: minimal-jedna-barva-tri-pisma (slov: 3267)
  přečíst celý archiv trvá 35,5 hodiny
Číst dál

Stavba archivu

Steven D. Brewer bloguje od roku 2002: PHPWiki, pak Drupal, pak WordPress. Když Drupal 7 došel na konec životnosti, hledal pro čtyřiadvacet let příspěvků místo, které nebude vyžadovat údržbu, a dal je na blog.sh: archive.bierfaristo.com, kde už jsou příspěvky z Drupalu i feed z Twitteru a kousky starého blogu Esperanto-USA vytažené z Wayback Machine.

Stojí za přečtení, pokud hledáš archiv, který má přežít software, ve kterém vznikl.

#blogsh #archive #drupal

Kam až to může narůst

Je poctivá otázka, než nástroji svěříš dvacet let psaní: v jakém bodě ho přestane být příjemné používat? Měřeno tady v srpnu, na archivu 6 639 příspěvků, byla upřímná odpověď pokrčení rameny: přidání jednoho příspěvku stálo celý archiv – osmačtyřicet sekund od stisknutí klávesy Enter do chvíle, kdy web běžel – protože každá stránka, která se o příspěvku byť jen zmiňovala, se musela vyrobit znovu, ať se změnila, nebo ne.

To už upřímná odpověď není. Od 1.6 si sestavení vede záznam o tom, co do každé stránky vstoupilo, a znovu vyrábí jen ty, jejichž záznam už nesedí. Archiv pod tím je tentýž, na kterém se to v srpnu měřilo, o sedm příspěvků těžší: teď 6 646, a engine o tři vydání dál, na 1.9.

Na co čekáš dnes

Publikace příspěvku s dnešním datem na tomtéž archivu: šestnáct sekund sestavení, dvě nahrávání – kde bylo osmačtyřicet. Sestavení už nesahá na stránky, které to nepotřebovaly, takže velikost archivu přestala být tím, z čeho se čekání skládalo.

Kde se velikost stále ukazuje

Číst dál

Co žádné sestavení nevrátí

Notebook doslouží, nebo se server buduje znovu od nuly, a otázka, na které skutečně záleží, je užší, než zní. Ne „jak to zálohovat" – „které z těchto souborů po mně engine opravdu potřebuje chránit, protože nic jiného tady je znovu nevyrobí."

Většina instalace tuto podmínku nesplňuje. Engine sám je git klon; stáhni ho znovu a je to tentýž engine. Všechno, co sestavení zapisuje, se vrátí jedním sestavením, pokud zbylo to ostatní.

Instinkt velí zálohovat samotný web – složku, kterou prohlížeč skutečně vidí. To je přesně ta jediná věc, kterou tento seznam vynechává. public.nosync, vlastní výstup sestavení, je stejně postradatelný jako engine, který ho vytvořil: jedno sestavení ho zopakuje bajt po bajtu, takže držet jeho kopii by znamenalo ukládat tutéž informaci dvakrát pod dvěma jmény a omylem věřit té starší.

Co zbývá, když odložíme engine i web, který sestavuje, je krátký seznam.

Co je skutečně nenahraditelné

Nejdřív samotné příspěvky – jediná položka celého seznamu, kterou žádné sestavení, nový klon ani nové nasazení nevrátí za žádných okolností.

Číst dál

Všechno ostatní v 1.6

Pět příspěvků pokrylo to, o čem 1.6 je. Tenhle je zbytek, v pořadí, v jakém ho provozovatel potká.

Cesta ven z koše a z verzí

Obě úložiště měla cestu zpět – restore a výběr verze ve vlastnostech příspěvku – a žádnou cestu ven, takže obě léta rostla a nic neříkalo o kolik. empty trash a empty versions vypíšou, co se chystají odstranit, v položkách a v megabajtech, a než cokoli odejde, chtějí ten počet opsat. empty versions nechá každému příspěvku jeho nejnovější verzi, protože verze existují proto, aby odpověděly na „vrať mi, co jsem právě přepsal". doctor teď koš s příspěvky zaznamená, jako poznámku, ne jako závadu: na instalaci, kolem které tento engine vznikl, byl jediný způsob, jak ho vidět, du na serveru.

Fotografie uložená jednou

public.nosync/ dřív držel druhou kopii každého obrázku. Teď drží pevný odkaz, takže obrázky zabírají polovinu toho, co dřív – 1,8 GB na instalaci tohoto projektu. V záloze to neušetří nic, a to bylo změřeno, ne předpokládáno: 200 souborů pod dvěma jmény, 101 MB na disku, 201 MB v záloze. Nic k udělání; první sestavení po aktualizaci odkazy vytvoří.

Číst dál

Archiv, který nevidíš, není prázdný

Schválené komentáře tohoto webu a jeho počítadla příspěvků jsou dva malé soubory JSON, které cron každou půlhodinu obnoví a nahraje se zbytkem webu.

Až do 1.4 by běh, který proběhl, zatímco archiv nebyl na místě, oba soubory zúžil na nic a nahrál je. Chybějící nebo prázdný adresář obsahu odpoví prázdným seznamem a žádnou chybou, a prázdný seznam se čte přesně jako „každý oznámený příspěvek byl smazán". Živý web přišel o každý schválený komentář a každé počítadlo naráz. Exit 0, nic řečeno, nic posláno mailem.

Archiv bydlí na synchronizovaném svazku. Svazek, který se ještě nepřipojil, nebo pracovní kopie, jejíž soubory teprve přicházejí, není neobvyklé úterý.

Nemožnost to rozeznat je důvod všechno nechat

Ta věta je oprava a běží teď ve dvou stupních.

Pokud adresář obsahu není na místě – nebo pokud se archiv čte jako prázdný, zatímco předchozí soubory obsahovaly cokoli – nic se nezužuje a běh řekne proč.

Číst dál

Dvě stránky, které si web sestavil sám ze sebe

Až dosud ti tento engine uměl ukázat deset příspěvků najednou a nic jiného. /page/128/ je na velkém archivu skutečná adresa a neřekne ti nic o tom, jestli jsi přistál v roce 2009 nebo 2014 – stránkování je ukotvené od nejstaršího příspěvku, takže se ti číslo pod nohama pohne pokaždé, když se něco publikuje. Jediný úplný seznam čehokoli žil v terminálu.

1.5 přidává dvě stránky, které archiv čtou, místo aby jím procházely.

/archive/ – tvar celku

Řádek na rok a vedle něj pás dvanácti měsíců. Měsíc je vystínovaný v jednom ze čtyř stupňů, ne jen rozsvícený nebo tmavý, protože „má příspěvky / nemá" není otázka, na kterou stojí za to odpovídat: na referenčním archivu drží měsíc kdekoli mezi jedním příspěvkem a sedmaosmdesáti, a kreslit je stejně by skrylo to jediné, k čemu mapa je. /archive/<rok>/ je jeden řádek na příspěvek, po měsících.

Dvě úrovně a víc ne. Třetí by byla nějakých 280 stránek jednotlivých měsíců – hodně sestavování na otázku, kterou nikdo nepoložil.

Číst dál

Slug je adresa, ne jméno

Po většinu života tohoto projektu měl příspěvek bez titulku dvě jména. Jeho vlastní stránka mu říkala podle data. Všechno ostatní – záložka prohlížeče, karta odkazu, kterou někdo sdílí, každá položka ve feedu – mu říkalo burtiky-opekame-hipstamatic-oggl-jane.

To není okrajový případ. Na archivu, na kterém se tento engine měří, nenese titulek 2 754 příspěvků z 4 418. Dvaašedesát procent webu, které jdou do světa pod adresou.

Slug je vyrobený ze slov. Není to ta slova.

Slug je strojová odpověď na „kde tohle bydlí": malá písmena, bez diakritiky, spojeno pomlčkami, uříznuto na prvních osm slov. Každá vlastnost, která z něj dělá dobrou adresu, z něj dělá špatné jméno. Nemá velká písmena, nemá interpunkci a netuší, kam věta, ze které byl uříznut, mířila.

1.5 bere jméno z téhož místa, odkud přišel slug – z vlastního začátku příspěvku – a zastaví se na lepším místě.

Kde se zastaví

Číst dál

Co smí stát pád

Fronta teď umí prohodit dva naplánované příspěvky, které sdílejí slug napříč dvěma roky – i s jejich médii a historií úprav, protože ty jsou klíčované rokem a slugem přesně jako soubor příspěvku. Ta věta je krátká; udělat ji pravdivou zabralo většinu vývojového cyklu. Zajímavá část není prohození. Je to, co se stane, když uprostřed vypadne proud.

Rozpočet je nula

Přesun je několik přejmenování a pád může dopadnout mezi kterákoli dvě. Pravidlo, kterého se 1.4 drží: ať je to kdykoli, pád tě smí stát přesun – nikdy příspěvek. Soubory ustoupí stranou pod parkovací jména dřív, než cokoli zapisuje; neúspěšný zápis vrátí všechno zpět, bajt po bajtu; tvrdé zabití, které nechá zaparkovaný soubor stát, ho nechá tam, kde ho check najde a pravdivě řekne, co je.

Rada je součást systému

Číst dál

Druhá polovina check

./blog.sh check přečte celý archiv a řekne, co je špatně: média, o která si příspěvek říká a nemá je, odkazy na adresy, na kterých nic neodpovídá, dva příspěvky, které by se servírovaly na jedné adrese. Až do 1.3 tam to končilo – seznam nálezů a návratový kód, s opravou ponechanou tobě a textovému editoru.

--repair to projde s tebou

check --repair je druhá polovina kontroly: ke každému nálezu nabídne tu jednu opravu, kterou nález dovoluje – starou adresu zapsanou do redirect_from cílového příspěvku, relativní odkaz přepsaný na adresu, kterou míní, osiřelý soubor přesunutý do koše. Nic se nepoužije bez stisku klávesy, nic se nemaže rovnou a nález bez zjevné odpovědi – dva příspěvky v kolizi, obrázek, který posoudí jen člověk – se ukáže a přeskočí, místo aby se hádal.

Osvědčil se dřív, než vyšel: na skutečném archivu snížil 238 nálezů na 42 a 21 oprav, které navrhl, se jedna k jedné shodovalo s tím, co už člověk rozhodl ručně.

--json říká všechno

Číst dál

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

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

Blogovací engine, ze kterého se stal archiv

První příspěvek na tomto webu je o fotce, kterou jsem v roce 2012 dal na Instagram. Odkaz pořád funguje. Fotka ne.

Ten příspěvek byl o jednom archivu – mém – a o jednom pravidle: média se vracejí domů. Tenhle je o tom, co se stalo, když se to pravidlo použilo na každou platformu, ke které jsem našel export.

Seznam je uzavřený

Importuje se teď dvaadvacet zdrojů, ve třech skupinách.

Sociální sítě: Bluesky, Facebook, Instagram, Mastodon, Pixelfed, Threads, Twitter/X.

Blogy a publikační platformy: beehiiv, Blogger, Ghost, Jekyll/Hugo a jakákoli složka s markdownem, LiveJournal, Medium, Movable Type a TypePad, podcasty (jakýkoli feed se zvukem), Squarespace, Substack, Tumblr, Wix, WordPress a jakýkoli feed RSS nebo Atom.

A mrtvé weby: Wayback Machine, pro blogy, jejichž platforma už vůbec neexistuje.

Číst dál