Como colocar uma aplicação no ar?

Já terminou a sua aplicação lindona e agora precisa colocá-la no ar? Existem inúmeras questões que precisam ser resolvidas para que tudo funcione corretamente e é sempre necessário dar uma atenção especial a segurança.

Ao longo dos anos lidando com aplicações online eu desenvolvi várias receitas para facilitar o deploy das minhas aplicações. E agora eu compartilho tudo no curso on-line Imersão Sys Deploy! São 4 manhãs de sábado recheadas de mão na massa!

Cada aluno tem acesso a um servidor exclusivo, onde poderá realizar todos os testes sem se preocupar e sem comprometer nenhum ambiente de produção. Um verdadeiro ambiente safe-to-fail.

Você vai aprender sobre Apache, otimização, DNS, Crontab, SSH, Firewall, Port Knocking, Capistrano e muito mais. O curso é focado no deploy de aplicações Ruby on Rails, mas pode ser adaptado facilmente para deploy de outras aplicações como PHP, Django, Sinatra etc.

A próxima turma começa no sábado, dia 16 de julho! Então não perca tempo, pois as vagas são limitadas. Inscreva-se agora!

0 comentários : 10.07.2011 11:13 AM

Autocomplete simples para Rails 3 com jQuery

Autocomplete é uma ferramenta muito útil em um aplicativo web. Tanto para manter a consistencia dos dados quanto para facilitar a vida do usuário.

A gem rails3-jquery-autocomplete torna a implementação do autocomplete no rails 3 bem simples.

Antes de começar, verifique se você já está incluindo o jQuery e o jQuery.ui em seu layout, pois eles são pre-requisito para essa gem.

Se estiver tudo ok, vamos ao trabalho. Para começar, os passos básicos:

Adicione a gem ao seu Gemfile:

gem 'rails3-jquery-autocomplete'

Dê um:

bundle install

Rode o generator:

rails generate autocomplete

E inclua o javascript em seu layout:

javascript_include_tag "autocomplete-rails.js"

Então, com tudo configurado partimos para a utilização.

Digamos que nós tivessemos os modelos Product e Category e quisessemos fazer autocomplete do nome da categoria nos formulários dos produtos.

Note que o campo category do modelo Product precisa ser um campo de texto. Para fazer autocomplete em um campo que é chave estrangeira a abordagem é um pouco diferente, e vai ficar para um próximo post.

Seguindo. O próximo passo é adicionar no products_controller.rb:

autocomplete :category, :name

Isso cria uma action chamada autocomplete_category_name que retorna um json com os valores possiveis para o campo name.

Inclua a action nas rotas:

resources :products do
  get :autocomplete_category_name, :on => :collection
end

Nas views você só precisa substituir o text_field pela tag autocomplete_field, como no exemplo:

form_for @product do |f|
  f.autocomplete_field :category_name, autocomplete_category_name_products_path
end

E é só. Você tem um autocomplete pronto e funcional.

3 comentários : 04.01.2011 10:00 AM

Whenever - Cron Jobs do jeito Ruby

Uma das ferramentas mais úteis (até mesmo essenciais, eu diria) no arsenal de um desenvolvedor web são as tarefas do cron. Porém sua sintaxe um tanto quanto estranha intimida muitos desenvolvedores, que acabam subutilizando a ferramenta.

É ai que entra o Whenever, uma DSL ruby para escrever cron job que deixa essa tarefa bem mais fácil. Para instalar o whenever é necessario um:

gem install whenever

ou inclua a seguinte linha em seu Gemfile:

gem 'whenever'

e dê um:

bundle install

depois disso você precisa navegar até o diretorio do seu projeto e executar:

wheneverize .

Isso irá criar um arquivo chamado schedule.rb na pasta config.

É nesse arquivo que vão entrar suas tarefas, e é ai que começa a diversão.

Dê uma olhada no seguinte snippet:

every 2.hours do
 # seu comando entra aqui
end

É fácil assim.

Você pode ainda passar um segundo parametro para o metodo every especificando o horario que você quer que a tarefa seja executada.

