quinta-feira, 19 de fevereiro de 2015

Alterar autor commit git

Para alterar o autor do seu último commit no Git basta fazer:

git commit --amend --author "Novo nome <email@email.com>"

Para alterar o nome e email em todos os commits de uma determinada pessoa é só fazer assim:

git filter-branch -f --commit-filter 'if [ "$GIT_AUTHOR_NAME" = "Adriano Ximit" ];
then export GIT_AUTHOR_NAME="Adriano Schmidt"; export GIT_AUTHOR_EMAIL=adriano@localhost8080.com.br;
fi; git commit-tree "$@"'

E assim também (pois caso contrário você só alterou o autor, mas o commiter não):

git filter-branch -f --commit-filter 'if [ "$GIT_COMMITTER_NAME" = "Adriano Ximit" ];
then export GIT_COMMITTER_NAME="Adriano Schmidt"; export GIT_COMMITTER_EMAIL=adriano@localhost8080.com.br;
fi; git commit-tree "$@"'

Depois de alterar você tem que dar um push... provavelmente com um --force

git push --force

Fontes:
http://stackoverflow.com/questions/750172/change-the-author-of-a-commit-in-git
http://stackoverflow.com/questions/4493936/git-could-i-change-my-name-and-surname-in-all-previous-commits

Abraço!!
Adriano Schmidt

quinta-feira, 12 de fevereiro de 2015

Como saber qual é o JSP em um projeto Struts?

Estou mexendo em um projeto bem antigo e precisei encontrar os arquivos JSP de cada tela que eu abria.

A partir da URL abaixo vamos descobrir o JSP

http://localhost:8080/meuprojeto/usuario.do?action=listarUsuarios

Primeiro vá no UsuarioAction (por causa do usuario.do)
Nesta classe, vá no método listarUsuarios (por causa da action)
Veja o que esse método retorna (por exemplo: return "listar";)

public ActionForward listarUsuarios(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
[...]
return mapping.findForward("listar");
}

Vá no struts-config.xml
Procure por UsuarioAction
Logo abaixo procure por "listar" (retorno do método)
Na linha do "listar" vai dizer qual é o jsp

<action path="/usuario" type="br.com.localhost8080.struts.UsuarioAction" name="usuarioForm" scope="request" parameter="action">
<forward name="listar" path="/p_listar_usuarios.jsp" />

Qualquer coisa dá um Ctrl+H com algum texto da tela :D

Att,
Adriano Schmidt

quarta-feira, 11 de fevereiro de 2015

Parar JBoss em uma linha de comando

Fala galera...

Se você quiser parar o JBoss, você pode fazer um "ps aux | grep jboss", pegar o PID e depois dar um "kill -9 <pid>"

Mas é possível fazer isso em uma linha, isso é importante caso queira fazer isso no Jenkins ou em algum script

A linha é essa:

kill -9 `ps -wef |grep jboss | grep jboss-eap-6.2 | grep -v grep |cut -c10-14` ;

No meu caso é o JBoss EAP 6.2, então eu coloquei tudo isso ali no grep pra ele nunca pegar outro processo. Altere conforme sua necessidade.

Esse comando já pega o processo certo, pq quando você dá o "ps aux | grep jboss", ele lista dois processos, o primeiro é o próprio ps aux grep... esse comando já pega o processo certinho.

E o cut é pra pegar o PID mesmo... que estará do caracter 10 ao 14.

Abraço!
Adriano Schmidt

sexta-feira, 6 de fevereiro de 2015

Java InputStream e Encoding

Pessoal... ao ler um arquivo no Java todos os caracteres especiais (letras com acento por exemplo) ficaram desconfigurados. Ficaram assim: �

Quando eu executava no Windows funcionava perfeitamente, mas no linux ficava desconfigurado.

Isso acontecia pois eu estava lendo o arquivo dessa forma:

InputStream myInputStream = MySampleClass.class.getResourceAsStream("./MyI18nFile.properties");
List lines = org.apache.commons.io.IOUtils.readLines(myInputStream);

Para resolver tive que usar um InputStreamReader setando o encoding(charset), pois não consegui setar o encoding direto no InputStream.
Uma explicação para isso é que InputStream lê blocos de bytes, já o InputStreamReader lê blocos de chars. Não sei se é isso mesmo.

O fonte ficou assim:

InputStream myInputStream = MySampleClass.class.getResourceAsStream("./MyI18nFile.properties");
InputStreamReader myInputStreamReader = new InputStreamReader(myInputStream, Charset.forName("ISO-8859-1"));
List lines = org.apache.commons.io.IOUtils.readLines(myInputStreamReader);

Vejam que eu usei Charset.forName("ISO-8859-1"), fiz isso pois meus arquivos foram criados no windows, mas o java foi executado no linux. Se no seu caso for o contrário, talvez você tenha que usar Charset.forName("UTF-8")

