Novo Site, novo blog, novas novidades ;)

Posted in Geral on January 28th, 2010 by Andrey Viana – Be the first to comment

Olá pessoal…

Dentro de algumas semanas estarei lançando meu site pessoal (para trabalhos freelancer com desenvolvimento web).

Este blog continuará ativo e com novas atualizações, estará em novo endereço, o qual será informado no site.

Agradeço a precença e visita de todos!

Atenciosamente,

Andrey Viana

http://andreyviana.com.br

Contato:
(46) 8401-5154
Gtalk: andreydjason@gmail.com
Msn: andreydjason@hotmail.com
Skype: andreydjason

Rails: Rodando várias aplicações em um único domínio, usando subpastas

Posted in Ruby / Ruby on Rails on February 20th, 2009 by Andrey Viana – 2 Comments

Em alguns casos específicos precisamos criar várias aplicações Rails em um único domínio, assim somos praticamente “obrigados” a colocar cada aplicação em uma pasta (ou subpasta), o que faz com que a aplicação “quebre” caso não esteja corretamente configurada.

Essa questão é relativamente simples dependendo do caso. Eu consegui fazer várias aplicações rodarem em um único domínio, sendo que cada aplicação estava em uma subpasta diferente, apenas incluindo esta linha em cada aplicação, no arquivo enviroment, dentro do bloco config:

Aplicação 1:

config.action_controller.relative_url_root = "/subpasta_railsapps_app1"

Aplicação 2:

config.action_controller.relative_url_root = "/subpasta_railsapps_app2"

E assim por diante… Isso funcionou perfeitamente, tenho lá o domínio por exemplo http://www.exemplow.com/ onde é mostrado o site, e nas subpastas subpasta_railsapps_app1, subpasta_railsapps_app2 e subpasta_railsapps_app3 tenho meus aplicações rodando normalmente, cada um na sua pasta, com sua configuração específica e tudo mais.

Em outros casos é necessário alterar configurações do servidor, por exemplo do Apache, para que a aplicação seja direcionada de forma correta, mas isso depende, neste caso onde fiz os testes eu estou usando o Apache + Mongrel Cluster e não foi necessária nenhuma configuração adicional.

Agora se sua aplicação tem algum tipo de configuração diferente/específica, deixe seu comentário falando sobre o assunto, quem sabe possamos ver uma forma de ajudá-lo.

Rails: Simplificando o Agendamento de Tarefas

Posted in Ruby / Ruby on Rails on February 18th, 2009 by Andrey Viana – 4 Comments
Este artigo contém partes (traduzidas) do artigo original de Brent Coiler.

Estou trabalhando em um projeto onde preciso que uma determinada tarefa seja realizada a cada determinado tempo, que não pode ser um resultado de uma requisição de um usuário, por isso deve ser feito fora das requisições padrões, ou seja em background.

Geralmente quando falamos nesse tipo de processo, pensamos em BackgrounDrb ou Starling/Workling. Estas ferramentas realmente são muito boas no que fazem, mas eu preciso de algo mais simples.

Eu não preciso de filas de tarejas, ou nada do tipo. I preciso apenas uma ou mais tarefas para gerenciar. I apenas quero algo que eu diga, “Um dia, faça [tarefa]“, e isso é tudo.

Então comecei a procurar mas não demorei muito pra achar, ontem falei sobre o novo Ruby Inside Brasil e nele encontrei a resposta pra o que precisava no artigo sobre o Rufus Scheduler.

E éra justamente esse carinha que eu estava procurando, simples, não precisa de banco de dados nem um processo separadado para ele. Apenas uma tarefa que é chamada por fora do nosso código Ruby/Rails.

Então vamos lá para a configuração…

Primeiramente instale a gem:

sudo gem install rufus-scheduler

Então eu criei um arquivo chamado task_scheduler.rb na pasta config/initializers. Dentro deste arquivo é onde acontece a mágica. É onde vai tudo, Está preparado? Lá vai…

scheduler = Rufus::Scheduler.start_new

scheduler.every("1m") do
DailyDigest.send_digest!
end

Sim, é só isso. Verdade.

Eu estava desconfiado até eu iniciar o servidor/aplicação e ver que ele estava enviando os e-mails. No estado atual ele estava enviando o e-mail a cada minuto, o que não é bem o que quero. Felizmente o Rufus Scheduler dispõe de várias formas de agendar tarefas, veja mais detalhes aqui. Então quando estava pronto eu mudei o código pra algo mais no estilo de um cron-job.

scheduler = Rufus::Scheduler.start_new

# Envia o email todo dia ao meio-dia
scheduler.cron("0 12 * * *") do
DailyDigest.new.send_digest!
end

Também é possível usar scheduler.in ou scheduler.at para uma tarefa de uma única vez, para ser rodada no futuro. Veja mais detalhes aqui

Então agora você já sabe como fazer. Agendamento de tarefas super simples no Rails. Não tinha como ser mais fácil ;-)

[UPDATE]

