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

What's hot (20)

PDF
Go swagger tutorial how to create golang api documentation using go swagger (1)
Katy Slemon
 
PDF
Create a PHP Library the right way
Christian Varela
 
PPTX
Developing Cross Platform Applications with Golang
Erhan Yakut
 
PDF
Gearman work queue in php
Bo-Yi Wu
 
PDF
Becoming A Plumber: Building Deployment Pipelines - LISA17
Daniel Barker
 
PDF
How to create an Angular builder
Maurizio Vitale
 
PDF
Developing PHP Applications Faster
Adam Culp
 
PDF
Continuous Delivery in OSS using Shipkit.org
MarcinStachniuk
 
PPTX
Continuous Delivery with Jenkins
Jadson Santos
 
PDF
Instrumentación de entrega continua con Gitlab
Software Guru
 
PPTX
C# 6
Pascal Laurin
 
PDF
Automate Your Automation | DrupalCon Vienna
Pantheon
 
PDF
Golang online course
bestonlinecoursescoupon
 
PDF
Continuous Integration for your Android projects
Sergii Zhuk
 
PDF
DevOps Mashup: Special Champion Edition - Madrid DevOps 2016
Ramón Román Nissen
 
PDF
React Ecosystem
Craig Jolicoeur
 
PDF
13 practical tips for writing secure golang applications
Karthik Gaekwad
 
PDF
Practical PHP Deployment with Jenkins
Adam Culp
 
PDF
Laravel Forge: Hello World to Hello Production
Joe Ferguson
 
PDF
DevOps Mashup - Codemotion ES 2015
Ramón Román Nissen
 
Go swagger tutorial how to create golang api documentation using go swagger (1)
Katy Slemon
 
Create a PHP Library the right way
Christian Varela
 
Developing Cross Platform Applications with Golang
Erhan Yakut
 
Gearman work queue in php
Bo-Yi Wu
 
Becoming A Plumber: Building Deployment Pipelines - LISA17
Daniel Barker
 
How to create an Angular builder
Maurizio Vitale
 
Developing PHP Applications Faster
Adam Culp
 
Continuous Delivery in OSS using Shipkit.org
MarcinStachniuk
 
Continuous Delivery with Jenkins
Jadson Santos
 
Instrumentación de entrega continua con Gitlab
Software Guru
 
Automate Your Automation | DrupalCon Vienna
Pantheon
 
Golang online course
bestonlinecoursescoupon
 
Continuous Integration for your Android projects
Sergii Zhuk
 
DevOps Mashup: Special Champion Edition - Madrid DevOps 2016
Ramón Román Nissen
 
React Ecosystem
Craig Jolicoeur
 
13 practical tips for writing secure golang applications
Karthik Gaekwad
 
Practical PHP Deployment with Jenkins
Adam Culp
 
Laravel Forge: Hello World to Hello Production
Joe Ferguson
 
DevOps Mashup - Codemotion ES 2015
Ramón Román Nissen
 

Viewers also liked (18)

PPTX
Flexible Frameworks: A Springboard to Sophistication
Salesforce Marketing Cloud
 
PPTX
Design For Your Subscribers: Tips and Tricks to Increase Email Marketing ROI ...
Online Marketing Summit
 
PPTX
#CNX14 - Journey Builder - The New App Experience
Salesforce Marketing Cloud
 
PDF
מפגש שולחן עגול אבטחת מידע בגופים פיננסיים
Yuval Segev
 
PPTX
Wind Turbine Competition 2011
David Neff
 
PPTX
Collaboration friday
kacrey
 
PPT
Cataratas del Niagara en Invierno
quienentravuelve
 
PDF
SPRSWAduckhuntingstudyprogressreportApril2012
Mike McConnell
 
PDF
Digital Catapult, Senzations15
SenZations Summer School
 
PPT
Social media
Ann Goodrich-Bazan
 
PDF
004c - Mobile Day Colombia - What Do Brands Want in a Mobile? - David Reina -...
Mobile Marketing Association
 
DOC
Κοβάτση-Το ισοπροστάνιο ως δείκτης οξειδωτικού στρ
csdtesting
 
PDF
The Independent Magazine's media kit 2015
Newsworks
 
PDF
Daily Newsletter: 13th July, 2011
Fullerton Securities
 
PDF
First Line Of Defense
cjperego
 
