quarta-feira, 10 de abril de 2013

Transformando o VIM em uma IDE completa.



O VIM (Vi IMproved) é o meu editor favorito para inúmeras tarefas. Ele é a combinação perfeita entre robustez e eficiência. Em outras palavras, ele é simplesmente meu canivete suiço.

Muito provavelmente, o seu primeiro contato com o Vim será aterrorizante. Felizmente, depois de entender alguns dos conceitos básicos, você perceberá com detalhes que ele é, como diria minha mãe: pau pra toda obra.

Se você já estudou em algum curso superior em informática, provavelmente já passou por alguma disciplina em que teve de implementar um editor de texto. Foi implementando o meu próprio editor de texto na faculdade que percebi o quão poderoso o Vim pode ser.

Se o Vim é algo muito novo para você, eu recomendo executar o tutorial que já vem nos pacotes das distribuições mais novas. É um excelente tutorial interativo, utilizando a própria ajuda do vim.

Instalação

Se você usa alguma distribuição baseada em Debian, como o Ubuntu, basta instalar o vim com o apt-get:

$ apt-get install vim vim-gnome

Se você for apenas utilizar o Vim pelo terminal, não precisa do vim-gnome. Eu recomendo o Vim-gnome porque ele lhe permite utilizar algumas integrações com o ambiente gráfico, além de ter uma barra de ferramentas e uma boa integração com o mouse, ideal para principiantes. Se você ainda não encontrou a luz, e ainda está usando Windows, pode instalar o Vim no seu computador, baixando diretamente do site do projeto [0].

Um pouco do básico

O ideal para você iniciar é seguir o passo a passo do vimtutor. Depios de instalar o Vim, você poderá iiciar o vimtutor do terminal por meio do comando:

$ vimtutor

De qualquer forma, seguem algumas dicas importantes para começar:

  1. O vim possui uma "barra de status", no rodapé da janela. Ela também é a barra na qual você digita os "comandos" do editor. Pense nestes comandos como o equivalente a uma dezena de botões e menus que normalmente você encontra nos programas: eles lhe dão acesso aos recursos do software, a única diferença é que você vai digitá-los ao invés de clicar neles.
  2. O vim possui modos, e isso é, muitas vezes o primeiro obstáculo. O modo normal pode ser entendido como um modo de somente leitura, no qual você digita instruções na barra de comandos. O modo de inserção é o modo que você usa para editar o conteúdo do arquivo e o modo visual é o modo que você poderá fazer seleções no texto para copiar ou recortar partes do mesmo.
  3. Ao entrar no vim, você terá acesso ao modo normal, e se começar a digitar pode acionar acidentalmente comandos indesejados. Pressionando a letra i ou o botão INSERT, você entra no modo de inserção, e pressionando v no modo visual. Estando nos modos de inserção ou visual, pressionando ESC você retorna para o modo normal.
  4. Os comandos do vim são, normalmente, digitados no modo normal, prefixados pelo caractere dois pontos: :. Por exemplo, para encerrar o vim utilize o comando :q. Para salvar o texto atual (muitas vezes chamado de buffer na documentação do Vim) utilize o comando :w. Um atalho para sair do vim, já salvando, é o comando :x. Lembre-se que, normalmente, você vai apertar um ESC antes de digitar os comandos, já que assim garante que está no modo normal.
  5. O vim possui um manual de ajuda embutido, que dá detalhes completos sobre o programa. Para abrir o manual, utilize o comando :help. Também é possível ler um tópico específico do manual utilizando o comando help seguido do tópico, comando ou função desejado. Experimente ler os tópicos :help q, :help w e :help x
Essas dicas simples servem para ajudara a entender o funcionamento básico, apenas para que você fique mais familiarizado com o Vim. Utilize o vimtutor para aprender mais sobre a ferramenta se você está apenas iniciando.

Mais do que um editor de textos

