Blog sobre desarrollo en Ruby on Rails

Como instalar passenger con nginx en menos de 15 minutos

Queres saber cómo armarte un ambiente productivo robusto con capacidades de Load Balancing, escalabilidad y alta carga para tus apps Ruby?

Gaston Ramos, un gran desarrollador de Altoros, nos lo cuenta en un screencast. Si estas interesado/a en más screencasts, agregá tu comentario.

Gaston’s forewords:
Hace un tiempo estuve trabajando desde el laboratorio de altoros, en crear un tutorial para instalar passenger con nginx, para esto desarrolle un pequeño script con instrucciones y grabe un screencast, si vos queres ver como se instala passenger y nginx en menos de 15 minutos.

 

Source: https://gastonramos.wordpress.com/2016/02/04/como-instalar-passenger-con-nginx-en-menos-de-15-minutos

Una comparación del rendimiento de los frameworks de Ruby: Sinatra, Padrino, Goliat y Ruby on Rails

El objetivo de este artículo, realizado originalmente por , es encontrar el mejor framework Ruby para una aplicación muy básica. Utilizaremos las últimas versiones de los entornos Sinatra, Padrino, Goliat y RoR.

Para correr las pruebas, se utilizó la siguiente infraestructura y configuraciones: ApacheBench 2.4.3 ab -n 1000 -c 100 localhost , un 2,3 GHz Intel Core i5 Sandy Bridge CPU , 4GB de DDR3 1333MHz RAM, 120 GB SSD Intel 330 , OS X Mavericks 10.9.1 , Ruby 2.0.0p247 y MySQL 5.6.14 en un entorno de desarrollo Sinatra. Las tablas a continuación contienen datos sobre el tiempo que se tarda en procesar 1.000 peticiones.

 

Sinatra 1.4.4

Web Server No Views and DB Views (Slim) Views (Slim) + MySQL (Sequel)
WEBrick 1.6.1 3.663 ms 8.594 ms 8.931 ms
Thin 1.6.1 0.626 ms 5.730 ms 7.159 ms
Unicorn 4.8.1 1.651 ms 8.240 ms 8.235 ms

 

Vamos a empezar con Sinatra. Resultó que Unicorn funciona más rápido con MySQL y Views que con sólo Views, ya que la diferencia es muy pequeña ( 0,005 s ), esto podría ser debido a un error.

Para eliminar cualquier inexactitud, volvemos a comprobar todos los resultados controvertidos muchas veces y tenemos valores bastante estables. Pero atención, se debe tener cuidado al construir aplicaciones de alta carga, ya que cualquier pequeño cambio pueden hacerlos más lentos. Recomendamos que siempre ejecute las pruebas en el servidor Web que desea utilizar en la producción.

Ya que Thin ha demostrado los mejores resultados, manteniendo la aplicación muy simple, decidimos utilizarla para el resto de las pruebas.

Padrino 0.11.4

Cache No Views and DB Views (Slim) MySQL (Sequel) Views (Slim) + MySQL (Sequel)
No cache 0.729 s 6.663 s 1.388 s 7.372 s
Memory 0.662 s 6.218 s 1.170 s 7.140 s

 

Aunque el framework Padrino está construido sobre Sinatra, con un montón de características útiles, como en Rails, su rendimiento sigue siendo similar a la de una aplicación limpia de Sinatra. Esta es una muy buena noticia para nosotros.

Goliath 1.0.2

No Views and DB Views (Slim) MySQL (Sequel) Views (Slim) + MySQL (Sequel)
2.075 s 7.477 s 4.314 s 10.184 s

 

Los resultados de Goliath se ven un poco extraños, porque esperábamos que este fuera el marco más rápido, gracias a su servidor HTTP incorporado. Si lo prueban y obtienen resultados diferentes, por favor no duden en señalarlo que en los comentarios con las características de su versión del test.

Rails 4.0.2

No Views and DB Views (Slim) MySQL (Sequel) Views (Slim) + MySQL (Sequel)
1.539 s 1.790 s 2.248 s 2.501 s

 