Fonte: http://stackoverflow.com/questions/19317606/java-substring-broken-encoding

Abraço!!
Adriano Schmidt

quinta-feira, 5 de fevereiro de 2015

BDD Cucumber Java DDD DSL

Hoje resolvi estudar a teoria de BDD, DDD, DSL, estudar cucumber, cucumber para Java... etc...

Comecei estudando um pouco de DSL, que é uma forma de você escrever em altíssimo nível negócio e código quase que ao mesmo tempo.
Ao invés de escrever o método que soma dois valores com a sintaxe de alguma linguagem de programação você vai escrever que será necessário somar dois valores.

Depois ao estudar Cucumber (Ferramenta para BDD) vi que ela usava DSL, na verdade usa Gherkin, que é uma linguagem de DSL.

Não tive tempo de finalizar esse artigo.. logo faço isso.. mas seguem alguns links que podem ser úteis:

DSL:
http://martinfowler.com/books/dsl.html

Cucumber:
http://cukes.info/

Gherkin:
https://github.com/cucumber/cucumber/wiki/Gherkin

The Cucumber Book (PDF)
https://www.google.com.br/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CB0QFjAA&url=https%3A%2F%2Fwiki.kuali.org%2Fdownload%2Fattachments%2F329384409%2FThe%2520Cucumber%2520Book.pdf%3Fversion%3D1%26modificationDate%3D1407504510000%26api%3Dv2&ei=7nnRVIX9IcHAggTE_YD4BA&usg=AFQjCNEwixnbrWYSEM1teUwGcUIZDO8_0g&sig2=dWa9zlqday0XrVCqP-N2Kg&bvm=bv.85076809,d.eXY


Outros links:
http://fit.c2.com/wiki.cgi?IntroductionToFit
http://www.bugbang.com.br/entendendo-bdd-com-cucumber-parte-i/
http://martinfowler.com/bliki/UbiquitousLanguage.html
http://behaviourdriven.org/
https://github.com/cucumber/cucumber/wiki
https://groups.google.com/forum/#!forum/cukes
https://pragprog.com/book/srjcuc/the-cucumber-for-java-book

The change could not be merged due to a path conflict

Estou em um projeto que usa o Gerrit como revisor de código, é muito bom!!

E ao revisar e aprovar um commit deu o erro abaixo pois outro commit foi aprovado antes e deu conflito já que os dois commits mexeram na mesma linha de um arquivo.

Code Review - Error
The change could not be merged due to a path conflict.
Please rebase the change locally and upload the rebased commit for review.

Ou também pode acontecer o erro:

The change could not be rebased due to a path conflict during merge.

Para resolver você tem que fazer um rebase localmente e resolver os conflitos.

Passo 1) git fetch origin <nome_da_branch>
Passo 2) git fetch <url> && git checkout FETCH_HEAD (esse comando você pega no próprio gerrit)
Passo 3) git rebase origin/<nome_da_branch>
Passo 4) git status (ao rodar esse comando vai mostrar os arquivos em conflito, resolva os conflitos abrindo os arquivos e ajustando o que for necessário)
Passo 5) git add .
Passo 6) git rebase --continue
Passo 7) git push origin HEAD:refs/for/<nome_da_branch> (esse é o push normal quando você manda algo para o Gerrit)
Passo 8) git checkout <nome_da_branch> (apenas para voltar a sua branch e poder voltar a trabalhar)


Se o rebase for muito grande você pode fazer um cherry-pick


Para uma explicação mais detalhada recomendo a leitura desse artigo:
http://www.mediawiki.org/wiki/Gerrit/resolve_conflict
Porém, nesse artigo é usado o git-review para fazer o fetch/checkout (Passo 2) e o push (Passo 7). Ignore essa parte e faça conforme eu mostrei.

Para estudar sobre o rebase: http://git-scm.com/book/pt-br/v1/Ramifica%C3%A7%C3%A3o-Branching-no-Git-Rebasing

Para estudar sobre o Gerrit: https://code.google.com/p/gerrit/

Abraço!
Adriano Schmidt

sexta-feira, 30 de janeiro de 2015

Quebra de linha no GIT

Opa : )

No projeto que estou tem arquivos com quebra de linha CRLF (\r\n que é o padrão do Windows) e outros com LF (\n que é o padrão do linux)..

E o Git faz uma conversão dos caracteres de quebra de linha no momento que você adiciona o arquivo ao index (git add)

Então tenho que alterar a propriedade autocrlf no git dependendo do arquivo que vou mexer.. para que seja feita a conversão de quebra de linha de forma adequada.

Os comando que eu uso são esses:

Para arquivos com CRLF:
git config --global --unset core.autocrlf && git config --global --add core.autocrlf true
Para arquivos com LF
git config --global --unset core.autocrlf && git config --global --add core.autocrlf false

