Configurando um ambiente de desenvolvimento Ruby on Rails 3.2 no Mac OS X 10.8.4

Há um tempo atrás eu resolvi documentar a maneira na qual eu preparava o meio ambiente ruby no Ubuntu, pra tentar evitar de ficar horas e horas no Google achando como instalar as coisas.

Para quem quiser conhecer o post anterior aí está:

http://www.cezinha.info/2012/07/22/configurando-um-ambiente-de-desenvolvimento-ruby-on-rails-3-02-no-ubuntu-12-04/

E não é que deu certo? De lá pra cá eu tive que reinstalar algumas vezes o meu ambiente e não tive dores de cabeça com isso. E pelo número de acessos que eu tenho naquele post, eu acho que ele acabou sendo bastante útil pra outras pessoas também.

Pois bem, o objetivo deste post é o mesmo, porém em outro SO. O lance aqui é preparar um ambiente de desenvolvimento Ruby on Rails no Mac OS X.

Gostaria de enfatizar apenas que o que você encontrará aqui é uma receita de bolo bem específica. Se você quer saber o que é cada coisa que estamos instalando aqui, então saiba que você está no post errado.

O ambiente terá:

  • Git
  • Gem
  • Ruby
  • RVM
  • RSpec
  • Rails
  • Cliente/Servidor MySQL
  • Outros

Todos os passos abaixo foram testados no Mac OS X 10.8.4. Se você estiver com dúvidas sobre a sua versão então experimente o comando abaixo:

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.8.4
BuildVersion:	12E55

Instalar o XCode

Este passo é bem importante. Sem ele você não consegue usar o Homebrew e provavelmente não conseguirá compilar outras coisas. Acho que é o passo mais demorado. O download é de +/- 1.5GB (nesta data).

Você pode fazer a instalação facilmente via App Store. É grátis.

Depois de instalado você precisa também instalar as “Command line tools”. Pra isso siga os passos abaixo:

a. Abra o Lauchpad;
b. Localize e abra o Xcode;
c. Acione command-virgula pra abrir as configurações do Xcode;
d. Vá na guia Downloads;
e. Mande instalar as “Command line tools” (aff… mais 120MB preciosos do meu SSD).

Eu achei isso uma derrota! Demorou uma eternidade. Seria ideal fazer isso tudo com uma linha de comando e se possível com menos espaço em disco. É provável que eu recebi um monte de porcaria que nunca irei utilizar.

Homebrew

Infelizmente o OS X não possui um gerenciador de pacotes padrão como o apt-get do Ubuntu. Mas, existe uma boa alternativa chamada Homebrew. Pela pouca experiência que eu tenho neste SO, me parece ser a solução mais adotada. E o melhor: ele é feito em Ruby :-) .

Para instalá-lo basta executar a linha abaixo:

$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"

Você poderá conhecer mais sobre o Homebrew no site abaixo:
http://brew.sh/index_pt-br.html

Git

Hoje em dia não tem mais como trabalhar sem o git, né? Então aí vai:

$ brew install git
$ git --version
git version 1.8.3.4

Nós precisamos também nos identificarmos para o git e vamos aproveitar também para colorir o prompt dele. Para isso abra o arquivo ~/.gitconfig e cole o script abaixo:

$ cd ~
$ vim .gitconfig
...
[user]
  name = Cezinha
  email = cesar@asseinfo.com.br

[log]
  date = local

[color]
  status = auto
  branch = auto
  interactive = auto
  diff = auto

MySQL

Este passo instalará tanto o cliente quanto o servidor MySQL. No meu caso eu uso o MySQL para desenvolvimento na minha máquina local. Se você utiliza outro banco, como por exemplo o SQLite, acredito que este passo não seja importante pra você.

A instalação do MySQL também se dará através do Homebrew:

$ brew install mysql

O processo deve demorar um pouco. Depois disso é só conferir:

$ mysql --version
mysql  Ver 14.14 Distrib 5.6.13, for osx10.8 (x86_64) using  EditLine wrapper

Para colocar o servidor de pé basta usar:

$ mysql.server start

Ou para derrubá-lo:

mysql.server stop

