ter
ago 23rd

Se você atualizou o Firefox para as versões 4, 5 ou 6 provavelmente está tendo problemas para rodar testes de Cucumber com o Selenium Webdriver, obtendo o erro abaixo:

unable to obtain stable firefox connection in 60 seconds ( )
(Selenium::WebDriver::Error::WebDriverError)

Para corrigir “paliativamente” e continuar a rodar meus testes fiz o downgrade do Firefox para versão 3.6.19 executando os passos abaixo:

1) Precisei limpar completamente a versão anterior do Firefox usando o AppCleaner que é free;

2) Encontrei as versões anteriores do FF no OldApps.com;

3) Desabilitei o update de versões do FF em Preferences/Advanced/Update

Quem estiver como este mesmo problema no Ubuntu pode resolver com ajuda deste dois posts:

http://code.dblock.org/unable-to-obtain-stable-firefox-connection-in-60-seconds-downgrading-firefox-on-ubuntu

http://blog.troyastle.com/2011/06/downgrade-to-firefox-36-on-ubuntu-natty.html

ter
mar 16th

Melhorando o prompt do bash para RVM ...

Esses dias configurei meus sistemas operacionais para usar RVM que serve para gerenciar diferentes instalações do Ruby na mesma máquina.

Para instalar no Snow Leopard segui o tutorial do Akita “Limpando meu Ambiente de Desenvolvimento” e para instalar no Ubuntu segui o post do Barenko “Preparando o Ubuntu para múltiplos ambientes Ruby utilizando RVM” que é mais ou menos uma “tradução” do post do Akita para Ubuntu. Deixei tudo igual com exceção da linha onde tem “/var/lib/gems/1.8/bin/rvm-install” que alterei para

~/rvm-install

Porém como eu uso Git uma coisa que estava me incomodando é que o prompt do Bash em ambos SO não estavam adequados para mostrar a versão da RVM e o branch atual do Git ao mesmo tempo, então fiz algumas e alterações e encontrei algumas “frescuras a mais” para personalizar o prompt.
Substitua a linha que começa com “expost PS1=’….” no arquivo ~/.bashrc (Ubuntu) ou ~/.bash_profile (MacOS) para:

