08 Jun 10 | Etiquetas: , , , ,

Me he propuesto llevar a la práctica algunas ideas de aplicaciones para iPhone, razón por la cual he comenzado a buscar tutoriales o guías sobre Objective-C y Cocoa. utilizaré este artículo para enlazar y comentar los que vaya encontrando.

En primer lugar echaré una ojeada a Objetive-C, el lenguaje que usa oficialmente Apple para las interfaces de escritorio. Objective-C es un superconjunto estricto de C que añade un modelo de objetos parecido al de Smalltalk. Por tanto, si se tiene una buena base de C y de programación orientada a objetos no debería ser difícil de comprender.

El primer artículo que enlazo, “Learn Objective C [Cocoa Dev Central]“, dará una sencilla y rápida visión del nuevo lenguaje desde la perspectiva de un programador en C. Si además se dispone de conocimientos de C++ la guía “From C++ to Objective-C” (PDF) explica muy bien las diferencias y equivalencias entre ambos lenguajes.

De hecho, en general, CocoaDevCentral es una excelente referencia para todo lo relacionado con el desarrollo de aplicaciones en Mac OS.

Por otro lado, la Universidad de Stanford publicó hace algún tiempo el material de su curso de desarrollo de aplicaciones para iPhone, incluyendo los vídeos de todas las ponencias. Los vídeos se encuentran disponibles para su visionado y descarga en Youtube e iTunes U, con la ventaja en el caso de la segunda de disponer de subtítulos (en Youtube es posible activar la transcripción de audio, pero no siempre los subtítulos generados concuerdan con el discurso).

12 May 10 | Etiquetas: , ,

Un instancia QMenu contiene siempre un objeto QAction, aunque no lo hayas creado tú. Por esta razón si queremos ocultar un QMenu vacío no nos sirve llamar al método setHidden(true) (o a setVisible(false)) como normalmente harías.

  1. QMenu *editMenu = new QMenu();
  2. ....
  3. editMenu->clear();
  4. editMenu->menuAction()->setVisible(false);

Una solución menos elegante, y no sé si arriesgada, es destruir la instancia QAction dummy llamando a editMenu->removeAction(editMenu->menuAction());

30 Mar 10 | Etiquetas: , , ,

Esqueleto de una clase en C++ que implementa el patrón Singleton; ésto es, una clase de la que sólo puede existir una instancia. Puede ser útil si se quiere que haya exactamente un objeto de la clase.

  1. //------------ APPLICATION.H
  2.  
  3. #ifndef APPLICATION_H
  4. #define APPLICATION_H
  5.  
  6. class Application
  7. {
  8. public:
  9.     Application();
  10.     static Application *getInstance();
  11. private:
  12.     static Application *_application;
  13. };
  14.  
  15. #endif // APPLICATION_H
  16.  
  17.  
  18. //------------ APPLICATION.CPP
  19.  
  20. #include "application.h"
  21.  
  22. // Inicializacion de los atributos estaticos
  23. Application *Application::_application = 0;
  24.  
  25. Application::Application()
  26. {
  27.     if(_application == this) {
  28.         _application = 0;
  29.     }
  30. }
  31.  
  32. Application *Application::getInstance()
  33. {
  34.     if(!_application) {
  35.         _application = new Application();
  36.     }
  37.     return _application;
  38. }

05 Mar 10 | Etiquetas: ,

Hoy he decidido resubir el material que había publicado en mi anterior página web, ya desaparecida. Como ejemplo, esta presentación que hice junto a mi compañero Samuel y que utilizamos para hablar sobre la web 3.0.

29 Ene 10 | Etiquetas:

Por motivo de un viaje que realizaremos en los próximos días decidí darle una oportunidad a un nuevo servicio de trabajo colaborativo llamado Google Wave. Todo iba más o menos bien hasta que surgió la necesidad de imprimir el planning que habíamos elaborado. Ni había una opción para imprimir (!) ni servía la opción Imprimir del navegador (!). Seguramente sea algo que añadan en breve, de hecho sospecho que lo harán de una forma bastante novedosa.

