#cnx14 - using ruby for reliability, consistency, and speed
DESCRIPTION
Ruby is just over 20 years old. It's no longer young or hip, and that’s a good thing! In the last decade, Ruby has matured as a web technology. It's being used in many successful companies out there such as Hulu, GitHub, and Bloomberg. The ecosystem is comprised of many stable libraries and tools to handle most common web tasks, allowing you to focus on adding features to improve your product and better serve your customers. We'll talk about how you can build scalable and reliable software, but still maintain fast development turnaround by leveraging the maturity and creativity of the Ruby community.TRANSCRIPT
Track: Developers
#CNX14
#CNX14
Using Ruby for Reliability, Consistency, and Speed
Terence Lee, Ruby Task Force Lead@hone02
Track: Developers
#CNX14
@hone02
Track: Developers
#CNX14
Track: Developers
#CNX14
Austin, TX
Track: Developers
#CNX14
Ruby Task Force
Track: Developers
#CNX14
Ruby Task Forceruby-core
Track: Developers
#CNX14
Ruby Task Forceruby-corebundler-core
Track: Developers
#CNX14
Goals – Presentation Overview
1 2 3
History Ruby Everywhere Ecosystem
Track: Developers
#CNX14
#CNX14
History
Track: Developers
#CNX14
Track: Developers
#CNX14
“I believe that the purpose of life is, at least in part, to be happy. Based on this belief, Ruby is designed to make programming not only easy but also fun. It allows you to concentrate on the creative side of programming, with less stress.”
- Yukihiro Matsumoto, “Matz”, まつもとゆきひろ
Track: Developers
#CNX14
Japan - 1993
Track: Developers
#CNX14
1995 - Ruby 0.95
Track: Developers
#CNX14
1995 - Ruby 0.951995 - Java 1.0
Track: Developers
#CNX14
1995 - Ruby 0.951995 - Java 1.01996 - Ruby 1.0
Track: Developers
#CNX14
1995 - Ruby 0.951995 - Java 1.01996 - Ruby 1.02000 - Programming Ruby Released2003 - Ruby 1.8
Track: Developers
#CNX14
1995 - Ruby 0.951995 - Java 1.01996 - Ruby 1.02000 - Programming Ruby Released2003 - Ruby 1.82007 - Ruby 1.9
Track: Developers
#CNX14
1995 - Ruby 0.951995 - Java 1.01996 - Ruby 1.02000 - Programming Ruby Released2003 - Ruby 1.82007 - Ruby 1.92011 - Ruby 1.9.3
Track: Developers
#CNX14
1995 - Ruby 0.951995 - Java 1.01996 - Ruby 1.02000 - Programming Ruby Released2003 - Ruby 1.82007 - Ruby 1.92011 - Ruby 1.9.32/2013 - Ruby 2.0.012/2013 - Ruby 2.1.0
Track: Developers
#CNX14
1995 - Ruby 0.951995 - Java 1.01996 - Ruby 1.02000 - Programming Ruby Released2003 - Ruby 1.82007 - Ruby 1.92011 - Ruby 1.9.32/2013 - Ruby 2.0.012/2013 - Ruby 2.1.012/2014 - Ruby 2.2.0
Track: Developers
#CNX14
#CNX14
Design
Track: Developers
#CNX14
Fuji is the new Leica
"Fuji is the new Leica. It's true! Fuji is making the world's best cameras, in every way, especially when it comes to functional design considerations. They are the only company that putting a priority on Human-Centered Design that isn't also charging $7,000 for their cameras."
Track: Developers
#CNX14
"Often people, especially computer engineers, focus on the machines. But in fact we need to focus on humans, on how humans care about doing programming or operating the application of the machines."
- Yukihiro Matsumoto, “Matz”, まつもとゆきひろ
Track: Developers
#CNX14
puts 'Hello World!'
Hello World!
Track: Developers
#CNX14
puts 'Hello World!'
Hello World!
(1..5).each {|i| puts i }
1
2
3
4
5
Track: Developers
#CNX14
COLORS = { black: "000",
blue: "00f",
white: "fff" }
class String
COLORS.each do |color,code|
define_method "in_#{color}" do
"<span style=\"color: ##{code}\">#{self}</span>"
end
end
end
puts "Hello World".in_blue
"<span style=\"color: #00f\">Hello, World!</span>"
Track: Developers
#CNX14
#CNX14
Ruby Everywhere
Track: Developers
#CNX14
Companies Using RubyAmazonGood ReadsHuluCookpadBloombergNew York TimesBasecampRed Hat
Track: Developers
#CNX14
mruby
#include <stdio.h>#include <mruby.h>#include <mruby/compile.h> int main(void) { mrb_state *mrb = mrb_open(); char code[] = "5.times { puts 'mruby is awesome!' }"; printf("Executing Ruby code with mruby:\n"); mrb_load_string(mrb, code); mrb_close(mrb); return 0;}
Track: Developers
#CNX14
RubyMotion
Command line based tooling for iOS, Mac, and Android.
BasecampFrontbackJukelyBandcamp
Track: Developers
#CNX14PLACEHOLDER SCREEN
Track: Developers
#CNX14
JRuby
$ jruby -S jirb_swing
require 'java'
frame = javax.swing.JFrame.new("Window")
label = javax.swing.JLabel.new("Hello")
frame.add(label)
frame.setDefaultCloseOperation(javax.swing.JFrame::EXIT_ON_CLOSE)
frame.pack
frame.setVisible(true)
Track: Developers
#CNX14
JRuby + Truffle Benchmarks
PLACEHOLDER SCREEN
Track: Developers
#CNX14
#CNX14
Ecosystem
Track: Developers
#CNX14
RubyGems
$ gem install bundler
3,692,537,013 downloads88,959 gems cut since July 2009
Track: Developers
#CNX14
Track: Developers
#CNX14
Track: Developers
#CNX14
Bundler
# Gemfile
source "https://rubygems.org"
gem 'rspec', ‘~> 3.0.0’
Track: Developers
#CNX14
Bundler
$ bundle install
Fetching gem metadata from https:
//rubygems.org/.........
Resolving dependencies...
Using bundler 1.6.2
Installing rspec-support 3.1.0
Installing diff-lcs 1.2.5
Installing rspec-mocks 3.1.1
Installing rspec-expectations 3.1.1
Installing rspec-core 3.1.4
Installing rspec 3.1.0
Your bundle is complete!
Track: Developers
#CNX14
Bundler# Gemfile.lock
GEM
remote: https://rubygems.org/
specs:
diff-lcs (1.2.5)
rspec (3.1.0)
rspec-core (~> 3.1.0)
rspec-expectations (~> 3.1.0)
rspec-mocks (~> 3.1.0)
rspec-core (3.1.4)
rspec-support (~> 3.1.0)
rspec-expectations (3.1.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.1.0)
rspec-mocks (3.1.1)
rspec-support (~> 3.1.0)
rspec-support (3.1.0)
PLATFORMS
ruby
DEPENDENCIES
rspec
Track: Developers
#CNX14
Bundler
# Gemfileruby '2.1.2'
gem 'rack'
$ bundle installYour Ruby version is 1.9.3, but your Gemfile specified 2.1.2
Track: Developers
#CNX14
#CNX14
Build Web Apps
Track: Developers
#CNX14
Rack
# Gemfile
gem 'rack'
# config.ru
run Proc.new {|env|
['200',
{'Content-Type' => 'text/html'},
['Hello World!']]
}
$ bundle exec rackup
Track: Developers
#CNX14
Sinatra
require 'sinatra'
get '/hi' do
"Hello World!"
end
$ gem install sinatra
$ ruby hi.rb
== Sinatra has taken the stage ...
>> Listening on 0.0.0.0:4567
$ curl http://localhost:4567
Hello World!
Track: Developers
#CNX14
Ruby on Rails
$ gem install rails
$ rails new hi
create
create README.rdoc
create Rakefile
create config.ru
create .gitignore
create Gemfile
create app
...
Track: Developers
#CNX14
Ruby on Rails
app/controllers/
app/helpers/
app/models/
app/mailers/
app/views/
Track: Developers
#CNX14
ActiveRecord
class Article < ActiveRecord::Base
validates_presence_of :url
before_create :summarize
def summarize
...
end
end
Track: Developers
#CNX14
ActionController
class ArticlesController < ApplicationController
def index
@articles = Article.all
@article = Article.new
end
def show
respond_to do |format|
format.html { render :file => "#{Rails.root}/public/404.html", :status
=> 404 }
format.json { render :show }
end
Track: Developers
#CNX14
Generators
$ bin/rails generate scaffold
$ bin/rails generate controller
$ bin/rails generate model
$ bin/rails generate migration
$ bin/rails generate helper
$ bin/rails generate mailer
Track: Developers
#CNX14
Ruby on Rails
config/
config/environments/
db/
db/migrate/
public/
vendor/
Track: Developers
#CNX14
Ruby on Rails
app/assets/
app/assets/images/
app/assets/javascripts/
app/assets/stylesheets/
$ bin/rake assets:precompile
image-
908e25f4bf641868d8683022a5b62f54.jpg
Track: Developers
#CNX14
Content Delivery Network (CDN)
$ heroku addons:add fastly
# config/environments/production.rb
config.action_controller.asset_host = ENV['FASTLY_CDN_URL']
config.static_cache_control = 'public, s-maxage=2592000, maxage=86400'
Track: Developers
#CNX14
#CNX14
Background Queuing
Track: Developers
#CNX14
Sidekiq
# Gemfile
gem 'sidekiq'
# job.rb
class Job
include Sidekiq::Worker
def perform(path, host, port = 80)
http = Net::HTTP.new(host, port)
http.request(Net::HTTP::Get.new(path)
end
end
Track: Developers
#CNX14
Sidekiq
# queue job
Job.perform_async("/api/v1/foo", "heroku.com")
$ bundle exec sidekiq -r ./job.rb -c 10
Track: Developers
#CNX14
Sidekiq
# queue job
Job.perform_async("/api/v1/foo", "heroku.com")
$ bundle exec sidekiq -r ./job.rb -c 20
Track: Developers
#CNX14
Screenshot description here.Container resizes as needed
PLACEHOLDER SCREEN
Track: Developers
#CNX14
#CNX14
Web Servers
Track: Developers
#CNX14
Puma
# Gemfile
gem 'puma'
$ bundle exec puma
Track: Developers
#CNX14
Puma
# Gemfile
gem 'puma'
$ bundle exec puma -t 8:32 -w 3
Track: Developers
#CNX14
#CNX14
Testing
Track: Developers
#CNX14
RSpec
# Gemfile
gem 'rspec'
# my_class_spec.rb
describe MyClass do
before { ... }
let(:foo) { MyClass.new }
it 'accesses the example' do
expect(foo.bar).to eq("bar")
end
end
Track: Developers
#CNX14
rspec-mocks
book = double("book", :pages => 250)
Track: Developers
#CNX14
rspec-mocks
book = double("book", :pages => 250)
allow(book).to receive(:title) { "The RSpec Book" }
Track: Developers
#CNX14
rspec-mocks
book = double("book", :pages => 250)
allow(book).to receive(:title) { "The RSpec Book" }
it "calculates the read time" do
book = double("book")
expect(book).to receive(:read_time) { 12.4 }
user.reads(book)
end
Track: Developers
#CNX14
Artifice
# Gemfile
gem 'artifice'
# test file
class MockEndpoint < Sinatra::Base
get "/endpoint" do
"foo bar"
end
end
Artifice.activate_with(MockEndpoint) do
# make some requests using Net::HTTP
end
Track: Developers
#CNX14
rspec-rails
RSpec.describe User, :type => :model do
it "orders by last name" do
lindeman = User.create!(first_name: "Andy", last_name: "Lindeman")
chelimsky = User.create!(first_name: "David", last_name: "Chelimsky")
expect(User.ordered_by_last_name).to eq([chelimsky, lindeman])
end
end
Track: Developers
#CNX14
rspec-rails
RSpec.describe PostsController, :type => :controller do
describe "GET #index" do
it "responds successfully with an HTTP 200 status code" do
get :index
expect(response).to be_success
expect(response).to have_http_status(200)
end
end
end
Track: Developers
#CNX14
#CNX14
Frontend Development
Track: Developers
#CNX14
ember.js
# Gemfile
gem 'ember-rails'
$ bin/rails generate ember:bootstrap
in app/assets/javascripts/:
controllers/
helpers/
components/
models/
routes/
templates/components
views/
Track: Developers
#CNX14
#CNX14
Security
Track: Developers
#CNX14
Screenshot description here.Container resizes as needed
PLACEHOLDER SCREEN
Track: Developers
#CNX14
#CNX14
Miscellaneous
Track: Developers
#CNX14
require 'pismo'
require 'sentimental'
require 'ots'
require 'tokenizer'
class Article
def summarize
doc = Pismo::Document.new(self.url)
sent = Sentimental.new
tokenizer = Tokenizer::Tokenizer.new
tokens = tokenizer.tokenize(doc.body)
poly_syl = tokens.select {|word| Lingua::EN::Syllable.syllables(word) >= 3 }.size
self.title = doc.title
self.image = doc.images.blank? ? nil : doc.images.first
self.topics = OTS.parse(doc.body).topics
self.sentiment = sent.get_sentiment(doc.body)
self.words = tokens.size
self.difficulty = smog(poly_syl, doc.sentences.size || 1) / 12
wpm = (200 - 100 * self.difficulty) || 1
self.minutes = (self.words / wpm.to_f).ceil
end
end
Track: Developers
#CNX14
#CNX14
Future
Track: Developers
#CNX14
the metal \m/
• separate middleware• API for request/response objects• request has read I/O for post body• response has write I/O for output
Track: Developers
#CNX14
Ruby 3.0
• Concurrency
• JIT compiler
• Static Typing
Track: Developers
#CNX14
#CNX14
Wrapup
Track: Developers
#CNX14
Ruby is not young. It may not even be hip, but it has a rich 20 year history.
Track: Developers
#CNX14
There are many implementations of Ruby that can fit all shapes, sizes, and purposes.
Track: Developers
#CNX14
There's a vibrant ecosystem of libraries, tools, and practices surrounding Ruby.
Track: Developers
#CNX14
Ruby has a rich history.
There's a Ruby for all kinds of shapes and
sizes.
There's a vibrant ecosystem of
libraries, tools, and practices surrounding
Ruby.
Recap Slide
1 2 3
Track: Developers
#CNX14
Track: Developers
#CNX14
Questions?
Track: Developers
#CNX14
One more thing...
Track: Developers
#CNX14
Friday Hug!
Track: Developers
#CNX14
Track: Developers
#CNX14
CUSTOMER JOURNEY SHOWCASE
MARKETING THOUGHT LEADERS
EMAIL MARKETING PRODUCT STRATEGY& ROADMAP
PERSONAL TRANSFORMATION
& GROWTH
SOCIAL MARKETING MOBILE & WEB MARKETING
DEVELOPERS HANDS-ON TRAINING
INDUSTRY TRENDSETTERS
CREATIVITY & INNOVATION
SALESFORCE FOR MARKETERS
ROUNDTABLES