Săriți la conținut

Blog ·

O dată viitoare nu este un calendar

Douăzeci și patru de articole publicate susțineau că nu apăruseră încă. Soluția nu a fost un planificator, ci o compilare care refuză astfel de date.

De Provibr

Fiecare articol de pe acest sit poartă o dată de publicare în antetul lui. Apare sub titlu, intră în datele structurate pe care le citește un motor de căutare și este singura dată pe care harta sitului o tipărește vreodată. Ar trebui să fie un fapt.

O vreme, douăzeci și patru dintre ele nu erau. Purtau date răspândite pe cele șase zile următoare, fiindcă cine le-a scris avea în minte un ritm de publicare și l-a pus în fișier. Câte nouă limbi fiecare, deci două sute șaisprezece fișiere. Fiecare dintre acele pagini era publicată, putea fi parcursă și era indexată, iar fiecare îi spunea unui robot, în formă citibilă de mașină, că apăruse într-o zi care încă nu se întâmplase.

Nimic nu era pe roșu. Compilarea era verde, testele erau verzi, paginile se serveau. Singurul lucru capabil să vadă contradicția era o mașină care citea pagina, iar mașinile nu deschid sesizări.

Ce spunea istoricul

Primul lucru de stabilit era care dintre cele două date era adevărată. Asta ține de o singură comandă: să întrebi git când a fost adăugat prima dată fiecare fișier. Toate douăzeci și patru au fost adăugate în aceeași zi, în trei predări, de trei runde ale aceleiași munci de noapte. Nu a existat nicio lansare pe șase zile. Împrăștierea era o intenție scrisă într-un câmp rezervat observațiilor.

Această distincție este întregul articol. Un câmp care consemnează ce s-a întâmplat nu poate exprima și ce plănuiești, fiindcă un cititor nu le poate deosebi, iar un robot cu atât mai puțin.

De ce nu am construit planificatorul

Reparația evidentă este să faci datele adevărate punând situl să le respecte: ascunde un articol până îi vine data. Aici este reparația greșită din două motive independente, iar ambele merită scrise fiindcă primul scapă ușor.

Acest sit este generat static. Paginile sunt compuse o dată, în timpul compilării, și servite ca fișier. O poartă pe dată este deci evaluată la momentul compilării și niciodată după aceea. La miezul nopții nu apare nimic; apare când cineva compilează. O poartă pe dată nu produce așadar un calendar de publicare, ci un set de pagini absente până când se nimerește să ruleze o lansare fără legătură.

Al doilea motiv este mai rău. Acele două sute șaisprezece adrese fuseseră deja parcurse. A le ascunde până la data lor nominală înseamnă a servi un 404 timp de până la șase zile pe pagini pe care un motor de căutare le-a văzut și indexat deja. Un 404 pe o adresă deja indexată nu este un „revino mai târziu”, este un semnal de retragere, iar revenirea din el costă mult mai mult decât neadevărul corectat.

Datele au fost deci corectate către ziua în care munca a aterizat cu adevărat, atingând doar acea linie în fiecare dintre cele două sute șaisprezece fișiere, iar în locul ei a fost înlăturată posibilitatea de a scrie o dată viitoare.

Poarta stă la sursă și nu are ieșire de urgență

Compilarea de conținut refuză acum orice dată din antet ulterioară zilei în care compilează. Nu un avertisment: o compilare eșuată, cu numele fișierului și ambele date în mesaj.

Două decizii mici dinăuntru merită numite. Compară cu ziua de azi în fusul orar propriu al proiectului și nu cu UTC, fiindcă un articol apărut aici la douăsprezece și jumătate noaptea poartă data de aici, iar o comparație cu UTC ar respinge un fișier chiar în ziua apariției lui. Și nu există intenționat nicio excepție: nicio variabilă de mediu, niciun indicator. O ieșire de urgență la o asemenea regulă se folosește o dată dintr-un motiv bun și apoi permanent, iar un calendar aparține unei liste de sarcini și nu antetului unui fișier deja predat.

Există o a doua poartă mai departe, în registrul care compune articolele publicate, și lasă pe dinafară orice articol a cărui dată de publicare este încă în viitor. Este o plasă pentru căile care nu trec prin compilare: un fișier editat manual, o îmbinare care amestecă două generații, o copie restaurată. Controlează doar data publicării și nu pe cea a modificării, fiindcă o greșeală de tipar într-un câmp de dată nu are voie să facă să dispară o pagină deja indexată.

