En la ultima versión de Mac OS X, denominada Leopard y presentada hace 2 días, se han introducido múltiples cambios que mejoran y dotan de nuevas capacidades a los programadores Ruby que trabajan con esta plataforma y por ende a aquellos que desarrollamos aplicaciones con Ruby on Rails en la misma. A continuación os presentamos un resumen, basado en una traducción libre de un texto desarrollado por la gente de macosforge que podéis encontrar, en su version original, aqui.
Ruby
Ruby ha sido actualizado a la versión 1.8.6 p.36, que era la ultima disponible en el momento del cierre final de la ultima edición de Mac OS X. Ademas han añadido algunos parches que solucionan algunos bugs importantes descubiertos después de la aparición de esta versión.
En Leopard, Ruby se nos presenta como un framework, algo que ya ocurría como diferentes librerías y tecnologías como Java, OpenGL, Kerberos, Python, etc… (puedes mirar en tu /System/Library/Frameworks) en las versiones anteriores. La compatibilidad con versiones de Ruby que existieran en tu equipo con anterioridad se ha intentado preservar puesto que /usr/bin/ruby y /usr/lib/ruby son enlaces simbólicos al framework:
$ readlink /usr/bin/ruby
../../System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/ruby
$ readlink /usr/lib/ruby
../../System/Library/Frameworks/Ruby.framework/Versions/Current/usr/lib/ruby
$ readlink /usr/lib/libruby.1.dylib
../../System/Library/Frameworks/Ruby.framework/Versions/Current/usr/lib/libruby.1.dylib
La librería libruby.1.dylib que contiene el interprete del core de ruby, esta disponible como binario universal, para arquitecturas ppc, i386, ppc64 y x86_64. Por lo tanto podemos embeber Ruby en aplicaciones de 64 bits. Todas las extensiones C estan disponibles tambien en versiones para arquitecturas de 32 y 64 bits, con la excepción de Tk que no puede hacerse 64-bit. El lanzador del interprete de Ruby, /usr/bin/ruby, se ha dejado solo como 32-bit por compatibilidad con los scripts que usa la extension de Tk o cualquier otra dependencia que sea 32-bit.
Las extensiones C de Ruby compilarán por defecto para dos arquitecturas, ppc y i386. De cualquier manera se puede utilizar la variable de entorno ARCHFLAGS para configurar la compilación de la extensión. Si por ejemplo quisieramos linkarla contra una libreria que no es universal (como los binarios de mysql.com que estan presentados por arquitectura de procesador) y quisieramos restringir el proceso de compilación a una unica plataforma podriamos:
$ ARCHFLAGS="-arch i386" ruby extconf.rb # Compilación y build solo par Intel 32-bit.
$ make
$ sudo make install
Tambien puedes establecer ARCHFLAGS para configurar la compilación de las gemas. Aunque recuerda: en Leopard el comando sudo no transfiere las variables de entorno a los procesos privilegiados asi que puede ser necesario tener que hacerlo desde una shell como root.
Las librerias Ruby que instales manualmente se ubicaran por defecto en /Library/Ruby/Site/1.8 que esta vacio despues de la instalación, pero que es parte del path de carga de Ruby antes que otras rutas. Puedes por lo tanto instalar cualquier librería Ruby o extensión si tener que preocuparte por problemas colaterales con lo instalado en /System.
Las extensiones C md5 y sha1, que son parte del conjunto estandar de librerias Ruby, han sido modificadas para usar la nueva API /usr/include/CommonCrypto en vez de libcrypto perteneciente al proyecto de OpenSSL, por razones de rendimiento. La extensión readline, que tambien forma parte de la biblioteca estandar de librerias de Ruby, es ahora instalada de serie. Internamente utiliza /usr/lib/libedit.dylib como implementación alternativa.
Por ultimo, los ejemplos que vienen con la distribución estándar de Ruby se distribuyen con Leopard en /Developer/Examples/Ruby/Ruby.
IRB
Con el soporte de serie de readline, ahora contamos con edición de linea de comando en IRB e histórico de comandos por defecto. Se ha modificado IRB para que mire en /etc/irbrc como ultimo lugar posible de configuración. Leopard viene con un fichero que provee de una configuración por defecto para todas las sesiones IRB, que hace un require 'rubygems', activa el autocompletado, utiliza un prompt sencillo y configura un historico permanente.
Hasta ahora todo esto se podía configurar con un fichero ~/.irbrc que se seguira teniendo en cuenta y que de existir hará que el /etc/irbrc sea ignorado.
Gemas
RubyGems 0.9.4 viene instalado por defecto junto con las siguientes gemas:
actionmailer (1.3.3)
actionpack (1.13.3)
actionwebservice (1.2.3)
activerecord (1.15.3)
activesupport (1.4.2)
acts_as_ferret (0.4.1)
capistrano (2.0.0)
cgi_multipart_eof_fix (2.2)
daemons (1.0.7)
dnssd (0.6.0)
fastthread (1.0)
fcgi (0.8.7)
ferret (0.11.4)
gem_plugin (0.2.2)
highline (1.2.9)
hpricot (0.6)
libxml-ruby (0.3.8.4)
mongrel (1.0.1)
needle (1.3.0)
net-sftp (1.1.0)
net-ssh (1.1.2)
rails (1.2.3)
rake (0.7.3)
RedCloth (3.0.4)
ruby-openid (1.1.4)
ruby-yadis (0.3.4)
rubynode (0.1.3)
sources (0.0.1)
sqlite3-ruby (1.2.1)
termios (0.9.4)
Tal y como se puede apreciar en la lista tendremos unas versiones bastante recientes de algunas de las librerías mas conocidas y utilizadas en el mundo ruby: rails, capistrano, mongrel, rake, RedCloth…En Leopard hay dos directorios destinados a actuar como repositorios de gemas:
$ ruby -r rubygems -e "p Gem.path"
["/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8", "/Library/Ruby/Gems/1.8"]
Las gemas preinstaladas que aparecían en la lista anterior se encontraran en el /System/... y todas las que nosotros instalemos a posteriori se ubicaran en /Library/.... Si queremos añadir una gema al repositorio de /System/... podemos especificarlo con la variable de entorno GEM_HOME. De igual manera tenemos total libertad para eliminar las gemas o versiones que deseemos del repositorio /System/....
DTrace
Se han añadido una serie de marcadores (probes en la terminología DTrace) estáticos al interprete de Ruby. Estos servirán para que podamos controlar y ejecutar código cuando se produzcan diferentes eventos dentro del interprete y están destinados a poder utilizar DTrace, el magnifico trazador/debugger desarrollado por Sun inicialmente para Solaris, como herramienta de optimización y traceo de nuestras aplicaciones. Al parecer el equipo de Leopard ha cogido los patches que habían realizado para Solaris los chicos de Joyent en su proyecto ruby-dtrace y los han modificado hasta funcionar correctamente con la ultima version de Mac OS X.
Los marcadores que se pueden registrar son los siguientes
function-entry
function-return
gc-begin
gc-end
line
object-create-done
object-create-start
object-free
raise
rescue
ruby-probe

