8
Dec 10

De Authlogic para Devise

Olá pessoal, acabei de portar um projeto de rails 2 para 3 e durante o processo resolvi alterar a autentificação do site que usava authlogic para o tão falado Devise (e gostei muito).

Este post é para mostrar como fazer essa troca de tecnologia sem perder as senhas de seus usuários. Caso precise de uma introdução ao Devise recomendo dar uma olhada no material do railscast.

Editando o model User

Antes de tudo, voce precisa configurar o seu model User removendo todas as referências ao authlogic e adicionar as configurações do Devise, no meu caso ficou assim:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable, :lockable and :timeoutable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :confirmable, :token_authenticatable

# Setup accessible (or protected) attributes for your model attr_accessible :email, :password, :password_confirmation, :remember_me, :profile_attributes, :curriculums_attributes

has_one :profile, :dependent => :destroy has_many :curriculums, :dependent => :destroy

accepts_nested_attributes_for :profile accepts_nested_attributes_for :curriculums end

Note que caso você use “accepts_nested_attributes_for :model” terá que adicionar :model_attributes em attr_accessible

Criando a migração

O Devise prove uma forma simples de criar a tabela de usuários, mas no nosso caso vamos precisar alterar e criar novas colunas “na mão”:

    1 class DeviseCreateUsers < ActiveRecord::Migration
    2   def self.up
    3     # alterando a culuna do authlogic para a nomenclatura do devise
    4     rename_column :users, :crypted_password, :encrypted_password
    5
6 # necessário se você utilizar :confirmable 7 add_column :users, :confirmation_token, :string 8 add_column :users, :confirmed_at, :timestamp 9 add_column :users, :confirmation_sent_at, :timestamp 10 execute "UPDATE users SET confirmed_at = created_at, confirmation_sent_at = created_at" 11
12 # necessário se você utilizar recoverable 13 add_column :users, :reset_password_token, :string 14
15 # necessário se você utilizar :rememberable
16 add_column :users, :remember_token, :string 17 add_column :users, :remember_created_at, :timestamp 18 19 # alterando as culunas do authlogic para a nomenclatura do devise 20 rename_column :users, :login_count, :sign_in_count 21 rename_column :users, :current_login_at, :current_sign_in_at 22 rename_column :users, :last_login_at, :last_sign_in_at 23 rename_column :users, :current_login_ip, :current_sign_in_ip 24 rename_column :users, :last_login_ip, :last_sign_in_ip
25 rename_column :users, :failed_login_count, :failed_attempts
26
27 # removendo colunas do authlogic que não são utilizadas pelo devise 28 remove_column :users, :persistence_token
29 remove_column :users, :perishable_token 30 remove_column :users, :single_access_token 31
32 # devise faz login pelo email por padrão (é possivel criar outras formas) 33 add_column :users, :email, :string 34
35 add_index :users, :email, :unique => true 36 add_index :users, :reset_password_token, :unique => true 37 add_index :users, :confirmation_token, :unique => true 38 end 39 40 def self.down 41 remove_column :users, :email 42 add_column :users, :single_access_token, :string 43 add_column :users, :perishable_token, :string 44 add_column :users, :persistence_token, :string 45 rename_column :users, :failed_attempts, :failed_login_count 46 rename_column :users, :last_sign_in_ip, :last_login_ip 47 rename_column :users, :current_sign_in_ip, :current_login_ip 48 rename_column :users, :last_sign_in_at, :last_login_at 49 rename_column :users, :current_sign_in_at, :current_login_at 50 rename_column :users, :sign_in_count, :login_count 51 remove_column :users, :remember_created_at 52 remove_column :users, :remember_token 53 remove_column :users, :reset_password_token 54 remove_column :users, :confirmation_sent_at 55 remove_column :users, :confirmed_at 56 remove_column :users, :confirmation_token 57
58 rename_column :users, :encrypted_password, :crypted_password 59 end 60 end

Configurando o o arquivo config/initializers/devise.rb

O Devise utiliza, por default, gbiz para critografar as senhas, mas provê suporte a outros algoritmos (incluindo o utilizado pelo authlogic). Abra o arquivo e configure como abaixo:

config.stretches = 20
config.encryptor = :authlogic_sha512

Limpando a casa

Você deve remover o model UserSession e todas as referencias a ele (caso existam).

