quinta-feira, 7 de agosto de 2014

Change JBoss Locale

Versão em português

Hello,

Today I had problems with numeric fields and dates. I typed 20,00 and was displayed 2000. I also had problems with the display of dates.

The problem didn't happen in de development machines, just in homologation machines, because the default locale was different in this environments.

In your eclipse:
- Go to in "Server
- Double-click at JBoss
- Click in "Open Launch Configuration"
- Type at the end of "VM Arguments" field: -Duser.language=pt -Duser.country=BR

But to start JBoss with command line, it doesn't work:
standalone.bat -Duser.language=pt -Duser.country=BR

You need to change the configuration files.

In Windows environments, you must add the following line in the file standalone.conf.bat
set "JAVA_OPTS=%JAVA_OPTS% -Duser.language=pt -Duser.country=BR"

In Linux environments, you must add the following line in the file standalone.conf
JAVA_OPTS="$JAVA_OPTS -Duser.language=pt -Duser.country=BR"

Best Regards!
Adriano Schmidt

PS: My English isn't very good, if you see something wrong please let me know.

Mudar Locale do JBoss

English version

Olá,

Hoje tive problemas com campos numéricos e com datas. Eu digitava 20,00 e ele virava 2000 e outras loucuras assim pois trocava vírgula com ponto e vice-versa, também alguns campos de data estavam aparecendo Feb, 08, 2014 e não 08/02/2014.

Nas máquinas dos desenvolvedores não acontecia isto, porém, no ambiente de homologação acontecia. Os desenvolvedores tinham máquina cujo Locale default era pt_BR (português do Brasil) já no servidor era en_US (inglês dos Estados Unidos).

O ideal é você tratar isso na sua aplicação, porém, pode ser resolvido mudando o locale do JBoss.

No eclipse é só você ir na aba servers, dar dois cliques no seu JBoss, clicar em "Open Launch Configuration" e adicionar os seguintes parâmetros em VM Arguments:
-Duser.language=pt -Duser.country=BR

Já quando você for iniciar via linha de comando NÃO pode simplesmente adicionar dessa forma:
standalone.bat -Duser.language=pt -Duser.country=BR

Dessa forma não funciona, é preciso alterar os arquivos de configuração:

Em ambiente windows precisa alterar o arquivo standalone.conf.bat adicionando a linha abaixo após as outras linhas semelhantes a ela:
set "JAVA_OPTS=%JAVA_OPTS% -Duser.language=pt -Duser.country=BR"

Em ambiente linux precisa alterar o arquivo standalone.conf adicionando a linha abaixo ao final do arquivo:
JAVA_OPTS="$JAVA_OPTS -Duser.language=pt -Duser.country=BR"

Abraço!
Adriano Schmidt

domingo, 20 de julho de 2014

Atualizar nextval oracle

Pessoal, tenho uma tabela que um monte de gente inseriu dados na mão e não respeitou a sequence.

Então utilizei este script para atualizar o nextval da sequence com o max()+1 da coluna id.


declare
  v_prox_numero number;
  v_numero_atual number;
  v_novo_numero number;
  v_numero number;
 
  v_texto varchar2(100);
begin
 
  select max(t.id)+1
    into v_prox_numero
    from nome_tabela t;
   
  select nome_sequence.nextval
    into v_numero_atual
    from dual;
   
  v_novo_numero := (v_prox_numero - v_numero_atual)+1;
 
  if v_novo_numero > 0 then
    for reg_seq in 1..v_novo_numero loop
       
      select nome_sequence.nextval
      into v_numero
      from dual;
   
    end loop;
  end if;
end;


Créditos à Ana Karina Pereira.

Abraços!
Adriano Schmidt

quinta-feira, 10 de julho de 2014

Join HQL

Quando no Java temos uma Entidade que tem uma lista de outra entidade.
E vamos fazer uma consulta com HQL (Hibernate Query Language) e precisamos acessar um atributo de um item da lista precisamos fazer um JOIN.

