segunda-feira, 24 de novembro de 2008

CMMI e Agile: A grande diferença.

Coloquei no meu blog um pequeno comentário sobre o artigo do SEI sobre CMMI e Agile. Vale uma lida!

sábado, 15 de novembro de 2008

Buildix: Infra-estrutura de desenvolvimento agile a um só clique.

A ThoughtWorks lançou recentemente o buildix, para configuração de um servidor de desenvolvimento de software com Controle de versão, integração contínua, wiki, bug tracker entre outros. É distribuído em pacote .deb para ubuntu, como iso de um live-cd já pronto e também como uma máquina virtual do vmware. Ainda não testei, porém o farei assim que possível. É uma distribuição interessante que faltava ns flavors linux!

SEI publica relatório integrando CMMI e Agile

O SEI (Software Engineering Institute) publicou um relatório chamado "CMMI or Agile: Why Not Embrace Both!". A notícia foi postada no InfoQ e já chamou atenção da comunidade só pelo nome. É um ótimo momento para todos nós desenvolvedores que anseiam por um Processo de desenvolvimento que possua o melhor dos dois mundos. Vamos estudar!

domingo, 26 de outubro de 2008

Novo BrOffice 3.0 foi lançado!

Publicada em http://pedrocavalero.blogspot.com:

Caros, a nova versão do BrOffice, a 3.0 foi oficialmente lançada! Com vários bug fixes e novas features, é um lançamento que vale a pena uma olhada! Pra mim, que não tenho o M$Office instalado na minha máquina, percebi de cara que ele é compatível com o novo formato da Microsoft, o OOXML.
Outra coisa muito interessante que descobri o BrOffice/OpenOffice são os plugins. No link de extensões da página do OpenOffice.org, tem vários plugins interessantes, como importadores de pdf, integração com o google docs, Latex e templates de apresentações.
Altamente indicado!!!

sexta-feira, 10 de outubro de 2008

terça-feira, 9 de setembro de 2008

quinta-feira, 4 de setembro de 2008

Comparando o Javascript do Google e Firefox 3

Caros, eu fiz um benchmark entre o Google Chrome, o Firefox 3 e o IE 7. Confiram aqui no meu blog.
Abraços!

quarta-feira, 3 de setembro de 2008

Suduko e estimativa de tempo em software

Caros,

Escrevi um post sobre um artigo que saiu no dzone. O nome é Suduko e a estimativa de tempo em software. Espero que gostem! Abraços!

quarta-feira, 20 de agosto de 2008

Para melhor blogar ...

Caros,

Um bizú para todos os amantes do Firefox. O ScribeFire Blog Editor é um plugin que facilita bastante o ato de blogar. Dica pra todos os que ainda não colocaram nenhum post aqui por falta de tempo! hehehe
Abraços!!

segunda-feira, 11 de agosto de 2008

Coaching Self Organizing teams

Muito bom este post do DZone sobre equipes auto-gerenciáveis. O comportamento humano precisa ser muito estudado por gerentes de equipe para conseguirmos manter ritmo, harmonia, vontade etc. Vale uma lida! http://www.infoq.com/news/2008/08/coaching_teams.

sexta-feira, 1 de agosto de 2008

Orientação a Objetos vs. Orientação a serviços

Muito interessante esse post do DZone. Ele comenta sobre o problema de ter de exportar um grafo de objetos muito grande através de um WebService. Vale uma olhada!

Eclipse Search

Olha que legal esse plugin! Ótimo para quem trabalha com Eclipse e RCP! Acesse aqui!

Participação no XXVIII Congresso da SBC

Postei no meu blog um comentário sobre a minha participação no Congresso da Sociedade Brasileira de Computação. Acesse por aqui!
Abraços!

sábado, 28 de junho de 2008

Tornando aplicação Swing multi threaded com SwingWorker

Já havia visto citações de SwingWorker em uma porção de lugares porém nunca havia dado muita atenção. Recentemente li um post no D-Zone muito claro, tanto na definição do problema que o SwingWorker vem resolver(título do post), quanto na forma de utilizar este. Recomendo a leitura a todos que trabalham ou pretendem trabalhar com este fantástico, porém complicado, toolkit gráfico de Java que é o Swing.

