Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

#CNX14 - Using Ruby for Reliability, Consistency, and Speed

4,859 views

Published on

Ruby is just over 20 years old. It's no longer young or hip, and that’s a good thing! In the last decade, Ruby has matured as a web technology. It's being used in many successful companies out there such as Hulu, GitHub, and Bloomberg. The ecosystem is comprised of many stable libraries and tools to handle most common web tasks, allowing you to focus on adding features to improve your product and better serve your customers. We'll talk about how you can build scalable and reliable software, but still maintain fast development turnaround by leveraging the maturity and creativity of the Ruby community.

  • Be the first to comment

  • Be the first to like this

#CNX14 - Using Ruby for Reliability, Consistency, and Speed

  1. 1. Track: Developers #CNX14 #CNX14 Using Ruby for Reliability, Consistency, and Speed Terence Lee, Ruby Task Force Lead @hone02
  2. 2. Track: Developers #CNX14 @hone02
  3. 3. Track: Developers #CNX14
  4. 4. Track: Developers #CNX14 Austin, TX
  5. 5. Track: Developers #CNX14 Ruby Task Force
  6. 6. Track: Developers #CNX14 Ruby Task Force ruby-core
  7. 7. Track: Developers #CNX14 Ruby Task Force ruby-core bundler-core
  8. 8. Track: Developers #CNX14 Goals – Presentation Overview 1 2 3 History Ruby Everywhere Ecosystem
  9. 9. Track: Developers #CNX14 #CNX14 History
  10. 10. Track: Developers #CNX14 “I believe that the purpose of life is, at least in part, to be happy. Based on this belief, Ruby is designed to make programming not only easy but also fun. It allows you to concentrate on the creative side of programming, with less stress.” - Yukihiro Matsumoto, “Matz”, まつもとゆきひろ
  11. 11. Track: Developers #CNX14 Japan - 1993
  12. 12. Track: Developers #CNX14 1995 - Ruby 0.95
  13. 13. Track: Developers #CNX14 1995 - Ruby 0.95 1995 - Java 1.0
  14. 14. Track: Developers #CNX14 1995 - Ruby 0.95 1995 - Java 1.0 1996 - Ruby 1.0
  15. 15. Track: Developers #CNX14 1995 - Ruby 0.95 1995 - Java 1.0 1996 - Ruby 1.0 2000 - Programming Ruby Released 2003 - Ruby 1.8
  16. 16. Track: Developers #CNX14 1995 - Ruby 0.95 1995 - Java 1.0 1996 - Ruby 1.0 2000 - Programming Ruby Released 2003 - Ruby 1.8 2007 - Ruby 1.9
  17. 17. Track: Developers #CNX14 1995 - Ruby 0.95 1995 - Java 1.0 1996 - Ruby 1.0 2000 - Programming Ruby Released 2003 - Ruby 1.8 2007 - Ruby 1.9 2011 - Ruby 1.9.3
  18. 18. Track: Developers #CNX14 1995 - Ruby 0.95 1995 - Java 1.0 1996 - Ruby 1.0 2000 - Programming Ruby Released 2003 - Ruby 1.8 2007 - Ruby 1.9 2011 - Ruby 1.9.3 2/2013 - Ruby 2.0.0 12/2013 - Ruby 2.1.0
  19. 19. Track: Developers #CNX14 1995 - Ruby 0.95 1995 - Java 1.0 1996 - Ruby 1.0 2000 - Programming Ruby Released 2003 - Ruby 1.8 2007 - Ruby 1.9 2011 - Ruby 1.9.3 2/2013 - Ruby 2.0.0 12/2013 - Ruby 2.1.0 12/2014 - Ruby 2.2.0
  20. 20. Track: Developers #CNX14 #CNX14 Design
  21. 21. Track: Developers #CNX14 Fuji is the new Leica "Fuji is the new Leica. It's true! Fuji is making the world's best cameras, in every way, especially when it comes to functional design considerations. They are the only company that putting a priority on Human-Centered Design that isn't also charging $7,000 for their cameras."
  22. 22. Track: Developers #CNX14 "Often people, especially computer engineers, focus on the machines. But in fact we need to focus on humans, on how humans care about doing programming or operating the application of the machines." - Yukihiro Matsumoto, “Matz”, まつもとゆきひろ
  23. 23. Track: Developers #CNX14 puts 'Hello World!' Hello World!
  24. 24. Track: Developers #CNX14 puts 'Hello World!' Hello World! (1..5).each {|i| puts i } 1 2 3 4 5
  25. 25. Track: Developers #CNX14 COLORS = { black: "000", blue: "00f", white: "fff" } class String COLORS.each do |color,code| define_method "in_#{color}" do "<span style="color: ##{code}">#{self}</span>" end end end puts "Hello World".in_blue "<span style="color: #00f">Hello, World!</span>"
  26. 26. Track: Developers #CNX14 #CNX14 Ruby Everywhere
  27. 27. Track: Developers #CNX14 Companies Using Ruby Amazon Good Reads Hulu Cookpad Bloomberg New York Times Basecamp Red Hat
  28. 28. Track: Developers #CNX14 mruby #include <stdio.h> #include <mruby.h> #include <mruby/compile.h> int main(void) { mrb_state *mrb = mrb_open(); char code[] = "5.times { puts 'mruby is awesome!' }"; printf("Executing Ruby code with mruby:n"); mrb_load_string(mrb, code); mrb_close(mrb); return 0; }
  29. 29. Track: Developers #CNX14 RubyMotion Command line based tooling for iOS, Mac, and Android. Basecamp Frontback Jukely Bandcamp
  30. 30. Track: Developers #CNX14 PLACEHOLDER SCREEN
  31. 31. Track: Developers #CNX14 JRuby $ jruby -S jirb_swing require 'java' frame = javax.swing.JFrame.new("Window") label = javax.swing.JLabel.new("Hello") frame.add(label) frame.setDefaultCloseOperation(javax.swing.JFrame::EXIT_ON_CLOSE) frame.pack frame.setVisible(true)
  32. 32. Track: Developers #CNX14 JRuby + Truffle Benchmarks PLACEHOLDER SCREEN
  33. 33. Track: Developers #CNX14 #CNX14 Ecosystem
  34. 34. Track: Developers #CNX14 RubyGems $ gem install bundler 3,692,537,013 downloads 88,959 gems cut since July 2009
  35. 35. Track: Developers #CNX14
  36. 36. Track: Developers #CNX14
  37. 37. Track: Developers #CNX14 Bundler # Gemfile source "https://rubygems.org" gem 'rspec', ‘~> 3.0.0’
  38. 38. Track: Developers #CNX14 Bundler $ bundle install Fetching gem metadata from https: //rubygems.org/......... Resolving dependencies... Using bundler 1.6.2 Installing rspec-support 3.1.0 Installing diff-lcs 1.2.5 Installing rspec-mocks 3.1.1 Installing rspec-expectations 3.1.1 Installing rspec-core 3.1.4 Installing rspec 3.1.0 Your bundle is complete!
  39. 39. Track: Developers #CNX14 Bundler # Gemfile.lock GEM remote: https://rubygems.org/ specs: diff-lcs (1.2.5) rspec (3.1.0) rspec-core (~> 3.1.0) rspec-expectations (~> 3.1.0) rspec-mocks (~> 3.1.0) rspec-core (3.1.4) rspec-support (~> 3.1.0) rspec-expectations (3.1.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.1.0) rspec-mocks (3.1.1) rspec-support (~> 3.1.0) rspec-support (3.1.0) PLATFORMS ruby DEPENDENCIES rspec
  40. 40. Track: Developers #CNX14 Bundler # Gemfile ruby '2.1.2' gem 'rack' $ bundle install Your Ruby version is 1.9.3, but your Gemfile specified 2.1.2
  41. 41. Track: Developers #CNX14 #CNX14 Build Web Apps
  42. 42. Track: Developers #CNX14 Rack # Gemfile gem 'rack' # config.ru run Proc.new {|env| ['200', {'Content-Type' => 'text/html'}, ['Hello World!']] } $ bundle exec rackup
  43. 43. Track: Developers #CNX14 Sinatra require 'sinatra' get '/hi' do "Hello World!" end $ gem install sinatra $ ruby hi.rb == Sinatra has taken the stage ... >> Listening on 0.0.0.0:4567 $ curl http://localhost:4567 Hello World!
  44. 44. Track: Developers #CNX14 Ruby on Rails $ gem install rails $ rails new hi create create README.rdoc create Rakefile create config.ru create .gitignore create Gemfile create app ...
  45. 45. Track: Developers #CNX14 Ruby on Rails app/controllers/ app/helpers/ app/models/ app/mailers/ app/views/
  46. 46. Track: Developers #CNX14 ActiveRecord class Article < ActiveRecord::Base validates_presence_of :url before_create :summarize def summarize ... end end
  47. 47. Track: Developers #CNX14 ActionController class ArticlesController < ApplicationController def index @articles = Article.all @article = Article.new end def show respond_to do |format| format.html { render :file => "#{Rails.root}/public/404.html", :status => 404 } format.json { render :show } end
  48. 48. Track: Developers #CNX14 Generators $ bin/rails generate scaffold $ bin/rails generate controller $ bin/rails generate model $ bin/rails generate migration $ bin/rails generate helper $ bin/rails generate mailer
  49. 49. Track: Developers #CNX14 Ruby on Rails config/ config/environments/ db/ db/migrate/ public/ vendor/
  50. 50. Track: Developers #CNX14 Ruby on Rails app/assets/ app/assets/images/ app/assets/javascripts/ app/assets/stylesheets/ $ bin/rake assets:precompile image- 908e25f4bf641868d8683022a5b62f54.jpg
  51. 51. Track: Developers #CNX14 Content Delivery Network (CDN) $ heroku addons:add fastly # config/environments/production.rb config.action_controller.asset_host = ENV['FASTLY_CDN_URL'] config.static_cache_control = 'public, s-maxage=2592000, maxage=86400'
  52. 52. Track: Developers #CNX14 #CNX14 Background Queuing
  53. 53. Track: Developers #CNX14 Sidekiq # Gemfile gem 'sidekiq' # job.rb class Job include Sidekiq::Worker def perform(path, host, port = 80) http = Net::HTTP.new(host, port) http.request(Net::HTTP::Get.new(path) end end
  54. 54. Track: Developers #CNX14 Sidekiq # queue job Job.perform_async("/api/v1/foo", "heroku.com") $ bundle exec sidekiq -r ./job.rb -c 10
  55. 55. Track: Developers #CNX14 Sidekiq # queue job Job.perform_async("/api/v1/foo", "heroku.com") $ bundle exec sidekiq -r ./job.rb -c 20
  56. 56. Track: Developers #CNX14 Screenshot description here. Container resizes as needed PLACEHOLDER SCREEN
  57. 57. Track: Developers #CNX14 #CNX14 Web Servers
  58. 58. Track: Developers #CNX14 Puma # Gemfile gem 'puma' $ bundle exec puma
  59. 59. Track: Developers #CNX14 Puma # Gemfile gem 'puma' $ bundle exec puma -t 8:32 -w 3
  60. 60. Track: Developers #CNX14 #CNX14 Testing
  61. 61. Track: Developers #CNX14 RSpec # Gemfile gem 'rspec' # my_class_spec.rb describe MyClass do before { ... } let(:foo) { MyClass.new } it 'accesses the example' do expect(foo.bar).to eq("bar") end end
  62. 62. Track: Developers #CNX14 rspec-mocks book = double("book", :pages => 250)
  63. 63. Track: Developers #CNX14 rspec-mocks book = double("book", :pages => 250) allow(book).to receive(:title) { "The RSpec Book" }
  64. 64. Track: Developers #CNX14 rspec-mocks book = double("book", :pages => 250) allow(book).to receive(:title) { "The RSpec Book" } it "calculates the read time" do book = double("book") expect(book).to receive(:read_time) { 12.4 } user.reads(book) end
  65. 65. Track: Developers #CNX14 Artifice # Gemfile gem 'artifice' # test file class MockEndpoint < Sinatra::Base get "/endpoint" do "foo bar" end end Artifice.activate_with(MockEndpoint) do # make some requests using Net::HTTP end
  66. 66. Track: Developers #CNX14 rspec-rails RSpec.describe User, :type => :model do it "orders by last name" do lindeman = User.create!(first_name: "Andy", last_name: "Lindeman") chelimsky = User.create!(first_name: "David", last_name: "Chelimsky") expect(User.ordered_by_last_name).to eq([chelimsky, lindeman]) end end
  67. 67. Track: Developers #CNX14 rspec-rails RSpec.describe PostsController, :type => :controller do describe "GET #index" do it "responds successfully with an HTTP 200 status code" do get :index expect(response).to be_success expect(response).to have_http_status(200) end end end
  68. 68. Track: Developers #CNX14 #CNX14 Frontend Development
  69. 69. Track: Developers #CNX14 ember.js # Gemfile gem 'ember-rails' $ bin/rails generate ember:bootstrap in app/assets/javascripts/: controllers/ helpers/ components/ models/ routes/ templates/components views/
  70. 70. Track: Developers #CNX14 #CNX14 Security
  71. 71. Track: Developers #CNX14 Screenshot description here. Container resizes as needed PLACEHOLDER SCREEN
  72. 72. Track: Developers #CNX14 #CNX14 Miscellaneous
  73. 73. Track: Developers #CNX14 require 'pismo' require 'sentimental' require 'ots' require 'tokenizer' class Article def summarize doc = Pismo::Document.new(self.url) sent = Sentimental.new tokenizer = Tokenizer::Tokenizer.new tokens = tokenizer.tokenize(doc.body) poly_syl = tokens.select {|word| Lingua::EN::Syllable.syllables(word) >= 3 }.size self.title = doc.title self.image = doc.images.blank? ? nil : doc.images.first self.topics = OTS.parse(doc.body).topics self.sentiment = sent.get_sentiment(doc.body) self.words = tokens.size self.difficulty = smog(poly_syl, doc.sentences.size || 1) / 12 wpm = (200 - 100 * self.difficulty) || 1 self.minutes = (self.words / wpm.to_f).ceil end end
  74. 74. Track: Developers #CNX14 #CNX14 Future
  75. 75. Track: Developers #CNX14 the metal m/ • separate middleware • API for request/response objects • request has read I/O for post body • response has write I/O for output
  76. 76. Track: Developers #CNX14 Ruby 3.0 • Concurrency • JIT compiler • Static Typing
  77. 77. Track: Developers #CNX14 #CNX14 Wrapup
  78. 78. Track: Developers #CNX14 Ruby is not young. It may not even be hip, but it has a rich 20 year history.
  79. 79. Track: Developers #CNX14 There are many implementations of Ruby that can fit all shapes, sizes, and purposes.
  80. 80. Track: Developers #CNX14 There's a vibrant ecosystem of libraries, tools, and practices surrounding Ruby.
  81. 81. Track: Developers #CNX14 Ruby has a rich history. There's a Ruby for all kinds of shapes and sizes. There's a vibrant ecosystem of libraries, tools, and practices surrounding Ruby. Recap Slide 1 2 3
  82. 82. Track: Developers #CNX14 Questions?
  83. 83. Track: Developers #CNX14 One more thing...
  84. 84. Track: Developers #CNX14 Friday Hug!
  85. 85. Track: Developers #CNX14
  86. 86. Track: Developers #CNX14 CUSTOMER JOURNEY SHOWCASE MARKETING THOUGHT LEADERS EMAIL MARKETING PRODUCT STRATEGY & ROADMAP PERSONAL TRANSFORMATION & GROWTH SOCIAL MARKETING MOBILE & WEB MARKETING DEVELOPERS HANDS-ON TRAINING INDUSTRY TRENDSETTERS CREATIVITY & INNOVATION SALESFORCE FOR MARKETERS ROUNDTABLES

×