ArthurGeek.net

Rails, Mac... e Rock'n Roll!

Pôr do sol em São Paulo

Git: Controle de versão do jeito certo

24 de Maio de 2008 às 10:52 · 2 comentários

Anote aí na sua agenda: dia 23 de agosto (é, tá longe!) tem palestra de Git no Treina Tom comigo! :)

Não deixe de conferir (e assistir) as outras palestras que vão rolar esse ano, todas com excelentes temas para desenvolvedores web!

Quanto aos screencasts, não esqueci deles não, falta o áudio, mas acontece que eu coloquei aparelho ortodôntico esse mês e falta me acostumar a falar melhor com eles. :)

Ah, Nando, valeu pela idéia do nome da palestra! ;)

2 comentários Tags:·

Git Bisect

23 de Maio de 2008 às 16:27 · 2 comentários

Você conhece o git bisect?

É uma das features mais interessantes do Git. E até hoje, eu nunca tinha usado o bisect. Mas o que ele faz? De acordo com o próprio site: “Find the change that introduced a bug by binary search”. Interessante, não?

Como funciona?

O bisect ajuda a encontrar quando um bug foi introduzido no seu código, marcando pontos nos commits como ‘bons’ e ‘ruins’, e examinando commits intermediários usando um algoritmo de busca binária que vai eliminando metade dos commits cada vez que você marca um commit como ‘bom’ ou ‘ruim’.

Exemplo

Suponha que tenhamos um projeto com o seguinte log:

commit 7dd0f15d4e9a5fc1f625c0ac6e4788de45e0c40f
Author: Homer Simpson <homer@simpsons.com>
Date:   Wed May 21 17:36:27 2008 -0300

    Commit 20

commit dc358142a0deb6e1ba8e15f55f5e851e7bcc1ecf
Author: Homer Simpson <homer@simpsons.com>
Date:   Wed May 21 16:50:44 2008 -0300

    Commit 19

commit 648160ea61e194f97c8e11a35866025dca46c9a4
Author: Homer Simpson <homer@simpsons.com>
Date:   Wed May 21 16:34:38 2008 -0300

    Commit 18

commit 786a02663af9aa8eed533ab574b79294eddff4fc
Author: Homer Simpson <homer@simpsons.com>
Date:   Wed May 21 16:34:22 2008 -0300

    Commit 17

commit 9b76092b44f714d780a45e99532593da7b744801
Author: Homer Simpson <homer@simpsons.com>
Date:   Wed May 21 16:14:08 2008 -0300

    Commit 16

commit a00ef3d4e836af6777350a5f157132a255804e67
Author: Homer Simpson <homer@simpsons.com>
Date:   Wed May 21 11:33:45 2008 -0300

    Commit 15

commit 526be2a6b652df597e4d5b7670d58e7f0767e2e3
Author: Bart Simpson <bart@simpsons.com>
Date:   Wed May 21 11:30:50 2008 -0300

    Commit 14

commit 67022233899f78aee7f120337f1ec434d238f23f
Author: Homer Simpson <homer@simpsons.com>
Date:   Wed May 21 11:30:31 2008 -0300

    Commit 13

commit 21b8739f2ff271baa492d358e426ea1fc87bb7d7
Merge: ecc25a6... 00560d4...
Author: Homer Simpson <homer@simpsons.com>
Date:   Tue May 20 19:32:29 2008 -0300

    Commit 12

commit 00560d4b5ff1a2d463bfa19ba3d6346566db8e12
Author: Homer Simpson <homer@simpsons.com>
Date:   Tue May 20 17:11:56 2008 -0300

    Commit 11

Nós temos uma funcionalidade que funcionava no Commit 11, mas que no Commit 20 não funciona, porém, não sabemos em que momento este bug foi introduzido. Mentira, eu sei que foi o Bart quem introduziu o bug no Commit 14, mas vamos supor que nós não sabemos disso ainda! :)

E agora, o Git poderá nos socorrer?

Aqui é que entra o bisect.

$ git bisect start
$ git bisect bad
$ git bisect good 00560d4b5ff1a2d463bfa19ba3d6346566db8e12
Bisecting: 4 revisions left to test after this
[a00ef3d4e836af6777350a5f157132a255804e67] Commit 15

Nós dizemos ao git que o commit atual é ‘bad’. E que o Commit 11 estava ok (passando o hash identificador do Commit 11). Sendo assim, o Git escolhe um ponto intermediário entre os 2 commits, resultando no Commit 15.