sudo gedit ~/.bashrc
export PS1='\[\033[38m\]\u\[\033[32m\] \w \[\033[1;33m\]`~/.rvm/bin/rvm-prompt i v
`\[\033[0;31m\] `git branch 2> /dev/null | grep -e ^* | sed -E s/^\\\\\*\ \(.+\)$/\(\\\\\1\)\ /
`\[\033[37m\]$\[\033[00m\] '

Com isto o prompt ficará assim

seu_usuario ~/projetos/blog ruby-ree  ( working ) $

Segue uma tabela com as cores existentes, se você quiser deixar a fonte em negrito use 1; ao invés de 0;

"\033[0;32m"
"\033[1;32m"

Cores
corPadrao=”\033[0m”
preto=”\033[0;30m”
vermelho=”\033[0;31m”
verde=”\033[0;32m”
marrom=”\033[0;33m”
azul=”\033[0;34m”
purple=”\033[0;35m”
cyan=”\033[0;36m”
cinzaClaro=”\033[0;37m”
amarelo=”\033[0;33m”
branco=”\033[1;37m”

Aproveitando que este post é sobre RVM, se alguém tiver dificuldades em rodar o script/console dentro de algum ambiente de RVM dá uma olhada neste post que tem uma solução para este problema.

Referências:
Limpando meu Ambiente de Desenvolvimento
Preparando o Ubuntu para múltiplos ambientes ruby utilizando RVM
http://ubuntuforums.org/archive/index.php/t-31247.html
http://www.vivaolinux.com.br/dica/Shell-script-com-texto-colorido

dom
fev 21st

Manipulando dados pelo shell do MongoDB ...

Assim como o MySql o MongoDB tem um shell para manipular dados diretamente na base, seguem os comandos (CRUD) básicos para inserir, buscar, atualizar e apagar documentos.

Para inicializar o shell:

/opt/mongo/bin/./mongo

Se tiver algum problema com este comando então faça isto:

cd /opt/mongo/bin/
./mongo

As linhas abaixo serão exibidas:

MongoDB shell version: 1.3.3-
url: test
connecting to: test
type "help" for help
>

Os comandos iniciais são:

show dbs Mostra todas as bases de dados
use dbname Aponta a váriavel “db” para a base digite no lugar de dbname
show collections Exibi as coleções da base em uso. As collections “equivalem” as tables nos bancos relacionais.
db.collection_name.insert(object) Cria um documento
db.collection_name.find() Exibi os documentos da coleção
db.collection_name.update(criteria_object_or_pair_key_value) Atualiza um documento com o critério ou chave par/valor definido
db.collection_name.remove(criteria_object_or_pair_key_value) Remove um ou mais documentos com o critério ou chave par/valor definido

Vamos à prática para exemplificar os comandos acima. Abaixo estamos verificando as bases existentes, definindo que usaremos a base “local”, confirmando que estamos na base correta e mostrando as coleções que neste caso ainda não existem.

> show dbs
admin
local
>use local
switched to db local
> db
local
>show collections
false

Agora vamos criar uma coleção de documentos chamada “minha_colecao” e inserir alguns dados.

>db.minha_colecao.insert({ nome: "Mauricio", fone: "12345678",  idade: 10 })
ObjectId("4b808e9a6eff")

Quando exibimos as coleções novamente temos “minha_colecao” e “system.indexes” sendo a última criada automaticamente.

>show collections
minha_colecao
system.indexes

Podemos verificar nossos documentos criados e inserir outros.

>db.minha_colecao.find()
{ "_id" : ObjectId("4b808e9a6eff"), "nome" : "Mauricio", "fone" : "5678", "idade" : 10 }
>db.minha_colecao.insert({ nome: "Monet", fone: "000",  idade: 100 })
ObjectId("4b912e9a6ef4")
>db.minha_colecao.find()
{ "_id" : ObjectId("4b808e9a6eff"), "nome" : "Mauricio", "fone" : "5678", "idade" : 10 }
{ "_id" : ObjectId("4b912e9a6ef4"), "nome" : "Monet", "fone" : "000", "idade" : 100 }

Para atualizar os documentos podemos após o hash passar o parâmetro “true” que força uma inserção caso o critério utilizado não seja encontrado.

>db.minha_colecao.update({nome: "Mauricio"}, {nome: "Amorim", fone: "000"}, true)
>db.minha_colecao.find()
{ "_id" : ObjectId("4b808e9a6eff"), "nome" : "Amorim", "fone" : "000", "idade" : 10 }
{ "_id" : ObjectId("4b912e9a6ef4"), "nome" : "Monet", "fone" : "000", "idade" : 100 }
>db.minha_colecao.update({nome:"Inexistente"},{nome:"Insere novo", fone:"2355"}, true)
>db.minha_colecao.find()
{ "_id" : ObjectId("4b808e9a6eff"), "nome" : "Amorim", "fone" : "000", "idade" : 10 }
{ "_id" : ObjectId("4b912e9a6ef4"), "nome" : "Monet", "fone" : "000", "idade" : 100 }
{ "_id" : ObjectId("4b987e9a6e10"), "nome" : "Insere novo", "fone" : "2355"}

Por último vamos remover todos os documentos seguindo um determinado critério, neste caso o “fone” igual a “000″. Cuidado! Se o parâmetro com um critério não for informado todos os documentos da coleção serão removidos.

>db.minha_colecao.remove({fone: "000"})
>db.minha_colecao.find()
{ "_id" : ObjectId("4b987e9a6eff"), "nome" : "Insere um novo", "fone" : "2355"}

As funções utilizadas acima também podem receber um objeto como parâmetro e seu funcionamento será idêntico.

> xyz = { nome: "Monet", fone: "111", profissao: "artista" }
>db.minha_colecao.insert(xyz)
ObjectId("18b12e9a6ef4")
>db.minha_colecao.find()
{"_id": ObjectId("18b12e9a6ef4"), "nome":"Monet", "fone" : "111", "profissao" : "artista" }

Estes são comandos básicos de manipulação de dados, mais informações podem ser encontradas nas referências abaixo. Recomendo os screencasts do Joon You que são bem práticos.

Referências:
MongoDB DBA Operations
MongoDB Advanced Queries
Screencast – Introduction MongoDB with Joon You
The interactive shell by Kyle