Internacionalizando aplicativos para iOS no XCode 4.2 parte 1 – NIBs e Storyboards

by gregoriomelo on novembro 8, 2011

Não foi fácil encontrar um passo a passo legal pra mostrar como internacionalizar aplicativos para iOS com o XCode 4.2 Os tutoriais que encontrei eram defasados, pouco instrutivos ou incompletos. Encontrei o melhor texto no livro iOS Programming: The Big Nerd Ranch Guide. Vou tentar sintetizar um pouco. Vamos começar pelos

NIBs ou Storyboards

Abra sua aplicações para iOS no XCode e selecione a tela que você desejar internacionalizar primeiro. Abra o File Inspector (Cmd + Option + 1). Há um bloco chamado ‘Localization’:

localization

Clique no ‘+’ e escolha língua para a qual você deseja ter a sua aplicação internacionalizada (vamos focar no português). Veja que o arquivo de interface fica com opção para expandir o conteúdo:

Expanded Storyboard

E vamos pra linha de comando!

No Terminal, entre no diretório raiz da sua aplicação. Entre na pasta com o nome da sua aplicação (por exemplo, MyApp). Dentro dela há uma pasta chamada ‘en.proj’ entre nela e digite o seguinte comando:

ibtool --generate-strings-file ../../Localizable.strings TELA

Em vez de tela, ponha o nome do NIB ou Storyboard que você deseja internacionalizar. Como exemplo, o comando poderia ser o seguinte:

ibtool --generate-strings-file ../../Localizable.strings MainStoryboard.storyboard

Onde MainStoryboard.storyboard é o arquivo que eu desejo internacionalizar.

Este comando irá criar um arquivo chamado Localizable.string na raiz do seu projeto. Edite o arquivo Localizable.strings para colocar os campos na língua que você deseja. Vá para a pasta da nova linguagem suportada, pt.lproj e digite o seguinte comando:

ibtool --strings-file ../../Localizable.strings --write MainStoryBoard.storyboard ../en.lproj/MainStoryBoard.storyboard

(Lembrando que MainStoryboard.storyboard é o nome do arquivo da tela da nossa aplicação o qual desejamos internacionalizar.) Esse comando cria um arquivo de interface chamado MainStoryboard.storyboard na pasta que estamos, baseado no arquivo de storyboard da pasta em inglês, e pega o conteúdo do arquivo Localizable.strings para poder preencher o texto dos campos.

Depois de executar o comando acima, volte para o XCode e abra a tela internacionalizada. Agora é só repetir os mesmos passos com outras linguagens. Quando um novo campo for criado, a mesma rotina deverá ser executada.

Valeu!

Apresentação: Programação Orientada a Testes – Introdução e caso de sucesso na Dataprev

by gregoriomelo on abril 16, 2011

Há alguns meses, fiz uma apresentação sobre Desenvolvimento Orientado a Testes (TDD) na UFPB, para a Semana de Ciência, Tecnologia, Esporte, Arte e Cultura (SECIATEC). O público-alvo era composto, em sua maioria, por alunos recém-chegados à universidade e ao universo da computação. Prontamente aceitei o convite do amigo Rodrigo Rebouças (@rodrigor) para realizar minha primeira palestra.

O intuito era introduzir os conceitos do TDD e como havíamos aplicado a técnica (filosofia, metodologia, modo de viver, etc.) com sucesso na Dataprev, junto com alguns exemplos.

Eis, então, a apresentação:

Espero que tenha prestado!

RVM: Desenvolvimento responsável em Ruby e Rails! Veja como instalar e usar.

by gregoriomelo on abril 16, 2011

Ruby Version Manager, vulgo RVM. Se você quer se sentir mais responsável enquanto desenvolve aplicações em Ruby e Rails, use! E não é complicado.

O que é o RVM?

RVM é uma ferramenta fantástica que vai lhe ajudar a gerenciar as instalações de interpretadores Ruby. Para iniciantes, isso pode até parecer totalmente desnecessário, mas se você pretende ser um programador melhor e mais responsável, vale muito a pena aprender.

Conto de fadas real

Vejamos se contar uma historinha ajuda: SistemasFantásticos (SF)* é uma empresa que vem se destacando no cenário nacional de desenvolvimento de software e há anos utiliza principalmente o Rails. SF tem um projeto grande em desenvolvimento há 2 anos, o SistemaGlorioso, feito em Rails 2.3.2 e Ruby 1.8. E tem um projeto novo, o SistemaBrilhante, recém-criado com o Rails 3.0.5 e Ruby 1.9.2. Aí a SF contrata João, que, inicialmente trabalhará com o Brilhante.

