Principia Programmatica

cvm Ars Compilandi & Ars Interpretandi

Curso de programación de iPhone en Stanford

En Stanford han decidido ofrecer uno de sus cursos de programación a través de iTunes U, una iniciativa de Apple y diversas universidades americanas para ofrecer sus cursos (o, al menos, las clases) gratuitamente a través de internet.

En concreto, el curso es CS193P - iPhone Application Programming. De momento, está disponible ya para descarga la primera clase (con RickRoll incluido) y están disponibles también en la web las presentaciones. Lo que no he sido capaz de encontrar es una dirección públicamene accesible para el Podcast, únicamente es posible subscribirse mediante iTunes.

Por lo que he visto de momento, no es necesario ningún libro en concreto si no que se basan exclusivamente en la documentación de Apple y diversos websites (como stepwise o cocoabuilder) de acceso libre. En cuanto a los requerimientos, lo mínimo es un Mac Intel, el iPhone o iPod Touch son opcionales. Y eso si, tener conocimientos previos de C o C++.

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.

NDA de iPhone levantado

Cuando Apple anunció el SDK para el iPhone, muchísimos desarrolladores se regocijaron. Pudieron descargar las betas, y la versión definitiva, para empezar a desarrollar aplicaciones para el iPhone y el iPod Touch. Para ellor era necesario aceptar un NDA, es decir, un acuerdo de no divulgación. Esto es algo típico en esta industria y significa que los desarrolladores se comprometen a no hablar con nadie sobre lo que aprendan desarrollando con un sistema, y se utiliza para proteger secretos industriales o comerciales. Normalmente tienen una vigencia determinada hasta que se hace público el producto en cuestión.

El caso es que, una vez liberada la versión definitiva del kit de desarrollo, Apple seguia manteniendo vigente el NDA, con lo cual, los desarrolladores estaban impedidos de discutir entre ellos o en foros detalles, ejemplos o cuestiones que se les ocurriera. Apple llegó incluso a prohibir que se hablara de las aplicaciones rechazadas en la App Store (Apple es la única distribuidora de software para el público en general, y tiene poder de veto sobre las aplicaciones) y de los motivos que se argumentaban para el rechazo. De hecho, esto último levantó su propia polvareda sobre esto ya que, en el fondo, se estaban perjudicando los intereses de la propia Apple, ya que si una empresa se decidía a invertir en el desarrollo de una aplicación, no tenía garantizado el poder comercializarla. Pero ese es otro tema...

El caso es que no se podia mostrar código de ejemplo para el iPhone, ni discutirlo, ni nada... y claro, en una plataforma nueva, esto es esencial. Por fin, hoy Apple ha levantado la veda, pero solo para productos ya comercializados. Es decir, no puedes mostrar código de tu aplicación si no está ya en la App Store. Craig Hockenberry, por ejemplo, ha sido uno de los primeros en mostrar código fuente, y además, con un curioso ejemplo de como hacer que se comuniquen diferentes aplicaciones entre si (algo que el modelo de ejecución y desarrollo para terceras partes del iPhone hace difícil). La verdad es que es un ejemplo muy interesante...

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.

iPhone simulator

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!

Mi biblioteca en Delicious Library

Hela aqui:

Mi biblioteca

No están todos los que son, pero si son todos los que están. Cuantos libros tenemos en común?

Read the rest of this entry

Como paliar la inestabilidad de Safari 3 para Windows

Tan pronto como he empezado a probar Safari para windows, he observado algunos problemas con el mismo, a saber:

  • El icono de favoritos hace que la aplicación haga un crash (de ahora en adelante, me referiré a los crashes con el verbo petar)
  • Lo mismo sucede al tabular de unos campos de formulario a otros
  • Al tratar de acceder a una página con contenido flash (como por ejemplo, que se yo, SpotSpotting), no se puede acceder a ella
  • Al seleccionar la opción de menu para ver los plugins instalados, un mensaje de error nos informa que Safari no está bien instalado. Lo mismo sucede al escoger la opción de ver la licencia.
  • El icono de Bonjour (si lo habilitamos en las preferencias) nos muestra la lista de sitios publicados en nuestra LAN, pero al tratar de acceder a alguno de ellos, no sucede nada.
  • El texto marcado con negritas o cursivas, no se muestra.

