Slide 1

Slide 1 text

Track: Developers #CNX14 #CNX14 Using Ruby for Reliability, Consistency, and Speed Terence Lee, Ruby Task Force Lead @hone02

Slide 2

Slide 2 text

Track: Developers #CNX14 @hone02

Slide 3

Slide 3 text

Track: Developers #CNX14

Slide 4

Slide 4 text

Track: Developers #CNX14 Austin, TX

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

Track: Developers #CNX14 Ruby Task Force

Slide 7

Slide 7 text

Track: Developers #CNX14 Ruby Task Force ruby-core

Slide 8

Slide 8 text

Track: Developers #CNX14 Ruby Task Force ruby-core bundler-core

Slide 9

Slide 9 text

Track: Developers #CNX14 Goals – Presentation Overview 1 2 3 History Ruby Everywhere Ecosystem

Slide 10

Slide 10 text

Track: Developers #CNX14 #CNX14 History

Slide 11

Slide 11 text

Track: Developers #CNX14 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”, まつもとゆきひろ

Slide 12

Slide 12 text

Track: Developers #CNX14 Japan - 1993

Slide 13

Slide 13 text

Track: Developers #CNX14 1995 - Ruby 0.95

Slide 14

Slide 14 text

Track: Developers #CNX14 1995 - Ruby 0.95 1995 - Java 1.0

Slide 15

Slide 15 text

Track: Developers #CNX14 1995 - Ruby 0.95 1995 - Java 1.0 1996 - Ruby 1.0

Slide 16

Slide 16 text

Track: Developers #CNX14 1995 - Ruby 0.95 1995 - Java 1.0 1996 - Ruby 1.0 2000 - Programming Ruby Released 2003 - Ruby 1.8

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

Track: Developers #CNX14 #CNX14 Design

Slide 22

Slide 22 text

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."

Slide 23

Slide 23 text

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”, まつもとゆきひろ

Slide 24

Slide 24 text

Track: Developers #CNX14 puts 'Hello World!' Hello World!

Slide 25

Slide 25 text

Track: Developers #CNX14 puts 'Hello World!' Hello World! (1..5).each {|i| puts i } 1 2 3 4 5

Slide 26

Slide 26 text

Track: Developers #CNX14 COLORS = { black: "000", blue: "00f", white: "fff" } class String COLORS.each do |color,code| define_method "in_#{color}" do "#{self}" end end end puts "Hello World".in_blue "Hello, World!"

Slide 27

Slide 27 text

Track: Developers #CNX14 #CNX14 Ruby Everywhere

Slide 28

Slide 28 text

Track: Developers #CNX14 Companies Using Ruby Amazon Good Reads Hulu Cookpad Bloomberg New York Times Basecamp Red Hat

Slide 29

Slide 29 text

Track: Developers #CNX14 mruby #include #include #include 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; }

Slide 30

Slide 30 text

Track: Developers #CNX14 RubyMotion Command line based tooling for iOS, Mac, and Android. Basecamp Frontback Jukely Bandcamp

Slide 31

Slide 31 text

Track: Developers #CNX14 PLACEHOLDER SCREEN

Slide 32

Slide 32 text

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)

Slide 33

Slide 33 text

Track: Developers #CNX14 JRuby + Truffle Benchmarks PLACEHOLDER SCREEN

Slide 34

Slide 34 text

Track: Developers #CNX14 #CNX14 Ecosystem

Slide 35

Slide 35 text

Track: Developers #CNX14 RubyGems $ gem install bundler 3,692,537,013 downloads 88,959 gems cut since July 2009

Slide 36

Slide 36 text

Track: Developers #CNX14

Slide 37

Slide 37 text

Track: Developers #CNX14

Slide 38

Slide 38 text

Track: Developers #CNX14 Bundler # Gemfile source "https://rubygems.org" gem 'rspec', ‘~> 3.0.0’

Slide 39

Slide 39 text

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!

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

Track: Developers #CNX14 #CNX14 Build Web Apps