Segue um exemplo bem básico de como podemos fazer:

select a from TabelaA a inner join a.bList b inner join b.c.dList d where d.id = :id"

select a from TabelaA a, in (a.bList) b, in (b.c.dList) d where d.id = :id

Abraço!
Adriano Schmidt

sexta-feira, 4 de julho de 2014

Boas práticas - Rest

Pessoal...

Estou trabalhando com alguns projetos utilizando Rest. Montei esse e-mail para enviar à equipe de desenvolvimento e resolvi publicar aqui também.

A ideia é utilizar o conceito de RESTful utilizando as melhores práticas de desenvolvimento. Darei algumas dicas simples que podemos seguir:

1) Não usar verbos nos paths dos Rests:

Você não pode ter um localhost:8080/myapp/rest/deletarProduto e dar um HTTP GET nele.

Tem que ser um localhost:8080/myapp/rest/produto e você dá um HTTP DELETE nele



Tem alguns casos especiais (somarValores, checarSeEmailTemFormatoValido ou algoasism...) que são um pouquinho diferentes.. em outra oportunidade falarei mais sobre isso..


2) Passagem de parâmetros através de queryString do método GET

<URL>?parametro1=valor1&parametro2=valor2

Isso deve ser usado para filtros no HTTP GET de localhost:8080/myapp/rest/produto?apenasAtivos=true

Na implementação, basta utilizar @QueryParam ao invés de @PathParam


3) Sempre retornar um Response (javax.ws.rs.core.Response;)

Nunca retorne uma coleção de entidades ou uma string diretamente... encapsule em um Response para poder passar o HTTP Status adequadamente.

return Response.ok(banners).build();
ou outro Status:
return Response.status(Status.FORBIDDEN).build();


4) Sempre retornar JSON de forma automática:
Basta adicionar a linha abaixo acima do método no Rest:
@Produces(MediaType.APPLICATION_JSON)

Não faça a conversão de objetos para JSON na mão.


5) Atualização parcial:
Existem casos onde você não quer atualizar um registro inteiro, e sim apenas uma propriedade dele, atualizar um status por exemplo.

O @PUT é pra atualização, mas ele é pra atualizar o objeto inteiro.

Para isso existe o @PATCH, mas não sei se ele é padrão, se todos os servidores de aplicação tem.

Uma outra ideia é fazer vários @PUT, fica bacana também:

PUT localhost:8080/myapp/rest/livro/{id}/propriedadeX
PUT localhost:8080/myapp/rest/livro/{id}/propriedadeY

Outra ideia é ter um @PUT pra atualizar o objeto inteiro e um @PUT que recebe um Map com os atributos a serem atualizados e seus novos valores.


6) Não implemente todos os métodos
Não é necessário implementar todos os métodos se eles não serão usados. Por exemplo, se é um objeto só vai ter um @GET não é necessário implementar o @POST, o @PUT e o @DELETE.

No máximo faça o método no Rest que retorna um status de erro informando que não foi implementado.


Mais:
Mais detalhes e para quem quiser estudar mais sobre Rest recomendo o artigo abaixo:
http://www.devmedia.com.br/construindo-uma-restful-api-parte-1/29904
http://www.devmedia.com.br/restful-api-construindo-uma-api-simples-parte-2/30069

Na Supero (empresa que trabalho) temos conta MVP no devmedia, caso você não tenho recomendo fazer, é um investimento muito válido!

Abraços!
Adriano Schmidt

quarta-feira, 25 de junho de 2014

Tunning de aplicações Java

Pessoal.. vou postar aqui alguns itens que sempre recomendo para melhorar o desempenho de uma aplicação Java.

Fazer testes de desempenho ou analisar as aplicações com JMeter, NewRelic, VisualVM, jConsole é o mundo ideal! Através disso é possível identificar os gargalos da aplicação! Os pontos que mais utilizam recursos computacionais como memória e processador por exemplo.

