-
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/rubyy/usr/lib/rubyson 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.dylibLa librería
libruby.1.dylibque 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
ARCHFLAGSpara 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 installTambien puedes establecer
ARCHFLAGSpara configurar la compilación de las gemas. Aunque recuerda: en Leopard el comandosudono transfiere las variables de entorno a los procesos privilegiados asi que puede ser necesario tener que hacerlo desde unashellcomoroot.Las librerias Ruby que instales manualmente se ubicaran por defecto en
/Library/Ruby/Site/1.8que 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
md5ysha1, que son parte del conjunto estandar de librerias Ruby, han sido modificadas para usar la nueva API/usr/include/CommonCryptoen vez delibcryptoperteneciente al proyecto de OpenSSL, por razones de rendimiento. La extensiónreadline, que tambien forma parte de la biblioteca estandar de librerias de Ruby, es ahora instalada de serie. Internamente utiliza/usr/lib/libedit.dylibcomo 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/irbrccomo 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 unrequire 'rubygems', activa el autocompletado, utiliza un prompt sencillo y configura un historico permanente.Hasta ahora todo esto se podía configurar con un fichero
~/.irbrcque se seguira teniendo en cuenta y que de existir hará que el/etc/irbrcsea 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 entornoGEM_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_nibtoolpara 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.
Deja un comentario
-
Sobre LinkedLinked es el blog de Linking Paths, la empresa aventurera e innovadora formada por Aitor Garcia, Alberto Molpeceres y Roberto Salicio. En él hablamos de nuestros productos, ideas, y de compañías que nos sirven como guía y ejemplo. Si quieres conocernos un poco mejor puedes revisar lo que hemos escrito en los archivos.
-
Proyectos, ideas, etc.




