Fala pessoal,
Em um projeto nosso foi commitado um arquivo chamado .factorypath o que fez com que aconteceu um erro na máquina de outro desenvolvedor que gastou um tempinho até descobrir o problema.
Um dos motivos foi que esse arquivo não estava no .gitinore, outro motivo foi que o primeiro desenvolvedor não verificou que estava commitando algo que ele não mexeu, outro motivo foi que o segundo desenvolvedor não verificou o que estava baixando.
Então, enviei um e-mail para a equipe de desenvolvimento dando 3 dicas sobre Git para evitarmos problemas:
1) Usem adequadamente o .gitignore, sempre coloquem nele tudo que não deve ser commitado. Coloquei no github um exemplo de .gitinore que deve estar na raiz do projeto. Lembrando que cada projeto tem suas peculiaridades e pode ser um pouco diferente. https://gist.github.com/adrianoschmidt/9ad13b49b702168e4bf8
2) Usem o Git Command Line. O plugin do eclipse é legal, ajuda muito, mas tente usá-lo para coisas simples como commit e push. Se for fazer um merge, reset, stash ou coisas que saem do que você faz com frequência e que você não tem certeza que o plugin do eclipse vai funcionar 100%, use a linha de comando.
3) Tome cuidado! Não commite sem antes olhar o que você está commitando, às vezes você mexeu sem querer num arquivo e não deveria subir ele, às vezes você deu um CTRL+SHIFT+F num arquivo inteiro e no projeto não podia fazer isso. Principalmente se é a primeira vez que você está trabalhando no projeto ou se fez alguma grande alteração, tome muito cuidado. Quando for a primeira vez que commitar num projeto, ou quando fizer grandes alterações ou merges, acesse o git.supero.com.br e verifiquem se o que vocês fizeram está lá certinho, se não desfez algo que outra pessoa fez ou algo assim.
É isso pessoal. Pequenas ações podem evitar grandes problemas : )
Abraço!
Adriano Schmidt
segunda-feira, 17 de novembro de 2014
segunda-feira, 10 de novembro de 2014
InternetAccessValidator
Hoje a internet caiu aqui na minha casa...
Eu estava testando se voltava de 5 em 5 minutos... então resolvi fazer um programa Java que fizesse isso pra mim.
Ele verifica se o computador tem acesso à internet. Caso não tenha, tenta novamente após 10 segundos até ter acesso, e quando tiver, fará o computador dar 5 beeps.
Interessante para aprender a executar comandos no sistema operacional e aprender a fazer um beep.
Segue fonte: https://github.com/adrianoschmidt/InternetAccessValidator/blob/master/src/br/com/localhost8080/iav/InternetAccessValidator.java
Abraços!
Adriano Schmidt
Eu estava testando se voltava de 5 em 5 minutos... então resolvi fazer um programa Java que fizesse isso pra mim.
Ele verifica se o computador tem acesso à internet. Caso não tenha, tenta novamente após 10 segundos até ter acesso, e quando tiver, fará o computador dar 5 beeps.
Interessante para aprender a executar comandos no sistema operacional e aprender a fazer um beep.
Segue fonte: https://github.com/adrianoschmidt/InternetAccessValidator/blob/master/src/br/com/localhost8080/iav/InternetAccessValidator.java
Abraços!
Adriano Schmidt
sábado, 11 de outubro de 2014
Alterar usuário/senha/url no GIT
Para alterar usuário ou senha de projeto no GIT basta seguir os seguinte passos:
Acesse pelo prompt de comandos a pasta do seu projeto.
Rode o comando abaixo para ver o usuário utilizado:
$ git config --get remote.origin.url
http://AdrianoSchmidt:minhasenha@git.localhost8080.com.br/git/projeto/projeto.git
Rode o comando abaixo para remover o usuário e senha (na verdade remove a URL inteira)
$ git config --unset remote.origin.url
Rode o primeiro comando novamente e veja que não existe mais valor para essa variável
$ git config --get remote.origin.url
Rode o comando abaixo atualizando o usuário ou senha:
$ git config --add remote.origin.url http://AdrianoSchmidt:novasenha@git.localhost8080.com.br/git/projeto/projeto.git
Verifique novamente e veja se está como desejado:
$ git config --get remote.origin.url
http://AdrianoSchmidt:novasenha@git.localhost8080.com.br/git/projeto/projeto.git
Ou rode o comando abaixo e edite direto a propriedade:
$ git config --edit
Abraços!
Adriano Schmidt
Acesse pelo prompt de comandos a pasta do seu projeto.
Rode o comando abaixo para ver o usuário utilizado:
$ git config --get remote.origin.url
http://AdrianoSchmidt:minhasenha@git.localhost8080.com.br/git/projeto/projeto.git
Rode o comando abaixo para remover o usuário e senha (na verdade remove a URL inteira)
$ git config --unset remote.origin.url
Rode o primeiro comando novamente e veja que não existe mais valor para essa variável
$ git config --get remote.origin.url
Rode o comando abaixo atualizando o usuário ou senha:
$ git config --add remote.origin.url http://AdrianoSchmidt:novasenha@git.localhost8080.com.br/git/projeto/projeto.git
Verifique novamente e veja se está como desejado:
$ git config --get remote.origin.url
http://AdrianoSchmidt:novasenha@git.localhost8080.com.br/git/projeto/projeto.git
Ou rode o comando abaixo e edite direto a propriedade:
$ git config --edit
Abraços!
Adriano Schmidt
quinta-feira, 14 de agosto de 2014
NLS_SORT Oracle
Versão em Português
Today I had problems to order uppercase and lowercase letters in the Oracle database.
Running the following command solved the problem:
ALTER SESSION SET NLS_SORT = WEST_EUROPEAN;
This problem occurred in the client environment but not locally because the NLS_SORT parameter was setted to "BINARY" (responsible for sorting [AZ to az]), and what we needed it to be the "WEST_EUROPEAN" [Aa to Zz] standard.
The trigger below changes the value of the NLS_SORT parameter whenever a session starts in the schema. Do not forget to change the schema name.
Kind regards!
Adrian Schmidt
Today I had problems to order uppercase and lowercase letters in the Oracle database.
Running the following command solved the problem:
ALTER SESSION SET NLS_SORT = WEST_EUROPEAN;
This problem occurred in the client environment but not locally because the NLS_SORT parameter was setted to "BINARY" (responsible for sorting [AZ to az]), and what we needed it to be the "WEST_EUROPEAN" [Aa to Zz] standard.
The trigger below changes the value of the NLS_SORT parameter whenever a session starts in the schema. Do not forget to change the schema name.
create or replace trigger PARAM_SESSION_TRIG after logon on NomeDoSchema.schema begin execute immediate 'ALTER SESSION SET NLS_SORT=WEST_EUROPEAN'; end;
Kind regards!
Adrian Schmidt
NLS_SORT Oracle
English version
Hoje tive problemas com ordenação entre letras maiúsculas e minúsculas no banco de dados Oracle.
Executando o comando abaixo resolveu:
ALTER SESSION SET NLS_SORT=WEST_EUROPEAN;
Este problema aconteceu no ambiente do cliente mas não localmente, pois o parâmetro nls_sort estava setado como "BINARY" (responsável pela ordenação [AZ a az]), e precisávamos que fosse o padrão "WEST_EUROPEAN" [Aa a Zz] .
A trigger abaixo altera o valor do parâmetro nls_sort sempre que inicia-se uma sessão no schema. Não esqueça de alterar o nome do schema.
Abraços!
Adriano Schmidt
Hoje tive problemas com ordenação entre letras maiúsculas e minúsculas no banco de dados Oracle.
Executando o comando abaixo resolveu:
ALTER SESSION SET NLS_SORT=WEST_EUROPEAN;
Este problema aconteceu no ambiente do cliente mas não localmente, pois o parâmetro nls_sort estava setado como "BINARY" (responsável pela ordenação [AZ a az]), e precisávamos que fosse o padrão "WEST_EUROPEAN" [Aa a Zz] .
A trigger abaixo altera o valor do parâmetro nls_sort sempre que inicia-se uma sessão no schema. Não esqueça de alterar o nome do schema.
create or replace trigger PARAM_SESSION_TRIG after logon on NomeDoSchema.schema begin execute immediate 'ALTER SESSION SET NLS_SORT=WEST_EUROPEAN'; end;
Abraços!
Adriano Schmidt
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.
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
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
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
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¶metro2=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
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¶metro2=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
Assinar:
Postagens (Atom)