Em resposta a dúvida do nosso amigo Hamilton, para parar uma tarefa já iniciada, fazemos o seguinte:

  job = scheduler.in '2d', :tags => 'admin' do
    run_backlog_cleaning()
  end

  # depois ...

  job.unschedule
    # ou
  scheduler.unschedule(job.job_id)

Rails: Utilizando mais (vários) bancos de dados

Posted in Ruby / Ruby on Rails on February 16th, 2009 by Andrey Viana – 4 Comments

Pode não parecer, mas é muito comum em alguns casos um aplicativo precisar realizar requisições em mais de um banco de dados. Saiba como você pode fazer para usar vários banco de dados na mesma aplicação:

Primeiramente você pode alterar o arquivo database.yml que fica na pasta config, inclua nele algo assim (sem os traços):
—————

banco_dados_dois:
  adapter: mysql
  encoding: utf8
  pool: 5
  wait_timeout: 10
  username: nome_de_usuario
  password: senha
  database: banco_dados_dois
  host: ip_ou_endereco_url_do_servidor # caso exista um outro servidor

—————

Feito isso, crie um novo Model (script/generate model NomeDoModel) com nome BancoDadosDois (ou qualquer outro) e adicione:

class BancoDadosDois < ActiveRecord::Base
  self.abstract_class = true
  establish_connection "banco_dados_dois"
end

Após isto, basta extender os Models que você precisa com esse Model que acabamos de criar. Assim as requisições vão buscar informações do BancoDadosDois. Para extender basta fazer:

class UserDois < BancoDadosDois
end

Após isto todas as requisições do Model UserDois serão pesquisadas no banco de dados “banco_dados_dois” que está indicado no arquivo database.yml

Todos os métodos do ActiveRecord continuam iguais, o que muda é que por exemplo o Model User vai buscar informações no banco de dados “banco_dados_padrao”, enquanto o UserDois vai buscar no “banco_dados_dois”.

Já os outros Models que não foram alterados, continuam buscando informações no banco de dados padrão.

Qualquer dúvida deixe seu comentário que logo responderei.

Ruby Inside Brasil, novo canal de notícias da comunidade Ruby/Rails brasileira

Posted in Ruby / Ruby on Rails on February 16th, 2009 by Andrey Viana – Be the first to comment

Ola, recebi agora pouco um e-mail do grupo rails-br no qual o Rafael cita sobre o lançamento do novo canal de notícias da comunidade Ruby/Rails brasileira, trata-se do Ruby Inside Brasil – http://www.rubyinside.com.br/

Visite o site: http://www.rubyinside.com.br/

“É isso aí, esperamos contar com sua participação e apoio, temos certeza que este canal será de grande utilidade para nossa comunidade.”

Rails: O método try(), Object#try()

Posted in Ruby / Ruby on Rails on February 16th, 2009 by Andrey Viana – Be the first to comment

Você já fez algo assim?

def name
  @user ? @user.name : nil
end

E se fosse assim seria melhor?

def name
  @user.try(:name)
end

Bem esse era um método que o Chris Wanstrath criou para facilitar nossa vida. Agora este método foi adicionado oficialmente ao Rails (2.3) e ainda com algumas mudanças.

Agora é possível inclusive usar argumentos ou blocos no código, exemplos:

Person.try(:find, 1)

@people.try(:map) {|p| p.name}

Porém talvez você não esteja ainda usando o Rails 2.3 não é? Então você pode criar um arquivo na sua pasta config/initializers com o nome object_extensions.rb e adicionar o seguinte código:

def try(method, *args, &block)
  send(method, *args, &block) if respond_to?(method, true)
end

Pronto! Reinicie sua aplicação e você já pode refatorar seu código deixando-o muito mais limpo e elegante utilizando esse método onde você achar necessário.

Dica: Instale o Google Talk nativamente no Ubuntu (sem precisar Wine ou CrossOver)

Posted in Linux, Ubuntu on February 16th, 2009 by Andrey Viana – Be the first to comment

Achei uma dica muito boa hoje, eu estava usando o Pidgin (antigo Gaim) para entrar no Gtalk, mas não gostava muito, e também não queria ter que entrar no Firefox pra fazer isso, então conversei com meu amigo (Google) e ele me disse que tinha uma dica muito boa sobre como instalar o Gtalk nativamente no Ubuntu, enjoy!

Blog.new(“Viana on Rails”)

Posted in Geral on February 16th, 2009 by Andrey Viana – Be the first to comment

Salve! A um bom tempo sem postar, não tive tempo pra colocar o novo blog no ar, mas hoje decidi que isso não poderia mais esperar.

Este blog será um meio para eu – um simples cidadão amante do Rails – me comunicar de alguma forma com a comunidade, mas não só a comunidade Rails, como todos em geral.

Pretendo passar aqui todo o meu conhecimento, cada idéia que possa ajudar alguém, cada “descoberta” e qualquer coisa do tipo, que venha ser útil pra alguém também…

Por isso você pode adicionar esse blog nos seus feeds e/ou favoritos, valeu!