Groovesquid, Cocoa y MacRuby. Pequeñas lecciones aprendidas.
Hace un par de días decidí que sería buen momento de probar MacRuby y hacer una aplicación seria, algo de lo que pudiera estar orgulloso de distribuir a manos del público general. La idea, fue reimplementar un pequeño servidor que había hecho en ruby hace unos meses pero ahora más bonito y con un GUI. Quisiera compartir un poco sobre este proyecto, y unas lecciones aprendidas durante estos últimos días.
## Groovesquid.
El concepto de groovesquid es muy sencillo: un par de aplicaciones que se conectan con Grooveshark Desktop para democratizar la música en una fiesta o entorno de trabajo. La forma en que trabaja se puede resumir en unos puntos sencillos:
1. El servidor corre Grooveshark Desktop junto con Groovesquid, quien se anuncia con DNS-SD.
2. Los cotrabajadores o asistentes a la fiesta pueden cargar el cliente en su computadora o smartphone.
3. Los cotrabajadores envían canciones al playlist.
4. Todos pueden votar cuando sale una canción, si a la mayoría le gusta se queda, si no, se va y pasamos a la siguiente.
## Desarrollando un GUI con Cocoa.
Aunque llevo mucho tiempo desarrollando interfaces de usuario para aplicaciones web, esto podría bien ser el primer intento serio de hacer una aplicación de escritorio. Mi concepto fue un poco ambicioso y se veía algo así en photoshop:
[](http://nsovocal.com/wp-content/uploads/2011/07/groovesquid-ui-mockup1.png)
* Un par de etiquetas de texto (editables al hacer doble click.)
* Imagenes de fondo para texturizar.
* Un par de LEDs de status.
* Un bonito contador de usuarios conectados.
A pesar de que no son muchos elementos, ninguno de ellos hace las cosas como cocoa las hace por defecto. Revisando de nuevo la lista de asistencia, pero ahora con los problemas:
* ¿Cómo hacer que una etiqueta de texto sea editable al hacer doble click?
* ¿Cómo aplicar una imágen de fondo a una vista?
* OK, aquí no hubo mucho problema.
* ¿Cómo rendereas texto con una imágen de fondo y una de frente?
La respuesta para los que conocen cocoa es sencilla: SUBCLASES PARA TODO! WOO!
## Subclases de Cocoa con MacRuby
La integración de MacRuby con Cocoa es impresionante, hacer una subclase de un elemento base de AppKit es intuitivo y fácil. Por ejemplo, sin poco conocimiento previo de MacRuby en específico pude hacer unas clases bastante sencillas:
[ruby]
class GSTextField
def mouseDown(theEvent)
if theEvent.clickCount == 2 then
self.editable = true
end
super
end
end
[/ruby]
*Campos editables.*
[ruby]
class GSTextFieldCell
@@gShadow = NSShadow.alloc.init
@@gShadow.setShadowColor(NSColor.colorWithCalibratedWhite(1.0, alpha:1.0))
@@gShadow.setShadowBlurRadius(0.0)
@@gShadow.setShadowOffset(NSMakeSize(0.0,-1.0))
def drawInteriorWithFrame(cellFrame, inView:controlView)
@@gShadow.set
super
end
end
[/ruby]
*Texto con sombras.*
[ruby]
class GSView
def drawRect(rect)
#set the background as transparent
image = NSImage.imageNamed(“mainbackground”)
NSColor.colorWithPatternImage(image).set
NSRectFill(bounds)
end
end
[/ruby]
*Vista con una imágen de fondo.*
En definitiva no hay mucho sofisticado sobre esto. MacRuby es una traducción tan perfecta de Cocoa (en Objective C) a Ruby como se puede hacer. Todo se comporta como uno espera de una librería ruby. Aún hay varios bugs que refinar (tuve comportamiento muy errático con las variables de instancia) pero todo se ve bastante lindo.
¿A qué pudo llegar un novato en menos de 24 horas de trabajo? ¿Que tan cerca estuvo de su imágen de photoshop original? La respuesta:
[](http://nsovocal.com/wp-content/uploads/2011/07/groovesquid-server-screenshot.png)
Bastante acertado en mi opinión, el cambio más notorio es la inclusión de un nuevo botón (para prender y apagar el server.)
## Pensamientos Finales
Basandose en este proyecto, debo decir que MacRuby es una oportunidad muy grande de adentrarse al entorno de Cocoa para desarollar para OS X o iOS. Cocoa no es sencillo y hay mucha documentación que leer (muy completa por cierto), pero estar utilizando un lenguaje interpretado familiar es una ventaja bastante grande. Se puede hacer mucho con muy poco. De verdad recomendado para todos aquellos desarrolladores de Mac que han utilizado Objective C pero se sienten más familiares con Ruby. Si recomiendo mucho concoer al menos la sintaxis de Obj-C para poder traducir los ejemplos y la documentación.
Hay dos desventajas muy grandes si vas a desarrollar con MacRuby, una es muy impactante en proyectos chicos y la otra en proyectos grandes. Primero: es mucho más difícil debuggear que utilizando las herramientas de Objective C. LLDB y GDB son increiblemente buenos y ambos son parte de XCode, lamentablemente no funcionarán para matar los bichos de tu lenguajillo de nivel superior y tendrás que usar herramientas inferiores, que pueden ser bastante crípticas. Segundo: Tendrás que incluir el framework de MacRuby con tu aplicación, lo que agregará unos buenos 30MB adicionales a tu aplicación (En el caso de Groovesquid, el producto final pesa 32MB. Ouch.) Aparentemente con OS X Lion y MacRuby 1.0 tendremos algunos arreglos, pero aún no sabemos que tanto vaya a ser el compromiso. Por ejemplo, MacRuby viene con OS X 10.7 pero como Framework privado, lo que significa que te puedes olvidar de distribuirlo por la App Store. Si Apple decide hacerlo público, lo cual no sería muy difícil, uno de los problemas más grandes se iría. El otro ya dependería de la integración con XCode, que esperemos vaya mejorando cada vez más.
Por ahora, seguiré experimentando con MacRuby construyendo el cliente, y quisiera compartir luego muchas otras cosas que no mencioné (especialmente sobre sockets y dnssd), pero ya será en otro momento. Esperen también proximamente el código del servidor y cliente en GitHub, abriré el código cuando tenga alguna versión que al menos cumpla con el adjetivo “funcional”. Les recomiendo que le echen un vistazo y si tienen algún proyecto sencillo en Objective-C intenten traducirlo a MacRuby.