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

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

Nov 22, 2014

Download

Documents

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.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

#CNX14

Using Ruby for Reliability, Consistency, and Speed

Terence Lee, Ruby Task Force Lead@hone02

Page 2: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

@hone02

Page 3: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Page 4: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Austin, TX

Page 5: #CNX14 - Using Ruby for Reliability, Consistency, and Speed
Page 6: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Ruby Task Force

Page 7: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Ruby Task Forceruby-core

Page 8: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Ruby Task Forceruby-corebundler-core

Page 9: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Goals – Presentation Overview

1 2 3

History Ruby Everywhere Ecosystem

Page 10: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

#CNX14

History

Page 11: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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

Page 12: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Japan - 1993

Page 13: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

1995 - Ruby 0.95

Page 14: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

1995 - Ruby 0.951995 - Java 1.0

Page 15: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

1995 - Ruby 0.951995 - Java 1.01996 - Ruby 1.0

Page 16: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

1995 - Ruby 0.951995 - Java 1.01996 - Ruby 1.02000 - Programming Ruby Released2003 - Ruby 1.8

Page 17: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

1995 - Ruby 0.951995 - Java 1.01996 - Ruby 1.02000 - Programming Ruby Released2003 - Ruby 1.82007 - Ruby 1.9

Page 18: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

1995 - Ruby 0.951995 - Java 1.01996 - Ruby 1.02000 - Programming Ruby Released2003 - Ruby 1.82007 - Ruby 1.92011 - Ruby 1.9.3

Page 19: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

1995 - Ruby 0.951995 - Java 1.01996 - Ruby 1.02000 - Programming Ruby Released2003 - Ruby 1.82007 - Ruby 1.92011 - Ruby 1.9.32/2013 - Ruby 2.0.012/2013 - Ruby 2.1.0

Page 20: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

1995 - Ruby 0.951995 - Java 1.01996 - Ruby 1.02000 - Programming Ruby Released2003 - Ruby 1.82007 - Ruby 1.92011 - Ruby 1.9.32/2013 - Ruby 2.0.012/2013 - Ruby 2.1.012/2014 - Ruby 2.2.0

Page 21: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

#CNX14

Design

Page 22: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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

Page 23: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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

Page 24: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

puts 'Hello World!'

Hello World!

Page 25: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

puts 'Hello World!'

Hello World!

(1..5).each {|i| puts i }

1

2

3

4

5

Page 26: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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

Page 27: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

#CNX14

Ruby Everywhere

Page 28: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Companies Using RubyAmazonGood ReadsHuluCookpadBloombergNew York TimesBasecampRed Hat

Page 29: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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;}

Page 30: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

RubyMotion

Command line based tooling for iOS, Mac, and Android.

BasecampFrontbackJukelyBandcamp

Page 31: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14PLACEHOLDER SCREEN

Page 32: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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)

Page 33: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

JRuby + Truffle Benchmarks

PLACEHOLDER SCREEN

Page 34: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

#CNX14

Ecosystem

Page 35: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

RubyGems

$ gem install bundler

3,692,537,013 downloads88,959 gems cut since July 2009

Page 36: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Page 37: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Page 38: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Bundler

# Gemfile

source "https://rubygems.org"

gem 'rspec', ‘~> 3.0.0’

Page 39: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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!

Page 40: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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

Page 41: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Bundler

# Gemfileruby '2.1.2'

gem 'rack'

$ bundle installYour Ruby version is 1.9.3, but your Gemfile specified 2.1.2

Page 42: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

#CNX14

Build Web Apps

Page 43: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Rack

# Gemfile

gem 'rack'

# config.ru

run Proc.new {|env|

['200',

{'Content-Type' => 'text/html'},

['Hello World!']]

}

$ bundle exec rackup

Page 44: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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!

Page 45: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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

...

Page 46: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Ruby on Rails

app/controllers/

app/helpers/

app/models/

app/mailers/

app/views/

Page 47: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

ActiveRecord

class Article < ActiveRecord::Base

validates_presence_of :url

before_create :summarize

def summarize

...

end

end

Page 48: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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

Page 49: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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

Page 50: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Ruby on Rails

config/

config/environments/

db/

db/migrate/

public/

vendor/

Page 51: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Ruby on Rails

app/assets/

app/assets/images/

app/assets/javascripts/

app/assets/stylesheets/

$ bin/rake assets:precompile

image-

908e25f4bf641868d8683022a5b62f54.jpg

Page 52: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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'

Page 53: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

#CNX14

Background Queuing

Page 54: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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

Page 55: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Sidekiq

# queue job

Job.perform_async("/api/v1/foo", "heroku.com")

$ bundle exec sidekiq -r ./job.rb -c 10

Page 56: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Sidekiq

# queue job

Job.perform_async("/api/v1/foo", "heroku.com")

$ bundle exec sidekiq -r ./job.rb -c 20

Page 57: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Screenshot description here.Container resizes as needed

PLACEHOLDER SCREEN

Page 58: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

#CNX14

Web Servers

Page 59: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Puma

# Gemfile

gem 'puma'

$ bundle exec puma

Page 60: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Puma

# Gemfile

gem 'puma'

$ bundle exec puma -t 8:32 -w 3

Page 61: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

#CNX14

Testing

Page 62: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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

Page 63: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

rspec-mocks

book = double("book", :pages => 250)

Page 64: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

rspec-mocks

book = double("book", :pages => 250)

allow(book).to receive(:title) { "The RSpec Book" }

Page 65: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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

Page 66: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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

Page 67: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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

Page 68: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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

Page 69: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

#CNX14

Frontend Development

Page 70: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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/

Page 71: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

#CNX14

Security

Page 72: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Screenshot description here.Container resizes as needed

PLACEHOLDER SCREEN

Page 73: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

#CNX14

Miscellaneous

Page 74: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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

Page 75: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

#CNX14

Future

Page 76: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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

Page 77: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Ruby 3.0

• Concurrency

• JIT compiler

• Static Typing

Page 78: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

#CNX14

Wrapup

Page 79: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Ruby is not young. It may not even be hip, but it has a rich 20 year history.

Page 80: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

There are many implementations of Ruby that can fit all shapes, sizes, and purposes.

Page 81: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

There's a vibrant ecosystem of libraries, tools, and practices surrounding Ruby.

Page 82: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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

Page 83: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Track: Developers

#CNX14

Questions?

Page 84: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

One more thing...

Page 85: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Friday Hug!

Page 86: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

Track: Developers

#CNX14

Page 87: #CNX14 - Using Ruby for Reliability, Consistency, and Speed

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