O vim não é apenas um simples editor de buffers de texto. Por exemplo, você pode fazer coisas como:

  • Executar comandos no prompt.
  • Abrir abas, dividir a tela em janelas horizontal e verticalmente, e tudo isso combinado diversas vezes.
  • Compilar o código fonte.
  • Criar scripts e funções.
  • Mapear atalhos do teclado para comandos do editor.
  • Visualizar diretórios, arquivos .zip, .tar.gz, e arquivos binários (se você souber o que está fazendo, é muito útil).
  • Pesquisar / substituir utilizando expressões regulares.
  • Auto-completar código (assim como nas IDEs mais famosas).
  • Utilizar (e customizar!) o syntax highlight de todo e qualquer tipo de arquivo.
  • Navegar pelo código fonte (com o auxílio de um arquivo de tags).
  • ... e muito, muito mais!
Combinando uma boa seleção de plugins, mapeamentos confortáveis no teclado, e entendendo a dinâmicda do Vim, você poderá utilizá-lo como um substituto excelente para programar em diversas linguagens.


Personalizando

Você pode customizar o Vim por meio do arquivo .vimrc, salvo em seu diretório pessoal (~/.vimrc no *nix). Este arquivo consiste, basicamente, em comandos que você poderia digitar diretamente na barra de status do Vim, combinados na forma de um pequeno vimscript. Neste arquivo, assim como em qualquer outro script do Vim, uma linha iniciada por aspas é um comentário.

Neste post, vou lhes mostar algumas configurações que eu geralmente uso para tornar o Vim mais agradável.

syntax on
Ativa a sintaxe por padrão, ao carregar o vim. O recurso vem desabilitado porque pode demorar para carregar arquivos grandes. É útil ele estar ativo já que nos arquivos muito grandes, você pode pressionar CTRL+C para interromper o parser do hilight, e depois desabilitar com syntax off.

set number
Ativa a numeração das linhas. Muito interessante especialmente para edição de código-fonte. Por padrão desabilitado, e você também pode desligar com o comando :set nonumber

set mouse=a
Ativa (mesmo em conexões por SSH!) as funcionalidades do mouse para a sua sessão do Vim.

set hlsearch
Ativa o hilight das pesquisas. Basicamente, quando você efetua uma busca, busca e substituição, o vim irá deixar as ocorrências em destaque, parecido ao amarelão do Gedit/Kwrite quando você pesquisa por algo.

set nomousehide
Não sei porque, mas tem horas que o mouse no Gvim dá uma sumida, e parece que você está ficando doido. Não tem efeito se você abrir o vim no terminal.

set sw=8 ts=8 st=8 noet si ai
Esta sequência "mágica", configura a tabulação para o equivalente a 8 espaços, sem expandir o tab, ou seja, sem substituir tudo por espaços. Na prática, cada comando separado por um espaço faz uma coisa. Fica como uma tarefa para o leitor consultar o manual de cada um. Todos juntos são úteis para que as quebras de linha no código já identem corretamente. Troque o 8 por 4 ou 2 se você preferir visualizar as tabulações com menos espaços, e troque noet por et para inserir espaços quando você pressionar a tecla tab (não faça isso em Makefiles!).

au
Aqui começa um pouco de "mágica" na sua configuração. O au ou autocommand permite que eventos sejam mapeados para comandos do editor que permite que a customização seja dinâmica, conforme o tipo de arquivo que você está editando, por exemplo. Vamos supor que você queira utilizar espaços no lugar de tabulações, e que sejam 4 espaços ao invés de 8 para a maior parte dos arquivos, mas quando você estiver editando um Makefile, você quer que a configuração seja para usar as tabulações mesmo, e queira visualizar com 8 espaços. Para atingir este objetivo, basta usar as linhas abaixo em seu vimrc:

set sw=4 ts=4 st=4 et si ai
au BufRead,BufNewFile Makefile set sw=8 ts=8 st=8 noet si ai

