Arquivo

Arquivo da Categoria ‘Dicas’

Utilizando o is_paranoid

13, junho, 2010 2 comentários

O is_paranoid é uma gem que faz com que os registros do banco não sejam apagados através do método destroy. Ao chamar o método destroy nosso objeto é apenas marcado como apagado e pode ser restaurado posteriormente, bem como listado através de método fornecidos pelo is_paranoid.
Sua utilização é bem simples, primeiro instale a gem:

gem install is_paranoid

Para que funcione em sua aplicação Rails, adicione no enviroment.rb , dentro do bloco de inicialização:

config.gem "is_paranoid"

Deixando mais ou menos assim:

Rails::Initializer.run do |config|
  # ...
  config.gem "is_paranoid"
end

Agora, nos models que vão utilizar dos recursos do is_paranoid, adicione logo após a declaração da classe ‘is_paranoid’

Exemplo:

class Student < ActiveRecord::Base
  is_paranoid
end

E para finalizar, crie uma migrate que adicione na tabela que vai utilizar o is_paranoid, o campo ‘deleted_at’, do tipo ‘timestamp’.

Exemplo:

class AddIsparanoidInStudent < ActiveRecord::Migration
  def self.up
    add_column :students, :deleted_at, :timestamp
  end

  def self.down
    remove_column :students, :deleted_at
  end
end

Pronto! Se quiser saber mais sobre o is_paranoid, consulte a documentação oficial no site do projeto.

Categories: Dicas, Rails, Ruby Tags: , ,

Remember password com restful_authentication

10, abril, 2010 2 comentários

O restful_authentication é um plugin de autenticação para aplicativos ruby on rails, com excelentes recursos, super fácil de configurar. Enfim, não vou falar muito sobre ele, pois não é o propósito desse tutorial. Irei assumir que você já tem o restful_authentication funcionando e quer apenas adicionar a funcionalidade de enviar um código de reset password via email para o usuário que esqueceu sua senha. Ao acessar o link com esse código o sistema irá exibir uma tela de troca de senha, lembrando que esse código deverá ser único e poderá ser usado somente uma vez. Então vamos lá:

Primeiro iremos gerar uma migration que adiciona na tabela o usuário a coluna ‘reset_password_code’.

script/generate migration reset_password_code

Agora editarei a migration gerada, deixando da seguinte forma:

class ResetPasswordCode < ActiveRecord::Migration
  def self.up
    add_column :users, :reset_password_code, :string
  end

  def self.down
    remove_column :users, :reset_password_code
  end
end

em seguida, ‘rake db:migration’ e estaremos pronto para começar!

Na classe UsersController irei criar um método protected que irá gerar um código para ser enviado ao usuário.

protected
  def random_code( len = 40 )
    chars = (("a".."z").to_a + ("1".."9").to_a )- %w(i o 0 1 l 0)
    newpass = Array.new(len, '').collect{chars[rand(chars.size)]}.join
  end

Agora criarei o método que chamará a view com o campo para o usuário colocar seu email:

  def change_reset_password
  end

Agora criarei a view que receberá o endereço de email do usuário e chamará o método “reset_password” passando o email:

<p>
    <%= form_tag (:controller => 'users', :action => 'reset_password' ) %>

    <p>
        <%= label_tag 'Email' %>
        <br/>
        <%= text_field_tag (:email) %>
    </p>
    <p>
        <%= submit_tag 'Enviar' %>
    </p>
    <%= flash[:alert] %>
</p>

Já método reset_password, irá receber o email, procurar o usuário com esse email, gerar o código de reset password, e chamar o UserMailer para enviar o email com o código.

  def reset_password
    user = User.find_by_email(params[:email])
    unless user.nil?
      user.reset_password_code = random_code
      if user.save!
        UserMailer.deliver_new_password(user)
        flash[:done] = "Verifique seu email para trocar a senha"
        redirect_to ('/')
      else
        flash[:error] = "Erro ao efetuar trocar de senha"
        render :action => 'change_reset_password'
      end
    else
      flash[:error]  = "Email Inválido"
      render :action => 'change_reset_password'
    end
  end

