segunda-feira, 10 de junho de 2013

Integração Continua - Instalando o Hudson

Neste post irei mostrar como instalar o Hudson, de forma bem rápida e prática.
Primeira coisa, configuração o que estou usando para efetuar a instalação, segue:


  • Windows Seven
  • Versão do Hudson 3.0.1 segue link para download http://hudson-ci.org/
  • JVM 1.7.0_24 segue link para download http://www.oracle.com/technetwork/java/javase/downloads/


Modo de Instalação:


Ao baixar o Hudson, você irá colocar em um caminho a sua escolha e executar tais comando no prompt do Windows.




Iremos executar o java -jar hudson-3.0.1.war pois inicaremos o Hudson como tarefa do Windows e em modo Winstone, é o modo rápido e prático de instalar o Hudson.

Após executar ele irá startar e perguntara se deseja coloca-lo para iniciar juntamente com o serviço do Windows, no meu caso isso foi útil.

A primeira tela que vocês iram visualizar é esta daqui.



Podemos configurar de qualquer forma o Hudson pelo link "Gerenciar Hudson" > "Gerenciar Plugins", nele possuímos vários plugins que podem ser instalados, para que o Hudson funcione da forma necessária e que você necessite.

Tenho uma aplicação que roda na porta 8080, quero alterar a porta do Hudson, como eu faço?


Simples no arquivo gerado dentro do seu usuário podemos alterar a porta do Hudson, segue o caminho no meu caso: "C:\Users\Paulo\.hudson".

O arquivo hudson.xml deve modificar a linha 34, para qual porta você deseja que o Hudson starte, segue exemplo:
<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\hudson.war" --httpPort=9090</arguments>

Após executado isso reinicie o Hudson, e acesse com a porta que você indicou.

Estou aberto a sugestões, caso tenham dúvida como instalar é só perguntar estarei aqui para ajudar.

domingo, 7 de abril de 2013

Mineração de dados utilizando Frameworks Java (Apache Mahout e Hadoop)


Uma aplicação necessita de saber o gosto do cliente, encontrar suas preferencia, temos que gerar um cruzamento de dados, utilização de data mining minerar os dados, etc, etc, etc.
Mas arquitetando uma aplicação, me deparei em uma situação que irá necessitar minerar os dados e conhecer o gosto do usuário (cliente). Será que teremos implementar uma data mining? Era um conhecimento que não tinha ainda. Até em uma das minhas pesquisas encontrei um artigo da revista Mundo J, que fala sobre essa necessidade e cita as duas frameworks que andei estudando Mahout e Hadoop. E como conhecimento adquirido, estarei compartilhando com vocês.

Temos três algoritmos de utilização do Apache Mahout, são elas:

Filtragem colaborativa: A filtragem  é feita de acordo com as decisões do usuário.
Cluster: É a semelhança entre usuário e o próprio produto.
Categorização: Agrupa os dados automaticamente.
A decisão de utiliza-los deve ser avaliada, mediante uma analise dos requisitos do sistema.


Onde vamos armazenar estes dados coletados

É onde entra o Hadoop, os dados que foram processados, ou dados com similaridade já calculados, você irá dizer ao Apache Hadoop se irá gerar um arquivo de dados do sistema ou gravar os dados em um mecanismo de dados distribuídos.
O próprio Apache Hadoop possui uma memoria de dados, mas a quantidade de informação deve sim ser pequena, caso contrario deve-se adicionar dados em sistemas de banco de dados distribuído.

Configuração

Ao criar um projeto Web, devemos fazer um download do Apache Mahout e Apache Hadoop.
Definirmos um banco de dados, para armazenar os dados minerados.
Vamos adicionar as bibliotecas do Mahout e Hadoop no projeto.


E cada caso de uso devemos avisar que nele irá conter uma coleta de dados.

Conclusão

Dessa forma conseguimos gerar dados com similaridades, obter as informações dos usuários.

Qualquer dúvida só entrar em contato.

Referencias:













Geração de Log e Auditoria de dados usando (Hibernate Envers)


A maioria das aplicações de médio e grande porte necessita de geração de Log´s e Auditoria, sempre foi um requisito não funcional para auditar dados sigilosos e importantes. Com a necessidade surgiu a framework que ajuda na construção desses dados auditados (Hibernate Envers), onde neste artigo irei explicar como utiliza-lo.
Usaremos a versão do Hibernate Envers 1.2.2 (compatível com o hibernate 3.3.X), não é uma versão final, e utilizar o JBOSS 5.0.1 GA como servidor e JPA 2. Lembrando que devemos acrescentar o JAR do hibernate envers no JBOSS para funcionar a aplicação.