Instruments es una nueva herramienta de Apple para la optimización del rendimiento de nuestras aplicaciones que viene incluida con Leopard y que tiene soporte para Ruby integrado de serie. Se puede crear un nuevo instrumento DTrace en la aplicación, seleccionar Ruby como tipo de marcador o probe, elegir los marcadores que deseemos de entre la lista presentada más arriba y comenzar a analizar el proceso Ruby que deseemos.
Existen una serie de ejemplos DTrace que usan estos tipos de marcadores en /Developer/Examples/Ruby/DTrace.
RubyCocoa y BridgeSupport
RubyCocoa, un libreria para poder conectar rutinas implementadas en Objective-C y Ruby, se entrega ahora instalada con el sistema por defecto en /System/Library/Frameworks/RubyCocoa.framework. La version instalada es en un 99% la version publica 0.12.0, con algunos pequeños cambios especificos de Leopard. El runtime de Ruby ha sido modificado para proveer de varios puntos especificos que RubyCocoa utiliza para salvar y cargar datos Cocoa especificos por thread cada vez que se entra y sale de los threads Ruby.
libffi, una libreria que provee de un interfaz de alto nivel para invocar funciones de terceras partes esta disponible en Leopard como binario universal en /usr/lib/libffi.dylib.
La mayor parte de los frameworks incorporados en Leopard son accesibles mediante BridgeSupport permitiendo su acceso automatico por lo tanto desde RubyCocoa o PyObjC:
AddressBook AppKit AppleScriptKit ApplicationServices Automator CalendarStore Cocoa Collaboration CoreAudio CoreAudioKit CoreData CoreFoundation CoreText CoreVideo DVDPlayback DirectoryService DiscRecording DiscRecordingUI ExceptionHandling Foundation ICADevices IOBluetooth IOBluetoothUI InputMethodKit InstallerPlugins InstantMessage JavaScriptCore LatentSemanticMapping OSAKit OpenGL PreferencePanes PubSub QTKit Quartz QuartzCore ScreenSaver ScriptingBridge SecurityFoundation SecurityInterface SyncServices SystemConfiguration WebKit XgridFoundation
Puedes encontrar ejemplos del uso de RubyCocoa en /Developer/Examples/Ruby/RubyCocoa.
Xcode y Interface Builder
En Leopard se han añadido a XCode plantillas para la creacion de proyectos de RubyCocoa y tambien para generar pruebas unitarias de testing. Tambien con la nueva versión se ha añadido un mejorado soporte de autocompletado para Ruby gracias a BridgeSupport.
Interface Builder ahora soporta oficialmente Ruby. Por ejemplo puedes escribir una clase Ruby en Xcode con sus diferentes outlets y actions y aparecera automaticamente en Interface Builder. Interface Builder usa la herramienta de RubyCocoa rb_nibtool para sincronizar los metadatos. Ademas, se pueden definir manualmente los outlets y las acciones en Interface Builder, arrastrarlas a un fichero Ruby y el correspondiente codigo Ruby aparecera en él.
Scripting Bridge
Scripting Bridge es un nuevo framework que provee de acceso a la infraestructura de AppleEvent, en la que esta basada AppleScript. Scripting Bridge generará dinamicamente un interface de Objective-C que corresponde con el conjunto de acciones susceptibles de ser utilizadas para scripting en una aplicación. De esta manera se pueden mandar mensajes y controlar esta aplicacion desde Objective-C. Gracias a RubyCocoa, tambien es posible utilizar Scripting Bridge con Ruby, aunque todos los elementos (como las enumerations por ejemplo) no estan accesibles aun.
Si el Scripting Bridge no se ajusta a tus necesidades existen otros dos sistemas de conexión con AppleEvent: RubyOSA y rb-appscript. Aunque ninguno de los dos viene instalado con Leopard es posible sus instalación como gemas de manera muy sencilla. RubyOSA en similar a Scripting Bridge en el sentido en que se basa en el conjunto de acciones scriptables de un aplicación, rb-appscript utiliza un sistema diferente y mas general util si no se quiere recurrir a estas acciones.


Ultimos comentarios
Darwin, Yomismo, Marcelo, ibon, oscar ordoñez
» Flatee.com o cómo crear un proyecto en internet, ¿Buscas un piso compartido? at Linked, » Trabajando con Linking Paths, ¿Qué queréis saber de Linking Paths? at Linked, alberto, Jose, aitor, Jose, De Linking Paths a la Formula1 at Linked, Dani [...]
plunchete, M@k, el Buscaimposibles
¿Buscas un piso compartido? at Linked
Jesus Chuda Contreras, Angeles, Ger, Pedro, Alfonso, Windzor, javier, xelha
Cerramos el trimeste (2/2008) at Linked, Goio Telletxea, Sergio, el primo, alberto, raultxi