Así pues, después de intentar varias estrategias (capturando la pantalla, copiando y pegando el contenido a un procesador de textos, etc) encontré una forma, algo rebuscada de exportar el wave sin perder el formato ni los mapas ya incrustados. ¿Cómo? Utilizando un bot (he aquí la novedad).

Vayamos al lío:

Solución 1: Bot de exportación a PDF

  1. Añade la siguiente dirección a tus contactos pdf-wave@appspot.com
  2. Incorpóralo como invitado al wave a exportar (por si las moscas puedes darle permiso de Sólo lectura)
  3. Automáticamente el bot añadirá un comentario a tu wave que contendrá el enlace a un PDF temporal con el contenido de tu wave

Solución 2: Bot que proporciona un objeto “embebido” para usar en tu página web

  1. Añade la siguiente dirección a tus contactos embeddy@appspot.com
  2. Incorpóralo como invitado al wave (por si las moscas puedes darle permiso de Sólo lectura)
  3. Automáticamente el bot añade a tu wave un cuadro con el código que tienes que añadir a la página web
  4. Creamos un archivo .html con el código que obtuvimos en el paso 3
  5. Visualizamos el archivo
  6. (Opcional) Si nos sigue mostrando el wave dentro de un marco, podemos cargar el submarco en una nueva pestaña (investiga cómo hacerlo en tu navegador)
  7. (Opcional) Imprime el Wave con tu navegador o saca una captura de la página web con un programa especializado (por ejemplo FastStone Capture)

Solución 3: Usar Waveboard
Si estás dispuesto a pagar por un cliente de Google Wave siempre te queda Waveboard. Eso sí, de momento sólo está disponible para MacOSX.

NOTA IMPORTANTE: No me he molestado en comprobar la seguridad de estos métodos. Lo que haga el bot con el contenido de tu wave es para mí una caja negra. En cualquier caso, sólo podrá acceder a ese wave.

29 Ene 10 | Etiquetas: , , , ,

A veces resulta imposible juntar en un mismo directorio dos archivos distintos simplemente porque sus nombres coinciden. En otras ocasiones el nombre del archivo puede ser significativo, pudiendo ayudarnos a identificar su contenido u a aplicar cierto orden.

Cuando son sólo dos los archivos lo lógico es renombrar uno de ellos sobre la marcha, pero si la cantidad de cambios es algo mayor (>6) posiblemente sea más rentable automatizar el proceso. La mayoría de sistemas operativos de escritorio incluyen, de una forma más o menos potente, algún mecanismo que nos permitirá hacerlo.

En Windows, por ejemplo, seleccionando varios archivos y pulsando F2 (o haciendo clic derecho y seleccionando “Cambiar nombre”) podemos asignar el nombre base de una secuencia. El primer archivo tendrá el nombre base y los siguientes recibirán un número secuencial: “nombre (1)”, “nombre (2)”, etc.

En los sistemas tipo Unix (*BSD, GNU/Linux, Mac) el terminal puede ser una herramienta muy útil si se sabe manejar. La mayoría de estos sistemas trae multitud de comandos para trabajar con ficheros y que pueden combinarse en un script para este propósito. Si dispones de un Mac, Automator puede ser también un gran aliado.

Sin embargo, ninguna de estas soluciones me convence, bien por exceso de complejidad, o bien por falta de ella. Por suerte -o desgracia- este problema es bastante común y existen bastantes herramientas gratuitas para trabajar con nuestros archivos, como por ejemplo:

De todos éstas mi favorita es Siren: potente, ligera y es capaz de extraer los metadatos de los formatos de archivo más comunes. Name Mangler (anteriormente conocido como File list) es bastante popular en el mundillo Mac, aunque apenas soporta metadatos específicos.

