Blog sobre desarrollo en Ruby on Rails

Implementando una Plataforma de Debate-Discurso con Juju

Con más de 100 servicios listos para implementar, Juju permite construir entornos públicos y privados y gestionarlo con sólo un par de comandos. Se puede seleccionar un componente de sistema listo (llamado charm) desde una tienda especial y empezar a combinar los elementos para crear el entorno que se necesita.

Sin embargo, ¿qué hacer si se necesita una solución que no está disponible en la tienda?

En Altoros se ha creado un Rack charm para Juju que simplifica la instalación de las aplicaciones Ruby on Rails y Sinatra en las plataformas en la nube soportadas por Juju.

En este post, Pavel Pachkovskij, desarrollador Ruby, nos brinda una guía de cómo implementar Discourse, una plataforma de siguiente generación para discusiones de una comunidad, usando Juju y el Rack charm.

Para empezar, se necesitará tener correctamente configurado un entorno Juju. Podemos aprender a hacerlo desde aquí.

Si quiere leer el artículo completo desde la página GitHub de Pavel y averiguar cómo agregar Discourse a su consola de administración Juju siga este link.

Les recomendamos leer también http://blog.altoros.com/deploying-the-discourse-discussion-platform-with-juju-service-orchestration.html#sthash.YbP3LBDg.dpuf

RubyConf Argentina 2013

RubyConf Argentina 2013Altoros Argentina es sponsor, una vez más, de la RubyConf Argentina.

Como lo hace desde el 2011, Altoros Argentina, es partner de la conferencia regional sobre Ruby y tecnologías relacionadas más importante de la comunidad Ruby de Latinoamérica.

Al respecto, Manuel García, Director de las oficinas en Santa Fe, nos dice:

Nos enorgullece brindar apoyo a la comunidad rubysta, porque compartimos los ideales del software libre y de la inteligencia colectiva y queremos que esta comunidad crezca y se fortalezca

La RubyConf Argentina 2013 se realizará en Buenos Aires, los días 27 y 28 de Noviembre en la Ciudad Cultural Konez (Sarmiento 3131 – CABA)

Ya tienen confirmada su presencia importantes speakers, como Brock Whitten (Harp platform), Thomas Edward Figg (Code Club), Ostap Cherkashin (Mingle), Jano González (HopIn) y Linda Sandvik (Code Club).

El poder de los enumeradores

Ruby viene equipado con la clase Enumerator, que inclue Enumerable. Esta clase es muy útil para un par de cosas, pero es realmente buena para generar secuencias (posiblemente infinitas).

Vamos con un clásica: la secuancia Fibbonacci puede ser implementada de esta manera:

fib = Enumerator.new do |yielder|
  a, b = 1, 0
  loop do
    yielder.yield b
    a, b = b, a + b
  end
end

fib.next #=> 1
fib.next #=> 1
fib.next #=> 2
fib.next #=> 3
fib.next #=> 5

fib.rewind # utilizar retroceso para restablecer el secuenciador
fib.next #=> 1
# y un montón de métodos de forma gratuita!

