65
javier ramírez http://spainrb.org/javier-ramirez JRuby on Rails Ruby on Rails sobre la JVM http://aspgems.com obra publicada por javier ramirez como ‘Atribución-No Comercial-Licenciar Igual 2.5’ de Creative Commons

Jruby On Rails. Ruby on Rails en la JVM

Embed Size (px)

DESCRIPTION

JRuby on Rails, Ruby on Rails en la JVM. Presentación en el evento Sun Open Communities Forum

Citation preview

Page 1: Jruby On Rails. Ruby on Rails en la JVM

javier ramírez

http://spainrb.org/javier-ramirez

JRuby on Rails

Ruby on Rails sobre la JVM

http://aspgems.com

obra publicada por javier ramirez como ‘Atribución-No Comercial-Licenciar Igual 2.5’ de Creative Commons

Page 2: Jruby On Rails. Ruby on Rails en la JVM

james duncan davidson

Page 3: Jruby On Rails. Ruby on Rails en la JVM

james duncan davidson

Servlet API, Tomcat, Ant, Java API for XML Processing

Page 4: Jruby On Rails. Ruby on Rails en la JVM

james duncan davidson

Rails is the most well thought-out web development framework I’ve ever used. And that’s in a decade of doing web applications for a living.

I’ve built my own frameworks, helped develop the Servlet API, and have created more than a few web servers from scratch.

Nobody has done it like this before.

Servlet API, Tomcat, Ant, Java API for XML Processing

Page 5: Jruby On Rails. Ruby on Rails en la JVM

qué

Ruby, el lenguaje

Rails, el framework

JRuby, la plataforma

Page 6: Jruby On Rails. Ruby on Rails en la JVM

self

http://aspgems.com

http://formatinternet.comhttp://javier.github.comhttp://spainrb.org/javier-ramirez

[email protected]

http://twitter.com/supercoco9

Page 7: Jruby On Rails. Ruby on Rails en la JVM

tolerancia al dolor

Page 8: Jruby On Rails. Ruby on Rails en la JVM

tolerancia al dolor

I've seen things you people wouldn't believe. Attack ships on fire off the shoulder of Orion. I watched C-beams glitter in the dark...

Page 9: Jruby On Rails. Ruby on Rails en la JVM

tolerancia al dolor

I've seen things you people wouldn't believe. Attack ships on fire off the shoulder of Orion. I watched C-beams glitter in the dark...

He perdido horas en altavista.com buscando cómo escribir Blobs en DB2 con JDBC

Page 10: Jruby On Rails. Ruby on Rails en la JVM

tolerancia al dolor

I've seen things you people wouldn't believe. Attack ships on fire off the shoulder of Orion. I watched C-beams glitter in the dark...

He perdido horas en altavista.com buscando cómo escribir Blobs en DB2 con JDBC

JDK 1.0 JAVA 2 RMI/CORBA JNI LDAP JNDI SAX DOM STAX EJB1 (sin interfaz local) EJB2 Jlex SOAP JSP XSLT Freemarker

Page 11: Jruby On Rails. Ruby on Rails en la JVM

tolerancia al dolor

I've seen things you people wouldn't believe. Attack ships on fire off the shoulder of Orion. I watched C-beams glitter in the dark...

Bancos, Administración Pública, Farmaceúticas, SGAE...

He perdido horas en altavista.com buscando cómo escribir Blobs en DB2 con JDBC

JDK 1.0 JAVA 2 RMI/CORBA JNI LDAP JNDI SAX DOM STAX EJB1 (sin interfaz local) EJB2 Jlex SOAP JSP XSLT Freemarker

Page 12: Jruby On Rails. Ruby on Rails en la JVM

http://ruby-lang.org

Page 13: Jruby On Rails. Ruby on Rails en la JVM

Creado por Yukihiro Matsumoto aka “Matz”

Dinámico, Orientado a Objetos y Open Source

Primera versión de desarrollo en 1993

Primera versión oficial en 1995

ruby

foto con licencia creative commons por Javier Vidal Postigofuente: flickr

Page 14: Jruby On Rails. Ruby on Rails en la JVM

así que desde 1995...

¿Y cómo es que no supe nada de ruby hasta mucho más tarde?

Page 15: Jruby On Rails. Ruby on Rails en la JVM

1995 2002

Page 16: Jruby On Rails. Ruby on Rails en la JVM

Hipótesis de Sapir-Whorf: todos los pensamientos teóricos están basados en el lenguaje y están condicionados por él

