Altoros

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 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

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

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

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.