SlideShare a Scribd company logo
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
#CNX14 - Using Ruby for Reliability, Consistency, and Speed
Track: Developers 
#CNX14 
Ruby Task Force
Track: Developers 
#CNX14 
Ruby Task Force 
ruby-core
Track: Developers 
#CNX14 
Ruby Task Force 
ruby-core 
bundler-core
Track: Developers 
#CNX14 
Goals – Presentation Overview 
1 2 3 
History Ruby Everywhere Ecosystem
Track: Developers 
#CNX14 
#CNX14 
History
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.95 
1995 - Java 1.0
Track: Developers 
#CNX14 
1995 - Ruby 0.95 
1995 - Java 1.0 
1996 - Ruby 1.0
Track: Developers 
#CNX14 
1995 - Ruby 0.95 
1995 - Java 1.0 
1996 - Ruby 1.0 
2000 - Programming Ruby Released 
2003 - Ruby 1.8
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
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
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
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
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 Ruby 
Amazon 
Good Reads 
Hulu 
Cookpad 
Bloomberg 
New York Times 
Basecamp 
Red 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. 
Basecamp 
Frontback 
Jukely 
Bandcamp
Track: Developers 
#CNX14 
PLACEHOLDER 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 downloads 
88,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 
# Gemfile 
ruby '2.1.2' 
gem 'rack' 
$ bundle install 
Your 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 
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

More Related Content

PPTX
#CNX14 - Building Killer Apps - Moving Beyond Transactions to Experiences
PPTX
#CNX14 - Intro to Force
PPTX
#CNX14 - How Node.js Will Change Your Team
PDF
Writing REST APIs with OpenAPI and Swagger Ada
PDF
Continuous Development Pipeline
PDF
Seven perilous pitfalls to avoid with Java | DevNation Tech Talk
PDF
Habitat 301: Building Habitats
PPTX
Essential Tools for Modern PHP
#CNX14 - Building Killer Apps - Moving Beyond Transactions to Experiences
#CNX14 - Intro to Force
#CNX14 - How Node.js Will Change Your Team
Writing REST APIs with OpenAPI and Swagger Ada
Continuous Development Pipeline
Seven perilous pitfalls to avoid with Java | DevNation Tech Talk
Habitat 301: Building Habitats
Essential Tools for Modern PHP

What's hot (20)

PDF
Go swagger tutorial how to create golang api documentation using go swagger (1)
PDF
Create a PHP Library the right way
PPTX
Developing Cross Platform Applications with Golang
PDF
Gearman work queue in php
PDF
Becoming A Plumber: Building Deployment Pipelines - LISA17
PDF
How to create an Angular builder
PDF
Developing PHP Applications Faster
PDF
Continuous Delivery in OSS using Shipkit.org
PPTX
Continuous Delivery with Jenkins
PDF
Instrumentación de entrega continua con Gitlab
PPTX
PDF
Automate Your Automation | DrupalCon Vienna
PDF
Golang online course
PDF
Continuous Integration for your Android projects
PDF
DevOps Mashup: Special Champion Edition - Madrid DevOps 2016
PDF
React Ecosystem
PDF
13 practical tips for writing secure golang applications
PDF
Practical PHP Deployment with Jenkins
PDF
Laravel Forge: Hello World to Hello Production
PDF
DevOps Mashup - Codemotion ES 2015
Go swagger tutorial how to create golang api documentation using go swagger (1)
Create a PHP Library the right way
Developing Cross Platform Applications with Golang
Gearman work queue in php
Becoming A Plumber: Building Deployment Pipelines - LISA17
How to create an Angular builder
Developing PHP Applications Faster
Continuous Delivery in OSS using Shipkit.org
Continuous Delivery with Jenkins
Instrumentación de entrega continua con Gitlab
Automate Your Automation | DrupalCon Vienna
Golang online course
Continuous Integration for your Android projects
DevOps Mashup: Special Champion Edition - Madrid DevOps 2016
React Ecosystem
13 practical tips for writing secure golang applications
Practical PHP Deployment with Jenkins
Laravel Forge: Hello World to Hello Production
DevOps Mashup - Codemotion ES 2015
Ad

Viewers also liked (18)

