Número 76
21 de decembro de 2023

E logo, que pasou?

Que é isto? A Folla nun xoves? A publicación de onte foi moi accidentada, cun email enviado tarde e con erros de codificación, e hoxe quérovos explicar o que ocorreu.

Captura de pantalla do email de onte con caracteres Unicode mal codificados.Este era o aspecto que tiña o meu email de onte.

Como sabedes, hai tempo que estou a modificar o software da Folla para que sexa máis doado engadir comentarios. Entre os cambios que fixen, unifiquei a configuración e tamén o código para xerar o sitio web e enviar os emails.

Mentres eu traballaba niso, o meu ordenador portátil comezou a ter problemas: cando estaba enchufado, o indicador de carga prendía e apagaba cada segundo. No principio pensei que sería culpa do cargador, pero cando usei outro, o problema continuaba.

Un día, o portátil apareceu totalmente descargado malia estar enchufado, e non collía carga por moito que lle zangoleara o enchufe USB ou soprara nel. Unhas horas despois, milagrosamente, cargou e seguín traballando con el. No día seguinte volveu aparecer descargado. Encarguei unha peza para ver se o daba arranxado, pero non resultou e tiven que mercar un portátil novo.

Así cheguei ao martes co portátil novo e acabado de instalar e decidín enviar unha notiña para anunciar que o código fonte está dispoñible en GitHub e contar un conto en exclusiva para os subscritores. Lamentablemente, esa nota non saíu para os subscritores da Folla, senón para o meu grupo de “test”, así que ninguén o recibiu. Mandei un chío no Mastodon pero, claro, non era o mesmo.

Un tempo despois decateime de que podía re-enviar a nota aos subscritores se entraba na web do meu provedor de servizo de email, duplicaba a campaña e lle poñía o grupo destinatario correcto. Nese momento estaba a agardar por un tren pero podía facelo en menos de dous minutos: conectei co móbil, dupliquei a campaña, mudei os destinatarios e deille a “enviar”.

Tres minutos despois todos tiñades nas vosas caixas de correo o “Teño o ordenador escacharrado” do demo.


Por que ocorreu isto?

Un erro no meu programa fixo que se aplicara a configuración incorrecta no envío de emails. Teño unha configuración para enviar emails aos subscritores e outra configuración para envialos ao grupo de “test” e podo seleccionar unha configuración ou a outra cun “flag” na liña de ordes que serve para seleccionar as operacións que o programa vai realizar.

O código correspondente a cada operación vai nunha función que ten variables capturadas (“closure” en inglés). O meu código crea esta función dentro dun bucle “for” que fai unha iteración por cada configuración de email. O problema é que, en Go, cando capturas variables de bucle, todas as capturas corresponden á mesma variable. Como resultado, todas as operacións tiñan a mesma configuración, que era a de test.

Se non o entendedes, ollade este código:

var fns = make([]func() int, 3)
for i := 0; i < 3; i++ {
    fns[i] = func() int { return i }
}
fmt.Print(fns[0](), " ")
fmt.Print(fns[1](), " ")
fmt.Println(fns[2]())

Este programa en Go crea un “array” con tres funcións que capturan a variable de bucle i e despois chama a esas funcións. Unha persoa normal esperaría que o programa escribira “0 1 2” porque eses eran os valores de i cando se creou cada función, pero na realidade escribe “3 3 3” porque as tres funcións capturan a mesma variable i, que no momento da chamada contén o valor “3”.

A versión 1.22 de Go vai cambiar isto para que funcione como espera a xente cabal e o programa escriba “0 1 2”. Como esa versión aínda non saíu publicada, arranxei o problema facendo unha copia da variable en cada iteración.


O outro problema é o erro de codificación no segundo email que enviei. Semella que o meu provedor de servizo de email ten algún problema coa codificación dos caracteres, que se manifesta cando alguén fai unha copia dunha campaña. Ese non foi o único problema que apareceu ao facer a copia: a versión en HTML do email tamén estaba mal formatada.

Hei falar con eles para lles avisar do problema, que seguro que non son eu o único ao que lle ocorreu isto.

Varios xa me dixestes que teño que escribir unha Folla sobre codificación de caracteres. Queda apuntado 😁.


Como podo evitar este problema no futuro?

O primeiro que podo facer é tratar de non ter semanas sen Folla, que levo uns poucos meses de intermitencia.

Cando comecei a Folla tiña 7 números xa preparados para saír, pero consumín esa reserva hai moito tempo e nestes días ando semana a semana. Hei tratar de preparar unhas poucas Follas para andar con tres ou catro semanas de anticipación e despois hei procurar non consumir esa “reserva” de Follas.

Tamén teño que andar con moito coidado cando faga cambios no programa, especialmente no código adicado a enviar emails. E teño que engadir tests unitarios, que case non hai. Moitos dos cambios que fixen están pensados para iso, pero se non engado os tests non serven para nada.

A outra cousa que debo facer é, cando fedelle no servizo de email, non enviar directamente senón deixar un tempo para examinar o que vai saír, que despois fico mal e teño que enviar unha Folla especial nun xoves.