um pluguinho
Configuração
Melhorando o editor do codebase
Feb 21st
Já faz algum tempo que estamos em processo de adoção do codebase como serviço de repositório e controle de versão aqui na Abril, em substituição principalmente a serviços de git e wiki internos.
Uma das coisas que incomodam no codebase é o editor do wiki, que é bem limitador, para dizer a verdade um textarea sem nenhuma customização e com uma fonte safadinha. Pensando nisso resolvi melhorar um pouquinho o trabalho de editar a wiki e fiz um pequeno script que para facilitar minha vida, e quem sabe a sua.
Usando o elegante editor web: markitUp, criei um projeto no github. No README do projeto existe informações de como utilizar o script no chrome.
Basicamente você vai precisar instalar uma extensão para seu navegador que permita injetar javascript em uma determinada página, como meu navegador principal é chrome, normalmente eu utilizo a extensão “Personalized Web“, ela facilita bastante o trabalho de injetar código javascript ou mesmo css, além de permitir a criação de um match para saber quando o script deve ser executado.
Existem outras extensões, inclusive suporte a isso em outros browsers, no caso do Firefox você pode usar o Greasemonkey, se você souber de outras me mande para que possa listar aqui para ajudar mais gente a utilizar o recurso.
RVM, onde estou!?!?!
Nov 24th
Comecei a utilizar o RVM em sua versão 0.0.22, na época ele não passava de um script shell que permitia a instalação e troca entre as vms, mas ele vem avançado muito, e funcionalidades como set de gemas é só a ponta do iceberg.
Motivado pelo post anterior acabei lendo um pouco mais a documentação e encontrei uns scriptizinho bem interessante. Como saber rapidamente qual a versão atual da minha VM? Para isso podemos contar com o script ~/.rvm/bin/rvm-prompt, ele pode ser usando adicionando a seguinte linha ao seu .bash_profile:
Com isso ele mostra qual maquina virtual do Ruby você esta usando, mas apenas quando essa for diferente da default. Só isso já seria o suficiente, mas o que me incomoda nesta solução, é que eu já tenho uma linha de comando grande, e nem sempre eu preciso saber qual versão eu estou usando, isso é particularmente interessante quando estou em um projeto Ruby. Como normalmente um projeto Ruby temos um arquivo Rakefile podemos procurar por este arquivo e exibir a versão da máquina apenas quando estivermos no diretório de um projeto Ruby. Vamos adicionar as seguintes linhas ao nosso .bash_profile:
RVM_VERSION=`~/.rvm/bin/rvm-prompt`
if [[ -f "$(pwd)/Rakefile" ]] && [[ ! -z "$RVM_VERSION" ]]; then
echo "${RVM_VERSION} "
fi
}
Agora podemos mudar a linha anterior para:
Espero que ajude alguém e qualquer dica que possa melhor é só comentar a baixo.
Hooks no bash
Nov 13th
Nos últimos dias tenho andado ocupado com muitos projetos e não esta sobrando muito tempo para escrever, e mesmo revisar os posts que já estão escrito aqui para o blog, faltando apenas a revisão e publicação, então vai um pequeno post sobre uma ferramenta para bash programers de plantão.
Estou trabalhando em uma gem que entre outras coisas vai enviar mensagens aos meus contatos de IM de acordo com o comando executado no shell, em breve ela deve ficar pronta e eu dou mais detalhes por aqui. Mas o importante nisso foi descobrir como monitorar o que é executado no shell.
A principio pensei em varias possibilidades, dês de interagir com o kernel em algum nível, para obter os comandos executados ou mesmo fazer alguma gambiarra com o comando “script”, mas quase todas as tentativas me levavam a um problema: como fazer isso de forma transparente e ainda mais importante em Userspace.
Pesquisando, acabei achando um pequeno truque. Neste site há uma explicação de como usar esse “hook” de bash para abrir uma caixa de aviso com Growl no mac (o que pode ser feito no Linux com o notify), para avisar sobre o termino de comandos muito longos.
A configuração é bem simples, basta baixar para o seu home dir o arquivo http://www.twistedmatrix.com/users/glyph/preexec.bash.txt e adicionar ao seu bash a chamada: “. ~/.preexec.bash”, feito isso você define duas funções a preexec e a precmd, funções que são chamadas antes do comando e depois do comando respectivamente.
As aplicações para este hook são quase que infinitas, mas atente para o fato de que isso aumenta o tempo de execução de um comando, pois ela trabalha em cima de todos os comandos que você executar em shell.
obs: Obrigado ao meu amigo Cássio pelas longas horas perdidas atrás dessa inhaca, se ele tivesse um blog eu linkaria aqui!
Backup dos arquivos de configuração
Sep 22nd
Se tem uma coisa que me deixa chateado é perde meus arquivos de configuração, infelizmente isto é uma coisa que acontece com um certa frequência. Mas existe solução para o problema, vamos a ela!
Nos últimos meses, uma ferramenta tem feito muito barulho, pelo menos para desenvolvedores que sabem utilizar uma boa ferramenta de controle de versão. Não, não estou falando no git, mas do dropbox. Para quem não conhece o dropbox é um serviço de disco virtual, com cliente multi plataforma e com suporte a controle de versão.
A idéia aqui é simples: usar o dropbox para manter um backup dos arquivos de configuração e ao mesmo tempo ganhar um controle de versão, mesmo que simples, sobre estes arquivos. Estou usando isso em uma máquina com Archlinux, mas o principio é o mesmo pra qualquer distribuição e pode ser adaptado com facilidade.
Para instalar o dropbox no Archlinux será necessário o uso do AUR, existe duas maneira de se fazer isso, a primeira é baixar o pacote direto do AUR e executar a rotina de instalação de um pacote desse tipo, a outra é ter o yaourt instalado e fazer isso com uma linha de comando:
$ sudo yaourt -S nautilus-dropbox && killall nautilus
Com isso deve aparecer na barra de tarefas o ícone do dropbox, aguarde um pouco, ele vai baixar e instalar o dropbox, ate aqui o que foi feito era apenas instalação do instalador, rsrs. Quando o processo terminar ele abre um tela com um wizard de configuração, uma vez configurado ele já faz o primeiro sync com sua pasta remota e já podemos trabalhar.
O processo é simples, vamos supor que quiséssemos manter um backup do rc.conf, podemos fazer:
$ mkdir ~/Documents/etc
$ cp /etc/rc.conf ~/Documents/etc/rc.conf
$ sudo rm /etc/rc.conf
$ ln -s ~/Documents/etc/rc.conf /etc/rc.conf
Atente para o fato de que ~/Documents é o meu diretório de sincronismo com o dropbox, você pode ter configurado outro durante o wizard. Tenha em mente que isso pode ser feito quase com qualquer arquivo de configuração, como arquivos do vim (~/.vim e ~/.vimrc), ~/.bashrc, ~/.ssh, bom acho que você pegou a idéia
Bom, é isso. Tenha cuidado com o que você coloca na dropbox, lembre-se que se trada de um serviço on-line, que poder sofrer quedas e ataques de diferentes tipos, uma vez que alguem obtenha acesso aos arquivos lá, como suas chaves em .ssh sua segurança pode esta comprometida, o uso de chaves com palavra chave é o mais recomentando, mas mesmo assim não é garantia de 100% de segurança, afinal outro dia teve uma falha no Debian eu seus derivados comprometendo varias chaves por ai.
Resolvendo problemas do Emesene
Sep 17th
Bom, uma dica rápida para movimentar isso aqui. Já faz um tempo que estou usando o programa Emesene como cliente do msn. Até a versão anterior do pidgin, ele tinha a vantagem de implementar o protocolo mais novo do msn e permitir mensagem em off entre outras coisinhas. Como o novo pidgin também avançou nessa área, isso deixa de ser vantagem, mas mesmo assim ainda temos os plugins, alguns ao meu ver superiores aos do pidgin.
Mas tinha uns probleminhas bem chatos: tanto o plugin dbus quanto o spell não funcionavel corretamente, agora que formatei o computador e instalei o Archlinux me inspirei a ir atrás da solução.
Para o dbus a solução do problema foi sussa de achar, instalando o python-dbus resolve o problema, agora possa usar o plugin de musicas, que altera minha mensagem de status e ainda troca minha imagem pela capa do cd
Para o spell tive que ir atrás de informação, o problema é que ele reclama da falta do gtkspell, mas mesmo estando instalado não funciona. Procurando por um python spell ou algo parecido não se acha nada, acabei por encontrar nesta thread informação de qual pacote tem o suporte necessário. Para o Archlinux:
$ pacman -Ss gnome-python-extras
Para outras distro pode variar o nome do pacote, no Ubuntu me parece ser python-gnome2-extras.
VirtualHost não é host
Feb 20th
A muito estou trabalhando com desenvolvimento web, e sempre encontrei pelo caminho quem confundisse a configuração dos web servers, commumente chamada de VirtualHost com a configuração do host.
Para quem trabalha com redes ou servidores a definição de hosts, domínio, zonas e tantas outras coisas ligadas ao serviço de DNS são bem simples, mas nem todo desenvolver almeja entender ou querem entender como isso funciona, ao meu ver um erro, pois é muito importante entender pelo menos o básico de redes, para si tornar um bom programador.
Mas essa questão a parte, muitos confundem essa pequena diferença e acaba por não conseguirem configurar seus ambientes de testes corretamente. Para estes ai vai uma pequena explicação:
Como muitos já devem ter percebido ate aqui, VirtualHost não é o mesmo que host. Tente imaginar o seguinte o VirtualHost que você configurou dentro do seu web server é como um if ou um case, que testa por qual host o cliente chegou ao seu serviço. Ou seja ele esta lá analisado o cabeçalho das requisições http, e vê lá a informação de qual host o usuário digitou no browser para que ele conseguisse chegar ate seu servidor.
Já o host é como uma entrada em uma agenda de endereços que diz qual ip está associado a este nome. Existe duas formas de configurar um host, a primeira é através de um servidor de DNS, no caso do Linux commumente se utiliza o bind para tal tarefa, no caso do Windows existe uma implementação desse tipo de serviço em versões server, que por sinal utiliza muito do código do bind, para usuário domésticos ou mesmo programadores há uma serie de software comerciais que desempenham este papel.
Apesar da configuração do servidor de DNS ser a opção com mais características e com mais flexibilidade, se trata de uma configuração complexa, e muitas das vezes inviável ao programador, que quer apenas configurar um ambiente de teste. Em seu lugar podemos utilizar o apelido de ip, que é algo mais simples de ser configurado, com o empecilho de que só funciona na maquina onde for configurado.
Para esta configuração deve se editar o arquivo /etc/hosts no caso de ambientes Posix, como Mac os X, Linux, BSD’s, entre outros, e o arquivo C:/[windows|winnt]/System32/drivers/etc/hosts para máquinas Windows. Para ambos os casos a configuração é a mesma, adicione uma nova linha no arquivo e coloque primeiro o ip, depois o host, ficando assim:
... 127.0.0.1 apolo apolo.nasa.org 127.0.0.1 jupter ...
Observe quê se pode configurar mais de um apelido em uma mesma linha, basta apenas separar eles por um espaços. Algo muito importante que deve se deve entender é que essa configuração não é uma configuração de domínios, o fato de adicionar apolo.nasa.org não faz diferença algum para o domínio nasa.org, a não ser na minha própria maquina, o que estamos fazendo é apelidado o ip com o endereço inteiro: apolo.nasa.org para o ip 127.0.0.1.
Como isso funciona: quando um serviço ou um programa qualquer, como um browser, pede ao kernel do seu sistema para resolver o endereço chamado, o kernel antes de consultar o servidor de dns, verifica se para aquele endereço não existe uma entrada no arquivo hosts, uma vez encontrado um apelido ali, ele nem procura resolver o endereço no servidor, apenas responde com o ip.
Uma vez com o ip na mão o programa ou serviço, monta um cabeçalho http e envia-o ao ip na porta também especificada, o padrão é 80 para serviço de http. Dentre as informações que estão neste cabeçalho esta o nome do host que ser quer ter acesso, o web server recebe esse cabeçalho, e checa em seu “case” qual a configuração para este host.
Espero que isso possa ajudar aos programadores iniciantes que querem montar seus ambientes de teste para o desenvolvimento de aplicações web. Em um próximo post vou falar como é fácil configurar um VirtualHost no apache sobre Ubuntu, até lá!
