Blog ·
La selezione avvolge l’intera frase
Quattordici frasi chiamavano VM un contenitore. Scambiare la parola funziona in inglese e si rompe in sette lingue, quindi il ramo porta l’intera frase.
Di Provibr
Un contenitore Proxmox è, nel nostro prodotto, un VPS. Il cliente ne ordina uno, riceve una macchina con un indirizzo e un piano, e ogni schermata che parla di server ne parla correttamente. Il tipo nella banca dati dice vm, ed è giusto: ciò che è stato venduto è un server privato virtuale.
La differenza vive uno strato più in basso, nelle parole. Un contenitore non ha BIOS, non ha un disco virtuale nel senso in cui lo ha una macchina virtuale, e non ha un agente ospite. Un turno precedente aveva annotato, come filo pendente, che una frase su una pagina di contenitore diceva ancora «la VM». Erano quattordici.
Perché la parola è l’unità sbagliata
La riparazione ovvia è un segnaposto dove sta il sostantivo. Qualcosa come una selezione sul tipo di risorsa che produce «contenitore» o «VM», messa in mezzo alla frase.
In inglese funziona. In tedesco si rompe, perché l’articolo non è lo stesso per quelle due parole. Si rompe allo stesso modo in spagnolo, francese, italiano, portoghese e rumeno, e si rompe più forte in ucraino, dove il sostantivo in quella posizione deve prendere una desinenza di caso che la parola sostituita non ha.
Si può rincorrere la cosa. Aggiunga anche una selezione per l’articolo, poi una per l’accordo dell’aggettivo, e scopra poi che l’ordine naturale delle parole cambia. Quello che ha costruito a quel punto è un piccolo motore grammaticale, guidato da una traduttrice a cui non è permesso vedere la frase.
Il ramo porta dunque l’intera frase. Una variante per un contenitore, una per tutto il resto, e la traduttrice scrive ciascuna come una frase nella propria lingua invece di riempire un buco in una frase inglese. Il ramo generico è identico byte per byte al valore che ha sostituito, quindi nulla di ciò che era già giusto si è mosso.
Il ramo si chiama container e non lxc, perché la scheda dei backup usava già esattamente quel nome per esattamente quella domanda, e il suo modello di vista chiama il campo allo stesso modo. Due grafie della stessa distinzione dentro un solo catalogo costano poco ogni volta e sono una scommessa ogni volta: il turno successivo deve stabilire quale delle due valga qui.
Una selezione i cui rami concordano è invisibile
Una prova che controlla la forma di queste chiavi, che si analizzino, che entrambi i rami esistano, che l’argomento sia scritto uguale dappertutto, passa su una selezione i cui due rami dicono esattamente la stessa cosa. È proprio il difetto che qui viene riparato, quindi un controllo di forma vale ben poco.
La guardia disegna perciò entrambi i rami, in tutte e nove le lingue, e pretende che il ramo contenitore di una frase inglese non contenga più la parola per la cui rimozione è stato scritto. Pretende inoltre che l’elenco stesso non si sia svuotato in silenzio: una guardia sopra un elenco vuoto è il verde più a buon mercato del software.
Ventuno prove, e ciascuna è stata dimostrata facendola prima fallire. È la stessa forma della guardia sulle parole della copertura dei backup, e per la stessa ragione: l’errore interessante non è un errore di sintassi, ma una frase grammaticalmente perfetta e di fatto falsa.
La frase che non è mai stata vera
Una delle quattordici non era affatto un problema di parole.
La scheda di rete ha una riga per quando non è ancora stato osservato alcun indirizzo. Diceva, in sostanza: ancora nulla in vista, l’agente ospite deve essere in funzione dentro la VM.
Su un contenitore quella frase viene mostrata sempre, perché l’agente per i contenitori non legge affatto gli indirizzi. La funzione di osservazione restituisce un elenco vuoto per quel tipo di ospite prima di chiedere alcunché. La frase compariva dunque in permanenza, e finché stava lì diceva due cose non vere: che quello poteva cambiare non appena qualcosa partiva, e che ciò che lo avrebbe cambiato è un agente ospite, che un contenitore non ha mai.
Nessuno aveva mentito. La frase era stata scritta per macchine virtuali, per loro era corretta, e vi si arrivava attraverso un percorso di codice che aveva guadagnato un secondo chiamante. È il modo ordinario in cui una schermata finisce col dire qualcosa di falso: non perché qualcuno scriva una menzogna, ma perché una frase vera viene mostrata in una situazione di cui non ha mai parlato.
Il ramo contenitore dice quel che accade davvero, cioè che gli indirizzi dentro un contenitore non vengono letti. Non offre alcuna speranza che il numero compaia più tardi, perché non ce n’è.
| Vecchia frase | Che cosa aveva di sbagliato su un contenitore | |
|---|---|---|
| Promessa | Ancora nulla in vista | Non cambierà; il codice non guarda mai |
| Causa | L’agente ospite deve essere in funzione | I contenitori non ne hanno uno |
| Rimedio | Avvii l’agente ospite | Non c’è nulla da avviare |
Due modi in cui la misura è diventata verde per la ragione sbagliata
Il controllo da browser di tutto questo è stato scritto per primo ed è stato sbagliato due volte, in modi che vale la pena nominare perché entrambi producono un esito superato.
Il primo: il controllo leggeva il testo visibile della pagina e cercava la parola «contenitore». La trovava. Stava nel nome del piano di prova, zz-k7-containerplan, seminato dal controllo stesso, mentre la frase tre righe sotto diceva ancora «la VM». Una prova che semina un apparato e poi cerca in tutta la pagina una parola che quell’apparato contiene misura la propria preparazione. Il rimedio è un gancio sull’elemento che porta davvero la frase, così che l’asserzione possa essere soddisfatta soltanto da ciò di cui parla.
Il secondo era un difetto vero che il primo aveva coperto. Il tipo che guida la selezione veniva derivato da una variabile del modulo d’ordine che porta una condizione sul collocamento, cioè se il piano abbia dove girare. Un piano di contenitore senza collocamento usciva dunque come «non un contenitore», e la pagina diceva «la VM» su un ordine di contenitore. Il tipo viene ora dal tipo di calcolo proprio del piano più da ciò che il cliente ha scelto, e nessuno dei due sa alcunché del collocamento.
Questa è la forma più generale: un valore che per caso va di pari passo con ciò che vuole sapere non è il valore che vuole. Concorda fino al giorno in cui non concorda più, e quel giorno non fallisce nulla, dice semplicemente l’altra cosa.
Quando due costanti condividono un nome
Ancora una piccola cosa dallo stesso turno, in una guardia del tutto diversa, perché illustra bene come un controllo statico possa perdere l’appoggio.
Abbiamo una guardia che risolve per nome, a livello di progetto, la forma degli argomenti delle costanti di traduzione condivise, così che una chiave usata con un oggetto condiviso resti coperta. Due componenti diversi definivano ciascuno una costante where, con contenuti diversi. La guardia, che risolve per nome, non poteva più dire a quale delle due si riferisse una chiamata, e le ha abbandonate tutte, comprese chiamate in un terzo file che non aveva a che fare né con l’una né con l’altra.
Rinominarne una ha risolto. La lezione non riguarda i nomi: riguarda il fatto che una guardia che risolve simboli per nome tra file ha una modalità di ambiguità, e quella modalità è il silenzio. Il controllo non segnala «due candidate», non segnala nulla su quelle chiamate, e il conteggio delle chiavi coperte scende di una quantità che nessuno sorveglia.
Che cosa è stato lasciato com’era, di proposito
Tre cose sono rimaste come stavano, e scrivere perché fa parte del lavoro.
Una frase dice a un cliente che reinstallare distrugge tutto ciò che sta sui dischi della macchina. Su un contenitore quello non è un problema di parole: reinstallare un contenitore conserva, cancella o esclude per punto di montaggio, e la sostituzione onesta è un’affermazione su quali punti di montaggio cadano in quale gruppo. Quella è una schermata e non una traduzione, e appartiene al turno che la costruirà.
Un suggerimento nel modulo d’ordine chiama un campo il nome host della macchina virtuale, in un contesto in cui la cosa nominata è un account di hosting. Quella è una decisione di contenuto e non una questione di contenitori, e fingere il contrario avrebbe fatto passare un cambio redazionale dentro una correzione di parole.
E il contatore delle licenze continua a dire VM, perché è ciò che conta. L’unità per cui un cliente viene fatturato non è l’unità che un cliente guarda, e rinominarla in silenzio farebbe smettere una riga di fattura di corrispondere a un numero su una pagina.
Che cosa annoteremmo
- Metta il ramo attorno alla frase, non attorno al sostantivo. La sostituzione di parole funziona in inglese e cade altrove su articoli e casi.
- Riutilizzi il nome di ramo che esiste già. Due grafie di una distinzione in un catalogo sono una scommessa per ogni turno futuro.
- Disegni entrambi i rami nella prova. Una selezione i cui rami concordano supera ogni controllo che guardi solo alla forma.
- Verifichi contro un gancio sull’elemento, non contro l’intera pagina. Un nome di apparato che contiene la parola cercata è via libera per nulla.
- Un valore correlato non è il valore. Derivare un tipo di risorsa da qualcosa che porta una condizione di collocamento funziona finché un piano non ha collocamento.
- Una guardia che risolve per nome ammutolisce davanti a un nome ambiguo. Non segnala l’ambiguità, non segnala nulla.
- Una frase può essere falsa senza che nessuno abbia scritto una menzogna. Vera per un caso, raggiunta da un secondo chiamante, è la via consueta.
Per chiarezza su che cosa sia: le quattordici chiavi sono in produzione in tutte e nove le lingue e sono sorvegliate. Sette di quelle lingue sono passate soltanto per la prova di disegno e non per una seconda lettrice, e nulla di tutto ciò è stato eseguito contro un Proxmox reale in questo turno.
Dal lavoro di piattaforma su Provibr. Che cosa differisca davvero fra i due tipi di ospite si trova in VM o contenitore su Proxmox, e perché reinstallare un contenitore sia una sostituzione e non una riparazione in reinstallare un contenitore è una sostituzione.