the enterprise strikes back
DESCRIPTION
Mostly the same talk as my earlier version with the same title for SDEC11, but this one was updated a little bit for Prairie Dev Con in November 2011.TRANSCRIPT
![Page 1: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/1.jpg)
The EnterpriseStrikes Back
The EnterpriseStrikes Back
BurkeLibbey
StefanPenner
Wednesday, 23 November, 11
![Page 2: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/2.jpg)
BurkeLibbey
StefanPenner
Wednesday, 23 November, 11
![Page 3: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/3.jpg)
Burke Libbey@burkelibbey
Stefan Penner@stefanpenner
Wednesday, 23 November, 11
![Page 4: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/4.jpg)
Burke Libbey@burkelibbey
Stefan Penner@stefanpenner
Wednesday, 23 November, 11
![Page 5: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/5.jpg)
Burke Libbey@burkelibbey
Stefan Penner@stefanpenner
Wednesday, 23 November, 11
![Page 6: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/6.jpg)
Overview• Core concepts
• Ruby on the JVM (and the CLR, sort of)
• Data
• Integration
• Deployment
• Sysadmin
• The Cloud
Wednesday, 23 November, 11
![Page 7: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/7.jpg)
Ruby’s weaknesses
• Poor performance
• Type system sometimes causes headaches in large codebases
• No compiler to catch certain bugsBut your tests catch these, right?
Wednesday, 23 November, 11
![Page 8: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/8.jpg)
Why ruby is slow
• Late method lookup
• Lots of context tracking to allow for eval
• Stop-the-world Mark & Sweep GC
• Runtime modification of code
Wednesday, 23 November, 11
![Page 9: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/9.jpg)
Ruby’s strengths
• Developing working code quickly
• Reducing incidental complexityEspecially when best practices are adhered to
• Ease of developing powerful libraries and succinct DSLs
Wednesday, 23 November, 11
![Page 10: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/10.jpg)
Uniform Access Principle
All services o!ered by a module should be available through a uniform notation, which does not betray whether they are implemented through storage or through computation.
- Bertrand Meyer
Wednesday, 23 November, 11
![Page 11: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/11.jpg)
Two Rules
• Everything is an object
• Objects expose methods and only methods
Wednesday, 23 November, 11
![Page 12: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/12.jpg)
Wednesday, 23 November, 11
![Page 13: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/13.jpg)
</background>
Wednesday, 23 November, 11
![Page 14: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/14.jpg)
Ruby Java
+ Productive- Scary
+ Not Scary- Less productive
Wednesday, 23 November, 11
![Page 15: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/15.jpg)
Ruby in Java
+ Not Scary+ Productive
Wednesday, 23 November, 11
![Page 16: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/16.jpg)
http://jruby.org
Wednesday, 23 November, 11
![Page 17: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/17.jpg)
• Full ruby implementation on the JVM
• Access to both ruby and Java libraries
• Can be deployed to existing Java infrastructure
Wednesday, 23 November, 11
![Page 18: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/18.jpg)
The many flavours of ruby
• MRI (and YARV)
• JRuby
• IronRuby
• MacRuby
• Rubinius
• ...and several more...
Wednesday, 23 November, 11
![Page 19: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/19.jpg)
java.lang.System.out.println("Hello World")
Wednesday, 23 November, 11
![Page 20: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/20.jpg)
The Magic Sauce
require 'java'(contains up to 30% midichlorians)
Wednesday, 23 November, 11
![Page 21: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/21.jpg)
Calling Java from ruby
f = javax.swing.JFrame.newf.getContentPane.add(javax.swing.JLabel.new("Hello World"))close_operation = javax.swing.JFrame::EXIT_ON_CLOSEf.setDefaultCloseOperation(close_operation)f.packf.setVisible(true)
Wednesday, 23 November, 11
![Page 22: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/22.jpg)
Impedance Mismatch
f = javax.swing.JFrame.new
close_operation = javax.swing.JFrame::EXIT_ON_CLOSEf.setDefaultCloseOperation(close_operation)f.packf.setVisible(true)
Let’s break this down.
f.getContentPane.add(javax.swing.JLabel.new("Hello World"))
Wednesday, 23 November, 11
![Page 23: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/23.jpg)
Impedance Mismatch
f = javax.swing.JFrame.newf.getContentPane.add(javax.swing.JLabel.new("Hello World"))close_operation = javax.swing.JFrame::EXIT_ON_CLOSEf.setDefaultCloseOperation(close_operation)f.packf.setVisible(true)
getContentPane
“Getters” and “Setters” are non-idiomatic in ruby.
snake_case is generally preferred to CamelCase
Wednesday, 23 November, 11
![Page 24: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/24.jpg)
Impedance Mismatch
f = javax.swing.JFrame.newf. .add(javax.swing.JLabel.new("Hello World"))close_operation = javax.swing.JFrame::EXIT_ON_CLOSEf.setDefaultCloseOperation(close_operation)f.packf.setVisible(true)
content_pane
JavaBean properties can be accessed like this:
“get” disappears, CamelCase changes to snake_case(UA P in action!)
Wednesday, 23 November, 11
![Page 25: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/25.jpg)
Impedance Mismatch
f = javax.swing.JFrame.newf. .add(javax.swing.JLabel.new("Hello World"))close_operation = javax.swing.JFrame::EXIT_ON_CLOSEf. close_operationf.packf. true
content_pane
default_close_operation =
visible =
“set” is replaced by “=”
“setDefaultCloseOperation(x)”becomes
“default_close_operation = x”
Wednesday, 23 November, 11
![Page 26: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/26.jpg)
Ugliness Abounds
f = javax.swing.JFrame.newf.content_pane.add(javax.swing.JLabel.new("Hello World"))close_operation = javax.swing.JFrame::EXIT_ON_CLOSEf.default_close_operation = close_operationf.packf.visible = true
Namespaces everywhere!
javax.swing. javax.swing. javax.swing.
Wednesday, 23 November, 11
![Page 27: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/27.jpg)
Ugliness Abounds
f = JFrame.newf.content_pane.add(JLabel.new("Hello World"))close_operation = JFrame::EXIT_ON_CLOSEf.default_close_operation = close_operationf.packf.visible = true
java_import adds classes to a ruby context
java_import 'javax.swing.JFrame'java_import 'javax.swing.JLabel' JFrame.new JLabel.new JFrame::EXIT_ON_CLOSE
Wednesday, 23 November, 11
![Page 28: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/28.jpg)
100% Rubified™
java_import 'javax.swing.JFrame'java_import 'javax.swing.JLabel'
JFrame.new.tap do |f| f.content_pane.add JLabel.new("Hello World") f.default_close_operation = JFrame::EXIT_ON_CLOSE f.pack f.visible = trueend
Wednesday, 23 November, 11
![Page 29: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/29.jpg)
Method Rubification™
• In general, CamelCase Java methods can optionally be transliterated to snake case.
Wednesday, 23 November, 11
![Page 30: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/30.jpg)
Method Rubification™
JavaRuby
System.currentTimeMillis()
System.current_time_millis
Wednesday, 23 November, 11
![Page 31: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/31.jpg)
Method Rubification™
JavaRuby
person.getName()
person.name
Seriously though, not actually trademarked.
Wednesday, 23 November, 11
![Page 32: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/32.jpg)
Method Rubification™
JavaRuby
person.setAge(42)
person.age = 42
Someone shouldget on that.
Wednesday, 23 November, 11
![Page 33: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/33.jpg)
Method Rubification™
Java person.isJedi()
person.jedi?Ruby
FALSE! TRUE!
Wednesday, 23 November, 11
![Page 34: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/34.jpg)
Is ruby an acceptable Java?
• Most Java code can literally be written as ruby with few high-level changes.
• A more relaxed type system and syntax often has productivity benefits.
(http://bit.ly/pfNluA)
Wednesday, 23 November, 11
![Page 35: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/35.jpg)
Exhibit A// interfaces = HashMap{ label => NetworkInterface }Collection c = interfaces.values();Iterator itr = c.iterator();
while(itr.hasNext()) { NetworkInterface interface = itr.next(); if (interface.isLoopback()) { return interface.getDisplayName(); }}
# interfaces = {label => NetworkInterface}interfaces.values.find(&:loopback?).display_name
VS.
Java
Ruby
Wednesday, 23 November, 11
![Page 36: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/36.jpg)
Exhibit A// interfaces = HashMap{ label => NetworkInterface }Collection c = interfaces.values();Iterator itr = c.iterator();
while(itr.hasNext()) { NetworkInterface interface = itr.next(); if (interface.isLoopback()) { return interface.getDisplayName(); }}
# interfaces = {label => NetworkInterface}interfaces.values.find(&:loopback?).display_name
VS.
Java
Ruby 1 2 3 4 5 6 7
Only 7 characters of syntactic support!
Wednesday, 23 November, 11
![Page 37: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/37.jpg)
“Are you suggesting I write all my Java in ruby?!”
• Not really...
• JRuby is much slower than Java (doesn’t matter as often as you’d think)
• Ruby’s added expressiveness makes it easier to shoot yourself in the foot.(or, in fact, to lazily clone an infinite number of your feet every planck length between your gun and your target)
Wednesday, 23 November, 11
![Page 38: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/38.jpg)
• ...but maybe sometimes.
• One possibility:
• Encode high-level logic in expressive and concise ruby code
• Supporting code in fast, safe Java
• Mix and match as appropriate
“Are you suggesting I write all my Java in ruby?!”
Wednesday, 23 November, 11
![Page 39: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/39.jpg)
Ruby as Glue
• Ruby is great for:
• wiring existing codebases together
• other miscellaneous tasks
Wednesday, 23 November, 11
![Page 40: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/40.jpg)
PerlThe original
“Swiss Army Knife”
Wednesday, 23 November, 11
![Page 41: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/41.jpg)
Perl• “glue”
• “duct tape”
• “swiss army knife”
Pretty much mean the same thing.
Wednesday, 23 November, 11
![Page 42: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/42.jpg)
Perl Ruby
Wednesday, 23 November, 11
![Page 43: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/43.jpg)
Subcategories of “Glue”
• Wiring stu! together
• Sysadmin tasks
Wednesday, 23 November, 11
![Page 44: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/44.jpg)
Wiring stu! together
• There’s a lot we could cover here, but:
Wednesday, 23 November, 11
![Page 45: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/45.jpg)
Nokogiri
• An extremely user-friendly XML library
• fast! (wraps libxml2)
Wednesday, 23 November, 11
![Page 46: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/46.jpg)
Nokogiri
require 'open-uri'require 'nokogiri'html = open("http://slashdot.org").readdoc = Nokogiri::XML(html)(doc/".story a").each do |link| puts "#{link.text} (#{link.attr('href')})"end
# Britain's Broadband Censors: a Bunch of Students (//yro.slashdot...# ...
Wednesday, 23 November, 11
![Page 47: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/47.jpg)
Don’t do this.
(Nokogiri::XML(open("http://slashdot.org").read)/".story a").each{|a|puts "#{a.text} (#{a.attr("href")})"}
Wednesday, 23 November, 11
![Page 48: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/48.jpg)
Sysadmin with Ruby
• Nice system APIs(quite similar to perl’s)
• System provisioning libraries/DSLs
Wednesday, 23 November, 11
![Page 49: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/49.jpg)
Provisioning systems
• Puppet
• Chef
• Vagrant
Wednesday, 23 November, 11
![Page 50: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/50.jpg)
Puppet
• Describe system, and puppet sets it up
• Nontrivial, but the general idea is:
• I want mysql
• I want nginx < 0.8
• I want this cron job: “....”
• Go.
http://puppetlabs.com/
Wednesday, 23 November, 11
![Page 51: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/51.jpg)
Puppetclass postgres-server { package { postgresql-server: ensure => latest } group { postgres: gid => 26 } user { postgres: comment => "PostgreSQL Server", uid => 26, gid => 26, home => "/var/lib/pgsql", shell => "/bin/bash" } service { postgresql: running => true, pattern => "/usr/bin/postmaster", require => package["postgresql-server"] }}
Wednesday, 23 November, 11
![Page 52: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/52.jpg)
Puppet
• Fantastic for defining a reproducible production environment
Wednesday, 23 November, 11
![Page 53: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/53.jpg)
Chef
• Same idea as puppet
• Somewhat less powerful
• Slightly more approachable to most ruby developers
http://www.opscode.com/chef/
Wednesday, 23 November, 11
![Page 54: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/54.jpg)
Chefpackage "sudo" do action :upgradeend
template "/etc/sudoers" do source "sudoers.erb" mode 0440 owner "root" group "root" variables( :sudoers_groups => node['authorization']['sudo']['groups'], :sudoers_users => node['authorization']['sudo']['users'], :passwordless => node['authorization']['sudo']['passwordless'] )end
Wednesday, 23 November, 11
![Page 55: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/55.jpg)
Puppet Chef
Configuration Language custom ruby
Targeted at production production
“Powerfulness” Lots Mostly lots
Verdict Good Di!erent
Written in ruby ruby
Wednesday, 23 November, 11
![Page 56: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/56.jpg)
Vagrant
• Uses puppet and/or chef
• End product is a virtual machine for development use
• Consistent system for all developers, per project
Wednesday, 23 November, 11
![Page 57: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/57.jpg)
Vagrant
• If you use puppet or chef, vagrant lets you test production locally
Wednesday, 23 November, 11
![Page 58: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/58.jpg)
Suggestions
• As a non-ruby-dev:
• Use puppet
• Consider vagrant
Wednesday, 23 November, 11
![Page 59: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/59.jpg)
Suggestions
• As a ruby developer:
• Consider chef and puppet, use whichever suits your taste and needs
• Consider vagrant
Wednesday, 23 November, 11
![Page 60: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/60.jpg)
Databases
Wednesday, 23 November, 11
![Page 61: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/61.jpg)
In the Real World,
Wednesday, 23 November, 11
![Page 62: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/62.jpg)
In the Real World,
We have Data
Wednesday, 23 November, 11
![Page 63: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/63.jpg)
In the Real World,
We have Data
Which lives in Databases
Wednesday, 23 November, 11
![Page 64: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/64.jpg)
Databases Are Always simple
Wednesday, 23 November, 11
![Page 65: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/65.jpg)
All our data is
ALWAYS in the same DBMS
Wednesday, 23 November, 11
![Page 66: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/66.jpg)
Reality Check
Wednesday, 23 November, 11
![Page 67: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/67.jpg)
LuckilyWe have
ODBC + JDBC
Wednesday, 23 November, 11
![Page 68: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/68.jpg)
LuckilyWe have
ODBC + JDBC
+Ruby
Wednesday, 23 November, 11
![Page 69: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/69.jpg)
Ruby Gives you Options
• Active Record
• Sequel
• DataMapper
• more
Wednesday, 23 November, 11
![Page 70: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/70.jpg)
Active RecordDesign pattern coined by Martin Fowler in “Patterns of enterprise application architecture”.
Also, Ruby on Rails’s default ORM.
https://github.com/rails/rails/tree/master/activerecord
• Lots of Power• Lots of Opinion• Might fight with you (for non-standard uses)
Wednesday, 23 November, 11
![Page 71: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/71.jpg)
Active Record Syntax (Raw)
require 'active_record'
ActiveRecord::Base.establish_connection({ :adapter => 'mysql', :database => 'test_database', :username => 'tester', :password => 'test22'})
connection = ActiveRecord::Base.connection
connection.tables> ['users', 'products', 'ducks', 'oranges']
users = [] connection.execute('SELECT * FROM users').each_hash do |user| users << userend
users> .... array of users, each user as a hash.
users.first> { :id => 1, :username => 'stefan', :password => 'is_super_secure' }
Wednesday, 23 November, 11
![Page 72: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/72.jpg)
require 'active_record'
ActiveRecord::Base.establish_connection({ :adapter => 'mysql', :database => 'test_database', :username => 'tester', :password => 'test22'})
# class <camel_case_singular_table_name> < ActiveRecord::Baseclass User < ActiveRecord::Base # if the table's name does not fit convention, it can be manually overridden. # table_name :users_tableend
User.first> #<User id: 2, :name => 'stefan', :password => 'is_super_secure' >
User.find(2)> #<User id: 2, :name => 'stefan', :password => 'is_super_secure' >
User.where(:name => 'stefan')> #<User id: 2, :name => 'stefan', :password => 'is_super_secure' >
Active Record Syntax (ORM)
Wednesday, 23 November, 11
![Page 73: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/73.jpg)
Active Record Syntax (AREL)
User.first> #<User id: 2, :name => 'stefan', :password => 'is_super_secure' >
User.find(2)> #<User id: 2, :name => 'stefan', :password => 'is_super_secure' >
User.where(:name => 'stefan')> #<User id: 2, :name => 'stefan', :password => 'is_super_secure' >
User.where(:name => 'stefan').order('id ASC')> #<User id: 2, :name => 'stefan', :password => 'is_super_secure' >
Wednesday, 23 November, 11
![Page 74: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/74.jpg)
SequelElegant Full featured database toolkit for ruby.
http://sequel.rubyforge.org/
Supports- ADO, Amalgalite, DataObjects, DB2, DBI, DO, Firebird, ibmdb, Informix, JDBC, MySQL, Mysql2, ODBC, OpenBase, Oracle, PostgreSQL, SQLite3, Swift, and tinytds
• Supports a ton of DBMS’s• DSL• ORM
Wednesday, 23 November, 11
![Page 75: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/75.jpg)
Sequel Examplerequire "sequel"
# connect to an in-memory databaseDB = Sequel.sqlite
# create an items tableDB.create_table :items do primary_key :id String :name Float :priceend
# create a dataset from the items tableitems = DB[:items]
# populate the tableitems.insert(:name => 'abc', :price => rand * 100)items.insert(:name => 'def', :price => rand * 100)items.insert(:name => 'ghi', :price => rand * 100)
# print out the number of recordsputs "Item count: #{items.count}"
# print out the average priceputs "The average price is: #{items.avg(:price)}"
Wednesday, 23 November, 11
![Page 76: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/76.jpg)
Sequel ORMrequire "sequel"
# connect to an in-memory databaseDB = Sequel.sqlite
# create an items tableDB.create_table :items do primary_key :id String :name Float :priceend
# create a dataset from the items tableclass Item < Sequel::Model(:items) # associations # validations end
# populate the tableItem.create(:name => 'abc', :price => rand * 100)Item.create(:name => 'def', :price => rand * 100)Item.create(:name => 'ghi', :price => rand * 100)
# print out the number of recordsputs "Item count: #{Item.count}"
# print out the average priceputs "The average price is: #{Item.avg(:price)}"
Wednesday, 23 November, 11
![Page 77: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/77.jpg)
ready out of the box
Sequel ORM
+jRuby
Wednesday, 23 November, 11
![Page 78: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/78.jpg)
apparently works?
Sequel ORM
+IRONRuby
Wednesday, 23 November, 11
![Page 79: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/79.jpg)
Case Study (Access)
• Access (top 2 solutions)
• Solution 1 (Cross Platform)
• jRuby
• JDBC
• HXTT’s driver (www.hxtt.com)
• Sequel
• Solution 2 (Windows Only)
• Ruby
• ADO via WIN32OLE
• Sequel
Wednesday, 23 November, 11
![Page 80: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/80.jpg)
Case Study (Access)
Wednesday, 23 November, 11
![Page 81: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/81.jpg)
1. Download jRuby http://jruby.org/
Case Study (Access)
Wednesday, 23 November, 11
![Page 82: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/82.jpg)
1. Download jRuby http://jruby.org/
2. Install Sequel gem install Sequel
Case Study (Access)
Wednesday, 23 November, 11
![Page 83: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/83.jpg)
1. Download jRuby http://jruby.org/
2. Install Sequel gem install Sequel
3. Download JDBC Access Driverhttp://www.hxtt.com/access.html
Case Study (Access)
Wednesday, 23 November, 11
![Page 84: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/84.jpg)
Case Study (Access)require 'rubygems'require 'sequel'require 'sequel/adapters/jdbc'require 'sequel/jdbc_hxtt_adapter'require '../Support/Access_JDBC40.jar'
root = File.expand_path "../../", __FILE__path_to_db = root + "/Support/AccessThemeDemo.mdb"DB = Sequel.connect("jdbc:access:////#{path_to_db}")puts DB.tables
class Notes < Sequel::Model(:Notes)end
class ThemeImages < Sequel::Model(:tbl_ThemeImages)end
class Users < Sequel::Model(:tbl_Users)end
Wednesday, 23 November, 11
![Page 85: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/85.jpg)
ba-da-bing
Wednesday, 23 November, 11
![Page 86: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/86.jpg)
But our new appand our old database
have di!erent system requirements.
Wednesday, 23 November, 11
![Page 87: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/87.jpg)
We Want Isolation
Wednesday, 23 November, 11
![Page 88: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/88.jpg)
We Want Isolation-_NeedWednesday, 23 November, 11
![Page 89: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/89.jpg)
Power by.. Sinatra
used at linkedInhttp://engineering.linkedin.com/44/linkedin-app-end-end-jruby-frontier-and-voldemort
Web DSL
get '/pictures' do ['picture1','picture2','picture2']end
post '/pictures' {}put '/pictures/:id' {}delete '/pictures/:id' {}
Wednesday, 23 November, 11
![Page 90: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/90.jpg)
sooo... big deal?
Wednesday, 23 November, 11
![Page 91: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/91.jpg)
RestServer
• any jdbc database into a restful json service
• https://github.com/stefanpenner/restserver
Wednesday, 23 November, 11
![Page 92: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/92.jpg)
Portability/Bundling
• Warbler
http://github.com/nicksieger/warbler
• single jar/war file
• compiled (if needed)
Wednesday, 23 November, 11
![Page 93: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/93.jpg)
it’s an app!it’s an app!
Wednesday, 23 November, 11
![Page 94: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/94.jpg)
Putting it all together (p1)
ScreenShotrdownload:
https://github.com/stefanpenner/screenshotr/zipball/master
[email protected]:stefanpenner/screenshotr
Wednesday, 23 November, 11
![Page 95: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/95.jpg)
Sorry, contrived example!
Wednesday, 23 November, 11
![Page 96: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/96.jpg)
anyways...Wednesday, 23 November, 11
![Page 97: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/97.jpg)
Java Gives Us• Portability
Ruby Gives Us• Happiness
Wednesday, 23 November, 11
![Page 98: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/98.jpg)
ScreenShotr
• screen capture
• GUI
Normally Annoying re: Portability
but thx jRubyWednesday, 23 November, 11
![Page 99: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/99.jpg)
Lets Shoot some Screensrequire 'java'
java_import 'java.awt.Robot'java_import 'java.awt.Toolkit'java_import 'java.awt.Rectangle'java_import 'java.awt.Image'java_import 'java.awt.image.BufferedImage'java_import 'javax.imageio.ImageIO'
screenRect = Rectangle.new(Toolkit.default_toolkit.getScreenSize())capture = Robot.new.createScreenCapture(screenRect)
ImageIO.write(capture,'jpg',java.io.File.new('some_tmp_file.jpg'))
Wednesday, 23 November, 11
![Page 100: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/100.jpg)
Hold UP
Wednesday, 23 November, 11
![Page 101: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/101.jpg)
Hold UPjava_import ?
Wednesday, 23 November, 11
![Page 102: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/102.jpg)
Hold UPjava_import ?
why not require?
Wednesday, 23 November, 11
![Page 103: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/103.jpg)
Hold UPjava_import ?
why not require?requiring classes just makes them discoverable later.
Wednesday, 23 November, 11
![Page 104: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/104.jpg)
Hold UPjava_import ?
why not import?
why not require?requiring classes just makes them discoverable later.
Wednesday, 23 November, 11
![Page 105: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/105.jpg)
Hold UPjava_import ?
why not import?Rake defines import
why not require?requiring classes just makes them discoverable later.
Wednesday, 23 November, 11
![Page 106: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/106.jpg)
Hold UPjava_import ?
why not import?Rake defines import
why not require?requiring classes just makes them discoverable later.
weird...Wednesday, 23 November, 11
![Page 107: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/107.jpg)
And fill some clipboards
require 'java'
java_import 'java.awt.Toolkit'java_import 'javax.imageio.ImageIO'
ss = StringSelection.new(public_url) Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, nil)
Wednesday, 23 November, 11
![Page 108: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/108.jpg)
upload to servergem install rest-client
require 'rubygems'
require 'rest-client'
RestClient.post('http://../resource', :file => File.new('path/to/file'))
Wednesday, 23 November, 11
![Page 109: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/109.jpg)
upload to servergem install rest-client
require 'rubygems'
require 'rest-client'
RestClient.post('http://../resource', :file => File.new('path/to/file'))
Wednesday, 23 November, 11
![Page 110: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/110.jpg)
<Insert Segue Here>
Wednesday, 23 November, 11
![Page 111: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/111.jpg)
...and Vice Versa
• We’ve done a lot of calling Java from ruby.
• The reverse is possible as well.
Wednesday, 23 November, 11
![Page 112: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/112.jpg)
...and Vice Versa
http://en.wikipedia.org/wiki/Jruby
import org.jruby.embed.InvokeFailedException;import org.jruby.embed.ScriptingContainer;
// ...ScriptingContainer container = new ScriptingContainer();container.runScriptlet("puts \"That's no Moon\"");
Wednesday, 23 November, 11
![Page 113: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/113.jpg)
“i find your lack of tests disturbing.”
Testing Java with Ruby
Wednesday, 23 November, 11
![Page 114: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/114.jpg)
Testing Java with Ruby
• JtestR is wonderful
• Includes most of ruby’s leading testing libraries
• supports ant and maven
• easy to add to a project
• takes advantage of jruby/java bridge
Wednesday, 23 November, 11
![Page 115: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/115.jpg)
JtestR Installation
• Download jarfile from jtestr.codehaus.org
• Add to classpath
• Add a task to maven/ant
• Create tests in ./test or ./spec
• Run task
Wednesday, 23 November, 11
![Page 116: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/116.jpg)
import java.util.HashMap
describe "An empty", HashMap do before :each do @hash_map = HashMap.new end
it "accepts new entries" do @hash_map.put "foo", "bar" @hash_map.get("foo").should == "bar" end
it "returns a keyset iterator that throws an exception on next" do proc do @hash_map.key_set.iterator.next end.should raise_error(java.util.NoSuchElementException) endend
Example!
Wednesday, 23 November, 11
![Page 117: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/117.jpg)
BDD Any language
• Cucumber
• http://cukes.info
Wednesday, 23 November, 11
![Page 118: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/118.jpg)
“i saw a city in the clouds”
Wednesday, 23 November, 11
![Page 119: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/119.jpg)
MYTH: Ruby can’t scale.
Wednesday, 23 November, 11
![Page 120: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/120.jpg)
FACT: Ruby scales like a BOSS
Wednesday, 23 November, 11
![Page 121: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/121.jpg)
FACT: Ruby scales like a BOSS(because it has to)
Wednesday, 23 November, 11
![Page 122: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/122.jpg)
Fog
• “The Ruby Cloud Services Library”
• Lets you upload to S3, provision instances in EC2, set DNS records in DNSimple...
• ...and much more.
Wednesday, 23 November, 11
![Page 123: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/123.jpg)
whargarblbgarblgr-garblgragh
Fog
• Chewbacca-approved.
“ ”Wednesday, 23 November, 11
![Page 124: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/124.jpg)
whargarblbgarblgr-garblgragh
Fog
• Chewbacca-approved. (chewbaccaproved?)
“ ”Wednesday, 23 November, 11
![Page 125: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/125.jpg)
2.5 imperial tons of providers
Wednesday, 23 November, 11
![Page 126: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/126.jpg)
2.5 imperial tons of providersHeh.( )
Wednesday, 23 November, 11
![Page 127: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/127.jpg)
Wednesday, 23 November, 11
![Page 128: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/128.jpg)
Wednesday, 23 November, 11
![Page 129: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/129.jpg)
Wednesday, 23 November, 11
![Page 130: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/130.jpg)
Wednesday, 23 November, 11
![Page 131: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/131.jpg)
Wednesday, 23 November, 11
![Page 132: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/132.jpg)
Wednesday, 23 November, 11
![Page 133: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/133.jpg)
Wednesday, 23 November, 11
![Page 134: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/134.jpg)
Wednesday, 23 November, 11
![Page 135: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/135.jpg)
Wednesday, 23 November, 11
![Page 136: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/136.jpg)
Wednesday, 23 November, 11
![Page 137: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/137.jpg)
Wednesday, 23 November, 11
![Page 138: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/138.jpg)
Wednesday, 23 November, 11
![Page 139: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/139.jpg)
Wednesday, 23 November, 11
![Page 140: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/140.jpg)
Wednesday, 23 November, 11
![Page 141: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/141.jpg)
Wednesday, 23 November, 11
![Page 142: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/142.jpg)
Wednesday, 23 November, 11
![Page 143: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/143.jpg)
Wednesday, 23 November, 11
![Page 144: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/144.jpg)
Wednesday, 23 November, 11
![Page 145: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/145.jpg)
Wednesday, 23 November, 11
![Page 146: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/146.jpg)
Wednesday, 23 November, 11
![Page 147: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/147.jpg)
Wednesday, 23 November, 11
![Page 148: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/148.jpg)
Wednesday, 23 November, 11
![Page 149: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/149.jpg)
Wednesday, 23 November, 11
![Page 150: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/150.jpg)
Wednesday, 23 November, 11
![Page 151: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/151.jpg)
Sinatra Example
#config.rurequire './lib/screen_shotr/server'run ScreenShotr::Server.new
Wednesday, 23 November, 11
![Page 152: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/152.jpg)
require 'sinatra'require 'fog'require 'digest/sha1'
Wednesday, 23 November, 11
![Page 153: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/153.jpg)
module ScreenShotr class Server < Sinatra::Base def storage #@storage ||= Fog::Storage.new({ # :provider => 'AWS', # :aws_access_key_id => ACCESS_KEY_ID, # :aws_secret_access_key => SECRET_ACCESS_KEY})
@storage ||= Fog::Storage.new({ :local_root => '~/fog', :provider => 'Local' })
def directory storage.directories.find("data").first or storage.directories.create(:key => 'data' ) end
# snip ....
Wednesday, 23 November, 11
![Page 154: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/154.jpg)
get '/' do "hello, world!"end
Wednesday, 23 November, 11
![Page 155: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/155.jpg)
post '/picture/create' do file = params[:file] data = file[:tempfile]
#super secure filename filename = file[:filename]
key = Digest::SHA1.hexdigest("super random seed"+Time.now.to_s) key << '.jpg'
file = directory.files.create( :body => data.read, :key => key ) file.public_url or "http://0.0.0.0:9292/picture/#{key}"end
Wednesday, 23 November, 11
![Page 156: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/156.jpg)
get '/picture/:key' do file = directory.files.get(params[:key]) send_file file.send(:path)end
Wednesday, 23 November, 11
![Page 157: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/157.jpg)
rackup
Wednesday, 23 November, 11
![Page 158: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/158.jpg)
and...
Wednesday, 23 November, 11
![Page 159: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/159.jpg)
Wednesday, 23 November, 11
![Page 160: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/160.jpg)
Fog Storage: Kind of cool.
Wednesday, 23 November, 11
![Page 161: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/161.jpg)
Fog Compute: Wicked cool.
Wednesday, 23 November, 11
![Page 162: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/162.jpg)
Wednesday, 23 November, 11
![Page 163: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/163.jpg)
Wednesday, 23 November, 11
![Page 164: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/164.jpg)
Wednesday, 23 November, 11
![Page 165: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/165.jpg)
Wednesday, 23 November, 11
![Page 166: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/166.jpg)
Wednesday, 23 November, 11
![Page 167: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/167.jpg)
Wednesday, 23 November, 11
![Page 168: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/168.jpg)
Wednesday, 23 November, 11
![Page 169: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/169.jpg)
Wednesday, 23 November, 11
![Page 170: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/170.jpg)
Wednesday, 23 November, 11
![Page 171: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/171.jpg)
Wednesday, 23 November, 11
![Page 172: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/172.jpg)
Heroku
Cedar Stack (run “anything”)Classic Stack (run rack/rails)
Wednesday, 23 November, 11
![Page 173: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/173.jpg)
Heroku
Classic Stack (run rack/rails)
$ heroku createCreated sushi.herokuapp.com | [email protected]:sushi.git
$ git push heroku master-----> Heroku receiving push-----> Rails app detected-----> Compiled slug size is 8.0MB-----> Launching... done, v1http://sushi.herokuapp.com deployed to Heroku
Wednesday, 23 November, 11
![Page 174: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/174.jpg)
Heroku
$ cat Procfileweb: bundle exec rails server -p $PORTworker: bundle exec rake resque:work QUEUE=*urgentworker: bundle exec rake resque:work QUEUE=urgentclock: bundle exec clockwork clock.rb
$ heroku scale web=4 worker=2 urgentworker=1 clock=1Scaling processes... done
Cedar Stack (run “anything”)
Ruby, Node.js,Clojure, Java, Python, and Scala
“O!cially Everything”:
Wednesday, 23 November, 11
![Page 175: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/175.jpg)
Recap• Core concepts
• Ruby on the JVM (and the CLR, sort of)
• Data
• Integration
• Deployment
• Sysadmin
• The Cloud
Wednesday, 23 November, 11
![Page 176: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/176.jpg)
“help me ruby... you’re my only hope!”“help me ruby...
you’re my only hope!”Wednesday, 23 November, 11
![Page 177: The Enterprise Strikes Back](https://reader031.vdocuments.net/reader031/viewer/2022012922/54c7a7154a795949798b45b3/html5/thumbnails/177.jpg)
“good... the force is strong with you.
a powerful rubyist you will become.”
Thanks!
Wednesday, 23 November, 11