Nós testamos o sistema, e vimos que o bug já estava presente nesta versão, assim, ou ele foi introduzido neste commit ou antes dele. Se o bug não estivesse presente nesta versão, significa que ele foi introduzido depois. De qualquer maneira, eliminaremos a necessidade de checar metade dos commits.

Vamos dizer ao git que esta versão é ‘bad’:

$ git bisect bad
Bisecting: 2 revisions left to test after this
[21b8739f2ff271baa492d358e426ea1fc87bb7d7] Commit 12
$

O Git nos leva até o Commit 12, nós analisamos novamente e o bug não estava presente nesta versão, então, podemos dizer que esta versão é ‘good’.

$ git bisect good
Bisecting: 1 revisions left to test after this
[526be2a6b652df597e4d5b7670d58e7f0767e2e3] Commit 14
$

Voltamos ao processo novamente e descobrimos que esta versão estava ‘bugada’.

$ git bisect bad
Bisecting: 0 revisions left to test after this
[67022233899f78aee7f120337f1ec434d238f23f] Commit 13

Agora, se esta versão estiver ok, o bug foi introduzido no Commit 14, visto que já dissemos que os commits 12 e 15 estavam ok. Testamos, e esta versão encontra-se ok.

$ git bisect good
526be2a6b652df597e4d5b7670d58e7f0767e2e3 is first bad commit
commit 526be2a6b652df597e4d5b7670d58e7f0767e2e3
Author: Bart Simpson <bart@simpsons.com>
Date:   Wed May 21 11:30:50 2008 -0300

    Commit 14

:040000 040000 58adb210b90786fb300ae1d0f3b478adbe643fb0 4adb482917754cb560e3f0f586c4a0739ebab373 M    file.rb

Sendo assim, o Git nos informa que o Commit 14 é o primeiro ‘bad’ commit e que o bug foi introduzido ali. Após ter encontrado o bug, rodamos:

$ git bisect reset

E agora, podemos corrigir o bug. E reclamar com o Bart que foi quem introduziu ele! :)

Neste caso, era um intervalo de apenas 10 commits, mas se fosse um intervalo maior, o bisect também ajudaria, visto que ele usa um algoritmo de busca binária.

É ou não é, sensacional? :)

2 comentários Tags:··

Dreamhost + mod_rails

13 de Maio de 2008 às 18:37 · 5 comentários

O pessoal da Dreamhost anunciou hoje que todos clientes tem suporte para o mod_rails.

Resolvi migrar esse blog para o mod_rails, então, se alguma coisa de estranho aparecer por aqui, me avisem, pode ser isso. :)

Espero que o blog fique mais responsivo do que antes e não caia tanto também.

Boa sorte pro pessoal da Dreamhost e que eles possam resolver o ‘maior’ problema deles e de outros SharedHosts. :)

5 comentários Tags:··

*nix history Meme

13 de Maio de 2008 às 18:22 · 1 comentário

Nunca participei de um Meme. E por pura falta de tempo só hoje vi o post do Urubatan me convidando pra participar de um. (a falta de tempo também é um dos motivos por não ter saído mais screencasts de Git. Mas, eu ainda não esqueci deles, eles estão gravados, e eu vou tentar colocar o áudio essa semana ainda. Sério! :P). Achei o Meme interessante e resolvi entrar na brincadeira.

Bom, então vamos lá: a idéia é mostrar os comandos mais usados em nossas máquinas (no meu caso: Mac OS X).

Rodando o comando:

history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head

Eis o putput:

arthurgeek@GeekMac:~$ history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head
219 git
40 cd
29 mate
23 ls
20 rake
20 ssh
20 ./script/server
19 ./script/generate
13 ./script/console
11 cap
arthurgeek@GeekMac:~$

É, deu pra perceber que eu uso muito o GIT, TextMate, SSH, Scripts Rails e Capistrano. :)

Esse negócio de Meme tem que indicar outras pessoas, é? Ah, vou fazer isso não! :P

Então, quem quiser entrar na brincadeira também, coloque um comentário aqui ou escreva um post no seu blog. :)

1 comentário Tags:·

Voltando com tudo?

03 de Abril de 2008 às 12:38 · 2 comentários

Estava preparando a volta do blog com uma série de screencasts sobre o Git. O primeiro você pode baixar aqui.

Depois que me mudei para São Paulo no ano passado, o blog ficou parado. Primeiro eu não tinha internet aqui, depois, tinha internet, mas o MacBook atrasou mais de meses para chegar. E sem falar no problema maior: o tempo! :)