Vejam que estou chamando “UserMailer.deliver_new_password(user)” e passando o usuário como parâmetro. Na classe ‘UserMailer’ devo criar o método ‘new_password’ que será usado para enviar o email.
Meu método new_password deverá ficar assim:

  def new_password(user)
    setup_email(user)
    @subject    += 'Mudança de senha'
    @body[:url]  = "#{$SERVER_CONTENT_BASE}/password/#{user.reset_password_code}"
  end

Agora criarei a view para esse email, dentro de ‘app/views/user_mailer’ com o nome de ‘new_password.html.erb’

Olá <%=h @user.login %> alguém solicitou a troca de senha para essa conta.
Se deseja realmente trocar sua senha, clique no link abaixo:
<%=h @url %>

Agora de volta ao UsersController, criarei o método que recebe o reset_code e se ele estiver correto será jogado em um campo hidden na view de troca de senha.

  def code_password_reset
    user = User.find_by_reset_password_code(params[:reset_code])
    if user.nil?
      flash[:error]  = "Código inválido"
      redirect_to ('/')
    else
      @reset_code = params[:reset_code]
      render :action => "new_password"
    end
  end

Criarei a view de troca de senha, chamada ‘new_password’

<p>
    <%= form_tag (:controller => 'users', :action => 'reset_password_update', :method => 'put' ) %>
    <p>
        <%= label_tag 'Nova Senha' %>
        <br/>
        <%= password_field_tag (:password) %>
    </p>
    <p>
        <%= label_tag 'Confirmação' %>
        <br/>
        <%= password_field_tag (:password_confirmation) %>
    </p>
    <%= hidden_field_tag(:reset_code, @reset_code) %>
    <p>
        <%= submit_tag 'Enviar' %>
    </p>
	<%= flash[:alert]%>
</p>

E agora o método que de fato executa a troca de senha:

  def reset_password_update
    @user = User.find_by_reset_password_code(params[:reset_code]) unless params[:reset_code].blank?
    if ((params[:password] == params[:password_confirmation]) && !params[:password_confirmation].blank?)
       @user.password_confirmation = params[:password_confirmation]
       @user.password = params[:password]
       @user.reset_password_code = nil
      if @user.save!
        flash[:done] = "Senha atualizada com sucesso!"
        redirect_to ("/")
      else
        flash[:alert] = "Falha ao atualizar senha."
        render :action => 'new_password'
      end
    else
      flash[:alert] = "Senhas diferentes!"
      render :action => 'new_password'
   end
  end

Para finalizar iremos configurar as rotas;

  map.resources :users, :collection => { :change_reset_password => :get,
                                         :new_password => :get, :reset_password_update => :post,
                                         :code_password_reset => :get, :reset_password => :get}
  map.connect 'password/:reset_code', :controller => 'users', :action => 'code_password_reset'

E assim chegamos ao fim desse tutorial.

Sobre o Zend Framework

8, janeiro, 2010 Sem comentários

Pessoal, para quem programa em PHP e quer conhecer o framework Zend ou conhece e quer se aprofundar, o meu grande amigo Fernando está publicando em seu blog uma série de exemplos de utilização do Zend. Vale a pena dá uma conferida.

Insert Zend Framework
Enviando e-mails com SMTP autenticado e corpo HTML através do Zend_Mail

Categories: Dicas, Ferramentas, PHP Tags: ,

Sis 771/671 no ubuntu 9.10 amd64

19, novembro, 2009 11 comentários

Mais outro post direcionado aos propriétarios de placas de video Sis 771/671. Como já foi dito em outros posts, a Sis não libera o driver para linux. Para quem instalou recentemente o ubuntu 9.10 64 bits e não conseguiu encontrar um driver compatível, pode fazer o download do mesmo clicando  aqui.

Após concluir o download descompacte o driver e copie para o diretorio /usr/lib64/xorg/modules/drivers

Em seguida crie o xorg.conf dentro de /etc/X11/ com o seguinte conteúdo:

Section “Device”
Identifier   “Configured Video Device”
Driver “sisimedia”
EndSection

Section “Monitor”
Identifier   “Configured Monitor”
EndSection

Section “Screen”
Identifier   “Default Screen”
Monitor      “Configured Monitor”
Device      “Configured Video Device”
EndSection