PPTX
Flexible Frameworks: A Springboard to Sophistication
PPTX
Design For Your Subscribers: Tips and Tricks to Increase Email Marketing ROI ...
PPTX
#CNX14 - Journey Builder - The New App Experience
PDF
מפגש שולחן עגול אבטחת מידע בגופים פיננסיים
PPTX
Wind Turbine Competition 2011
PPTX
Collaboration friday
PPT
Cataratas del Niagara en Invierno
PDF
SPRSWAduckhuntingstudyprogressreportApril2012
PDF
Digital Catapult, Senzations15
PPT
Social media
PDF
004c - Mobile Day Colombia - What Do Brands Want in a Mobile? - David Reina -...
DOC
Κοβάτση-Το ισοπροστάνιο ως δείκτης οξειδωτικού στρ
PDF
The Independent Magazine's media kit 2015
PDF
Daily Newsletter: 13th July, 2011
PDF
First Line Of Defense
DOCX
Articulação de conteúdos 7.º3 2.ºperíodo (1)
PPTX
Syngo aortic valve_guide_customer_presentation_neu_132447179_1
Flexible Frameworks: A Springboard to Sophistication
Design For Your Subscribers: Tips and Tricks to Increase Email Marketing ROI ...
#CNX14 - Journey Builder - The New App Experience
מפגש שולחן עגול אבטחת מידע בגופים פיננסיים
Wind Turbine Competition 2011
Collaboration friday
Cataratas del Niagara en Invierno
SPRSWAduckhuntingstudyprogressreportApril2012
Digital Catapult, Senzations15
Social media
004c - Mobile Day Colombia - What Do Brands Want in a Mobile? - David Reina -...
Κοβάτση-Το ισοπροστάνιο ως δείκτης οξειδωτικού στρ
The Independent Magazine's media kit 2015
Daily Newsletter: 13th July, 2011
First Line Of Defense
Articulação de conteúdos 7.º3 2.ºperíodo (1)
Syngo aortic valve_guide_customer_presentation_neu_132447179_1
Ad

Similar to #CNX14 - Using Ruby for Reliability, Consistency, and Speed (20)

PDF
Web Development using Ruby on Rails
KEY
A tour on ruby and friends
PDF
Swing when you're winning - an introduction to Ruby and Sinatra
PDF
Ruby confhighlights
PPTX
Why Ruby?
KEY
Intro to Ruby on Rails
PPTX
Exploring Ruby on Rails and PostgreSQL
PPT
Rapid Application Development using Ruby on Rails
PPT
WorkinOnTheRailsRoad
PPT
Workin ontherailsroad
PDF
Is Ruby on Rails Object Oriented? A Comprehensive Exploration
PPT
Contributing To Rails By Plugin Gem
PDF
Finding Frank - Spotify API.pdf
PDF
O que tem de novo no Ruby 2.0?
PPT
Java, Ruby & Rails
PDF
The story of language development
PDF
FGCU Camp Talk
KEY
Why ruby and rails
KEY
Rapid development with Rails
PPT
Why ruby?
Web Development using Ruby on Rails
A tour on ruby and friends
Swing when you're winning - an introduction to Ruby and Sinatra
Ruby confhighlights
Why Ruby?
Intro to Ruby on Rails
Exploring Ruby on Rails and PostgreSQL
Rapid Application Development using Ruby on Rails
WorkinOnTheRailsRoad
Workin ontherailsroad
Is Ruby on Rails Object Oriented? A Comprehensive Exploration
Contributing To Rails By Plugin Gem
Finding Frank - Spotify API.pdf
O que tem de novo no Ruby 2.0?
Java, Ruby & Rails
The story of language development
FGCU Camp Talk
Why ruby and rails
Rapid development with Rails
Why ruby?

More from Salesforce Marketing Cloud (20)