¿por qué un nuevo lenguaje?

fuente: wikipedia

Page 17: Jruby On Rails. Ruby on Rails en la JVM

Hipótesis de Sapir-Whorf: todos los pensamientos teóricos están basados en el lenguaje y están condicionados por él

¿por qué un nuevo lenguaje?

Los diferentes lenguajes de programación, condicionan la forma en que los programadores desarrollan sus soluciones

fuente: the power and philosophy of rubyhttp://www.rubyist.net/~matz/slides/oscon2003/

Page 18: Jruby On Rails. Ruby on Rails en la JVM

Diseñado para ser divertido, creativo, y reducir el estrés del programador. Centrado en la resolución de problemas

¿por qué ruby?

fuente: the power and philosophy of rubyhttp://www.rubyist.net/~matz/slides/oscon2003/

Page 19: Jruby On Rails. Ruby on Rails en la JVM

Diseñado para ser divertido, creativo, y reducir el estrés del programador. Centrado en la resolución de problemas

¿por qué ruby?

Las personas son buenas en

•Creatividad•Imaginación•Resolución de problemas

Las personas no son buenas en

•hacer copias•trabajos rutinarios•cálculos, etc…

fuente: the power and philosophy of rubyhttp://www.rubyist.net/~matz/slides/oscon2003/

Page 20: Jruby On Rails. Ruby on Rails en la JVM

principio de la mínima sorpresa

principio de la brevedad (succinctness)

principio de la interfaz humana

enviar mensajes “ocultos” (syntactic sugar)

principios de diseño

fuente: the power and philosophy of rubyhttp://www.rubyist.net/~matz/slides/oscon2003/

Page 21: Jruby On Rails. Ruby on Rails en la JVM

ClassNames method_names and variable_names methods_asking_a_question? slightly_dangerous_methods! @instance_variables $global_variables SOME_CONSTANTS or OtherConstants

convenciones en ruby

fuente: 10 Things Every Java Programmer Should Know About Rubyhttp://conferences.oreillynet.com/cs/os2005/view/e_sess/6708

Page 22: Jruby On Rails. Ruby on Rails en la JVM

orientación “pura” a objetos

Alan Kay

Actually I made up the term "object-oriented", and I can tell you I did not have C++ in mind

Page 23: Jruby On Rails. Ruby on Rails en la JVM

orientación “pura” a objetos

Alan Kay (2003)

Actually I made up the term "object-oriented", and I can tell you I did not have C++ in mind

OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things. It can be done in Smalltalk and in LISP. There are possibly other systems in which this is possible, but I'm not aware of them

fuente: http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay_oop_en

Page 24: Jruby On Rails. Ruby on Rails en la JVM

todo es un objetolas clases son objetos => Array.new

ejemplo de factoría en ruby

def create_from_factory(factory) factory.new end

obj = create_from_factory(Array)

fuente: 10 Things Every Java Programmer Should Know About Rubyhttp://conferences.oreillynet.com/cs/os2005/view/e_sess/6708

Page 25: Jruby On Rails. Ruby on Rails en la JVM

nil es un objetonil.nil?=> true

nil.methods.grep /\?/

=> ["instance_variable_defined?", "equal?", "respond_to?", "eql?", "frozen?", "instance_of?", "kind_of?", "tainted?", "nil?", "is_a?"]

Page 26: Jruby On Rails. Ruby on Rails en la JVM

todo es un objeto.sin primitivas

0.zero? # => true true.class #=> TrueClass 1.zero? # => false 1.abs # => 1 -1.abs # => 1 1.methods # => métodos del objeto 1 2.+(3) # => 5 (igual que 2+3) 10.class # => Fixnum (10**100).class # => Bignum Bignum.class # => Class

(1..20).class #=> Range

fuente: 10 Things Every Java Programmer Should Know About Rubyhttp://conferences.oreillynet.com/cs/os2005/view/e_sess/6708

Page 27: Jruby On Rails. Ruby on Rails en la JVM

dinámico

Reflection muy simpleClases AbiertasObjetos SingletonHooks integradosEvaluación dinámicaMensajes dinámicosObjectSpace

fuente: 10 Things Every Java Programmer Should Know About Rubyhttp://conferences.oreillynet.com/cs/os2005/view/e_sess/6708

Page 28: Jruby On Rails. Ruby on Rails en la JVM

