Livro recomendado: “Algoritmos em linguagem C”

December 14th, 2008

Faz um tempo eu publiquei uma lista de 10 livros que eu achava fundamental para a formação de um bom programador. Na época, ainda não existia o livro “Algoritmos em linguagem C” do brilhante professor Paulo Feofiloff, então eu gostaria de adicionar mais este livro a minha seleta lista de livros recomendados.

Recomendo este livro tanto para os mais novatos quanto para programadores já experientes. É um livro de leitura agradável e objetiva. Mais do que simplesmente aprender sobre algoritmos, o professor PF dá muita enfase em como escrever bons códigos, bem documentados, e demonstra como provar que um algoritmo está correto por meio de invariantes. Independente de se estar interessado em aprender C ou não, o livro é recomendadissimo, já que é muito simples e trivial fazer um algoritmo em C virar código Java por exemplo.

Bom, tá aí a dica. E quem se interessa por algoritmos, não pode deixar de visitar a página do professor PF, onde há muito material bom sobre: estrutura de dados, teoria dos grafos, otimização combinatória, analise de algoritmos etc etc etc :-)

Palestra sobre “Balanceamento de Cargas em Linux”

November 13th, 2008

Ontem eu assisti a palestra da Fernanda G. Weiden(Google-Suiça) sobre “Balanceamento de Cargas em Linux” no IME-USP.
Meus conhecimentos em rede são bem básicos, praticamente se resumem ao que eu vi na graduação, mas
mesmo assim fui assistir a palestra, confesso que mais pelo nome Google que sempre chama a atenção.
A grande parte do tempo eu viajei no que ela tava falando, apenas em um momento que ela falou de algoritmos pra balanceamento de carga eu me animei pensando “Opa! Agora é minha praia”, mas ela só falou como cada um funcionava e voltou a falar grego! hehehe Mas mesmo não entendendo muito, eu gostei muito da palestra pelo belo exemplo. Pelo que pude entender, na grande parte dos sistemas do Google, eles usam uma solução proprietária que custa uma fortuna pra fazer esse trabalho de balanceamento de carga. O que a Fernanda tem feito na equipe dela é abandonar a solução proprietária e partir para soluções open-source. E o mais legal ainda é que quando eles esbarram no problema de “Não tem nada parecido para Linux”, eles desenvolvem e depois compartilham com a comunidade, chegando até mesmo a fazer commits para o kernel do Linux. É por isso que o Google é uma empresa diferenciada. Quantas empresas no mundo fariam isso?
É ou não é um belo exemplo que deveria ser mais praticado por outras empresas?

Usar -Dmaven.test.skip=true é pecado!

October 30th, 2008

Certa vez estava numa palestra do Vinicius da Globalcode, e ele disse brincando a seguinte frase: “O JMetter é muito louco! Não sei como alguém faz um negócio tão bom como esse e
distribui gratuitamente.”. Eu diria o mesmo a respeito do Maven. O Maven é uma ferramente fantastica e indispensável para todo projeto Java.

Entre as muitas features do Maven que eu gosto, uma das minhas preferidas é que sempre que você precisa compilar o projeto para gerar os seus ears, jars, sars etc, ele executa automaticamente
todos os testes unitários do projeto, e se algum teste não passar ele não compila o projeto. Acho esse recurso formidável para manter a qualidade do projeto.

Porém, infelizmente existe o parâmetro -Dmaven.test.skip=true, que se você passa ele, os testes não são executados. Agora imagine a seguinte situação: “O sprint está aos 45 do segundo tempo, você
precisa gerar o ear do projeto pra fechar o sprint e mostrar pro Product Owner, dai você manda o Maven compilar o projeto e os testes unitários não passam” O que fazer nesta situação? Taca o “Skip Test”
lá e vamos embora certo?

Ao menos na minha opinião, ERRADISSIMO. Neste caso, é sprint NOT DONE e acabou. O código não está apto para ir para produção, afinal, dizem os mais críticos que código não testado é lixo. Eu não tenho
uma opinião tão rígida, mas concordo que é muito arriscado colocar um código em produção sem testa-lo, ainda mais se você escreveu testes pra esse código, e os testes não estão passando.

Usar -Dmaven.test.skip=true é tentador. Eu mesmo já usei várias vezes, sempre com o pensamento que “Ah, o código tá certo, precisa só arrumar os testes mas depois quando tiver tempo eu faço isso”. Hoje,
com mais maturidade eu vejo que isso é um erro feio, e eu aboli completamente este parâmetro da minha vida. Finjo que ele não existe, e tenho até vontade de recompilar o Maven para arrancar ele de vez, para
não correr riscos de ter recaidas. Hehehe

