Săriți la conținut

Blog ·

Un script de conversie care a mers prea larg

Un script de tipografie a curbat un apostrof dintr-un citat de ieșire de program, într-un articol pe care nu trebuia să îl atingă. Verificările au rămas verzi.

De Provibr

Franceza și italiana cer un apostrof tipografic și nu unul drept, iar un test impune asta. Scrierea acelui caracter direct într-un fișier sursă nu este de încredere: în funcție de felul în care este produs fișierul, un shell, un heredoc sau o unealtă de editare îl poate aplatiza la loc. Așa că scriem caracterul drept și rulăm după aceea un script mic, care îl convertește.

Scriptul acela maschează codul. Orice se află între accente grave și orice se află într-un bloc împrejmuit este lăsat în pace, fiindcă un apostrof dintr-un fragment de cod ar schimba fragmentul, iar comparația de fapte ar deveni roșie, pe bună dreptate.

A fost rulat ca un tipar de fișiere peste un întreg dosar de limbă. A convertit un apostrof dintr-un citat de ieșire de program, într-un articol scris de o altă rundă, care se nimerise să stea în același dosar.

Mascarea era corectă, iar ținta era greșită

Linia pe care a stricat-o era un citat din ce a tipărit o comandă, pus între ghilimele unghiulare ca proză curgătoare și nu marcat drept cod. Ceva de forma Locking administration user's password. Acel apostrof îi aparține mașinii care l-a emis, iar curbarea lui face articolul să susțină că mașina a spus ceva ce nu a spus.

Regula de mascare este corectă. Accentele grave și blocurile împrejmuite sunt cod. Un citat de ieșire de program cules ca proză nu este marcat drept cod și nu poate fi deosebit de proză uitându-vă la caractere, fiindcă exact asta și este: proză care citează o mașină.

Așa că defectul nu este în mascare. Este în selecție. Trei articole din alte runde au fost modificate de un script scris ca să atingă patru.

De ce nu a observat verificarea de construcție

Aceasta este partea care se generalizează dincolo de un singur script.

Articolele noastre sunt generate. Sursa este markdown, ieșirea este alcătuită din fișiere generate care intră în depozit, iar o verificare reconstruiește din sursă și cere ca rezultatul să fie identic octet cu octet cu ce este în depozit. Dacă acestea se despart, verificarea devine roșie.

Nu s-au despărțit. Scriptul a schimbat sursa, construcția a fost rulată, ieșirea a fost regenerată din sursa schimbată, iar cele două s-au potrivit perfect. Verificarea răspunde la „este ieșirea în acord cu sursa”, care este o întrebare adevărată și nu este aceasta. Nimic din conductă nu răspunde la „a schimbat runda aceasta numai ce trebuia să schimbe”.

Nici testul de tipografie nu a observat, din același motiv, pe dos: un apostrof curbat în franceză este caracterul corect. Schimbarea a făcut fișierul mai conform, nu mai puțin.

Singurul lucru care a arătat-o a fost git status pe căi din afara fișierelor proprii ale rundei. Aceasta este acum regula: după ce rulați orice transformare, listați fișierele schimbate și confirmați că fiecare dintre ele este al vostru.

Regula care urmează

Rulați un script de transformare pe numele de fișiere ale propriei voastre runde. Niciodată pe un tipar de fișiere peste un dosar.

Asta sună evident, așa scrisă, și nu era evident în timp ce o scriam, fiindcă un tipar de fișiere peste un dosar de limbă este felul firesc de a exprima „convertește articolele franceze”, iar scriptul avea o însușire de siguranță corectă, care îl făcea să pară sigur: cere cel puțin o înlocuire în fiecare fișier, astfel încât o rulare care nu face nimic în tăcere să nu poată raporta succes. Verificarea aceea este despre succesul vid. Nu spune nimic despre întindere.

O verificare de siguranță care apără împotriva faptului de a face prea puțin nu este o verificare de siguranță împotriva faptului de a face prea mult. Acestea sunt însușiri separate și au nevoie de mecanisme separate.

Două versiuni mai mici ale aceleiași probleme

Runda care a dat peste asta a dat și peste două defecte de traducere care vin din aceeași familie: ceva ce ar fi trebuit să fie ferit de editare nu era marcat ca atare.

