SlideShare une entreprise Scribd logo
1  sur  41
Télécharger pour lire hors ligne
JRuby and You
                                Hiro Asari
                                Engine Yard




Wednesday, October 26, 11
History
                      September 10, 2001




                            Source: Wikipedia



Wednesday, October 26, 11
Wednesday, October 26, 11
Project Status


                    • Current stable release: 1.6.5 (Oct 25, 2011)
                    • Rails 3.1-compatible


Wednesday, October 26, 11
What’s next in 1.7?


                    • JSR 292 (a.k.a. invokedynamic) support
                    • Improved Ruby 1.9 support


Wednesday, October 26, 11
What’s in it for Java
                             programmers?

                    • REPL
                    • Testing frameworks
                    • Fun


Wednesday, October 26, 11
What’s in it for
                             Rubyists?
                    • Real threads
                    • No more GIL
                    • Mature garbage collector
                    • Easy deployment

Wednesday, October 26, 11
Try JRuby
                            http://jruby.org/tryjruby




Wednesday, October 26, 11
Getting JRuby

        wget http://bit.ly/jruby_bin_165 | 
        tar xzvf -

        export PATH=$PATH:$PWD/jruby-1.6.5/bin




Wednesday, October 26, 11
jruby -S irb
Wednesday, October 26, 11
Java Integration

                              require 'java'




Wednesday, October 26, 11
Loading JAR

                            require 'example.jar'




Wednesday, October 26, 11
Importing Java Class

      StringBuffer = java.lang.StringBuffer
      sb = StringBuffer.new "foo"




Wednesday, October 26, 11
java_import

        java_import java.lang.StringBuffer
        java_import 'java.lang.StringBuffer'




Wednesday, October 26, 11
Static methods

        java.lang.System.currentTimeMillis
        java.lang.System.current_time_millis




Wednesday, October 26, 11
Static Fields

        java_import java.util.logging.Logger
        java_import java.util.loggin.Level

        Logger.global.log Level::SEVERE, "…"




Wednesday, October 26, 11
Constructor

      URL.new 'http://engineyard.com'
      URL.new 'http', 'engineyard.com', '/'




Wednesday, October 26, 11
Instance methods
                            #given
                            # void setPrice(int):
                            car.setPrice(2000)
                            car.price = 2000

                            # int getPrice()
                            car.price




Wednesday, October 26, 11
Explicit Coercion

                             measurement = 5
                             measurement.to_java




Wednesday, October 26, 11
Overloaded methods
       public class C {
         public static String method(String s) {
           return "String";
         }
         public static String method(long l) {
           return "long";
         }
       }




Wednesday, October 26, 11
Overloaded methods


      obj = C.new
      obj.method("foo") # => "String"
      obj.method(5) # => "long"




Wednesday, October 26, 11
Overloaded methods
                public class C {
                  public String method(int i) {
                    return "int";
                  }
                  public String method(long l) {
                    return "long";
                  }
                }


Wednesday, October 26, 11
Overloaded methods

      obj = C.new
      obj.method(5) # => "long"
      obj.method(5.to_java(Java::int))
      obj.java_send :method, [Java::int], 5




Wednesday, October 26, 11
Java Interfaces

      callable =
      java.util.concurrent.Executors.callable do
        puts "foo"
      end

      callable.call




Wednesday, October 26, 11
Complex Example with
                        Akka
                       Java source: http://bit.ly/lTClmr
                       Ruby source: https://gist.github.com/1013227
                       http://www.engineyard.com/blog/2011/using-
                       java-from-ruby-with-jruby-irb/




Wednesday, October 26, 11
GUI

               Redcar

 http://redcareditor.com/




Wednesday, October 26, 11
Grafting Rails into
                              Spring MVC




Wednesday, October 26, 11
Pet Clinic

                                    • Example
                                         database-
                                         backed web
                                         app for
                                         Spring
                                         framework


Wednesday, October 26, 11
Requests


                                                 JRuby

                            /   /vets   /rack/   Java/
                                                 Spring

                                App
Wednesday, October 26, 11
Adding Route
   diff --git a/src/main/webapp/WEB-INF/jsp/vets.jsp b/src/main/webapp/WEB-INF/jsp/vets.jsp
   index cff2154..0d99817 100644
   --- a/src/main/webapp/WEB-INF/jsp/vets.jsp
   +++ b/src/main/webapp/WEB-INF/jsp/vets.jsp
   @@ -23,7 +23,7 @@
     <table class="table-buttons">
       <tr>
         <td>
   -        <a href="<spring:url value="/vets.xml" htmlEscape="true" />">View as XML</a>
   +        <a href="<spring:url value="/rack/vets.xml" htmlEscape="true" />">View as XML</a>
         </td>
       </tr>
     </table>




