Modulos parte II
Wednesday, 12 December , 2007
Bueno el post anterior vimos como usar módulo con métodos de instancia, métodos de módulo y variables de instancia de forma simple, ahora vamos a ver que pasa con la herencia.
Vamos a refrescar algunos conceptos. Algunas diferencias entre módulos y clases:
Cuando escribimos una clase, podemos tener instancias de esa clase (objetos) estas instancias pueden ejecutar los métodos de instancia de esa clase, por otro lado los módulos no pueden tener instancias, los módulos son “Mixed In” en las clases. Cuando esto sucede la instancia de la clase tiene la habilidad de llamar métodos de instancia definidos en el módulo (esto lo vimos en los ejemplos anteriores). Se podría decir que cuando hacemos un Mixin, por ejmeplo dentro de la clase A hacemos un include del Módulo B, es como que A hereda de B, las instancias de A pueden llamar a los métodos de instancia del módulo B. La principal diferencia entre la herencia de clases y la de los Mixins es que una clase puede heredar de una sóla superclase pero en una clase puede “Mixinear” muchos módulos (esto vendría a ser algo así como herencia múltiple). Cuando estamos diseñando un programa y detectamos que un comportamiento o conjunto de comportamientos es aplicable a más de una entidad u objeto entonces es un claro candidato a Módulo. Vamos directo al ejemplo:
Module A
def imprimir
puts "Imprimo desde el Modulo A"
end
end
class B
include A
end
class C < B
end
obj = C.new
obj.imprimir
Salida:
=> Imprimo desde el Modulo A
El método de instancia “imprimir” está definido en el Módulo A que luego es “Mixed In” en la clase B , y la clase C es una subclase de B. obj es una instancia de C. A través de esta “cascada’ el objeto (ibj) tiene acceso al método “imprimir”, veamos como es esto un poco más en detalle:
1- El objeto recibe el mensaje “imprimir”
2- La clase C define un método de clase llamado “impirmir” ?
3- NO
4- C tiene algún módulo Mixed in?
5- NO
6- La superclase de C es decir (B) define un método de instancia llamado “imprimir”
7- NO
8- B tiene algún módulo Mixed In?
9- SI: A
10- A define un método de instancia llamado “imprimir” ?
11- SI, entonces lo ejecuta
Esto es todo por este post, nos vemos en el próximo ![]()
Modulos
Tuesday, 11 December , 2007
Bueno en este post voy a mostrar un ejemplo sencillo con módulos de ruby, muy básicamente un módulo es una colección de métodos y constanstes, los métodos en un módulo pueden ser métodos de instancia o métodos de módulo. Los métodos de instancia aparecen como métodos en una clase cuando el módulo es incluido, los métodos de módulo no. Al contrario los métodos de módulo pueden ser llamados sin crear un objeto encapsulado, mientras que los métodos de instanacia no. (ref: http://www.ruby-doc.org/core/classes/Module.html)
Veamos un ejemplo dónde tenemos algunos métodos de instancia:
module Saludo
attr_accessor :saludo
def agregar_nombre
@saludo << " Pepe"
end
end
class SaludoNuevo
include Saludo
def saludo= value
@saludo = value
end
end
s = SaludoNuevo.new
s.saludo = 'Hola'
puts s.saludo
s.agregar_nombre
puts s.saludo
La salida de este programa es la siguiente:
=> Hola => Hola Pepe
Cómo podemos ver los métodos declarados dentro del Módulo Saludo aparecen cómo métodos de instancia de la clase SaludoNuevo, dado que Saludable “Mixed in” en SaludadorNuevo. Los Mixins son la manera en que ruby resuelve la Herencia Múltiple (Ya veremos algunos ejemplos más adelante).
Ahora agregamos un método de Módulo:
module Saludo
attr_accessor :saludo
def agregar_nombre
@saludo << " Pepe"
end
def Saludo::general
"Hola a todos"
end
end
class SaludoNuevo
include Saludo
def saludo= value
@saludo = value
end
end
puts Saludo::general
s = SaludoNuevo.new
s.saludo = 'Hola'
puts s.saludo
s.agregar_nombre
puts s.saludo
Y la salida es:
=> Hola a todos => Hola => Hola Pepe
Ahora vamos a agregar una variable de instancia en el módulo Y la vamos a usar y modificar desde la clase cliente:
module Saludo
attr_accessor :saludo, :nombres
def initialize
@nombres = ["Pepe", "Gaston", "David"]
end
def agregar_nombre
@saludo << " Pepe"
end
def Saludo::general
"Hola a todos"
end
end
class SaludoNuevo
include Saludo
def saludo= value
@saludo = value
end
def saludo_general_con_nombres
"Hola " + @nombres.join(', ')
end
end
s = SaludoNuevo.new
puts s.saludo_general_con_nombres
# Modifico la variable de instancia @nombres Heredada del módulo "Saludo"
s.nombres << "Dave"
puts s.saludo_general_con_nombres
# Creo un nuevo objeto de Saludo Nuevo y modifico @nombres para
# ver que es una variable de instancia
s2 = SaludoNuevo.new
s2.nombres = ["Matz", "Kent", "Bruce"]
puts s2.saludo_general_con_nombres
puts s.saludo_general_con_nombres
la salida es:
=> Hola Pepe, Gaston, David => Hola Pepe, Gaston, David, Dave => Hola Matz, Kent, Bruce => Hola Pepe, Gaston, David, Dave
Bueno esto fue todo por ahora, cortito y sencilllo.
Monit y Mongrel
Monday, 19 November , 2007
Hace un tiempo escuché hablar de monit una herramienta que sirve para monitorear los mongrels (eso había escuchado yo…) pero en realidad es mucho más que eso! con monit podemos:
- Monitorear servicios y reiniciarlos o matarlos si están consumiendo mucha memoria o procesador.
- Iniciar un servicio que no está corriendo (y debería estarlo)
- Monitorear archivos, directorios, dispositivos
- Y mucho más…
Esta herramienta me viene al pelo dado que he estado experimentando algunos problemas con el mongrel (se cae o comienza a consumir mucha memoria). Para instalarlo en debian:
apt-get install monit
el archivo de configuracion está en /etc/monit/monitrc googleando un poco encontré este sitio
http://monitr.atmos.org/ el cual genera la configuracion para monit a partir de
los archivos de configuracion de mongrel_cluster.
Una vez que ya tenemos listo nuestro archivo de configuración tenemos que “activar” el monit y lo hacemos editando
el archivo /etc/default/monit cambiamos startup=0 por startup=1
Una de las cosas buenas de monit es que trae un sistema de monitoreo por web que por defecto está en el puerto 2812 (esto se especifica en el archivo de configuración) entonces lo podemos ver en http://localhost:2812/
Actualemente estoy monitoreando 4 mongrels y el nginx y funciona bárbaro, para los mongrels cuando detecta que consumen más de 100mb RAM los reinicia y cuando detecta que no responden (via http) también .
Acá les dejo un screenshot:
RubyGems bastante lento
Thursday, 15 November , 2007
Tengo un server con un micro AMD-K6(tm) 3D processor y 128 MB de RAM con un Debian GNU/Linux con ruby 1.8 RubyGems 0.9.4 mogrel y nginx 0.4.13-2, intentando hacer un gem update noté que se tomaba su tiempo, Updating installed gems…, luego de unas cuantas horas seguía en el mismo lugar, al parecer el problema está cuando cuando arma las lista de dependencias de las gemas, googleando un poco encontré esto: http://blog.segment7.net/articles/2007/10/13/rubygems-beta-0-9-4-5 una versión beta de rubygems que soluciona este problema, entonces pasé a instalarla:
gem update --system --source http://segment7.net/
Ahora funciona bastante mejor!!! al menos demora minutos y no horas como antes, como dice en el sitio este release mejora el manejo de memoria.
Programadores pensando en negocios
Tuesday, 13 November , 2007
Desde hace un tiempo vengo notando un target de personas que se dedican a programar pero que también se preocupan por los negocios… mmm suena raro, veamos como esto:
Voy a plantear un escenario:
Hay que desarrollar una aplicación web (un blog) entonces dos de los programadores se ponen a charlar:
Juan: Podemos hacerlo con ABCblog dado que está orientado al desarrollo de blogs, con el cual nos ahorraríamos mucho trabajo
Mario: Para mí sería mejor utilizar SuperFashionRayaNet que te permite compartir clases a nivel de capa 7 y además de heredar objetos en el motor de base de datos.
Juan: Pero Mario! sólo tenemos que hacer un simple BLOG, para qué queremos compartir clases a nivel de capa 7?
Mario: Bueno, en el futuro probablemente nos pidan que hagamos un planet y la única forma de hacer un planet es heredando objetos en el motor de base de datos para luego compartir en la capa 7.
Juan: Mario… hay muchos planets desarrollados con ABCBlog y no heredan &%$# todo lo que vos decís.
Mario: Entonces nos son planets.
Juan: Son sitios que engloban varios blogs, entonces son planets, además aún no nos pidieron un planet.
Mario: …….. Bueno me gustaría ver como funcionan.
Juan: http://panlets.com http://todo-en-panlets.org http://muchosblogs.org esos son sólo tres ejemplos de los cientos de miles que existen.
Al otro día:
Mario: Eh estado pensando y definitivamente tenemos que usar SuperFashionRayaNet
Juan: Por qué?
Mario: Bueno… parece ser que la api SuperFashionRayaNet hace más de 200 request al sitio www.subastas-deterror.com por hora y como www.subastas-deterror.com es uno de los principales partners de nuestra companía, estaríamos ganado mucho dinero.
Juan: ….. Y…. seeee. Tenés razón.
Una vez más, Programadores pensando en negocios, algo muy peligroso y creanmé que a pesar de que lo escrito más arriba es ficción, está basado en hechos reales.
Grupo de usuarios de Ruby del litoral
Sunday, 02 September , 2007
Esta semana hablando con algunos chicos de lug oro verde nos surgió la idea de hacer una reunión con todos aquellos que estamos interesados en ruby y ruby on rails, entonces pensé… por que no crear un grupo de usuarios de ruby del litoral? y acá está el resultado: tenemos wiki y lista de correo , desde ya litoraleños están todos invitados a participar, los esperamos!!!.
Oro verde - Desarrollo web ágil sobre rieles
Tuesday, 28 August , 2007
Bueno, lo primero que quiero hacer es agradecer a la gente de lugoroverde por invitarnos a las jornadas, la charla estuvo muy buena (mejor que de lo que yo creía ) la gente quedó muy entusiasmada con esto de Rails, luego de algo de teoría hicimos un pequeño ejemplo práctico, creamos un modelo y mostramos el scaffold y como personalizar las vistas creadas.
Les dejo acá los slides de la charla dwsr.pdf

Oro verde y CFengine
Sunday, 26 August , 2007
Llegamos a oro verder , un lugar muy tranquilo al aprecer y muy lindo en este momento estoy en charla de “administración centralizada con cfengine” el orador es Maxi Boscovich. Maxi define a Cfengine como un lenguaje de alto nivel para establecer políticas de configuración, la herramienta nació en el 93 y actualmente tiene un desarrollo muy activo, entre otras cosas nos permite establecer grupos de máquinas para poder aplicarles estas políticas de configuración.

Charla “Desarrollo web ágil con Ruby on Rails”
Friday, 24 August , 2007
El sábado 25 de agosto voy a dar una charla con Esteban Fornal (más conocido como Chaco) en las 4tas jornadas regionales de software libre de oro verde en Entre Ríos, la charla va a ser una introducción a Ruby on Rails, mostraremos las principales características del framework (al menos las que más nos gustan a nosotros) y si hay tiempo vamos a hacer algo de práctica. Nuestro prinicipal objetivo es motivarlos a que prueben RoR por cuenta propia, y entren en este marivolloso mundo de la programación ágil y divertida.
Los esperamos!!!
Emacs22 + emacs-rails
Friday, 17 August , 2007
Acabo de actualizar a emacs22, junto con la última versión de emacs-rails. Emacs22 viene con varias novedades, entre ellas soporte completo para unicode, acá hay un muy buen artículo con las nuevas carácterísticas.
Para los debianistas:
apt-get install emacs22
luego nos vajamos el emacs-rails
wget -c http://files.rubyforge.mmmultiworks.com/emacs-rails/emacs-rails-0.5.99.5.tar.gz
o lo bajamos a mano desde acá http://rubyforge.org/frs/?group_id=1484&release_id=11880
Luego lo colocamos en el folder ~/.emacs.d/site-lisp/emacs-rails/ y listo (ante cualquier duda leer http://dima-exe.ru/rails-on-emacs , yo no tuve problemas por que ya tenía la vieja versión instalada).
Hace casi un año que estoy usando emacs y no deja de sorprenderme, me encanta eso que “podés hacer todo con las telcas”, además también se puede utilizar sin un entorno gráfico (y va a ser exactamente igual sólo que en modo texto), Pruébenlo!. Para finalizar les dejo un screenshot para que vean como quedó, la verdad muy bueno.

