Ir para o conteúdo

Blogue ·

A seleção envolve a frase inteira

Catorze frases chamavam VM a um contentor. Trocar a palavra funciona em inglês e parte em sete línguas, por isso o ramo carrega a frase inteira.

Por Provibr

Um contentor Proxmox é, no nosso produto, um VPS. O cliente encomenda um, recebe uma máquina com um endereço e um plano, e todos os ecrãs que falam de servidores falam dele corretamente. O tipo na base de dados diz vm, e está certo: o que foi vendido é um servidor privado virtual.

A diferença vive uma camada mais abaixo, nas palavras. Um contentor não tem BIOS, não tem disco virtual no sentido em que uma máquina virtual tem um, e não tem agente convidado. Uma ronda anterior anotou, como ponta solta, que uma frase numa página de contentor ainda dizia «a VM». Eram catorze.

Porque a palavra é a unidade errada

A reparação evidente é um espaço reservado onde está o substantivo. Algo como uma seleção sobre o tipo de recurso que produz «contentor» ou «VM», posta a meio da frase.

Em inglês funciona. Em alemão parte, porque o artigo não é o mesmo para essas duas palavras. Parte da mesma maneira em espanhol, francês, italiano, português e romeno, e parte com mais força em ucraniano, onde o substantivo nessa posição tem de levar uma terminação de caso que a palavra substituída não tem.

Pode-se correr atrás disto. Acrescente também uma seleção para o artigo, depois outra para a concordância do adjetivo, e descubra a seguir que a ordem natural das palavras muda. O que construiu a essa altura é um pequeno motor gramatical, conduzido por uma tradutora a quem não é permitido ver a frase.

O ramo carrega portanto a frase inteira. Uma variante para um contentor, outra para tudo o resto, e a tradutora escreve cada uma como uma frase na sua própria língua em vez de preencher um buraco numa frase inglesa. O ramo genérico é idêntico byte a byte ao valor que substituiu, portanto nada do que já estava certo se mexeu.

O ramo chama-se container e não lxc, porque o separador das cópias de segurança já usava exatamente esse nome para exatamente essa pergunta, e o seu modelo de vista chama o campo do mesmo modo. Duas grafias da mesma distinção dentro de um catálogo custam um pouco de cada vez e são um palpite de cada vez: a ronda seguinte tem de descobrir qual das duas se aplica aqui.

Uma seleção cujos ramos concordam é invisível

Um teste que verifica a forma destas chaves, que são analisáveis, que ambos os ramos existem, que o argumento se escreve igual em toda a parte, passa numa seleção cujos dois ramos dizem exatamente a mesma coisa. É precisamente o defeito que aqui se repara, portanto uma verificação de forma vale muito pouco.

A guarda desenha por isso ambos os ramos, nas nove línguas, e exige que o ramo de contentor de uma frase inglesa já não contenha a palavra para cuja remoção foi escrito. Exige também que a própria lista não se tenha esvaziado em silêncio: uma guarda sobre uma lista vazia é o verde mais barato do software.

Vinte e um testes, e cada um foi provado fazendo-o falhar primeiro. É a mesma forma da guarda sobre as palavras da cobertura das cópias, e pela mesma razão: o erro interessante não é um erro de sintaxe, é uma frase gramaticalmente perfeita e factualmente falsa.

A frase que nunca foi verdadeira

Uma das catorze não era de todo um problema de palavras.

O separador de rede tem uma linha para quando ainda não foi observado nenhum endereço. Dizia, no essencial: ainda nada visto, o agente convidado tem de estar a correr dentro da VM.

Num contentor essa frase é sempre mostrada, porque o agente não lê endereços de contentores de todo. A função de observação devolve uma lista vazia para esse tipo de convidado antes de perguntar o que quer que seja. A frase aparecia portanto de forma permanente, e enquanto ali esteve dizia duas coisas que não eram verdade: que aquilo poderia mudar assim que algo arrancasse, e que o que o mudaria é um agente convidado, que um contentor nunca tem.

Ninguém tinha mentido. A frase fora escrita para máquinas virtuais, para elas estava certa, e chegava-se a ela por um caminho de código que ganhara um segundo chamador. É a maneira comum de um ecrã acabar a dizer algo falso: não por alguém escrever uma falsidade, mas por uma frase verdadeira ser mostrada numa situação de que nunca tratou.

O ramo de contentor diz o que é realmente o caso, ou seja, que os endereços dentro de um contentor não são lidos. Não oferece esperança de que o número apareça mais tarde, porque não há nenhuma.

Frase antigaO que tinha de errado num contentor
PromessaAinda nada vistoNão vai mudar; o código nunca olha
CausaO agente convidado tem de estar a correrOs contentores não têm um
RemédioArranque o agente convidadoNão há nada para arrancar

Duas formas de a medição ficar verde pela razão errada

A verificação por navegador de tudo isto foi escrita primeiro e esteve errada duas vezes, de maneiras que vale a pena nomear porque ambas produzem um resultado aprovado.

