jruby: ruby en un mundo enterprise rubyconf uruguay 2011

83
Ruby en un mundo enterprise JRuby Jano González Desarrollador http://janogonzalez.com

Upload: jano-gonzalez

Post on 21-Jun-2015

957 views

Category:

Technology


6 download

DESCRIPTION

Slides de mi presentación en RubyConf Uruguay 2011

TRANSCRIPT

Ruby en un mundo enterpriseJRuby

Jano GonzálezDesarrolladorhttp://janogonzalez.com

Sobre mi

@janogonzalez

● Desarrollando en Java desde 2000, enamorado de Ruby en 2010

● Co-organizador del Meetup de Lenguajes Dinámicos: http://www.meetup.com/dynlangchile/

● Publica el blog http://gemaroja.com

● Músico frustrado

Fila 1 Fila 2 Fila 3 Fila 40

2

4

6

8

10

12

Columna 1

Columna 2

Columna 3

El mundo enterprise

Java EE

● 1999: J2EE 1.2● 2001: J2EE 1.3● 2003: J2EE 1.4● 2006: Java EE 5● 2009: Java EE 6 → Un paso en la dirección correcta...

Versiones

● Spring● Hibernate● iBatis● Guice● Jboss Seam● ...

Frameworks

● JBoss● Tomcat● Weblogic● Websphere● ...

Servidores de aplicaciones

El problema

Exceso de complejidad

Lo bueno

Portabilidad

Escalabilidad

Multithreading

JIT

Garbage Collector

La solución

:DcRuby para la JVM

:DcDinámico

:DcOrientado a Objetos

Gran soporte para meta-programación

Java

List<String> nombres = Arrays.asList("Jano", "Ian", "Juanelo", "Peyuco");

Collections.sort(nombres, new Comparator<String>() { public int compare(String x, String y) { return x.length() - y.length(); }});

for (String nombre : nombres) { System.out.println(nombre);}

Ruby

nombres = ["Jano","Ian","Juanelo","Peyuco"]

nombres.sort! { |x, y| x.length <=> y.length }

nombres.each { |nombre| puts nombre }

Javapublic interface DuckLike { String cuack();}

.

.

.

public void doSomething(DuckLike duckLike) { . . . duckLike.cuack(); }

Ruby

def do_something(obj) if obj.respond_to? :cuack obj.cuack else … endend

Todo es un objeto

# El clásico string“Hola Mundo”.upcase

# No hay "tipos primitivos"!5.zero?

# Hasta el nulo es un objetonil.nil?

Hay muchos tipos de objetos# Arreglos

[1, 2, 3, 4, 5]

# Hashes

{:jano => "Alejandro", :cote => "José"}

# Rangos(1..10)

# Expresiones regulares/^[a-z]+$/

# Lambdas

lambda { |n| n * 2 }

Con métodos muy cool

# En realidad + es un método, no un operador1.+(9)

# Con un poco de azucar sintáctico1 + 9

# En otros objetos"Hola " + "Mundo"

# Con una gran cantidad de objetos![1, 2, 3] + [4, 5]

Bloques

# Un método puede recibir un bloque de código5.times do |n| puts nend

# Para casos cortos como el anterior...5.times { |n| puts n }

Bloques

# El clásico map(1..100).map { |n| n * 2 }

# El clásico select(1..100).select { |n| n % 3 == 0 }

# El clásico reduce(1..100).reduce { |sum, n| sum + n }

# Incluso más corto(1..100).reduce(:+)

Creando tus propias clases

# Problem Java?class Persona attr_reader :nombre, :apellido def initialize(nombre, apellido) @nombre = nombre @apellido = apellido endend

jano = Persona.new("Jano", "González")jano.nombre

Modificando clases ya existentes

# Monkey patchingclass Range def even self.select { |n| n % 2 == 0 } endend

(1..100).even

Accediendo a clases Java

# Importando clases Javarequire 'java'java_import 'java.util.date'

d = Date.newd.to_gmt_string

Accediendo a clases Java

Date d = new Date(); => d = Date.new

d.toGMTString() => d.to_gmt_string

Arrays.asList() => Arrays::as_list

Comandos

Intérprete$ jruby

REPL$ jirb

Administrador de paquetes$ jgem

Gemas

Precaución: No todas funcionan en Jruby

Encontrando la gema adecuada

Dime que versión de Java usas y te diré quién eres

Java 7

Java 6

Java 5

Java <= 1.4

Guerra de guerrillas

Fase I

● Usar jirb como REPL Java● Ant/Maven → Apache Buildr● Scripts en general● Junit/Selenium → RSpec, Cucumber

Fase II

● Servicios REST con Sinatra● DSLs para facilitar uso de bibliotecas Java● Aplicaciones Web con Ruby on Rails

JRuby on Rails

JRuby on Rails

$ gem install rails$ rails new startechconf

Configura tu database.ymldevelopment: adapter: jdbcmysql database: startechconf_development username: root encoding: utf8

test: adapter: jdbcmysql database: startechconf_test username: root encoding: utf8

production: adapter: jdbc jndi: jdbc/stconrails

Usa modo multithread production.rb

# Enable threaded mode config.threadsafe!

La magia que hay detrás

● jruby-rack● activerecord-jdbc-adapter

Precaución

● Si usas un servidor Java EE 1.4 (Por ej. WAS 6.1) debes usar jruby-rack 1.0.0.1

Integración con Spring

Integración con Spring

● Usa un initializer para cargar tu $CLASSPATH● Usa un initializer para cargar el ApplicationContext

Deploy en tu appserver preferido

$ warble

warbler

Otras opciones

trinidad

TorqueBox

¿y si ya uso Ruby?

No seas GIL

No seas GIL

Bibliotecas interesantes

● ROFLScale con Netty o Apache Mina● Actores remotos con Akka

Bibliotecas menos interesantes

● Reportes iPDF● Excel con POI

Políglota extremo

● STM de Clojure

Conclusión

Más información

Más información

● http://jruby.org● https://github.com/jruby● https://github.com/nicksieger/refactoring-to-rails

Más información

● @headius● @nicksieger● @janogonzalez O RLY?

@janogonzalez

¡Gracias!