Configurar adequadamente a memória utilizada.. ou seja, estude xms, xmx, maxpermgen..
Uma dica é sempre colocar o xms e o xmx igual em ambiente de produção. E o ideal não é simplesmente colocar o valor mais alto possível, é preciso analisar qual é o valor ideal, e isso é descoberto através de testes e monitoramento, ou através do feeling e analisando com o tempo como a aplicação se comporta.

Recomendo utilizar a JRockit como JVM. Ela é mantida pela Oracle também e tem um gerenciamento de memória muito melhor que das outras JVMs, o garbage collector funciona bem melhor.
Mas só tem pra Java 6, mas em todos os clientes que atuo, sempre que possível, implanto a JRockit, é notável o ganho obtido no uso de recursos computacionais como memória.

Dá pra fazer tunning também de acordo com a tecnologia que você está usando.. JSF... JMS... pool de EJB... Banco de dados...

Dá pra monitorar a aplicação pelo jenkins também, fazer um job que checa a memória e qualquer avisa a equipe de infra ou até reinicia, dá pra usar o nagios...

Etc... Existem milhões de outras coisas que podem ser feitas, mas como escrevi esse texto para ajudar um amigo, resolvi postá-lo aqui para talvez ajudar outras pessoas também.

Abraços!
Adriano Schmidt

quarta-feira, 18 de junho de 2014

Trabalhando com 2 repositórios Git

Pessoal.. temos um repositório Git na minha empresa e todos os desenvolvedores fazem commit e push lá. E de tempos em tempos fazemos o push desses fontes para o repositório Git que fica no nosso cliente.

Vou explicar uma estratégia simples e comumente usada nesse cenário.

Com essa estratégia que vou explicar você mantém o histórico de commits e permite a realização de merges caso outras pessoas commitem no mesmo projeto no repositório do cliente.

Seguinte:

No Git, cada commit tem um id.. que é um hash único...

Quando você tem 2 repositórios, um commit deve ter o mesmo id nos 2 repositórios...

O histórico de commits de um, será o mesmo no outro... geralmente é muito importante manter o histórico dos commits...

Para isso, você adiciona dois remotes no seu projeto (no nosso caso era só adicionar o segundo, já que o primeiro já tínhamos)

git remote add origin http://www.minhaempresa.com.br/git/projeto.git
git remote add cliente http://www.meucliente.com.br/git/projeto.git

Depois é só você escolher onde quer fazer push

git push origin master

ou

git push cliente master

Você pode até dar um git config e definir qual dos dois remotes é o padrão para quando você digitar apenas "git push" ele saber qual usar.

É isso!

Abraços!
Adriano Schmidt

terça-feira, 17 de junho de 2014

Seminário JBoss/WildFly - Avançado

Nesse sábado (14/06/2014) aconteceu o primeiro Supero TechDay!

Estou muitíssimo feliz pelo evento! Todo mundo muito empolgado trocando conhecimentos e experiências.

Valeu muito à pena! Estou muito orgulhoso e feliz por trabalhar na Supero TI (www.supero.com.br) e muito satisfeito por estar numa equipe com tanta gente bacana!

Neste evento fiz uma apresentação onde explanei sobre o JBoss e sua mais nova versão o WildFly. Abordei a história, arquitetura, funcionamento e dicas sobre o JBoss/WildFly e mostrei em funcionamento um ambiente com um Apache HTTP Server como load balancer e proxy reverso com vários JBoss em cluster.



Não poderia deixar de agradecer ao JBUG Brasil e todos os seus membros, especialmente ao Maurício Magnani (https://jbossdivers.wordpress.com/), que me ajudaram muito a ter o conhecimento que tenho hoje sobre JBoss.

segunda-feira, 16 de junho de 2014

Cuidados ao entrar num projeto novo

Pessoal... queria dar algumas dicas para quando você for entrar um projeto novo...

1) Ctrl+Shift+F
Nunca dê um Ctrl+Shift+F no projeto inteiro.. nem na classe que você está alterando...