Fica aqui então o recado deste post, se você não conhecia esse parâmetro macabro, continue sem conhecer, se você conhecia mas não usa, excelente, se você conhecia e ainda usa, esta na hora de mudar
a sua mente, deixar de apelar, e começar a testar o código direito. :-)

Um abraço e até a próxima.

New Mac User

September 10th, 2008

Pois eh, sou mais um que estah deixando o mundo dos pcs e partindo pro mundo dos macs. Depois de muito pensar achei que era hora de uma nova maquina, e depois de muito pensar mais ainda, decidi que essa maquina seria um MacBook. Fazia um bom tempo que eu estava querendo comprar um Mac, mas o preco aqui no Brasil sempre me desencorajava, soh que a partir de uns tempos pra cah, o preco dos Mac tem caido, e dai, acabou a desculpa.

Por enquanto estou bastante satisfeito e ainda nao tive nenhuma razao para sentir saudades do PC com Windows e Linux.

A compra do meu Mac foi um pouco conturbada. Eu comprei ele no Submarino, meu Mac chegou na quinta-feira de manha, e na quinta a noite quando eu comecei a brincar com ele, percebi que ele tinha vindo com um dead-pixel. Na sexta-feira abri um chamado no Submarino solicitando a troca, e eles me enviaram um e-mail autorinizando o envio do produto de volta via sedex. Fiz isso na sexta-feira mesmo. O prazo que eles tinham me dado eram de 7 dias uteis pra eles constatarem o defeito e me enviarem outro. Mas pra minha feliz surpresa, hoje, terca-feira, apenas 1 dia util depois eles jah me enviaram um MacBook novinho em folha. Excelente servico! Por isso que eu sempre compro coisas no Submarino e continuarei comprando!

Bom, contarei as minhas experiencias como novo usuario Mac por aqui! Quem jah tiver Mac e quiser me dar algumas dicas que achar legal, sintam-se a vontade!

Mensagens JMS agendadas Just-In-Time

August 25th, 2008

Uma feature muito legal de mensagens JMS é a possibilidade de poder agendar quando uma mensagem deverá ser recebida pelo MDB. Eu não sei se isso faz parte da especificação, ou se apenas o JBoss possui isso. O exemplo que eu vou demonstrar funciona apenas para o JBoss.

Primeiro vamos a um cenário onde este agendamento é útil.

Vamos supor que a seguinte regra é solicitada: Ao tentarmos cobrar o cartão do cliente, se a operadora retornar transação negada, o sistema deve re-tentar cobrar este cartão por mais 2 dias, sendo que cada tentativa deve ser feita após 24hs.

É possível resolver este requisito usando banco de dados e as famosas flags, mas essa definitivamente não é uma solução elegante. Imagina que você precisaria ficar fazendo pooling no banco para ver quais cobranças já passaram de 24 horas para processa-las novamente. Ou seja, horrível.

Com JMS dá pra fazer algo muito melhor. Se quando a compra é feita, retornar negado, basta enviar uma mensagem JMS pra fila, agendando essa mensagem para ser processada apenas após 24 horas. Quando der essas 24hhs, o MDB lê a mensagem e chama novamente o módulo de cobrança.

Muito simples e elegante. Sem pooling, sem ficar controlando status manualmente, nem nada desse tipo.

O código para fazer isso é extremamente simples:

[sourcecode language='java']
ObjectMessage message = session.createObjectMessage();

message.setLongProperty("JMS_JBOSS_SCHEDULED_DELIVERY", (new Date().getTime() + (1000 * 60 * 60 * 24)));[/sourcecode]

Pronto, você acabou de agendar a entrega da sua mensagem para daqui a 24 horas. Essa conta maluca aí é porque a data precisa ser passada em milisegundos. :-)

Eu sou um grande fã de JMS, e essa é mais uma das caracteristicas que me fazem gostar dessa tecnologia.

[]'s

Matemática: A melhor amiga de um programador

August 15th, 2008

Neste post quero mostrar como um bom conhecimento matemático pode facilitar e muito a vida de um programador. Para isso, vou usar 3 exemplos. Vamos e eles….