*espero que este nome não esteja reservado

Logo nos primeiros dias ele instala o Rails 3 e o Ruby 1.9.2 e já vai metendo a mão no código. Com pouco tempo, sua chefa, Maria, aloca-o pra corrigir um bug no Glorioso:

Maria: — João, bora ali corrigir um bugzinho…

João: — Beleza! É só baixar o código e começar!

Pobre João… Ele baixa o código e vê um monte de coisa quebrar. Mesmo com pouca experiência ele percebe que o ambiente dele não está adequado e ele vai precisar substituir as versões de Ruby e de Rails… Desinstalar ambos…

Não com muita facilidade, ele consegue. Depois resolve o bug e manda pro repositório. Daí Maria, comunicada sobre o encerramento da atividade, realoca-o no Brilhante.

João: — Lasquei-me! (irrelevante se as pessoas usam ou não a ênclise ao falar)

Ele lembra que vai ter que fazer o mesmo serviço trabalhoso: remover o Rails 2.3.2 e o Ruby 1.8 pra instalar as versões mais novas… Não sabia ele que poderia conversar com Pedro, que o aponta os milagres que o RVM pode providenciar nessa hora…

O que o RVM faz

O RVM lhe ajuda a gerenciar as instalações de Ruby e as gems instaladas na sua máquina (rails, bundler, sinatra…).

Então Pedro diz a João que ele pode ter várias versões de Ruby instaladas na máquina e pra mudar de uma pra outra basta um simples comando. É quase instantâneo. No caso de João, ele usaria o RVM pra instalar cada uma das versões do Ruby. E, de acordo com os requisitos de cada projeto, ele executaria um simples comando dizendo qual versão do Ruby ele deseja. Além disso, o RVM gerencia também as gems que estão instaladas.

Se há um terceiro projeto na SF que utiliza Ruby 1.8 e Rails 3, em vez de Rails 2.3. Então temos a seguinte configuração:

  • Ruby 1.8 e Rails 2.3
  • Ruby 1.8 e Rails 3
  • Ruby 1.9 e Rails 3

São 2 versões de Ruby para 2 versões de Rails, mas em 3 configurações diferentes. Imagina o sofrimento de, apesar de ter a mesma versão do Ruby, remover as gems e instalar tudo de novo de acordo com a versão do Rails desejada…

Aí entram os Gemsets!

O que são gemsets

Gemsets são conjuntos de gems. No caso acima, temos um conjunto de gems que atendem ao Rails 2.3 e outro conjunto de gems que atendem ao Rails 3. Se João for trabalhar num projeto que não usa Rails, e sim Sinatra, ele criaria um novo gemset para colocar as gems que atendem ao Sinatra e seu projeto. Nesse gemset não teria nada que fizesse referência às gems do Rails. Quando ele voltar pro projeto que usa Rails, basta só um comando e pronto. Suas gems para Rails estarão visíveis novamente. E, da mesma forma, nada de Sinatra na gemset.

Como instalar o RVM

Você precisa ter o curl e o make (e afins) instalados. Tanto no Linux quanto no Mac, o seguinte comando resolve a instalação:

bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)
echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"' >> .bash_profile
source ~/.bash_profile

A primeira linha faz o download do RVM. A segunda, configura o RVM para que seja iniciado sempre que o usuário fizer o login. A terceira, o importa para a sessão atual.

Certifique-se que a instalação está OK com o seguinte comando:

type rvm | head -1

Se o retorno for :

rvm is a function

Então, prossigamos.

Como utilizar o RVM

Para verificar as versões do Ruby instaladas, execute o seguinte comando:

rvm list

São grandes as chances de não haver nenhuma instala, já que ainda não fizemos o RVM instalar nenhuma.

Instalar versões do Ruby com o RVM

Agora instalemos a versão 1.8.7:

rvm install 1.8.7

O RVM fará o download do código fonte da versão 1.8.7 do Ruby, fará a compilação e depois a instalação. Aguarde um pouco e depois veja que há o seguinte diretório:

$HOME/.rvm/rubies/ruby-1.8.7-p334/

