SlideShare una empresa de Scribd logo
1 de 41
Thursday, January 26, 2012
JRuby at Square
                                   A report



                                 Steve Conover
                                  Xavier Shay



Thursday, January 26, 2012
Context


Thursday, January 26, 2012
Rails
Thursday, January 26, 2012
Rails    Rack

                                            Java
                        Sinatra
                                     Java
                             Rails           Ruby


Thursday, January 26, 2012
Java
                             Deployment
                                Rails
                             Development


Thursday, January 26, 2012
Java Integration


Thursday, January 26, 2012
Not as immediately useful as we
                   thought it would be.




Thursday, January 26, 2012
Integrated with Neo4J libraries.




Thursday, January 26, 2012
Shared JVM experience is a win.




Thursday, January 26, 2012
Deployment
                              “What do you want our
                             infrastructure to look like
                                     in 2 years?”
                                      — Matthew



Thursday, January 26, 2012
“Warbler provides a minimal,
                    flexible, Ruby-like way to
                      bundle up all of your
                       application files for
                      deployment to a Java
                         environment.”


Thursday, January 26, 2012
“Trinidad allows you to run a
                    rails or rackup applications
                   within an embedded Apache
                         Tomcat container.”




Thursday, January 26, 2012
“Kirk is a wrapper around Jetty
   that hides all of the insanity and
    wraps your Rack application in
          a loving embrace.”



Thursday, January 26, 2012
“Also, Kirk is probably the least
               HTTP retarded ruby rack
                    server out there.”




Thursday, January 26, 2012
“Also, Kirk is probably the least
                              RECT rack
                       I   OR
               HTTP retarded ruby
                         NCout there.”
                    server




Thursday, January 26, 2012
“Mizuno is a set of Jetty-
                        powered running shoes for
                              JRuby/Rack.”




Thursday, January 26, 2012
None of these fit very well.




Thursday, January 26, 2012
“Jetpack uses standard ruby-
                world tools to prepare the app
                   for deployment, and then
                presents the ruby app to jetty
                as a Java EE web application.”



Thursday, January 26, 2012
Jetpack is stylistically similar
                          to alternatives.




Thursday, January 26, 2012
“…it's just that this style
                 works and many of the others
                        lead to failure.”
                             — Steve




Thursday, January 26, 2012
http://github.com/square/jetpack




Thursday, January 26, 2012
Rolling deploy to n servers
                       coordinated with haproxy.




Thursday, January 26, 2012
One process with real threads
                            rocks.




Thursday, January 26, 2012
Rails


Thursday, January 26, 2012
“girl_friday is a Ruby
                             library for performing
                              asynchronous tasks.”




Thursday, January 26, 2012
Thread-safe mode is not widely
                         used.




Thursday, January 26, 2012
Thread-safe mode is not widely
                         tested.




Thursday, January 26, 2012
We learned through high
           concurrency load testing that
          Arel had a non-threadsafe design.




