sexta-feira, 27 de fevereiro de 2015

OpenLDAP Windows

Veja a versão em português

Hello!

Today I had to install the OpenLDAP in a Windows enviroment.

It is easy, just do the following steps. You have to:
- Download the OpenLDAP for windows: http://sourceforge.net/projects/openldapwindows/
- Unzip it to some folder
- Execute it and install the software
- In "Windows Start Menu" look for "Start LDAP Server" and click on it. (Start – Programs – OpenLDAP 2.4.38 – Start LDAP Server)
- In "Windows Start Menu" look for "OpenLDAP Command Line" and click on it.  (Start – Programs – OpenLDAP 2.4.38)
- Type: ldapadd.exe -v -x -D "cn=Manager,dc=my-domain,dc=com" -W -f ..\etc\ldif\base.ldif
- Press enter. (If it doesn't work, try typing again the quotation marks (" ") because the Windows needs the right character.)
- Put the password that is "secret" by default
- Type: ldapadd.exe -v -x -D "cn=Manager,dc=my-domain,dc=com" -W -f ..\etc\ldif\base.ldif
- Press enter.
- Put the password that is "secret" by default

Now, the OpenLDAP is installed, configured and started. To login use:
Host: localhost
Port: 389
User: cn=Manager,dc=my-domain,dc=com
Password: secret

Best Regards,
Adriano Schmidt

Sizelimit Exceeded OpenLDAP

Veja a versão em português

Hello my friends,

Today I had this problem in my Java project when I tried do a search in OpenLDAP:
2015-02-26 16:44:04,875 ERROR [br.com.localhost8080.ldap.MyClass] Sizelimit Exceeded
LDAPException: Sizelimit Exceeded (4) Sizelimit Exceeded

LDAPException: Matched DN:
at com.novell.ldap.LDAPResponse.getResultException(Unknown Source)
at com.novell.ldap.LDAPResponse.chkResultCode(Unknown Source)
at com.novell.ldap.LDAPSearchResults.next(Unknown Source)
at br.com.localhost8080.ldap.LdapSynchronizer.synchronize(LdapSynchronizer.java:84)

It happens because the OpenLDAP had 1500 users... and the default sizelimit in my Java client was 1000.

Changing the parameter sizelimit at slapd.conf in OpenLDAP doesn't solve the problem.

To solve this I used the class com.novell.ldap.LDAPSearchConstraints like this:
LDAPSearchConstraints ldsc = new LDAPSearchConstraints();
ldsc.setMaxResults(0);

connection.search(searchBase, searchScope, searchFilter, new String[] {}, false, ldsc);
Setting the MaxResults with 0 (zero) the sizelimit becomes unlimited.

Best Regards,
Adriano Schmidt

segunda-feira, 23 de fevereiro de 2015

Trabalhando com tags no Git

Referência básica para trabalhar com tags:

Para listar as tags no git:
git tag

Para listar as tags a partir de um filtro:
git tag -l 'v1.0*'

Para criar uma tag:
git tag -a <nome da tag> -m "<mensagem opcional>"
git tag -a v1.0.2 -m "entrega realizada com a funcionalidade X"

Para exibir uma tag:
git show v1.0.2

Para fazer push de uma tag:
git push origin v.1.0.2

Para fazer push de todas as tags:
git push origin --tags

Para deletar uma tag:
git tag -d v1.0.2

Para fazer push da deleção da tag:
git push origin :refs/tags/v.1.0.2

Para criar uma tag de um commit antigo:
git tag -a v.1.0.2 -m "entrega da funcionalidade X" <id_do_commit>

Mais em:
http://git-scm.com/book/en/v2/Git-Basics-Tagging
http://git-scm.com/docs/git-tag

Vaaleu!!
Adriano Schmidt

quinta-feira, 19 de fevereiro de 2015

git cherry-pick

Fala galera \o)

Você tem um commit perdido no tempo em algum branch do seu projeto... aquele commit resolvia um bug e você gostaria de aplicá-lo em sua master... seria tão legal se fosse possível simplesmente pegar as alterações daquele commit e aplicar na master, não seria? Pois saiba que é possível :D

O git tem o comando cherry-pick... ele pega as alterações de um commit e aplica em algum lugar.

Passo 1) Identifique o ID do commit que voce quer resgatar. Ex: 25210a9e67b0d77ee54ee67d9e106175c9285f18
Passo 2) Estando na master ou onde você quer aplicar o commit, rode o commando: git cherry-pick 25210a9e67b0d77ee54ee67d9e106175c9285f18
Passo 3) Dê um: git status
Passo 4) Caso apareçam conflitos, resolva-os.
Passo 5) Dê um: git add .
Passo 6) Dê um: git cherry-pick --continue
Passo 7) Confira se está tudo OK com um: git status
Passo 8) Faça um push: git push

Pronto, resolvido :D

Agradeço ao meu brother Alfredo André Zipperer que tem me feito subir uns 3 levels nas skills de git \o)

Valeu!
Adriano Schmidt

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