sábado, 21 de junho de 2008

Uso de OSGI no Mercado : Deu no Dzone.

Saiu no Dzone um artigo (i) citando o resultado de uma pesquisa (ii) sobre o uso de OSGI nos softwares em desenvolvimento, perspectivas de uso para o próximo ano e divulgando um livro free de OSGI (iii). Seguem os links.

i - Artigo no Dzone
ii - Resultado da Pesquisa
iii - Livro Free de OSGI

quinta-feira, 19 de junho de 2008

Google Code Jam 2008

Aos interessados em se divertirem um pouco:
http://code.google.com/codejam/index.html
:)
[]'s

quarta-feira, 18 de junho de 2008

Spring Remoting Compared

Tem um artigo bem interessante com comparações de tempo das soluções de acesso remoto que o Spring Remoting utiliza chamado Spring Remoting Compared. Lá tem os códigos fonte para os testes e é um bom exemplo de como utilizar o framework. Vale uma olhada!

quarta-feira, 11 de junho de 2008

Acessando OSGi Services de um cliente não-OSGi

Nesse post é mostrado uma forma de acessar serviços OSGi de um cliente não-OSGi. É uma idéia bem interessante e útil. http://regumindtrail.wordpress.com/2008/06/10/acessing-osgi-service-from-non-osgi-client/
Abraços!

domingo, 8 de junho de 2008

Dicas para o Hudson

Saiu no DZone um artigo bem legal sobre o Hudson chamado Hudson tips and tricks. Vale conferir!
Abraço!

sábado, 7 de junho de 2008

Portal do Software Público é referência na Norma de Contratação

"O Portal do Software Público Brasileiro é o local de referência para o compartilhamento de software no governo federal" diz a noticia no site do Software Publico. Foi publicada uma instrução normativa que diz que o "Portal passa a desempenhar a função de aglutinador do compartilhamento de soluções informatizadas no setor público federal". Para saber mais clique aqui

terça-feira, 27 de maio de 2008

Enumerations e Hibernate. Parte 1 ou Das Motivações.

Refatorando um sistema no qual trabalho, deparei-me com uma situação semelhante a esta.

public class Genero{
private long id;
private String nome;
//gets e sets
}

public class Pessoa{
private long id;
private Genero genero;
//gets e sets
}

Onde Genero é uma entidade do meu domínio que é mapeada para uma tabela Genero no BD.
Sendo que esta tabela tinha registros com o campo NOME preenchido com o seguintes valores "MASCULINO" e "FEMININO".

Neste contexto, havia uma classe com o seguinte código:

if( "MASCULINO".equals( pessoa.getGenero().getNome()) ) ...faz alguma coisa

A saga começou com o fato da magic string "MASCULINO" me incomodar um bocado. Então resolvi criar uma constante a fim de tornar o código mais claro.

public static final NOME_GENERO_MASCULINO = "MASCULINO"

O que deixou o trecho de código da seguinte forma:

if( NOME_GENERO_MASCULINO.equals( pessoa.getGenero().getNome()) ) ...faz alguma coisa

Porém com mais algumas marteladas no código surgiu outra constante.

public static final NOME_GENERO_FEMININO = "FEMININO"

A partir do momento que havia estas duas constantes intimamente relacionadas, resolvi criar uma enumeration para encapsulá-las.

public enum NomeGenero{
MASCULINO,
FEMININO
}

Sendo que o código cliente ficou com a seguinte cara:

if( NomeGenero.MASCULINO.toString().equals( pessoa.getGenero().getNome()) ) ...faz alguma coisa

Bem ... Removi a magic string porém o código ficou maior. Mas o pior de tudo foi que, com a criação da enumeration, ficou claro que o conteúdo da coluna NOME da tabela GENERO estava replicado na enum NomeGenero. Ou seja, a mesma informação em duas "fontes de dados" distintas. BAD SMELL.

