Usando NSURLDownload
He estado un par de días peleándome con esto, así que voy a postearlo por si puede servir a alguien que se esté topando contra el mismo muro: Al tratar de usar NSURLDownload, obtenía siempre el mismo mensaje de error justo después de conectar con éxito con el servidor web remoto:
cannot open file http://example.com/file
Al final, me he dado cuenta que el directorio de destino del fichero no existía. Para crearlo, hay que hacerlo de la siguiente manera (el siguiente código funciona solo en Leopard, por cierto):
Lo que hace la llamada a createDirectoryAtPath:withIntermediateDirectories:attributes:error: es crear el directorio especificado y todos los intermedios, lo cual es bastante práctico. Si el directorio ya existe dará un error, pero se puede ignorar como lo he hecho yo, pasando un NULL al argumento error.
iPhone 3G
Hace dias que tengo varios posts pendientes de escribir. Me compré un MacBook Pro de los nuevos (el modelo de más alta gama), un coche nuevo para llevar a las niñas (un Mazda 5 de penúltima generación, que son más baratos :) ), mi mujer metiéndose a blogger sin que yo la haya empujado... en fin, unas cuantas novedades. Pero lo que me ha llevado a romper mi racha de silencio y postear ha sido ver esta mañana la Keynote de ayer de Steve Jobs en la WWDC2008.
Después de ver algunos de los ejemplos de aplicaciones de terceras partes (y de haber trasteado con las betas del SDK), y ver el peazo móvil que estará disponible por estos lares... se me ocurre que debo replantear mi carrera, y especializarme en desarrollo sobre la plataforma iPhone (si, es una nueva plataforma). Con mi background en desarrollo web y web services, y los pinitos que hecho en Cocoa y Objective-C con el iMac, tengo una ligerísima ventaja sobre una parte de la horda de programadores que vaticino van a interesarse en desarrollar sobre esta plataforma.

Lo que necesito es pensar un par de aplicaciones sencillas que sirvan de showcase de mis habilidades, y ponerlas cuanto antes en el App Store. No para ganarme la vida con ellas - según como, igual las pondría gratis para evitar tener que declarar ganancias- si no para que cualquier posible empleador las pruebe. Y claro, también para ganar una mínima experiencia, ya que no es lo mismo Cocoa que Cocoa Touch, claro!
Asi pues, qué aplicaciones podria hacer que sean sencillitas a la par que vistosas? Lo primero que me viene a la cabeza es alguna herramienta para editar blogs, o un puzzle con fotos de flickr. Pero no se, no se... estoy seguro de que si me esfuerzo un poquito más, podré tener algo más interesante!
Nuevo RubyCocoa 0.11.0
Update El dia 4 de Junio Laurent anuncia la aparición de la release 0.11.1, básicamente corrigiendo algunos bugs pero también introduciendo nuevas capacidades, como algunos atajos a la hora de puentear Ruby y Obj-C, y algún nuevo ejemplo
Laurent Sansonetti, el Release Manager de RubyCocoa, anunció hace un par de dias la liberación de RubyCocoa 0.11.0 y del nuevo website donde aprender como usarlo.
Las características de la nueva versión son:
- Documentación en formato RDoc de los frameworks Cocoa soportados.
- Mejor integración con las partes en C (en contraposición a Objective-C) de Cocoa.
- Bindings para ActiveRecord. IMHO, esto es uno de los cambios más jugosos para los desarrolladores en RubyCocoa. Esto significa que podremos usar como si fuera CoreData cualquiera de los backends de ActiveRecord.
- Se añade soporte para sobreescribir métodos de clase, y para aliasear métodos en Obj-C desde Ruby.
- Nueva API RBBundle, para usar RubyCocoa en un bundle.
- Nueva APi para manejar listas de propiedades, cual si fuera YAML.
- Mejor interface entre tipos básicos en Obj-C y en Ruby.
- Soporte para APIs C y Obj-C usando cadenas de formateo. No estoy muy seguro de qué significa esto.... creo que permite interpolar variables en cadenas, y entonces usar el resultado en una llamada a código nativo.
- Mejor soporte a punteros gracias a la API ObjcPtr.
- Nueva herramienta rb_nibtool, que permite sincronizar ficheros nib (es decir, que contienen los objetos de una GUI) con código fuente en Ruby, tal como se hacía hasta ahora solo con Obj-C. Ya se pueden declarar IBActions usando
#ib_action - Nueva herramienta standalonify, para desplegar una aplicación en Ruby con todas sus dependencias en un ejecutable normal y corriente que se puede portar a otro sistema sin RubyCocoa.
- Plantillas para Xcode que permiten hacer tests unitarios
- Soporte preliminar pra 64bit.
- Nuevos ejemplos. Va a haber que estudiarlos...
Yo, por mi parte, miraré de retomar los tutoriales de RubyCocoa cuando tenga un poco más de tiempo libre. Me quedé atascado en un punto mientras preparaba la nueva entrega, y luego ya no he podido volver a dedicar tiempo suficiente. Tal vez pueda echar un vistazo al nuevo código de ejemplo y comentarlo, pero como poco, contad que dentro de un mes ni puedo ni planteármelo... lo siento.
Mientras tanto, os dejo con una interesante colección de videos... :-)
CP, Capítulo 2: Generador de números aleatorios
Bueno, pongámonos a ello. Tal como dije en el post anterior, hacer este ejempo con Objective-C es algo que no tiene más interés que empezar a ver las herramientas, así que lo reimplementaremos usando Ruby.
Siguiendo el texto, lo primero que hay que hacer es iniciar Xcode y crear un nuevo proyecto. Como hemos instalado RubyCocoa, dispondremos de un nuevo tipo de proyecto, Cocoa-Ruby Application:

Ejercicios de Cocoa Programming
Desde que me compré el Mac, que trato de aprender a programar en este entorno. Tengo un par de libros a este efecto, pero por algún motivo, no consigo retener los conocimientos necesarios para programar de manera efectiva en el Mac - es decir, constantemente tengo que estar consultando los libros para ver como hacer cada paso. Tal vez sea por que el hecho de usar Interface Builder, con la miríada de opciones que tiene, o que el hecho de no usar un recolector automático de memoria me intimida (mis punteros están ya un poco oxidados). Sea lo que fuere, estoy seguro de que si lo practico regularmente -como una Kata- al final me saldré con la mia.
Es por eso que empiezo esta sección. Voy a seguir los ejercicios del libro de Aaron Hillegass, Cocoa(R) Programming for Mac(R) OS X, en público, comentándolos y expandiéndolos, a ver si el estar expuesto al escarnio público me motiva para hacerlo regularmente. Mi intención es, si tengo tiempo y habilidad suficiente, reescribir además los ejercicios en algún otro lenguaje que no sea Objective-C -pero que, naturalmente, tenga bindings para Cocoa-, como Ruby o C#, y así, ya de paso, me preparo para la release de Leopard, donde los lenguajes alternativos a Objective-C cobran más protagonismo.
Ya de paso, si le sirve a algún lector, mejor que mejor. Seguramente, tener el libro será necesario para seguir los ejemplos efectivamente, pero trataré de que sean autocontenidos. Veamos que tal se me da.