Entradas

Pinceladas de Objective-C para Rubyistas

 RubyMotion nos permite desarrollar aplicaciones para iOS sin necesidad de escribir código Objective-C. Sin embargo, es muy importante aprender a leerlo, ya que nos facilitará el aprendizaje del SDK de Apple.

A primera vista, Objective-C y Ruby no podrían ser más diferentes el uno del otro. Mientras que Ruby es hermoso y elegante, Objective-C parece un entresijo de corchetes. Sin embargo, si miramos más allá de las diferencias sintácticas, podemos observar que en realidad no difieren mucho uno del otro, ya que ambos lenguajes heredan características de Smalltalk

Mensajes

Al igual que con todos los lenguajes basados ​​en Smalltalk, el modelo de POO de Objective-C se basa en enviar mensajes a instancias de objetos. Veamos la sintaxis:

Equivalente en Ruby:

Ej. Instancia de un NSMutableArray de Cocoa.
En Objective-C

En Ruby:

Clases y objetos

Diseño
El diseño de clases en Objective-C es similar al de C++, ya que ambos requieren que la interfaz e implementación de una clase estén en bloques de códigos separados. Por convención, la interfaz se sitúa en un archivo de cabecera (.h) y la implementación en un archivo de código (.m).
Interface implementation
Veamos la sintaxis:

Equivalente en Ruby:

Instancia
La instanciación de clases en Objective-C es un proceso que consta de dos pasos: primero se  debe asignar una cierta memoria para el objeto llamando al método alloc, y luego lo inicializamos con el método init.
En Objective-C

En Ruby:

Propiedades

Las propiedades de un objeto permiten a otros objetos acceder o cambiar su estado. Como sabemos, en un programa bien diseñado, no es posible acceder directamente al estado interno de un objeto, para ello usamos los métodos de acceso ( getters y setters ).

Properties

Declaración
En Objective-C

En Ruby:

Acceso
En compilador de Objective-C genera un getter y setter para la propiedad. Una vez declara la propiedad, puede llamar a estos métodos como si estuvieran incluidos en la interfaz de la clase y en el fichero de implementación:

Equivalente en Ruby:

Atributos más importantes de las propiedades

getter=Permite usar un nombre personalizado para el método getter.
setter=Permite usar un nombre personalizado para el método setter.
readonlyPropiedad de solo lectura
nonatomicNo garantiza la integridad de los accesores en un entorno multihilo, pero es más eficiente que atomic
strongCrea una relación fuerte entre la propiedad y el valor asignado. Es el valor por defecto.
weakCrea una relación débil entre la propiedad y su valor.
copyCrea una copia del valor asignado en lugar de hacer referencia a la instancia actual

Métodos

En la declaración de métodos se deben especificar varias cosas: el tipo de método (de clase o de instancia) el tipo del valor de retorno, su nombre y sus parámetros (con sus tipos incluidos).
A diferencia de otros lenguajes, el nombre de los métodos en Objective-C es una combinación de su nombre y sus parámetros.
Veamos un ejemplo del SDK de Apple:

  • El guión “-” nos indica que se trata de un método de instancia.
  • El tipo devuelto es un NSInteger.
  • Los parámetros son tableView, y numberOfRowsInSection:section

Equivalente en ruby:

 

Resumen

En este post hemos visto pequeñas pinceladas del runtime de Objective-C, algunas peculiaridades de su sintaxis, y lo excesivamente “verbose” que es en comparación con Ruby.
Hasta la próxima entrada!

“Code Golf” con Ruby

“Code Golf” es el arte de escribir código utilizando el menor número de caracteres posibles. La idea es originaria del mundo Perl (“Perl Golf), aunque en Ruby también se pueden conseguir muy buenos resultados.

La obsesión por tratar de minimizar el número de bytes utilizados en un programa proviene de tiempos pasados, cuando la memoria era un bien escaso y cada byte era importante. En realidad hoy en día esto no tiene demasiado sentido, pero esto no quiere decir que no se haga. Un ejemplo podrían ser las competiciones 1k de JavaScript o Perl Apocalypse.

