Download Ruby en un mundo enterprise

Document related concepts
no text concepts found
Transcript
JRuby
Ruby en un mundo enterprise
Jano González
Desarrollador
http://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/dynla
ngchile/
12
10
8
Columna 1
Columna 2
Columna 3
6
4
2
●
●
Publica el blog
http://gemaroja.com
Músico frustrado
0
Fila 1
Fila 2
Fila 3
Fila 4
El mundo enterprise
Java EE
Versiones
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...
●
Frameworks
Spring
● Hibernate
● iBatis
● Guice
● Jboss Seam
● ...
●
Servidores de aplicaciones
JBoss
● Tomcat
● Weblogic
● Websphere
● ...
●
El problema
Exceso de complejidad
Lo bueno
Portabilidad
Escalabilidad
Multithreading
JIT
Garbage Collector
La solución
Ruby para la JVM
:Dc
Dinámico
:Dc
Orientado a Objetos
:Dc
Gran soporte para metaprogramació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 }
Java
public interface DuckLike {
String cuack();
}
.
.
.
public void doSomething(DuckLike duckLike) {
.
.
.
duckLike.cuack();
}
Ruby
def do_something(obj)
if obj.respond_to? :cuack
obj.cuack
else
…
end
end
Todo es un objeto
# El clásico string
“Hola Mundo”.upcase
# No hay "tipos primitivos"!
5.zero?
# Hasta el nulo es un objeto
nil.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 operador
1.+(9)
# Con un poco de azucar sintáctico
1 + 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ódigo
5.times do
|n| puts n
end
# 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
end
end
jano = Persona.new("Jano", "González")
jano.nombre
Modificando clases ya existentes
# Monkey patching
class Range
def even
self.select { |n| n % 2 == 0 }
end
end
(1..100).even
Accediendo a clases Java
# Importando clases Java
require 'java'
java_import 'java.util.date'
d = Date.new
d.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.yml
development:
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!