O nosso sonar agora tem uma novidade, foi lancado no dia 31/01/2011 um plugin para analise do codigo feito em PHP. Portanto na elotech todos os tipos de projetos (delphi, java, flex, php) estao disponiveis para analise no sonar.Agora os nossos amigos do php eventualmente poderao ser convidados a fazer uma apresentacao de melhoria de software. Ninguem escapa mais. E tem mais, esse plugin inclusive executa os testes unitarios e calcula a cobertura de codigo, so temos que configurar uma classe principal de testes.Vamos acessar pessoal no endereco local http://192.168.1.25:9000/, os projetos php tem o prefixo WebSocial. E isso ai!! A chave primaria identifica um registro unico na tabela, entao e uma boa ideia ter um unico valor que identifique o registro.Chaves compostas geralmente representam a chave natural, se voce precisar mudar a chave natural, ficara mais complexo se ela for a chave primaria.Chaves compostas nao raramente incluem dados que podem ser editaveis, como Nome ou CPF por exemplo, alterar chaves primarias e uma pessima ideia.Chaves primarias sao indices, quanto mais campos tiverem, mais caro custara o processamento deste indice.Chaves compostas custam mais caro para os plan analyzers encontrarem o caminho de relacionamento mais adequado. Chaves compostas causam full table scans, nao e raro o servico de banco de dados nao encontrar o caminho de relacionamento mais adequado, precisando ler toda uma ou mais tabelas para fazer o relacionamento.Chaves compostas tornam SQLs mais complexas e dificultam seu entendimento e sua manutencao.Chaves compostas aumentam o numero de campos nas FK das tabelas que se relacionam.Chaves compostas causam duplicacao de dados.Chaves compostas dificultam ORM. Este artigo foi anteriormente publicado aqui.Recentemente estavamos trabalhando em um projeto de migracao de dados em Java, e foi criada uma pequena interface para interagir com o usuario utilizando Swing. Em dado momento, decidimos incluir um JTextArea para mostrar ao usuario as informacoes emitidas pelo log do programa, no caso, utilizando Log4j, para que o mesmo pudesse acompanhar com mais detalhes o que o conversor estava fazendo no momento.Foi entao que pesquisando um pouco no google vimos que ha como criar nossos proprios Appender's do Log4j, e e sobre isso que eu vou falar hoje.Para criar um novo appender vamos estender a classe abstrata AppenderSkeleton, que ja prove todas as funcionalidades basicas para tratamento da mensagem. Sao obrigatorios a implementacao de 3 metodos:close(): Utilizado para liberar os recursos alocados pelo appender como arquivos, conexoes de rede, etc.requiresLayout(): Indica se o appender necessita de um layout configurado para funcionar. Em casos onde o appender pode trabalhar com ou sem layout, o metodo deve retornar true;append(LoggingEvent event): E o metodo principal que devemos implementar, e onde residira o nosso tratamento customizado do log. Ele recebe um argumento do tipo LoggingEvent, que tem varias atributos como o Level da mensagem, a mensagem, a causa do erro em caso de excecoes, etc.Ok, agora vamos ver um pouco de codigo. Crie um projeto Maven e adicione as seguintes dependencias: log4j log4j 1.2.16 commons-lang commons-lang 2.6Em seguida crie uma classe chamada TextAreaAppender e implemente os metodos necessarios.public class TextAreaAppender extends AppenderSkeleton { //Outro metodos foram omitidos