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

Post on 22-Nov-2014

334 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

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.

Transcript

Track: Developers

#CNX14

#CNX14

Using Ruby for Reliability, Consistency, and Speed

Terence Lee, Ruby Task Force Lead@hone02

Track: Developers

#CNX14

@hone02

Track: Developers

#CNX14

Track: Developers

#CNX14

Austin, TX

Track: Developers

#CNX14

Ruby Task Force

Track: Developers

#CNX14

Ruby Task Forceruby-core

Track: Developers

#CNX14

Ruby Task Forceruby-corebundler-core

Track: Developers

#CNX14

Goals – Presentation Overview

1 2 3

History Ruby Everywhere Ecosystem

Track: Developers

#CNX14

#CNX14

History

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

Track: Developers

#CNX14

Japan - 1993

Track: Developers

#CNX14

1995 - Ruby 0.95

Track: Developers

#CNX14

1995 - Ruby 0.951995 - Java 1.0

Track: Developers

#CNX14

1995 - Ruby 0.951995 - Java 1.01996 - Ruby 1.0

Track: Developers

#CNX14

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

Track: Developers

#CNX14

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

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

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

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

Track: Developers

#CNX14

#CNX14

Design

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

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

Track: Developers

#CNX14

puts 'Hello World!'

Hello World!

Track: Developers

#CNX14

puts 'Hello World!'

Hello World!

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

1

2

3

4

5

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

Track: Developers

#CNX14

#CNX14

Ruby Everywhere

Track: Developers

#CNX14

Companies Using RubyAmazonGood ReadsHuluCookpadBloombergNew York TimesBasecampRed Hat

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

Track: Developers

#CNX14

RubyMotion

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

BasecampFrontbackJukelyBandcamp

Track: Developers

#CNX14PLACEHOLDER SCREEN

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)

Track: Developers

#CNX14

JRuby + Truffle Benchmarks

PLACEHOLDER SCREEN

Track: Developers

#CNX14

#CNX14

Ecosystem

Track: Developers

#CNX14

RubyGems

$ gem install bundler

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

Track: Developers

#CNX14

Track: Developers

#CNX14

Track: Developers

#CNX14

Bundler

# Gemfile

source "https://rubygems.org"

gem 'rspec', ‘~> 3.0.0’

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!

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

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

Track: Developers

#CNX14

#CNX14

Build Web Apps

Track: Developers

#CNX14

Rack

# Gemfile

gem 'rack'

# config.ru

run Proc.new {|env|

['200',

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

['Hello World!']]

}

$ bundle exec rackup

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!

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

...

Track: Developers

#CNX14

Ruby on Rails

app/controllers/

app/helpers/

app/models/

app/mailers/

app/views/

Track: Developers

#CNX14

ActiveRecord

class Article < ActiveRecord::Base

validates_presence_of :url

before_create :summarize

def summarize

...

end

end

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

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

Track: Developers

#CNX14

Ruby on Rails

config/

config/environments/

db/

db/migrate/

public/

vendor/

Track: Developers

#CNX14

Ruby on Rails

app/assets/

app/assets/images/

app/assets/javascripts/

app/assets/stylesheets/

$ bin/rake assets:precompile

image-

908e25f4bf641868d8683022a5b62f54.jpg

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'

Track: Developers

#CNX14

#CNX14

Background Queuing

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

Track: Developers

#CNX14

Sidekiq

# queue job

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

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

Track: Developers

#CNX14

Sidekiq

# queue job

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

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

Track: Developers

#CNX14

Screenshot description here.Container resizes as needed

PLACEHOLDER SCREEN

Track: Developers

#CNX14

#CNX14

Web Servers

Track: Developers

#CNX14

Puma

# Gemfile

gem 'puma'

$ bundle exec puma

Track: Developers

#CNX14

Puma

# Gemfile

gem 'puma'

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

Track: Developers

#CNX14

#CNX14

Testing

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

Track: Developers

#CNX14

rspec-mocks

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

Track: Developers

#CNX14

rspec-mocks

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

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

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

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

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

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

Track: Developers

#CNX14

#CNX14

Frontend Development

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/

Track: Developers

#CNX14

#CNX14

Security

Track: Developers

#CNX14

Screenshot description here.Container resizes as needed

PLACEHOLDER SCREEN

Track: Developers

#CNX14

#CNX14

Miscellaneous

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

Track: Developers

#CNX14

#CNX14

Future

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

Track: Developers

#CNX14

Ruby 3.0

• Concurrency

• JIT compiler

• Static Typing

Track: Developers

#CNX14

#CNX14

Wrapup

Track: Developers

#CNX14

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

Track: Developers

#CNX14

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

Track: Developers

#CNX14

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

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

Track: Developers

#CNX14

Track: Developers

#CNX14

Questions?

Track: Developers

#CNX14

One more thing...

Track: Developers

#CNX14

Friday Hug!

Track: Developers

#CNX14

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

top related