Sempre defina a forma de abertura de arquivos

Linguagens script tornam tudo muito facil. Codificar uma informação para base64, por exemplo, pode ser feito assim:

   require 'base64'
   data = "Now is the time for all good coders\nto learn Ruby"
   Base64.b64encode(data)

Entretanto se vc quer processar o conteudo de um arquivo, vale um cuidado extra: definir a forma de abertura dos arquivos.

Por exemplo, eu posso fazer isso

   require 'base64'
   data = File.open('imagem.jpg').read
   Base64.b64encode(data)

Se eu estou desenvolvendo no linux, para mim o resultado é coerente. Eu ficaria feliz (sem sacanagem) se fosse o caso de desenvolver um software que rodasse exclusivamente nesse sistema operacional. As vezes não é bem assim…

Ruby é um bom exemplo de uma linguagem que permite desenvolver software multi-plataforma, entretanto é muito facil atrapalhar o interpretador (afinal, quem nunca teve problema com uma referência a um arquivo “C:\xxx”?). No exemplo real que eu passei, bastaria informar o modo ‘rb’ (r de read, b de binary) para o comando open que eu teria o mesmo comportamento em todas as plataformas.

   require 'base64'
   data = File.open('imagem.jpg','rb').read
   Base64.b64encode(data)

É claro que este tipo de comportamento pode ser verificado através de uma suite de testes em todas as plataformas-alvo, entretanto vale de alerta para estudarmos um pouco as caracteristicas das apis e bibliotecas nas diferentes plataformas (não adianta, desenvolver software signfica estudar constantemente).

Para terminar, vejamos esta thread:

Summary: open should default to binary mode on windows

Initial Comment:
On windows the open() function defaults to reading
files in text mode. To get a binary mode file I need
to append a “b” to the mode string. I think this is an
unnessary platform inconsistency. Twice now I’ve had
hard to track down bugs because I was reading a file in
text mode and should have been using binary. This is a
wart, IMO.

Ou seja, muita gente, em diferentes linguagens, vai enfrentar o mesmo problema de achar que o open, pode padrão, vai abrir o arquivo em modo binario. A origem disso é antiga e não vai desaparecer de uma hora para outra.

Por fim, vale lembrar que o conceito de ‘nova linha’ é diferente de acordo com o sistema operacional, no unix é \n enquanto no windows é \r\n. Também é antigo e remonta a epoca de impressoras matriciais, DOS e por ai vai. É o tipo da coisa que, pela lei de murphy, vai sacanear a gente quando menos esperamos.

Obrigado ao Rafael por ter visto este detalhe comigo tarde da noite.

Rating 4.00 out of 5
[?]

Adicionando Funcionalidades a um Sistema em Produção

Por mais de uma vez eu tive que adicionar certas funcionalidades em sistemas que ja estavam em produção. É uma tarefa arriscada pois o serviço não pode parar por algum erro que vc esta introduzindo, ainda mais se este mesmo sistema estiver funcionando sem problemas nos ultimos meses ou anos.

Aprendi um truque bem interessante que, pensando bem, é um tanto obvio: ao adicionar uma funcionalidade onde boa parte do codigo ficou inalterada, pode fazer sentido desabilitar esta nova funcionalidade na configuração. Dessa forma se a porção nova de codigo produzir algum problema é possivel – teoricamente – minimizar os problemas desabilitando temporariamente esta feature.

Nem sempre isto faz sentido, porém não se trata de esconder a sujeita para debaixo do tapete: é de se esperar uma intensa bateria de testes de regressão alem de testes sobre o codigo novo. Conseguimos ter certeza da situação ao olhar os relatorios de cobertura de código, por exemplo. Esta é mais uma tecnica para evitar problemas em algo ja estabelecido.

Imagine que, no ambiente de produção, a nova feature desenvolve um memory leak, ou a escalabilidade dela não é a esperada? Desabilitar na configuração é menos traumatico do que um rollback na aplicação, mas ainda assim é traumatico. Agora, se vc desabilita e o problema continua isso ja dá pistas de que existe um problema em outro lugar – por exemplo na propria porção de código legado.

E vc, como adiciona funcionalidade a um sistema em produção?

Rating 3.33 out of 5
[?]

Ah, essa tal de autenticação

Estou dando manutenção no site de uma pequena empresa. Anteriormente a atualização era feita enviando um email para o “webmaster” responsável que editava os htmls e fazia o upload dos arquivos. Trabalho duro, cobrado por hora inclusive. O estranho é que, numa época em que os programas de cms (Content Management System) são tão bons e gratuitos, algumas pessoas insistem em trabalhar como há 10 anos, onde ter um host no geocities era o máximo (invariavelmente cheio de gifs animados, letras amarelas sobre fundo azul e muitos, mas muitos frames).

Durante a migração para o wordpress descobri uma particularidade: uma parte das novidades do site estavam vindo de outro servidor via iframe. Havia um pequeno cms para noticias, escrito em ASP, em que cada noticia podia ser acessada dessa forma:

http://outrositeexterno.com/xxx/client666/mostraNoticia.aspx?id=9

Como fui testador de software por mais de 4 anos, resolvi brincar um pouco com essa url. Pensei em que mensagens de erro poderiam ser exibidas caso uma noticia de id inexistente fosse requisitada. Coloque lá id=999999999 e mandei bala. Era pior do que eu pensava.

Uma interface tosquissima apareceu, mostrando uma listagem de todas as noticias e botões de new, delete, edit estavam presentes. Tive um mal pressentimento. Não é que eu tinha acesso a um CRUD de noticias sem precisar de autenticação? Pois é… e a culpa não é da tecnologia: com certeza é possivel desenvolver sites seguros até com shell-script, basta ter os profissionais adequados (desses que sabem procurar no google).
.

Rating 3.00 out of 5
[?]