Wednesday, October 26, 11
Cucumber


                    • http://cukes.info
                    • Testing framework for describing software
                            behavior in plain English




Wednesday, October 26, 11
Cucumber
         Feature: Pets

                Scenario: Edit Pet
                  Given I am on the owners search page
                  And I press "Find Owners"
                  And I follow "George Franklin"
                  And I follow "Edit Pet"
                  When I fill in "Name" with "Leoni"
                  And press "Update Pet"
                  Then I should see "Leoni"



Wednesday, October 26, 11
Cucumber test
          Stand by while Tomcat finishes booting...
          Using the default profile...
          ............................................................F-.............

          (::) failed steps (::)

          expected: /xml/,
                got: "text/html;charset=utf-8" (using =~)
          Diff:
          @@ -1,2 +1,2 @@
          -/xml/
          +text/html;charset=utf-8
           (RSpec::Expectations::ExpectationNotMetError)
          org/jruby/RubyProc.java:268:in `call'
          ./features/step_definitions/xml_json_steps.rb:12:in `(root)':in `/^I should see
          an XML document$/'
          features/vets.feature:6:in `Then I should see an XML document'

          Failing Scenarios:
          cucumber features/vets.feature:3 # Scenario: View vets as XML

          13 scenarios (1 failed, 12 passed)
          75 steps (1 failed, 1 skipped, 73 passed)
          0m7.709s
          rake aborted!
          Cucumber failed



Wednesday, October 26, 11
diff --git a/pom.xml b/pom.xml
                            index 9e22f83..0810701 100644
                            --- a/pom.xml
                            +++ b/pom.xml
                            @@ -211,6 +211,18 @@
                                                    <scope>provided</scope>
                                            </dependency>

                            +                <!-- JRuby and JRuby-Rack -->
                            +                <dependency>
                            +                        <groupId>org.jruby</groupId>
                            +                        <artifactId>jruby-complete</artifactId>
                            +                        <version>1.6.0</version>
                            +                </dependency>
                            +                <dependency>
                            +                        <groupId>org.jruby.rack</groupId>
                            +                        <artifactId>jruby-rack</artifactId>
                            +                        <version>1.0.8</version>
                            +                </dependency>
                            +
                                            <!-- Test dependencies -->
                                            <dependency>
                                                    <groupId>org.junit</groupId>




Wednesday, October 26, 11
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
    index 8d02684..60ed6cb 100644
    --- a/src/main/webapp/WEB-INF/web.xml
    +++ b/src/main/webapp/WEB-INF/web.xml
    @@ -87,6 +87,21 @@
            <listener>
                    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
            </listener>
    +
    +        <listener>
    +                <listener-class>org.jruby.rack.RackServletContextListener</listener-class>
    +        </listener>
    +
    +        <servlet>
    +                <servlet-name>rack</servlet-name>
    +                <servlet-class>org.jruby.rack.RackServlet</servlet-class>
    +        </servlet>
    +
    +        <servlet-mapping>
    +                <servlet-name>rack</servlet-name>
    +                <url-pattern>/rack/*</url-pattern>
    +        </servlet-mapping>
    +

                <!--
                            Defines the 'default' servlet (usually for service static resources).




Wednesday, October 26, 11
diff --git a/src/main/webapp/WEB-INF/lib/app.rb b/src/main/webapp/WEB-INF/lib/
                     app.rb
                     index 6ab5b3c..4398fb4 100644
                     --- a/src/main/webapp/WEB-INF/lib/app.rb
                     +++ b/src/main/webapp/WEB-INF/lib/app.rb
                     @@ -1,6 +1,33 @@
                       require 'builder'
                       require 'erb'
                     +require 'spring_helpers'
                     +
                     +helpers do
                     + include Spring
                     +end

                      get '/rack/' do
                        '<h1>Sinatra</h1>'
                      end
                     +
                     +get '/rack/vets.xml' do
                     + content_type 'application/vnd.petclinic+xml'
                     + builder do |xml|
                     +    xml.instruct!
                     +    xml.vets do
                     +      clinic.vets.each do |vet|
                     +        xml.vetList do
                     +          xml.id vet.id
                     +          xml.firstName vet.firstName
                     +          xml.lastName vet.lastName
                     +          vet.specialties.each do |spec|
                     +            xml.specialties do
                     +              xml.id spec.id
                     +              xml.name spec.name
                     +            end
                     +          end
                     +        end
                     +      end
                     +    end
                     + end
                     +end


Wednesday, October 26, 11
Requests



                      /     /vets                        JRuby

                                              /owners    Java/
                      /     /vets   /owners    /1/pets   Spring


                               App
Wednesday, October 26, 11
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
               index 60ed6cb..f64b34d 100644
               --- a/src/main/webapp/WEB-INF/web.xml
               +++ b/src/main/webapp/WEB-INF/web.xml
               @@ -92,16 +92,6 @@
                                <listener-class>org.jruby.rack.RackServletContextListener</listener-class>
                        </listener>

               -             <servlet>
               -                     <servlet-name>rack</servlet-name>
               -                     <servlet-class>org.jruby.rack.RackServlet</servlet-class>
               -             </servlet>
               -
               -             <servlet-mapping>
               -                     <servlet-name>rack</servlet-name>
               -                     <url-pattern>/rack/*</url-pattern>
               -             </servlet-mapping>
               -

                            <!--
                               Defines the 'default' servlet (usually for service static resources).
               @@ -162,6 +152,16 @@
                               <url-pattern>/</url-pattern>
                       </servlet-mapping>

               +             <filter>
               +                     <filter-name>RackFilter</filter-name>
               +                     <filter-class>org.jruby.rack.RubyFirstRackFilter</filter-class>
               +             </filter>
               +
               +             <filter-mapping>
               +                     <filter-name>RackFilter</filter-name>
               +                     <url-pattern>/*</url-pattern>
               +             </filter-mapping>
               +
                            <filter>
                                       <filter-name>httpMethodFilter</filter-name>
                                       <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>




Wednesday, October 26, 11
The Book

                      http://pragprog.com/book/
                      jruby/using-jruby

                      25% off for one week
                      only: http://bit.ly/vd4Mhj




Wednesday, October 26, 11
Engine Yard

                        500 free hours
                     http://engineyard.com




Wednesday, October 26, 11
Questions?
                        Twitter @hiro_asari
                     G+ http://gplus.to/hiroasari
               LinkedIn http://linkedin.com/in/hiroasari

                             asari.ruby@gmail.com
                            hasari@engineyard.com

                        http://github.com/banzaiman


                                                           http://www.flickr.com/photos/42033648@N00/372887164



Wednesday, October 26, 11

Contenu connexe

Tendances

Torquebox - O melhor dos dois mundos
Torquebox - O melhor dos dois mundosTorquebox - O melhor dos dois mundos
Torquebox - O melhor dos dois mundos
Bruno Oliveira
 
Why Doesn't Java Has Instant Turnaround - Con-FESS 2012
Why Doesn't Java Has Instant Turnaround - Con-FESS 2012Why Doesn't Java Has Instant Turnaround - Con-FESS 2012
Why Doesn't Java Has Instant Turnaround - Con-FESS 2012
Anton Arhipov
 
Torquebox OSCON Java 2011
Torquebox OSCON Java 2011Torquebox OSCON Java 2011
Torquebox OSCON Java 2011
tobiascrawley
 
Mastering java bytecode with ASM - GeeCON 2012
Mastering java bytecode with ASM - GeeCON 2012Mastering java bytecode with ASM - GeeCON 2012
Mastering java bytecode with ASM - GeeCON 2012
Anton Arhipov
 
Torquebox @ Raleigh.rb - April 2011
Torquebox @ Raleigh.rb - April 2011Torquebox @ Raleigh.rb - April 2011
Torquebox @ Raleigh.rb - April 2011
tobiascrawley
 
DataMapper on Infinispan
DataMapper on InfinispanDataMapper on Infinispan
DataMapper on Infinispan
Lance Ball
 
Torquebox @ Charlotte.rb May 2011
Torquebox @ Charlotte.rb May 2011Torquebox @ Charlotte.rb May 2011
Torquebox @ Charlotte.rb May 2011
tobiascrawley
 
Java Bytecode For Discriminating Developers - GeeCON 2011
Java Bytecode For Discriminating Developers - GeeCON 2011Java Bytecode For Discriminating Developers - GeeCON 2011
Java Bytecode For Discriminating Developers - GeeCON 2011
Anton Arhipov
 
ZK_Arch_notes_20081121
ZK_Arch_notes_20081121ZK_Arch_notes_20081121
ZK_Arch_notes_20081121
WANGCHOU LU
 

Tendances (20)

Torquebox - O melhor dos dois mundos
Torquebox - O melhor dos dois mundosTorquebox - O melhor dos dois mundos
Torquebox - O melhor dos dois mundos
 
Why Doesn't Java Has Instant Turnaround - Con-FESS 2012
Why Doesn't Java Has Instant Turnaround - Con-FESS 2012Why Doesn't Java Has Instant Turnaround - Con-FESS 2012
Why Doesn't Java Has Instant Turnaround - Con-FESS 2012
 
Torquebox OSCON Java 2011
Torquebox OSCON Java 2011Torquebox OSCON Java 2011
Torquebox OSCON Java 2011
 
Mastering java bytecode with ASM - GeeCON 2012
Mastering java bytecode with ASM - GeeCON 2012Mastering java bytecode with ASM - GeeCON 2012
Mastering java bytecode with ASM - GeeCON 2012
 
Torquebox @ Raleigh.rb - April 2011
Torquebox @ Raleigh.rb - April 2011Torquebox @ Raleigh.rb - April 2011
Torquebox @ Raleigh.rb - April 2011
 
DataMapper on Infinispan
DataMapper on InfinispanDataMapper on Infinispan
DataMapper on Infinispan
 
The Enterprise Strikes Back
The Enterprise Strikes BackThe Enterprise Strikes Back
The Enterprise Strikes Back
 
Torquebox @ Charlotte.rb May 2011
Torquebox @ Charlotte.rb May 2011Torquebox @ Charlotte.rb May 2011
Torquebox @ Charlotte.rb May 2011
 
Java Bytecode For Discriminating Developers - GeeCON 2011
Java Bytecode For Discriminating Developers - GeeCON 2011Java Bytecode For Discriminating Developers - GeeCON 2011
Java Bytecode For Discriminating Developers - GeeCON 2011
 
ZK_Arch_notes_20081121
ZK_Arch_notes_20081121ZK_Arch_notes_20081121
ZK_Arch_notes_20081121
 
Mashups with Drupal and QueryPath
Mashups with Drupal and QueryPathMashups with Drupal and QueryPath
Mashups with Drupal and QueryPath
 
Pi
PiPi
Pi
 
Oredev 2015 - Taming Java Agents
Oredev 2015 - Taming Java AgentsOredev 2015 - Taming Java Agents
Oredev 2015 - Taming Java Agents
 
Soft-Shake 2016 : Jigsaw est prêt à tuer le classpath
Soft-Shake 2016 : Jigsaw  est prêt à tuer le classpathSoft-Shake 2016 : Jigsaw  est prêt à tuer le classpath
Soft-Shake 2016 : Jigsaw est prêt à tuer le classpath
 
Java 7 Whats New(), Whats Next() from Oredev
Java 7 Whats New(), Whats Next() from OredevJava 7 Whats New(), Whats Next() from Oredev
Java 7 Whats New(), Whats Next() from Oredev
 
JVM
JVMJVM
JVM
 
LyonJUG : Comment Jigsaw est prêt à tuer le classpath
LyonJUG : Comment Jigsaw est prêt à tuer le classpathLyonJUG : Comment Jigsaw est prêt à tuer le classpath
LyonJUG : Comment Jigsaw est prêt à tuer le classpath
 
"Highlights from Java 10&11 and Future of Java" at Java User Group Bonn 2018 ...
"Highlights from Java 10&11 and Future of Java" at Java User Group Bonn 2018 ..."Highlights from Java 10&11 and Future of Java" at Java User Group Bonn 2018 ...
"Highlights from Java 10&11 and Future of Java" at Java User Group Bonn 2018 ...
 
Ruby on Rails survival guide of an aged Java developer
Ruby on Rails survival guide of an aged Java developerRuby on Rails survival guide of an aged Java developer
Ruby on Rails survival guide of an aged Java developer
 
LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath
LausanneJUG 2017 - Jigsaw est prêt à tuer le classpathLausanneJUG 2017 - Jigsaw est prêt à tuer le classpath
LausanneJUG 2017 - Jigsaw est prêt à tuer le classpath
 

Similaire à JRuby and You

Devon 2011-f-4-improve your-javascript
Devon 2011-f-4-improve your-javascriptDevon 2011-f-4-improve your-javascript
Devon 2011-f-4-improve your-javascript
Daum DNA
 
A Unified SOAP/JSON API with Symfony2
A Unified SOAP/JSON API with Symfony2A Unified SOAP/JSON API with Symfony2
A Unified SOAP/JSON API with Symfony2
Craig Marvelley
 
Rcos presentation
Rcos presentationRcos presentation
Rcos presentation
mskmoorthy
 

Similaire à JRuby and You (20)

The Enterprise Strikes Back
The Enterprise Strikes BackThe Enterprise Strikes Back
The Enterprise Strikes Back
 
Devon 2011-f-4-improve your-javascript
Devon 2011-f-4-improve your-javascriptDevon 2011-f-4-improve your-javascript
Devon 2011-f-4-improve your-javascript
 
How we're building Wercker
How we're building WerckerHow we're building Wercker
How we're building Wercker
 
De vuelta al pasado con SQL y stored procedures
De vuelta al pasado con SQL y stored proceduresDe vuelta al pasado con SQL y stored procedures
De vuelta al pasado con SQL y stored procedures
 
A Unified SOAP/JSON API with Symfony2
A Unified SOAP/JSON API with Symfony2A Unified SOAP/JSON API with Symfony2
A Unified SOAP/JSON API with Symfony2
 
Rcos presentation
Rcos presentationRcos presentation
Rcos presentation
 
JRubyConf 2009
JRubyConf 2009JRubyConf 2009
JRubyConf 2009
 
Cross site calls with javascript - the right way with CORS
Cross site calls with javascript - the right way with CORSCross site calls with javascript - the right way with CORS
Cross site calls with javascript - the right way with CORS
 
Introduction to ansible
Introduction to ansibleIntroduction to ansible
Introduction to ansible
 
Solr 4 highlights - Mark Miller
Solr 4 highlights - Mark MillerSolr 4 highlights - Mark Miller
Solr 4 highlights - Mark Miller
 
Macruby - RubyConf Presentation 2010
Macruby - RubyConf Presentation 2010Macruby - RubyConf Presentation 2010
Macruby - RubyConf Presentation 2010
 
RubyConf 2009
RubyConf 2009RubyConf 2009
RubyConf 2009
 
An introduction to Ember.js
An introduction to Ember.jsAn introduction to Ember.js
An introduction to Ember.js
 
Einführung in AngularJS
Einführung in AngularJSEinführung in AngularJS
Einführung in AngularJS
 
Acceptance & Integration Testing With Behat (PBC11)
Acceptance & Integration Testing With Behat (PBC11)Acceptance & Integration Testing With Behat (PBC11)
Acceptance & Integration Testing With Behat (PBC11)
 
Your first rails app - 2
 Your first rails app - 2 Your first rails app - 2
Your first rails app - 2
 
Pocket Knife JS
Pocket Knife JSPocket Knife JS
Pocket Knife JS
 
NoSQL CGN: CouchDB (11/2011)
NoSQL CGN: CouchDB (11/2011)NoSQL CGN: CouchDB (11/2011)
NoSQL CGN: CouchDB (11/2011)
 
Практики применения JRuby
Практики применения JRubyПрактики применения JRuby
Практики применения JRuby
 
What You Need to Know About Lambdas - Jamie Allen (Typesafe)
What You Need to Know About Lambdas - Jamie Allen (Typesafe)What You Need to Know About Lambdas - Jamie Allen (Typesafe)
What You Need to Know About Lambdas - Jamie Allen (Typesafe)
 

Dernier

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Dernier (20)

Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
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
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 

JRuby and You

  • 1. JRuby and You Hiro Asari Engine Yard Wednesday, October 26, 11
  • 2. History September 10, 2001 Source: Wikipedia Wednesday, October 26, 11
  • 4. Project Status • Current stable release: 1.6.5 (Oct 25, 2011) • Rails 3.1-compatible Wednesday, October 26, 11
  • 5. What’s next in 1.7? • JSR 292 (a.k.a. invokedynamic) support • Improved Ruby 1.9 support Wednesday, October 26, 11
  • 6. What’s in it for Java programmers? • REPL • Testing frameworks • Fun Wednesday, October 26, 11
  • 7. What’s in it for Rubyists? • Real threads • No more GIL • Mature garbage collector • Easy deployment Wednesday, October 26, 11
  • 8. Try JRuby http://jruby.org/tryjruby Wednesday, October 26, 11
  • 9. Getting JRuby wget http://bit.ly/jruby_bin_165 | tar xzvf - export PATH=$PATH:$PWD/jruby-1.6.5/bin Wednesday, October 26, 11
  • 10. jruby -S irb Wednesday, October 26, 11
  • 11. Java Integration require 'java' Wednesday, October 26, 11
  • 12. Loading JAR require 'example.jar' Wednesday, October 26, 11
  • 13. Importing Java Class StringBuffer = java.lang.StringBuffer sb = StringBuffer.new "foo" Wednesday, October 26, 11
  • 14. java_import java_import java.lang.StringBuffer java_import 'java.lang.StringBuffer' Wednesday, October 26, 11
  • 15. Static methods java.lang.System.currentTimeMillis java.lang.System.current_time_millis Wednesday, October 26, 11
  • 16. Static Fields java_import java.util.logging.Logger java_import java.util.loggin.Level Logger.global.log Level::SEVERE, "…" Wednesday, October 26, 11
  • 17. Constructor URL.new 'http://engineyard.com' URL.new 'http', 'engineyard.com', '/' Wednesday, October 26, 11
  • 18. Instance methods #given # void setPrice(int): car.setPrice(2000) car.price = 2000 # int getPrice() car.price Wednesday, October 26, 11
  • 19. Explicit Coercion measurement = 5 measurement.to_java Wednesday, October 26, 11
  • 20. Overloaded methods public class C { public static String method(String s) { return "String"; } public static String method(long l) { return "long"; } } Wednesday, October 26, 11
  • 21. Overloaded methods obj = C.new obj.method("foo") # => "String" obj.method(5) # => "long" Wednesday, October 26, 11
  • 22. Overloaded methods public class C { public String method(int i) { return "int"; } public String method(long l) { return "long"; } } Wednesday, October 26, 11
  • 23. Overloaded methods obj = C.new obj.method(5) # => "long" obj.method(5.to_java(Java::int)) obj.java_send :method, [Java::int], 5 Wednesday, October 26, 11
  • 24. Java Interfaces callable = java.util.concurrent.Executors.callable do puts "foo" end callable.call Wednesday, October 26, 11
  • 25. Complex Example with Akka Java source: http://bit.ly/lTClmr Ruby source: https://gist.github.com/1013227 http://www.engineyard.com/blog/2011/using- java-from-ruby-with-jruby-irb/ Wednesday, October 26, 11
  • 26. GUI Redcar http://redcareditor.com/ Wednesday, October 26, 11
  • 27. Grafting Rails into Spring MVC Wednesday, October 26, 11
  • 28. Pet Clinic • Example database- backed web app for Spring framework Wednesday, October 26, 11
  • 29. Requests JRuby / /vets /rack/ Java/ Spring App Wednesday, October 26, 11
  • 30. Adding Route diff --git a/src/main/webapp/WEB-INF/jsp/vets.jsp b/src/main/webapp/WEB-INF/jsp/vets.jsp index cff2154..0d99817 100644 --- a/src/main/webapp/WEB-INF/jsp/vets.jsp +++ b/src/main/webapp/WEB-INF/jsp/vets.jsp @@ -23,7 +23,7 @@ <table class="table-buttons"> <tr> <td> - <a href="<spring:url value="/vets.xml" htmlEscape="true" />">View as XML</a> + <a href="<spring:url value="/rack/vets.xml" htmlEscape="true" />">View as XML</a> </td> </tr> </table> Wednesday, October 26, 11
  • 31. Cucumber • http://cukes.info • Testing framework for describing software behavior in plain English Wednesday, October 26, 11
  • 32. Cucumber Feature: Pets Scenario: Edit Pet Given I am on the owners search page And I press "Find Owners" And I follow "George Franklin" And I follow "Edit Pet" When I fill in "Name" with "Leoni" And press "Update Pet" Then I should see "Leoni" Wednesday, October 26, 11
  • 33. Cucumber test Stand by while Tomcat finishes booting... Using the default profile... ............................................................F-............. (::) failed steps (::) expected: /xml/, got: "text/html;charset=utf-8" (using =~) Diff: @@ -1,2 +1,2 @@ -/xml/ +text/html;charset=utf-8 (RSpec::Expectations::ExpectationNotMetError) org/jruby/RubyProc.java:268:in `call' ./features/step_definitions/xml_json_steps.rb:12:in `(root)':in `/^I should see an XML document$/' features/vets.feature:6:in `Then I should see an XML document' Failing Scenarios: cucumber features/vets.feature:3 # Scenario: View vets as XML 13 scenarios (1 failed, 12 passed) 75 steps (1 failed, 1 skipped, 73 passed) 0m7.709s rake aborted! Cucumber failed Wednesday, October 26, 11
  • 34. diff --git a/pom.xml b/pom.xml index 9e22f83..0810701 100644 --- a/pom.xml +++ b/pom.xml @@ -211,6 +211,18 @@ <scope>provided</scope> </dependency> + <!-- JRuby and JRuby-Rack --> + <dependency> + <groupId>org.jruby</groupId> + <artifactId>jruby-complete</artifactId> + <version>1.6.0</version> + </dependency> + <dependency> + <groupId>org.jruby.rack</groupId> + <artifactId>jruby-rack</artifactId> + <version>1.0.8</version> + </dependency> + <!-- Test dependencies --> <dependency> <groupId>org.junit</groupId> Wednesday, October 26, 11
  • 35. diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 8d02684..60ed6cb 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -87,6 +87,21 @@ <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> + + <listener> + <listener-class>org.jruby.rack.RackServletContextListener</listener-class> + </listener> + + <servlet> + <servlet-name>rack</servlet-name> + <servlet-class>org.jruby.rack.RackServlet</servlet-class> + </servlet> + + <servlet-mapping> + <servlet-name>rack</servlet-name> + <url-pattern>/rack/*</url-pattern> + </servlet-mapping> + <!-- Defines the 'default' servlet (usually for service static resources). Wednesday, October 26, 11
  • 36. diff --git a/src/main/webapp/WEB-INF/lib/app.rb b/src/main/webapp/WEB-INF/lib/ app.rb index 6ab5b3c..4398fb4 100644 --- a/src/main/webapp/WEB-INF/lib/app.rb +++ b/src/main/webapp/WEB-INF/lib/app.rb @@ -1,6 +1,33 @@ require 'builder' require 'erb' +require 'spring_helpers' + +helpers do + include Spring +end get '/rack/' do '<h1>Sinatra</h1>' end + +get '/rack/vets.xml' do + content_type 'application/vnd.petclinic+xml' + builder do |xml| + xml.instruct! + xml.vets do + clinic.vets.each do |vet| + xml.vetList do + xml.id vet.id + xml.firstName vet.firstName + xml.lastName vet.lastName + vet.specialties.each do |spec| + xml.specialties do + xml.id spec.id + xml.name spec.name + end + end + end + end + end + end +end Wednesday, October 26, 11
  • 37. Requests / /vets JRuby /owners Java/ / /vets /owners /1/pets Spring App Wednesday, October 26, 11
  • 38. diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 60ed6cb..f64b34d 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -92,16 +92,6 @@ <listener-class>org.jruby.rack.RackServletContextListener</listener-class> </listener> - <servlet> - <servlet-name>rack</servlet-name> - <servlet-class>org.jruby.rack.RackServlet</servlet-class> - </servlet> - - <servlet-mapping> - <servlet-name>rack</servlet-name> - <url-pattern>/rack/*</url-pattern> - </servlet-mapping> - <!-- Defines the 'default' servlet (usually for service static resources). @@ -162,6 +152,16 @@ <url-pattern>/</url-pattern> </servlet-mapping> + <filter> + <filter-name>RackFilter</filter-name> + <filter-class>org.jruby.rack.RubyFirstRackFilter</filter-class> + </filter> + + <filter-mapping> + <filter-name>RackFilter</filter-name> + <url-pattern>/*</url-pattern> + </filter-mapping> + <filter> <filter-name>httpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> Wednesday, October 26, 11
  • 39. The Book http://pragprog.com/book/ jruby/using-jruby 25% off for one week only: http://bit.ly/vd4Mhj Wednesday, October 26, 11
  • 40. Engine Yard 500 free hours http://engineyard.com Wednesday, October 26, 11
  • 41. Questions? Twitter @hiro_asari G+ http://gplus.to/hiroasari LinkedIn http://linkedin.com/in/hiroasari asari.ruby@gmail.com hasari@engineyard.com http://github.com/banzaiman http://www.flickr.com/photos/42033648@N00/372887164 Wednesday, October 26, 11