Thursday, January 26, 2012
can't add a new key into hash during iteration

             /rails-77dcf76f142b/activesupport/lib/active_support/
             dependencies.rb:528:in `[]='




                             https://github.com/rails/rails/issues/3817


Thursday, January 26, 2012
Development


Thursday, January 26, 2012
> rvm use jruby
                        > time ruby -e ''
                        ruby -e '' 1.07s user 0.28s
                        system 95% cpu 1.412 total

                        > rvm use 1.9.3
                        > time ruby -e ''
                        ruby -e '' 0.01s user 0.00s
                        system 63% cpu 0.027 total




Thursday, January 26, 2012
#!/bin/bash
                        # script/ci

                        source "$HOME/.rvm/scripts/rvm"

                        function install_ruby_if_needed() {
                          if ! rvm list rubies | grep $1 > /dev/null; then
                             rvm install $1
                          fi
                        }

                        function switch_ruby() {
                          install_ruby_if_needed $1 && rvm use $1
                        }

                        function prepare_and_run() {
                          switch_ruby $1 &&
                          install_bundler_if_needed &&
                          update_gems_if_needed &&
                          run_tests
                        }

                        prepare_and_run "1.9.3-p0" &&
                        prepare_and_run "jruby-1.6.5"



Thursday, January 26, 2012
# Gemfile

                             platforms :ruby do
                               gem 'mysql2'
                             end

                             platforms :jruby do
                               gem 'jdbc-mysql'
                               gem "jruby-openssl", "~> 0.7"
                             end




Thursday, January 26, 2012
def normalize_sql_result(result)
                         if jruby?
                           result.map(&:values)
                         else
                           result
                         end
                       end




Thursday, January 26, 2012
result = if jruby?
                    IO.popen4(cmd) {|_, _, _, _| }
                    $?
                  else
                    pid = Process.spawn(cmd,
                       STDERR => '/dev/null')
                    Process.waitpid2(pid)[1]
                  end




Thursday, January 26, 2012
The cost of cross-ruby
                              compatibility is low.




Thursday, January 26, 2012
We have apps in both
                                 1.8 and 1.9.




Thursday, January 26, 2012
Java
                             Deployment
                                Rails
                             Development


Thursday, January 26, 2012
Final Thoughts
         “What’s the word for ‘you should
         probably use it, unless you have a
              good reason not to?’”
                                 — Steve


Thursday, January 26, 2012
Final Thoughts
                                @sconover
                                 @xshay




Thursday, January 26, 2012

Más contenido relacionado

Similar a JRuby at Square

Functional Scala 2022 - scalajs Alexis.pdf
Functional Scala 2022 - scalajs Alexis.pdfFunctional Scala 2022 - scalajs Alexis.pdf
Functional Scala 2022 - scalajs Alexis.pdf
ssusercd195b
 
Node.js, toy or power tool?
Node.js, toy or power tool?Node.js, toy or power tool?
Node.js, toy or power tool?
Ovidiu Dimulescu
 
Best Practices - Seeqnce - 23/24-02-2012
Best Practices - Seeqnce - 23/24-02-2012Best Practices - Seeqnce - 23/24-02-2012
Best Practices - Seeqnce - 23/24-02-2012
Youssef Chaker
 
GitHub Notable OSS Project
GitHub  Notable OSS ProjectGitHub  Notable OSS Project
GitHub Notable OSS Project
roumia
 

Similar a JRuby at Square (20)

JRuby - Programmer's Best Friend on JVM
JRuby - Programmer's Best Friend on JVMJRuby - Programmer's Best Friend on JVM
JRuby - Programmer's Best Friend on JVM
 
Building web apps with node.js, socket.io, knockout.js and zombie.js - Codemo...
Building web apps with node.js, socket.io, knockout.js and zombie.js - Codemo...Building web apps with node.js, socket.io, knockout.js and zombie.js - Codemo...
Building web apps with node.js, socket.io, knockout.js and zombie.js - Codemo...
 
JRuby and Google App Engine
JRuby and Google App EngineJRuby and Google App Engine
JRuby and Google App Engine
 
node.js in action
node.js in actionnode.js in action
node.js in action
 
Building a compiler in JRuby
Building a compiler in JRubyBuilding a compiler in JRuby
Building a compiler in JRuby
 
RoR app for dummies
RoR app for dummiesRoR app for dummies
RoR app for dummies
 
Scala
ScalaScala
Scala
 
Java, Ruby & Rails
Java, Ruby & RailsJava, Ruby & Rails
Java, Ruby & Rails
 
CLOUD LOCK-IN AND THE MYTH OF OPEN APIS at Structure 2012
CLOUD LOCK-IN AND THE MYTH OF OPEN APIS at Structure 2012CLOUD LOCK-IN AND THE MYTH OF OPEN APIS at Structure 2012
CLOUD LOCK-IN AND THE MYTH OF OPEN APIS at Structure 2012
 
Functional Scala 2022 - scalajs Alexis.pdf
Functional Scala 2022 - scalajs Alexis.pdfFunctional Scala 2022 - scalajs Alexis.pdf
Functional Scala 2022 - scalajs Alexis.pdf
 
Jaoo Michael Neale 09
Jaoo Michael Neale 09Jaoo Michael Neale 09
Jaoo Michael Neale 09
 
Ruby on Rails All Hands Meeting
Ruby on Rails All Hands MeetingRuby on Rails All Hands Meeting
Ruby on Rails All Hands Meeting
 
Node.js, toy or power tool?
Node.js, toy or power tool?Node.js, toy or power tool?
Node.js, toy or power tool?
 
Bitter Java, Sweeten with JRuby
Bitter Java, Sweeten with JRubyBitter Java, Sweeten with JRuby
Bitter Java, Sweeten with JRuby
 
Aegir
AegirAegir
Aegir
 
Best Practices - Seeqnce - 23/24-02-2012
Best Practices - Seeqnce - 23/24-02-2012Best Practices - Seeqnce - 23/24-02-2012
Best Practices - Seeqnce - 23/24-02-2012
 
Ruby on rails toolbox
Ruby on rails toolboxRuby on rails toolbox
Ruby on rails toolbox
 
What is Node and Why does it Matter?
What is Node and Why does it Matter?What is Node and Why does it Matter?
What is Node and Why does it Matter?
 
GitHub Notable OSS Project
GitHub  Notable OSS ProjectGitHub  Notable OSS Project
GitHub Notable OSS Project
 
A jar-nORM-ous Task
A jar-nORM-ous TaskA jar-nORM-ous Task
A jar-nORM-ous Task
 

Más de Marakana Inc.

Behavior Driven Development
Behavior Driven DevelopmentBehavior Driven Development
Behavior Driven Development
Marakana Inc.
 
Why Java Needs Hierarchical Data
Why Java Needs Hierarchical DataWhy Java Needs Hierarchical Data
Why Java Needs Hierarchical Data
Marakana Inc.
 
Pictures from "Learn about RenderScript" meetup at SF Android User Group
Pictures from "Learn about RenderScript" meetup at SF Android User GroupPictures from "Learn about RenderScript" meetup at SF Android User Group
Pictures from "Learn about RenderScript" meetup at SF Android User Group
Marakana Inc.
 
2010 07-18.wa.rails tdd-6
2010 07-18.wa.rails tdd-62010 07-18.wa.rails tdd-6
2010 07-18.wa.rails tdd-6
Marakana Inc.
 
Graphicsand animations devoxx2010 (1)
Graphicsand animations devoxx2010 (1)Graphicsand animations devoxx2010 (1)
Graphicsand animations devoxx2010 (1)
Marakana Inc.
 

Más de Marakana Inc. (20)

Behavior Driven Development
Behavior Driven DevelopmentBehavior Driven Development
Behavior Driven Development
 
Martin Odersky: What's next for Scala
Martin Odersky: What's next for ScalaMartin Odersky: What's next for Scala
Martin Odersky: What's next for Scala
 
Why Java Needs Hierarchical Data
Why Java Needs Hierarchical DataWhy Java Needs Hierarchical Data
Why Java Needs Hierarchical Data
 
Deep Dive Into Android Security
Deep Dive Into Android SecurityDeep Dive Into Android Security
Deep Dive Into Android Security
 
Securing Android
Securing AndroidSecuring Android
Securing Android
 
Pictures from "Learn about RenderScript" meetup at SF Android User Group
Pictures from "Learn about RenderScript" meetup at SF Android User GroupPictures from "Learn about RenderScript" meetup at SF Android User Group
Pictures from "Learn about RenderScript" meetup at SF Android User Group
 
Android UI Tips, Tricks and Techniques
Android UI Tips, Tricks and TechniquesAndroid UI Tips, Tricks and Techniques
Android UI Tips, Tricks and Techniques
 
2010 07-18.wa.rails tdd-6
2010 07-18.wa.rails tdd-62010 07-18.wa.rails tdd-6
2010 07-18.wa.rails tdd-6
 
Efficient Rails Test-Driven Development - Week 6
Efficient Rails Test-Driven Development - Week 6Efficient Rails Test-Driven Development - Week 6
Efficient Rails Test-Driven Development - Week 6
 
Graphicsand animations devoxx2010 (1)
Graphicsand animations devoxx2010 (1)Graphicsand animations devoxx2010 (1)
Graphicsand animations devoxx2010 (1)
 
What's this jQuery? Where it came from, and how it will drive innovation
What's this jQuery? Where it came from, and how it will drive innovationWhat's this jQuery? Where it came from, and how it will drive innovation
What's this jQuery? Where it came from, and how it will drive innovation
 
jQuery State of the Union - Yehuda Katz
jQuery State of the Union - Yehuda KatzjQuery State of the Union - Yehuda Katz
jQuery State of the Union - Yehuda Katz
 
Pics from: "James Gosling on Apple, Apache, Google, Oracle and the Future of ...
Pics from: "James Gosling on Apple, Apache, Google, Oracle and the Future of ...Pics from: "James Gosling on Apple, Apache, Google, Oracle and the Future of ...
Pics from: "James Gosling on Apple, Apache, Google, Oracle and the Future of ...
 
Efficient Rails Test Driven Development (class 4) by Wolfram Arnold
Efficient Rails Test Driven Development (class 4) by Wolfram ArnoldEfficient Rails Test Driven Development (class 4) by Wolfram Arnold
Efficient Rails Test Driven Development (class 4) by Wolfram Arnold
 
Efficient Rails Test Driven Development (class 3) by Wolfram Arnold
Efficient Rails Test Driven Development (class 3) by Wolfram ArnoldEfficient Rails Test Driven Development (class 3) by Wolfram Arnold
Efficient Rails Test Driven Development (class 3) by Wolfram Arnold
 
Learn about JRuby Internals from one of the JRuby Lead Developers, Thomas Enebo
Learn about JRuby Internals from one of the JRuby Lead Developers, Thomas EneboLearn about JRuby Internals from one of the JRuby Lead Developers, Thomas Enebo
Learn about JRuby Internals from one of the JRuby Lead Developers, Thomas Enebo
 
Replacing Java Incrementally
Replacing Java IncrementallyReplacing Java Incrementally
Replacing Java Incrementally
 
Learn to Build like you Code with Apache Buildr
Learn to Build like you Code with Apache BuildrLearn to Build like you Code with Apache Buildr
Learn to Build like you Code with Apache Buildr
 
Learn How to Unit Test Your Android Application (with Robolectric)
Learn How to Unit Test Your Android Application (with Robolectric)Learn How to Unit Test Your Android Application (with Robolectric)
Learn How to Unit Test Your Android Application (with Robolectric)
 
Learn Learn how to build your mobile back-end with MongoDB
Learn Learn how to build your mobile back-end with MongoDBLearn Learn how to build your mobile back-end with MongoDB
Learn Learn how to build your mobile back-end with MongoDB
 

Último

Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Último (20)

Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 

JRuby at Square

  • 2. JRuby at Square A report Steve Conover Xavier Shay Thursday, January 26, 2012
  • 5. Rails Rack Java Sinatra Java Rails Ruby Thursday, January 26, 2012
  • 6. Java Deployment Rails Development Thursday, January 26, 2012
  • 8. Not as immediately useful as we thought it would be. Thursday, January 26, 2012
  • 9. Integrated with Neo4J libraries. Thursday, January 26, 2012
  • 10. Shared JVM experience is a win. Thursday, January 26, 2012
  • 11. Deployment “What do you want our infrastructure to look like in 2 years?” — Matthew Thursday, January 26, 2012
  • 12. “Warbler provides a minimal, flexible, Ruby-like way to bundle up all of your application files for deployment to a Java environment.” Thursday, January 26, 2012
  • 13. “Trinidad allows you to run a rails or rackup applications within an embedded Apache Tomcat container.” Thursday, January 26, 2012
  • 14. “Kirk is a wrapper around Jetty that hides all of the insanity and wraps your Rack application in a loving embrace.” Thursday, January 26, 2012
  • 15. “Also, Kirk is probably the least HTTP retarded ruby rack server out there.” Thursday, January 26, 2012
  • 16. “Also, Kirk is probably the least RECT rack I OR HTTP retarded ruby NCout there.” server Thursday, January 26, 2012
  • 17. “Mizuno is a set of Jetty- powered running shoes for JRuby/Rack.” Thursday, January 26, 2012
  • 18. None of these fit very well. Thursday, January 26, 2012
  • 19. “Jetpack uses standard ruby- world tools to prepare the app for deployment, and then presents the ruby app to jetty as a Java EE web application.” Thursday, January 26, 2012
  • 20. Jetpack is stylistically similar to alternatives. Thursday, January 26, 2012
  • 21. “…it's just that this style works and many of the others lead to failure.” — Steve Thursday, January 26, 2012
  • 23. Rolling deploy to n servers coordinated with haproxy. Thursday, January 26, 2012
  • 24. One process with real threads rocks. Thursday, January 26, 2012
  • 26. “girl_friday is a Ruby library for performing asynchronous tasks.” Thursday, January 26, 2012
  • 27. Thread-safe mode is not widely used. Thursday, January 26, 2012
  • 28. Thread-safe mode is not widely tested. Thursday, January 26, 2012
  • 29. We learned through high concurrency load testing that Arel had a non-threadsafe design. Thursday, January 26, 2012
  • 30. can't add a new key into hash during iteration /rails-77dcf76f142b/activesupport/lib/active_support/ dependencies.rb:528:in `[]=' https://github.com/rails/rails/issues/3817 Thursday, January 26, 2012
  • 32. > rvm use jruby > time ruby -e '' ruby -e '' 1.07s user 0.28s system 95% cpu 1.412 total > rvm use 1.9.3 > time ruby -e '' ruby -e '' 0.01s user 0.00s system 63% cpu 0.027 total Thursday, January 26, 2012
  • 33. #!/bin/bash # script/ci source "$HOME/.rvm/scripts/rvm" function install_ruby_if_needed() { if ! rvm list rubies | grep $1 > /dev/null; then rvm install $1 fi } function switch_ruby() { install_ruby_if_needed $1 && rvm use $1 } function prepare_and_run() { switch_ruby $1 && install_bundler_if_needed && update_gems_if_needed && run_tests } prepare_and_run "1.9.3-p0" && prepare_and_run "jruby-1.6.5" Thursday, January 26, 2012
  • 34. # Gemfile platforms :ruby do gem 'mysql2' end platforms :jruby do gem 'jdbc-mysql' gem "jruby-openssl", "~> 0.7" end Thursday, January 26, 2012
  • 35. def normalize_sql_result(result) if jruby? result.map(&:values) else result end end Thursday, January 26, 2012
  • 36. result = if jruby? IO.popen4(cmd) {|_, _, _, _| } $? else pid = Process.spawn(cmd, STDERR => '/dev/null') Process.waitpid2(pid)[1] end Thursday, January 26, 2012
  • 37. The cost of cross-ruby compatibility is low. Thursday, January 26, 2012
  • 38. We have apps in both 1.8 and 1.9. Thursday, January 26, 2012
  • 39. Java Deployment Rails Development Thursday, January 26, 2012
  • 40. Final Thoughts “What’s the word for ‘you should probably use it, unless you have a good reason not to?’” — Steve Thursday, January 26, 2012
  • 41. Final Thoughts @sconover @xshay Thursday, January 26, 2012