3funkymonkeys

Context

I recently found myself in a situation where I needed to have my Rails application connected to two different databases.

I’m not going to dive into in the reasons for this, but I’d like to show the way I found to do it, and the problems (just a few) along the way.

ActiveRecord::Base

Rails loads the database configuration from the config/database.yml file, and saves it into ActiveRecord::Base#configurations for the later use with ActiveRecord::Base#establish_connection.

Once the connection to the database is established it is reused, however, if the connection to the database is lost at some point, ActiveRecord will try to reconnect with the configuration it has stored.

Second Connection

For the second database connection we’ll create another “Base” class to inherit from which will inherit from ActiveRecord::Base but will override the configuration to connect to the other database, let’s say:

module Backend
  class Model < ActiveRecord::Base
    @@conf = {}
    @abstract_class = true
  
    def self.configurations
      @@conf
    end

    def self.configurations=(configurations = {})
      raise RuntimeError.new('Invalid configuration Format') unless configurations.is_a? Hash @@conf = configurations
    end
  end
end

This class will load it’s configuration from config/backend_database.yml (which is a file with the exact same format than config/database.yml but using different db access  configuration). For this, create an initializer (config/initializers/backend_database.rb) with the following lines:

require 'erb'

@@backend_configurations ||= YAML::load(ERB.new(IO.read(File.join(Rails.root, "config", "backend_database.yml"))).result)

Backend::Model.configurations = @@backend_configurations
Backend::Model.establish_connection

Why override the configurations method?

If you use the inherited configurations method it will overwrite the @@configurations variable and if ActiveRecord::Base need to restore a lost connection it will attempt to connect to the second database and will turn your application into a mess.

Also, note we are not using the @@configuration class variable either, for the same reason. 

Last but not least, the @abstract_class = true is necessary for a correct table names guessing.

And that’s about it, you can now have your models inherit from ActiveRecord::Base to have the databases configured on config/database.yml as their data source and inherit from Backend::Model to have the databases configured on config/backend_database.yml and use ActiveRecord relationships completely  transparent, for example, you could have:

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < Backend::Model
  belongs_to :post
end

Warning

Rake tasks like db:migrate won’t take this second configuration into consideration, so this approach won’t cover migrations.

It should, at least theoretically (because I haven’t tried it yet), behave correctly with the test environment.

And that’s it. I hope it helps.

@k4nd4lf

Hi guys!

If you use Arch Linux you’d know that it defaults to Python 3 since a while ago.

The thing is, if you want to install Node.js, you’ll get syntax errors on Python scripts, because they are for Python 2.

Even when Arch Linux defaults to Python 3, it doesn’t remove Python 2, so you can have both installed on your system (pacman -S python2 will give you that version). So, to install Node.js, you need to modify the Python scripts to set the interpreter environment to python2. you can achieve this with:

for i in $(grep -Rl "python" *); do sed -i -e 's/\/usr\/bin\/env\spython$/\/usr\/bin\/env python2/g' $i; done

Also, you need to modify the Makefile to use python2 executable

sed -i -e 's/python\b/python2/g' Makefile

Then follow the installation instructions and you’ll get it working.

Hope it helps!

Interesante infografía compartida por Jeffrey Zeldman. Es impresionante como Android va ganando cada vez más mercado, y ver cuáles de las diferentes APIs de HTML5 son las más utilizadas.

Ayer asistimos al evento organizado por Palermo Valley sobre AM/PM: Diseño de Interacción. El mismo abarcó un tema muy interesante y muchas veces desestimado a la hora de realizar un proyecto, que es el diseñar la interacción del usuario y los grupos de trabajo involucrados en el proyecto a fin de conseguir un producto mejor y más usable.

El ejemplo utilizado en la charla fue el desarrollo de un software para restaurantes. Si bien es una situación, sino cotidiana, por todos conocida, a la hora de analizar y encontrar una solución vimos que se pueden obtener diferentes sistemas, a cada cual con sus pros y sus contras, y desde el más sencillo al más complejo.

Uno de los casos de uso y el ejemplo de entrada al diseño de interacción fue el hacernos pensar cómo es que McDonald’s funciona de la manera que funciona en todo el mundo. La distribución de las mesas y las cajas, la forma de atención, y particularmente la incomodidad del mobiliario para impedir la sobremesa fueron los puntos más destacados.

Luego pasamos al análisis en sí de un restaurante tradicional, nombrando las necesidades, teniendo en cuenta especialmente a quienes interaccionan con el sistema: mozos y cajero. Por último, vimos como se podría realizar una aplicación más integral y que la misma tenga una interfaz web para que los clientes puedan realizar sus pedidos online, y como partiendo del diseño para dispositivos móviles y utilizando diseño web responsivo, se pueden obtener mejores interfaces.

Realmente una charla muy atractiva, y con el condimento de poder descargar la presentación y código fuente, entre otros.

Los oradores son miembros de Keikendoun espacio conformado por Icograma y Corvalius para el desarrollo, investigación, educación, asesoramiento y mentoring en metodologías ágiles de desarrollo, diseño de interacción y en la convivencia entre ambas disciplina (ver más). Una de las cosas más interesantes de la charla fue el anuncio de, en conjunto con la gente de IxDA Buenos Aires, un curso de 18 horas titulado Introducción al diseño y maquetación de interfaces web. El curso se ve más que interesante, y no tenemos dudas será un éxito.