every 2.days, :at => ‘2am’ do …

O whenever oferece também um metodo ‘rake’ que permite executar rake tasks com facilidade. Por exemplo:

every :hour do
  rake minha:rake:task
end

Você pode ainda executar comandos diretamente:

every 15.minutes do
 command "/usr/bin/comando_qualquer”
end

Lindo.

Só fique esperto para caso você receba um erro parecido com esse no seu /var/log/syslog:

Dec 28 02:00:01 toad CRON[23436]: (CRON) error (grandchild #23438 failed with exit status 127)
Dec 28 02:00:01 toad CRON[23436]: (CRON) info (No MTA installed, discarding output)

Isso significa que o cron não conseguiu encontrar o comando rake no path. Se isso acontecer é só você especificar o path do comando. como abaixo:

job_type :rake, "cd :path && RAILS_ENV=:environment /usr/local/bin/rake :task :output"

Mais algumas dicas:

Você pode redirecionar o log do whenever para outro arquivo incluindo a linha abaixo em seu schedule:

set :output, "/path/para/o/seu.log"

Pare integrar o whenerver com o capistrano inclua essas linhas no seu deploy.rb. Assim o cron será atualizado a cada deploy:

set :whenever_command, "bundle exec whenever"
require 'whenever/capistrano'

1 comentário : 03.01.2011 11:29 AM

E mais um podcast gravado!

Saiu no guanabara.info o episódio no. 53 do GuanaCast e eu fui o entrevistado da semana! Além do Gustavo Guanabara também participaram do podcast o Kauê Linden e o Sharuto da Hostnet. Foi um bate papo bem descontraído e divertido, explicando o básico do Ruby e do Rails, da onde a coisa apareceu, por que está fazendo tanto sucesso, etc. Não deixem de conferir!

Para ouvir, visite a página do podcast.

5 comentários : 01.02.2009 11:25 PM

Como vocês fazem o "describe" das suas specs?

Isso pra mim sempre foi uma dúvida ao usar o rspec. Realmente não há forma correta. É uma opção pessoal no caso de um projeto particular ou de decisão em conjunto no caso de um projeto onde vários desenvolvedores participam.

Mas o fato é que eu nunca adotei nenhum padrão para isso. É uma coisa que tem me deixado um pouco incomodado. Em alguns modelos sigo o padrão de um describe para cada método, em outros segui padrões ligeiramente diferentes, como por exemplo testes relacionados a attributos em um describe, relacionamentos em outro describe e assim por diante. Ou seja, não há padrão. Há tempos atrás ouvi uma frase que nunca esqueci:

Quando dois padrões existem, não há padrão.

No Lucidus usávamos Test::Unit(quando o projeto começou o rspec ainda era muito pouco difundido) então o “padrão” para nós era pelo menos colocar os testes relativos juntos. Então os testes relativos a um mesmo método normalmente estavam juntos, em um “bloco”, um abaixo do outro. O rspec nos permite um pouco mais de organização. Mas fazer essa organização extra através dos describes proporciona algum benefício?

Então seguindo a idéia… nós precisamos discutir testes.

Qual opnião de vocês? Como vocês organizam seus describes? E o que vocês escrevem nele?

3 comentários : 28.11.2008 03:18 AM

Palestra Utilizando Ruby com Bluetooth

Na semana passada eu apresentei no Latinoware a palestra “Utilizando Bluetooth com Ruby: A forma mais fácil de programar com Bluetooth”. Foi um sucesso total, a sala estava lotada e o pessoal se amarrou nas demonstrações ao vivo.

Coloquei os downloads na seção de artigos.

1 comentário : 07.11.2008 08:22 PM

Rcov with segfault bug patched

Rcov are hurting many people because of a segfault when used with rspec. Fortunately Tom Copeland wrote a patch last week. I patched it against rcov and put on GitHub. You can install it as a gem doing like this:

$ gem sources -a http://gems.github.com (you only have to do this once)
$ sudo gem install mergulhao-rcov

Someone knows how to make GitHub recognizes my README.markdown file?

12 comentários : 29.08.2008 01:28 AM

Fisl chegando e algumas novidades

Primeiro as novidades

Alguns já sabiam, outros, não. Esse blog rodava no Dreamhost. Depois de quase um ano brigando com eles para pararem de derrubar as minhas aplicações e sempre reclamando da velocidade, resolvi acabar logo com o problema. Há um mês atrás abri uma conta no Silverrack e fui migrando aos poucos minhas coisas para o vps e configurando/testando esquemas de firewall, servidores web etc. Ontem foi a vez do blog. Se você acha que está mais rápido, agradeça ao Silverrack.

Infelizmente ainda não deu tempo de fazer tudo funcionar. As pendências são: meu svn público e o site demo do Gulashop. Preciso decidir se coloco meu repositório público como svn no vps ou se passo a usar algum outro serviço externo como o github.

Agora o FISL!

Quem também for no FISL esse ano, não deixe de aparecer lá na minha palestra e na do Akita com o Luiz Vitor! Esse ano teremos até um stand do Rails Brasil, com sorte consigo alguma camisa para sortear no fim da palestra. Devo ficar boa parte do tempo do evento no stand do Rails Brasil, então apareçam por lá para trocarmos umas figurinhas.

Na minha palestra apresentarei o Rails 2 e no final, falarei sobre como foi, no Lucidus, a migração do Rails 1.2 para o Rails 2. Para isso, convidei o Vinícius – espero que o voo dele chegue a tempo. Ninguém melhor do que o Vinícius para falar desse projeto e mostrar porque as coisas funcionam BEM nele.

Hoje o projeto se encontra com ~18 kloc, sendo algo perto de ~7 kloc em código e o restante em código de teste. Não lembro exatamente qual a quantidade de linhas de código na época. Nossa migração ocorreu na última semana de dezembro. Dada as dimensões do projeto – não se esqueça que ruby não é java, 18 kloc é muita coisa em ruby – em quanto tempo vocês chutariam que fizemos essa migração?

Descubram na palestra ;)