23 Ene 10 | Etiquetas: , , ,

Posiblemente exista más de una alternativa al método que os voy a contar, incluso mejoras a lo que haré. Como por ejemplo, usar el programa de grabación Toast. Pero para qué instalar un programa del que puedo prescindir? Además, por qué negarlo, cada día le tengo más cariño al robotito Automator.


Continuar leyendo…

21 Ene 10 | Etiquetas: , ,

La siguiente orden permite ocultar una partición montada en Finder:

$ sudo setfile -a V /Volumes/{label}

Tras reiniciar el Finder (escribimos killall Finder en el Terminal) el icono desaparecerá del Escritorio.

Más información y métodos alternativos aquí.

19 Ene 10 | Etiquetas: , ,

No suele necesitarlo con mucha frecuencia, pero sí alguna que otra: desmontar una unidad

[HISTORIA NADA INTERESANTE]
Esta mañana, por ejemplo, tuve la “genial” idea de instalar un programa que tenía guardado en una imagen de disco en otro computador montando el archivo .iso directamente a través de la red local. Sin embargo, al poco me di cuenta de que la instalación tardaría algo más que una eternidad, razón por la cual quise cancelarla, para hacerla en local (copiando al archivo a un disco duro externo que tengo). La cuestión es que el puñetero instalador no dejaba cancelar el proceso así como así, imposibilitando (no sin cierta lógica) desmontar el volumen de disco que había montado y, sin quererlo, también bloqueando el copiado del archivo .iso en la otra computadora (una PC con Windows)… ¡un desastre, vamos! Así que necesité hacer lo siguiente, para desbloquear el archivo:
[/HISTORIA NADA INTERESANTE]

$ hdiutil eject -force /Volumes/{etiqueta-del-volumen}/

De donde {etiqueta-del-volumen} la obtuve con la aplicación Utilidad de discos que trae Snow Leopard.

Más información y referencias aquí.

24 Dic 09 | Etiquetas: , , ,

En más de una ocasión he echado de menos la orden “Cortar” (típica de Windows) en Finder. No muchas tampoco. La manera “oficial” de hacerlo es arrastrando y soltando los archivos de una carpeta a otra. Por esta razón se me ha ocurrido crear un pequeño “script” de Automator para facilitar el traslado cuando no me apetece andar arrastrando los archivos.

Procedimiento:

  1. Abre Automator (carpeta /Aplicaciones/) e invoca Archivo > Nuevo
  2. Selecciona el tipo “Servicio” como plantilla del flujo de trabajo
  3. En la columna de la derecha, que especifica el flujo que se está diseñando, asignamos el Servicio a los archivos y carpetas de Finder.
  4. (Opcional) En la columna más a la izquierda de la ventana que se acaba de abrir, selecciona “Archivos y carpetas”
  5. Localiza en la segunda columna la acción “Obtener los ítems del Finder seleccionados”, selecciónala y a continuación arrástrala hacia la tercera columna (la del flujo de acciones, inicialmente en blanco)
  6. Localiza ahora la acción “Trasladar ítems del Finder” y arrástrala a la tercera columna, justo debajo de la acción anterior. En la nueva acción que acabamos de añadir al flujo, puedes seleccionar la ruta predefinida donde se copiarán los archivos.
  7. (Opcional) En la acción anterior, seleccionado Opciones, activarás “Mostrar esta acción al ejecutar el flujo” para poder seleccionar específicamente el destino cada vez que ejecutes el flujo.
  8. Ahora guardamos el flujo como “Mover a…” a través del menú Archivo > Guardar
  9. (Opcional) Puedes asignar un atajo de teclado (p.e. Cmd+Shift+X) al nuevo servicio yendo a Finder > Servicios > Preferencias de los servicio.
  10. A partir de ahora podrás ejecutar el traslado de archivos a través de Finder > Servicios > Mover a… o bien, si realizaste el paso 9, usando un atajo de teclado.

Continuar leyendo…