Caso queira que o MySQL já carregue junto com o login, basta rodar as duas linhas abaixo:

$ ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

Eu particularmente prefiro acionar manualmente sempre que precisar.

Ruby e Gem

O OS X já vem com o Ruby instalado e Gem instalados por default. Provavelmente não é a versão mais atual. Você pode checar isso através do comando abaixo:

$ ruby --version
ruby 1.8.7

$ gem --version
1.3.6

Dá pro gasto pra instalarmos as demais ferramentas. Por enquanto vamos deixar como está.

RVM

Com o RVM você poderá rodar diversas versões do Ruby e diversos Gemset no mesmo computador.

$ \curl -L https://get.rvm.io | bash

Você pode obter maiores informações sobre o RVM no link abaixo:
https://rvm.io/rvm/install

Importante: o rvm só ficará disponível pra você depois de fechar o terminal e abrir novamente. Ele já estará configurado no seu usuário.

Você pode verificar o seu rvm assim:

$ rvm --version
rvm 1.21.16

Autolibs

O Autolibs é uma mão na roda para o RVM. Ele tentará resolver automaticamente as dependências do que você tentar instalar no RVM.

Você pode consultar se ele está instalado assim:

$ rvm autolibs show
default (fail) ou disable -> significa que não está habilitado.

Para habilitá-lo você pode fazer assim:

$ rvm autolibs enable

Ruby dentro do RVM

Lembra que um pouco mais cedo eu escrevi que o ruby já vinha com o OS X, mas o mesmo provavelmente não seria do seu agrado? Então, agora você pode instalar o ruby que você precisa dentro do RVM sem zoar com o ruby default do SO.

Vamos instalar o Ruby 1.9.3:

$ rvm install 1.9.3

Se você quiser instalar outra versão, basta usar o rvm install novamente. Veja só como faríamos se quiséssemos instalar o ruby 2.0.0:

$ rvm install 2.0.0

Depois podemos consultar todos os rubies instalados com o comando abaixo:

$ rvm list

Para deixar o ruby 1.9.3 como default faça o seguinte:

$ rvm use 1.9.3 --default

Você pode consultar ainda quais rubies estão a sua disposição para serem instalados:

$ rvm show known

Para comutar entre os rubies use:

$ rvm use ree

ou

$ rvm use 1.9.3

ou

$ rvm use system

Este último utilizará o ruby do sistema. Ei! Chega de explicações. Como disse anteriormente, este post não tem como objetivo ensinar a usar nada, ok? Apenas instalar.

Rails

Vamos instalar agora o Rails dentro do RVM para o Ruby 1.9.3.

$ rvm use 1.9.3
$ gem install rails --version=3.2.13

Aguarde um pouco até o processo terminar. Isso pode demorar.

Teste agora o rails:

$ rails --version
  Rails 3.2.13

Veja ainda que o Rails não foi instalado no 2.0.0:

$ rvm use 2.0.0
$ rails --version
O programa rails não está instalado no momento.

Pra evitar problemas, volte ao 1.9.3:

$ rvm use 1.9.3

E por último, mas não menos importante, vamos instalar o RSpec:

$ gem install rspec
$ gem install rspec-rails

Importante:
Não esqueça de adicionar as linhas abaixo no Gemfile do seu projeto Rails caso ainda não estejam:

group :test, :development do
  gem "rspec-rails", "~> 2.4"
end

Nem disso (execute dentro do diretório do projeto):

$ rails generate rspec:install

Deixando tudo mais colorido…
Este passo não é tão importante, mas é bacana. Ele irá deixar o seu shell mais estilizado. Ele ficará colorido, mostrará a versão do ruby do RVM, mostrará o branch do git e o nome do diretório. Segue abaixo o que você deve colar em seu .bash_profile:

$ cd ˜
$ vim .bash_profile

..
# Colorindo o ls e o grep
export GREP_OPTIONS="--color=auto"
export GREP_COLOR="4;33"
export CLICOLOR="auto"

# ls / ll
alias ls="ls -G"
alias ll="ls -l"

# Mostrar o git no prompt
# Origem: http://www.developerzen.com/2011/01/10/show-the-current-git-branch-in-your-command-prompt/

