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.

ICQ x MSN, Google x Cuil. Será que cabe uma reflexão?

August 3rd, 2008

Hoje tive um momento saudosista e me veio uma vontade enorme de entrar no ICQ. Lembrei meu UIN e minha senha, abri o Pidgin, e me conectei ao ICQ depois de mais ou menos uns 5 anos eu acho. Infelizmente não tinha mais nenhum contato que estivesse online. :-(

Mas por alguns minutos fiquei olhando e lembrando com saudades dos tempos do ICQ. Aonde Internet Banda Larga era um luxo para poucos, a maioria, assim como eu, usava Dial. O ICQ bombava depois da 12:00, momento que era cobrado somente um pulso por ligação. Lembro que eu ficava contando
os minutos para a meia noite. Bons tempos! :-D

O ICQ dominava amplamente sua categoria, e quando o MSN apareceu, era motivo de piada. Eu imaginava que o MSN jamais concorreria com o ICQ…hã…mero engano. Ao longo do tempo, fui vendo todos meus contatos do ICQ migrando para o MSN. Olhava aquilo com incredulidade, não entendia o por quê, até hoje não entendo, mas o fato é que, hoje sou mais um desses que abandonou o ICQ e usa o MSN, pois se continuasse a usar o ICQ, não teria ninguem pra falar. :-)

Isso me fez pensar sobre o Cuil.com. Todos olham pra ele com um olhar de incredulidade, achando que ele jamais será páreo para o gigante Google. Nos foruns por aí tem alguns ridicularizando o Cuil. Pois é, asim como era com o ICQ x MSN…

Realmente não sei o que irá acontecer, o que eu sei é que será uma briga de gênios, e quem irá ganhar somos nós, utilizadores assiduos dos mecanismos de busca, mas cabe uma reflexão a esses que estão ridicularizando o Cuil, pois as coisas podem mudar quando a gente menos espera no mundo da informática.

Consegui! Mestrado no IME-USP!

July 8th, 2008

Hoje recebi com muita alegria a notícia que fui selecionado para o programa de mestrado no IME-USP. Pelo que andei falando com amigos que já passaram por essa fase, serão tempos dificeis os meus próximos anos…hehehe…mas com certeza valerão a pena.

Irei seguir a área de Teoria dos Grafos, que foi uma área pela qual eu me apaixonei participando da “Maratona de Programação”.

No GUJ tem rolado constantemente discussões sobre o valor de uma formação acadêmica. Fica aquela guerra entre os que acham que estudar por conta é suficiente contra os que acham que uma base acadêmica é fundamental para um direcionamento.

Eu não vou expor aqui os meus argumentos pois não quero alimentar discussões, mas eu particularmente curto muito a área acadêmica. Pretendo no futuro me tornar professor, preferencialmente de Teoria dos Grafos e Algoritmos em Geral. É simplesmente uma questão de gosto.

No mundo de desenvolvimento de software hoje, é plenamente possível atuar sem nem ter o segundo grau. Venhamos e convenhamos, não existe nenhuma dificuldade em aprender Struts, Hibernate etc. Hoje também, sem nenhum esforço, é possível ordenar uma lista de 1 milhão de registros com o melhor algoritmo, já que ele já vem de graça na API das principais linguagens. Porém, no mundo acadêmico você consegue ir além, e é isso que eu quero buscar.

Contarei minhas experiências no mestrado aqui neste blog!

Abraços!

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

Endereço do meu antigo blog

June 20th, 2008

Esse post é apenas para deixar uma referência aqui para o meu blog antigo, para que assim, quem entre pela primeira vez neste novo blog possa ver o que eu já escrevi.

Eu tentei migrar o conteúdo do antigo blog para este novo mas não obtive sucesso. Eu tentei fazer a importação via RSS mas não funcionou. :-( Acho que o UOL não quer colaborar muito com quem quer migrar do servidor de blogs deles para algum outro.

Mas enfim, chega de papo! O endereço do meu antigo blog é:  http://lavh.zip.net

Banco Real e o seu módulo de proteção

June 18th, 2008

O Banco Real possui um módulo de proteção para dar maior segurança aos usuários nas suas transações. Até aí, td bem, esse é realmente o papel esperado de um banco.  Porém, esse módulo de proteção só funciona com o Windows (ahn…será que é porque os outros SOs não precisam disso?). Mas enfim, devido a esse fato do módulo não funcionar no Linux, você só conseguer usar o site “read-only”, ou seja,  não é possível efetuar mais nenhuma transação bancária.

O que eu não sabia, e que acho que poucas pessoas sabem, e por isso a razão deste post, é que você pode ligar na Central de Atendimento deles e pedir pra eles desligarem essa funcionalidade pra você. Eles vão falar que isso compromete a segurança e vão perguntar se você tem total certeza do que está fazendo.  Basta dizer SIM e você passa a utilizar o site do Banco Real do Linux.

Para quem é correntista do Banco Real como eu, é uma coisa a menos para ter que apelar ao Windows. Alias, eu nem lembro quando foi a última vez que entrei no meu Windows. Porém acho que terei que entrar em breve pois não conheço pra Linux nenhum programa tão bom quanto o Visio. Alguém tem alguma sugestão.

Um abraço.

Datasources XA e suas peculiaridades

June 13th, 2008

Tivemos uma grande dor de cabeça por causa de um problema com o banco de dados aqui na empresa. Por algum motivo, a equipe de DBAs precisou reiniciar um dos bancos de dados utilizado na nossa aplicação. Após isso, nossa aplicação não conseguiu mais se conectar com o banco de dados. Nosso sistema é uma aplicação EJB que roda sobre o JBoss, nós usamos o pool de conexões do próprio Jboss e nossos datasources são XA.

Após diversos testes, descobrimos que para que as conexões do pool sejam recuperadas é preciso adicionar o seguinte parâmetro nas configurações do datasource:

<valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker</valid-connection-checker-class-name></code>

Esse parâmetro faz com que antes do pool devolver uma conexão, ele a valida, e se ela estiver inválida, ele descarta essa conexão e cria uma nova. Ao meu ver, isso deveria ser algo feito por “default”, mas infelizmente não é.

Esse problema só ocorre se você usa datasources XA. Com datasources “normais” nem é preciso adicionar este parâmetro.

Nós aqui da equipe também executamos outros testes como trocar a senha do banco de dados por exemplo, e neste caso, mesmo sem o parâmetro o sistema consegue se recuperar.

Então, pra finalizar, segue a configuração completa de um datasource XA:

<xa-datasource>
<jndi-name>NameDS</jndi-name>
<track-connection-by-tx/>
<isSameRM-override-value>false</isSameRM-override-value>
<xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
<xa-datasource-property name="URL">jdbc:oracle:thin:@host:1521:SID</xa-datasource-property>
<xa-datasource-property name="User">user</xa-datasource-property>
<xa-datasource-property name="Password">password</xa-datasource-property>             <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
<no-tx-separate-pools/>
<max-pool-size>3</max-pool-size>
<valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker</valid-connection-checker-class-name></code></code>

</xa-datasource>

Espero que essas dicas sejam utéis e possam ajudar a outros também que tiverem esse mesmo problema.