• por aitor - 28 de Octubre de 2007 - Etiquetado como

    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
    
    Imagen promocional de Instruments

    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.

Deja un comentario

Linked, el blog de Linking Paths