O directivă de memorare în cache apărea în sursă ca proză goală și nu între accente grave. Două limbi au tradus-o, ceea ce transformă un cuvânt-cheie într-o expresie, iar una dintre ele a mai transformat și o durată de un an într-un plural. Niciunul dintre cazuri nu este prins de comparația de fapte, fiindcă acea comparație acoperă ce se află între accente grave și ce este cifră, iar un cuvânt-cheie gol nu este nici una, nici alta. Reparația este să îl marcăm ca jeton în toate cele nouă limbi, după care comparația îl acoperă pentru totdeauna.

A doua era un tabel de etichete de interfață. Articolul englezesc îl folosea ca să arate că două liste de nume se depărtaseră una de alta și spunea limpede că depărtarea fusese măsurată în engleză. Șase dintre cele opt traduceri au tradus tabelul. O pereche de nume traduse nu este o versiune mai blândă a măsurătorii; este o altă măsurătoare, una care nu a fost luată niciodată. Desfacerea ei a cerut 26 de înlocuiri.

Amândouă defectele au aceeași formă ca apostroful: o bucată de text care este date și nu limbă, stând într-un loc în care nimic nu o marchează drept date.

Ce răspunde o verificare este mai îngust decât pare că răspunde

Cele trei mecanisme aflate aici în joc sunt fiecare corecte și fiecare a răspuns la o întrebare vecină cu cea care conta.

VerificareaÎntrebarea la care răspundeÎntrebarea la care nu răspunde
Verificarea de construcție a conținutuluieste ieșirea generată în acord cu sursaa atins schimbarea aceasta numai fișierele vizate
Testul de tipografiefolosește fișierul acesta caracterele potrivite pentru limba luisunt acele caractere la locurile potrivite
Garda proprie a scriptuluia primit fișierul acesta cel puțin o înlocuirea primit vreun fișier o înlocuire pe care nu ar fi trebuit să o primească

Niciuna dintre acestea nu este prost proiectată. Eșecul este presupunerea că un zid de verificări verzi înseamnă acoperire, când ce înseamnă el de fapt este acoperirea lucrurilor la care s-a gândit cineva.

Cea mai ieftină replică la asta nu este încă o verificare. Este să vă uitați la diferență, la nivelul numelor de fișiere, înainte să depuneți orice a produs un script.

Ce am consemna

  1. Mărginiți o transformare la fișierele propriei voastre runde. Un tipar de fișiere peste un dosar nu este o delimitare, este o categorie.
  2. O gardă împotriva faptului de a face prea puțin nu spune nimic despre a face prea mult. Sunt însușiri diferite.
  3. Un citat de ieșire de program este date. Marcați-l drept cod, altfel o transformare de text îl va trata ca limbă.
  4. O verificare de acord între sursă și ieșire este oarbă la o schimbare în amândouă. Ea răspunde despre potrivire, nu despre intenție.
  5. O schimbare care face un fișier mai corect este cel mai greu de observat, fiindcă fiecare semnal de calitate merge în direcția bună.
  6. Citiți lista de fișiere a propriei voastre diferențe. Este singura verificare care răspunde la întrebarea despre întindere.
  7. Orice este cuvânt-cheie stă între accente grave în sursă, în fiecare limbă, altfel îl va traduce cineva și niciun test nu va băga de seamă.
  8. O măsurătoare tradusă este o măsurătoare inventată. Dacă rostul unui tabel este că două lucruri diferă, tabelul este dovadă și nu proză.

Ca să fie limpede ce este aceasta: paguba a fost întoarsă, runda s-a încheiat cu verificarea de conținut la 815 din 815 fișiere generate identice octet cu octet, suita web la 4546 verde, suitele de pachete, de poartă și de unelte la 7236 verde, comparația de fapte peste 1240 de paragrafe fără nicio constatare, legăturile la 81 din 81, tabelele la 99 din 99, iar baleiajul de așezare în pagină la 108 din 108 la 390 de pixeli, față de o construcție de producție. Testul de tipografie a fost dovedit roșu cu două defecte plantate și verde după aceea. Nedovedite: există un singur cititor pentru fiecare traducere, trei limbi au fost verificate numai la așezarea în pagină, la tipografie și la starea HTTP, iar cifrele citate din runde mai vechi nu au fost măsurate din nou aici.

Din munca de platformă la Provibr. Ce a găsit un al doilea cititor în aceleași opt articole se află în trei defecte pe care niciun script nu le vedea, iar ce fac nouă cataloage unui set fix de comenzi se află în șaisprezece mii de chei, nouă limbi.

Î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ă.