Reinicie o X e seja feliz.

Categories: Dicas, Linux Tags: ,

Análise do Windows Vista pela Apple

25, julho, 2009 Sem comentários

Vídeo já meio antigo, sobre a opinião da Apple em relação ao Windows Vista.

O que eu achei mais genial foi a frase final do Bertrand Serlet – vice presidente da Apple : “Se você não pode inovar, acho que apenas imita, mas nunca é tão bom como o original”

Categories: Apple, Dia-a-Dia, Dicas Tags:

Criando uma classe mensageira em JSF

11, junho, 2009 11 comentários

Carteiro

Uma coisa que sempre gosto de fazer quando estou programando usando JSF, é criar uma classe mensageira para facilitar o trabalho com mensagens (de erro, informação e etc..).

Essa classe, me livra do trabalho de:

  • Obter repetidamente o FacesContext.
  • Criar repetidamente o objeto FacesMessage.
  • Escrever repetidamente as mensagens.

Pode parecer pouco, mas imagina você ter que repetir isso todas as vezes que precisar adicionar uma mensagem para o usuário.

Segue abaixo a implementação:


package lucasallan.com.blog.exemplo

import java.util.ResourceBundle;

import javax.faces.application.FacesMessage;

import javax.faces.context.FacesContext;

/**

*

* @author Lucas Allan Cardoso

*/

public class Mensageiro {

private static ResourceBundle bundle = ResourceBundle.getBundle(“messages”, FacesContext.

getCurrentInstance().getViewRoot().getLocale());

public static void errorMsg(String msg){

msg = bundle.getString(msg);

FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR,msg, msg);

FacesContext fc = FacesContext.getCurrentInstance();

fc.addMessage(“erro”, fm);

}

public static void infoMsg(String msg){

msg = bundle.getString(msg);

FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_INFO, msg, msg);

FacesContext fc = FacesContext.getCurrentInstance();

fc.addMessage(“info”, fm);

}

}

Agora criaremos um arquivo chamado “messages.properties” dentro da raiz da aplicação, onde poderemos definir as mensagens da nossa aplicação, bem como chaves para poder utiliza-las. O conteúdo desse arquivo consiste em:

chave = valor

Exemplo:

bdError = Erro ao acessar banco de dados!

Quando precisarmos utilizar nosso mensageiro, basta usar:

Mensageiro.errorMsg(“bdError”);

E nossa classe irá procurar dentro do messages.properties um valor que tenha como chave “bdError“, no nosso exemplo ele adicionaria a mensagem “Erro ao acessar banco de dados!” ao nosso contexto.

Bem simples né?

Bom, agora iremos entender a nossa classe mensageira:

  1. Primeiro nós temos o objeto estático ResourceBundle que utilizaremos para efetuar as buscas das mensagens através dos valores passado no arquivo messages.properties. Repare que eu passo o nome do arquivo sem a extensão .properties e a localização dele, no nosso caso utilizamos o método getViewRoot do FacesContext para obter a localização. O interessante é que todas essas mensagens possuem suporte a internacionalização, você pode definir dentro do messages.properties mensagens personalizadas para cada locale, por isso utilizamos o método getLocale.
  2. Os métodos: infoMsg e errorMsg são os responsáveis pelas mensagens, recebem como parâmetro uma string, que será utilizada como chave para encontrar o valor da mensagem.
  3. Na linha seguinte ele faz com que a variável ‘msg‘ que antes possuía a chave receba como valor a própria mensagem que é buscada através do método getString do objeto ResourceBundle.
  4. Nas próximas linhas não tem muito o que explicar, crio o objeto FacesMessage com a mensagem conseguida anteriormente, obtenho a instancia do FacesContext e adiciona a mensagem.
  5. E fim, você está pronta p usar o seu mensageiro.

Espero que possa ajudar vocês a tornar o desenvolvimento do seus sistemas menos repetitivo e mais divertido.

Quem quiser saber mais sobre jsf

Categories: Dicas, Java Tags: ,

A vida não parece mais tão bela?

29, maio, 2009 4 comentários