También decidimos testear Rails 4.0.2. Para las pruebas, habilitamos las clases de almacenamiento en caché en development.rb y deshabilitado sesiones y protección contra la falsificación. También utilizamos el toolkit de base de datos Sequel en lugar de ActiveRecord para que los resultados fueran más confiables. Como puede verse, resultó estar muy cerca de Goliat, y hasta un poco mejor.

Pueden mirar las aplicaciones que he creado para los testeos para asegurarse que son muy similares.

Confiamos en que esta información los ayude a elegir el framework Ruby correcto para su aplicación.

También puedes leer el artículo completo en inglés.

LikeFolio: invierte en lo que “sabes” (Fox Business Video)

Nuestro compañero, Alex Khizhnyak, nos trae la entrevista que realizó Fox Business a Nicole Sherrod de TD Ameritrade.

En el vídeo a continuación, ella está hablando sobre el éxito de LikeFolio, un proyecto web que ayuda a los inversores en línea mediante el análisis de datos de los medios sociales. Altoros ayudó SwanPowers, un socio de TD Ameritrade, la construcción de esta aplicación, que se basa en el concepto de “invertir en lo que sabes”. El sistema agrega sus conversaciones, actualizaciones de estado, gustos, y el check-in desde las redes sociales y traduce estos datos en ideas de inversión (utilizando la información de salida a bolsa).

 

Altoros fue invitado como Mentor al Workshop de dos días en la Conferencia de Ruby de Los Angeles

La Conferencia sobre Ruby de Los Angeles comenzó con un workshop de dos días. Lo más destacable de este evento es que los participantes podían no sólo acceder a conocimientos teóricos, sino también practicar con nuevas herramientas mientras colegas más experimentados hacían las veces de mentores.

Juan Pablo Genovese en L.A. Ruby Conference

Nuestro compañero, Juan Pablo Genovese, fue uno de los mentores invitados. Colaboró con los asistentes a probar distitos métodos de testeo A/B, como así también herramientas como Goliath, Httperf and JMeter. Como Juan Pablo mismo comentó: “estábamos aprendiendo como testear una web hasta la muerte”.

Chicas durante el segundo día del L.A. Ruby ConferenceAl día siguiente, los participantes pudieron asistir a un workshop gratuito organizado por RailsBridge, una organización sin fines de lucro que contribuye a la diversidad de la comunidad de Ruby. Esta organización ayudó a grupos de personas con baja representatividad en la comunidad a dominar Ruby para construir una comunidad Ruby más equilibrada. Nuestro desarrollador, Juan Pablo, fue invitado como mentor a compartir su rica experiencia.

Esta vez el workshop fue orientado a las damas. La única manera de que un hombre ingresara era trayendo una chica que quisiera aprender Ruby.

La conferencia de Ruby de Los Angeles tuvo lugar el pasado 21 y 22 de febrero, en Burbank, California.

beer-time

 

Este es el video con la participación de Juan Pablo

 

Te invitamos a leer también la crónica que realizó nuestra compañera Alena Vasilenko!

Investigando sobre tests

Este no es mi primer artículo sobre testeo, hice uno antes, pero con otro sistema. Pueden verlo aquí.

Qué puedo decir sobre el testeo que no haya sido dicho?

Bueno, puedo decir que es realmente difícil. Al menos, al principio.

Al comienzo es complicado porque deberemos preocuparnos por los testeos de error dos veces, una vez por la falla de la implementación, pero también porque esté mal escrita la prueba.

Entonces se convierten en un sinsentido, porque pasaremos más tiempo arreglando la prueba sobre el código que ya funciona. Entonces … ¿por qué añadir las pruebas?

Existen muchas posibles respuestas a esa pregunta, pero la frustración de que implementaciones funcionando no superen los tests, requiere de una pronta respuesta. Y la hay: las pruebas están fallando porque el código con el que trabajamos “huele mal” y dificulta el testeo.