DOCX
Articulação de conteúdos 7.º3 2.ºperíodo (1)
José Magalhães
 
PPTX
Syngo aortic valve_guide_customer_presentation_neu_132447179_1
SHCI - Sección de Hemodinámica y Cardiología Intervencionista
 
Flexible Frameworks: A Springboard to Sophistication
Salesforce Marketing Cloud
 
Design For Your Subscribers: Tips and Tricks to Increase Email Marketing ROI ...
Online Marketing Summit
 
#CNX14 - Journey Builder - The New App Experience
Salesforce Marketing Cloud
 
מפגש שולחן עגול אבטחת מידע בגופים פיננסיים
Yuval Segev
 
Wind Turbine Competition 2011
David Neff
 
Collaboration friday
kacrey
 
Cataratas del Niagara en Invierno
quienentravuelve
 
SPRSWAduckhuntingstudyprogressreportApril2012
Mike McConnell
 
Digital Catapult, Senzations15
SenZations Summer School
 
Social media
Ann Goodrich-Bazan
 
004c - Mobile Day Colombia - What Do Brands Want in a Mobile? - David Reina -...
Mobile Marketing Association
 
Κοβάτση-Το ισοπροστάνιο ως δείκτης οξειδωτικού στρ
csdtesting
 
The Independent Magazine's media kit 2015
Newsworks
 
Daily Newsletter: 13th July, 2011
Fullerton Securities
 
First Line Of Defense
cjperego
 
Articulação de conteúdos 7.º3 2.ºperíodo (1)
José Magalhães
 
Syngo aortic valve_guide_customer_presentation_neu_132447179_1
SHCI - Sección de Hemodinámica y Cardiología Intervencionista
 
Ad

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

PDF
Web Development using Ruby on Rails
Avi Kedar
 
KEY
A tour on ruby and friends
旻琦 潘
 
PDF
Swing when you're winning - an introduction to Ruby and Sinatra
Matt Gifford
 
PDF
Ruby confhighlights
Claire Tran
 
PPTX
Why Ruby?
IT Weekend
 
KEY
Intro to Ruby on Rails
rschmukler
 
PPTX
Exploring Ruby on Rails and PostgreSQL
Barry Jones
 
PPT
Rapid Application Development using Ruby on Rails
Simobo
 
PPT
Workin ontherailsroad
Jim Jones
 
PPT
WorkinOnTheRailsRoad
webuploader
 
PDF
Is Ruby on Rails Object Oriented? A Comprehensive Exploration
rorbitssoftware
 
PPT
Contributing To Rails By Plugin Gem
Daniel Lv
 
PDF
Finding Frank - Spotify API.pdf
aspleenic
 
PDF
O que tem de novo no Ruby 2.0?
Fabio Akita
 
PPT
Java, Ruby & Rails
Peter Lind
 
PDF
The story of language development
Hiroshi SHIBATA
 
PDF
FGCU Camp Talk
Mark Brooks
 
KEY
Why ruby and rails
Reuven Lerner
 
KEY
Rapid development with Rails
Yi-Ting Cheng
 
PPT
Why ruby?
Bunlong Van
 
Web Development using Ruby on Rails
Avi Kedar
 
A tour on ruby and friends
旻琦 潘
 
Swing when you're winning - an introduction to Ruby and Sinatra
Matt Gifford
 
Ruby confhighlights
Claire Tran
 
Why Ruby?
IT Weekend
 
Intro to Ruby on Rails
rschmukler
 
Exploring Ruby on Rails and PostgreSQL
Barry Jones
 
Rapid Application Development using Ruby on Rails
Simobo
 
Workin ontherailsroad
Jim Jones
 
WorkinOnTheRailsRoad
webuploader
 
Is Ruby on Rails Object Oriented? A Comprehensive Exploration
rorbitssoftware
 
Contributing To Rails By Plugin Gem
Daniel Lv
 
Finding Frank - Spotify API.pdf
aspleenic
 
O que tem de novo no Ruby 2.0?
Fabio Akita
 
Java, Ruby & Rails
Peter Lind
 
The story of language development
Hiroshi SHIBATA
 
FGCU Camp Talk
Mark Brooks
 
Why ruby and rails
Reuven Lerner
 
Rapid development with Rails
Yi-Ting Cheng
 
Why ruby?
Bunlong Van
 
Ad

More from Salesforce Marketing Cloud (20)

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

#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