Quando tive a idéia de gravar esses screencasts, ainda no ano passado, não imaginava o trabalho que é! Gravar o vídeo, editá-lo, depois gravar a voz (mais trabalhoso ainda), fazer a edição final e depois, convertê-lo. Ufa!

Espero que os próximos screencasts não demorem tanto quanto esse primeiro. Por falar em demora, só resolvi gravar o áudio desse primeiro screencast depois que DHH anunciou que o Rails tá movendo do Subversion pro Git. Foi o empurrão que faltava pra gravar esse áudio. :)

Espero que vocês gostem do Screencast, e quero receber bastante críticas.

Ah, só não reparem muito no meu sotaque do interiorrr. ;)

2 comentários Tags:·

Screencast: Git - Compilando e Configurando

03 de Abril de 2008 às 11:51 · 9 comentários

A idéia veio no ano passado. O vídeo foi gravado há mais de um mês. Mas o áudio só foi gravado ontem mesmo. Depois de alguma demora, aqui está o primeiro, de muitos, screencasts gravado por mim:

Git – Compilando e Configurando

Você já deve ter ouvido falar do Subversion, não? E do Git? O Git é um sistema de controle de versões escrito por Linus Torvalds para controlar todo o código fonte do Kernel do Linux. Não vou explicar em maiores detalhes o que é o Git, para isso, procure no google.

Nesse screencast eu mostro como compilar o Git à partir do código fonte, configurá-lo e também mostro algumas funcionalidades bem básicas. Este é o primeiro Screencast de uma série sobre Git que eu pretendo fazer. Este primeiro é para iniciantes, mas também farei outros mais avançados com muitas dicas.

Download (43.6Mb, 7:47)

9 comentários Tags:·

RubyGems 1.1 no Mac OS X 10.5.2 Leopard

31 de MarAo de 2008 às 17:37 · 2 comentários

No sábado, saiu a nova versão do RubyGems, o gerenciador de pacotes do mundo Ruby.

Para atualizar, é só rodar o comando:

sudo gem update --system

Pronto! Só que, aqui no Mac OS X, ele instala a nova versão, mas o comando gem ainda aponta para a versão antiga:

$ gem -v
1.1.0
$

Talvez seja porquê o RubyGems agora é incluído por padrão no Leopard. Porém, eu queria desfrutar da velocidade para instalar novas gems que a versão 1.1 possui. Aqui vai uma solução:

$ sudo gem install rubygems-update
$ sudo update_rubygems

Funciona! Para aqueles que não necessitam da versão 1.1 com urgência, recomendo esperar um update da Apple (que pode demorar).

2 comentários Tags:···

RejectConf'07

19 de Novembro de 2007 às 18:54 · 1 comentário

Neste final de semana aconteceu o RejectConf’07. Muitas palestras e cases de sucesso. Mas com certeza o melhor foi finalmente poder conhecer a galera da comunidade Ruby/Rails pessoalmente. Akita, Carlos Brando, Eduardo Fiorezi, o pessoal do Pagestackr, entre outros feras. Agora precisamos marcar um “Nerds On Beer” com essa galera para trocarmos mais idéias.

E que venha a RailsConf Brasil! ;)

1 comentário Tags:··

Inatividade

14 de Novembro de 2007 às 12:58 · 0 comentários

Ultimamente o blog está muito parado. Quem acompanha meu twitter já sabe o motivo: me mudei para São Paulo no começo de Novembro.

Ainda tenho alguns rascunhos de artigos para terminar, espero fazer isto quando tiver um tempo.

O blog deverá ficar mais um pouco parado, pelo menos, até conseguir uma conexão à internet “em casa”.

Nenhum comentário Tags:

Edge migrations mais sexy

04 de Outubro de 2007 às 10:51 · 1 comentário

Um plugin que eu costumava usar muito era o Sexy Migrations. Era, pois uma sintaxe inspirada nele foi adicionado ao Rails Edge.

Agora que estou usando o Edge em alguns projetos meus, sinto falta do foreign_key (ou simplesmente fkey) que usava no Sexy Migrations e não está presente no Edge. Por isso, criei um patch que adiciona o suporte à foreign_key na sintaxe das migrations.

Então, onde você escrevia (com o Edge):

create_table :user do |t|
    t.integer :country_id
    [....]
end

Poderá escrever assim:

create_table :user do |t|
    t.foreign_key :country
    [....]
end

É uma mudança sutil, porém, útil.

Para ele fazer parte do Rails 2.0 é preciso que pelo menos 3 pessoas testem-no e comentem com um simples +1, de acordo com as novas regras para que um patch seja aceito no Rails.

Se você gostou da idéia, dê uma passadinha lá no ticket, aplique o patch e vote. :)

Update: O Patch agora faz parte do Rails 2.0. Com algumas modificações e novas funcionalidades.

Para começar, “t.foreign_key” virou “t.references” com alias para “t.belongs_to. E foi adicionado também uma opção => true” que cria a coluna com _type no final.

Finalizando, se antes você escrevia assim (com o Rails Edge):

create_table :taggings do |t|
  t.integer :tag_id, :tagger_id, :taggable_id 
  t.string  :tagger_type 
  t.string  :taggable_type, :default => 'Photo' 
end

Agora passa a escrever assim:

create_table :taggings do |t| 
  t.references :tag 
  t.references :tagger, :polymorphic => true 
  t.references :taggable, :polymorphic => { :default => 'Photo' } 
end

1 comentário Tags:···

Edge Rails

26 de Setembro de 2007 às 11:26 · 0 comentários

Você tem acompanhado as mudanças do Edge Rails, e quer testá-las naquele projeto que está começando?

Fácil, é só digitar no terminal:

rails myapp
cd myapp
rake rails:freeze:edge
# e se você for sortudo e tiver o textmate :)
mate myapp

Certo? Não, errado! Infelizmente, estes comandos não atualizam sua app para o Edge (é engraçado, mas estes comandos funcionam em algumas máquinas e na grande maioria não). Como saber se você está rodando o Edge? Verifique a pasta config, tem uma pasta initializers dentro dela? Se estiver rodando o edge tem que ter. Então, o que fazer para rodar o edge rails de verdade?

No Edge de verdade

Você precisa usar o comando rails de dentro do edge para gerar seu novo projeto.

cd ..
ruby myapp/vendor/rails/railties/bin/rails myapp_edgier
# e se você for sortudo e tiver o textmate :)
mate myapp_edgier

Agora verifique a pasta config. Hmm, legal! Aproveite e dê uma olhada na nova estrutura do environment.rb. Observe também que a pasta components não é mais criada.

Ok, agora você já está rodando um projeto no Edge, e resolveu criar mais um projeto. Vamos melhorar um pouco o processo. De volta ao terminal:

cd ~
svn co http://svn.rubyonrails.org/rails/trunk rails_edge
ruby ~/rails_edge/railties/bin/rails my_second_edgier_app
cd my_second_edgier_app/
# Você ainda precisa ter o edge rails dentro de sua aplicação
ln -s ~/rails_edge/ vendor/rails
# e se você for sortudo e tiver o textmate :)
mate .

Dessa maneira, você pode manter várias aplicações rodando o Edge, e atualizar o código em um local apenas. Quando você notar alguma mudança no Edge, rode:

cd ~/rails_edge
svn up

Um pouco de shell script

Vamos criar uma função em shell script para gerar novas aplicações já usando o Edge

mate ~/.bash_profile

Coloque a seguinte função no seu profile:

function edgie() { 
  ruby ~/rails_edge/railties/bin/rails $1 && cd $1 && ln -s ~/rails/trunk vendor/rails && mate . 
}

Atualizando nosso profile:

source ~/.bash_profile

Pronto! Agora você pode rodar:

edgie my_edge_app

Boa diversão com o Edge Rails! :)

Fonte: RailsTips: Even Edgier Than Edge Rails

Nenhum comentário Tags:·

Ok, eu me rendo!

30 de Agosto de 2007 às 11:20 · 0 comentários

Depois de ter escrito o post anterior, tenho usado bastante meu Tumblr. E tenho acompanhado o Twitter:”http://twitter.com/” de algumas pessoas.

Acho que agora eu pude “enxergar a luz” do Twitter.

Ok, a frase que vocês estavam esperando vem agora: Eu me rendo ao Twitter!

Mas, não vou parar de usar o Tumblr não! Percebi, que para simples pensamentos e conversas, o Twitter serve muito bem! Já, imagens, vídeos, links, etc, tudo isso vai pro Tumblr. Resumindo: tudo aquilo que for pensamento meu, postarei no Twitter, e tudo aquilo que for algum conteúdo que não é meu (links, citações, imagens, vídeos) vão pro Tumblr.