function parse_git_branch () {
       git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
 
RED="\[\033[0;31m\]"
YELLOW="\[\033[0;33m\]"
GREEN="\[\033[0;32m\]"
NO_COLOUR="\[\033[0m\]"
 
PS1="$GREEN\u@machine$NO_COLOUR:\w$YELLOW\$(parse_git_branch)$NO_COLOUR\$ "



Você encontrará diversas versões deste script na web.

Pronto! Agora é só começar a trabalhar.

Espero que gostem.

Wireless parou de funcionar misteriosamente no Ubuntu 12.04

Como a maioria dos notebooks, o meu possui uma chave que permite ligar ou desligar a placa wireless. Eu não sei o que eu fiz exatamente, mas em uma das vezes que eu desliguei tal chave, ao religá-la o Ubuntu não habilitou mais a rede.

Se eu fosse no menu da rede na barra superior da tela, eu recebia a mensagem “a rede sem fio está desabilitada por hardware.”.

wireless.ubuntu.barra

Nem no ifconfig aparecia nada:

wireless.ifconfig.problema

Depois de algumas googladas eu encontrei as seguintes instruções que me ajudaram:

$ sudo rfkill unblock wlan
$ sudo ifconfig wlan0 up

Como mágica tudo voltou a funcionar!

wireless.ifconfig.corrigido

Minha ida ao Agile Alliance Florianópolis Open Space 2013

Ontem participei da primeira edição do Agile Alliance Florianópolis Open Space. O que dizer de um evento como este? Simplesmente fantástico.

open_agile_banner

open_agile_dashboard

Foi uma experiência única. A maior parte do evento era em Inglês, pois haviam participantes de vários países como, França, EUA e Austrália.

open_agile_host

Era bem comum você estar participando de uma sessão em Português e de repente “os gringos” invadirem a sessão e as discussões passarem a ser feitas em Inglês. Isto aconteceu em uma sessão onde eu era o host. Todos os meus convidados eram brasileiros e estávamos discutindo e estávamos discutindo em Português. De repente uma francesa e um americano entraram na jogada e todos nós passamos a discussão para o Inglês.

Eu gostaria de enfatizar isso, pois mais uma vez eu fui sensibilizado não só de como o Inglês é importante para a nossa área em particular, mas sim como uma ferramenta de inclusão social. Por isso meu amigo… keep studing English, ok?

open_agile_cezinha

A infra-estrutura não deixou nada a desejar. O cuidado com os participantes, o coffee-break, o almoço e até mesmo o cocktail de encerramento. O evento começou e terminou pontualmente. O pessoal da Agile Alliance é agile até nisso :-)

Gostaria de agradecer muito ao Samuel Crescêncio. Imagino que ele tenha se empenhado bastante para trazer o evento ao Brasil. O cara é, indiscutivelmente, uma das grandes figuras do movimento ágil no Brasil.

Agora é rezar bastante para que no futuro possamos ter mais edições do evento aqui no Brasil.

Baixar um site inteiro somente com wget

Vai aí uma dica bem simples de como baixar um site inteiro usando apenas o comando wget do Linux:

 $ wget -r -k -p www.meusite.com.br

Onde:

-r Recursivo.
-k Converter links para visualização local.
-p Baixa todos os requisitos necessários para a página ser visualizada, como por exemplo, os arquivos css, imagens e javascript.

O site da ASSEINFO usava antes o WordPress como engine. Eu queria convertê-lo para uma outra plataforma mais simples e para isso eu precisava de todo o HTML dele.

Me tomaria muito tempo pra extraí-lo dos templates do WordPress. Então eu “chupei” tudo com o wget e depois eliminei as duplicidades.

O wget facilitou muito o processo de conversão.

Protip: é muito feio plagiar os outros. Sem contar que, em determinados casos, isso também é ilegal. Só copie aquilo que lhe pertence ou que a licença do conteúdo lhe permita.

Impressão direta utilizando o Gerenciador de Impressões do Windows com Delphi XE

