SlideShare une entreprise Scribd logo
1  sur  87
Télécharger pour lire hors ligne
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 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

Contenu connexe

Tendances

Go swagger tutorial how to create golang api documentation using go swagger (1)
Go swagger tutorial how to create golang api documentation using go swagger (1)Go swagger tutorial how to create golang api documentation using go swagger (1)
Go swagger tutorial how to create golang api documentation using go swagger (1)Katy Slemon
 
Create a PHP Library the right way
Create a PHP Library the right wayCreate a PHP Library the right way
Create a PHP Library the right wayChristian Varela
 
Developing Cross Platform Applications with Golang
Developing Cross Platform Applications with GolangDeveloping Cross Platform Applications with Golang
Developing Cross Platform Applications with GolangErhan Yakut
 
Gearman work queue in php
Gearman work queue in phpGearman work queue in php
Gearman work queue in phpBo-Yi Wu
 
Becoming A Plumber: Building Deployment Pipelines - LISA17
Becoming A Plumber: Building Deployment Pipelines - LISA17Becoming A Plumber: Building Deployment Pipelines - LISA17
Becoming A Plumber: Building Deployment Pipelines - LISA17Daniel Barker
 
How to create an Angular builder
How to create an Angular builderHow to create an Angular builder
How to create an Angular builderMaurizio Vitale
 
Developing PHP Applications Faster
Developing PHP Applications FasterDeveloping PHP Applications Faster
Developing PHP Applications FasterAdam Culp
 
Continuous Delivery in OSS using Shipkit.org
Continuous Delivery in OSS using Shipkit.orgContinuous Delivery in OSS using Shipkit.org
Continuous Delivery in OSS using Shipkit.orgMarcinStachniuk
 
Continuous Delivery with Jenkins
Continuous Delivery with JenkinsContinuous Delivery with Jenkins
Continuous Delivery with JenkinsJadson Santos
 
Instrumentación de entrega continua con Gitlab
Instrumentación de entrega continua con GitlabInstrumentación de entrega continua con Gitlab
Instrumentación de entrega continua con GitlabSoftware Guru
 
Automate Your Automation | DrupalCon Vienna
Automate Your Automation | DrupalCon ViennaAutomate Your Automation | DrupalCon Vienna
Automate Your Automation | DrupalCon ViennaPantheon
 
Continuous Integration for your Android projects
Continuous Integration for your Android projectsContinuous Integration for your Android projects
Continuous Integration for your Android projectsSergii Zhuk
 
DevOps Mashup: Special Champion Edition - Madrid DevOps 2016
DevOps Mashup: Special Champion Edition - Madrid DevOps 2016DevOps Mashup: Special Champion Edition - Madrid DevOps 2016
DevOps Mashup: Special Champion Edition - Madrid DevOps 2016Ramón Román Nissen
 
13 practical tips for writing secure golang applications
13 practical tips for writing secure golang applications13 practical tips for writing secure golang applications
13 practical tips for writing secure golang applicationsKarthik Gaekwad
 
Practical PHP Deployment with Jenkins
Practical PHP Deployment with JenkinsPractical PHP Deployment with Jenkins
Practical PHP Deployment with JenkinsAdam Culp
 
Laravel Forge: Hello World to Hello Production
Laravel Forge: Hello World to Hello ProductionLaravel Forge: Hello World to Hello Production
Laravel Forge: Hello World to Hello ProductionJoe Ferguson
 
DevOps Mashup - Codemotion ES 2015
DevOps Mashup - Codemotion ES 2015DevOps Mashup - Codemotion ES 2015
DevOps Mashup - Codemotion ES 2015Ramón Román Nissen
 

Tendances (20)

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

En vedette

Flexible Frameworks: A Springboard to Sophistication
Flexible Frameworks: A Springboard to Sophistication Flexible Frameworks: A Springboard to Sophistication
Flexible Frameworks: A Springboard to Sophistication Salesforce Marketing Cloud
 
Design For Your Subscribers: Tips and Tricks to Increase Email Marketing ROI ...
Design For Your Subscribers: Tips and Tricks to Increase Email Marketing ROI ...Design For Your Subscribers: Tips and Tricks to Increase Email Marketing ROI ...
Design For Your Subscribers: Tips and Tricks to Increase Email Marketing ROI ...Online Marketing Summit
 
#CNX14 - Journey Builder - The New App Experience
#CNX14 - Journey Builder - The New App Experience#CNX14 - Journey Builder - The New App Experience
#CNX14 - Journey Builder - The New App ExperienceSalesforce Marketing Cloud
 