Pues bien, he estado trasteando un poco y he descubierto como paliar algunos de estos problemas.

Read the rest of this entry

WWDC 2007 y Safari crashes.

A la espera de que pongan online el video de la Keynote de Steve Jobs, estoy tratando de evitar enterarme de las novedades. Cosa harto difícil todo hay que decirlo: ya tengo instalado en el portátil del trabajo el nuevo Safari para Windows.

Y ya tengo una opinión al respecto: se nota que es una Beta. Falla más que una escopeta de feria, y además reproduciblemente: solo tengo que apretar el botón de favoritos y... kaboom. O tabular entre campos de un formulario y... bye bye.

Me pregunto si tendrá algo que ver con usar un Windows en español (algunos recursos, como la info sobre plugins, solo existen en inglés) o con tener el directorio home en un lugar distinto al directorio por defecto que pone windows. Si alguno de mis lectores es tan amable de compartir sus impresiones...

En fin, ya lo averiguaremos. De momento, el navegador por defecto seguirá siendo IE7... es broma, es broma! Firefox, naturalmente!!

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... :-)

Instalación de CocoaSharp

Siguiendo con la serie de artículos que he iniciado sobre Cocoa, voy a documentar el proceso de instalación de Cocoa#.

Antes que nada, si se da el caso de que habíamos instalado el paquete de Mono (la implementación de .NET para Unixes) con anterioridad, sería interesante desinstalarlo, para evitar conflictos:

sudo /Library/Receipts/MonoFramework\
-1.1.15_1.macos10.novell.ppc.pkg/Contents/Resources/uninstallMono.sh

La localización exacta del script de desinstalación variará en función de la versión instalada. haciendo un locate uninstallMono veremos qué versiones hay y donde encontrarlas (en mi caso, por ejemplo, había hasta 3 versiones diferentes del script)

Lo siguiente es descargarnos el paquete de Mono de su site. La página de descargas está en http://www.mono-project.com/Downloads, y naturalmente deberemos descargarnos la versión para Mac OS X.

Qué es Mono exactamente, y para qué lo queremos?

Pues Mono es una implementación libre de las herramientas de desarrollo - el SDK- para .NET, asi como el runtime para ejecutarlo, y está disponible en una variedad de plataformas (incluso Windows). En el caso de OS X se instala como un framework, como el de Java. Además, también viene con Cocoa#, para poder acceder al framework de Cocoa desde aplicaciones escritas con .NET.

El instalador de Mono no tiene ningún misterio: siguiente, siguiente, siguiente...

Una vez instalado el instalador, para comprobar que esté disponible podemos hacer:

$ mcs --version
Mono C# compiler version 1.2.3.1

Mono no instala ningún soporte específico para Xcode. Existe un plugin por ahí para ello, pero puesto que no aporta Intellisense, podemos usar cualquier editor de texto (mi favorito es TextMate) para editar el código, o incluso aquellos de vosotros que uséis Parallels, Visual Studio.

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:

New Cocoa-Ruby Application

Read the rest of this entry

Instalación de RubyCocoa

Como el primer ejercicio del libro -en el capítulo 2- consiste simplemente en seguir las instrucciones y construir una sencillita aplicación, voy a empezar haciendo ese mismo ejercicio con Ruby. Para ello, es necesario tener instalado el bridge RubyCocoa, así que lo primero de todo es instalárselo.

Yo utilizo el ruby que viene con los MacPorts (antiguamente llamados DarwinPorts), así que el binario que puede descargarse desde el site de RubyCocoa no me sirve, ya que es para el ruby que viene instalado por defecto con Mac OS X Tiger. Si ese fuera tu caso, simplemente descárgate ese binario, pero ten en cuenta que la versión de ruby instalada por Apple tiene un bug.

Instalar el bridge desde Mac Ports es tan sencillo como:

sudo port install rb-cocoa

El sistema de ports descargará e instalará entonces la versión más reciente del bridge. Si apareciese un mensaje como:

Error: Target com.apple.activate returned: Image error: /Developer/Documentation/RubyCocoa/build.en.html already exists and does not belong to a registered port. Unable to activate port rb-cocoa.

