Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Filosofia Ruby e Rails

Filosofia Ruby e Rails

Apresentação de introdução ao Ruby e Rails feita na InforUSO 2010 BH, UFOP e SERPRO - MG.

danielvlopes

June 04, 2010
Tweet

More Decks by danielvlopes

Other Decks in Programming

Transcript

  1. ... um aclamado instrutor aplicando um curso descobriu que um

    de seus pupilos era um venture capitalist.
  2. Quando questionado sobre o motivo de estar em uma turma

    de “Ruby on Rails” ... , ele respondeu simplesmente:
  3. Mark Gardner http://bit.ly/railsecosystem todas as start-ups que me procuram estão

    usando, eu quero descobrir qual é o “grande lance”.
  4. Matz Ruby World Keynote http://bit.ly/bH4hA2 Investidores estão pressionando startups para

    usarem Ruby. "É mais rápido, então se você pode encurtar a entrega em um mês, porque não usar Ruby?"
  5. Matz Ruby World Keynote http://bit.ly/bH4hA2 Investidores estão pressionando startups para

    usarem Ruby. "É mais rápido, então se você pode encurtar a entrega em um mês, porque não usar Ruby?" Mais de 60% dos VCs usam Ruby para criar seus sistemas
  6. “Se você terminar seu trabalho rápido e de forma divertida,

    isso não é bom?” Matz http://www.artima.com/intv/ruby3.html
  7. • 100% orientada a objetos • Linguagem dinâmica • Esperados

    4 milhões até 2013 • FREE e Open Source • As vezes chamada de “scripting” language
  8. Eu inventei o termo “Orientação a Objetos” e posso dizer

    que não era C++ que eu tinha em mente.
  9. “Eu sempre soube que Smalltalk substituiria Java. Só não sabia

    que isso se chamaria Ruby.” Kent Beck, Criador do "Extreme Programming" e "TDD"
  10. DHH

  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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 end end model
  18. <%= 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
  19. 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 @category end def update end def destroy end end controller
  20. 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
  21. 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 mais importante, facilitou a dificuldade que tinham em manutenção.
  22. A conversão resultou em 20 mil linhas de Ruby em

    vez de 125 mil linhas de Java mais importante, facilitou a dificuldade que tinham em manutenção. Eles finalizaram a reescrita do sistema em apenas 3 meses com 4 desenvolvedores.
  23. mais importante, facilitou a dificuldade que tinham em manutenção. Eles

    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
  24. Repositórios Github e Codebase Integração Contínua Hudson, Cruise, CI Joe

    Deploy Chef, Puppet, Capistrano Monitoramento NewRelic, Scout, BackupMyApp
  25. Repositórios Github e Codebase Integração Contínua Hudson, Cruise, CI Joe

    Deploy Chef, Puppet, Capistrano Monitoramento NewRelic, Scout, BackupMyApp
  26. Repositórios Github e Codebase Integração Contínua Hudson, Cruise, CI Joe

    Deploy Chef, Puppet, Capistrano Monitoramento NewRelic, Scout, BackupMyApp
  27. Repositórios Github e Codebase Integração Contínua Hudson, Cruise, CI Joe

    Deploy Chef, Puppet, Capistrano Monitoramento NewRelic, Scout, BackupMyApp
  28. 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
  29. deploy.rb set :application, "producer" set :ip_address , "208.88.125.20" # GIT

    SETTINGS set :scm, :git set :repository, "[email protected]:danielvlopes/producer.git" set :branch, "master" set :deploy_via, :remote_cache # SSH SETTINGS set :user , "rails" set :deploy_to, "/home/rails/#{application}" set :shared_directory, "#{deploy_to}/shared" set :use_sudo, false set :group_writable, false default_run_options[:pty] = true # ROLES role :app, ip_address role :web, ip_address role :db, ip_address, :primary => true # HOOKS after 'deploy:setup', 'db:setup' after 'deploy:update_code' do db.symlink assets.symlink end
  30. 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
  31. 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
  32. 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 end end Minispec
  33. 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
  34. “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