Isso quer dizer que a versão 1.8.7 do Ruby, com o patch p334, está instalada dentro dos diretórios do usuário. Isto é muito importante, tendo em vista que esta instalação não estará disponível para outros usuários.

Agora que a versão 1.8.7 foi instalada, podemos utilizá-la e defini-la como padrão:

rvm use 1.8.7 --default

Se você executar o comando ‘which ruby’, o resultado mostrará o diretório ao qual me referi acima.

Para instalar a versão 1.9.2:

rvm install 1.9.2

O mesmo procedimento acontece, e agora há o seguinte diretório:

$HOME/.rvm/rubies/ruby-1.9.2-p180/

A versão 1.8.7 ainda está em uso. Se quiser utilizar a versão 1.9.2, recém-instalada:

rvm use 1.9.2 --default

Com as versões devidamente instaladas, vamos tratas os gemsets.

Instalar gems com o RVM

Para o nosso exemplo, vamos voltar para a versão 1.8.7:

rvm use 1.8.7 --default

Vamos criar um gemset para trabalharmos com o Rails 2.3.11:

rvm gemset create rails2311

Será exibido um aviso indicando que o gemset foi criado. Agora, utilizemo-no:

rvm use 1.8.7@rails2311 --default

Perceba que o comando agora indica a gemset. Traduzindo, o comando diz ao RVM para utilizar a versão 1.8.7 e o gemset rails2311. Quando o gemset não é indicado, é utilizado o padrão, ‘global’, que pode ser visto com o comando:

rvm gemset list

Se você executar o comando ‘which gem’, verá que o comando gem utilizado será o que é tratado pelo RVM. Instalemos a versão 2.3.11 do Rails:

gem install rails -v 2.3.11

Execute ‘gem list’ e confira as gems instaladas.

Agora criemos um gemset para rails 3.0.5:
rvm gemset create rails305
rvm use 1.8.7@rails305 --default

Se você executar ‘gem list’, verá que só há o Rake instalado. Vamos instalar o Rails 3.0.5:

gem install rails -v 3.0.5 --no-ri --no-rdoc

O comando ‘gem list’ mostra as gems instaladas. Perceba que as gems listadas não são as mesmas do gemset rails2311.

Tenho criado gemsets separadas para cada projeto, mesmo que as versões de Ruby e do Rails sejam as mesmas. Assim, o ambiente fica ainda mais controlado. Ainda, algumas vezes, apesar de termos a mesma versão do Ruby e do Rails, uma ou outra gem possui versão diferente entre projetos, ou talvez você esteja experimentando uma gem em fase alfa, beta, RC… No meu post sobre OAuth, eu mantinha um gemset exclusivo para a aplicação criada, tal gemset chamado  de ‘twitterfriend’. Nada mais sugestivo :)

Ainda melhor com o Bundler

Em breve escreverei algo sobre o Bundler. Depois que aprendi sobre a fantástica combinação RVM + Bundler, o controle do ambiente de desenvolvimento nunca alcançou nível tão alto.

Enquanto o post não sai, não perca tempo esperando e leia sobre o Bundler:

http://gembundler.com/

Referências

Como utilizar o Twitter para autenticação no Rails 3 com o OAuth

by gregoriomelo on abril 10, 2011

Há uma enorme quantidade de pessoas que concorda que não precisamos mais ter que criar um cadastro de usuários completo. Quase todo mundo já tem uma conta no Twitter, no Facebook, em algum serviço da Google… Vejamos como utilizar o OAuth para que nossa aplicação utilize o Twitter.

O que é o OAuth?

OAuth (Open Authorization) is an open standard for authorization. It allows users to share their private resources (e.g. photos, videos, contact lists) stored on one site with another site without having to hand out their credentials, typically username and password.

Fonte: http://en.wikipedia.org/wiki/Oauth

Traduzindo: OAuth é um padrão aberto para autorização que permite que usuários compartilhem fotos, vídeos, contatos, etc., de um serviço para outro serviço sem que seja necessário fornecer as credenciais novamente, como nome de usuário e senha.

Quem usa

  • Twitter
  • Google
  • Facebook
  • Yahoo
  • MySpace
  • NetFlix
  • TripIt
  • Vimeo
  • …inúmeros outros…

Rails 3 e OAuth

Comecemos, então, a criar uma aplicação que se integre com o OAuth:

rails new twitterfriend

Depois disso, edite o Gemfile e coloque a gem do OAuth:

gem 'omniauth'