dinámico. ejemplosdef create(klass, value) klass.new(value)endcreate(Greeting, "Hello")

fuente: 10 Things Every Java Programmer Should Know About Rubyhttp://conferences.oreillynet.com/cs/os2005/view/e_sess/6708

class Integer def even? (self % 2) == 0 endend3.even?=> false

class MyClass def MyClass.method_added(name) puts "Adding Method #{name}" end

def new_method # Yada yada yada endend

Page 29: Jruby On Rails. Ruby on Rails en la JVM

mensajes. method_missingclass VCR def initialize @messages = [] end def method_missing(method, *args, &block) @messages << [method, args, block] end def play_back_to(obj) @messages.each do |method, args, block| obj.send(method, *args, &block) end endend

fuente: 10 Things Every Java Programmer Should Know About Rubyhttp://conferences.oreillynet.com/cs/os2005/view/e_sess/6708

Proxies, Auto Loaders, Decorators, Mock Objects, Builders...

Page 30: Jruby On Rails. Ruby on Rails en la JVM

tiposfuertemente tipado, a diferencia de C y de igual forma que en JAVA

tipos asignados implícitamente y comprobados dinámicamente en tiempo de ejecución (late binding)

duck typing. “if it walks like a duck and talks like a duck, we can treat it as a duck”

fuente: 10 Things Every Java Programmer Should Know About Rubyhttp://conferences.oreillynet.com/cs/os2005/view/e_sess/6708

class Duck def talk() puts "Quack" endendclass DuckLikeObject def talk() puts "Kwak" endendflock = [ Duck.new, DuckLikeObject.new ] flock.each do |d| d.talk end

Page 31: Jruby On Rails. Ruby on Rails en la JVM

tipos. algunas implicaciones

fuente: 10 Things Every Java Programmer Should Know About Rubyhttp://conferences.oreillynet.com/cs/os2005/view/e_sess/6708

def factorial(n) result = 1 (2..n).each do |i| result *= i end resultend

puts factorial(20)puts factorial(21)

243290200817664000051090942171709440000

public class Fact { static long factorial(long n) { long result = 1; for (long i=2; i<=n; i++) result *= i; return result; } public static void main (String args[]) { System.out.println(factorial(20)); System.out.println(factorial(21)); }}2432902008176640000-4249290049419214848

Page 32: Jruby On Rails. Ruby on Rails en la JVM

bloques (closures)Iteradores [1,2,3].each do |item|

puts item end

Gestión de recursos

file_contents = open(file_or_url_name) { |f| f.read }

Callbacks

widget.on_button_press { puts "Press!" }

fuente: 10 Things Every Java Programmer Should Know About Rubyhttp://conferences.oreillynet.com/cs/os2005/view/e_sess/6708

Page 33: Jruby On Rails. Ruby on Rails en la JVM

domain specific languagesFeature: Hello

In order to have more friends

I want to say hello

Scenario: Personal greeting

Given my name is Aslak

When I greet David

Then he should hear Hi, David. I'm Aslak.

And I should remember David as a friend

And I should get David's phone number

fuente: http://github.com/aslakhellesoy/cucumber

class User < ActiveRecord::Base

has_one :address

belongs_to :company

has_many :items

validates_presence_of :name, :email

end

Page 34: Jruby On Rails. Ruby on Rails en la JVM

utilidades (muy útiles!)ri String#upcase ---------------------------------------------------------- String#upcase str.upcase => new_str----------------------------------------------------------------- Returns a copy of _str_ with all lowercase letters replaced with their uppercase counterparts. The operation is locale insensitive---only characters ``a'' to ``z'' are affected.

"hEllO".upcase #=> "HELLO"

irb

en Ruby todo el código es ejecutable y devuelve un resultado, incluyendo las definiciones de clases, métodos, sentencias de control...

rubygems, rake, capistrano, chef, cucumber...

Page 35: Jruby On Rails. Ruby on Rails en la JVM

http://rubyonrails.org

Page 36: Jruby On Rails. Ruby on Rails en la JVM

ruby on rails

Desarrollado por David Heinemeier Hansson, comenzando en 2003. Primera release estable en julio de 2004. Versión 1.0 en diciembre de 2005.

La versión actual es 2.3.2 (con rails 3 en versión unstable)

“Ruby on Rails is an open-source web framework that's optimized for programmer happiness and sustainable productivity. It lets you write beautiful code by favoring convention over configuration”

Page 37: Jruby On Rails. Ruby on Rails en la JVM