AWS October Webinar Series - Using Spot Instances to Save up to 90% off Your ...
AWS October Webinar Series - Using Spot Instances to Save up to 90% off Your ...AWS October Webinar Series - Using Spot Instances to Save up to 90% off Your ...
AWS October Webinar Series - Using Spot Instances to Save up to 90% off Your ...Amazon Web Services
 
מפגש שולחן עגול אבטחת מידע בגופים פיננסיים
מפגש שולחן עגול אבטחת מידע בגופים פיננסייםמפגש שולחן עגול אבטחת מידע בגופים פיננסיים
מפגש שולחן עגול אבטחת מידע בגופים פיננסייםYuval Segev
 
Wind Turbine Competition 2011
Wind Turbine Competition 2011Wind Turbine Competition 2011
Wind Turbine Competition 2011David Neff
 
Collaboration friday
Collaboration fridayCollaboration friday
Collaboration fridaykacrey
 
Cataratas del Niagara en Invierno
Cataratas del Niagara en InviernoCataratas del Niagara en Invierno
Cataratas del Niagara en Inviernoquienentravuelve
 
SPRSWAduckhuntingstudyprogressreportApril2012
SPRSWAduckhuntingstudyprogressreportApril2012SPRSWAduckhuntingstudyprogressreportApril2012
SPRSWAduckhuntingstudyprogressreportApril2012Mike McConnell
 
004c - Mobile Day Colombia - What Do Brands Want in a Mobile? - David Reina -...
004c - Mobile Day Colombia - What Do Brands Want in a Mobile? - David Reina -...004c - Mobile Day Colombia - What Do Brands Want in a Mobile? - David Reina -...
004c - Mobile Day Colombia - What Do Brands Want in a Mobile? - David Reina -...Mobile Marketing Association
 
Κοβάτση-Το ισοπροστάνιο ως δείκτης οξειδωτικού στρ
Κοβάτση-Το ισοπροστάνιο ως δείκτης οξειδωτικού στρΚοβάτση-Το ισοπροστάνιο ως δείκτης οξειδωτικού στρ
Κοβάτση-Το ισοπροστάνιο ως δείκτης οξειδωτικού στρcsdtesting
 
The Independent Magazine's media kit 2015
The Independent Magazine's media kit 2015 The Independent Magazine's media kit 2015
The Independent Magazine's media kit 2015 Newsworks
 
First Line Of Defense
First Line Of DefenseFirst Line Of Defense
First Line Of Defensecjperego
 
Articulação de conteúdos 7.º3 2.ºperíodo (1)
Articulação de conteúdos 7.º3 2.ºperíodo (1)Articulação de conteúdos 7.º3 2.ºperíodo (1)
Articulação de conteúdos 7.º3 2.ºperíodo (1)José Magalhães
 

En vedette (19)

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

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

Toolbox of a Ruby Team
Toolbox of a Ruby TeamToolbox of a Ruby Team
Toolbox of a Ruby TeamArto Artnik
 
A tour on ruby and friends
A tour on ruby and friendsA tour on ruby and friends
A tour on ruby and friends旻琦 潘
 
Ruby C extensions at the Ruby drink-up of Sophia, April 2012
Ruby C extensions at the Ruby drink-up of Sophia, April 2012Ruby C extensions at the Ruby drink-up of Sophia, April 2012
Ruby C extensions at the Ruby drink-up of Sophia, April 2012rivierarb
 
How to Begin to Develop Ruby Core
How to Begin to Develop Ruby CoreHow to Begin to Develop Ruby Core
How to Begin to Develop Ruby CoreHiroshi SHIBATA
 
From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016
From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016
From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016Susan Potter
 
The details of CI/CD environment for Ruby
The details of CI/CD environment for RubyThe details of CI/CD environment for Ruby
The details of CI/CD environment for RubyHiroshi SHIBATA
 
Migrating Legacy Rails Apps to Rails 3
Migrating Legacy Rails Apps to Rails 3Migrating Legacy Rails Apps to Rails 3
Migrating Legacy Rails Apps to Rails 3Clinton Dreisbach
 
Dockercon EU 2014
Dockercon EU 2014Dockercon EU 2014
Dockercon EU 2014Rafe Colton
 
Torquebox OSCON Java 2011
Torquebox OSCON Java 2011Torquebox OSCON Java 2011
Torquebox OSCON Java 2011tobiascrawley
 
The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...
The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...
The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...Docker, Inc.
 
Introduction to Rails - presented by Arman Ortega
Introduction to Rails - presented by Arman OrtegaIntroduction to Rails - presented by Arman Ortega
Introduction to Rails - presented by Arman Ortegaarman o
 