Daí contemplei a necessidade de haver somente uma "fonte de dados" e optei por manter a enumeration. As principais razões que me levaram a esta opção foram as seguintes:

1 - O código motivador de tudo isso ganharia clareza e type safety:

if( NomeGenero.MASCULINO == pessoa.getNomeGenero() ) ...faz alguma coisa

2 - Quando precisasse dos possíveis valores de gênero em vez de fazer um select na tabela Genero, o que me custaria processamento no SGBD, tráfego na rede e tudo o mais; bastaria fazer Genero.values() .

A principal razão que me afastaria da opção pela Enumeration é que quando surgisse um gênero novo eu teria que adicioná-lo na enum, para isso deveria alterar a fonte, recompilá-la e por fim realizar o deploy. Sendo que que na alternativa do BD, bastaria adicionar o registro novo na tabela GENERO. Porém, o fato de não surgir um gênero novo na raça humana corriqueiramente garante a estabilidade desta enumeration, o que praticamente anula esse trade off.

Assumindo o risco citado anteriormente, optou-se pela enumeration, o que implicou que a classe Genero e a tabela GENERO deixaram de existir e a classe Pessoa "Enumeration Powered" ficou da seguinte forma:

public class Pessoa{
private long id;
private NomeGenero nomeGenero;
//gets e sets
}

Porém para as coisas funcionarem desta forma o hibernate, que é o ORM que uso, deveria persistir o NomeGenero de Pessoa. Daí surgiram as seguintes questões; "O Hibernate persiste enumeration?"; "Como fazê-lo?"

...To be Continued

sábado, 17 de maio de 2008

Google Map Reduce e linguagens funcionais

Aqui há um post interessante sobre funções de primeira classe (http://www.joelonsoftware.com/items/2006/08/01.html) e como o algoritmo extemamente paralelizável do Google MapReduce (http://labs.google.com/papers/mapreduce.html) tira proveito de um modelo funcional.
Enjoy it :)

Wrappers