Ah, o fato de ter começado a usar a integração com o GTalk do Twitter realmente pesou muito. Meu IM fica aberto o tempo todo mesmo. :)

Nenhum comentário Tags:··

Twitter, TumbleLogs e afins

28 de Agosto de 2007 às 10:43 · 1 comentário

Ando vendo na Blogosfera brasileira um grande número de pessoas usando o Twitter. Para mim, assim como o Second Life (mas isso é assunto para outro post) isto não passa de um grande hype que não vai durar muito tempo.

Sério! Não consigo entender qual a graça de usar um sistema que tem um limite de caracteres muito baixo, não deixa postar vídeos (YouTube), imagens, etc. Neste sentido, TumbleLogs são muito mais interassantes, mais “ricos”.

Eu ando meio sem tempo de escrever por aqui (vocês devem ter percebidos). E não teria tempo de atualizar um Twitter ou um TumbleLog no tumblr.. Porém, não deixo de ler meus feeds (usando o Google Reader, é claro) todos os dias. Então, resolvi fazer como o Robert Scoble e seu famoso Link Blog.

A partir de agora, sempre que achar algum texto interessante, irei compartilhar no Google Reader. Vocês podem acessar através do link Link Blog no menu acima. É um “algo” a mais além dos links diários do del.icio.us que incluo no Feed (a propósito, vocês acham interessante manter isto no Feed, ou não?).

E para tudo aquilo em que não encontro via Google Reader? (o Digg é minha página principal). Acredito que conteúdo (links, imagens, vídeos) desse tipo serão menos frequentes, então, criei uma conta no Tumblr..

Talvez eu deixe o blog um pouco de lado com isso. Ou melhor: vou criar um script Ruby que agrega os feeds do del.icio.us, do Link Blog, deste blog e do Tumblr.. Mas isso eu deixo para quando tiver mais conteúdo no Link Blog e no Tumblr.

Update: Parece que o Tumblr já tem opção para agregar vários feeds. Vou testar o serviço, e quem sabe, vou usar até o serviço de usar meu próprio domínio como interface para o Tumblr. Interessante!

1 comentário Tags:···

CodeShow

13 de Agosto de 2007 às 12:52 · 0 comentários

Sexta feira estarei no CodeShow. Se você estiver por lá, me chame para batermos um papo. ;)

Nenhum comentário Tags:

Daniel Robbins e a Fundação Gentoo

31 de Julho de 2007 às 15:58 · 1 comentário

Retirado de: Daniel Robbins e a revolução de bastidores no Projeto Gentoo

Daniel Robbins, o fundador do projeto Gentoo, tem um histórico curioso de relacionamento com o projeto: ele abriu mão voluntariamente do papel de líder do projeto em prol de uma fundação integrada por outros participantes, em seguida abriu mão de participar do Gentoo, meses depois tornou-se funcionário da Microsoft durante um curto período, após sair de lá retornou ao Gentoo como desenvolvedor, e saiu insatisfeito novamente em março deste ano.

Eu usei o Gentoo por muito tempo. Adorava o fato de poder customizar ao máximo minha distro e principalmente estar sempre com as últimas versões dos programas (Adoro viver “on edge”). Porém, não gostava do imenso tempo que demorava para compilar um OpenOffice, Firefox, etc.

Enquanto eu usava Gentoo, o que mais gostava era a comunidade, sempre muito prestativa nos fórums ou via IRC. Acontece, que de uns tempos pra cá eu percebi que o projeto parecia meio abandonado. Nem a GWN (Gentoo Weekly News) era atualizada! Parece que a comunidade tinha ficado muito “politizada” para o meu gosto. Quem me garante que se o Robbins voltar, a comunidade voltará a ser como era antes? Eu acredito que não! Sem falar que “ninguém quer ele lá”.

Nos tempos do Robbins, eu achava que os ebuilds não demoravam a sair. Nos meus últimos meses com Gentoo, cheguei a esperar meses por ebuilds da nova versão do Gnome. O que me levou ao Gentoo, fora isso, oras! Não esperar por muito tempo para estar com as últimas versões dos softwares (estáveis ou não) em minha máquina.

Foi aí que eu migrei para o Arch Linux.

Não fiquei muito tempo, pois me apaixonei pela maçã. Mas, se o OS X não fosse um *nix “por baixo”, não sei se usaria não. Não consigo ficar sem as ferramentas de um *nix.

1 comentário Tags:···