out 21

Simula Bolsa

Para você que gostaria de investir na bolsa, mas não tem cacife nem conhecimento, entre no simula bolsa, lá você começa com 100.000 realzes, e investe nas ações que desejar, como ele funciona utilizando os dados da BOVESPA,  você consegue aprender bastante sobre como sobreviver ao mercado de ações, e o melhor de tudo, você aprende na prática sem perder um tostão!

out 21

Save me

Pra você que conhece Peixe Urbano e gosta, vai aí uma dica, save me : Um apanhado de diversos sites de compras coletivas e de clube de compras, pra você economizar mais ainda, ou gastar mais ainda, depende da sua ânsia por promoções, porque são muitas! Principalmente para o público feminino.

out 21

Comparador de CMS

Primeiramente o que é um CMS. Segundo a wikipedia:

Um Sistema de Gestão de Conteúdo – SGC, (em inglês Content Management Systems – CMS), é um sistema gestor de websites, portais e intranets que integra ferramentas necessárias para criar, gerir (editar e inserir) conteúdos em tempo real, sem a necessidade de programação de código, cujo objetivo é estruturar e facilitar a criação, administração, distribuição, publicação e disponibilidade da informação. Sua maior característica é a grande quantidade de funções presentes.

Um CMS facilita muito a vida de quem tem que criar e administrar websites, por ser de fácil utilização e possuir muitas funcionalidades agregadas. Porém nem todos tem tantas funcionalidades assim, por isso venho neste post divulgar um site muito interessante que possui informações sobre diversos frameworks CMS, onde você escolhe os que tiver interesse e os compara. Lá contém informações como de qual banco de dados o CMS utiliza, se é pago ou não, qual a linguagem que ele utiliza, se possui aplicações pré-instaladas, como blogs, chats, etc. Além de n-outras informações. Para isso acesse o site do CMS matrix e escolha o que  melhor se encaixa no que você está procurando para o seu trabalho.

out 15

Java básico – Convenções de código Java (Parte 1)

Vou começar agora uma série de posts sobre como devemos escrever programas em java, tudo que eu escrever está baseado na Code Conventions para a linguagem de programação Java, ou seja, nada que eu tenha inventado.

Mas é sempre bom ter mais uma fonte de informação sobre um assunto, e em português também!

Comecemos com a seguinte pergunta: Porque programar padronizado?

Primeiramente, padrão é um “como se fazer alguma coisa”, logo quanto mais pessoas fizerem da mesma maneira, mais fácil fica a manutenção desta coisa. Um exemplo prático é: programas duram bastante tempo, desde a etapa de desenvolvimento, testes, homologação e produção. E nem sempre a mesma equipe que começou o desenvolvimento continua até o final da vida de um software, logo, quanto mais padronizado estiver, mais fácil para se dar manutenção e para se entender o que foi feito, ganhando-se assim tempo, e como tempo é dinheiro…


Agora vou falar um pouco dos padrões de arquivo e a estrutura de um arquivo.

Todos os programas em Java contém 2 tipos de sufixo:

  1. .java  – arquivos de código-fonte
  2. .class – arquivos de bytecode java, ou seja, os arquivos fontes compilados.

Um arquivo fonte java deve conter seções de código separadas por linhas em branco e opcionalmente conter comentários que identifiquem cada seção. Não é recomendado que um arquivo fonte tenha mais de 2000 linhas de código.

Este arquivo se estrutura da seguinte maneira:

  • Início dos comentários – deve conter o nome da classe, informação de versão, data, e notas de direito de cópia
/*
 * Nome da classe
 *
 * Informações de versão
 *
 * Data
 *
 * Nota de direitos de cópia
 */
  • Declarações de pacotes e imports – necessariamente nesta ordem.
package java.blah;