Tem certas ocasiões que é preciso imprimir, usando o Delphi, sem passar pelo driver de impressão do fabricante. Podemos citar, por exemplo, a impressão de etiquetas em impressoras térmicas ou ainda usar impressoras não-fiscais de 40 colunas que utilizam bobina. Um outro exemplo seria a impressão em impressoras matriciais em modo rascunho. Se você utilizar o driver do fabricante, o mesmo acabará imprimindo o que você deseja em modo gráfico – muuuiiitoo mais lento!

Normalmente o pessoal faz isso acessando diretamente a porta da impressora com um AssignFile ou AssignPrn. Segue abaixo um exemplo:

Ok! O código acima funciona até certo ponto. Os problemas começam a aparecer quando você necessita cuidar do estado do dispositivo. Imagine que você tenha que imprimir mutia coisa. O seu programa ficará preso até que a impressora libere-o. Ou ainda você terá que se preocupar em criar um mecanismo de seleção de portal – o código acima está fixo LPT1. Ou pior, o seu cliente compra uma impressora USB. Daí o seu mundo acabou, pois com o código acima não é possível imprimir. Você teria que fazer uma bela enjambra para acessar a porta USB como se fosse um compartilhamento de rede.

Mas então qual seria a alternativa para continuar tendo controle do que será enviado para a impressora sem ter que se preocupar com toda essa infra?

A alternativa seria acessar o Gerenciar de Impressões do Windows utilizando as funções da Unit WinSpool. Veja abaixo um código mostrando a estrutura básica para isso:

A título de ilustração eu criei duas variáves chamadas TextoUnicode e TextoAnsiString. É que o string do Delphi XE agora é Unicode e as funções do WinSpool esperam AnsiString. Obviamente no seu código original você pode fazer uma função mais simples pra tratar esta situação.

O código acima serviu de base para a correção de componente que eu estou dando manutenção. Para conhecer um pouco mais o projeto acesse https://github.com/cesarjr/RSPrint.

É isso aí!

Instalando a Ruby Gem MySQL2 no Ubuntu 12.04

Se o seu projeto Rails acessa MySQL, então você precisará declarar em sem Gemfile a gem mysql2.

Mas só isto pode não ser o suficiente, pois ao executar um bundle exec, o bundler pode não conseguir instalar a gem porque faltará algumas dependências do Ubuntu 12.04. Pra resolver isso basta rodar o comando abaixo:

$ sudo apt-get install libmysql-ruby libmysqlclient-dev

Este pequeno detalhe me fez perder um tempão. Espero que o seu tempo seja poupado com isso.

Obviamente, não esqueça de ajustar o seu Gemfile:

group :development, :test do
  gem 'sqlite3'
end

group :production do
  gem 'mysql2', '~> 0.3.0'
end

E depois é só rodar o bundler

$ bundle install

É isso aí!

Instalando Twitter Bootstrap no Rails 3.2 na unha!

Existe uma cacetada de gems que facilitam a instalação do Twitter Bootstrap no Rails 3.2. Eu cheguei a experimentar duas gems e achei bem bacanas. O problema é que se eu precisar atualizar a versão do bootstrap, eu ficarei dependente da boa vontade de um vendor.

Por este motivo eu acabei encarando o desafio de instalá-lo na asset pipeline do Rails sem o auxílio de nenhuma gem especial. Já vou adiantando que a tarefa é bem simples.

 

Baixando o Twitter Bootstrap

Na minha versão anterior deste artigo eu segui a linha de baixar uma versão personalizada do bootstrap para rodar bonitinho na asset. Desta vez eu resolvi simplificar um pouco mais. Então, vamos fazer download do pacote padrão do bootstrap:

Você baixará o arquivo bootstrap.zip. Extraindo-o você obterá os seguintes arquivos:

js/bootstrap.js
js/bootstrap.min.js
css/bootstrap.css
css/bootstrap.min.css
img/glyphicons-halflings.png
img/glyphicons-halflings-white.png

Instalando o bootstrap no Rails

Para facilitar as coisas, vamos começar um novo projeto:

$ rails new modelo_bootstrap