fib.take_while { |i| i <= 100 }
=> [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

fib.first(10)
=> [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

fib.select(&:prime?) # No deje que ruby asuma que su enumerador es finito (si no lo es)
=> '*colapso universal*' 

¿Qué pasa con las funciones matemáticas?

class Quadratic < Enumerator
  # argumentos de palabra clave, nuevos en Ruby 2.0
  # comprobar los enlaces para más información
  def initialize(a=0,b=0,c=0, floor: 0, ceiling: Float::INFINITY)
    super() do |yielder|
      x = floor
      while x <= ceiling do
        yielder << a*x**2 + b*x + c
        x += 1
      end
    end
  end
end

q = Quadratic.new 1, 0, 0, floor: -10, ceiling: 10

q.next
=> 100
q.next
=> 81
q.each.with_index { |n, i| puts "f(#{i-10})= #{n}" }
=> [10000,
 6561,
 4096,
 2401,
 1296,
 625,
 256,
 81,
 16,
 1,
 0,
 1,
 16,
 81,
 256,
 625,
 1296,
 2401,
 4096,
 6561,
 10000]

Ver más:

http://ruby-doc.org/core-2.0/Enumerator.html
http://blog.rubyhead.com/2013/02/26/ruby-2-0-getting-started-named-parameters/

AJAX en Rails

En un post anterior hablé un poco de cómo se siente codear en Coffeescript. Este pequeño tutorial trata acerca de los puntos básicos a la hora de hacer AJAX en Rails . Esta vez voy a usar un clásico: una aplicación de microblogging con soporte para crear blog posts y consideraré una función asincrónica para votarlos.

$ rm public/index.html
$ rake db:create
$ rails g resource post title:string name:string votes:integer
$ rake db:migrate

Ya tenemos una base en la que trabajar. Hay muchas maneras de lidiar con votos. Podés elegir usar un modelo para poder mantener seguimiento de los votos de un usuario, agregar la capacidad de remover un voto, limitar la cantidad de veces que un usuario puede votar en un misma acción de votación, etc. Pero voy a usar la forma más simple: una columna votes de la tabla Posts. Recomiendo usar ActiveRecord::Counter para actualizar el campo votes.

# app/controllers/posts_controller.rb
class PostsController < ApplicationController
  respond_to :html, :json

  def index
    respond_with @posts = Post.all
  end

  def vote_up
    @post = Post.find(params[:id])
    if @post.increment! :votes
      respond_with @post do |format|
        format.html { redirect :back }
      end
    end
  end
end

Vamos a necesitar agregar algunas rutas:

# config/routes.rb
MyBloggingApp::Application.routes.draw do
  root to: 'posts#index'
  resources :posts do
    member { post :vote_up }
  end
end

Y debajo tenemos una vista básica:

# app/views/posts/index.haml
.posts
  %h1 Listing posts

  - @posts.each do |post|
    %hr
    .post
      %legend
        = post.title
        %small{id: "#{post.id}_votes"}
          Votes: 
          = post.votes
      = link_to 'Vote_up', vote_up_post_path(post), class: 'vote_up', 'data-method' => :put, id: post.id
      = post.body.html_safe

Aqui tenemos un retazo de JS (Coffeescript) para implementar la votación asincrónica. Estamos enlazando la llamada AJAX al evento ‘click’ del botón para votar. Si el JS es desactivado o se encuentra un error de runtime, el boton va degradar de forma transparente a la acción html: votar y redirigir de vuelta.

# app/assets/posts.js.coffee
$ ->
  $('.post a.vote_up').click (ev)->
    ev.stopImmediatePropagation()
    ev.preventDefault() # If the javascript is enabled prevent default event (navigation)
    id = @id
    $.ajax
      url: "/posts/#{id}/vote_up.json",
      type: 'POST',
      complete: (data)-> # Update the 'Votes: X' field on success 
        post = JSON.parse(data.responseText)
        $("small##{id}_votes").text("Votes: #{post.votes}")

Si querés pegar una ojeada el código fuente para esta app se encuentra acá.
Más Info
jQuery.ajax() docs
David Parker’s blog post on Rails respond_to

Twitter Bootstrap y un menú multinivel para móviles

El Bootstrap de Twitter es impresionante. De verdad!. Nos brinda tantas facilidades en un paquete muy bien organizado que es difícil de creer que sea real. Pero… – Sí, siempre hay un pero – tiene algunas fallas. Los contribuyentes están trabajando muy duro para resolverlas, pero mientras tanto tenemos que lidiar con esas pequeñas molestias.

La locura del menú multinevel para móviles

Cuando creamos una aplicación con el Bootstrap, esta maravillosa librería nos ayudará mucho cuando se trata de adaptar el diseño a una plataforma móvil. Un buen ejemplo es la barra de navegación (“nav bar” de ahora en más) que podemos agregar a la parte superior de nuestra aplicación. Van a terminar con una barra de navegación totalmente extendida cuando el navegador sea lo suficientemente amplio y una versión colapsada, comprimida cuando el navegador sea estrecho.

Qué sucede cuando agregamos un menú multinivel? Sólo tomemos un árbol de categoría/subcategoría/producto como ejemplo.

Cuando tocamos en una de las subcategorías (ramas) para ver sus hijos, seremos redireccionados a la página de la subcategoría, si esta tiene el link. Si hemos usado un símbolo cardinal (#) para indicar que el enlace de esa categoría lleva a ninguna parte, la página volverá a cargarse. Intentalo.

Arreglando el árbol

Entonces, cómo podemos hacer para tocar en una subcategoría y que sólo nos muestre sus hijos y no siga un link?

Unas pocas líneas de nuestro amigo, Javascript:

$(document).on('touchstart.dropdown.data-api',
'.dropdown-submenu > a', function (event) {
event.preventDefault();
}

Esto evitará que el navegador siga un link cuando toquemos en una subcategoría. Pero tiene un efecto secudario negativo en mucho navegadores: también bloqueará la visualización de los hijos de la subcategoría.

Para resolver este inconveniente, necesatiremos agregar una clase CSS al elemento li que contenga el a link:

$(document).on('touchstart.dropdown.data-api', '.dropdown-submenu > a', function (event) {
event.preventDefault();
var parent = $(this).parent();
if (parent.hasClass('open')) {
parent.removeClass('open')
} else {
parent.addClass('open');
}
});

Ahora, cuando toquemos en una rama del árbol, el menú nos mostrará la rama hija en lugar de seguir un enlace.

Dos (o tres) potentes iteradores

Si ya tienes alguna experiencia de trabajo con Ruby, probablemente has tenido que lidiar con las colecciones.
Las colecciones pueden ser tediosas. Pero GAR (Gracias a Ruby) disponemos de un amplio arsenal para tratar con ellas!
En este post voy a mostrarte dos métodos iteradores de Ruby que realmente me agradan, sobre todo por su sencillez y belleza.

Mi caprichoso ejemplo

Hace poco, tuve que hacer un pequeño parser JSON para el feed público de Flickr, así que voy a usar algunos métodos de ese módulo como ejemplo para nuestro artículo.
Básicamente, el módulo tenía que ir a buscar un objeto JSON devuelto por la API de Flickr, y parsearlo a un objeto JSON de Ruby, chequeanbdo algunas validaciones.
Este tipo de funcionalidad no toma más de una docena de líneas de Ruby, pero es un buen ejemplo para lograr nuestro objetivo.

Nos centraremos en dos métodos para el módulo:

  • json_items: devuelve un array de hashes. Cada hash representa un elemento del feed de la API de Flickr.
  • check(item): comprueba si el hash dado satisface ciertas validaciones.

También nos saltaremos toda la codificación de la URL y algunas cosas de la validación para centrarnos en los métodos iterativos.

DigitalOcean, un nuevo y asombroso hosting VPS

DigitalOcean- es un nuevo y asombroso hosting VPS,  barato y fácil de usar, que puede convertirse en una de las opción interesante para startups, proyectos pequeños y en rápido crecimiento.

El servicio provee una precio asequible, a partir de 5 US$ / mes, y las facturas por hora. Esto se combina con la facilidad de uso: todo lo que necesita es conseguir una IP dedicada y acceso de root a su servidor, y ya puede empezar a trabajar, pues el panel de control es muy simple. DigitalOcean utiliza discos duros SSD y una red rápida que ofrecen velocidad de trabajo al los servidores. Por otra parte, el servicio promete audazmente un tiempo de actividad del 99,99% en la red, energía y disponibilidad del servidor virtual. Combine todo esto, y obtendremos una interesante solución para considerar.

Pero, excépticos, seguramente pensaremos: ¿dónde está la trampa? Para más detalles, por favor, lea la información sobre  DigitalOcean que el desarrollador de Ruby de Altoros, Eugene Melnikov, ha escrito:  http://altoros.github.io/2013/digitalocean-new-amazing-cloud-vps-hosting

Mandrill: un servidor SMTP gratuito para aplicaciones

Correos electrónicos transaccionales son parte importante de cualquier proyecto o negocio, no importa si se trata de una nueva empresa o una gran empresa. Pero si bien las grandes empresas pueden pagar la enorme cantidad de correos enviados y los costos de los servicios de distribución de correo, las empresas más jóvenes suelen buscar opciones más baratas. Mandrill de MailChimp es una de estas opciones.

Se trata de un servicio de distribución de correo transaccional que permite el envío de hasta 12.000 correos electrónicos por mes de manera gratuita. Si se necesita más, hay varias opciones a precios asequibles.

Mandrill brinda soporte para registros SPF y DKIM que garantizan que su correo electrónico no será considerado como spam por la mayor parte de los servicios de e-mail. Además, permite el seguimiento de estados de correo electrónico, como enviar, rebotados, recibidas, hecho clic, marcados como spam, etc. También es compatible con las plantillas y etiquetas especiales para las pruebas A / B, lo cual siempre es una ventaja.

Por favor, lea la descripción completa del servicio por nuestro especialista Eugene Melnikov, siguiendo este enlace http://altoros.github.io/2013/mandrill-free-smtp-server-for-application

ALTOROS Argentina dijo presente en el FLISOL 2013

Hace unos días, la Escuela de Artes Visuales “Prof. Juan Mantovani” (Santa Fe, Argentina) alojó al Festival Latinoamericano de Instalación de Software Libre (FLISOL) en cuyo marco Julio Lucero, Gastón Ramos y Pablo Oldani, tres desarrolladores de Altoros Argentina, brindaron charlas.

De esta manera, el primero de nuestros compañeros que tomó la palabra fue Gastón Ramos con su charla “Como viajar en el tiempo con mucho menos que un DeLorean”. En ella, exploró los problemas que enfrentan los programadores a la hora de reconocer cuál es la versión que “funciona” para entregar. En este sentido, Gastón defendió la tesis de que es necesario usar un sistema de control de versiones para gestionar los cambios en nuestros proyectos y explicó los fundamentos básicos de los sistemas de control versiones y los comandos principales de git.

A continuación, fue el turno de Pablo Oldani, quien brindó una “Introducción a Ruby” a través de la que se repasaron conceptos básicos del lenguaje y una breve explicacion de la filosofía y objetivos que fueron planteados al desarrollar ruby.

Finalmente, Julio Lucero repasó las palabras de Lawrence Lessig (creador de Creative Commons) basándose en la película “RIP: Remix Manifesto” en donde mostró algunos ejemplos de lo que pasó a lo largo de la historia en cuanto a la música, lo artístico, etc.

Una mirada a VIM

Estoy empezando a utilizar Vim y no voy a cambiarlo por otro, al menos por ahora. Aunque reconozco que no es sencillo comenzar a usarlo, hace que valga la pena el esfuerzo.

Un editor modal

“the best code is no code at all”

A menudo escucho que las herramientas que se usan, ayudan a hacer las cosas de cierta manera. En general, estas herramientas simplifican el trabajo y ahorran tiempo y esfuerzo dedicado a completar tareas. También cambian el resultado del trabajo, normalmente para mejor.

Bien, Vim hace sencillo pensar de cierta manera cuando escribimos código. Lo primero que notamos cuando abrimos el Vim es un paso extra al insertar texto. Esta es la primera impresión y, probablemente, lo más decepcionante. Y está bien que así sea, ya que agregar texto no es nunca sencillo, este paso extra nos permite pensar dos veces antes de hacerlo. Vim facilita editar textos, moverlos de una parte a otra, etc. Sin embargo, incorporar mucho texto puede complicarse con Vim.