Páginas

Saturday, February 28, 2009

Brincando com o Bazaar (bzr)

Nesse carnaval tirei um tempo para ver como funciona o Bazaar.

Mas o que é isso? Bem, o Bazaar é um DVCS - Distributed Version Control System -, um software que, simplificadamente, serve para guardar diversas versões de arquivos. Em geral, esses "arquivos" estão relacionados a código-fonte, mas podem ser qualquer coisa, como imagens, pdfs, executáveis, etc.

Um sistema de versionamento famoso é o Subversion (svn), que é um sucessor do CVS. Entretanto, o Bazaar, assim como outros DCVSs, são essencialmente diferentes desses dois.

O SVN e o CVS são sistemas centralizados, com pouco suporte para operações offline, e possibilidades (facilidade) de colaboração limitadas. As operações de controle de versão ocorrem num repositório central, necessitando conexão de rede/Internet.

Já os sistemas distribuídos, possuem diversos repositórios; repositórios locais, onde o desenvolvedor pode salvar (commit) seu trabalho, e repositórios remotos onde ocorre a integração (merge) das partes.

Bem, a minha intenção aqui não é explicar como funciona o SVN nem o CVS, nem dar detalhes do que eles são. O trecho acima foi só para tentar nivelar os desentendidos :)

Mais informações nos links que apontam para a Wikipedia!


Voltando ao Bazaar, existem outros "concorrentes" por aí, boas opções também. Dentre as principais: Mercurial e Git.
Tenho usado o Git no meu estágio, e achei ele um pouco "fora do meu estilo". Também tem um ponto chato que é rodá-lo no Windows -- um grande problema. E como meu dia a dia é Linux pra cá, Windows acolá, então é uma limitação relevante pra mim.

Meu orientador Carlo me deu uma amostra grátis do Bazaar algumas semanas atrás, lá no NCE/UFRJ, e achei por bem tirar um tempo pra brincar com ele por minha conta. E foi o que fiz em algum momento do feriadão de carnaval. Instalei o Bazaar no Ubuntu e passei a usá-lo em um projeto pessoal.

A instalação foi muito fácil. Nos repositórios padrão do Ubuntu 8.10, a versão do Bazaar não era a mais recente, portanto, adicionei ao meu sources.list o repositório do Bazaar no Lauchpad.

Conforme diz aqui bastou eu abrir o gerenciador de pacotes e pedir para adicionar essas duas linhas:

deb http://ppa.launchpad.net/bzr/ppa/ubuntu intrepid main
deb-src http://ppa.launchpad.net/bzr/ppa/ubuntu intrepid main
Depois de atualizar a lista de pacotes disponíveis, lá estava o Bazaar 1.12, assim como o pacote bzr-gtk que traz uma interface gráfica pro mesmo.

Agora enquanto escrevo, vou instalar no Windows...
Extremamente fácil: só baixar e executar. Instalado e funcionando muito bem.
Desta forma, instalei o Bzr standalone, isso é, não está instalado junto ao meu Python do sistema.

Pois é, o Bazaar é escrito em Python, é muito fácil de usar, e é uma mão na roda para por exemplo manter o pendrive, notebook, e outros pcs sincronizados. E de quebra um local faz backup do outro...

A idéia do Bazaar é de ser um software fácil de usar, e com pouco tempo de uso já me sinto confortável para fazer diversas tarefas. Sua documentação é boa, funciona em qualquer lugar que rodar Python, o que significa umm... qualquer lugar...

Também é muito legal usar o bazaar interfaceando com outros sistemas de controle de versão. O Bazaar, até onde sei, é o único que pode ser usado com o SVN, Git, Mercurial, tudo ao mesmo tempo. Existem plugins que integram o bzr com cada um destes outros projetos, de forma que pela linha de comando do bzr posso fazer checkout e commits em repositórios svn... ou git...

Por fim, li uma dica muito bacana sobre como colaborar em projetos usando o bzr. O projeto pode estar usando qualquer controle de versão, ou mesmo usando nenhum :)

A idéia é a seguinte:
    # criar um diretório para guardar seu trabalho
mkdir projeto
cd projeto
# Criar um repositório do bzr (para otimizar o uso de espaço em disco)
bzr init-repo --trees .
# Pegue o codigo oficial do projeto
svn co http://url/do/repositorio/oficial/do/projeto original

Então agora temos um diretório contendo o código original do projeto. A idéia é deixar o diretório "original" intocado, sendo este apenas uma referência.

Agora vamos criar alguns branches no Bazaar para organizar o trabalho:
    # Criando um branch do bzr para o codigo original
cd original
bzr init
bzr add .
bzr ci -m'Importação do projeto'
# Criando um branch principal
cd ../
bzr branch original main

No branch main, podemos fazer as modificações necessárias para fazer o projeto rodar no nosso sistema, se for necessário. Essas modificações não serão enviadas de volta ao repositório original.

    cd main
# Faça as alterações locais e prossiga
bzr ci -m'Adicionando mudanças locais'

