SimuLook · Notas da câmara

Realce e sombra movem-se em meios passos, e nós estávamos a arredondá-los

Defina o realce numa Fujifilm atual e o seletor não vai −1, 0, +1. Vai −1, −0,5, 0, +0,5, +1. O mesmo para a sombra. Esses dois controlos, sozinhos entre as definições de tonalidade, movem-se em meios passos.

A nossa app guardava-os como números inteiros. E tudo o que vinha a jusante disso também.

O que isso custou de facto

Três das sete posições da câmara contra a qual calibramos estão em −0,5. Leia uma dessas posições para a app e o valor era arredondado à entrada — antes de ser guardado, antes de ser publicado, antes de ser reescrito.

As consequências acumulam-se de uma forma pior do que parece à primeira:

  • Uma receita que leu da sua câmara não era a receita que estava na sua câmara. Estava a meio ponto dela.
  • Publique-a e toda a gente que a guardou ficou com a versão arredondada.
  • Escreva-a de volta numa posição e a câmara acabou a guardar um valor que nunca antes tinha tido.
  • Compare-a com a fotografia com que foi tirada e a app reportava uma correspondência exata, porque os dois lados tinham sido arredondados até concordarem.

Esta última é a pior. Todo o objetivo de comparar uma fotografia com a sua biblioteca é nomear a diferença. Arredondar transforma uma diferença real numa falsa confirmação.

O comentário já lá estava

O arredondamento não foi um descuido que ninguém notou. Havia um comentário mesmo por cima que dizia que o modelo guardava a tonalidade como inteiro, que os corpos atuais oferecem meios passos e que isto era uma limitação da app e não da câmara.

Alguém escreveu isso, corretamente, e seguiu em frente. Ficou verdade durante meses.

Mencionamo-lo porque a lição não é “verifique os seus tipos”. É que uma limitação conhecida escrita num comentário não é uma limitação corrigida, e uma base de código carrega de bom grado uma descrição exata do seu próprio erro durante todo o tempo que a deixarem.

A parte que tornou a correção delicada

A reparação óbvia é mudar o campo para decimal e escrever −0,5 no servidor. Isso teria partido a app para toda a gente que não tivesse atualizado.

As versões já distribuídas descodificam esse campo como inteiro. Entregue-lhes uma fração e não degradam — rebentam. E como uma página do feed da comunidade é descodificada como uma lista única, uma só receita com meio passo teria esvaziado o Descobrir para todos os utilizadores ainda numa versão anterior. Uma receita, o feed de toda a gente.

Por isso o valor viaja duas vezes. O campo antigo continua a carregar o número arredondado que esses clientes já liam, inalterado. Um segundo campo carrega o valor exato na unidade da própria câmara — o corpo guarda a tonalidade em décimas, por isso −0,5 é −5, que é um inteiro e contorna a questão de como um decimal sobrevive a uma ida e volta.

São dois testes que seguram essa promessa, e não um comentário: um descodifica o que a app atual escreve para uma estrutura com a forma do contrato antigo e confirma que continua a ler um número inteiro; o outro faz ida e volta a todos os campos, para que uma propriedade deixada de fora do codificador escrito à mão chumbe a suite em vez de deixar cair silenciosamente uma das suas definições.

Tudo a jusante teve de acompanhar

Um valor só está preservado se nada ao longo do caminho o voltar a arredondar.

Os dois editores passam agora de meio em meio. Um editor de passo inteiro teria voltado a arredondar a receita no momento em que o seu dono a abrisse — a mesma perda, uma fronteira mais à frente. O caminho de escrita para a câmara envia as décimas exatas, por isso escrever numa posição que leu do mesmo corpo restaura agora o que lá estava de facto. A verificação de leitura de volta mantém a tolerância para o ruído de vírgula flutuante sem perdoar uma diferença real de meio passo. E o comparador de fotografias reporta −0,5 contra 0 como uma diferença, e nomeia-a.

Porquê escrever isto

Porque a promessa da app é que lhe diz a verdade sobre as suas definições e, durante meses, andou a dizer-lhe calmamente algo que estava meio ponto ao lado.

A correção está feita. As seis receitas que publicámos foram corrigidas para os seus valores exatos. Mas uma app que se diz precisa tem de conseguir dizer quando não foi, ou a afirmação é só publicidade.


Escrito durante o desenvolvimento do SimuLook, uma aplicação para ler e escrever receitas de simulação de filme Fujifilm. Ver as câmaras compatíveis · Ler as outras notas