Li recentemente sobre um livro chamado “Dumbing Down our Kids”, escrito por um educador chamado Charles Sykes (espero a oportunidade de ler esse livro em breve), em determinado trecho do livro contém lições que só aprendemos quando começamos assumir as rédeas de nossa vida. Essas lições já circulam na internet há algum tempo, algumas pessoas atribuem a criação delas a Bill Gates e diversas outras personalidades conhecidas na internet.
As lições são:

  • A vida não é fácil, acostume-se com isso.
  • O mundo não está preocupado com a sua auto-estima. O mundo espera que você faça alguma coisa útil por ele, antes de sentir-se bem com você mesmo.
  • Você não ganhará 40 mil dólares por ano assim que sair da escola. Você não será vice-presidente de uma empresa antes que tenha conseguido comprar seu próprio carro e telefone.
  • Se você acha seu professor rude, espere até ter um chefe. Ele não terá pena de você.
  • Fritar hamburger não está abaixo da sua posição social. Seus avós têm uma palavra diferente para isso, eles chamam de oportunidade.
  • Se você fracassar, não é culpa de seus pais. Então não lamente seus erros, aprenda com eles.
  • Antes de você nascer, seus pais não eram tão críticos como agora.  Eles só ficaram assim por pagar as suas contas, lavar suas roupas e ouvir você dizer que eles são “ridículos”. Então antes de salvar as florestas tropicais, querendo consertar os erros dos parasitas da geração do seus pais, tente limpar seu próprio quarto.
  • Sua escola pode ter eliminado a distinção entre vencedores e perdedores, mas a vida não é assim. Em algumas escolas você não repete mais de ano e tem quantas chances precisar até acertar. Isto não tem a menor semelhança com nada na vida real.
  • A vida não é dividida em semestres. Você não terá sempre os verões livres e muito poucos  empregados estarão interessados em lhe ajudar a “se achar”. Faça isso em seu próprio tempo.
  • Televisão e videogames não são a vida real. Na vida real, as pessoas têm que deixar o barzinho e ir trabalhar.
  • Seja legal com os nerds. Provavelmente você vai trabalhar para um.

Dica: Sis Mirage3 on Ubuntu 9.04

8, maio, 2009 3 comentários

Para todos que possuem a placa Sis Mirage3 671/771 e está tendo problemas com o driver da sis. Aqui tem a solução definitiva, um pacote deb do driver, testado e aprovado no ubuntu 9.04

xorg-driver-sis671_0.9_i386.deb

Instale o pacote e adciona ao seu xorg.conf, na sessão “Device”:

Driver “sis671″

E pronto, tudo resolvido.
Obs: Essa versão do driver funciona em sistema 32 bits.

Valendo lembrar que essa versão mais nova do ubuntu está simplesmente maravilhosa.

Categories: Dicas, Linux Tags: , ,

IDE for C/C++?

2, maio, 2009 1 comentário

Fazia tempo que procurava uma boa IDE para C/C++, encontrei várias excelentes, mas nenhuma me agradou tanto quanto a Code::Blocks.
Usei por um bom tempo o netbeans e o eclipse , já que também programo em Ruby e Java, foi uma boa alternativa, pois eu não precisava me adaptar a uma IDE nova só por está usando uma outra linguagem. Sempre fui muito fã do Vim, acredito que ele ofereça tudo que você precisa para programar tranquilamente, mas acabei me acostumando com algumas frescurinhas das IDE’s o que me resultou nessa imensa procura.
Não estou querendo criticar nenhuma IDE, apenas estou compartilhando com vocês essa maravilhosa ferramenta que tive o prazer de conhecer.

Caracteristicas:

- Totalmente escrita em C++.
- Possui versões para Linux, Windows e Mac.
- Suporte a diversos compiladores diferentes (GCC, MSVC++, Borland C++ e etc…)
- Suporte a builds paralelos (se seu processador tiver mais um core).
- Suporte a importação de projetos do Dev-C++ e MSVC.
- Suporte completo a breakpoints.
- Code Completion.
- Identação inteligente.
- Suporte a plugins.

E várias outras funções. Se você programa em C/C++ vale a pena dá uma conferida.

O site do projeto é: www.codeblocks.org

Categories: C++, Dicas, Linux, Produtividade Tags: ,