Novo endereço

Finalmente tomei vergonha na cara e comprei o domínio para a minha empresa. Por conta disso, pretendo mover o site para esse novo domínio. E, dado

  • Minha preguiça em manter um servidor com WordPress;
  • Minha mão-de-vaquice para pagar o WordPress.com;
  • Minha curiosidade sobre o Jekyll.

Estou testando o Jekyll e o Github Pages como nova plataforma para o blog.

Portanto, esse é meu último post por aqui.

Nos vemos em www.beyondclick.com.br

Anúncios

Aprendendo a programar

Como já expliquei, trabalho com desenvolvimento de software desde 2002. E, já trabalhei com empresas de micro à multi-nacionais. Do setor público, privado, mistas e a Petrobras 🙂

Recentemente, amigos e irmão de amigos que vem me perguntar como começar a programar.

De tanto responder a essa pergunta, comecei a criar, na minha cabeça, um guia para iniciante. Basicamente, uma trilha que eu costumo sugerir a todos os que começam.

Este guia tem como premissa, formar um programador de Aplicativos Web que irá utilizar a linguagem Ruby com o framework Rails.

A primeira coisa que costumo explicar para as pessoas, é que para programadores, saber ler em Inglês não é diferencial, mas requisito.

Dito isso, segue meu caminho das pedras:

  • Blocky: É o primeiro contato com programação que você deveria ter. A partir daqui dá pra ter uma idéia do que é o nosso trabalho.
  • Squeak: Learn Programming with Robots: Vai te introduzir no que é fazer um programa.
  • Programming Ruby: Vai te introduzir na linguagem.
  • Ruby Warrior: Mesma idéia do Blocky e do Squeak, mas usando a linguagem Ruby, desta vez. Acho interessante ver este, depois de ler o livro de Ruby, porque você já terá sido apresentado aos conceitos da linguagem.
  • Growing Object-Oriented Software, Guided by Tests: Primeira coisa que você deveria aprender, depois de programar, é como validar se seu programa funciona como você espera. Os exemplos estão escritos na linguagem Java, mas é fácil de entender.
  • Agile Web Development with Rails 4: Aqui você vai construir uma aplicativo web de e-commerce usando a linguagem Ruby e o framework Rails. Além de aprender o framework, o livro é útil por sugerir uma forma de trabalho para o programador.
  • Javascript: The good parts: Vai ensinar a escrever código JavaScript, a única linguagem que roda no browser, que cause menos problemas para manter e evoluir.

Ao final dessa linha de estudo, espero, que você tenha conhecimento suficiente para começar a traçar o seu próprio caminho.

Pretendo atualizar esse texto, caso eu veja algum livro me chame atenção o suficiente, para eu defendê-lo como básico. Por exemplo, quando encontrar um sobre banco de dados relacionais que use, preferencialmente, o SQLite, PostgreSQL ou MySQL nos exemplos.

Esta é a minha visão de como começar a programar. E, você o que pensa sobre ela? Alguma sugestão?

Commit parcial no Git

Sabe quando você quer fazer o commit de apenas parte de um arquivo?
Usando o parâmetro -i o git irá executar o add no modelo interativo.

No exemplo irei usar o arquivo vimrc.

git add <vimrc> -i

Como resposta ele irá apresentar os comandos disponíveis:

           staged     unstaged path
  1:    unchanged       +15/-4 vimrc

*** Commands ***
  1: status	  2: update	  3: revert	  4: add untracked
  5: patch	  6: diff	  7: quit	  8: help
What now>

Escolhendo o comando 5, ele irá perguntar qual arquivo você quer adicionar, parcialmente, no stage.

           staged     unstaged path
  1:    unchanged       +15/-4 vimrc
Patch update>>

Selecione o arquivo que você irá adicionar, no stage, informando o número do arquivo. No caso, só tenho um arquivo para adicionar.
Selecionado o arquivo o git apresenta a primeira diferença do arquivo e pergunta o que fazer com ela.

diff --git a/vimrc b/vimrc
index 5199dfd..aa2b489 100644
--- a/vimrc
+++ b/vimrc
@@ -17,15 +17,16 @@ Bundle 'scrooloose/nerdcommenter.git'
 Bundle 'scrooloose/nerdtree.git'
 Bundle 'kien/ctrlp.vim'
 Bundle 'tpope/vim-endwise.git'
-Bundle 'claco/jasmine.vim.git'
-Bundle 'groenewege/vim-less'
+"Bundle 'claco/jasmine.vim.git'
+"Bundle 'groenewege/vim-less'
 Bundle 'tpope/vim-ragtag.git'
-Bundle 'tpope/vim-rails.git'
 Bundle 'vim-ruby/vim-ruby.git'
+Bundle 'tpope/vim-rails.git'
+"Bundle 'm2ym/rsense'
 "Bundle 'tpope/vim-pathogen.git'
+"Bundle 'm2ym/rsense'
 " ==========================================
 
-
 filetype on           " Enable filetype detection
 filetype plugin on    " Enable filetype-specific plugins
 filetype indent on    " Enable filetype-specific indenting
Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?

Para:
– n: ignorar esta diferença e ir para a próxima e vai para a próxima diferença
– y: adiciona a diferença no stage e vai para a próxima diferença
– q: termina a interação com esse arquivo