Configurando o Hibernate Envers


Para cada entidade que deve ser auditada (gerada um log), devemos utilizar a annotation @Audited, nesta anotação você deixa explicito que a entidade X deve ser auditada a cada execução de insert, update e delete, mas falta algo para na configuração que deixa explícitos quais operações a entidade deve ser log, temos a configuração no persistence.xml, segue abaixo:

<property name="hibernate.ejb.event.post-insert" value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.post-update" value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.post-delete" value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.pre-collection-update" value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.pre-collection-remove" value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.post-collection-recreate" value="org.hibernate.envers.event.AuditEventListener" />

Está configuração serve para dizer as operações que Envers irá executar para cada entidade anotada.
Sim é uma situação muito simples de configurar e anotar as entidades, mas deve lembrar que analisar e arquitetar as entidades e verificar que aqueles dados sim são importantes e devem ser auditados, pois nem todos os dados devem ser auditados e pode sim atrapalhar o consumo de dados no banco.

Que ganho tem na minha aplicação


Simples, quando geramos trigger para gerar essas auditorias sempre temos que disparar um gatilho no banco, além de consumir um recurso do banco temos esse GAP para disparo, na aplicação Java o momento de utilização das seguintes operações update, delete e insert é o momento que o Envers irá executar, então estaremos utilizando o mesmo consumo e recurso é como se estivéssemos gravando juntamente com cada operação do banco.

Mas a aplicação pode ficar sobrecarregada


Não, pois a própria framework cuida disso, este problema já havia sido levado em consideração e devemos utilizar entidade apenas para auditoria para que não utilize o mesmo recurso da sessão do JPA e ou Hibernate. Como sabemos ele abre Threads para cada transação, utilizando sempre a mesma conexão, para que não gere concorrência e gere um gargalo da aplicação. Então irá consumir ou sobrecarregar a aplicação? Não.

Como consultar


O Envers possui um processo de Criteria do Hibernate, com os métodos AuditReader e o AuditQuery. O primeiro é para consultas e retorno de dados e o segundo é para construção de query´s mais pesadas.
Vale lembrar que as consultas que possua entidades com listas, todas elas você deverá percorrer, pois o Envers trata os @ManytoMany e @ManytoOne como FetchType como Lazy, caso na consulta você não deixe explicito que necessita que aquele objeto deve ser carregado, irá trazer uma lista não concluída, no momento de acessa-lo irá estourar um erro do próprio Hibernate.

Exemplo de entidade anotada


@Entity
@Audited //Anotação da entidade dizendo que esta devera ser auditada
public class Pessoa {

}

Conclusão


Podemos ter auditoria de dados e logs acoplado no Java, vimos que temos um recurso Java que não consome tanto recurso do banco e que é certamente seguro.

Qualquer dúvida só entrar em contato.

Referencias:

quinta-feira, 21 de março de 2013

Banco orientado a Regras de acesso

Pois é, o costume de um banco é criarmos um usuário para ter acesso "GRANTS" para outros OWNERS, isso funciona muito bem, tem segurança dos dados e facilita o acesso, apenas utilizando o usuário da aplicação. Mas se um dia esse usuário for capturado, o usuário que conseguiu capturar vai ter acesso a toda base e pode executar uma bagunça imensa.

Vi uma situação na empresa feita por um AD (Administrador de dados) que achei fantástico, criou-se ROLES para acessos as GRANTS dos outros OWNERS, mas temos um grande problema como a aplicação irá acessar esta ROLE?

Vamos detalhar a aplicação, estamos utilizando Spring, Primefaces, Hibernate e JPA, mas como o JPA irá setar a ROLE? Foi uma pergunta que me tirou o sono, pois nem sempre é feito dessa forma e para este projeto foi uma coisa nova, jamais havia experimentado esta forma de trabalho.

Como a arquitetura do sistema é MAVEN, como o MAVEN irá subir o Data Source?

É conseguimos executar de forma brilhante isso e gostaria de compartilhar estas informações com todos, segue abaixo o trecho do código:

No pom.xml tem um trecho de código que acrescentamos no Data Source do pom.xml.

<database.driver>oracle.jdbc.driver.OracleDriver</database.driver>
<database.username>teste</database.username>
<database.password>teste</database.password>
<database.role>SET ROLE RO_TESTE_T IDENTIFIED BY POST78452L8K8Y9362</database.role>
<database.role.enabled>true</database.role.enabled>

No momento que sobe a aplicação, ele identifica toda a regra da ROLE e quando executamos algum comando para insert, delete, update e select, a ROLE é setado.

