Browsed by
Tag: rails

Puma vs. Unicorn

Puma vs. Unicorn

TL; DR – You should start using Puma.

Rails has switched the default server from Webrick to Puma in Rails 5!

It also supports Action Cable (one of the new features from Rails 5) and Basecamp said they’re using Puma in production.

I was wondering if Puma has been in fact better than Unicorn so I’ve read some blog posts about it:

Basically, the answer is yes – it is a bit better, but don’t wait for a huge improvement. I’d say it might be a good idea if you’re:

  • about to start a new project;
  • about to migrate your current project to Rails 5;
  • unhappy with your Rails 3 / 4 app server performance.
Aprenda a programar

Aprenda a programar

Parte I – Desenvolvimento de aplicações web

Primeiramente, assista esse vídeo:

Depois leia esse post:

Finalmente, entre nesse grupo para acompanhar as novidades ou para tirar dúvidas: Ruby on Rails Brasil.

Parte II – Desenvolvimento de aplicações iOS (iPhone, iPad, Apple Watch, Apple TV)

Entre nesse grupo (Slack): iOS Dev BR.

Qualquer dúvida, mande nos comentários abaixo :-)

Rake task to import a production DB dump

Rake task to import a production DB dump

Every now and then I need to write a script (rake task) to import a production database dump.

This is code I usually use:

require 'yaml'