No voy a darles un ejemplo, en lugar de eso les dejo la fuente de donde proviene esta idea.

Entonces, la idea general cuando hacemos TDD no es simplemente código funcionando, si sobre código que pueda ser sometido a tests y como las pruebas automáticas son códigos, nos ayudará a escribir código que pueda trabajar junto a otros.

Altoros participó de la RubyConf Argentina 2013

Durante tres días, del 26 al 28 de noviembre, profesionales amantes de Ruby se dieron cita en Ciudad Cultural Konex (Ciudad Autónoma de Buenos Aires, Argentina) para asistir al encuentro de rubystas más grande de Latinoamérica. Una vez más, Altoros Argentina dijo presente.

Allí, nuestros compañeros aprovecharon la oportunidad para divertirse pero también intercambiar conocimientos y experiencias con colegas.

Sin-título-2

Durante la primera jornada, en el llamado Ruby Fan Day, Joaquín Vicente y Luis López brindaron una taller de “Introducción a Ruby on Rails” donde explicaron cómo crear aplicaciones web con el framework Rails.

Luis (luigibyte) es programador e inline skater. Llegó al mundo de la programación de la mano de Ruby y desde entonces no ha prestado mucha atención a otros lenguajes. A lo largo de su carrera se ha encontrado con mucha y muy buena gente que le ha enseñado y entiende que este taller es una buena oportunidad de devolver algo de todo eso. Dicen que el último paso para comprender algo es poder enseñarlo y ése es su objetivo.

Joaquín aprendió de chico a programar en Basic para poder hackear el juego de la viborita del DOS. Desde entonces se dio cuenta que la programación era lo suyo. Recorrió una larga variedad de lenguajes hasta que conoció Ruby. Dice que fue amor a primera vista. Le gusta aprender y enseñar cosas nuevas todo el tiempo. Cuando no programa le encanta viajar, aunque cada tanto extraña Buenos Aires. Sueña con llevar su “oficina” en una casa rodante alrededor del mundo.

Qué es el Ruby Fun Day

El Ruby Fun Day se desarrolla durante el primer día de la RubyConf y está pensado para que cada uno traiga su laptop, o se junte con aquellos que la traigan, para poder hacer juegos y talleres.

Participantes de RubyConf Argentina 2013

Foto por: RubyConf Argentina

Interfaces Complejas

En los últimos años, las interfaces de los sitios webs han adquirido gran importancia dentro de lo que es el desarrollo web. El dinamismo, la usabilidad, la velocidad, entre otros factores son cada vez más importantes para lograr estimular a los usuarios y lograr objetivos de negocio. Es por esto que herramientas como jQuery son de vital importancia para lograr esas interesantes interfaces visuales, no sólo agregando dinamismo, sino acelerando la interactividad entre usuarios y navegadores, ya que la información se puede manipular más fácilmente y con gran agilidad.

Con jQuery se puede lograr mucho. La librería provee una gran cantidad de métodos para manipular una interfaz dentro del navegador. Es incluso posible construir un sitio de una sola página con una interfaz que cambia constantemente sin tener que regenerarla completamente. Sin embargo, lleva una enorme cantidad de trabajo y el código resultante puede ser muy difícil de mantener. Por ello en los últimos años han surgido muchas herramientas implementadas sobre jQuery u otras librerías de manipulación del DOM, que simplifican en gran medida construir estas interfaces. En este artículo hablaremos brevemente de Backbone.js, Angular.js (de la mano de los desarrolladores de Google) y Ember.js. Existen más herramientas, pero las tres mencionadas son las más populares hoy en día.

El objetivo principal de estas herramientas es proveer una organización de código más conveniente y mantenible. Como resultado, logrando mayor productividad a la hora de construir la interfaz de una web, por medio de la implementación del conocido patrón MVC, aunque en este caso, del lado del cliente. Asimismo, dejando que el navegador se encarge de generar y actualizar la interfaz, se le quita esta responsabilidad al servidor, convirtiéndolo en una mera API que provee los datos al browser. Un punto importante en este tipo de desarrollo es reducir la sincronización de los datos al mínimo y aprovechar al máximo la capacidad de procesamiento que el navegador ofrece, dejando al servidor aquel procesamiento esencial que no se puede hacer del lado del cliente.