A primeira linha configura como padrão a tabulação de 4 espaços, e a segunda, configura um autocommand, para toda vez que um arquivo for lido ou aberto, com o nome Makefile, configurar a tabulação normal. Veja mais detalhes em :help au.

Em seu vimrc, além de comandos como os acima, você também poderá criar funções (que são executadas com o comando :call) e criar comandos personalizados, que basicamente agrupam outros comandos ou chamam outras funções. Comandos definidos pelo usuário devem ser iniciados por uma letra maiúscula.

Criando funções

Vamos supor que você queira criar uma função para fazer o pull de seu repositório mercurial, sem deixar o editor. Para isso, você pode incluir o seguinte em seu vimrc:

function HgPull()
  echo "Trazendo revisões do servidor remoto ..."
  !hg pull
endfunction

Para executar esta função, basta digitar o comando :call HgPull()A primeira linha inicia uma função, a segunda e terciera contêm o corpo da função e a quarta, encerra a função. Um atalho para as palavras chaves function e endfunction são, respectivamente fu e endfu. O comando ! é um comando do vim que executa uma função no shell (ou prompt), e por padrão exibe a saída do comando que o segue.

Plugins

Os plugins são instalados em seu diretório ~/.vim/plugins. Para plugins que nem sempre são utilizados, você poderá instalá-los no ~/.vim/autoload, desde que o script do plugin tenha suporte para isso. Uma lista interessante de plugins para você ir brincando pode ser encontrada em [3].

Um vimrc que já está quase virando plugin

Eu e outros amigos usuários do Vim estamos montando um vimrc que compartilhamos no Bitbucket. Tive esta iniciativa para uniformizar o meu vimrc de casa, do notebook e do trabalho, e também para tornar o trabalho de programar em Java com o Vim um pouco menos laborioso. Como efeito colateral, à medida em que fui utilizando o vim para programar e fui incrementando o vimrc com vários recursos, fui aprendendo cada vez mais sobre vimscript.

Nom momento em que escrevo, o vimrc está hospedado junto com outros scripts bem interessantes que eu estou publicando no projeto https://bitbucket.org/ronoaldo/ronoaldo-utils. Atualmente, ele traz as configurações acima, uma coletânea com pequenas funções que eu uso diariamente, e alguns mapeamentos de teclado interessantes, como o CTRL+S para salvar o arquivo. Também inclui ma seleção de plugins instaláveis facilmente por funções definidas no próprio vimrc por meio do script pathogen.vim, e uma configuração especial para projetos Java/Maven em ~/workspace/projeto.

Com esta configuração, você pode:

  • Instalar a coletânea de plugins com o comando :call InstallAllPlugins.
  • Utilizar o CTRL+F12 para abrir um navegador de arquivos (plugin NERDTree).
  • Salvar pressionando CTRL+S.
  • Utilizar o comando :IndexWorkspace para indexar todos os arquivos .java de sua workspace (requer exuberant-ctags).
  • Utilizar CTRL+P para fazer pull e CTRL+U para fazer push no Mercurial.
  • Executar testes de projetos Maven em sua workspace com o comando :Junit
  • Compilar um projeto Maven utilizando CTRL+F8, ou arquivos Java standalone utilizando o mesmo atalho.
  • Utilizar templates de código estilo os do Textmate (plugin snipmate).
  • Criar atalhos de forma bem simples, com o comando :call KeyMap("atalho", "ação")
  • E mais está por vir ...

O script está crescendo em funcionalidades e eu estou considerando a possibilidade de que ele seja, por si só, um plugin. Estou recebendo patches ;)

Conclusão

Se você está procurando por uma alternative eficiente e leve, mas sem perder a robustez, o Vim pode ser uma excelente escolha, depois que você quebrar a barreira do como eu começo a digitar nesta coisa?.

:echo "Happy hacking!"