significa que ya teníamos el paquete instalado para el ruby de Apple y al tratar de instalarlo se encuentra que algunos ficheros ya existen (los ejecutables y librerías se instalan en sitios diferentes, pero la documentación y las plantillas para Xcode van en el mismo sitio y, por tanto, hay conflicto). En ese caso, simplemente tendríamos que usar el siguiente comando para activar el port:

sudo port -f activate rb-cocoa

Para comprobar que funciona, invocaremos el intérprete interactivo:

$ irb
irb(main):001:0> require 'osx/cocoa'
=> true

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.

Aprendiendo Cocoa

Mientras hago tiempo hasta la entrega de mi flamante nuevo iMac G5 (que me he animado a adquirir tras la gota que colma el vaso en el mundo Wintel), me he puesto a aprender Objective-C y Cocoa. La verdad, aparte de la gestión de memoria, no parece muy complicado, más bien es bastante asequible, y las APIs de Apple (y NeXT) parecen estar bien pensadas, si bien, a los ojos de alguien más acostumbrado a Java o a .NET, a veces parecen un poco desconcertantes.

Xcode Objective-C es mucho más dinámico que C++, en el sentido en que tiene tipado dinámico y late-binding. Y a pesar de eso, está más cerca del C pelado, y se pueden usar bibliotecas en C puro con bastante facilidad. Los libros que he estado consultando son, básicamente, Cocoa Programming for Mac OS X y Programming in Objective-C. El primero va bastante al grano y enseguida enseña como usar Xcode e Interface Builder. El segundo es una completa introducción desde cero -no presupone conocimientos previos de C- y aún no he llegado a las partes más interesantes. Espero postear código interesante para algún widget o algo en breve :)

Por cierto, si quieres contribuir de alg!n modo a Principia Programmatica y estás interesado en estos libros, puedes comprarlos en Amazon desde aqui.

Cocoa! Programming for Mac! OS X (2nd Edition) Cocoa! Programming for Mac! OS X (2nd Edition)


Programming in Objective-C Programming in Objective-C


Apple e Intel

Debo admitir que no me llegaron los rumores hasta la misma mañana del lunes de la WWDC, asi que no tuve que esperar mucho para confirmar la noticia de que Apple se pasaba a Intel. Por un momento, y antes de la confirmación más oficial, cuando aun se especulaba que se pasara a arquitectura x86 (lo cual no es lo mismo que usar chips Intel) que pensaba en algún chip de 64bit de AMD, pero no, al final se confirma que el trato es con Intel.

Hasta hace poco, yo que siempre he soñado con usar Mac OS (ya fuese 9 o X, o incluso System 7), anhelaba oir una noticia así. Es decir, soy un usuario de PC que no usa Macs, pero que me gustaría hacer el switch. Ahora, la noticia me ha dejado un sabor agridulce: no creo que pueda ejecutarse en un PC cualquiera, pero es probable que ahora más usuarios de PC se pasen a Mac -quien sabe? A lo mejor algunos fabricantes escogidos (Alienware, Sony con sus VAIO) pueden licenciar el sistema- y ya no tendrá el mismo encanto, esa dosis de rebeldia (y zealotrismo) que tenía hasta ahora. Vamos, ahora que habia decidido comprarme un Mac Mini o un Powerbook después del verano, y gracias al síndrome de Osborne, me lo estoy pensando. De hecho, no hay mucho que pensar, yo quiero usar OSX en arquitectura PowerPC, pero me joroba que sea una via muerta. Me recuerda a lo que pasó con BeOS, yo era un entusiasta del sistema, pero al final se quedó en nada, o casi nada. De hecho, ya hace tiempo que me ronda por la cabeza comprarme un viejo PowerMac para instalar mi Release 2.x en él y aprender C++ sin vicios MFC.

En cualquier caso, esto me da una razón más para aprender Objective-C de una vez. Me gustaría hacer aplicaciones en Cocoa, alguna killer-app que explote características del Mac como Spotlight o Rendezvous (o debería decir Bonjour?).

Por cierto, se especula que, ya que los Powerbook no pueden ser equipados con chips G5 -por su tamaño- que éstos sean de los primeros en lucir chips Intel. Pero lo que nadie ha comentado, es que ya no serán Powerbooks! en todo caso, IntelBook o PentiumBook (o Itanium o lo que sea)

Pages

Categories

Tags