Ao final das diferenças no arquivo ele volta para o estado inicial do add. Use 7 para sair.

Feito isso, se você não tiver adicionado todas as diferenças no stage, o git status irá informar que o arquivo vimrc está no stage e está modificado.

Pronto!

Agora temos apenas parte do arquivo adicionado no stage, usando o commit interativo do git.

Fonte: http://git-scm.com/book/en/Git-Tools-Interactive-Staging

Git para SVN de forma manual

Tem esse projeto que eu comecei usando o Git, mas tenho que entregar em um SVN.

Daí para não bagunçar o checkout que fiz do SVN resolvi continuar usando o Git e copiar os arquivos para o diretório onde está o checkout do SVN.

Para saber quais arquivos tenho que copiar uso o

git diff <id_do_commit_que_ainda_não_copiei> --name-only

Para copiar os arquivos listados eu uso o xargs* com cp.

xargs -I {} cp {} ../projeto_no_svn/{}

Assim, para cada arquivo listado pelo git diff, o xargs vai executar um comando:

cp diretorio/arquivo.algumacoisa ../projeto_no_svn/diretorio/arquivo.algumacoisa

O comando completo fica:

git diff <id_do_commit_que_ainda_não_copiei> --name-only | xargs -I {} cp {} ../projeto_no_svn/{}

* Fonte: http://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/

Configurar ambiente de QA e Produção no Heroku.

Estou com um projeto pessoal no Heroku.
Recentemente surgiu a necessidade de criar um ambiente para demonstração. Como todo meu desenvolvimento está sendo feito no master tenho que informar qual o branch remoto que desejo fazer o push.

Criar o branch de qa e produção:

git checkout -b qa
git remote add heroku-qa git@heroku.com:appname-qa.git
git fetch heroku-qa
git branch qa --set-upstream-to=heroku-qa/master

git checkout master
git branch production --set-upstream-to=heroku-production/master

Isso resolve a questão de qual código está em cada ambiente. Mas, me gera o problema de, sempre que quero fazer um push preciso usar:

git push heroku-qa HEAD:master

Para resolver isso, mudo o local de onde o git vai procurar no servidor remoto. Ao invés de procurar um branch, remoto, com o mesmo nome do local, ele usa o branch configurado como upstream.

git config push.default upstream

Mais informações sobre o destino do push em: http://git-scm.com/docs/git-config.html:

push.default
Defines the action git push should take if no refspec is given on the command line, no refspec is configured in the remote, and no refspec is implied by any of the options given on the command line.[…]

Agora, já posso fazer apenas um git push, que o git sabe para qual branch remoto mandar, de acordo com o branch local.

Gostaria de saber mais?
http://longair.net/blog/2011/02/27/an-asymmetry-between-git-pull-and-git-push/
http://stackoverflow.com/questions/13148066/warning-push-default-is-unset-its-implicit-value-is-changing-in-git-2-0

Uninstall all gems

Sabe quando você manda um bundle install fora do gemset que você pensava que estava?
E, que você se dá conta de que está usando o Ruby do MacOS? E, que quando você tenta usar o gem uninstall nome_da_gem ele dá um erro parecido com:
cannot uninstall, check `gem list -d

Então, como limpar a besteira?

Primeiro, monta um arquivo com as gems que foram instaladas:
gem list | grep '(' | sed "s/ .*//" > installed_gems

Daí você lê o arquivo e manda apagar cada uma das versões instaladas
cat installed_gems | xargs sudo gem uninstall -x -a -i "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8"

Só apagar o arquivo com a lista das gems instaladas.
rm installed_gems

Pronto. Acabei de remover todas as gems instaladas no Ruby do MacOS.

Fontes:
http://docs.rubygems.org/read/chapter/10#page38
http://www.ruby-forum.com/topic/174847#765923

Mini tutorial virtualenvwrapper

Não é o guia definitivo do virtualenv, mas serve como um guia rápido de bolso, para o uso diário 🙂

Praticamente uma tradução do gerenciando ambientes com o virtualenvwrapper.

Criando um ambiente, quando criar o ambiente, o virtualenvwrapper já passa a usá-lo:
mkvirtualenv [nome-do_ambiente]

Instalando um arquivo requirements.pip usando o pip:
pip install -r requirements.pip

Um arquivo requirements.pip é um arquivo texto com uma lista de pacotes, num formato conhecido pelo pip.
Exemplo de um requirements.pip ——————————————–
django=1.3
mock
git+git://github.com/cmheisel/nose-xcover.git#egg=nosexcover

—————————————————————————

No caso acima, ele vai instalar os pacotes:

  • django, na versão 1.3
  • mock, na última versão disponível
  • nose-xcover, usando o último commit, e nomeando o arquivo egg para nosexcover

No momento da criação do ambiente, você pode informar o arquivo de dependências:
mkvirtualenv [nome-do_ambiente] -r requirements.pip

Para ver os ambientes existentes:
lsvirtualenv

Mudar para outro ambiente existente:
workon [nome-do_outro_ambiente]

Para remover um ambiente:
rmvirtualenv [nome-do_ambiente]

Lembrando que para remover o ambiente atual precisa mudar para outro, ou desativar o virtualenvwrapper:
deactivate