ecossistema ruby e rails (serpro bh)
DESCRIPTION
Palestra aplicada no Serpro BH cobrindo uma introdução ao Rails e ao Ruby em conjunto com seu ecosistema.Obrigado Fábio Akita por ceder vários slides (http://www.slideshare.net/akitaonrails)TRANSCRIPT
FILOSOFIA RUBY E RAILS
@danielvlopes
ENG. DE SOFTWARE CENTRADA EM MÉTODOS ÁGEIS
http://bit.ly/unapos
FILOSOFIA RUBY E RAILS
POR QUE ?
OBRIGADO @AKITAONRAILS PELO CONTEÚDO
DE VÁRIOS SLIDES DESTA APRESENTAÇÃO
O QUE EU TENHO COM ISSO?
... um aclamado instrutor aplicando um curso descobriu que um de seus pupilos era um venture capitalist.
Quando questionado sobre o motivo de estar em uma turma de “Ruby on Rails” ... , ele respondeu simplesmente:
todas as start-ups que me procuram estão usando, eu quero descobrir qual é o “grande lance”.
Mark Gardner http://bit.ly/railsecosystem
Entrevista Steve Jobs (momento entre 1:00 e 1:01): http://itunes.apple.com/us/podcast/steve- jobs-at-d8-conference/id377953458
VOCÊ DEVE SE COMPORTAR COMO
UMA STARTUP
Ruby 1.8.7
Ruby 1.8.7
Ruby 1.9.2
Ruby 1.8.7
Ruby 1.9.2
Ruby on Rails 2.3.8
Ruby 1.8.7
Ruby 1.9.2
Ruby on Rails 2.3.8
Ruby on Rails 3.0.0
Yukihiro Matsumoto(criador do Ruby)
“Se você terminar seu trabalho rápido e de forma divertida, isso
não é bom?”
Matz http://www.artima.com/intv/ruby3.html
“Tornar as coisas simples fáceis e as coisas complexas possíveis”
• 100% orientada a objetos
• Linguagem dinâmica
• Esperados 4 milhões até 2013
• FREE e Open Source
• As vezes chamada de “scripting” language
Eu inventei o termo “Orientação a Objetos” e posso dizer que não era C++ que eu tinha em mente.
Dave Thomas
2001Dave Thomas
2004
“Eu sempre soube que Smalltalk substituiria Java. Só não sabia que isso se chamaria Ruby.”
Kent Beck, Criador do "Extreme Programming" e "TDD"
FICAMOS EMPOLGADOS !!!
JAVA vs RAILS: http://www.youtube.com/watch? v=SsYKd37r26s
JRubyCharles Nutter
JRubyCharles Nutter
MacRubyL. Sansonetti
JRubyCharles Nutter
JQuery/RailsYehuda Katz
MacRubyL. Sansonetti
JRuby 1.5.X
JRuby 1.5.X
Rubinius 1.0
JRuby 1.5.X
Rubinius 1.0
Mac Ruby 0.6
JRuby 1.5.X
Rubinius 1.0
Mac Ruby 0.6
Iron Ruby 1.0
APLICANDO NA WEB
David Heinemeier Hansson “DHH”
David Heinemeier Hansson “DHH”
2004
código gerando código
código gerando código
convention over configuration
código gerando código
convention over configuration
don’t repeat your self
código gerando código
convention over configuration
don’t repeat your self
desenvolvimento ágil
EXTREME PROGRAMMING
recursos restful
recursos restful
Unicode, TimeZone, i18n
recursos restful
Unicode, TimeZone, i18n
Segurança (XSS, XSRF, Injection)
Templates ERB, HAML
Autenticação HTTP Basic, HTTP Digest, Devise
Bancos de Dados MongoDB, CouchDB, MySQL, PostgreSQL, Oracle
ORM’s ActiveRecord, DataMapper, MongoMapper
Javascript Prototype, jQuery, SproutCore
Web Servers Apache 2, NginX, Lighty, Litespeed
Templates ERB, HAML
Autenticação HTTP Basic, HTTP Digest, Devise
Bancos de Dados MongoDB, CouchDB, MySQL, PostgreSQL, Oracle
ORM’s ActiveRecord, DataMapper, MongoMapper
Javascript Prototype, jQuery, SproutCore
Web Servers Apache 2, NginX, Lighty, Litespeed
Templates ERB, HAML
Autenticação HTTP Basic, HTTP Digest, Devise
Bancos de Dados MongoDB, CouchDB, MySQL, PostgreSQL, Oracle
ORM’s ActiveRecord, DataMapper, MongoMapper
Javascript Prototype, jQuery, SproutCore
Web Servers Apache 2, NginX, Lighty, Litespeed
Templates ERB, HAML
Autenticação HTTP Basic, HTTP Digest, Devise
Bancos de Dados MongoDB, CouchDB, MySQL, PostgreSQL, Oracle
ORM’s ActiveRecord, DataMapper, MongoMapper
Javascript Prototype, jQuery, SproutCore
Web Servers Apache 2, NginX, Lighty, Litespeed
Templates ERB, HAML
Autenticação HTTP Basic, HTTP Digest, Devise
Bancos de Dados MongoDB, CouchDB, MySQL, PostgreSQL, Oracle
ORM’s ActiveRecord, DataMapper, MongoMapper
Javascript Prototype, jQuery, SproutCore
Web Servers Apache 2, NginX, Lighty, Litespeed
Templates ERB, HAML
Autenticação HTTP Basic, HTTP Digest, Devise
Bancos de Dados MongoDB, CouchDB, MySQL, PostgreSQL, Oracle
ORM’s ActiveRecord, DataMapper, MongoMapper
Javascript Prototype, jQuery, SproutCore
Web Servers Apache 2, NginX, Lighty, Litespeed
class Post < ActiveRecord::Base # ASSOCIATIONS has_and_belongs_to_many :categories belongs_to :author has_many :comments, :dependent => :destroy
# VALIDATIONS validates_presence_of :title, :body, :author, :slug, :published_at validates_uniqueness_of :slug validates_inclusion_of :draft, :in => [true, false] validates_associated :author
# SCOPES (custom queries) default_scope :order => 'published_at DESC' scope :published, lambda { where(:draft => false) }
# CALLBACKS before_validation :generate_slug
protected def generate_slug self.slug = title unless slug.present? self.slug = slug.parameterize endend
model
<%= form_for [ post, comment ], :remote => true do |f| %> <%= error_messages_for comment %> <div class="field"> <%= f.label :author %><br /> <%= f.text_field :author %> </div>
<div class="field"> <%= f.label :url %><br /> <%= f.text_field :url %> </div>
<div class="field"> <%= f.label :body %><br /> <%= f.text_area :body, :rows => 10, :cols => 90 %> </div>
<%= render "submit_or_cancel" %><% end %>
views
class Admin::PostCategoriesController < ApplicationController def index @categories = PostCategory.all respond_with @categories end
def show @category = PostCategory.find(params[:id]) respond_with @category end
def new @category = PostCategory.new respond_with @category end
def edit @category = PostCategory.find(params[:id]) end
def create @category = PostCategory.new(params[:post_category]) flash[:notice] = 'Category was successfully created.' if @category.save respond_with @post end
def update end
def destroy endend
controller
CLEAN CODE
190
40VS
Eles servem mais de 23 milhões de visitantes/mês.
Eles servem mais de 23 milhões de visitantes/mês. A conversão resultou em 20 mil linhas de Ruby em vez
de 125 mil linhas de Java
Eles servem mais de 23 milhões de visitantes/mês. A conversão resultou em 20 mil linhas de Ruby em vez
de 125 mil linhas de Java e, mais importante, facilitou a dificuldade que tinham em manutenção.
“Eles servem mais de 23 milhões de visitantes/mês. A conversão resultou em 20 mil linhas de Ruby em vez
de 125 mil linhas de Java e, mais importante, facilitou a dificuldade que tinham em manutenção. Eles
também finalizaram a reescrita do sistema em apenas 3 meses com 4 desenvolvedores. Uma vez completo e
otimizado, o site deles agora é mais rápido que antes.”
http://www.railsonwave.com/railsonwave/2008/6/4/yellowpages-com-migrates-to-rails
ECOSSISTEMA
Repositórios Github e Codebase
Integração Contínua Hudson, Cruise, CI Joe
Deploy Chef, Puppet, Capistrano
Monitoramento NewRelic, Scout, BackupMyApp
Repositórios Github e Codebase
Integração Contínua Hudson, Cruise, CI Joe
Deploy Chef, Puppet, Capistrano
Monitoramento NewRelic, Scout, BackupMyApp
Repositórios Github e Codebase
Integração Contínua Hudson, Cruise, CI Joe
Deploy Chef, Puppet, Capistrano
Monitoramento NewRelic, Scout, BackupMyApp
Repositórios Github e Codebase
Integração Contínua Hudson, Cruise, CI Joe
Deploy Chef, Puppet, Capistrano
Monitoramento NewRelic, Scout, BackupMyApp
source 'http://rubygems.org'
gem 'rails', '3.0.0.rc'gem 'devise', '1.1.1'gem 'paperclip', '2.3.3'gem 'menu_builder', '0.3.3'gem 'RedCloth', '4.2.3'gem 'will_paginate', '3.0.pre2'gem 'reverse_captcha', '0.0.1'gem 'capistrano', '2.5.19'gem 'mysql', '2.8.1'
group :development do gem 'sqlite3-ruby', :require => 'sqlite3' gem "rspec", ">=2.0.0.beta.11" gem "rspec-rails", ">=2.0.0.beta.11" gem "ruby-debug"end
group :test do gem 'capybara' gem 'database_cleaner' gem 'steak', '>= 0.4.0.beta.1' gem 'factory_girl_rails'end
Gemfile
COMO ACHAR ?
DEPLOY
deploy.rbset :application, "producer"set :ip_address , "208.88.125.20"
# GIT SETTINGSset :scm, :gitset :repository, "[email protected]:danielvlopes/producer.git"set :branch, "master"set :deploy_via, :remote_cache
# SSH SETTINGSset :user , "rails"set :deploy_to, "/home/rails/#{application}"set :shared_directory, "#{deploy_to}/shared"set :use_sudo, falseset :group_writable, falsedefault_run_options[:pty] = true
# ROLESrole :app, ip_addressrole :web, ip_addressrole :db, ip_address, :primary => true
# HOOKSafter 'deploy:setup', 'db:setup'
after 'deploy:update_code' do db.symlink assets.symlinkend
TESTES
RSpec Steak
Cucumber Test::Unit
Minitest Bacon Should
Factory Girl Fabrication
Machinist Mocha RR
Feature: Authenticate In order to see my previous links As a user I want to be able to create an account
Scenario: Creating a new account Given I am not authenticated When I go to register And I fill in the following: | Email | [email protected] | | Password | 123456 | | Password confirmation | 123456 | And I press "Sign up" Then I should see "You have signed up successfully"
Cucumber
http://github.com/danielvlopes/buggy/blob/master/features/authenticate.feature
feature "Catalog", %q{ In order to display a catalog in devices As registered publisher I want to manage a catalog.} do
background do ensure_not_logged_in @owner = Factory :app, :name => "1Password" end
scenario "Create catalog for 1Password", :js => true do visit new_catalog_page_for(@owner)
select "shelf/metal", :from => "Theme" fill_in "Title", :with => "Appextras"
drag_to_catalog available_app click "Create Catalog"
should_have_notice "Catalog was successfully created." end
Steak
describe Guest do before do @room = Room.new("Room 35", Type::Master.new) @hosting = Hosting.new(@room, 5) @guest = Guest.new("Daniel Lopes", @hosting) end
it "should have a name" do assert_equal "Daniel Lopes", @guest.name end
describe "when print the invoice" do it "should have the guest name" do assert_match /Daniel Lopes/, @guest.invoice end
it "should have the room name" do assert_match /Room 35/, @guest.invoice end
it "should have the total amount" do assert_match /Valor total: 1000/, @guest.invoice end
it "should have the discount points earned with that hosting" do assert_match /Você ganhou 6 ponto\(s\)/, @guest.invoice end endend
Minispec
COMUNIDADE
guides.rubyonrails.org
peepcode.com
railscasts.com
akitaonrails.com
egenial.com.br/cursos
github.com
MITOS
Ruby é Lento
http://programmingzen.com/?s=benchmark
slideshare.net
Home 331 ms
Total 5.45 ms
http://railsmg.org/meetings/1
Rails NÃO ESCALA
Friendster foi escrito em Java e mudaram para PHP.
MySpace foi escrito em ColdFusion e mudaram ASP.NET.
Quando as pessoas caem em problemas de escalabilidade, normalmente acham que a linguagem é o problema, mas eu acho que isso raramente é a realidade.
http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter
“O The New York Times usou Ruby on Rails para agregar, analizar e mostrar os resultados das eleições em quase tempo
real em um de seus sites mais acessados de todos os tempos.”
http://www.computerworld.com.au/article/268003/ruby_rails_rolls_into_enterprise?fp=16&fpid=1
RAILS é a SALVAÇÃO
VAMOS SER AGILE
Recapitulando
entregue rápido
entregue pouco, mas sempre
mas com qualidade para manutenção
Rails e Ruby vão ajudar MUITO mas não fazem milagres
todas as start-ups que me procuram estão usando, eu quero descobrir qual é o “grande lance”.
o “grande lance” é que Rails é uma ferramentapara empreendedores.
MUITO OBRIGADO
CURSOS
egenial.com.br/cursorails
egenial.com.br/imersaorubyonrails
CONTATOS
blog.areacriacoes.com.br
twitter @danielvlopes