Altoros y NephoScale estuvieron presentes en Platform, la Conferencia de Cloud Foundry

Hace pocos días, se realizó Platform, la Conferencia que organiza Cloud Foundry para desarrolladores PaaS en Santa Clara, California, EE.UU. En esta ocasión, tuve la oportunidad de participar y contarles sobre la participación de Altoros. En ella, Renat Khasanshyn, CEO de Altoros, y Andrei Yurkevich, nuestro CTO, dirigieron dos “desconferencias” elegidas por los asistentes al PlatformCF.

Renat habló sobre el desarrollo de plataformas móviles sobre Cloud Foundry y de backend-as-a-service. Tuvimos el agrado de contar con Dave Nielsen, Organizador mundial de los CloudCamp, entre los asistentes a la sesión de Renat

Por otra parte, Andrei compartió información sobre las bases de datos disponibles en Cloud Foundry.

Andrei Yurkevich, our CTO, en PlatformCF

Andrei Yurkevich, our CTO, en PlatformCF

Además, nuestro socio NephoScale, un proveedor IaaS de alta performance, anunció CloudPaaS, su nueva plataforma-como-servicio para testear/implementación/escalado de aplicaciones en la nube. Altoros se enorgullece de haber asistido a NephoScale en la implementación de esta plataforma con Cloud Foundry v2.0.

Vea más en: http://blog.altoros.com/altoros-at-platform-the-cloud-foundry-conference.html

Un concurso de bots de juegos en una RoR Meetup

Nuestra compañera, Olga Kurylionak, nos comparte lo sucedido en la Meetup de Ruby on Rails que se realizó en en Minsk, Bielorrusia (Europa del Este) el pasado 14 de septiembre.

En ella, más de 80 expertos en Ruby de la comunidad de desarrolladores de ese país discutieron sobre Ruby on Rails, cloud, entre otros temas. Cabe destacar que la comunidad de Ruby on Rails de Bielorrusia está patrocinada por Altoros,

Durante el encuentro, los participantes tuvieron la oportunidad de probar sus habilidades como programadores en un concurso de Codenjoy, un framework de entrenamiento para desarrolladores de código abierto.

Para el evento, nuestro equipo creó un conector en Ruby para este servicio. Los desarrolladores que participaron del concurso, pudieron escribir bots que jugaran al Tetris.

Miren el video para vero cómo competían los bots:

- Vea más en: http://blog.altoros.com/gaming-bots-ror-meetup.html#sthash.vE9PTOX9.dpuf

Corriendo Tests Capybara en navegadores remotos

Están preocupados por cómo sus aplicaciones funcinan en Internet Explorer? Creen que probando en la última versión del navegador usando distintos modos para emular versiones previas es suficiente? De ninguna manera! Incluso si nos saltamos algunas versiones antiguas, podemos encontrarnos con problemas que tienen muy poco soporte de json, etiquetas html5, ECMAScript, limites para los selectores CSS y muchos otros problemas que no pueden ser detectados con sólo cambiar el modo del navegador. Serán sorprendidos por algunos errores que se producen sólo bajo cierta plataforma y navegador. Para encontrar esos problemas, Eugene Melnikov, desarrollador Ruby de Altoros en Minsk, nos propone correr testeos capybara en navegadores remotos.

Usando una máquina virtual personal

  • Instale la máquina virtual con el navegador escogido. Puede utilizar su propia distribución o ievms
  • Asegúrese que Java y el navegador deseado están instalados en la VM
  • Corra en la VM Selenium Server
java –jar selenium-server-standalone-2.35.0.jar -role hub -multiWindow -browserSessionReuse
  • Corra el webdriver sobre la VM