Espero que isso sirva de conhecimento para pessoas que passaram pelo mesmo problema ou querem utilizar, uma forma mais segura de acessar o banco de dados.

Só para finalizar de essa forma quem capturar o login e senha do banco não terá acesso a nenhuma informação destinada aquele usuário, pois necessita da ROLE, que é rodada em background na aplicação.

Caso precise de ajuda é só entrar em contato.

domingo, 17 de fevereiro de 2013


Web Semântica - Web 3.0


O conceito Web Semântica provavelmente é novo para algumas pessoas e para outras pessoas é uma situação que jamais irá existir. Pois bem, estão enganados, pois cada vez mais as situações existentes na Web se torna mais semântico para facilitar para o usuário.

Como vai funcionar?


Simplesmente á forma para recuperar as informações devem ser mais coesa e interligadas.

Mas o que é Web Semântica?


De acordo com o livro Web Semântica: A internet do futuro (Karin Breitman), A idéia central é organizar as informações para que dessa forma facilite o acesso. A Web Semântica é para ajudar no conceito de buscas e integração dos dados.



Camadas


A Web Semântica necessita da camada ontologia, onde os metadados armazena as informações. E para isso alguns projetos utilizam RDF como forma de organizar essas informações ao indexarem as páginas da internet.

Ponto de vista


A autora do livro Web Semântica coloca que á Web Semântica não é inteligencia artificial, entendo o ponto de vista e as pesquisas que a mesma colocou, mas descordo totalmente, quanto mais o conceito de inteligencia artificial que é ser parecido com o ser humano, mais facil o entendimento da maquina para situações humanas. A forma que é tratado por Tim Berners Lee que a maquina tem que ser capaz de entender o ser humano, como um humano.

Conclusão


A Web Semântica, sim vai melhorar muito as informações postadas pelos usuários, onde irá transformar a internet em fonte confiável e semântico.

JVM alguns segredos sobre o seu sombrio mundo


Introdução


Java Virtual Machine (JVM) como o próprio nome sugere é um computador virtual que reside em um computador real. A JVM da uma flexibilidade plataforma.

Os códigos Java possuem atributos e métodos, objetos, etc. Quando o compilamos gera um arquivo de bytecode e interpretado pela JVM e executa o programa de forma que realiza o que lhe foi escrito.



É interessante conhecermos seu funcionamento interno é essencial para qualquer aplicação Java. Muitas vezes, deixamos de lado ajustes importantes de Garbage Collector (GC), não entendemos as implicações do JIT no nosso design ou enfrentarmos problemas práticos com ClassLoaders.

GC


Uma das maiores dificuldades na hora de programar era o gerenciamento de memoria. Os desenvolvedores são os responsáveis pela sua locação e liberação manualmente, o que levava muitos erros de memoria.

O GC é um dos principais componentes da JVM e responsável pela liberação da memoria que não esteja sendo mais utilizada.
Quando a aplicação libera todas as referencias para algum objeto, este passa a ser considerado lixo e pode ser coletado pela GC a qualquer momento. Conseguimos determinar este momento de coleta de lixo pela GC? Não.

Esta base é conhecida como algoritmo GC Mark-And-Sweep, constituído em duas fases, na primeira percorre a memoria e marca todos os objetos acessíveis pelas threads atuais e a segunda que varre (sweep) novamente a memoria e coleta os objetos.

Geralmente 95% dos objetos criados durante a execução de alguma aplicação tem vida extremamente curta, isto é, são rapidamente descartados. É o chamamos de alto índice de mortalidade entre os objetos.

Mesmo métodos curtos e simples, como o toString, acabam gerando objetos intermediários que rapidamente não serão mais referenciados. A memoria é dividida em duas partes: YOUNG GENERATION e OLD GENERATION.

Novos objetos são alocados na YOUNG e, assim que ela estiver lotada, é efetuado o chamado minor collect. É neste passo que os objetos sobreviventes são copiados para a OLD, e todo o espaço da YOUNG torna-se disponível novamente para alocação.

Um mito muito comum na comunidade Java é de que se criarmos N objetos o GC irá passar para o processo de PERMGEN e não é verdade. Na verdade, como os algoritmos mal estruturados podem dar N voltas e afetar o processo da GC, assim levando o mesmo a executar o PERMGEN, nem passando para o processo OLD e desta forma levando ao estouro de memoria.




O gerenciamento da memória JVM


A área total usada para armazenar os objetos na JVM é conhecido como Heap. O tamanho que será dado a memória Heap é controlado pelas opções -Xms e -Xmx. A primeira opção é para determinar o tamanho inicial da Heap e o segundo para determinar o tamanho máximo de memória consumida.
Inicialmente o sistema operacional aloca o total de memória dada pelo comando -Xms e este valor não será devolvido enquanto a JVM estiver ativa.