Eu gosto de manter cada lib de terceiros em sua própria pasta, identificando também a versão da mesma. No momento da escrita deste post, a versão atual do bootstrap é a 2.3.1. Então devemos criar uma pasta em vendor assim:

$ mkdir vendor/asset-libs
$ mkdir vendor/asset-libs/bootstrap-2.3.1

Coloque os seguintes arquivos na nova pasta:

../bootstrap-2.3.1/css/bootstrap.css
../bootstrap-2.3.1/css/bootstrap-responsive.css
../bootstrap-2.3.1/img/glyphicons-halflings.png
../bootstrap-2.3.1/img/glyphicons-halflings-white.png
../bootstrap-2.3.1/js/bootstrap.js

Você notou que os arquivos .min.* ficaram de fora? É porque não precisamos deles. A asset pipeline do Rails nos fará o favor de minificá-los. Sem contar que em modo de desenvolvimento o debug fica mais amigável.

Precisamos também declará-lo nos arquivos de manifesto da asset pipeline. Adicione as linhas a seguir nos arquivos relacionados:

Arquivo: app/assets/javascripts/application.js
...
//= require bootstrap
...

Arquivo: app/assets/stylesheets/application.css
...
 *= require bootstrap
 *= require bootstrap-responsive
...

Importante: o bootstrap é dependente da JQuery para poder rodar em modo responsivo.

Lembra que a gente colocou o bootstrap numa pasta própria dentro da asset pipeline? Poisé! Agora a gente precisa ensinar o rails a encontrar esta pasta. Basta adicionar a linha abaixo no application.rb:

Arquivo: config/application.rb
...
# Faz com que a asset pipeline encontre os arquivos adicionados em vendor tendo uma sub-pasta
# para cada lib, permitindo assim que as imagens, css e js daquela lib fiquem centralizadas
# para facilitar futuras atualizações.
config.assets.paths += Dir["#{Rails.root}/vendor/asset-libs/**/"].sort_by { |dir| -dir.size }

Temos ainda mais um probleminha pra resolver. As imagens do bootstrap são declaradas dentro do bootstrap.css usando o diretório “../img”. O problema é que após a compilação da asset, todas as imagens precisam estar no diretório “./”. Então nós precisamos abrir o arquivo bootstrap.css e fazer duas pequenas modificações:

Abra o arquivo vendor/asset-libs/bootstrap-2.3.1/css/bootstrap.css

Localize a linha que contém:
url("../img/glyphicons-halflings.png");

E substitua por:
url("glyphicons-halflings.png");

Localize a linha que contém:
url("../img/glyphicons-halflings-white.png");

E substitua por:
url("glyphicons-halflings-white.png");

Prontinho… agora é só correr para o abraço.

O exemplo Twitter Bootstrap – Hero

No github do Twitter Bootstrap podemos encontrar o exemplo abaixo:

http://twitter.github.com/bootstrap/examples/hero.html

Eu gosto muito deste exemplo, pois ele usa um menu responsivo e com um dropdown. Ele é bem legal, pois você pode visualizá-lo tanto no desktop quanto em um dispositivo móvel. Vamos então tomá-lo como referência e recriá-lo no Rails.

Aviso: não vou me preocupar em criar partials ou outras otimizações de layout. Quero deixá-lo o mais didático possível, ok?!

Para não perdermos tempo, eu fiz as devidas adaptações no projeto e publique-o no github. Eu commitei cada passo para que você possa acompanhar em detalhes a evolução do exemplo. Segue abaixo a URL:

https://github.com/cesarjr/modelo-bootstrap

O nosso exemplo conta com um controller chamado site com uma action chamada home. Com isso teremos a URL /localhost:3000/site/home. Esta action hospedará o corpo do exemplo HERO.

No arquivo modelo_bootstrap/app/views/layouts/application.html.erb eu coloquei o sistema de menus e a declaração dos javascripts e css.

Não precisei colocar o jquery necessário para o menu dropdown, pois por padrão o Rails já o traz no Gemfile.

Coloquei também algumas imagens adicionais em modelo_bootstrap/app/assets/images/ que representam os ícones do aplicativo ao criar atalhos, favicons e outros.

É isso aí! Sugestões sempre são bem vindas.