Lembre-se que os helpers para controlar o usuário logado são user_signed_in?, current_user e user_session. Então atualize suas views!

Com o devise não é necessário ter controllers para gerenciar o usuário, logo você pode remover também esses controllers que utilizava com o Authlogic.


30
Aug 10

[OFF-TOPIC] Minha interpretação para o filme “A Origem”

Atenção: Este texto contem spoilers, então se você não viu o filme, vá ver e só depois volte aqui :)

Eu, como a maioria das pessoas que assistiram a esse ótimo trabalho de Nolan no cinemas, fiquei em dúvida sobre a real interpretação do filme, mas após pensar por várias horas cheguei a uma conclusão que acredito ser possível.

Antes de explicar a minha interpretação, gostaria de explicar porque não acredito nas interpretações que li em vários sites da internet:

1º Interpretação: Cobb (Leonardo di Caprio) estava vivendo na realidade durante todo o filme

Em algum momento do filme, é explicado que o “arquiteto” define o local do sonho, mas quem o “povoa” é o sonhador. Então, como Cobb consegue colocar uma projeção sua (Mal) no sonho dos outros? E essa projeção ainda ajuda Saito? Mata Fisher? E o pior, sequestra Fisher no limbo???

E se Cobb realmente conseguiu implantar uma idéia na mente de Mal, a ponto de leva-la ao suicidio, qual é a explicação para uma parte do filme onde Cobb diz que Mal consultou 3 psicologos e todos atestaram sua sanidade? Oras, ela era uma suicida em potencial, dizia que seus filhos eram projeções, como seria possível 3 psicólogos atestarem a sanidade mental dela?

2º Interpretação: Cobb entra em um sonho em algum momento do filme

Para essa interpretação, li que há 2 momentos possíveis disso ter ocorrido:

  1. Ele entrou num sonho após o primeiro teste químico na África
  2. Ele foi para o limbo, atras de Saito, mas não voltou

Em ambos os casos, pergunto novamente como seria possível ele colocar sua projeção nos sonhos dos outros? Como 3 psicólogos atestariam a sanidade de Mal? E para o 2º caso, como Mal sequestrou Ficher no limbo?

3º Interpretação: Cobb está sonhando o tempo inteiro, e precisa acordar

Algumas bases para essa teoria seria que a aliança que aparece no filme é sempre levemente diferente, que as crianças estão sempre com a mesma roupa (ou levemente diferente, segundo alguns).

Li em alguns sites que Miles (pai de Mal) seria alguém tentado acordar Cobb, salva-lo do sonho que ele ainda está mas não sabe. Mas, é fato que, para acordar alguém basta “chuta-lo” na realidade. Você precisa entrar no sonho para extrair ou implantar uma idéia, mas não para acordar.

Você só precisa ir “salvar” alguém se ele estiver no limbo. Então pergunto, Cobb está no limbo o filme inteiro? Ele viveu realmente no limbo com Mal ou é tudo parte de sua imaginação?

Essa teoria é complexa demais, e abriria milhares de outros caminhos que precisariam de explicações.

Minha teoria: Sim, é tudo sonho, mas…

Minha teoria é baseada na teoria anterior, mas é bem mais simples, e o que mostraria a genialidade do roteiro.

Lembre de uma frase muito importante dita por Cobb: Quando você sonha, tudo faz sentido, mas quando acorda percebe que não havia sentido no que você sonhou.

Então, suponha que Cobb é apenas um homem, que após trabalhar o dia inteiro, estava apenas dormindo e sonhando, logo não existe máquina de invadir sonhos, não existe limbo compartilhado, não existe Mal (ou pelo menos não da forma como mostrado).

Se o roteiro, além de apresentar um filme, brilhantemente nos fez sonhar junto com o personagem? Num sonho que começa com o filme e termina com o filme, isto é, é tudo sonho, inclusive as lembranças de uma “vida” com Mal no Limbo.

Seja honesto, durante o filme tudo fez sentido para você, não?, mas após o termino do filme você “acordou” e começou a ver falhar de lógica em tudo que é lugar, não foi?

Veja essa lista:

  • Crianças com a mesma roupa, objetos como a aliança levemente diferente (segundo alguns)
  • Projeção de Mal nos sonhos dos outros
  • Projeção de Mal sequestra Fisher para o Limbo
  • 3 psicologos atestaram a sanidade de Mal
  • Limbo compartilhado (isso é dito pelos personagens)
  • Diálogos, as vezes, confusos.