Referencias


[0] Site oficial: http://www.vim.org/
[1] Vim Tips Wiki: http://vim.wikia.com/wiki/Vim_Tips_Wiki
[2] Ótimo tutorial sobre Vimscript: http://learnvimscriptthehardway.stevelosh.com/
[3] Lista com plugins úteis: http://www.catonmat.net/series/vim-plugins-you-should-know-about

quarta-feira, 21 de dezembro de 2011

Instalando features do Eclipse via linha de comando com Provision Platform, p2

O Eclipse é a minha IDE favorita, por algumas razões:
  • OpenSource: sendo uma ferramenta de código livre, além de ser possível contribuir, analisar, reutilizar o código-fonte e aprender com o mesmo, a comunidade de desenvolvedores ao redor do mundo pode ampliar os horizontes da plataforma com suas contribuições.
  • Multi-plataforma: assim como a maior parte das ferramentas open-source, o Eclipse também é multi-plataforma, oferecendo assim ainda mais liberdade para que você trabalhe no ambiente que lhe proporciona mais segurança e mais recursos.
  • Multi-linguagem: como todo bom programador, eu não sou viciado em uma única linguagem, e procuro sempre utilizar a linguagem apenas como ferramenta. Apesar de ter trabalhando recentemente mais com a linguagem Java, Python, C e C++, PHP são outros sabores que eu aprecio. Claro, um pouco de shell script para automatizar tarefas corriqueiras são uma boa pedida. O Eclipse lhe oferece um ambiente uniforme para trabalhar com as linguagens, o que para mim é um fator importante, evitando atritos ao programar em mais de uma linguagem em curtos intervalos de tempo.
Por estes e outros motivos, me tornei um Amigo do Eclipse, e fiz uma modesta contribuição para o projeto. Recentemente, descobri um recurso da plataforma que facilita automatizar a instalação de plugins via linha de comando. Este recurso permite que você faça a instalação de uma série de plugins de uma única vez, realize deploys ou até mesmo, construa a partir de sua própria seleção de plugins, uma versão customizada da IDE.

Background
O processo faz uso de um recurso da plataforma do Eclipse chamado Provisioning Platform (p2). Especificamente, uma aplicação do p2 chamada Director [1]. Com esta aplicação, é possível automatizar o processo via linha de comando.

Basicamente, tudo que você tem a fazer é executar a aplicação org.eclipse.equinox.p2.director, e informar as features a serem instaladas, bem como os repositórios a serem consultados para resolução de dependências.

Tecnicamente, este é o mesmo processo que a interface gráfica realiza, com exceção de que você está automaticamente concordando com as licenças dos softwares que está instalando, uma vez que a tela de confirmação não é exibida.

Passo a passo
Terminologia básica para o processo de instalação:
  • Director: a aplicação do Eclipse que está realizando a instalação ou remoção de software. Ela está no bundle org.eclipse.equinox.p2.director.app.
  • Builder: uma aplicação baseada na plataforma do Eclipse que contém o bundle do Director e suas dependências. Pode ser utilizado, por exemplo, para criar uma nova instalação de plugins (modo shared) ou da IDE completa em um diretório diferente.
  • Produto alvo: uma aplicação alvo onde o software será instalado. Pode ser o mesmo do Builder, quando você quer instalar plugins e features em uma versão da IDE, como o Java EE.
Tudo que precisamos é do p2 Director para começar. O modo mais fácil é você já ter baixado o Eclipse para Java, Java EE ou qualquer outro de sua preferência, e começar a adicionar um conjunto de plugins. Você também pode, por exemplo, criar também uma aplicação mínima do eclipse que tenha apenas o Director e então, criar um instalador para baixar um pacote completo.

Vamos supor que você tenha baixado o Eclipse for Java EE Developers, e queira adicionar o Mobile Tools For Java (MTJ). Para isso, você precisará utilizar o seguinte comando (supondo que o binário ou script launcher do Eclipse esteja em seu PATH):