E execute o Bundler para instalar a gem:

bundle install

Remova o index.html que vem com a aplicação e crie um controlador para gerenciar o acesso às páginas:

rm public/index.html
rails g controller pages index

Agora vamos configurar o roteamento para a raiz da aplicação. Edite o arquivo config/routes.rb e coloque a seguinte linha antes de ‘get “pages/index”‘:

root :to => 'pages#index'

Configurando o OAuth com o Twitter

Na pasta config/initializers, cria um arquivo chamado ‘omniauth.rb’ e coloque as seguintes linhas no seu conteúdo:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, 'CONSUMER_KEY', 'CONSUMER_SECRET'
end

CONSUMER_KEY e CONSUMER_SECRET são códigos que você deve obter no site http://dev.twitter.com/. Procure pela opção ‘Register an app’ e preencha o formulário.

No campo ‘Application Website’, coloque “http://127.0.0.1:3000” (sem aspas).

No campo ‘Application Type’, escolha “Browser“.

No campo ‘Callback URL’, preencha com “http://127.0.0.1:3000/auth/twitter/callback” (sem aspas).

Após a confirmação, você terá acesso aos códigos que precisa para configurar a aplicação Rails. Na página da aplicação no Twitter, procure pela seção ‘OAuth 1.0a Settings‘ e lá você encontrará as chaves.

Colocando a autenticação na aplicação

Por enquanto, nossa aplicação não tem nada de mais. Vamos colocar um link para a autenticação. Remova o conteúdo do arquivo ‘app/views/pages/index.html.erb’ e substitua por:

<%= link_to "Login no Twitter", "/auth/twitter"%>

Vejamos como fica no navegador. Execute o comando para rodar o servidor:

rails s