Agora, sempre que for trabalhar em um patch/funcionalidade, crie um novo branch para ela. Isso faz com que as mudanças no projeto original sejam independentes.

    # Criando um branch para trabalho em uma funcionalidade
cd ..
bzr branch main algumafuncionalidade
cd
algumafuncionalidade
# Implemente a fucionalidade e então
bzr ci -m'Adicionada funcionalidade xyz'

Agora, certifique-se que o código está atualizado em relação ao original para que seu patch seja limpo (atualize frequentemene para evitar uma grande quantidade de conflitos a serem resolvidos).

    cd ../original
svn update

Isso trará as mudanças do repositório SVN oficial do projeto (pode ser outro comando, de acordo com o controle de versão usado no projeto...). Não deve haver nenhum conflito nesse momento, já que nada foi feito localmente em 'original'. Note que podem haver novos arquivos (linhas com um A na saída do svn update). O comando bzr unknowns pode te ajudar agora. Se houver algum arquivo novo, adicione-o ao bzr:

    bzr add arquivonovo
# ou bzr add $(bzr unknowns)
bzr ci -m'Mesclando com original do svn revisão 1234'

Isso significa que seu branch original está atualizado no bzr. Agora é hora de propagar as novidades para os branches com cada nova funcionalidade. Mas antes vá ao branch main para manter suas alterações de funcionamento local.

    cd ../main
# Mesclar com as alterações em original
bzr merge
# Se houver algum conflito, solucione e então
bzr resolve file
# Quando tudo estiver ok (bzr status e bzr diff podem
# ajudar nessa hora)
bzr ci -m'Mesclando com original do svn revisão 1234'

E agora o mesmo para os branches de cada funcionalidade.

    cd ../algumafuncionalidade
bzr merge
# 'bzr resolve' se necessário
bzr ci -m'
Mesclando com original do svn revisão 1234'

Pode parecer muito trabalho (é mais simples que o Git :P), mas isso é feito bem rápido, especialmente se o desenvolvimento for feito "um passo de cada vez". Entretanto, os benefícios dessa forma de trabalhar superam essa trabalheira.

Como comparado ao svn o bzr é superior na hora de fazer merge, trabalhando desta forma reduzirá a quantidade de trabalho manual necessária para resolver conflitos.

Agora que você tem um nova funcionalidade implementada em um branch, você pode enviá-la para o repositório oficial do projeto!

É muito fácil. Já que separamos as funcionalidades em branches, os diffs sempre serão limpos, e para criá-los:

      bzr diff -r branch:../main > ../funcionalidade.diff

Agora você pode revisar o diff e enviar para os mantenedores do projeto como um patch.

Você pode deixar seu branch de lado, e criar novos branches se quiser trabalhar mais. Se os mantenedores pedirem alguma alteração no seu patch para a funcionalidade que enviou, basta voltar ao branch e fazer as alterações, e enviar um novo diff.

Se o patch for aceito, então suas alterações irão parar na próxima atualização do código no repositório svn, e irão se propagar para todos os seus branches bzr. Não haverá nenhum conflito.

Se o patch não for aceito, mas mesmo assim você qe manter suas alterações localmente, é também fácil. Simplesmente faça um merge do seu branch com o main branch, que então vai propagar para os outros branches de funcionalidade.
    cd ../main
bzr merge ../algumafuncionalidade
bzr ci -m'Adicionando funcionalidade'

Agora, quando você atualizar os outros branches de funcionalidade, eles vão receber a funcionalidade, sem que seus diffs a contenham, mantendo os patches separados.

Se quiser implementar um funcionalidade em várias etapas, você pode criar branches de funcionalidade que dependam um do outro.
     bzr branch main pequena.mudanca
bzr branch
pequena.mudanca grande.mudanca

Agora, as mudanças de pequena.mudanca se propagam para grande.mudanca, e você pode gerar três patches:

   # Diff para implementar pequena.mudanca
cd pequena.mudanca
bzr diff -r branch:../main
# Diff para implementar grande.mudanca
cd grande.mudanca
bzr diff -r branch:../main
# Criar diff para implementar grande.mudancao que é dependente de
# pequena.mudanca. Útil se a segunda parte da mudança ainda precisar
# ser discutida, ou se for aceita em etapas.
cd grande.mudanca
bzr diff -r branch:../pequena.mudanca

Portanto, fica aqui uma amostra de como o bzr pode trazer flexibilidade para trabalhar em um projeto, não importa qual controle de versão que seja usado oficialmente.


E eu, super feliz com o bzr :)

Anexos no Gmail: seleção múltipla e barra de progresso!

Eis que o Gmail ganhou mais uma novidade, muito esperada por mim :)
Só fui reparar agora, mas parece que essa novidade já está funcionando desde dia 25... (não notei nada diferente nos emails que enviei com anexo até o último que enviei agora a pouco...)