Talvez você já tenha se deparado com inúmeras bibliotecas comuns em C++ que ficam facilmente disponíveis em outras linguagens e scripting languages como Java, Ruby, Python e várias outras. Um exemplo bem comum é a JOGL (https://jogl.dev.java.net/), que é um wrapper para Java da OpenGL. A forma como a JOGL foi desenvolvida é extremamente interessante, visto que produziu-se a GlueGen (https://gluegen.dev.java.net/) para automatizar o processo de binding.
Para justificar o grande números destas bibliotecas, ao ler sobre a GSL (GNU Scientific Library) descobri que a maneira sugerida para criar-se wrappers é através do utilitário SWIG (Simplified Wrapper and Interface Generator). O site do SWIG (http://www.swig.org/) tem tutoriais mostrando como gerar-se uma dll para ser usada em Java, por exemplo, com pouquíssimas linhas de código e execução da ferramenta. Há varios exemplos de bindings em Perl, PHP, Python, Tcl, Ruby, C#, Common Lisp (CLISP, Allegro CL, CFFI, UFFI), Java, Lua, Modula-3, OCAML, Octave e R.
Fica aí a dica para quem quiser desenvolver em uma linguagem deixando o legado disponível para todas as demais :)

ODF vs. OOXML

Há pouco tempo eu ouvi falar que o ODF (Open Document Format) não continha todos os formatos possíveis no OOXML (Office Open XML). Encontrei um projeto chamado OpenXML/ODF Translator que tenta fazer essa conversão e neste site ele lista as incompatibilidades entre os dois padrões. Tanto o ODF não consegue fazer coisas que o OOXML consegue, quanto o OOXML não consegue fazer coisas que o ODF consegue! Vamos ver quem evolui primeiro....

segunda-feira, 12 de maio de 2008

10 comentários contra os grandes sistemas legados

Tem um artigo interessante no site que o Guerra indicou de nome "10 reasons against huge legacy systems". Será que lembra algum sistema conhecido nosso? hehehe
Abraços!

Programadores bem humorados

Quem disse que programadores e desenvolvedores não devem ser bem humorados? Segue a URL do site Code Comics com tiras muito legais com a temática de uma empresa de TI: http://www.codecomics.com/servlet/SiteBuilder?type=comics

domingo, 11 de maio de 2008

Integração do Desktop com Java 6

Caros,

Achei muito interessante esse artigo sobre como integrar uma aplicação desktop com o ambiente onde ela roda. A API JDIC (JDesktop Integration Components) permite fazer coisas como abrir um arquivo no programa padrão do sistema (doc no Word, odt no OpenOffice), uma url no browser padrão, entre outros. Isso é bem útil e já sentimos necessidade disso algumas vezes...
Dá uma olhada no site LittleTutorials. Lá tem um bom exemplo!
Abraços!

sexta-feira, 9 de maio de 2008

Fazendo mock de classes (não de objetos)

Tenho trabalhado constantemente no desenvolvimento de frameworks e classes que trabalham com metadados e reflexão. Na hora de testar esse tipo de classe é preciso ficar criando um monte de inner classes para utilizar no teste já que a estrutura da classe acaba influenciando no comportamento da classe ou do componente. Essa criação dessas pequenas classes acaba deixando o código de teste grande e de mais difícil leitura (tirando o fato que é bem chato ficar criando).

Dessa forma, tive a idéia de criar um framework para auxiliar nesses testes que permite a criação de classes em tempo de execução para serem utilizadas no teste. A idéia é permitir que a criação das classes seja menos verbosa que a criação de inner classes e deixem o código de teste mais fácil de ler e de criar.

O nome de "mock classes" não é muito apropriado, mas acaba passando a idéia de classes criadas para o teste. Já iniciei o desenvolvimento do framework e assim que tiver algo mais concreto volto a postar aqui!

quarta-feira, 7 de maio de 2008

Best Practices OSGI

Slides da palestra do OSGI Alliance no JavaOne. Clique aqui! Os javadocs do OSGI Services Plataform release 4 version 4.1 podem ser encontrados aqui. Em breve estaremos postando mais sobre OSGI aqui no nosso blog.

terça-feira, 6 de maio de 2008

Tutoriais sobre Osgi

Ok, aqui vai um post de fim de speed, com as referências para estudo de Osgi

http://www.theserverside.com/tt/articles/article.tss?l=EclipseEquinoxOSGi
http://neilbartlett.name/blog/osgi-articles/


[]'s

Em busca do desacoplamento perdido.

No trabalho, tem sido recorrente conversas sobre boas práticas de design OO. Daí o surgiu a idéia de postar a essência destas discussões a fim de compartilhar as motivações, conclusões e mesmo abrir estas a críticas.
Uma polêmica recente foi sobre a implicações de criar um código em uma classe cliente com o seguinte estilo:

carro.getMotorOriginal().acelerar();

Em vez de:

carro.acelerar();

Onde:

class Carro{
...
public void acelerar(){
this.motorOriginal.acelerar();
}
...
}

No primeiro exemplo para um cliente acelerar um carro ele tem que obter o motor deste e explicitamente acelerar o motor.
No segundo exemplo para se fazer a mesma coisa, o cliente acelera o carro e o carro se encarrega de acelerar o motor.
A conclusão que se chegou é que na primeira situação o cliente está acoplado demais a estrutura interna do carro, a ponto de quando eu trocar o motor atual por um motor paraguaio, terei que alterar o cliente.

carro.getMotorParaguaio().aserejer();

O que é uma tremenda desvantagem em comparação com o segundo caso, pois neste o cliente se mantém o mesmo, o que mudaria seria a implementacao do método acelerar da classe carro.

class Carro{
...
public void acelerar(){
this.motorParaguaio.aserejer();
}
...
}

Confinando as mudanças a classe Carro.

Os chatos de plantão poderiam dizer que se eu fizer o Motor Original e o Motor Paraguaio implementar uma mesma interface Motor e se o cliente depender desta interface, eu poderia trocar de motor sem custos pro cliente. O que posso argumentar é que ainda que isso seja verdade o cliente continuaria dependendo da estrutura interna do Carro, continuaria sabendo que o carro tem um motor e continuaria acelerando este explicitamente, o que é uma clara violação do encapsulamento do carro(papo pra outro post). Sendo que a única coisa que ele precisa saber é que o carro é acelerável.

Formalizando a conclusão de que a segunda abordagem é superior a primeira, existe um princípio de design, a lei de Demeter, da qual posto aqui o link para os interessados em aprofundar design skills. Leitura recomendada. Até a próxima a todos e como diria a minha mãe e a lei de Demeter “Only talk to your immediate friends.”

http://en.wikipedia.org/wiki/Law_of_Demeter


PS: O exemplo com o motor paraguaio surgiu somente para fazer a referência pop ao hit Asereje do grupo musical espanhol Las Ketchups, que foi interpretatado aqui no Brasil pelo Grupo musical Rouge e rebatizado de Ragatanga.

Manipuladores de Bytecode

Olá pessoal! É meu primeiro post aqui no blog e eu já vou falar sobre um assunto meio "barra pesada": manipulação de bytecode. Estou trabalhando com um aluno em uma ferramenta para medida dinâmica de reuso e precisaria instrumentar o código para que ele chame minhas classes a cada linha de código executada. A solução seria inserir bytecode no carregamento da classe, para que a cada linha de código fosse chamado um método da ferramenta.

Minha primeira tentativa foi utilizar o framework BCEL. O resultado foi um desastre! Além de não haver uma documentação muito boa, apareceu um problema que eu não consegui resolver (as vezes funcionava e as vezes não funcionava). Em uma conversa com o Michael Nascimento, o MisterM, ele me recomendou utilizar o ASM.

Me surpreendi como o ASM possuia uma API simples baseada em eventos e como ele é bem documentado. Consegui rapidamente fazer o que precisava e não tive nenhum problema por parte do framework. Além disso ele ainda é bem mais rápido que o BCEL. Recomendo totalmente!!! Talvez o ASM faça alguma aparição em uma das próximas edições da MundoJava...

domingo, 4 de maio de 2008

Tunning no Hibernate

A gente sempre acha coisas interessantes pelos blogs da internet. Achei esse aqui no Kumpera.net sobre Tunning de Mapeamento do Hibernate. Vale a pena dar uma conferida.
Aproveito para chamar os nossos autores a escreverem ou simplesmente apontarem os resultados dos seus estudos. Vamos fazer os velhos "bancadões" agora virtuais!

sábado, 3 de maio de 2008

Fisl 9.0: palestras que assisti.

Amigos, estou postando no meu blog alguns posts sobre as palestras que assisti no Fisl 9.0. Fui, obviamente, mais nas de Java, mas assisti algumas outras bem interessantes que estarei postando lá. Façam uma visita clicando aqui, ou ao lado em blog do Cavaléro.
Abraços!

Links Interessantes

Links interessantes:

Usando o plugin do maven m2eclipse de forma bem util:
http://www.jroller.com/eu/entry/maven_project_materialization

Google Collections - O framework collections da google com várias funcionalidades interessantes, em particular uma parte simulando uma linguagem funcional.
http://www.developer.com/open/article.php/10930_3735441_1


Palestra sobre o Java 6 com o básico das novidades
http://www.guj.com.br/posts/downloadAttach/1191.java

Maven Build Numbering plugin
http://technology.amis.nl/blog/?p=2582

Minify all your JavaScript and Stylsheets automatically with YUI Compressor and a Servlet Filter by Jeroen van Wilgenburg

http://technology.amis.nl/blog/?p=2392

Comparando Spring e o Google Guice
http://code.google.com/p/google-guice/wiki/SpringComparison

Maven JMeter plugin and report generation (the last steps to get it working) by Robbrecht van Amerongen

Lista de plugins para JQuery
http://marcgrabanski.com/article/75/List-of-Useful-jQuery-Plugins

Bem vindos!

Bem vindos!! Estamos alterando nossa localização, do Google Apps pra cá. Um blog facilita a troca de informações, permite a todos escrever suas idéias e novidades!
De início estou postando aqueles Links interessantes que estavam no outro site. Aquele será fechado.
Abraços!!