$ eclipse -nosplash -application org.eclipse.equinox.p2.director -repository http://download.eclipse.org/releases/indigo/ -installIU org.eclipse.mtj.feature.group -tag “Added-org.eclipse.mtj.feature.group”

O parâmetro -nosplash evita que a tela de splash seja exibida e fique congelada, já que não precisamos de interface gráfica. Com o parâmetro -application indicamos que o Director deve ser iniciado e não a Workbench. Os parâmetros seguintes, -repository e -installIU, permitem configurar, respectivamente, de onde os plugins e features serão baixados e quais instalation units devem ser adicionadas (plugins, features ou feature-groups). Esses dois parâmetros recebem uma lista separada por vírgulas, o que permite instalar vários plugins de diferentes fontes ao mesmo tempo. O parãmetro -tag permite marcar o que foi feito nesta operação, assim fica fácil “reverter” pela itnerface gráfica do Eclipse (ou mesmo pelo director) para uma tag mais antiga caso a instalação falhe.

Depois de rodar este comando, você vai ver algumas linhas no prompt:

Installing org.eclipse.mtj.feature.group 1.1.2.201109111413.
Operation completed in 337201 ms.

Ao iniciar novamente o Eclipse, você vai poder confirmar que o MTJ foi adicionado com sucesso ao sistema:

Você pdoe conferir nossa tag clicando em Help → About Eclipse, depois no botão Instalation Details. Na aba Instalation History, você vai ver:


Apesar dos parâmetros -repository e -feature aceitarem multiplas opções separadas por vírgula, eu notei que ao tentar instalar muitos plugins em uma única vez pode resultar em conflitos. Eu acredito que o resolvedor de dependências começa a ficar confuso. Eu também notei isso na própria interface gráfica, via Eclipse Marketplace ao tentar instalar o Google Plugin + SDKs, Apache Ivy e Pydev ao mesmo tempo.

p2-install
O que me motivou a descobrir este recurso foi ter que, nas últimas semanas, configurar várias vezes uma mesma instalação do Eclipse padrão com as ferramentas do Google Plugin for Eclipse, SDKs do AppEngine e Google Webtoolkit, Apache Ivy e IvyDE, e o MercurialEclipse. Este conjunto de ferramentas é o mínimo  essencial no meu emprego atual. Como erros intermitentes ao baixar todas de uma vez só pelo Eclipse Marketplace, tive que procurar uma alternativa.

O trabalho rendeu até um pequeno script que eu compartilhei no Bitbucket no projeto ronoaldo-utils. O script já facilita um pouco com alguns defaults, prevê multiplas instalações do Eclipse e permite que você faça também um “discover” pelos feature-groups disponíveis.

Veja o código-fonte aqui. Se tiver alguma sugestão ou melhoria, crie um fork e submita um patch!

Próximos Passos
Além de instalar plugins e feature groups (Uma feature ou grupo de features composta por vários plugins), o Director permite que você instale em um outro diretório: ou seja, instale a partir de uma aplicação, tendo uma aplicação diferente como alvo. O interessante é que você pode baixar e construir a IDE inteira com este recurso. Outra ferramenta interessante do p2 é que você pode também fazer mirror e gerenciar repositório com os plugins. Ao ler isso, imaginei uma forma bem interessante de realizar o deploy de versões já pré-configuradas do Eclipse via linha de comando, para diversas máquinas, como em um laboratório ou departamento de TI. Mas, isso é assunto para outro post...

Happy hacking!

Referências

sábado, 17 de setembro de 2011

Calculando MD5 e SHA1 em Java

Hashes são extremamente úteis para representar em uma pequena cadeia de bits uma outra cadeia de bits que pode ser bem maior. Podemos considerá-lo uma forma de criptografia assimétrica, uma vez que não é possível (a não ser por meio de algoritmos de força bruta) recuperar a cadeia original a partir do hash.