Desde 3funkymonkeys esperamos poder participar y acceder a este y otros cursos relacionados, y felicitamos y agradecemos a los organizadores y a toda la gente que hace posible este tipo de eventos.

Interesante infografía de las cabeceras mas comunes HTTP

Interesante infografía de las cabeceras mas comunes HTTP

garagelab:

Los invitamos a nuestra primera Hackathon de Problemas de Innovación Abierta.  La innovación abierta funciona cuando un oferente convoca a resolver un problema  cuya solución le genera valor.
Binaria ofrecerá un Challenge para optimizar un modelo predictivo. Poder Ciudadano  tendrá también su Challenge donde convocará a solucionar un problema de trazabilidad del gasto en Publicidad Oficial.  Estamos recibiendo propuestas de otros oferentes y las iremos publicando acá.
También se podrán elegir problemas de Plataformas de Open Innovation como Innocentive, IdeaConnection, Kaggle, Innoversia, etc.
Para que esos y otros problemas puedan tener solución, necesitamos seguir armando grupos de mentes brillantes y hacedores.
La agenda arrancará a las 10am, donde cada uno se presentará.
Presentaremos los distintos “Challenge” y cada uno elegirá en cuál trabajar.
Al mediodía haremos un almuerzo informal.
Después de las 5pm, empezaremos a presentar lo que cada grupo haya podido hacer  con cada Challenge.
Luego, habrá reuniones entre los oferentes y los grupos para ponerse de acuerdo  en la entrega del premio o en continuar trabajando en el problema si aplicará.
Publicaremos también en los próximos días unas reglas simples de funcionamiento del evento.
Los esperamos a todos.
GarageLab

garagelab:

Los invitamos a nuestra primera Hackathon de Problemas de Innovación Abierta.
La innovación abierta funciona cuando un oferente convoca a resolver un problema
cuya solución le genera valor.

Binaria ofrecerá un Challenge para optimizar un modelo predictivo.
Poder Ciudadano tendrá también su Challenge donde convocará a solucionar un problema de trazabilidad del gasto en Publicidad Oficial.
Estamos recibiendo propuestas de otros oferentes y las iremos publicando acá.

También se podrán elegir problemas de Plataformas de Open Innovation como Innocentive, IdeaConnection, Kaggle, Innoversia, etc.

Para que esos y otros problemas puedan tener solución, necesitamos seguir armando grupos de mentes brillantes y hacedores.

La agenda arrancará a las 10am, donde cada uno se presentará.

Presentaremos los distintos “Challenge” y cada uno elegirá en cuál trabajar.

Al mediodía haremos un almuerzo informal.

Después de las 5pm, empezaremos a presentar lo que cada grupo haya podido hacer
con cada Challenge.

Luego, habrá reuniones entre los oferentes y los grupos para ponerse de acuerdo
en la entrega del premio o en continuar trabajando en el problema si aplicará.

Publicaremos también en los próximos días unas reglas simples de funcionamiento del evento.

Los esperamos a todos.

GarageLab

El día miércoles 13 de Abril de 2011 asistimos al after office organizado por Start-Ups Buenos Aires. El evento se realizó en Carnal Bar, y quedamos impresionados por la buena recepción y la cantidad de público presente.

Para nosotros fue una gran oportunidad de escuchar e interiorizarnos un poco más en las tendencias e ideas del mercados. Tenemos mucho por aprender en cuanto a la manera de relacionarnos con otros emprendedores sin sonar como autómatas reproduciendo una grabación, pero a su vez tampoco queremos perder nuestra informalidad.

Desde aquí queremos agradecerle la invitación y organización a Eric Northam, CEO de EasyBroker, y esperamos con ansías el próximo after office.

3FUNKYMONKEYS surge de la necesidad que teníamos dos programadores y un diseñador de desarrollar herramientas avanzadas y utilizando las últimas tecnologías disponibles para el caso.

Como buenos geeks sentimos la necesidad de ampliar nuestros conocimientos y compartirlo con el resto del mundo, buscando siempre la manera más ágil y cómoda para trabajar.

Renegamos del mundo empresarial tradicional, aquel cuyos cánones están basados en ideas de la Revolución Industrial. Vivimos una nueva era cuya revolución llega incluso más lejos, donde el modelo que separa al cliente y al proveedor como dos entidades diferentes ya no funciona. Amamos nuestra profesión y queremos trabajar en proyectos que nos despierten la misma pasión, involucrando todo el tiempo a nuestros clientes, haciéndolo partícipe durante el proceso de desarrollo, respetando su opinión y educándolo en la mejor manera de sacar provecho a las tecnologías actuales y futuras.

Vemos el avance y alcance arrollador de las tecnologías de información en plataformas móviles como un gran desafío, sin descuidar las plataformas de escritorio que ocupan también gran parte de nuestro día a día. Queremos llegar más lejos de lo que nos atrevemos a imaginar, y llevar a nuestros clientes con ellos.