PPTX
Salesforce Marketing Cloud Partner Webinar: A New Twist on Growing Your List!
PPTX
#CNX14 - Dive Deep into the ExactTarget Fuel APIs
PPTX
#CNX14 - Build, Deploy and Scale Customer Apps Quickly
PPTX
#CNX14 - Accelerate Pipeline with Pardot: The Salesforce B2B Marketing Automa...
PPTX
#CNX14 - Building Enterprise Mobile Apps With Salesforce1
PPTX
#CNX14 - Disruption Panel
PPTX
#CNX14 - Get Started with Mobile Marketing: Email, SMS, Push and Responsive E...
PPTX
#CNX14 - Personalized Experiences: Web & Email Customization Made Easy
PPTX
#CNX14 - The Power to Predict: The How-To's of Personalized Content
PPTX
#CNX14 - Make Audiences the Center of Your Advertising for Greater Performance
PPTX
#CNX14 - Social Listening: From Getting Started to Executing at Scale
PPTX
#CNX14 - Great Customer Service is Great Marketing
PPTX
#CNX14 - Content Marketing: The Art of Business Storytelling
PPTX
#CNX14 - Crisis Communication
PPTX
#CNX14 - Propelling Your Career with Mentors & Sponsors
PPTX
#CNX14 - Use Chatter and Communities to Drive Stronger Customer Engagement
PPTX
#CNX14 - Accelerate Pipeline with Pardot: The Salesforce B2B Marketing Automa...
PPTX
#CNX14 - Marketing and Sales United With a Common Goal
PPTX
#CNX14 - 7 Technology Trends Transforming Customer Communication
PPTX
#CNX14 - The Connected Nonprofit and the Connected Campus: Creating Stronger ...
Salesforce Marketing Cloud Partner Webinar: A New Twist on Growing Your List!
#CNX14 - Dive Deep into the ExactTarget Fuel APIs
#CNX14 - Build, Deploy and Scale Customer Apps Quickly
#CNX14 - Accelerate Pipeline with Pardot: The Salesforce B2B Marketing Automa...
#CNX14 - Building Enterprise Mobile Apps With Salesforce1
#CNX14 - Disruption Panel
#CNX14 - Get Started with Mobile Marketing: Email, SMS, Push and Responsive E...
#CNX14 - Personalized Experiences: Web & Email Customization Made Easy
#CNX14 - The Power to Predict: The How-To's of Personalized Content
#CNX14 - Make Audiences the Center of Your Advertising for Greater Performance
#CNX14 - Social Listening: From Getting Started to Executing at Scale
#CNX14 - Great Customer Service is Great Marketing
#CNX14 - Content Marketing: The Art of Business Storytelling
#CNX14 - Crisis Communication
#CNX14 - Propelling Your Career with Mentors & Sponsors
#CNX14 - Use Chatter and Communities to Drive Stronger Customer Engagement
#CNX14 - Accelerate Pipeline with Pardot: The Salesforce B2B Marketing Automa...
#CNX14 - Marketing and Sales United With a Common Goal
#CNX14 - 7 Technology Trends Transforming Customer Communication
#CNX14 - The Connected Nonprofit and the Connected Campus: Creating Stronger ...

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

  • 1. Track: Developers #CNX14 #CNX14 Using Ruby for Reliability, Consistency, and Speed Terence Lee, Ruby Task Force Lead @hone02
  • 6. Track: Developers #CNX14 Ruby Task Force
  • 7. Track: Developers #CNX14 Ruby Task Force ruby-core
  • 8. Track: Developers #CNX14 Ruby Task Force ruby-core bundler-core
  • 9. Track: Developers #CNX14 Goals – Presentation Overview 1 2 3 History Ruby Everywhere Ecosystem
  • 10. Track: Developers #CNX14 #CNX14 History
  • 11. 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”, まつもとゆきひろ
  • 12. Track: Developers #CNX14 Japan - 1993
  • 13. Track: Developers #CNX14 1995 - Ruby 0.95
  • 14. Track: Developers #CNX14 1995 - Ruby 0.95 1995 - Java 1.0
  • 15. Track: Developers #CNX14 1995 - Ruby 0.95 1995 - Java 1.0 1996 - Ruby 1.0
  • 16. Track: Developers #CNX14 1995 - Ruby 0.95 1995 - Java 1.0 1996 - Ruby 1.0 2000 - Programming Ruby Released 2003 - Ruby 1.8
  • 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
  • 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
  • 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
  • 20. 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
  • 21. Track: Developers #CNX14 #CNX14 Design
  • 22. 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."
  • 23. 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”, まつもとゆきひろ
  • 24. Track: Developers #CNX14 puts 'Hello World!' Hello World!
  • 25. Track: Developers #CNX14 puts 'Hello World!' Hello World! (1..5).each {|i| puts i } 1 2 3 4 5
  • 26. 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>"
  • 27. Track: Developers #CNX14 #CNX14 Ruby Everywhere
  • 28. Track: Developers #CNX14 Companies Using Ruby Amazon Good Reads Hulu Cookpad Bloomberg New York Times Basecamp Red Hat
  • 29. 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; }
  • 30. Track: Developers #CNX14 RubyMotion Command line based tooling for iOS, Mac, and Android. Basecamp Frontback Jukely Bandcamp
  • 31. Track: Developers #CNX14 PLACEHOLDER SCREEN
  • 32. 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)
  • 33. Track: Developers #CNX14 JRuby + Truffle Benchmarks PLACEHOLDER SCREEN
  • 34. Track: Developers #CNX14 #CNX14 Ecosystem
  • 35. Track: Developers #CNX14 RubyGems $ gem install bundler 3,692,537,013 downloads 88,959 gems cut since July 2009
  • 38. Track: Developers #CNX14 Bundler # Gemfile source "https://rubygems.org" gem 'rspec', ‘~> 3.0.0’
  • 39. 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!
  • 40. 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
  • 41. 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
  • 42. Track: Developers #CNX14 #CNX14 Build Web Apps
  • 43. Track: Developers #CNX14 Rack # Gemfile gem 'rack' # config.ru run Proc.new {|env| ['200', {'Content-Type' => 'text/html'}, ['Hello World!']] } $ bundle exec rackup
  • 44. 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!
  • 45. 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 ...
  • 46. Track: Developers #CNX14 Ruby on Rails app/controllers/ app/helpers/ app/models/ app/mailers/ app/views/
  • 47. Track: Developers #CNX14 ActiveRecord class Article < ActiveRecord::Base validates_presence_of :url before_create :summarize def summarize ... end end
  • 48. 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
  • 49. 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
  • 50. Track: Developers #CNX14 Ruby on Rails config/ config/environments/ db/ db/migrate/ public/ vendor/
  • 51. Track: Developers #CNX14 Ruby on Rails app/assets/ app/assets/images/ app/assets/javascripts/ app/assets/stylesheets/ $ bin/rake assets:precompile image- 908e25f4bf641868d8683022a5b62f54.jpg
  • 52. 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'
  • 53. Track: Developers #CNX14 #CNX14 Background Queuing
  • 54. 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
  • 55. Track: Developers #CNX14 Sidekiq # queue job Job.perform_async("/api/v1/foo", "heroku.com") $ bundle exec sidekiq -r ./job.rb -c 10
  • 56. Track: Developers #CNX14 Sidekiq # queue job Job.perform_async("/api/v1/foo", "heroku.com") $ bundle exec sidekiq -r ./job.rb -c 20
  • 57. Track: Developers #CNX14 Screenshot description here. Container resizes as needed PLACEHOLDER SCREEN
  • 58. Track: Developers #CNX14 #CNX14 Web Servers
  • 59. Track: Developers #CNX14 Puma # Gemfile gem 'puma' $ bundle exec puma
  • 60. Track: Developers #CNX14 Puma # Gemfile gem 'puma' $ bundle exec puma -t 8:32 -w 3
  • 61. Track: Developers #CNX14 #CNX14 Testing
  • 62. 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
  • 63. Track: Developers #CNX14 rspec-mocks book = double("book", :pages => 250)
  • 64. Track: Developers #CNX14 rspec-mocks book = double("book", :pages => 250) allow(book).to receive(:title) { "The RSpec Book" }
  • 65. 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
  • 66. 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
  • 67. 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
  • 68. 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
  • 69. Track: Developers #CNX14 #CNX14 Frontend Development
  • 70. 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/
  • 71. Track: Developers #CNX14 #CNX14 Security
  • 72. Track: Developers #CNX14 Screenshot description here. Container resizes as needed PLACEHOLDER SCREEN
  • 73. Track: Developers #CNX14 #CNX14 Miscellaneous
  • 74. 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
  • 75. Track: Developers #CNX14 #CNX14 Future
  • 76. 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
  • 77. Track: Developers #CNX14 Ruby 3.0 • Concurrency • JIT compiler • Static Typing
  • 78. Track: Developers #CNX14 #CNX14 Wrapup
  • 79. Track: Developers #CNX14 Ruby is not young. It may not even be hip, but it has a rich 20 year history.
  • 80. Track: Developers #CNX14 There are many implementations of Ruby that can fit all shapes, sizes, and purposes.
  • 81. Track: Developers #CNX14 There's a vibrant ecosystem of libraries, tools, and practices surrounding Ruby.
  • 82. 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
  • 84. Track: Developers #CNX14 One more thing...
  • 87. 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