Agora, ao invés de ter que selecionar anexos um a um quando queremos compartilhar vários arquivos, podemos selecionar todos de uma só vez.
Isso funciona assim em outros lugares como Wordpress e Slideshare, e é extremamente conveniente. Também traz a sensação / experiência de usuário de uma aplicação desktop, onde isso é mais comum.

O fato é que agora na hora de enviar fotos não preciso apelar pro Thunderbird ou outro cliente de email... fica mais fácil passar mais tempo só na interface web!


Além dessa facilidade, a equipe do Gmail colocou uma barra de progresso, que ajuda a estimar quanto tempo vai levar para terminar de carregar seu anexo. Também muito útil quando anexando arquivos grandes e/ou em uma conexão com a Internet instável.

Mais detalhes no blog oficial:

Official Gmail Blog: Updates to attachments: multi-select and progress bars

Monday, February 23, 2009

Deixe Para Seus Filhos

Depois de um tempo pensando em como colaborar com uma amiga que fiz em Floripa no ano passado, finalmente eu e Elaine lançamos um blog juntos!

deixeparaseusfilhos.wordpress.com

A idéia é promovermos dicas de ecologia, meio ambiente, entre outros.
Esse é só o início da parceria, que visa criar algo maior e diferente de tudo que já existe! Sim, queremos dominar o mundo -- e queremos que o mundo não seja uma esfera de poluição.

Não podemos perder tempo!

Sunday, February 8, 2009

Windows 7 - video

Hoje baixei uma cópia de teste do Windows 7.
Segundo o site da Microsoft, já está quase terminando o período liberado para downloads. Resolvi testar :D

Baixei a ISO de 2,4 GB e instalei numa máquina virtual no VMware 6.5, com 1GB de RAM e 16GB de HD.

A instalação básica custou 7,4 GB, e logo fui olhar a pasta winsxs (do Windows Side-by-side). Para quem não conhece, essa pasta guarda informações importantes para o Windows, e muito sobre o tamanho absurdo dessa pasta pode ser encontrado na Internet.
Atualmente essa pasta winsxs no meu Windows Vista consome mais de 13GB. No Windows 7 recém-instalado, são 3,8GB.

O desempenho da máquina virtual ficou bastante aceitável, rodando num host Windows Vista com 2GB de RAM, Intel Core 2 Duo T7500 @ 2,2 GHz.

Fiz um vídeo curto com o VMware. Habilitei o recurso que omite os frames "em que nada foi feito", e com isso parece meio corrido.
É uma amostra muito rápida da cara padrão pós-instalação do Windows 7.
Navego pelo menu iniciar, abro o Windows Explorer, Windows Media Player, e o Internet Explorer 8.



Depois eu acabei mudando o tema do Windows, agora está muito melhor do que no Vista essa parte de customização sem precisar pagar por funcionalidade extra.
No momento estou calculando o Windows Experience Index, para ver como fica classificado o desempenho dentro da máquina virtual.

Mesmo no VMware, o Aero está habilitado e consegui rodar o jogo de xadrez Chess Titans, que tem peças em 3D com efeito glass. O host tem uma GeForce 8600M GT 512 MB.

Qualquer novidade eu publico aqui.

Saturday, February 7, 2009

iPod Touch undefined price

Interessado nos preços da família de produtos da Apple (parte importante para eu adquirir um Mac), acabei encontrando um bug no site da FNAC.

Vejam só, iPod touch com preço indefinido:



Parece que eles tem um problema na aplicação Flash, pois todos os produtos apresentam o mesmo erro.

Idéias para a Saúde Pública e Educação - TED2009 - Bill Gates

Assisti esse vídeo hoje, e tenho certeza de que ele deve ser espalhado para o maior público possível.

Trata-se de Bill Gates abordando dois problemas atuais. Note que não é o Bill Gates que você deve "conhecer", ele não está falando de Microsoft, nem de nada relacionado a tecnologia.
Gates fala sobre a erradicação da malária, grande causadora de mortes nos países pobres (Brasil inclusive).

Seu otimismo me contagia, tanto que me motiva e inspira a tomar ações que visam melhorar nosso mundo. Cada um de nós tem o poder de lutar por um mundo melhor, e isso não deve ficar só em palavras.

O outro tópico é como fazer ótimos professores. Sinto que tive o privilégio de ter grandes professores em minha vida, e ainda alguns por vir nos últimos anos de faculdade. Ter a presença de alguém que o motive e inspire em sua vida é uma experiência pela qual todos deveriam passar.

Hoje não me sinto tão bem para "falar bonito" sobre os dois temas, até porque o Bill já falou muito bem. Não deixem de acompanhar na íntegra suas palavras, elas certamente podem mudar sua forma de ver o mundo, e de acreditar em dias melhores.



Além do mais, eu não conhecia o TED. É um evento sobre "idéias que valem ser amplamente divulgadas". Certamente podemos encontrar outros tópicos igualmente interessantes no site oficial: TED.com
O evento está ocorrendo esta semana na Califórnia, portanto não vejo a hora de divulgarem mais vídeos no site!