Ruby on Rails - Introduction
Ruby on Rails - IntroductionRuby on Rails - Introduction
Ruby on Rails - IntroductionVagmi Mudumbai
 
Rubyspec y el largo camino hacia Ruby 1.9
Rubyspec y el largo camino hacia Ruby 1.9Rubyspec y el largo camino hacia Ruby 1.9
Rubyspec y el largo camino hacia Ruby 1.9David Calavera
 
What's new and great in Rails 3 - Matt Gauger - Milwaukee Ruby Users Group De...
What's new and great in Rails 3 - Matt Gauger - Milwaukee Ruby Users Group De...What's new and great in Rails 3 - Matt Gauger - Milwaukee Ruby Users Group De...
What's new and great in Rails 3 - Matt Gauger - Milwaukee Ruby Users Group De...Matt Gauger
 
Middleware as Code with mruby
Middleware as Code with mrubyMiddleware as Code with mruby
Middleware as Code with mrubyHiroshi SHIBATA
 
What's new in Ruby 2.0
What's new in Ruby 2.0What's new in Ruby 2.0
What's new in Ruby 2.0Kartik Sahoo
 
RSpec 3.0: Under the Covers
RSpec 3.0: Under the CoversRSpec 3.0: Under the Covers
RSpec 3.0: Under the CoversBrian Gesiak
 

Similaire à #CNX14 - Using Ruby for Reliability, Consistency, and Speed (20)

Toolbox of a Ruby Team
Toolbox of a Ruby TeamToolbox of a Ruby Team
Toolbox of a Ruby Team
 
A tour on ruby and friends
A tour on ruby and friendsA tour on ruby and friends
A tour on ruby and friends
 
Ruby C extensions at the Ruby drink-up of Sophia, April 2012
Ruby C extensions at the Ruby drink-up of Sophia, April 2012Ruby C extensions at the Ruby drink-up of Sophia, April 2012
Ruby C extensions at the Ruby drink-up of Sophia, April 2012
 
How to Begin to Develop Ruby Core
How to Begin to Develop Ruby CoreHow to Begin to Develop Ruby Core
How to Begin to Develop Ruby Core
 
From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016
From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016
From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016
 
The details of CI/CD environment for Ruby
The details of CI/CD environment for RubyThe details of CI/CD environment for Ruby
The details of CI/CD environment for Ruby
 
Migrating Legacy Rails Apps to Rails 3
Migrating Legacy Rails Apps to Rails 3Migrating Legacy Rails Apps to Rails 3
Migrating Legacy Rails Apps to Rails 3
 
Dockercon EU 2014
Dockercon EU 2014Dockercon EU 2014
Dockercon EU 2014
 
Torquebox OSCON Java 2011
Torquebox OSCON Java 2011Torquebox OSCON Java 2011
Torquebox OSCON Java 2011
 
The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...
The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...
The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...
 
How DSL works on Ruby
How DSL works on RubyHow DSL works on Ruby
How DSL works on Ruby
 
Introduction to Rails - presented by Arman Ortega
Introduction to Rails - presented by Arman OrtegaIntroduction to Rails - presented by Arman Ortega
Introduction to Rails - presented by Arman Ortega
 
Ruby on Rails - Introduction
Ruby on Rails - IntroductionRuby on Rails - Introduction
Ruby on Rails - Introduction
 
Rubyspec y el largo camino hacia Ruby 1.9
Rubyspec y el largo camino hacia Ruby 1.9Rubyspec y el largo camino hacia Ruby 1.9
Rubyspec y el largo camino hacia Ruby 1.9
 
What's new and great in Rails 3 - Matt Gauger - Milwaukee Ruby Users Group De...
What's new and great in Rails 3 - Matt Gauger - Milwaukee Ruby Users Group De...What's new and great in Rails 3 - Matt Gauger - Milwaukee Ruby Users Group De...
What's new and great in Rails 3 - Matt Gauger - Milwaukee Ruby Users Group De...
 
Fun with Ruby and Cocoa
Fun with Ruby and CocoaFun with Ruby and Cocoa
Fun with Ruby and Cocoa
 
Wider than rails
Wider than railsWider than rails
Wider than rails
 
Middleware as Code with mruby
Middleware as Code with mrubyMiddleware as Code with mruby
Middleware as Code with mruby
 
What's new in Ruby 2.0
What's new in Ruby 2.0What's new in Ruby 2.0
What's new in Ruby 2.0
 
RSpec 3.0: Under the Covers
RSpec 3.0: Under the CoversRSpec 3.0: Under the Covers
RSpec 3.0: Under the Covers
 

Plus de Salesforce Marketing Cloud

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

Plus de Salesforce Marketing Cloud (20)

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