Para entender melhor: http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#Formatting-and-Whitespace

Abraço!
Adriano Schmidt

sexta-feira, 16 de janeiro de 2015

Minha experiência com Openshift

Olá pessoal...

Hospedei uma aplicação minha no Openshift e tive algumas dificuldades que quero compartilhar com vocês.





No primeiro dia que fui usar a aplicação ela caia do nada e eu precisa dar um "rhc force stop" entre outras coisas para ela voltar a funcionar... Mas isso foi azar meu... pois exatamente neste dia, no dia que eu comecei a usar o Openshift estavam acontecendo alguns problemas de segurança no Openshift e deu problema para todos os usuários do mundo... a própria Red Hat abriu um chamado informando isso... mas nos dias seguintes não aconteceu mais nada sem explicação desse jeito.


O que eu percebia é que eu acessava minha aplicação e ela estava no ar... dois dias depois eu acessava novamente e ela estava fora do ar... acessava 5 minutos depois e ela estava no ar novamente. Isso acontece pois no plano free sua aplicação fica inativa (idle) após 24 horas sem acessos.
Agora eu acesso a aplicação todos os dias e isso evita que ela caia... No futuro penso em talvez fazer algum job que faz isso automaticamente pra mim (não sei se é ilegal fazer isso, mas caso meu cliente vá usar a aplicação ela deve estar no ar, caso contrário ele vai ficar chateado comigo)


O certo para não precisar fazer essa gambiarra de ter um job acessando todos os dias a aplicação seria migrar do plano free para o plano bronze ou silver.
Maaaas esse planos não estão disponíveis no Brasil, apenas em:
- North America (U.S. and Canada)
- Europe (EU member states, Iceland, Israel, Norway, Switzerland, and Russia)
Fonte: https://www.openshift.com/products/pricing#regional_availability

Quem quiser pode responder esse formulário pedindo para colocarem no Brasil também:
https://www.openshift.com/page/geo-request-form

Porém, conforme informado pela Red Hat em um chamado que abri, se você tiver um cartão de crédito com endereço de cobrança em um destes países acima poderá contratar os planos bronze ou silver.

Tive dificuldades para usar naked domain, ou seja, permitir que meu site fosse acessado por meudominio.com.br e não só por www.meudominio.com.br (veja que um tem o www e o outro não)
O problema é que no openshift eu não tenho um IP, então não consigo adicinar no meu provedor DNS um registro do tipo A, tem que ser do tipo CNAME, mas no provedor DNS do registro.br que é o que eu usava não é possível adicionar um CNAME sendo naked domain... Utilizando o www.cloudflare.com como DNS Provider deu certo, pois ele permite adicionar naked domaind para CNAME.

Mas agora minha aplicação está no ar, estou conseguindo fazer tudo que preciso (deploy, configurar domínio/DNS, configurações), por enquanto vou seguir usando o Openshift, está atendendo minhas necessidades, mas como o plano free é um pouco limitado, se minha aplicação chegar a ter muitos usuários vou ter que conseguir um cartão de crédito de algum amigo que mora no exterior ou terei que buscar outra alternativa.


Caso sua aplicação rode com JBoss ou Wildfly e você queira dar uma olhada em outras alternativas para hospedar sua aplicação você pode verificar na Amazon, Digital Ocean ou Integrator.


E você? Qual sua experiência com Openshift? Fique à vontade para deixar comentários sobre o openshift ou sugerir outros serviços de hospedagem ou alguma dúvida.


Abraço!!!
Adriano Schmidt

sábado, 27 de dezembro de 2014

PSQLException: ERROR: syntax error at or near "User"

Pessoal..

Hoje tive o erro: PSQLException: ERROR: syntax error at or near "User"

Isso acontece pois a entidade que eu criei se chama User e no PostgreSQL deve existir uma tabela com esse nome ou user é uma palavra reservada.

Então mudei minha entidade para ter outro nome de tabela e não o default:

@Entity
@Table(name="LOGIN_USER")
public class User {

Então funcionou perfeitamente.

Abraço!
Adriano Schmidt

terça-feira, 16 de dezembro de 2014

Failure executing javac

Hoje tive o erro abaixo ao executar um "mvn install"

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project avmais: Compilation failure
[ERROR] Failure executing javac, but could not parse the error:
[ERROR] O sistema nÆo pode encontrar o caminho especificado.

Estava tudo certinho nas minhas variáveis de ambiente e configurações do projeto...

Depois de muita luta vi que o erro foi causado pois no meu pom.xml tinha a seguinte linha:
<maven .compiler.executable="">${env.OPENSHIFT_WILDFLY_DIR}usr/lib/jvm/jdk1.8.0_05/bin/javac</maven>

Após remover essa linha funcionou local.

Abraço!
Adriano Schmidt