Slide 43

Slide 43 text

Track: Developers #CNX14 Rack # Gemfile gem 'rack' # config.ru run Proc.new {|env| ['200', {'Content-Type' => 'text/html'}, ['Hello World!']] } $ bundle exec rackup

Slide 44

Slide 44 text

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!

Slide 45

Slide 45 text

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 ...

Slide 46

Slide 46 text

Track: Developers #CNX14 Ruby on Rails app/controllers/ app/helpers/ app/models/ app/mailers/ app/views/

Slide 47

Slide 47 text

Track: Developers #CNX14 ActiveRecord class Article < ActiveRecord::Base validates_presence_of :url before_create :summarize def summarize ... end end

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

Track: Developers #CNX14 Ruby on Rails config/ config/environments/ db/ db/migrate/ public/ vendor/

Slide 51

Slide 51 text

Track: Developers #CNX14 Ruby on Rails app/assets/ app/assets/images/ app/assets/javascripts/ app/assets/stylesheets/ $ bin/rake assets:precompile image- 908e25f4bf641868d8683022a5b62f54.jpg

Slide 52

Slide 52 text

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'

Slide 53

Slide 53 text

Track: Developers #CNX14 #CNX14 Background Queuing

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

Track: Developers #CNX14 Sidekiq # queue job Job.perform_async("/api/v1/foo", "heroku.com") $ bundle exec sidekiq -r ./job.rb -c 10

Slide 56

Slide 56 text

Track: Developers #CNX14 Sidekiq # queue job Job.perform_async("/api/v1/foo", "heroku.com") $ bundle exec sidekiq -r ./job.rb -c 20

Slide 57

Slide 57 text

Track: Developers #CNX14 Screenshot description here. Container resizes as needed PLACEHOLDER SCREEN

Slide 58

Slide 58 text

Track: Developers #CNX14 #CNX14 Web Servers

Slide 59

Slide 59 text

Track: Developers #CNX14 Puma # Gemfile gem 'puma' $ bundle exec puma

Slide 60

Slide 60 text

Track: Developers #CNX14 Puma # Gemfile gem 'puma' $ bundle exec puma -t 8:32 -w 3

Slide 61

Slide 61 text

Track: Developers #CNX14 #CNX14 Testing

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

Track: Developers #CNX14 rspec-mocks book = double("book", :pages => 250)

Slide 64

Slide 64 text

Track: Developers #CNX14 rspec-mocks book = double("book", :pages => 250) allow(book).to receive(:title) { "The RSpec Book" }

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

Track: Developers #CNX14 #CNX14 Frontend Development

Slide 70

Slide 70 text

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/

Slide 71

Slide 71 text

Track: Developers #CNX14 #CNX14 Security

Slide 72

Slide 72 text

Track: Developers #CNX14 Screenshot description here. Container resizes as needed PLACEHOLDER SCREEN

Slide 73

Slide 73 text

Track: Developers #CNX14 #CNX14 Miscellaneous

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

Track: Developers #CNX14 #CNX14 Future

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

Track: Developers #CNX14 Ruby 3.0 • Concurrency • JIT compiler • Static Typing

Slide 78

Slide 78 text

Track: Developers #CNX14 #CNX14 Wrapup

Slide 79

Slide 79 text

Track: Developers #CNX14 Ruby is not young. It may not even be hip, but it has a rich 20 year history.

Slide 80

Slide 80 text

Track: Developers #CNX14 There are many implementations of Ruby that can fit all shapes, sizes, and purposes.

Slide 81

Slide 81 text

Track: Developers #CNX14 There's a vibrant ecosystem of libraries, tools, and practices surrounding Ruby.

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

Track: Developers #CNX14 Track: Developers #CNX14 Questions?

Slide 84

Slide 84 text

Track: Developers #CNX14 One more thing...

Slide 85

Slide 85 text

Track: Developers #CNX14 Friday Hug!

Slide 86

Slide 86 text

Track: Developers #CNX14

Slide 87

Slide 87 text

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