O primeiro exemplo foi uma situação que passei com um ex-colega de trabalho. Ele tinha que resolver para a faculdade o problema das “Torres de Hanói”, creio que conhecido de todos que frequentam esse blog. O professor queria que fosse desenvolvido um algoritmo para dado uma quantidade de discos, todos inicialmente no pino 1, retornasse quantos movimentos seriam necessários para mover todos os discos para algum outro pino. Meu amigo me pediu para ajudar ele com esse problema. Ele tava fazendo um algoritmo, mas não estava conseguindo….porém, a solução deste problema é totalmente matemática. A formula pow(2, n) – 1 retorna exatamente o resultado esperado. Simples assim.

Outro problema é por exemplo, você quer somar todos os números de 0 a N. Como resolver isso? Simples não? Faz um for até N e vai somando numa variavel. Gauss diria que voce pode resolver isso da seguinte forma:

Soma = N * (N+1) / 2

Quem não gosta de matemática, provavelmente não liga para analise de algoritmos, então acha que dá na mesma. Mas tenta fazer isso com N igual a 1000000 com o for e compara com a solução da expressão.

Um blog que eu gosto muito e sempre acompanho é o DQSoft do Daniel Quadros (http://dqsoft.blogspot.com). O Daniel fez um post falando de um problema recente que ele teve que resolver no “Google Code Jam”. (http://dqsoft.blogspot.com/2008/08/google-code-jam-2008-triangle-areas.html)Reparem como a solução é trivial, dependendo apenas de sacadas matemáticas.

Viram só? Os exemplos não estão relacionados a coisas que usamos no nosso dia-a-dia, mas eu creio que o mais importante disso tudo é a capacidade lógica que a matemática proporciona.

[]‘s

PS: A prova do problema das Torres de Hanói pode ser encontrada no livro “Matematica Concreta”

PS1: A questão da soma foi descoberta por Gauss, que em uma aula do ensino fundamental, recebeu como castigo somar até 100, e rapidamente falou 5050, surpreendendo a todos.

Contendo falhas de forma elegante com auxílio de JMS

July 2nd, 2008

JMS é uma API do Java para lidar com troca de mensagens em aplicações. Devido a popularização da integração de sistemas por meio de mensagens, seu uso tem aumentado muito nos últimos tempos, principalmente pelo fato de ser extremamente simples integrar dois sistemas usando JMS. Porém, neste post, pretendo falar de uma outra utilidade muito interessante de JMS, a qual adotamos no último projeto que participei e que deu um resultado muito positivo para o sistema aumentando significativamente a sua robustez.

Tinhamos o seguinte cenário:

“É tentado cobrar um determinado valor do cartão de crédito do cliente, caso a operadora retorne OK, ou seja, a compra foi executada com sucesso, deve ser chamada uma API aqui da empresa que autoriza o cliente a usar o nosso sistema”

Agora pense na seguinte situação: O cliente é cobrado, debita o valor do seu cartão de crédito, mas quando
a API de autorização é chamada, acontece um erro e o cliente não é liberado para usar o sistema. O que fazer neste caso? Rollback da transação??? ahmmmm…não existe rollback na operadora de cartão de crédito! :-( Mas mesmo se tivesse, ao meu ver essa não seria a solução ideal, afinal de contas, você perderia uma “venda”.

É aí que entra JMS e o título do post: “Contendo falhas de forma elegante”.

Nós adotamos a seguinte solução para este caso: Quando a operadora cobra o cliente, não há mais como voltar atrás, então, até esse ponto é fluxo é sincrono e, a autorização se tornou um fluxo assincrono. Com isso, foi criada uma  fila JMS e o cliente é colocado nesta fila para ser autorizado. A grande vantagem disso é que, em caso de um problema, a API do JMS possui uma propriedade configurável que faz com que ele retente processar de tempos em tempos. Com isso, caso o sistema não consiga autorizar o cliente na primeira vez, ele vai tentar novamente após 30 minutos, até 10 tentativas. Tempo suficiente para, se for um problema de banco por exemplo, o problema ser corrigido.

Mas não acaba aí, no JMS existe um conceito chamado “fila morta”. Caso após as 10 tentativas, o sistema não consiga processar aquela tarefa, ela será enviada para está fila. No nosso sistema, foi criada uma monitoração nesta fila. Caso algum registro caia na famigerada “fila morta”, o sistema irá alarmar e uma equipe responsável entrará em ação para solucionar o problema e após isso, reprocessar o registro.

Com isso, é possível uma ação totalmente pró-ativa, evitando assim chamadas na “Central de Atendimento” de clientes que pagaram e não receberam autorização para acessar o sistema.

Na nossa experiência aqui na empresa, JMS tem se mostrado uma excelente solução, tanto pela sua facilidade de uso com o auxílio de um servidor de aplicação, como o Jboss por exemplo, como também pela elegância e robustez que ele prove no seu uso.

Recomendo a todos os programadores Java a se aprofundarem neste assunto!

Um abraço!

Cuidados com o uso de enum no Java

June 26th, 2008

É preciso tomar cuidado quando você está usando uma enum como retorno de um Session Bean. Tanto o servidor quanto o cliente precisam estar sempre com a mesma versão da enum. Caso você altere a enum do lado do servidor, mas não mudar a versão que está no cliente, se por um acaso a constante que você adicionou no enum for a retornada pelo Session Bean, subirá uma exceção no cliente. Não existe nada parecido com o conceito de serialVersionUid com o uso de enums.

Por um lado, essa característica é boa, pois força o seu cliente a sempre estar com a mesma versão da que está rodando no servidor. Mas, por outro lado, as vezes você quer adicionar uma constante ao seu enum, que em nada interfirá na maioria dos sistemas que estão usando o seu. Por exemplo:

-Um determinado sistema trata retornos com status PAGO e NÂO_PAGO.

Você quer adicionar um novo status de ANALISE na sua enum. Em tese, esse status não interessa para o sistema descrito acima, então, caso ele receba esse status ele poderia simplesmente ignora-lo. Mas com enum isso não é possível. Ou seja, se você tem 50 sistemas usuários do seu, e quer adicionar um novo status que só interessa para um deles, você é obrigado a forçar os 50 sistemas a atualizarem a versão “client” que receberam do seu.

Gambiarra para fazer o Wii Fit funcionar

June 25th, 2008

O assunto não tem absolutamente nada a ver com programação, mas como sofri muito para fazer o Wii Fit funcionar no Wii, acho que vale o post para evitar o sofrimento do próximo.

Tenho um Wii(USA) com Wiikey. Recentemente adquiri o Wii Fit original(USA). Quando vou tentar rodar o Wii Fit o DVD começa a rodar…rodar…rodar no drive e não para mais e trava. Se eu clico em Settings do Wii, trava também. Ou seja, não consigo rodar o Wii Fit de jeito nenhum.

Depois de fuçar muito, descobri uma forma de fazer o Wii Fit funcionar. O processo é o seguinte:

1) Sem o CD do Wii Fit no drive, ligue o console.

2) Entre em Setting e seleciona a opção de formatar o seu Wii Memory. Pois é, infelizmente você precisa perder todos os seus Miis e as suas configurações nos outros jogos para fazer o Wii Fit funcionar.