Existem diversos algoritmos para o cálculo de hashes, e em Java utilizamos a classe MessageDigest para recuperar a implementação desejada. Por exemplo, para calcular o MD5 de uma string, podemos utilizar:

MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update("string original".getBytes());
byte[] digest = md5.digest();

Para exibir os dados como string, recurso util quando você pretende utilizar o MD5 para conferir se todos os bytes de um arquivo foram baixados, basta formatá-lo com:

String.format("%1$032x", new BigInteger(1, digest));

O resultado é exatamente o hash MD5 da string:

~$ echo "string original" | md5sum
3ced9d1f470cd18f06a8b6492d3ea94e  -

Neste exemplo, utilizamos a string de formatação "%1$032x", porque queremos o resultado em hexadecimal, alinhado em 32 casas à esquerda. Construímos um BigInteger positivo, com os bits resultantes da soma, e isso nos permite converter os bytes do array para hexadecimal de forma simples.

Podemos fazer de forma semelhante ao calcular o SHA1:

MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
sha1.update("string original".getBytes());
byte[] digest = sha1.digest();
String.format("%1$040x", new BigInteger(1, digest));

Generalizando, você pode também utilizar os seguinte métodos:

public static String computeHash(String data, String algoritm,
        Integer resultSize) {
    try {
        MessageDigest digest = MessageDigest.getInstance(algoritm);
        digest.update(data.getBytes());
        return hexdigits(digest.digest(), resultSize);
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException("Unable to hash with " + algoritm);
    }
}

public static String hexdigits(byte[] data, Integer resultSize) {
    return String
            .format("%1$0" + resultSize + "x", new BigInteger(1, data));
}

Até a próxima dica!

quinta-feira, 25 de agosto de 2011

Coletânea de Soluções do GDD-BR

O Google Developer Day Brasil 2011 teve suas inscrições encerradas na última sexta-feira. Na empresa onde trabalho, eu e meus colegas fizemos uma coletânea de soluções em Java e estamos compartilhando com o mundo hoje!

As soluções são apenas para fins de exercício e oferecem diferentes visões de como podemos resolver o problema. Obviamente, para publicar nossas respostas o mais rápido possível, não otimizamos o código, e resolvemos as questões da primeira forma que nos veio em mente.

Deixem suas opiniões e comentários! E, claro, podem ficar à vontade para clonar o repositório de códigos de exemplo.

Se você gostaria de contribuir com sua solução, deixe um comentário que eu entro em contato para habilitar push no repositório.

terça-feira, 26 de julho de 2011

Pelo mundo (virtual) afora

No ano passado tive um acesso de inspiração e publiquei alguns cliparts no OpenCliparts.org, um portal de hospedagem de ilustrações vetoriais sob domínio público.

Algumas semanas depois, o Google começou a mostrar estes cliparts nos resultados de pesquisa por imagens com meu nome. Dias depois, cada clipart passou a aparecer várias vezes na mesma busca por imagens. Notei que os desenhos estavam se espalhando pela web de portal em portal, e como o OpenClipart adicionou meu nome no nome do arquivo e nos seus meta-dados, eu tive certeza que eram os mesmos.

Tudo bem, publiquei no OpenClipart com esse objetivo mesmo: divulgar os desenhos. Hoje fui até o OpenClipart novamente, e agora eles exibem os top 10 downloads na página de cada artista. Para minha surpresa, alguns cliparts já passaram dos mil downloads! Claro, a maior parte deve ser dos robozinhos dos sites que republicaram o trabalho, mas já é gratificante.

Também achei interessante que alguns dos modelos de documento do Google Docs que eu publiquei já foram utilizados diversas vezes. Agora os templates já não possuem mais a contagem de utilizações, apenas a avaliação dos usuários, que até agora foi de 4 estrelas.