Tudo isso fazia sentido para Cobb, fazia sentido para você e eu … mas, apenas durante o filme sonho.

atualizado A última cena, quando o peão é deixado na mesa girando, não era o Cobb que ficou olhando, quem ficou olhando éramos nós. Nós é que precisávamos saber se estávamos em um sonho ou na realidade.


3
Aug 10

Adicionando gems ao seu projeto Sinatra

Estou trabalhando em um pequeno projeto utilizando Sinatra e Haml, mas o problema é que o servidor que uso em produção (dreamhost) não possui a gem do Sinatra instalado, e a gem do Haml está numa versão muito antiga.

Pesquisando, descobri que há meios de instalar novas gems no dreamhost (link aqui), mas achei muito complicado e eu encontrei uma solução mais simples e prática: Adicionar as gems dentro do seu projeto.

Como:

    $ cd projeto_sinatra
    $ mkdir vendor
    $ cd vendor
    $ gem unpack sinatra
    $ gem unpack haml
    $ mv sinatra-* sinatra
    $ mv haml-* haml

Agora você precisa referenciar a nova gem dentro do sua aplicação:

# de
require 'sinatra'
require 'haml'

# para require 'vendor/sinatra/lib/sinatra.rb' require 'vendor/haml/lib/haml.rb'

Simples e prático!


2
Aug 10

Fazendo o Sinatra recarregar a aplicação

Aqui vai uma dica para todos aqueles que, como eu, estão utilizando Sinatra nas suas aplicações web.

Para fazer o Sinatra recarregar a aplicação, sem precisar restartar o servidor, adicione as seguintes linhas no topo do seu arquivo principal:

configure :development do
  Sinatra::Application.reset!
  use Rack::Reloader
end

Pronto! Agora sempre que você alterar algum código (como uma nova rota), basta esperar alguns segundos para sua alteração ter efeito.


27
Jul 10

Novo projeto: Contratei!

Contratei! é um sistema para criar, gerenciar e publicar seu curriculum na web de forma fácil, rápida e com total liberdade, ou seja, você não fica preso àqueles campos chatos, pré-definidos.

Um pouco de história

Em 2007, estava à procura de uma forma de ter meu curriculum na internet, pois eu nunca sabia onde estava meu arquivo .doc mais atualizado ou ele não estava à mão quando precisava. Então, comecei a pesquisar alternativas online. Testei alguns sistemas, mas todos tinham algum problema: ou eram simples demais ou eram complexos demais. Resolvi que iria desenvolver a minha própria solução.

De lá pra cá o projeto ficou na minha cabeça. Eu sempre pensava em como eu gostaria que ele fosse e, principalmente, o que gostaria que ele não fosse. Então, este ano, resolvi parar de pensar e agir

O que ele é? (ou pelo menos, o que ele ainda vai ser?)

Gostaria de usar a palavra “divertido”, mas escrever um curriculum nunca é algo divertido. Então, a melhor palavra é: “agradável”. Foquei em facilitar ao máximo a criação dos tópicos – objetivos, conhecimentos, etc – com o mínimo de campos “engessados” e com o máximo de liberdade.

A versão atual

Atualmente, o site está em versão ALPHA, isto é, poucos recursos, layout para melhorar e bugs! Mas eu gostaria que você o testasse e me desse feedbacks, diga o que achou e diga o que você gostaria que ele tivesse.

Atenção: O layout atual não funciona no IE. Apenas no Chrome, Firefox e Safari.

site: http://www.contratei.com

Dicas:

  • Qualquer campo, em tela, é editável – título, dados de contato, foto, etc – basta clicar sobre o texto.
  • Para reordenar, arreste o tópico para a posição desejada.
Como dar sugestões e/ou apontar erros

Clique no botão “Sugestões” dentro do sistema ou se preferir poste aqui nos comentários.

O futuro

Aqui vai uma lista das coisas que estou trabalhando:

  • Integração com facebook e orkut, para que seu curriculum fique visível dentro do seu perfil.
  • Integração com twitter: Informe seus seguidores sobre seu cv.
  • Tela de pesquisa para que empresas localizem profissionais.

Obrigado e dêem suas sugestões!