namespace :db do
  desc 'Downloads and imports a production DB dump'
  task :import_production_dump do
    puts '➙ Generating production DB dump...'

    execute_on_server %(
      PGPASSWORD="`cat /var/www/project/current/config/database.yml | \
        grep password | awk '{ print $2 }'`" \
        pg_dump database_name -h -U user_name \
        --column-inserts --no-owner --no-privileges > backup.sql

    puts '➙ Downloading production DB dump...'
    system "scp #{server_user_and_host}:#{backup_file_name} ."

    puts '➙ Deleting production DB dump...'
    execute_on_server 'rm backup.sql'

    puts '➙ Cleaning your local DB...'
    %w(drop create).each { |task| Rake::Task["db:#{task}"].invoke }

    puts '➙ Importing production DB dump...'
    system "bin/rails db development < #{backup_file_name} > /dev/null"

    puts '➙ Removing local dump...'
    system "rm #{backup_file_name}"

    puts '➙ Done!'

  def execute_on_server(commands)
    system %(ssh -T #{server_user_and_host} << 'SSH'

  def server_user_and_host

  def backup_file_name

Let me know in the comments if you have a better solution! Perhaps a tiny gem? ツ

What is “frozen_string_literal” in Ruby?

What is “frozen_string_literal” in Ruby?


Freezing Strings feature improves apps performance by freezing Strings. So, Matz – Ruby’s creator – decided to make all String literals frozen (immutable) by default in Ruby 3.0.

In order to have a transition path to this coming big change, it was decided to have a magic comment at the beginning of files, so you can use in Ruby 2.3.

To do so, just add this comment in the first line of your files:

# frozen_string_literal: true

class YourClass
  # ...

Trying adding it to your spec_helper file and let me know in the comments if you performance improved!

More info: Ruby issue #8976.

If you really need to create a monkey patch, do it properly

If you really need to create a monkey patch, do it properly


Sometimes we need to create a monkey patch for a gem or external lib.
In these cases, it’s good to force it to fail if the gem has been bumped up:

if Paperclip::VERSION != '1.2.3'
  # If you see this message, please test removing this file
  # If it's still required, please bump up the version above
  fail 'Please remove me, Paperclip version has changed'

If the gem doesn’t provide you the version through a method, you can solve it with:

if Bundler.load.specs.find { |gem| == 'paperclip' }.version.to_s != '1.2.3'
  # If you see this message, please test removing this file
  # If it's still required, please bump up the version above
  fail 'Please remove me, Paperclip version has changed'

Or even when you’re waiting for a new Rails version, e.g.:

fail 'Remove this file' if Rails::VERSION::MAJOR >= 5

Ps.: Paperclip gem was just an example :-)

Measuring and improving your Rails app quality

Measuring and improving your Rails app quality

I’ve just written a blog post on the NetEngine’s blog:

I hope you enjoy it.

[Screencast] Ruby on Rails – Assets / Assets Pipeline

[Screencast] Ruby on Rails – Assets / Assets Pipeline

Mais um screencast gravado!
Esse sobre como funcionam os assets e o Assets Pipeline do Rails.

Assista outros screencasts do meu canal:

Links comentados no vídeo:

Meu projeto (curso) “Aprenda a programar” está no Catarse!

Meu projeto (curso) “Aprenda a programar” está no Catarse!


A meta infelizmente não foi atingida. Porém você pode ler o post a seguir para saber como você pode aprender a programar:


Tem um vídeo explicativo bem no começo da página!

Screen Shot 2014-07-31 at 1.37.48 pm

Como aprender Ruby e Rails

Como aprender Ruby e Rails


Vários amigos tem me perguntado como podem aprender a programar em Ruby e Rails. Vou postar aqui os mesmos vídeos e dicas que mandei pra eles, caso alguém tenha interesse também:

An awesome Wiki built with Ruby and Rails!

An awesome Wiki built with Ruby and Rails!

I’ve been worked on a small (but awesome) open-source project.

I’m talking about ruby_wiki – a simple wiki built with Ruby on Rails:

As I said before – it’s quite simple, although it works fine.
Anyway, would be nice to have more features in this project, so, if you’re a developer and have any interest in that, feel free to fork the project and contribute.

Some screenshots:







Have a Rails 2 app? You can run it on the newest Ruby!

Have a Rails 2 app? You can run it on the newest Ruby!


Do you have a legacy Rails application which is still running on Rails 2?

There are several reasons to migrate your application to new Rails versions, like to improve the security, to be able to use a better syntax, to take advantage of new features and also because most of current gems will only work on Rails 3 or higher. However, sometimes it’s hard to do that, especially for big projects. And certainly today there’re many project still running on Rails 2.

But there’s one good thing you can (and should) do! I’m talking about to use the newest Ruby version. Yes, I’m serious. When I wrote this post, the current Ruby version was 2.1.1 – and it’s not so hard to get it working fine with Rails 2.

Obviously, would be better if you have a good test coverage.

That said, let’s do it in a few steps:


1. Gemfile

Rails 2 apps don’t use Bundler by default, so if you don’t have Bundler managing your gems yet, you should check here how to do that.

# There's no way to ensure that the next Ruby versions will work,
# but so far the current one works fine:
ruby '2.1.1'

# The same for rake:
rake '10.1.1'

# You might need the iconv gem:
gem 'iconv'

2. Rakefile

# Replace:
# require 'rake/rdoctask'

# with:
require 'rake/task'


# Replace:
# require 'config/environment'

# with:
require File.dirname(__FILE__) + '/config/environment'

4. FasterCSV => CSV

Replace all FasterCSV constant with CSV. Also, include require 'csv' to relevant files (or include this require to config/environment.rb).


5. config/environment.rb

# Include this before the `` line:
if RUBY_VERSION >= '2.0.0'
  module Gem
    def self.source_index

    def self.cache

    SourceIndex = Specification

    class SourceList
      # If you want vendor gems, this is where to start writing code.
      def search(*args); []; end
      def each(&block); end
      include Enumerable

6. config/initializers/paperclip.rb

# The patches below are needed when using an old version of PaperClip + Ruby 2.x

module Paperclip
  class Tempfile < ::Tempfile
    def make_tmpname(basename, n)
      extension = File.extname(basename)
      sprintf('%s,%d,%d%s', File.basename(basename, extension), $$, n.to_i, extension)

module IOStream
  def to_tempfile
    name = respond_to?(:original_filename) ? original_filename : (respond_to?(:path) ? path : 'stream')
    tempfile =['stream', File.extname(name)])

New files

7. config/initializers/ruby2.rb

# This is a very important monkey patch to make Rails 2.3.18 to work with Ruby 2+
# If you're thinking to remove it, really, don't, unless you know what you're doing.

if Rails::VERSION::MAJOR == 2 && RUBY_VERSION >= '2.0.0'
  module ActiveRecord
    module Associations
      class AssociationProxy
        def send(method, *args)
          if proxy_respond_to?(method, true)
            @target.send(method, *args)

8. config/initializers/rails_generators.rb

It'll prevent Rails migration generator from stop working, otherwise you'll receive the following error message:

undefined local variable or method `vars' for # Rails::Generator::Commands::Create

(Thanks to Mr. S and jnwheeler44 for helping me to fix this one)

# This is a very important monkey patch to make Rails 2.3.18 to work with Ruby 2+
# If you're thinking to remove it, really, don't, unless you know what you're doing.

if Rails::VERSION::MAJOR == 2 && RUBY_VERSION >= '2.0.0'
  require 'rails_generator'
  require 'rails_generator/scripts/generate'

  Rails::Generator::Commands::Create.class_eval do
    def template(relative_source, relative_destination, template_options = {})
      file(relative_source, relative_destination, template_options) do |file|
        # Evaluate any assignments in a temporary, throwaway binding
        vars = template_options[:assigns] || {}
        b = template_options[:binding] || binding
        # this no longer works, eval throws "undefined local variable or method `vars'"
        # vars.each { |k, v| eval "#{k} = vars[:#{k}] || vars['#{k}']", b }
        vars.each { |k, v| b.local_variable_set(:"#{k}", v) }

        # Render the source file with the temporary binding, nil, '-').result(b)


9. Make sure you're using the last compatible version with Rails 2.3.18:

gem 'rspec', '1.3.2'
gem 'rspec-rails', '1.3.4'

10. Remove the file script/spec.

11. lib/tasks/rspec.rake

Remove all the following lines:

gem 'test-unit', '1.2.3' if RUBY_VERSION.to_f >= 1.9
rspec_gem_dir = nil

Dir["#{Rails.root}/vendor/gems/*"].each do |subdir|
  rspec_gem_dir = subdir if subdir.gsub("#{Rails.root}/vendor/gems/","") =~ /^(\w+-)?rspec-(\d+)/ && File.exist?("#{subdir}/lib/spec/rake/spectask.rb")

rspec_plugin_dir = File.expand_path(File.dirname(__FILE__) + '/../../vendor/plugins/rspec')

if rspec_gem_dir && (test ?d, rspec_plugin_dir)
  raise "\n#{'*'*50}\nYou have rspec installed in both vendor/gems and vendor/plugins\nPlease pick one and dispose of the other.\n#{'*'*50}\n\n"

if rspec_gem_dir
elsif File.exist?(rspec_plugin_dir)

Ruby syntax

12. Some details has been changed in Ruby syntax, especially from 1.8.x to 1.9.x.

Example 1:

# Replace:
when 'foo': bar

# with:
when 'foo' then bar

Example 2:

The behaviour for protected methods in new Ruby versions is a little bit different. See more in this post.

# In some cases, you might need to replace:

# with:
respond_to?(:foobar, true)

Example 3 (Yaml files):

# Replace:
order: [ :day, :month, :year ]

# with:
  - :year
  - :month
  - :day

Ruby changes

13. The default encoding for Ruby 2.0 (or higher) is UTF-8. So, remove all the code similar to:

# encoding: utf-8


$KCODE = 'UTF-8'

Important note (included on July 27, 2014)

Check the comments below: Gabriel Sobrinho, Kyle Ries and Greg made some useful comments.


Each project could have different issues, but I hope this little guide helps you to use new Ruby versions in legacy Rails applications!

Apresentação online sobre as novidades do Rails 4

Apresentação online sobre as novidades do Rails 4

Screen Shot 2013-07-02 at 10.22.18 PM

O Rails 4 acabou de ser lançado e tem várias novidades bacanas! Aprenda o que mudou, o que são Strong Parameters, turbolinks, etags, requests com streaming e outras coisas interessantes.

Hoje fiz uma apresentação online pela Eventials e pela Locaweb sobre as novidades do Rails 4. Quem quiser assistir, a palestra está gravada e disponível no link abaixo:

Seguem os slides:

Slides da minha apresentação “What’s new in Rails 4”

Slides da minha apresentação “What’s new in Rails 4”

Quinta-feira passada apresentei um tech talk aqui na Locaweb sobre as novidades do Rails 4.

Seguem os slides:

[#IF] Screencasts de Ruby on Rails para iniciantes

[#IF] Screencasts de Ruby on Rails para iniciantes


Pra quem não entendeu o que é a hashtag #IF, veja esse post do Fabio Akita.

No ano passado, eu comecei a gravar alguns vídeos pra ajudar quem gostaria de começar a programar com Ruby on Rails.

Por enquanto são 3 screencasts apenas, mas já é o suficiente pra quem gostaria de começar.

Linguagem de programação “Ruby” (para iniciantes)

Ruby on Rails (para iniciantes)

Ruby on Rails – introdução às rotas

Por favor, me mandem feedback, com sugestões, críticas ou até mesmo dúvidas. Espero que gostem e que seja útil ;-)

Projeto “”

Projeto “”

Eu sou um cara que gosta muito de escutar podcasts. Escuto vários, sobre variados temas, alguns em português, outros em inglês, alguns sobre áreas totalmente diferentes da que eu trabalho, alguns nostálgicos, alguns pra melhorar meu inglês, etc. E sempre que encontro com alguém e descubro que a pessoa também escuta podcasts, rola as perguntas sobre qual escuta, sobre o que se trata, quais amigos em comum escutam, qual o nível de qualidade, entre outras dúvidas. Foi aí que surgiu a idéia de criar o site, um site onde você pode cadastrar tudo isso e no final ter uma URL publica para passar para os interessados nos podcasts que você escuta.

Há 2 meses atrás eu o coloquei no ar e logo em seguida o liberei como open-source: Então, sintam-se a vontade para usar o site e contribuir com ele.

Seguem alguns screenshots:

Screen Shot 2013-04-21 at 6.38.43 PM

Screen Shot 2013-04-21 at 6.44.15 PM

Screen Shot 2013-04-21 at 6.44.50 PM

Ah sim! O site é (mais ou menos) responsivo:

Screen Shot 2013-04-21 at 6.48.11 PM

Projeto “time_clock”

Projeto “time_clock”

É comum na maioria das consultorias brasileiras de software, principalmente as que contratam funcionários através de regime PJ, solicitarem o relatório de horas trabalhadas mês a mês. Como esse era o meu caso no ano passado, eu criei um pequeno sistema para facilitar esse controle.

Eu havia criando essa funcionalidade dentro do próprio código do meu site, mas como várias pessoas gostaram e me pediram o código, eu extraí o código para um projeto a parte e o liberei como open-source.

Sinta-se à vontade para usar, melhorar e divulgar:

Seguem alguns screenshots:
Screenshot browser
Screenshot iPhone

A simple way to deploy your Rails applications

A simple way to deploy your Rails applications

Sometimes I prefer to use a simpler way to deploy my Rails applications instead of install and configure some complex tool (eg.: capistrano).

A very simple way to do this is creating a shell script within the /script directory, which will access the server via SHH:

#! /bin/bash
# script/

TAG=deployed_at_$(date +"%F_%H-%M")
git tag -m '' -a $TAG
git push --tags

ssh << 'SSH'
  cd /var/rails_apps/my_app
  rm -rf public/assets
  git pull
  bundle install --without development test
  bundle exec rake db:migrate db:seed assets:clean assets:precompile
  touch tmp/restart.txt
  git describe > public/version

After that, a tag will be created in the git repository. Now, you know exactly the date and time when it was deployed.

And you can find out which version (tag from git) is in production accessing the URL


Update on March 8, 2013:

I’ve created another script which accepts the -q param (quick).

Tentativa de atualização de um projeto para Rails 4 (o qual ainda não está pronto)

Tentativa de atualização de um projeto para Rails 4 (o qual ainda não está pronto)

O Rails 4 ainda não foi lançado, tampouco tem uma versão beta, um Release Candidate ou algo do tipo.

Mas depois de ver os slides “What to expect in Rails 4.0” do Boston Ruby Group, fiquei com vontade de atualizar um projeto no qual estou trabalhando atualmente só pra ver se algo iria explodir :-)

Antes de mais nada

Dê uma olhada nos Release Notes e nesta árvore do Rails 4.

Atualização do Bundler

Bom, a primeira coisa que tive que fazer, foi atualizar o meu bundler (eu usava a versão 1.1.5 e atualizei para a 1.2.1), já que o Rails 4 precisa da versão 1.2.x ou superior.

Atualização do Gemfile

Feito isso, alterei algumas coisas no Gemfile, sendo que a parte relevante é essa abaixo:

# gem 'rails', '3.2.8'
gem 'rails', github: 'rails/rails' # Aqui vamos pegar o código mais novo do Rails, diretamente do Github :-)
gem 'journey', github: 'rails/journey' # o Rails depende da versão mais nova dessa gem
gem 'activerecord-deprecated_finders', github: 'rails/activerecord-deprecated_finders' # o Rails depende dessa gem, a qual ainda não foi lançada

group :assets do
  gem 'sass-rails', github: 'rails/sass-rails' # o Rails depende da versão mais nova dessa gem
  gem 'coffee-rails', github: 'rails/coffee-rails' # o Rails depende da versão mais nova dessa gem
  gem 'uglifier', '>= 1.0.3'

# resto do Gemfile...

Nesse ponto, a brincadeira meio que acabou pra mim: o Mongoid ainda não é compatível com o Rails 4. Mas resolvi seguir em frente, testando apenas as páginas estáticas (que não dependendiam do Mongo), só pra ver o que iria rolar…

Alterações no config/application.rb

Como nesse projeto, eu não fazia um

require 'rails/all'

pois não uso nem ActiveRecord nem test_unit, eu fazia require apenas do que eu precisava:

# require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "sprockets/railtie"
# require "rails/test_unit/railtie"

Mas eu tive que retirar o “active_resource/railtie” (que agora é uma gem externa) e o “sprockets/railtie” (este simplesmente não funcionou – e eu não pesquisei o motivo).


Se você tiver alguma rota desse tipo:

match 'foobar' => 'foo#bar', via: 'put'

Você vai ver um erro assim: “You should not use the `match` method in your router without specifying an HTTP method. (RuntimeError)”.

A solução é usar o verbo HTTP no lugar do “match”:

put 'foobar' => 'foo#bar'

Isso também vale para rodas com o GET. Resumindo: não use mais o “match”! :-)

Aproveitando que estou falando de rotas, uma coisa muito interessante que eu descobri foi o novo stack trace de erro de rota, que agora mostra todas as rotas disponíveis (obviamente, só exibe isso no ambiente development). Segue um screenshot:

Configurações de ambientes