3) Feito isso, desligue o console e insira o CD do Wii Fit.

4) Você será obrigado a configurar tudo novamente(Data, horário, posição do sensor, idioma).

5) Após configurar tudo, a tela inicial do Wii irá aparecer e finalmente a opção Wii Fit aparecerá. Dai é só abrir e sair jogando.

Infelizmente, quando você desligar o console, quando religa-lo terá que fazer tudo novamente.
Bom, mas pelo menos, para quem tah ansioso para jogar, como eu estava, é uma forma.  :-)

Li em foruns pessoas recomendando atualizar o Wiikey, mas nenhuma evidência que após isso irá fazer o Wii Fit funcionar. Vou tentar atualizar o meu Wiikey em breve, e se funcionar eu posto aqui falando.

JBoss: Qual tipo de datasoruce eu uso?

June 23rd, 2008

Vi pelas estatisticas do blog que bastante gente cai aqui pesquisando sobre como configurar o Datasource
no Jboss, por isso resolvi fazer esse post.

O primeiro ponto é que o site da Jboss tem uma documentação muito boa ensinando fazer essa configuração.
Segue o link: http://wiki.jboss.org/wiki/ConfigDataSources

Porém, uma dúvida que o pessoal costuma ter é quando usar <local-tx-datasource> e quando usar <xa-datasource>.

Bom, a principal diferença entre os dois é que o <xa-datasource> suporta transações distribuidas, ou seja, vamos supor que você tem um método que realiza mudanças em duas tabelas. Até ai tudo bem. Porém, estas tabelas estão
em banco de dados diferentes. É nessa situação que você precisa de um <xa-datasource>. Se der algum problema e você
precisar fazer rollback, você precisa fazer rollback nas duas bases de dados. Um XADataSource fornece essa
caracteristica ao seu sistema. Ele gerencia a sua transação que passa por vários bancos de dados.

Se sua aplicação lida apenas com um banco de dados em uma máquina, o que você precisa é simplesmente de um <local-tx-datasource>.

Então é isso.

[]‘s