open source

Mejorado por la comunidad. 1391 personas han enviado contribuciones al core. 200 personas en lo que va de año

Son contribuciones “voluntarias” (no controladas por empresas). Se gana acceso al core por méritos

Incontables plugins, gemas y librerías en rubyforge, github, sourceforge y code.google.com

fuente: http://contributors.rubyonrails.org/

Page 38: Jruby On Rails. Ruby on Rails en la JVM

extracted, not built

Desarrollado a partir de una aplicación real (Basecamp)

Los grandes bloques de funcionalidad se añaden a partir de plugins, gemas o librerías que tienen una adopción grande por la comunidad (ejemplo: REST, merb, i18n)

Si una funcionalidad no se usa demasiado, se extrae del core y se deja disponible como plugin (acts_as_tree, acts_as_list)

Page 39: Jruby On Rails. Ruby on Rails en la JVM

full-stack framework

Framework "full-stack" de desarrollo para aplicaciones web, siguiendo el patrón MVC

Page 40: Jruby On Rails. Ruby on Rails en la JVM

full-stack framework

ControladoresVistas (+AJAX)ModelosPersistencia (validaciones)E-mailRESTRutasXMLTestingTareas

imagen: http://craphound.com/images/hellovader.jpg

Page 41: Jruby On Rails. Ruby on Rails en la JVM

principios de diseño

Principio de la mínima sorpresa

Principio de Brevedad

Principio de la Interfaz Humana