Os problemas na maioria das vezes é arquitetura mal elaborada que cria classes em números exagerado, algoritmos que executam vários círculos e gera N vezes iterações desnecessários e consultas a bancos que carregam milhões de dados na memória. Este é o momento que ocorre, chamado de stack OutOfMemoryError, onde milhares de aplicações ocorrem este tipo de problema por não conhecerem a arquitetura da JVM.

Conclusão


Saiba adequar sua aplicação à hipóteses das gerações, seja adequando seu código, seja conhecendo as melhores configurações de execução da sua JVM.



Bibliografia


Livro Arquitetura e Design de Software - pág 26 - Ano 2009

segunda-feira, 7 de janeiro de 2013

Problema de espaço no disco fisico no banco oracle


Pois é tive um problema serio um dia desses com espaço no disco fisico do servidor de banco oracle, procurei em varios sites na pesquisa do google e nada de encontrar uma solução, executamos uma solução caseira (Rsrsrsrsrsrs).

Primeira coisa que fizemos, um backup de todos os dados do banco e criamos um snapshot de backup da VM.

Segunda situação executamos essa modificação no momento que tivemos certeza que não teria nínguem usando a aplicação e o banco.

Especificação

    - Oracle 10g
    - SO Suse Linux 10.2
    - Gparted 14.11
    - VM 5.2

Pois bem fomos na VM e criamos mais uma partição de tamanho pra ela com mais alguns teras de armazenamento, uma segunda partição de dados, pedimos para a própria reiniciar a maquina com o cd da imagem do gparted live cd, reconhecemos a partição criada.

Entramos no suse com usuário de permissão de root e dentro da fstab pedimos para montar essa partição.

Após realizar isso devemos startar o processo do oracle e mapear o acesso a ele, segue exemplo:

    - Na maquina suse, entra com o console, e digite o comando su - oracle.
    - Estaremos dentro do super usuário do oracle.
    - Digite startup e clique enter, o proprio oracle irá montar as partições do oracle.
    - e depois execute o seguinte comando lsnrctl start, para mapear o TNSORA.ini

Após todo este procedimento, devemos desativar a tablespace e coloca-las na partição que criamos, dessa forma evitar riscos de corromper a instalação do oracle. Segue o camando e estarei explicando o que ele faz:

    - alter tablespace {nome da sua tablespace e sem as chaves} offline;

Veja que colocamos a tablespace offline, no momento ninguem pode acessar a tablespace ou utiliza-la.

Agora vamos alterar o datafile para o caminho das pastas na partição nova, segue o comando:

    - alter tablespace {tablespace} rename datafile '/u01/oradata/{tablespace}' to                 '/u01/oradata/{tablespace.dbf}';

Agora vamos voltar a tablespace para online, só que em um novo caminho, segue o comando a ser executado:

    - alter tablespace {tablespace} online;

Após isso podemos remover a tablespace antiga, vale lembrar que irá consumir no novo caminho indicado com mais espaço para consumo.

Espero ter ajudado. By Cotta
Teste unitário, transformando programadores em excelência

Pois bem, não estou aqui para defender o JUnit, mas como dizem por ai como seria o Frajola sem o Piu-Piu? O que seria de um sistema sem o levantamento de requisito, sem o arquiteto, sem o programador, sem os testes, etc. É fazer um software sem o pé e sem a cabeça.

Depois olhar em volta e perceber que perdemos muito tempo corrigindo BUGs, e sempre ter que corrigir BUG no ambiente do cliente. Decidi aprender o JUnit e com isso compartilhar meu conhecimento.

Primeiramente não estarei colocando prints, ou mostrando um projeto piloto, vou postar as fontes que me ajudaram a aprender na teoria e na prática.

Segue o link com as vídeos aulas de JUnit no youtube que me ajudou bastante:


  •  http://www.youtube.com/watch?v=QEyxgtCEWMw


 Temos milhares de razões para usar o JUnit, mas existe apenas uma que deixa o programador com orgulho, é ser excelência no que faz, com qualidade e no prazo. Pois no momento que você consegue inibir aquele código fonte porco e começa a gerar códigos limpos e com qualidade, você programador deixa de ser Junior e transformar em um programador sênior.

Olha estes sites que irei listar que me ajudou bastante no meu estudo:
·         http://www.junit.org/

Pois bem pessoal para concluir, temos que ser excelência na nossa profissão, não adianta ser bom em desenvolver, mas não sabe ouvir e correr atrás dos objetivos. Para ser excelência tem que se dedicar a estudar e sempre estar com um passo a frente.