Não sei o quanto é conhecido, mas o site http://www.comics.com disponibiliza diariamente algumas dúzias de tirinhas, várias delas bem conhecidas (a começar pelo Dilbert). Além da tira diária, estão acessíveis as tiras dos últimos 30 dias. Estão incluídas as tiras dominicais, normalmente coloridas e maiores. Serviços adicionais estão disponíveis por taxas anuais razoáveis.
Para quem souber inglês e estiver cansado do desrespeito dos jornais com os quadrinhos (poucos, alguns de qualidade lamentável e frequentemente repetidos ou fora de ordem), é uma boa pedida. É também uma forma de começar o dia dando umas boas risadas.
Como sugestão, seguem abaixo alguns dos quadrinhos disponíveis:
Detalhes sobre estas tirinhas podem ser facilmente encontrados na Wikipedia.
quinta-feira, outubro 18, 2007
Quadrinhos de graça
segunda-feira, outubro 15, 2007
Excel 2007: Explicação para o bug
Embora a Microsoft não pretenda dar mais detalhes sobre o bug, uma explicação extremamente detalhada pode ser encontrada em
http://www.lomont.org/Math/Papers/2007/Excel2007/Excel2007Bug.pdf
Chris Lomont se deu ao trabalho de debugar o Excel, achar a rotina com problema, comparar com a mesma rotina nas versões anteriores e explicar o que aconteceu.
De forma resumida, por motivos de desempenho o Excel possui uma rotina de conversão de ponto flutuante para texto escrita em Assembler. Esta rotina estava escrita no velho assembler de 16 bits e no Excel 2007 foi convertida para usar as instruções e registradores de 32 bits. Neste ponto foram introduzidos dois erros. No caso do cálculo 850 * 77,1 em um determinado momento a rotina anterior possuiu o valor 0xFFFF no registrador AX, o incrementava, resultando em zero, o que causava um desvio. Nos 32 bits, o valor 0x0000FFFF em EAX vira 0x00010000 que não é zero e portanto a execução segue pelo caminho errado. O outro erro é algo parecido mas em outro trecho do código.
Esta análise parece vir de encontro com o que eu tinha chutado no meu post original (será um exemplo de psychic debugging?) : um ponto onde o algorítimo precisa selecionar entre dois caminhos E ocorre um overflow (no meu post eu coloquei ou...). Portanto meu veredito é que ocorreu falha no teste unitário da rotina, que não exercitou corretamente este ponto de decisão.
http://www.lomont.org/Math/Papers/2007/Excel2007/Excel2007Bug.pdf
Chris Lomont se deu ao trabalho de debugar o Excel, achar a rotina com problema, comparar com a mesma rotina nas versões anteriores e explicar o que aconteceu.
De forma resumida, por motivos de desempenho o Excel possui uma rotina de conversão de ponto flutuante para texto escrita em Assembler. Esta rotina estava escrita no velho assembler de 16 bits e no Excel 2007 foi convertida para usar as instruções e registradores de 32 bits. Neste ponto foram introduzidos dois erros. No caso do cálculo 850 * 77,1 em um determinado momento a rotina anterior possuiu o valor 0xFFFF no registrador AX, o incrementava, resultando em zero, o que causava um desvio. Nos 32 bits, o valor 0x0000FFFF em EAX vira 0x00010000 que não é zero e portanto a execução segue pelo caminho errado. O outro erro é algo parecido mas em outro trecho do código.
Esta análise parece vir de encontro com o que eu tinha chutado no meu post original (será um exemplo de psychic debugging?) : um ponto onde o algorítimo precisa selecionar entre dois caminhos E ocorre um overflow (no meu post eu coloquei ou...). Portanto meu veredito é que ocorreu falha no teste unitário da rotina, que não exercitou corretamente este ponto de decisão.
Desenvolvendo Softwares Agradáveis de Manter
Já mencionei antes os sinais de um programa ruim e o site WTF que contém exemplos de como não fazer um software. Neste post vou tentar algo mais construtivo: sugestões de como escrever softwares que sejam mais agradáveis de manter.
A Raiz do Problema
Para dar manutenção em um programa é preciso entendê-lo. Portanto um programa será mais fácil de dar manutenção na medida em que ele for mais facilmente compreensível. Esta é a principal motivação das evoluções nas metodologias e ferramentas de desenvolvimento. Existe uma limitação do tamanho do contexto que conseguimos manipular, quando o programa ultrapassa este limite nós paramos de entender como o programa funciona e começamos a introduzir bugs.
No início era a linguagem de máquina e o Assembly. Uma operação simples exigia múltiplos comandos e rapidamente o limite era atingido. As linguagens de alto nível permitem colocar mais lógica em menos linhas de código, propiciando (mas não garantindo) uma maior legibilidade. Na chamada programação "espagete", o código era composto de trechos longos com a execução pulando de um ponto para outro por gotos. A programação estruturada procurou colocar ordem na casa, pregando a divisão em subrotinas e o uso de construções de controle padronizadas que sempre são entradas por cima e saídas por baixo (if-the-else, while, switch, etc).
As estruturas de dados tinham problemas semelhantes. Váriaveis globais eram acessadas por pontos dispersos do fonte. A programação estruturada introduziu os módulos e as variáveis locais. A programação orientada a objetos agrupou rotinas e estruturas de dados em classes, favorecendo a criação de interfaces claras e acessos controlados.
Consistência
Fica mais fácil aprender e lembrar as coisas que são iguais ou bem parecidas. Durante o desenvolvimento isto pode parecer cansativo e existe sempre a tentação de ser "criativo". Para ser um bom desenvolvedor é preciso saber onde ser criativo e onde ser consistente.
Dando Nomes
A consistência deve começar nos nomes de variáveis, rotinas, classes e módulos. Por pior que seja uma convenção para os nomes, ele será melhor que nenhuma.
É claro que os nomes devem indicar de forma precisa o que é armazenado na variável, efetuado pela rotina, etc:
Os comentários podem ajudar em muito na compreensão de programas. Por outro lado eles podem também atrapalhar. Bons comentários são os que destacam as coisas não óbvias ou resumem o que um trecho mais complicado faz. Comentários ruins são os mentirosos (lembranças de cut-and-paste apressados ou não atualizados após mudanças) e os inúteis (que só ocupam espaço e reduzem a atenção).
Os comentários devem se preocupar mais nos porquês do que nos o que. Consideremos o exemplo clássico:
n = n + 1;
Alguns comentários úteis são
// temos mais um item na tabela
// a rotina OrdenaItens espera o número de itens, não o índice do último
Um comentário inútil é
// soma um a n
Um comentário ruim é
// diminui de um a quantidade de itens
Em alguns casos deve-se comentar também o que não é feito. Por exemplo, podemos ter os seguintes comentários ao invés de n = n + 1;
// n não é incrementado, pois vamos remover o item adiante
// n será incrementado pela rotina InsereItem
A padronização de comentários para variáveis e rotinas é também útil, principalmente para ajudar a lembrar o que deve ser documentado nos comentários.
Simplificando o Código
Durante a fase de depuração é comum mais código ir sendo acrescentado para cobrir casos que não tinham sido previstos inicialmente. Muitas vezes a codificação é encerrada quando o programa funciona. É importante revisar o código e ver se não é possível simplificá-lo (e testá-lo bem após a simplificação para garantir que continua funcionando).
Um exemplo típico de simplificação é detectar trechos repetidos várias vezes e colocá-lo em uma subrotina. Além de reduzir o tamanho do código (o que simplifica o entendimento), acertos e aperfeiçoamentos futuros serão feitos em um único ponto.
No caso de trechos parecidos é freqüentemente possível criar uma rotina "genérica" onde as diferenças de comportamento são feitas condicionalmente em função dos valores dos parâmetros ou de um parâmetro específico para isto. Entretanto, é preciso tomar o cuidado de não exagerar nesta generalidade, criando uma rotina extremamente confusa, cheia de testes. Neste caso rotinas específicas, mesmo que parecidas, pode ser mais claro e fácil de manter.
Um ponto que raramente é revisado são as variáveis lógicas. Se você perceber que está usando com muita freqüência a negação da variável, talvez você tenha escolhido a condição errada. Por exemplo, suponha que você tenha definido flagPortaAberta mas quase sempre você está usando !flagPortaAberta. Neste caso é melhor você passar a usar uma variável flagPortaFechada e se livrar das negações.
Resumindo, com alguns cuidados simples você vai melhorar em muito a qualidade de vida de quem for dar manutenção no código que você está escrevendo hoje. E lembre-se que este alguém pode ser você mesmo.
A Raiz do Problema
Para dar manutenção em um programa é preciso entendê-lo. Portanto um programa será mais fácil de dar manutenção na medida em que ele for mais facilmente compreensível. Esta é a principal motivação das evoluções nas metodologias e ferramentas de desenvolvimento. Existe uma limitação do tamanho do contexto que conseguimos manipular, quando o programa ultrapassa este limite nós paramos de entender como o programa funciona e começamos a introduzir bugs.
No início era a linguagem de máquina e o Assembly. Uma operação simples exigia múltiplos comandos e rapidamente o limite era atingido. As linguagens de alto nível permitem colocar mais lógica em menos linhas de código, propiciando (mas não garantindo) uma maior legibilidade. Na chamada programação "espagete", o código era composto de trechos longos com a execução pulando de um ponto para outro por gotos. A programação estruturada procurou colocar ordem na casa, pregando a divisão em subrotinas e o uso de construções de controle padronizadas que sempre são entradas por cima e saídas por baixo (if-the-else, while, switch, etc).
As estruturas de dados tinham problemas semelhantes. Váriaveis globais eram acessadas por pontos dispersos do fonte. A programação estruturada introduziu os módulos e as variáveis locais. A programação orientada a objetos agrupou rotinas e estruturas de dados em classes, favorecendo a criação de interfaces claras e acessos controlados.
Consistência
Fica mais fácil aprender e lembrar as coisas que são iguais ou bem parecidas. Durante o desenvolvimento isto pode parecer cansativo e existe sempre a tentação de ser "criativo". Para ser um bom desenvolvedor é preciso saber onde ser criativo e onde ser consistente.
Dando Nomes
A consistência deve começar nos nomes de variáveis, rotinas, classes e módulos. Por pior que seja uma convenção para os nomes, ele será melhor que nenhuma.
É claro que os nomes devem indicar de forma precisa o que é armazenado na variável, efetuado pela rotina, etc:
- Evite nomes muito genéricos. Uma variável nItens é bem mais clara que simplesmente n (ou pior ainda, x ou aux).
- No caso de variáveis lógicas, o nome deve indicar o que representa o valor verdadeiro. Do ruim para o melhor: flag, flagPorta, flagPortaAberta.
- Revise os nomes sempre que fizer uma alteração no código. Principalmente em rotinas é comum encontrar rotinas cujo nome foi dado devido a uma função que ela deixou de fazer.
Os comentários podem ajudar em muito na compreensão de programas. Por outro lado eles podem também atrapalhar. Bons comentários são os que destacam as coisas não óbvias ou resumem o que um trecho mais complicado faz. Comentários ruins são os mentirosos (lembranças de cut-and-paste apressados ou não atualizados após mudanças) e os inúteis (que só ocupam espaço e reduzem a atenção).
Os comentários devem se preocupar mais nos porquês do que nos o que. Consideremos o exemplo clássico:
n = n + 1;
Alguns comentários úteis são
// temos mais um item na tabela
// a rotina OrdenaItens espera o número de itens, não o índice do último
Um comentário inútil é
// soma um a n
Um comentário ruim é
// diminui de um a quantidade de itens
Em alguns casos deve-se comentar também o que não é feito. Por exemplo, podemos ter os seguintes comentários ao invés de n = n + 1;
// n não é incrementado, pois vamos remover o item adiante
// n será incrementado pela rotina InsereItem
A padronização de comentários para variáveis e rotinas é também útil, principalmente para ajudar a lembrar o que deve ser documentado nos comentários.
Simplificando o Código
Durante a fase de depuração é comum mais código ir sendo acrescentado para cobrir casos que não tinham sido previstos inicialmente. Muitas vezes a codificação é encerrada quando o programa funciona. É importante revisar o código e ver se não é possível simplificá-lo (e testá-lo bem após a simplificação para garantir que continua funcionando).
Um exemplo típico de simplificação é detectar trechos repetidos várias vezes e colocá-lo em uma subrotina. Além de reduzir o tamanho do código (o que simplifica o entendimento), acertos e aperfeiçoamentos futuros serão feitos em um único ponto.
No caso de trechos parecidos é freqüentemente possível criar uma rotina "genérica" onde as diferenças de comportamento são feitas condicionalmente em função dos valores dos parâmetros ou de um parâmetro específico para isto. Entretanto, é preciso tomar o cuidado de não exagerar nesta generalidade, criando uma rotina extremamente confusa, cheia de testes. Neste caso rotinas específicas, mesmo que parecidas, pode ser mais claro e fácil de manter.
Um ponto que raramente é revisado são as variáveis lógicas. Se você perceber que está usando com muita freqüência a negação da variável, talvez você tenha escolhido a condição errada. Por exemplo, suponha que você tenha definido flagPortaAberta mas quase sempre você está usando !flagPortaAberta. Neste caso é melhor você passar a usar uma variável flagPortaFechada e se livrar das negações.
Resumindo, com alguns cuidados simples você vai melhorar em muito a qualidade de vida de quem for dar manutenção no código que você está escrevendo hoje. E lembre-se que este alguém pode ser você mesmo.
quarta-feira, outubro 10, 2007
Correção para o Excel 2007
Saiu a correção para o problema no Excel 2007 que eu comentei recentemente.
Relembrando, quando o resultado de uma cálculo fica muito próximo de 65535 ou 65536, o Excel apresenta na tela 100000 ou 100001. O problema ocorre na conversão para texto do valor em ponto flutuante, não no cálculo propriamente dito. Desta forma o valor pode ser usado sem problemas em outros cálculos (desde que o resultado final não seja outro valor na faixa problemática). O problema foi introduzido no Excel 2007 e não ocorre nas versões anteriores.
Infelizmente não foram divulgados mais detalhes, existe muita curiosidade em saber porque esta rotina (que é padrão na biblioteca da maioria das linguagens) foi alterada (ou criada) no Excel 2007 e que tipo de erro de programação causou este problema bizarro.
O anúncio da correção e os links para download estão em
http://blogs.msdn.com/excel/archive/2007/10/09/calculation-issue-update-fix-available.aspx
Relembrando, quando o resultado de uma cálculo fica muito próximo de 65535 ou 65536, o Excel apresenta na tela 100000 ou 100001. O problema ocorre na conversão para texto do valor em ponto flutuante, não no cálculo propriamente dito. Desta forma o valor pode ser usado sem problemas em outros cálculos (desde que o resultado final não seja outro valor na faixa problemática). O problema foi introduzido no Excel 2007 e não ocorre nas versões anteriores.
Infelizmente não foram divulgados mais detalhes, existe muita curiosidade em saber porque esta rotina (que é padrão na biblioteca da maioria das linguagens) foi alterada (ou criada) no Excel 2007 e que tipo de erro de programação causou este problema bizarro.
O anúncio da correção e os links para download estão em
http://blogs.msdn.com/excel/archive/2007/10/09/calculation-issue-update-fix-available.aspx
terça-feira, outubro 09, 2007
Avaliação do Visteon VSB-7705
O Visteon VSB-7705 é um tocador MP3 para carro, que permite a reprodução de CDs, cartões SD-MMC e dispositivos USB. |
Aviso
Estou muito longe de ser um aficionado por "som automotivo". Para mim automóvel é um dos piores ambientes para querer se apreciar música, com grandes limitações acústicas, ruído externo constante e a necessidade de prestar atenção na direção e não na música. Confesso ainda que só fui colocar o "som" no carro um anos após a compra.
Um Breve Histórico
No meu carro anterior eu usava um toca-fitas (!). O ponto positivo do meu aparelho antigo é ter uma entrada auxiliar na frente, o que me permitia ligar um reprodutor de CD portátil, com suporte para MP3. Era esta configuração que usava, o MP3 praticamente eliminava a necessidade de trocar de CD durante uma viajem e as falhas de reprodução devido aos onipresentes buracos das ruas e estradas brasileiras.
Infelizmente o aparelho pifou e portanto eu precisava comprar outro para o carro novo.
O Atrativo do VSB-7705
O que me atraiu para o VSB-7705 foi o suporte a cartão SD, uma vez que já uso este tipo de cartão na máquina fotográfica e já tenho um leitor conectado ao meu micro. O formato SD coloca em um pequeno espaço capacidades bem razoáveis por preços idem.
No VSB-7705 o cartão SD fica completamente embutido durante o uso, não ficando nenhuma saliência para fora que possa levar um tranco acidental danificando o cartão e/ou o aparelho. Além disso, o cartão cabe facilmente no estojo da frente destacável.
A Instalação
O meu carro é um Citroen C3 e a instalação foi moleza. Os conectores do carro e do aparelho eram totalmente compatíveis, dispensando gambiarras. Um ponto a mais para o VSB-7705 e que ele já vem com um adaptador para antena e com conectores com fios para facilitar a intalação em veículos com conectores diferentes (ou sem conectores).
Outro ponto de destaque é que o manual apresenta indicações claras e completas dos sinais presentes nos conectores.
O VSB-7705 não foi o primeiro aparelho com SD que eu encontrei, mas li vários comentários de usuários da outra marca reclamando de chiados. No meu caso a qualidade de som me pareceu excelente. O único "defeito" é uma ligeira pausa (1 segundo ou menos) entre uma música e outra (em MP3), o que pode atrapalhar fãs do rock progressivo onde é comum uma faixa continuar direto na seguinte.
Os Recursos
O VSB-7705 tem uma grande quantidade de recursos, mas devo admitir que usei poucos deles até agora.
Como é mais ou menos padrão, a frente é destacável e basculhante. O encaixe não me inspira muita confiança, mas até agora não tive problemas. O display alfanumérico apresenta uma boa quantidade de informações dos arquivos MP3 e tem boa legibilidade. O display tem ainda indicação gráfica do volume. A frente tem também uma quantidade absurda de botões, cada um com um LED decorativo.
Segundo o manual, são suportados formatos MP3, WMA e OGG, os dois primeiros com várias taxas de transferência e frequência de amostragem. Não são suportados arquivo protegidos (DRM). Até agora usei somente MP3 e ele tocou tudo sem problemas.
A conexão direta de um pen-drive na entrada USB não é muito prática, pois o pen-drive fica totalmente exposto para fora. Felizmente o aparelho vem com um cabo adaptador.
O aparelho suporta CD / CD-R e CD-RW, tanto com audio como com arquivos MP3, WMA e OGG.
Para SD e USB existem funções de gerenciamento de arquivo para procurar e apagar arquivo.
Um recurso curioso é a gravação em SD ou pen-drive a partir do rádio, CD ou da entrada auxiliar (que requer um cabo adicional não fornecido).
Tem, é claro rádio AM/FM. As poucas vezes que escutei rádio (FM) o som me pareceu perfeito. Por enquanto ainda nem me dei ao trabalho de colocar as estações que gosto nas memórias.
Para completar, vem um controle remoto IR, o que me parece um acessório meio inútil.
Concluindo
Estou totalmente satisfeito com o VSB-7705. O cartão SD me parece ser a midia perfeita para quem quer ter um som solid-state no carro. O aparelho tem um preço razoável e pode ser encontrado em 12 vezes no cartão nas "boas casas do ramo".
Atualização 28/02/10
Parece que a minha sorte acabou, o display começou a piscar.
Atualização 30/11/10
Acho que agora ele se foi. Há cerca de um mês começou a falhar um dos canais, achei que era mau contato mas estou desconfiando do aparelho. Semana passada o painel parou de funcionar, ao colocar ligava sozinho com o último ajuste. Um reset fez somente perder o último ajuste. Colocando um SD o painel funciona, porém após alguns minutos desliga e religa sozinho. Já encomendei um novo aparelho (de outra marca, é claro).
quarta-feira, outubro 03, 2007
Links diversos
Normalmente não gosto de fazer post somente com links, mas a escrita dos posts mais "sérios" está indo muito devagar e tropecei com alguns links que podem interessar aos leitores.
Assistindo vídeos do YouTube Off-Line
Existem algumas dezenas de opções para isto, no momento estou usando http://www.techcrunch.com/get-youtube-movie/ para baixar em formato FLV, que pode ser tocado pelo VideoLan.
Aulas de Violão e Guitarra
Um uso para os links acima é para baixar os vídeos de justinguitar. Um adicional é que a pronúncia british dele é muito boa, o que pode ser um apoio para quem está aprendendo inglês.
Para os fãs do Open Office
Um lembrete que nem tudo é perfeito: a longa história de um desenvolvedor que criou um add-on para o Calc e o descaso da Sun, que culminou por decidir re-desenvolver o módulo internamente para ficar com os direitos (é, software livre também tem direitos autorais).
Para quem quer dar risadas
Um lista dos oito artigos mais inúteis na Wikipedia e seis perguntas que o último volume do Harry Potter tem que responder (e que de foram respondidas, embora a quinta de forma muito oblíqua). Aviso: não adequado para crianças inocentes!
E por falar em crianças inocentes..
Não é só no Brasil que algumas pessoas estão bravas com a Google a respeito da dificuldade em tirar material impróprio do Orkut.
Assistindo vídeos do YouTube Off-Line
Existem algumas dezenas de opções para isto, no momento estou usando http://www.techcrunch.com/get-youtube-movie/ para baixar em formato FLV, que pode ser tocado pelo VideoLan.
Aulas de Violão e Guitarra
Um uso para os links acima é para baixar os vídeos de justinguitar. Um adicional é que a pronúncia british dele é muito boa, o que pode ser um apoio para quem está aprendendo inglês.
Para os fãs do Open Office
Um lembrete que nem tudo é perfeito: a longa história de um desenvolvedor que criou um add-on para o Calc e o descaso da Sun, que culminou por decidir re-desenvolver o módulo internamente para ficar com os direitos (é, software livre também tem direitos autorais).
Para quem quer dar risadas
Um lista dos oito artigos mais inúteis na Wikipedia e seis perguntas que o último volume do Harry Potter tem que responder (e que de foram respondidas, embora a quinta de forma muito oblíqua). Aviso: não adequado para crianças inocentes!
E por falar em crianças inocentes..
Não é só no Brasil que algumas pessoas estão bravas com a Google a respeito da dificuldade em tirar material impróprio do Orkut.
terça-feira, outubro 02, 2007
13a Competição Anual de Ficção Interativa
Aviso aos fãs de aventuras: já estão disponíveis para download os jogos da 13a Competição Anual de Ficção Interativa. São mais de duas dúzias de jogos. Lembrar somente que são jogos curtos e em grande parte escritos por amadores.
segunda-feira, outubro 01, 2007
Ajude a divulgar a lista brasileira de equipamentos e serviços compatíveis com Linux
...e concorra a MP4 e MP3 players, mochilas Targus, períodos de VoIP grátis e até a ventiladores USB - além de contribuir automaticamente para doações para a Wikipedia e o Wordpress! O BR-Linux coletou mais de 12.000 registros de compatibilidade de equipamentos e serviços (webcams, scanners, notebooks, ...) na sua Pesquisa Nacional de Compatibilidade 2007, e agora convida a comunidade a ajudar a divulgar o resultado. Veja as regras da promoção no BR-Linux e ajude a divulgar - quanto mais divulgação, maior será a doação do BR-Linux à Wikipedia e ao Wordpress.
A idéia inicial era colocar junto deste post o resultado de um teste simples de impressão com a Samsung SCX-4200, mas não deu certo na primeira tentativa (tentei imprimir bootando um Live-CD do Ubuntu) e o prazo da promoção está acabando. Fica a promessa de investigar melhor como usar a impressora (e o scanner) da SCX-4200 e depois postar o que descobrir.
A idéia inicial era colocar junto deste post o resultado de um teste simples de impressão com a Samsung SCX-4200, mas não deu certo na primeira tentativa (tentei imprimir bootando um Live-CD do Ubuntu) e o prazo da promoção está acabando. Fica a promessa de investigar melhor como usar a impressora (e o scanner) da SCX-4200 e depois postar o que descobrir.
Assinar:
Postagens (Atom)