Iar acea a doua poartă este evaluată o singură dată, la încărcarea modulului în timpul compilării. Asta stă scris într-un comentariu alături, fiindcă un cititor care ar presupune altceva ar ajunge să scrie exact planificatorul împotriva căruia argumentează această secțiune.

O dată pe care nu o poți deduce e mai bine omisă

Aceeași rundă a trebuit să decidă ce dată, dacă vreuna, li se cuvine paginilor de documentație, care nu au deloc antet. S-au prezentat trei candidate, iar toate trei sunt false.

CandidatăDe ce este greșită
Data git a componentei de paginăSe schimbă la schimbarea unui nume de clasă și nu se schimbă când textul se mută într-un fișier de traducere
Data git a catalogului de traducereUn fișier conține mii de texte fără legătură și se schimbă deci încontinuu din motive străine de această pagină
Data compilăriiSpune în fiecare zi că fiecare pagină a fost scrisă azi

Paginile de documentație nu poartă așadar nicio dată de publicare în datele lor structurate. Nimic este mai bun decât o cifră plauzibilă, fiindcă o cifră plauzibilă este cea pe care nimeni nu o verifică.

Același raționament guverna deja harta sitului. Rutele fixe nu poartă nicio dată de modificare, iar motivul nu este lenea: conținutul lor este cod, iar textul lor locuiește în nouă cataloage de traducere, deci orice dată pe care am putea-o calcula ar urma altceva decât ce vede cititorul. Un motor care preia de trei ori o pagină „modificată” și o găsește neschimbată învață să ignore câmpul, iar atunci câmpul este mai rău decât absent pe paginile unde este real. Articolele poartă una, fiindcă stă în antet lângă titlu, unde cine rescrie textul chiar o vede.

După această lucrare, acoperirea nu s-a schimbat deloc: adresele de articole poartă o dată de modificare, tot restul nu poartă niciuna, exact ca înainte. S-a schimbat faptul că două sute șaisprezece dintre acele date erau în viitor, iar acum niciuna nu mai este.

Încă o contradicție, rezolvată prin identitate

La recitirea datelor structurate a apărut o versiune mai mică a aceleiași probleme: pe unele pagini autorul și editorul erau două entități separate fără relație declarată. Citite literal, acele pagini susțineau că articolul fusese scris de o firmă și publicat de alta. Ambele arată acum către același identificator. Nimeni nu s-ar fi plâns, și era totuși o afirmație a noastră care nu era adevărată.

Ce am nota

  1. Nu puneți niciodată o intenție într-un câmp care consemnează o observație. Un cititor nu le poate separa, iar o mașină cu atât mai puțin.
  2. Confruntați afirmația cu istoricul. O comandă pe istoricul fișierelor a decis care dintre două date era cea reală și contrazicea toate cele douăzeci și patru de fișiere.
  3. O poartă pe dată pe un sit generat static nu este un calendar. La miezul nopții nu apare nimic; apare la următoarea compilare.
  4. Nu ascundeți adrese deja indexate. Un 404 pe o pagină parcursă este un semnal de retragere, iar leacul costă mai mult decât boala.
  5. Puneți poarta acolo unde se face greșeala, faceți compilarea să eșueze și nu adăugați excepții. Puneți o a doua poartă mai departe pentru căile care o sar pe prima.
  6. Omiteți o dată pe care nu o puteți deduce onest. Trei surse plauzibile, greșite toate trei, înseamnă că ieșirea onestă este niciuna.

Ca să fie limpede ce este asta: aceasta este întreținere la un sit public, nu o funcție de produs, și nu a schimbat niciun comportament pentru care plătește cineva. O parte rămâne nedovedită. Datele structurate au fost validate față de propria schemă și recitite manual, nu de un robot real și nici de o fișă reală de previzualizare. Nimic nu a fost măsurat față de indexul unui motor de căutare, fiindcă acea măsurătoare durează săptămâni și nimeni nu ar trebui să o aștepte înainte de a înlătura un neadevăr.

Din lucrul la situl Provibr. Cât costă menținerea corectă a șaisprezece mii de texte în nouă limbi se află în șaisprezece mii de chei, nouă limbi, iar cum o coliziune de numere de câmp într-un protocol a rămas ascunsă se află în două runde, un număr de câmp.

Începeți cu o gazdă și un agent

Creați un cont, instalați agentul cu o singură comandă și conectați primul dumneavoastră host Proxmox. Perioada de probă durează 14 zile și nu cere date de plată.