2 comentários : 11.04.2008 09:09 PM

Curso de Ruby gratuito no Rubylearning.org

O site rubylearning.org organizado por Satish Talim está oferecendo a quinta edição do seu curso on-line de Ruby. O curso é gratuito, bastando fazer a inscrição pelo site. As aulas começam no dia 3 de maio e são ministradas através da plataforma Moodle.

English version:
The rubylearning.org website managed by Satish Talim is offering the 5th batch of his on-line Ruby course. The course is free, just enroll at his website. The classes start on 3rd May and the course is designed using Moodle.

1 comentário : 30.03.2008 12:54 AM

Uma rapidinha: mkmf (LoadError)

Se você está tendo um problema como esse ao tentar instalar um gem:

Building native extensions.  This could take a while...
ERROR:  While executing gem ... (Gem::Installer::ExtensionBuildError)
    ERROR: Failed to build gem native extension.

ruby extconf.rb install mechanize
extconf.rb:1:in `require': no such file to load -- mkmf (LoadError)
        from extconf.rb:1

Basta instalar o pacote de desenvolvimento do Ruby:

sudo apt-get install ruby1.8-dev

3 comentários : 29.08.2007 02:09 PM

Workshop de impressão de cupom fiscal com Ruby

No dia fatídico, última terça-feira, 17 de julho, desembarquei em São Paulo para assistir ao workshop de impressão de cupom fiscal. O workshop foi com o pessoal da Object Data, que está oferecendo também cursos de Rails e Ruby. Muito bom ter um pouco de contato com pessoas da comunidade Ruby e que estão utilizando na prática além do Rails.

Pude conhecer e trocar boas idéias também com o Nando Viera, que está sorteando uma edição do livro Agile Web Development With Rails. Para saber como concorrer veja aqui.

Precisamos trazer boas iniciativas como essa também para o Rio de Janeiro. Espero que no V Fórum de Software Livre desse ano consigamos agregar mais pessoas interessadas no assunto para termos mais ações concretas.

0 comentários : 20.07.2007 02:48 PM