./blog.sh

Všechno ostatní v 1.5

Pět příspěvků pokrylo tvar tohoto vydání. Tady je zbytek, po odstavci na každou věc.

Čí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

Příspěvky, které nikdo publikovat nechtěl

Nejhorší selhání importéru není ztráta příspěvku. Je to jeho publikování.

1.5 prošla všech jedenáct importních adaptérů a mechaniku pod nimi a hledala přesně tohle – a našla to třikrát, ve třech různých souborech, pokaždé vzniklé stejně.

Archiv je celý účet

Export z Mastodonu není tvoje veřejná časová osa. Outbox drží vedle veřejných příspěvků i ty jen pro sledující a přímé zprávy – a každý samostatný toot v něm se zapisoval jako publikovaný. Na archivu, na kterém se to měřilo, je to 141 příspěvků z 2 548, z nichž 132 jsou přímé zprávy, každá s vlastní stránkou, vlastní položkou v sitemapě a vlastní položkou ve feedu. V souhrnu běhu o tom nebylo ani slovo.

Rozsah viditelnosti byl v exportu celou dobu, přesně tam, kam ho ActivityPub dává. Public v to je veřejný. Public v cc je mimo výpisy – skutečná adresa, ale ne ve výpisech. Jen pro sledující a přímé se stávají koncepty: to nechá autorova slova v archivu a mimo web, což je jediné čtení „není veřejné", které nemůže nic publikovat omylem.

Číst dál

Uříznuto dřív, než se to zapíše

Karta ve výpisu bývala celý příspěvek. Engine do stránky vykreslil každý jeho blok a stylesheet výsledek ořízl na 500 pixelů.

Na skutečné titulní straně to znamenalo čtrnáct karet nesoucích mezi 794 a 2 616 pixely obsahu a ukazujících 500. Z 50 659 znaků stránky jich 49 312 sedělo uvnitř oříznutí. Třiatřicet ze 154 jejích zaostřitelných prvků šlo dosáhnout klávesnicí, zatímco byly na obrazovce neviditelné – odkazy, které vidící uživatel s myší neviděl a uživatel s klávesnicí nemohl přeskočit.

1.5 kartu uřízne dřív, než se zapíše. Stylesheet neskrývá nic.

Ta stránka šla z 89 268 bajtů HTML na 41 155. Její největší karta, 7 463 znaků, má teď 2 566. A „číst dál" se objeví přesně tehdy, když se něco nevešlo, místo aby sedělo pod kartou, která už ukazovala všechno, co měla.

Rozpočet je v pixelech, ne ve znacích

Čí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

./blog.sh 1.5

1.5 je vydání, ve kterém se web naučil říkat, co drží. Vydání je na GitHubu.

Příspěvek, který nikdy neměl titulek, se dřív jmenoval podle své adresy – na vlastním referenčním archivu tohoto projektu to bylo 62 % z něj. Teď se jmenuje podle svých úvodních slov, všude kromě nadpisu, který zůstává datem, jako je od 1.3.

Přicházejí s ním dvě nové stránky: /archive/, mapa celého webu ve dvou úrovních, a /tag/, každé téma, o kterém kdy psal. Obě jsou sestavené z příspěvků samotných – nic k nastavení a nic k udržování.

Dvě věci, o kterých teď příspěvek může rozhodnout sám: kde končí jeho upoutávka (//--more--//, vyžádáno v issue #35) a kolik z něj ukáže karta ve výpisu – karty se řežou dřív, než se zapíší, místo aby se kreslily celé a skrývaly přes CSS. A blok kódu nese tlačítko kopírování, o které požádal provozovatel blogu plného návodů pro terminál.

Pod tím čtyři dny nepřátelské revize: dvě bug bounty, 237 potvrzených nálezů, každý uzavřený a přišpendlený testem, který na starém kódu padá – nebo zapsaný s počtem příspěvků, kterých se skutečně týká, což u třetiny z nich vyšlo na nulu.

Číst dál

Testováno jako nepřítel

1.4 prošla před tagem čtyřmi koly nepřátelského auditu: flotily nezávislých revizorů nad skutečnými archivy – skutečné exporty, skutečný web se 4 400 příspěvky, skutečné cíle nasazení – každý s pokynem engine rozbít, ne potvrdit. Nálezů bylo přes sto. Každý byl před opravou zreprodukován a každá oprava je přišpendlená testem, který na kódu, který opravila, prokazatelně padá.

Vzorec, který se pořád opakoval

Nepříjemné poučení: opravy z každého kola byly tam, kde další kolo našlo své chyby. Oprava pravidla pro čtení komentářů smazala sto řádků něčí konfigurace; oprava toho skryla odpovědi widgetu; rada k obnově napsaná k záchraně příspěvků mohla jeden zničit. Čtyřikrát za sebou byl nejnovější kód nejnebezpečnějším kódem ve stromu – což je přesně důvod, proč poslední kolo auditovalo výhradně opravy samotné. Zachytilo tři moje regrese dřív, než mohl kterýkoli uživatel.

Osmnáct souborů

Čí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