ruby

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

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

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

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

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

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

Por qué Coffeescript

Advertencia: Este artículo tiene la intención de fomentar un estilo de codificación (léase preferencias) que puede hacer su vida más fácil. Algunos de estas sugerencias podrían hacer que se parezca a ciertos lenguajes que pueden o no ser de su agrado de los lectores -o incluso ofenderlos. Venimos en paz, sin ánimo de faltarle el respeto a nadie.

Javascript es la única opción que tenemos como lenguaje interpretado por el navegador. Aunque potente, codificar la sintaxis JS pura, puede llegar a ser complicado, especialmente para los que vienen de lenguajes orientados a objetos como Ruby o Python. Coffescript aborda este problema con una solución transparente: un hermoso lenguaje que compila a JS. Como yo lo veo, CS tiene la intención de dejarlo hacer las cosas a manera de Ruby. Es decir, escribir menos, hacer más.