Uma nova configuração obrigatória nos arquivos config/environments/*.rb é o eager_load. Caso você não configure isso, receberá um WARNING:

config.eager_load is set to nil. Please update your config/environments/*.rb files accordingly:
  * development - set it to false
  * test - set it to false (unless you use a tool that preloads your test environment)
  * production - set it to true

Outro detalhe é que a config whiny_nils não existe mais, então eu precisei retirá-la.

Views e helpers

Em um trecho do meu HTML, eu usava o helper asset_path:

<%= asset_path 'some_image.png' %>

Mas rolava esse erro:

undefined method `asset_path' for #<#<Class:0x007...>

E resolvi isso por hora removendo essa linha (afinal, eu queria ver até onde eu conseguiria chegar).

Outro problema que tive em views foi esse:

undefined method `handle_positional_args' for #<#<Class:0x007...>

A primeira vez aconteceu em um helper link_to e depois em um form_for. Aparentemente, nenhum deles tinha nada demais. Novamente eu removi esses dois heleprs da minha view.

Então eu finalmente consegui ver a página (estática)! :-)

TL; DR => Conclusão

Consegui carregar apenas as páginas estáticas, uma vez que o Mongoid ainda não suporta o Rails 4.0. E pelo mesmo motivo, não consegui rodar nenhum teste :-(
Ainda é cedo pra começar a migrar os projetos (como eu já falei, o Rails 4 não tem nem mesmo um Release Candidate). O faça apenas para se divertir e/ou ajudar os desenvolvedores reportando bugs ou colaborando com o código!

Rails Girls SP 2012

Rails Girls SP 2012

Nos dias 7 e 8 de setembro, aconteceu o evento “Rails Girls” aqui em São Paulo.

O evento é uma iniciativa para fazer com que mais mulheres se interessem pela área de desenvolvimento de software. O evento é gratuito e acontece em vários lugares do mundo. Aqui no Brasil já aconteceu em Porto Alegre e agora em São Paulo (realizado na Locaweb).

Nos dois dias do evento, foram apresentadas algumas lighting talks muito boas (a maioria apresentadas por mulheres) e um curso básico de programação para web, usando Ruby on Rails. Durante o curso, foi mostrado às alunas uma visão geral sobre desenvolvimento web (HTML, CSS, javascript), MVC e banco de dados. E elas tiveram que criar um projeto real, começando do zero e terminando com a aplicação rodando no Heroku, apresentando o que fizeram para todos no final.

Eu participei como coach e valeu muito a pena. Foi sensacional ver os projetos finalizados!

Segue o link do evento e algumas fotos:

Instalando e configurando Ruby e Rails no Mac OSX Mountain Lion

Instalando e configurando Ruby e Rails no Mac OSX Mountain Lion

Esse post não é um guia e sim um link para um documento que criei dentro do projeto ruby-unix, criado pelo grande Daniel Lopes.

Confira o guia aqui.

No projeto, existe instruções para instalar o Ruby e o Rails em várias plataformas, como Mac OSX, Ubuntu, Cent OS e Fedora. Confira na página do projeto.

How to test ElasticSearch in a Rails application

How to test ElasticSearch in a Rails application

Since I started using ElasticSearch in my Rails applications, I had a problem to create separate indexes for the automated tests.

The problem is: there is no way to create more than one database in ElasticSearch. You can create different indexes, but no different databases. But creating indexes with different names doesn’t solve the problem: it’s necessary to configure our Rails models in order to work with a different index name when the tests is running.

I’m using the tire and RSpec gems and in this post, I’ll explain how to separate indexes for development and test environments.

First of all, I’ve included the code below in file config/initializers/tire.rb:

if Rails.env.test?
  prefix = "#{Rails.application.class.parent_name.downcase}_#{Rails.env.to_s.downcase}_"

And I set manually the index name in the model (assuming that there is a Movie model):

index_name "#{Tire::Model::Search.index_prefix}movies"

Done! After that, when your application is running in development environment, the name of indexes will be “movies”. But if it’s in the test environment, the name of indexes will be “appname_test_movies” and then the tire gem and your models can perform the search with different indexes!

Deleting test indexes

In order to delete the test indexes after the suite has finished running, just add the following code to file spec/integration_helper.rb (or similar):

RSpec.configure do |config|
  config.after(:all, type: :request) { delete_movie_index }

And create a custom macro, which will delete the indexes:

def delete_movie_index

Demo app

I created a small application to demonstrate the technique explained in this post:

I hope this has been helpful!

Replacing “Selenium” with “Poltergeist”

Replacing “Selenium” with “Poltergeist”


My friend @pellegrino give me an awesome tip: to replace “Selenium” with “Poltergeist”. For those who don’t know, Poltergeist is a PhantomJS driver for Capybara. I’ve done it in some projects and it works so well!

So, let’s do it:

Include the gem to your Gemfile:

gem 'poltergeist'

Update Capybara configuration:

Capybara.configure do |config|
  # config.javascript_driver = :selenium
  config.javascript_driver = :poltergeist

Run the specs!

If you are testing some confirm() javascript method and you have a code similar to page.driver.browser.switch_to.alert.accept, you’ll got this error:

undefined method `switch_to'

While I was trying to fix it, I find out that Poltergeist always returns true from window.confirm. There’s no way (at the moment) to make it return false, but it should not prevent your test from running.

So, I just removed that line and it worked fine!

This is the improvement from the first project I’ve done it:

Finished in 1 minute 35.45 seconds

Finished in 41.03 seconds

Hope that can be useful for you!

Minha palestra sobre Ruby on Rails no “Café com Java”

Minha palestra sobre Ruby on Rails no “Café com Java”

Ontem aconteceu mais um encontro do evento “Café com Java”, na Caelum, organizado pelo Eduardo Bregaida. Eu palestrei sobre Ruby on Rails, com um ligeiro foco para o pessoal do Java.

Um obrigado especial à minha namorada Aline Nepomuceno, por filmar minha apresentação! :-)

Seguem os slides e o vídeo da palestra:

(Se não conseguir ver os slides, clique aqui)

(Se não conseguir ver o vídeo, clique aqui)

E algumas fotos:

Vou palestrar no “Café com Java” amanhã

Vou palestrar no “Café com Java” amanhã

Sim amigos, vou palestrar no Café com Java, mas não, não abandonei o Ruby on Rails. Na verdade a palestra será sobre Rails mesmo!

Segue o link da divulgação do Evento:

Para participar, você precisa se inscrever aqui.

Obrigado ao Eduardo Bregaida pelo convite para palestrar.