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!