java –jar selenium-server-standalone-2.35.0.jar -role webdriver -hub http://127.0.0.1:4444/grid/register -port 5555
  • Configure el reenvío del puerto TCP 4444 desde la máquina host a la guest.
  • Agregue a spec_helper.rb
if ENV["SELENIUM"] == 'remote'
   require 'selenium-webdriver'
    url = 'http://127.0.0.1:4444/wd/hub'
   capabilities = Selenium::WebDriver::Remote::Capabilities.internet_explorer
    Capybara.register_driver :remote_browser do |app|
     Capybara::Selenium::Driver.new(app,
                                    :browser => :remote, :url => url,
                                    :desired_capabilities => capabilities)
   end
    Capybara.server_port = 3010
   ip = `ifconfig | grep 'inet ' | grep -v 127.0.0.1 | cut -d ' ' -f2`.strip
   Capybara.app_host = http://#{ip}:#{Capybara.server_port}
   Capybara.current_driver = :remote_browser
   Capybara.javascript_driver = :remote_browser
 end
  • Corra los testeos
SELENIUM=remote bundle exec rspec spec/features/

Ahora puede fácilmente cambiar de IE a Chrome, Firefox o cualquier otro y correr el test de nuevo.

Usando browserstack

  • Cree una cuenta en browserstack
  • Descargue y copie BrowserStackTunnel.jar dentro de spec/support/
  • Asegúrese que java y curl están instalados en su máquina
  • Agregue a spec_helper.rb
  if ENV["SELENIUM"] == 'browserstack'
    require 'selenium-webdriver'

    url = "https://#{AppConfig.browserstack['username']}:#{AppConfig.browserstack['accesskey']}@hub.browserstack.com/wd/hub"
    capabilities = Selenium::WebDriver::Remote::Capabilities.new
    capabilities['browser'] = ENV['browser'] || 'IE'
    capabilities['browser_version'] = ENV['browser_version'] || '8.0'
    capabilities['os'] = 'Windows'
    capabilities['os_version'] = '7'
    capabilities['browserstack.tunnel'] = 'true'
    capabilities['browserstack.debug'] = 'true'

    Capybara.register_driver :browser_stack do |app|
      Capybara::Selenium::Driver.new(app,
                                     :browser => :remote, :url => url,
                                     :desired_capabilities => capabilities)
    end

    Capybara.server_port = 3010
    Capybara.default_wait_time = 10
    Capybara.current_driver = :browser_stack
    Capybara.javascript_driver = :browser_stack

    RSpec.configure do |config|
      config.before(:all) do
        `java -jar spec/support/BrowserStackTunnel.jar #{AppConfig.browserstack['accesskey']} 127.0.0.1,#{Capybara.server_port},0 -v >log/browserstack.log 2>&1 &`
        visit '/'
        until (`curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:45691`.to_i == 200)
          sleep 1
        end
      end
      config.after(:all) do
        `ps -ef | awk '/BrowserStackTunnel.*,#{Capybara.server_port},/{print $2}' | xargs kill -9`
      end
    end
  end
  • Corra los tests
SELENIUM=browserstack browser=IE browser_version=11.0 bundle exec rspec spec/features/

Supuestos

Probar en navegadores asume el uso de selenium webdriver. Deberá asegurarse que todos sus tests se pasen utilizando selenium si previamente usaba webkit u otro.

Conclusión

Al usar una MV personal se mantiene mayor control sobre los navegadores, se puede incluso cambiar el perfil de los navegadores entre otras opciones. Pero browserstack le permite correr sus tests sobre muchas y diferentes combinaciones de plataformas y navegadores hasta incluso emuladores de móviles sin instalaciones adicionales. Sin embargo, la velocidad de los test depende de la latencia de la red y el plan elegido. Afortunadamente, se puede correr pruebas en varios hilos a través de a ravés de distintos navegadores o tests. Además, ofrece la posibilidad de hacer testeos en vivo y depurar su aplicación local o carpeta con el prototipo. Se puede hasta chequear la capacidad de respuesta!

Puede encontrarse más información, siguiendo este link.