Um Ctrl+Shift+F atrapalha muito a realização de merges e de certa forma faz você perder o histórico de alterações no controle de versão, pois vai ser difícil comparar algo com uma versão antiga pois vai estar com uma formatação toda diferente.

Se você está criando uma classe nova, tudo bem, mas muito cuidado ao mexer em códigos já existentes.

Caso você crie um método novo, você pode selecionar esse método, e dar um Ctrl+Shif+F, pois vai formatar apenar o trecho de código selecionado, mantendo intacto o resto da classe.

Tem até como criar um xml de formatação no eclipse e depois as outras pessoas podem importar em seus eclipses, mas acho muito trabalhoso manter isso.

Caso seja decidido aplicar algo no projeto inteiro, isso deve ser bem pensado, nunca é só chegar e fazer.

2) Encoding no eclipse
Antes de salvar uma classe verifique se o encoding do projeto no seu eclipse está correto, veja se os acentos não vão virar caracteres estranhos..
Isso é muito comum quando uma equipe usa windows e entra alguém que usa linux ou vice-versa.
Para mudar o encoding do seu projeto no eclipse é só ir nas propriedades do projeto no eclipse.

Caso você ache que o encoding poderia ser outro, converse com a equipe, nunca chegue e mude por conta própria.

3) Encoding no maven
Nunca altere o encoding do projeto no maven colocando no pom a linha abaixo:
UTF-8

Se for fazer isso converse com alguém que já está no projeto ou então você deve saber o que está fazendo.. uma dica é, se for fazer, faça apenas local.

4) Não use acentos em comentários
O título é auto explicativo, a ideia é simples, se não tem acentos, diminui a probabilidade de problemas com encoding. Ah, e sempre é bom falar, em nome de variável também não se deve usar ç ou coisas assim.

Essas simples ações tornam o ambiente de trabalho melhor, faça o bem sem olhar a quem! :D

PS: Escrevi tudo isso e mandei para todos os desenvolvedores da empresa que trabalho depois de passar muitas horas (muitas mesmo) fazendo um merge de um projeto gigante e corrigindo caracteres especiais. Então, não falo por mal, falo para evitar que outras pessoas passem por esse sofrimento.

Abraços!
Adriano Schmidt

domingo, 15 de junho de 2014

Deletar todas as tabelas de um banco de dados Oracle

Script que deleta todas as tabelas do banco:

begin
 for deleta in (select table_name, 'DROP TABLE '||table_name||' cascade constraints' AS dropar from user_tables) loop
 BEGIN
  EXECUTE IMMEDIATE deleta.dropar;
  dbms_output.put_line('DROP TABLE '||deleta.table_name||' cascade constraints;');
  EXCEPTION WHEN OTHERS THEN
  dbms_output.put_line('Erro ao tentar dropar a tabela:'||deleta.table_name);
 END;
 end loop;
end;

Simples e rápido!

Para deletar todas as sequences do banco é só rodar o seguinte comando:

begin
 for deleta in (select sequence_name, 'DROP SEQUENCE '||sequence_name||' ' AS dropar from user_sequences) loop
 BEGIN
  EXECUTE IMMEDIATE deleta.dropar;
  dbms_output.put_line('DROP SEQUENCE '||deleta.sequence_name||' ;');
  EXCEPTION WHEN OTHERS THEN
  dbms_output.put_line('Erro ao tentar dropar a tabela:'||deleta.sequence_name);
 END;
 end loop;
end;

Fonte: http://golker.blogspot.com.br/2009/05/dropar-todos-os-tipos-e-tabelas-no.html

Abraço!
Adriano Schmidt