import java.blah.blahdy.BlahBlah;
  • Declaração de classes e de interfaces
    • Começamos com os comentários de documentação da classe, contendo a descrição, versão, data e nome do autor.
    • /**
       * Descrição da classe.
       *
       * @versão e data 1.82 18 Mar 1999
       *
       * @autor Nome Sobrenome
       */
    • Em seguida a declaração da classe ou da interface
    public class Blah  {
    • Caso necessário, um comentário sobre a implementação, quando este  não puder ser explicitado no comentário de descrição, por exemplo.
    <em>/* Comentário sobre a implementação da classe */</em>
    • Declaração das variáveis da classe que são as static, onde primeiro se declaram as variáveis public, depois as protected, por conseguinte as de nível de pacote(sem a declaração do modificador de acesso), e por fim as private.
    • /**
      *  comentario de documentacao da varClasse1
      */
      public static int varClasse1;
      
      /**
      *  comentario da varClasse2 que possui
      *  mais de uma linha
      */
      private static Object varClasse2;
    • Declaração das variáveis de instância, seguindo o mesmo padrão das de classe.
    • /**
      * comentario de documentacao da varInstancia1
      */
      public Object varInstancia1;
      
      /**
      * comentario de documentacao da varInstancia2
      */
      protected int varInstancia2;
      
      /**
      * comentario de documentacao da varInstancia3
      */
      private Object[] varInstancia3;
    • Construtores da classe
    • /**
      * comentario de documentacao do contrutor Blah
      */
      public Blah() {
      
      // ...implementação aqui...
      }
    • Métodos – é recomendado agrupar os métodos por funcionalidade, não por escopo ou acessibilidade.
    • /**
      *  comentario de documentacao do metodo fazAlgo
      */
      public void fazAlgo() {
      
      // ...implementação aqui...
      }

É isso por enquanto, no próximo post pretendo abordar as convenções para identação, indentação ou endentação, como preferir, já que esta palavra não existe no português.

out 14

Biblioteca de componentes para JSF 2

Venho aqui neste post recomendar apenas, para quem quer utilizar JSF 2, e estava acostumado a utilizar richfaces, que para a versão 2 do JSF não está ainda com versão estável, recomendo o primefaces , que é uma suite de componentes muito completa, de muito fácil utilização. Bastando apenas baixar o jar do primefaces, e adicionar a suas páginas o namespace xmlns:p=”http://primefaces.prime.com.tr/ui”. No site, há um livedemo, que mostra cada componente, e o código de sua utilização.


Um problema apenas que eu tive em utilizá-lo, foi quando tive que usar outro componente que utilizava jquery em mesma página que estivesse utilizando o primefaces, pois como ele utiliza o jquery embutido no jar, ele acaba referenciando o arquivo jquery errado, o que faz com que os componentes não funcionem.

Mas se você não for usar outro componente que utilize jquery também, é uma ótima pedida o primefaces.

out 11

Tratar exceção de unique constraint com JPA 2 e Hibernate

Em uma aplicação simples de cadastro, quando se tem campos únicos, como por exemplo cadastro de usuários, onde o nome do usuário não pode se repetir é interessante mostrar para o usuário qual o erro resultante do não cadastramento dos seus dados. No código abaixo eu tenho uma transação que persistirá um objeto do tipo usuário.

em.getTransaction().begin();
em.persist(usuario);
em.getTransaction().commit();

Porém a exceção lançada pelo JPA 2 é apenas PersistenceException, o que não diz muita coisa. Porém ela contém a cadeia de exceções lançadas desde o provider do banco de dados. Logo, uma alternativa para se descobrir qual a causa raiz da exceção é iterar pela causa da exceção, até chegar a BatchUpdateException, que é a exceção que contém uma SQLException como nextException. Esta SQLException é necessária para se extrair o nome da restrição que gerou a exceção.

catch (PersistenceException e) {

			 Throwable lastCause = e;
			 String constraintName =null;
			 while (lastCause != null){
		    	     if(lastCause.toString().startsWith("java.sql.BatchUpdateException")){
		    		     BatchUpdateException bu = (BatchUpdateException) lastCause;
		    		     constraintName = PersistenceUtil.getViolatedConstraintNameExtracter().
                                                      extractConstraintName(bu.getNextException());

		    	     }
		    	  lastCause = lastCause.getCause();

			  }

			   if(constraintName !=null){
		               throw new ConstraintViolationException("Mensagem",
                                     new SQLException(), constraintName);

		          }
        }

Para se extrair o nome da restrição é necessário utilizar o seguinte código.

public static ViolatedConstraintNameExtracter getViolatedConstraintNameExtracter() {

        return EXTRACTER;
   }

	private static ViolatedConstraintNameExtracter EXTRACTER =
           new TemplatedViolatedConstraintNameExtracter() {

	      /**
	       * Extract the name of the violated constraint from the given SQLException.
	       *
	       * @param sqle The exception that was the result of the constraint violation.
	       * @return The extracted constraint name.
	       */
	      public String extractConstraintName(SQLException sqle) {
	         String constraintName = null;

	         int sqlError = Integer.valueOf(JDBCExceptionHelper.extractSqlState(sqle));

	         if(sqlError == 23505){

	            constraintName = extractUsingTemplate("violates unique constraint \"","\"",
                                      sqle.getMessage());
	         }	         

	         return constraintName;
	      }

	   };

Onde ViolatedConstraintNameExtracter é uma interface do pacote org.hibernate.exception e TemplatedViolatedConstraintNameExtracter é a classe abstrata que implementa esta interface.
É necessário implementar o método extractConstraintName(SQLException sqle) herdado da interface.
Nele eu verifico qual o código de erro, utilizando o JDBCExceptionHelper do pacote org.hibernate.exception. No meu caso eu estou utilizando PostgreSQL, e neste endereço: http://www.postgresql.org/docs/8.1/interactive/errcodes-appendix.html temos todos os códigos de erro gerados.
Dependendo do código de erro eu utilizo o método extractUsingTemplate da classe TemplatedViolatedConstraintNameExtracter, passando como parâmetros o padrão da mensagem até o início do nome da restrição, o padrão da mensagem após o nome da restrição e a mensagem da SQLException.

Está um pouco confuso, mas realmente é bem chato tratar essa exceção usando JPA 2, mas basicamente utilizando esses códigos e fazendo as devidas personalizações para a sua aplicação, você conseguirá resolver esse problema.

out 09

Java Básico – Por que utilizar interfaces

Uma interface é basicamente um conjunto de métodos com o corpo vazio. Então você se pergunta, pra que eu quero métodos sem corpo? Vou mostrar um exemplo básico e espero que possam compreender sua utilização.

Digamos que você tenha que desenvolver um aplicativo que simule uma corrida de carros, e na sua equipe temos 3 desenvolvedores(d1, d2 e d3) e um líder de projeto(l1).  E esse líder passa para cada desenvolvedor a responsabilidade de implementar um tipo de carro: d1 desenvolve uma ferrari, d2 uma mclaren e d3 um fusca. O que vai sair disso? Um carnaval de atributos e métodos, cada um vai definir o que achar conveniente, caso o líder não estipule algum padrão. Esse padrão se dá com a utilização da interface.


Um exemplo de uma interface para um carro de corrida seria:

public interface Carro{
     public void acelerar(int incremento);
     public void frear(int decremento);
     public void trocarMarcha(int proximaMarcha);
}

Assim a partir dessa interface uma classe de um fusca poderia ficar da seguinte maneira:

public class Fusca implements Carro{
     int velocidade;
     int marcha;

    public Fusca(){
         this.velocidade = 0;
         this.marcha =0;
    }
    public void acelerar(int incremento){
         this.velocidade += incremento;
    }
    public void frear(int decremento){
         this.velocidade -= decremento;
    }

     public void trocarMarcha(int proximaMarcha){
          this.marcha = proximaMarcha;
     }
}

É isso aí, é bem simples, mas muito útil!

out 07

Bibliotecas no Eclipse

Um detalhe que vou atentar aqui foi um problema que estava passando, e procurando no google a única solução que o pessoal mostrava era  para rever meu classpath.

O problema: CLASS NOT FOUND EXCEPTION de uma classe contida dentro do jar do hibernate. Porém todos os jar estavam direitinho dentro do classpath e também dentro de WEB-INF/lib. O único porém: os arquivos jar estavam dentro de uma subpasta : WEB-INF/lib/hibernate. Isso não dá erro de compilação, gera apenas warning, avisando de possível lançamento da exceção em tempo de execução.

Fica aí a dica: sempre coloque seus jar diretamente abaixo da WEB-INF/lib, nada de querer organizar direitinho por subpastas, pois pode lançar esta exceção, nem sempre ocorre, mas é melhor não correr esse risco!

out 07

Caça níqueis digital

Estava eu passeando pela internet quando de repente vejo um site de leilão on-line. Porém não é um leilão comum como e-bay ou mercado livre, é o que chamam de penny-auction, ou leilão de moeda de um centavo. À primeira vista parece atraente, são ofertados produtos bem caros, como por exemplo: notebooks, playstation 3, etc, começando no valor às vezes de 0 reais, e a cada lance é incrementado 1 centavo no valor de compra. Você deve estar pensando “Nossa, vou arrematar um play 3 a preço de banana!”.

Mas, como tudo tem um porém, para poder dar lances, você precisa comprá-los,  há vários pacotes de lances, onde vende-se por ex: 30 lances a 30 reais, 50 lances a 45 reais, entre outros pacotes. Mesmo assim você pode pensar que ainda está no lucro, é aí que você se engana e que vem a grande sacada dos caras em ganhar dinheiro em cima das pessoas: O leilão dura um tempo mínimo, às vezes 30 s, outras 15, sempre em torno de segundos, mas, porém, contudo, no entanto a cada lance o cronômetro é zerado!!! O que pode resultar em: leilões infinitos, ou, você se cansar de dar lances, perder o dinheiro e não levar nada!!!!!!!  Observando um leilão durante alguns minutos percebi que muita gente fica dando vários lances, onde a maior parte deles só vai servir para engordar a conta bancária da empresa!! E pior, depois essas pessoas vão lá no site Reclame Aqui para pedir o dinheiro de volta. Peraí, ninguém mandou querer dar uma de esperto e jogar o dinheiro no lixo!

É minha gente, fiquem espertos, não existe almoço grátis, nem tudo é o que parece.

out 06

Manipulando XML com XStream

Documentos XML são muito utilizados por nós programadores, e as APIs para seu processamento mais famosas(DOM e SAX) são bem úteis e relativamente fáceis de utilizar. Mas quando se trata de agilidade no desenvolvimento do tratamento de XML, não conte com essas APIs. Se você precisa manipular XML e está com o prazo apertado, experimente a biblioteca XStream.No site deles você deve baixar o .jar e também possui alguns exemplos de como utilizar.

Com ela você pode transformar seus documentos XML em objetos java e vice-versa, com pouquíssimas linhas de código.  Basta você criar a sua classe com a estrutura do XML ou a estrutura desejada, necessitando algumas diretrizes, e mandar ele gerar/ler o XML.

Um exemplo simples é o seguinte: quero gerar um documento XML de leiaute para validações. Sua estrutura basicamente é:

<leiaute>
  <metadados>
    <nome></nome>
    <metadado>
      ...
    </metadado>
    <metadado>
     ...
    </metadado>
  </metadados>
</leiaute>

para isso eu crio uma classe ObjXML, uma classe Metadados, e outra Metadado como vistas abaixo:

<code>
public class ObjXML {</code>

  private List conjunto_metadados;

  public List getLeiaute() {
    return conjunto_metadados;
  }

  public void setLeiaute(List metadados) {
    this.conjunto_metadados = metadados;
  }
}

<code>
public class Metadados {
  private String nome;
  private List metadados;</code>

<code>
  public String getNome() {
   return nome;
  }
  public void setNome(String nome) {
    this.nome = nome;
  }
  public List getMetadados() {
    return metadados;
  }
  public void setMetadados(List metadados) {
    this.metadados = metadados;
  }
}
</code>
<code>
public class Metadado {
  private String metadado;</code>

  public String getMetadado() {
    return metadado;
  }
  public void setMetadado(String metadado) {
    this.metadado = metadado;
  }
}

Com isso após tratar o carregamento dos dados no objeto basta escrevermos o seguinte:

<ol>

	<li>XStream xStream = new XStream(new DomDriver());</li>


	<li>File xml = new File("nome_do_arquivo.xml");</li>


	<li>FileOutputStream os = new FileOutputStream(xml);</li>


	<li>xStream.alias("leiaute", objXML.getClass());</li>


	<li>xStream.alias("metadado", Metadado.class);</li>


	<li>xStream.alias("metadados", Metadados.class);</li>


	<li>xStream.addImplicitCollection(objXML.getClass(), "conjunto_metadados");</li>


	<li>xStream.addImplicitCollection(Metadados.class, "metadados");</li>


	<li>xStream.toXML(objXML,os);</li>

</ol>

Na linha 1 instancio um objeto Xstream passando como parâmetro o parser.
Na linha 2 crio o arquivo de saida e na 3 o outputstream para escrever no arquivo.
Nas linhas 4,5 e 6 seto o nome das tags desejadas para minhas classes objXML,Metadados e Metadado. É necessário apenas fazer o alias para a tag raiz do documento.
Nas linhas 7 e 8, eu digo que não quero que as coleções apareçam no documento.
E por fim na linha 9 eu executo o método de criação do arquivo passando o objeto a ser transformado e o arquivo a ser escrito.
E pronto sem muita firula, você consegue gerar um documento XML válido.