DRY (Don't repeat yourself)

COC (Convention over configuration)

Agile (no deploy, generators, testing)

Page 42: Jruby On Rails. Ruby on Rails en la JVM

arquitectura / flujo

RACK

Page 43: Jruby On Rails. Ruby on Rails en la JVM

gem install rails

rails myapp

cd myapp

#configura la conexión de tu db en config/database.yml

rake db:create:all #si la db no existe todavía

#generamos migration, rutas, modelo, vista, controller, tests y fixturesruby script/generate scaffold post title:string body:text published:boolean

rake db:migrate #ejecuta la migration y crea la tablaruby script/server #en http://localhost:3000/posts podemos ver la aplicación

rake #carga la base de datos de testing y ejecuta los tests

miniaplicación REST desde cero

Page 44: Jruby On Rails. Ruby on Rails en la JVM

prototipo generado

Page 45: Jruby On Rails. Ruby on Rails en la JVM

migration

Page 46: Jruby On Rails. Ruby on Rails en la JVM

modeloclass Post < ActiveRecord::Baseend

Post.find_all_by_published true => [#<Post id: 1, title: "hello java and ruby world", body: "this is just a test of what you can do", published: true, created_at: "2009-06-10 00:03:37", updated_at: "2009-06-10 00:03:37">]

>> Post.last => #<Post id: 1, title: "hello java and ruby world", body: "this is just a test of what you can do", published: true, created_at: "2009-06-10 00:03:37", updated_at: "2009-06-10 00:03:37">

>> Post.first.valid?=> true

Page 47: Jruby On Rails. Ruby on Rails en la JVM

rutas y controlador

config/routes.rb

map.resources :posts

Page 48: Jruby On Rails. Ruby on Rails en la JVM

vistas

Page 49: Jruby On Rails. Ruby on Rails en la JVM

tests

fixtures

funcionales

unitarios

Page 50: Jruby On Rails. Ruby on Rails en la JVM

deployment con rails

ServidoresApache/Nginx + passengerApache/Nginx + mongrel_cluster

basado en recetas escritas en ruby: capistrano, vlad, chef

Page 51: Jruby On Rails. Ruby on Rails en la JVM

http://jruby.org

Page 52: Jruby On Rails. Ruby on Rails en la JVM

jruby

Iniciado por Jan Arne Petersen, en 2001, open source

Unos 50 contribuidores al proyecto

En 2006, Charles Nutter y Thomas Enebo son contratados por SUN

Core actual: 8 desarrolladores

Page 53: Jruby On Rails. Ruby on Rails en la JVM

jruby

JRuby es una implementación 100% Java del lenguaje de programación Ruby. Es Ruby para la JVM (fuente: jruby.org)

Implementaciones Ruby: MRI, Jruby, IronRuby, MacRuby, Ruby.NET, MagLev, Rubinius

No hay especificación (http://rubyspec.org/)

Page 54: Jruby On Rails. Ruby on Rails en la JVM

java como plataforma

La JVM está muy optimizada y sigue mejorando

Omnipresente, multiplataforma

Garbage Collector potente y configurable

Threads

Monitorización

Librerías

Compilación a ByteCode (AOT/JIT)

Page 55: Jruby On Rails. Ruby on Rails en la JVM

java como plataforma

Aplicaciones Rails desplegadas sobre cualquier Java Application Server

Menor resistencia en sitios con aplicaciones Java

“Credibilidad por Asociación” (Ola Bini)

Page 56: Jruby On Rails. Ruby on Rails en la JVM

retos

IRBrubygemsYAMLZlibRailsActiveRecord-JDBCStringsRegExps eficientes

POSIXLibrerías Nativas (FFI)IO (ficheros, sockets, pipes...)RendimientoCompilación a ByteCodeTipos

fuente: Beyond Impossible, How Jruby evolved the Java Platformtalk by Charles Nutter at Community One 2009

Page 57: Jruby On Rails. Ruby on Rails en la JVM

require 'java' frame = javax.swing.JFrame.new("Window") label = javax.swing.JLabel.new("Hello") frame.get_content_pane.add(label) #'getContentPane'.

#setDefaultCloseOperation()frame.default_close_operation = javax.swing.JFrame::DISPOSE_ON_CLOSEframe.packframe.setVisible(true)

java desde ruby

Page 58: Jruby On Rails. Ruby on Rails en la JVM

java.net.NetworkInterface.networkInterfaces.each{|i| puts I}

java.net.NetworkInterface.networkInterfaces.methods.grep /element/

[1, 2, 3.5].to_java Java::double => [D@9bc984

DoSomethingWithJavaClass(MyJavaClass.java_class)

class SomeJRubyObject include java.lang.Runnable include java.lang.Comparableend

button = javax.swing.JButton.new "Press me!"button.add_action_listener {|event| event.source.text = "YES!"}

java desde ruby

Page 59: Jruby On Rails. Ruby on Rails en la JVM

java es dinámico (si sabes cómo)

Page 60: Jruby On Rails. Ruby on Rails en la JVM

jsr 223 scripting APIimport javax.script.*;public class EvalScript { public static void main(String[] args) throws Exception { ScriptEngineManager factory = new ScriptEngineManager(); // Create a JRuby engine. ScriptEngine engine = factory.getEngineByName("jruby"); // Evaluate JRuby code from string. try { engine.eval("puts('Hello')"); } catch (ScriptException exception) { exception.printStackTrace(); } }}

Page 61: Jruby On Rails. Ruby on Rails en la JVM

jsr 223 scripting APIInvocable inv = (Invocable) engine;Object obj = null;try { FileReader f = new FileReader("wadus.rb"); engine.eval(f);} catch (javax.script.ScriptException e) { System.out.println("Script Exception");} catch(java.io.FileNotFoundException e) { e.printStackTrace();}try { obj=inv.invokeFunction("say_wadus", params); } catch (javax.script.ScriptException e) { e.printStackTrace(); } catch (java.lang.NoSuchMethodException e) { e.printStackTrace(); }System.out.println(obj.toString());

#wadus.rbdef say_wadus

“wadus”end

Page 62: Jruby On Rails. Ruby on Rails en la JVM

jakarta bsfimport org.apache.bsf.*;

public class BSF { public static void main(String[] args) throws Exception {

// Create a script manager. BSFManager bsfmanager=new BSFManager();

// Evaluate the ruby expression. try { bsfmanager.eval("ruby","Test",0,0,"puts('Hello')"); } catch (BSFException exception) { exception.printStackTrace(); }}

Page 63: Jruby On Rails. Ruby on Rails en la JVM

despliegue sobre la JVM

jgem install warbler

jruby -S warble config

jruby -S warble war

WEB-INF y .war standard listos para deploy

(perfecto en producción, poco ágil en desarrollo)

Page 64: Jruby On Rails. Ruby on Rails en la JVM

despliegue sobre la JVM

jgem install mongrel_rails #mongrel_rails start

jgem install glassfish #glassfish_rails

jgem install calavera-tomcat-rails #tomcat_rails

permite cambios en caliente

Page 65: Jruby On Rails. Ruby on Rails en la JVM

javier ramírez

http://spainrb.org/javier-ramirez

JRuby on Rails

Ruby on Rails sobre la JVM

http://aspgems.com

obra publicada por javier ramirez como ‘Atribución-No Comercial-Licenciar Igual 2.5’ de Creative Commons