Ao clicar no link, você será redirecionado para uma página do Twitter questionando se deve ser permitido o acesso à aplicação. Confirme. Depois disso, :( uma mensagem de erro:

No route matches "/auth/twitter/callback"

Mas, na verdade, não fizemos muita coisa ainda. Este erro significa que não há rota para tratar o retorno do Twitter. Precisamos criar a rota e um controller para gerenciar a sessão HTTP. Além de gerenciar o sucesso da comunicação com o Twitter, precisamos ter um tratamento para o logout e outro para o caso em que a comunicação com o Twitter falhar. Criemos o tal controller:

rails g controller sessions create destroy failure

E agora, a rota. Edite o arquivo config/routes.rb novamente, apague as 3 entradas get do controller sessions e inclua estas:

match '/auth/twitter/callback' => 'sessions#create'
match '/auth/failure' => 'sessions#failure'
match '/logout' => 'sessions#destroy'

Lembra da configuração da opção ‘Callback URL’ na hora de cadastrar a aplicação do Twitter? A URL de callback é o endereço que deve ser acessado quando o Twitter devolver o controle para a sua aplicação. O erro que foi encontrado há pouco é justamente por isso. O Twitter retornou sucesso no login e a aplicação foi redirecionada para a URL configurada. Mas não tinha nada lá. Mas agora, tem. Vejamos novamente no navegador.

Pronto, melhorou! Para ficar melhor, vamos colocar o usuário na sessão. Edite o método create em ‘app/controllers/sessions_controller.rb’ e deixe-o assim:

def create
  session[:auth] = request.env['omniauth.auth']
  redirect_to root_path
end

Altere também o arquivo ‘config/initializers/session_store.rb’ e descomente a última linha. Depois disso, rode a task do rake para criar as sessões:

rake db:sessions:create
rake db:migrate

Fazendo isso, podemos colocar os dados do Twitter na sessão. Assim, vamos modificar a página index para que esta fique ciente que há um usuário logado.

Altere o conteúdo da página ‘app/views/pages/index.html.erb’ para este:

<% if session[:auth] %>
  Bem-vindo, <%= session[:auth]['user_info']['name'] %>! <%= link_to 'Logout', logout_path %>
<% else %>
  <%= link_to "Login no Twitter", "/auth/twitter"%>
<% end %>

Agora sabemos se o usuário está logado. Vamos agora colocar o logout. Edite o controller ‘app/controllers/sessions_controller.rb’ e, no método destroy, coloque o seguinte conteúdo:

session[:auth] = nil
redirect_to root_path

Assim, quando o usuário clicar em logout, ele será requisitado para logar no Twitter novamente.

Bem, não tá completo, nem temos o melhor código do mundo. Nem o teste tem aí. Porém, a intenção era mostrar como integrar o OAuth com o Rails 3. Então, o que tem aqui é o começo. E dá pra fazer muita coisa a partir daqui. Boa sorte!

Github

Coloquei o projeto no Github. Fique à vontade para cloná-lo:

git clone git@github.com:gregoriomelo/twitterfriend.git

Referências

http://railscasts.com/episodes/241-simple-omniauth

Como instalar o Ruby on Rails 3 no Windows 7

by gregoriomelo on abril 9, 2011

A maioria dos acessos ao blog são de buscas por como instalar o Rails 3 no Windows 7. No entanto, acabam encontrando a versão 2.3 do Rails. Este post visa atender este público, os que desejam instalar o Rails 3. Comecemos conhecendo o roteiro:

  1. Instalar o Ruby
  2. Atualizar o RubyGems
  3. Instalar o Rails 3
  4. Instalar o MySQL (opcional)
  5. Instalar o SQLite3 (opcional)

Passo 1: Instalar o Ruby

Basta baixar o RubyInstaller e mandar bala. O RubyInstaller pode ser encontrado aqui: http://rubyinstaller.org/download.html. Digo que é mais simples porque não precisaremos compilar o código fonte e instalá-lo… Enquanto escrevo, as versões disponíveis para instalação do Ruby eram 1.8.7 e 1.9.2. Evite instalar o Ruby em uma pasta que contenha espaços, uma vez que isto pode trazer bastantes problemas.

Agora vamos colocar o Ruby no PATH do Windows. Procure, no Painel de Controle, pela tela de Propriedades do Sistema. Nesta tela, clique em ‘Variáveis de ambiente’ e, no bloco ‘Variáveis de sistema’, procure pela variável ‘Path’ e coloque no fim do campo valor o seguinte texto (não esqueça do ponto-e-vírgula) e confirme:

;C:\Ruby187\bin

Teste a instalação com o seguinte comando no prompt de comando:

ruby -v

Passo 2: Atualizar o Ruby Gems

Gems é o sistema de gerenciamento de pacotes utilizado pelo Ruby. Execute o seguinte comando para atualizar o Ruby Gems:

gem update --system

Deve levar uns minutinhos pra terminar.

Passo 3: Instalar o Rails

Enfim, chegou a hora de instalar o Rails. Novamente, no prompt de comando, digite o seguinte comando:

gem install rails --no-ri --no-rdoc

Vai demorar um bocado. Aproveite o tempo pra dar uma olhada no que pode ser feito com Rails. Recomendo o guia do Rails (http://guides.rubyonrails.org).

Pronto! Agora você já tem o suficiente para começar a programar! :) Na verdade, falta um banco de dados…

Passo 4: Instalar o MySQL

Instalar o MySQL é simples. Basa ir ao site mysql.com, baixar e instalar a versão mais recente. Simples de fazer e utilizar. Uma grande vantagem em usar o MySQL é o conjunto de ferramentas que dão suporte ao MySQL. Para quem não deseja utilizar o MySQL, o SQLite é uma boa saída.

Passo 5: Instalar o SQLite

Apesar de o Rails 2.3 estar configurado por padrão para utilizar o SQLite, é preciso instalar o ambiente para que funcione, já que nem o Windows nem o Rails trazem o SQLite consigo. Caso você decida utilizar o SQLite como sistema gerenciador de banco de dados (SGBD) da sua aplicação, será preciso copiar alguns arquivos para o diretório bin onde o Ruby foi instalado, por exemplo, C:\Ruby187\bin\. Vá ao site sqlite.com e baixe os arquivos binários para Windows. Um se chama mais ou menos ‘sqlite-shell-win32-x86-3070500.zip’ e ou outro ’sqlite-dll-win32-x86-3070500.zip’. O primeiro arquivo contém um executável (.exe) utilizado para a manutenção do banco de dados (INSERT, UPDATE, CREATE, DROP, entre outros). O segundo arquivo possui um arquivo .def e uma DLL utilizada pelo Ruby quando o Rails faz chamadas ao banco de dados. Copie os três arquivos (.exe, .def e .dll) para a pasta bin onde o Ruby foi instalado.

Sua aplicação estará pronta para ser executada com o SQLite! Recomendo a extensão do Firefox “SQLite Manager” como cliente do banco. Quebra um ótimo galho :)

Fontes