Desafortunadamente, el código que se produce en este tipo de competiciones a menudo es muy difícil de entender, ya que por lo general se basa en el uso de diversos hacks y accesos directos. La idea de este post es recoger algunas técnicas para lograr disminuir el número de caracteres utilizados en nuestro código pero sin perder la legibilidad del mismo.

Prerequisitos:

  • Un equipo con Ruby instalado.

Tips:

Veamos algunos consejos para reducir el tamaño de nuestro código Ruby:

  • Asignación masiva Casi todo el mundo conoce esta técnica, la idea es inicializar todas las variables en la misma línea.
  • Crear arrays utilizando la notación %w Podemos crear arrays de strings de la siguiente forma:
  • Utilizar el operador ternario para las operaciones lógicas
  • Utilizar el operador ternario de forma encadenada
  • Usar la notación científica para números grandes Si vas a usar números grandes mejor escribir 1e6 que 1000000.
  • Usar “->” para las expresiones lambdasDesde ruby 1.9 podemos utilizar “->” para la sintaxis de las expresiones lambdas en vez de la palabra reservada “lambda”.
  • Usar “Map” para iterarLos iteradores suelen ser mejores que los bucles, y “map” es mejor que “each”, no solo porque tiene menos caracteres sino porque además crea una nueva proyección del contenido iterado.

Ejemplo:

Para finalizar, a modo de ejemplo, voy a escribir un método que recibe por parámetro dos números y calcula la suma de todos los múltiplos del primer número hasta el valor del segundo parámetro. Sum(3, 14) calculará la suma de todos los múltiplos de 3 hasta 14 (3 + 6 + 9 + 12 = 30).

Primeros pasos con Ruby

Este artículo va a ser el primero de una serie de entradas dedicadas al aprendizaje del lenguaje Ruby. Nos centraremos en los aspectos básicos y levantaremos una pequeña aplicación web utilizando el framework Sinatra.

¿Qué es Ruby?

Ruby es un lenguaje de programación orientado a objetos simple pero muy potente. Fue creado en 1995 por Yukihiro ‘Matz’ Matsumoto, desde entonces Ruby ha atraído a desarrolladores de todo el mundo. En el 2006, Ruby alcanzó reconocimiento masivo, gracias a Rails su framework web por excelencia.

Instalando Ruby

La instalación de Ruby es bastante sencilla, se realiza de forma diferente dependiendo del sistema operativo utilizado.
Si usas linux, te recomiendo que uses Ruby Version Manager (RVM). Para ello pega la siguiente linea de código en tu terminal:

En caso de usar windows lo ideal es usar Ruby Installer. Esta aplicación es un instalador que nos permite instalar Ruby con todo lo que necesitas a través de un asistente.
Si usas Mac puedes usar RVM al igual que en linux, o usando Homebrew , con el siguiente comando:

Para comprobar que todo funciona correctamente, abrimos la terminal y escribimos lo siguiente:

Esto comprueba la versión de ruby que tenemos instalada:

 

Probando la consola interactiva de Ruby

La consola interactiva de Ruby, también conocida como IRB, nos permite experimentar de manera rápida con Ruby. Para ello accedemos a la terminal y ejecutamos lo siguiente:

Debería aparecer algo similar a esto:

Una vez que estamos en la IRB vamos a escribir nuestro primer “hello world” en Ruby, para ello escribiremos lo siguiente:

Salida:

Para salir de la consola interactiva tan solo tenemos que escribir el comando exit.

Escribiendo nuestro primer fichero Ruby

Una vez que hemos escrito nuestro primer trozo de código Ruby en IRB, es el momento de aprender a almacenar nuestro trabajo en un archivo. Para empezar vamos a crear un fichero de texto y lo vamos a guardar como “hello_ruby.rb”, y luego escribimos lo siguiente:

Esto es lo mismo que hemos escrito en la IRB, la diferencia es que la IRB evalúa el código al pulsar enter, y para ejecutar este programa debemos usar el comando “Ruby”. Para ello volvemos a la consola, nos situamos en el directorio en el cual se encuentra nuestro fichero y escribimos lo siguiente:

Debería producirse la siguiente salida:

 

Las gemas de Ruby

Las gemas de Ruby son librerías de código que ayudan a extender Ruby añadiéndole nuevas funcionalidades. Normalmente están escritas en Ruby, aunque algunas veces se usan otros lenguajes como C. Existen miles de gemas disponibles que nos pueden ayudar añadir todo tipo de funcionalidad a nuestros programas.