A primeira: a verificação lia o texto visível da página e procurava a palavra «contentor». Encontrou-a. Estava no nome do plano de teste, zz-k7-containerplan, semeado pela própria verificação, enquanto a frase três linhas abaixo continuava a dizer «a VM». Um teste que semeia um arranjo e depois procura em toda a página uma palavra que esse arranjo contém está a medir a sua própria preparação. O remédio é um gancho no elemento que carrega mesmo a frase, para que a afirmação só possa ser satisfeita por aquilo de que trata.

A segunda era um defeito verdadeiro que a primeira tinha tapado. O tipo que comanda a seleção era derivado de uma variável do formulário de encomenda que carrega uma condição sobre a colocação, se o plano tem onde correr. Um plano de contentor sem colocação saía portanto como «não é um contentor», e a página dizia «a VM» numa encomenda de contentor. O tipo vem agora do tipo de cálculo do próprio plano mais o que o cliente escolheu, e nenhum dos dois sabe nada sobre colocação.

Esta é a forma mais geral: um valor que por acaso acompanha aquilo que quer saber não é o valor que quer. Concorda até ao dia em que deixa de concordar, e nesse dia nada falha, apenas diz a outra coisa.

Quando duas constantes partilham um nome

Mais uma coisa pequena da mesma ronda, numa guarda completamente diferente, porque ilustra bem como uma verificação estática pode perder o apoio.

Temos uma guarda que resolve por nome, à escala do projeto, a forma dos argumentos das constantes de tradução partilhadas, para que uma chave usada com um objeto partilhado continue coberta. Dois componentes diferentes definiam cada um uma constante where, com conteúdos distintos. A guarda, que resolve por nome, já não conseguia dizer a qual das duas se referia uma chamada, e desistiu de todas, incluindo chamadas num terceiro ficheiro que nada tinha a ver com nenhuma delas.

Renomear uma das duas resolveu. A lição não é sobre nomes: é sobre uma guarda que resolve símbolos por nome entre ficheiros ter um modo de ambiguidade, e esse modo ser o silêncio. A verificação não comunica «duas candidatas», não comunica nada sobre essas chamadas, e a contagem de chaves cobertas desce numa quantidade que ninguém vigia.

O que ficou como estava, de propósito

Três coisas ficaram como estavam, e escrever porquê faz parte do trabalho.

Uma frase diz a um cliente que reinstalar destrói tudo o que está nos discos da máquina. Num contentor isso não é um problema de palavras: reinstalar um contentor conserva, apaga ou exclui por ponto de montagem, e a substituição honesta é uma afirmação sobre que pontos de montagem caem em que grupo. Isso é um ecrã e não uma tradução, e pertence à ronda que o construir.

Uma sugestão no formulário de encomenda chama a um campo o nome de anfitrião da máquina virtual, num contexto em que a coisa nomeada é uma conta de alojamento. Isso é uma decisão de conteúdo e não uma questão de contentores, e fingir o contrário teria enfiado uma alteração de redação dentro de uma correção de palavras.

E o contador de licenças continua a dizer VM, porque é isso que conta. A unidade pela qual um cliente é faturado não é a unidade para que um cliente olha, e renomeá-la em silêncio faria uma linha de fatura deixar de bater certo com um número numa página.

O que registaríamos

  1. Ponha o ramo à volta da frase, não à volta do substantivo. A substituição de palavras funciona em inglês e falha em todo o lado por artigos e casos.
  2. Reutilize o nome de ramo que já existe. Duas grafias de uma distinção num catálogo são um palpite para cada ronda futura.
  3. Desenhe ambos os ramos no teste. Uma seleção cujos ramos concordam passa qualquer verificação que só olhe para a forma.
  4. Verifique contra um gancho no elemento, não contra a página inteira. Um nome de arranjo que contém a palavra procurada é luz verde para nada.
  5. Um valor correlacionado não é o valor. Derivar um tipo de recurso de algo que carrega uma condição de colocação funciona até um plano não ter colocação.
  6. Uma guarda que resolve por nome emudece perante um nome ambíguo. Não comunica a ambiguidade, não comunica nada.
  7. Uma frase pode ser falsa sem que ninguém tenha escrito uma falsidade. Verdadeira para um caso, alcançada por um segundo chamador, é o caminho habitual.

Para que fique claro o que isto é: as catorze chaves estão em produção nas nove línguas e sob guarda. Sete dessas línguas passaram apenas pelo teste de desenho e não por uma segunda leitora, e nada disto foi executado contra um Proxmox real nesta ronda.

Do trabalho de plataforma na Provibr. O que difere de facto entre os dois tipos de convidado está em VM ou contentor no Proxmox, e porque reinstalar um contentor é uma substituição e não uma reparação está em reinstalar um contentor é uma substituição.

Comece com um host e um agente

Crie uma conta, instale o agente com um único comando e ligue o seu primeiro host Proxmox. O período experimental dura 14 dias e não pede quaisquer dados de pagamento.