Sinatra, toma de contacto

Sinatra es una gema, que nos facilita la creación de aplicaciones web, de forma sencilla y muy ligera.
Antes que nada debemos instalar esta gema, para ello nos vamos a la consola y escribimos lo siguiente:

Volvamos a nuestro fichero “hello_ruby” y escribamos lo siguiente:

get ‘/hello’ do
“Hello Sinatra!”
end

“require ‘sinatra'” se usa para cargar la gema sinatra, añadiendo de esta manera añadimos sus funcionalidades a nuestro programa.
La siguiente parte del programa es lo que se conoce en Sinatra como un “manejador” de rutas. El funcionamiento de nuestro código es sencillo, cuando hagamos una petición get HTTP a la ruta “/hello” nuestro programa nos devolverá en el navegador “hello sinatra!”. Vamos a ejecutar nuestro programa para ver que sucede:

Resultado:

Ahora nos vamos a nuestro navegador y escribimos localhost:4567/hello. Si todo ha salido bien podremos ver nuestra aplicación web funcionando.

Recursos

Existe una gran cantidad de recursos para el aprendizaje de Ruby. A continuación se muestra una pequeña selección que he encontrado particularmente útil.

En resumen

En esta primera entrada de esta serie hemos introducido el lenguaje de programación Ruby de manera muy superficial, seguiremos profundizando en próximas entradas. Happy coding!

Hola mundo! en RubyMotion

Este es el primer post de mi nuevo blog, en él voy a tratar temas relacionados con el desarrollo de aplicaciones web y móviles. Actualmente estoy profundizando en varios frameworks para el lenguaje de programación Ruby, así que los primeros post estarán relacionados con el mundo Ruby. En este post voy a explicar como crear un “hello world” en iOS con uno de estos frameworks, Rubymotion.
Rubymotion es un framework comercial basado en MacRuby, creado por Laurent Sansonetti, para construir aplicaciones nativas para iOS usando el lenguaje de programación Ruby.
RubyMotion compila el código Ruby a código máquina (ARM) utilizando un compilador estático basado en LLVM. La API estándar de iOS está disponible en RubyMotion, lo que significa que todas las funciones disponibles para los desarrolladores de Objective-C en la plataforma iOS, también están disponibles para los desarrolladores de Ruby.

Prerequisitos:

  • Un Mac con OS X 10.6 o superior.
  • Instalar el SDK de iOS, actualmente viene con Xcode, el cual puedes obtener gratuitamente a través de la Mac App Store.
  • Una vez instalado necesitas el Command Line Tools, lo puedes descargar a través de las preferencias del propio Xcode.
  • Por último, instalar Rubymotion, el cual puedes adquirir desde aquí.

Hello World!:

Una vez configurados los prerequisitos ya estamos listos para crear nuestra primera app con Rubymotion. Para ello abre el terminal y dirígete al directorio donde quieras crear el proyecto, luego escribe el siguiente comando.

Este comando creará un proyecto RubyMotion en un nuevo directorio llamado HelloWorld. En caso de que el directorio exista, el comando devolverá un error.
Si accedemos al directorio generado por motion create, podemos comprobar que contiene dos ficheros: Gemfile, en el cual vamos a agregar las gemas que vamos usar en nuestra aplicación, el fichero de configuración Rakefile; y tres directorios: app, resources y spec. El directorio app contiene el código de la aplicación, resources contendrá los ficheros de recursos del proyecto, iconos, imágenes o ficheros de sonido y en spec almacenaremos nuestras clases de test.
Nosotros tan sólo vamos a modificar el archivo que se encuentra dentro del directorio app, app_delegate.rb, el cual es creado por defecto. Este implementa la clase AppDelegate, la cual es responsable de controlar la aplicación.

Abrimos el fichero app/app_delegate.rb con el editor que prefieras, yo voy a usar Sublime Text, y agregamos lo siguiente:

Para ejecutar la aplicación volvemos a la terminal y ejecutamos dentro del directorio del proyecto el comando rake.

Si todo ha salido bien veremos como se ejecuta una alerta dentro del simulador de iOS ;).
Saludos y hasta la próxima!