30 agosto 2012

Calendarios inactivos en Android

Hoy no toca hablar de programación, sino del día a día de un informático, en concreto de cómo planificar compromisos pendientes usando el calendario de un teléfono móvil Android.

Google Calendar es una fantástica aplicación de "agenda online", que permite anotar con facilidad citas puntuales o repetitivas, con o sin alarmas. Incluso se pueden tener varios calendarios, asignar distintos colores a cada uno de ellos, y compartir alguno con otras personas, algo que es ideal cuando se trabaja en grupo y los compromisos de una persona afectan a las demás. Lo único necesario para usar Google Calendar es tener una cuenta de Google (por ejemplo, la del correo Gmail).

Y los teléfonos Android se suelen integrar bastante bien con los servicios de Google. Pero a veces no tan bien como sería deseable. En mi caso, con mi Samsung Galaxy, se me mostraba el calendario "principal", pero no los demás subcalendarios (cosa que no ocurría con mi anterior HTC). No he encontrado solución en los ajustes del teléfono, así que he probado otras aplicaciones de calendario, con funcionalidades distintas, y una de ellas sí me ha resuelto el problema.

Para un espacio pequeño, Smooth Calendar es muy claro y fácil de leer, además de que se puede configurar o actualizar a petición haciendo un clic sobre su widget.

Para espacios más grandes (por ejemplo, 4x3 "bloques de pantalla"), Simple Calendar va muy bien, y es más personalizable que Smooth Calendar, aunque sólo se puede personalizar en el momento de colocar el widget en pantalla, porque no responde a los clics. Para cambiar algún detalle, hay que eliminar el widget y volverlo a instalar. Por defecto no muestra todos los calendarios, pero se pueden pedir en el momento de configurarlos. Éste es el que me hizo darme cuenta de que mis calendarios adicionales "existían" para el móvil pero aparecian marcados como "inactivos" (inactive), de modo que no se sincronizaban y no se mostraban sus detalles. Y no he encontrado en ningún apartado de la configuración del móvil la forma de marcarlos como "activos".

Navegando un poco por la red llegué a un foro en el que alguien ya había tenido ese problema. Como el foro original está en inglés, y encontrar cosas por la red puede ser tarea casi imposible, reproduzco aquí la solución de compromiso que encontró ese usuario, por si le sirve a alguien más: instalar otro gestor de calendarios gratuito distinto, Business Calendar Free, que sí permite marcar los calendarios como activos o inactivos. Después, si Business Calendar te parece demasiado "aparatoso", puedes no usarlo o incluso desinstalarlo. Pero al menos ya habrás ganado el acceso a esos calendarios ocultos, que deberían estar accesibles pero no lo estaban.

13 agosto 2012

Raspberry Pi y PyGame - Introducción

El fin de semana del 21 de julio (de 2012), un grupo de adolescentes decidió usar su Raspberry Pi y el lenguaje Python para hacer un marathon de programación colaborativa de 24 horas, que llamaron "Raspithon". Usaron la biblioteca de juegos Pygame (basada en SDL) para crear un juego de asteroides, que iban programando entre 4 personas, usando un repositorio Git como punto en el que centralizar todo lo que iban creando.

Puedes leer la propuesta que hicieron, el post que habla sobre los resultados e incluso descargar el programa resultante desde GitHub.

Si cuatro chavales de entre 12 y 16 años, que ni siquiera se conocen entre ellos, son capaces de crear un juego... ¿es que cualquiera puede hacer un juego con Pygame? Sí y no. Python es más fácil de aprender que otros lenguajes como C, pero aun así necesita algo de dedicación si se quiere tener soltura. SDL es una biblioteca de un nivel bastante bajo, de modo que no es especialmente sencilla; Pygame la "encapsula" y la hace un poco más accesible, pero aun así no es trivial. Además, no todo tipo de juegos se podrá hacer con una cantidad de esfuerzo razonable: Pygame puede ayudar para juegos en 2D (plataformas, matamarcianos simples, etc) pero no simplifica las tareas adicionales que conllevaría crear un juego en 3D, de modo que un juego de este tipo puede suponer una cantidad de trabajo desproporcionada.

¿Y basta con un Raspberry Pi? Sí. La instalación básica de Raspbian (de fecha 15-07-2012) incluye Pygame, aunque sólo para la versión 2.7 de Python, pero debería ser suficiente.

¿Y si no tengo un Raspberry Pi... no puedo? Claro que sí. Python es multiplataforma. Cualquier Linux podría bastar (tendremos que usar Synaptic o nuestro gestor de paquetes para instalar "python-pygame"). Incluso en Windows debería ser fácil de instalar... aunque yo lo he probado (¿aún?).

Un programa básico en Python, usando PyGame para que un "marciano" rebote en la pantalla podría ser así:

import pygame, sys
pygame.init()

ancho = 800
alto = 600
velocidadX = 3
velocidadY = 3

pantalla = pygame.display.set_mode( (ancho, alto) )

imagen = pygame.image.load("spaceinvader.png")
rectanguloImagen = imagen.get_rect()

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit()

    rectanguloImagen = rectanguloImagen.move( (velocidadX, velocidadY) )
    if rectanguloImagen.left < 0 or rectanguloImagen.right > ancho:
        velocidadX = -velocidadX
    if rectanguloImagen.top < 0 or rectanguloImagen.bottom > alto:
        velocidadY = -velocidadY

    pantalla.fill( (0,0,0) )
    pantalla.blit(imagen, rectanguloImagen)
    pygame.display.flip()


En mi caso, ha bastado con teclear esto en el editor Geany, guardarlo con el nombre "rebota1.py" y pulsar el botón "ejecutar".

El fuente debería ser fácil de seguir incluso si no conoces Python:
  • "Importamos" las bibliotecas que vamos a usar: pygame (por supuesto) y "sys", que usaremos para abandonar el programa cuando sea necesario: import pygame, sys
  • Inicializamos pygame: pygame.init()
  • Declaramos los que serán el ancho y el alto de la pantalla de juego, en puntos, porque los usaremos para preparar la pantalla pero también para que "rebote" nuestro "marciano": ancho = 800, alto = 600
  • Preparamos también la velocidad a la que se moverá el "marciano" (la cantidad de puntos que se desplazará en cada "fotograma" del supuesto "juego"): velocidadX = 3, velocidadY = 3
  • Preparamos la pantalla (el ancho y el alto se deben indicar entre paréntesis, porque no son dos números aislados, sino un "par"): pantalla = pygame.display.set_mode( (ancho, alto) )
  • Cargamos la imagen que representará nuestro marciano (esa imagen deberá existir y estar en la misma carpeta que se encuentra nuestro fuente): imagen = pygame.image.load("spaceinvader.png")
  • Cada imagen estará contenida en un "rectángulo", que será el que movamos: rectanguloImagen = imagen.get_rect()
  • Y empieza la parte que se va a repetir indefinidamente: while 1:
  • Revisamos todos los "sucesos" del sistema; si alguno de ellos es una petición de salir del programa (porque se pulse la X de la ventana), salimos al sistema:    for event in pygame.event.get():   if event.type == pygame.QUIT: sys.exit()
  • En cada fotograma, desplazamos el "marciano" a la que será su siguiente posición:      rectanguloImagen = rectanguloImagen.move( (velocidadX, velocidadY) )
  • Si se sale por un lado de la pantalla o por el opuesto, en horizontal, cambiamos su "velocidad", para que pase a moverse en dirección contraria:  if rectanguloImagen.left < 0 or rectanguloImagen.right > ancho:  velocidadX = -velocidadX
  • Y hacemos las mismas comprobaciones en vertical: if rectanguloImagen.top < 0 or rectanguloImagen.bottom > alto: velocidadY = -velocidadY
  • Rellenamos la pantalla de color negro (el color (0,0,0), sin nada de rojo, verde ni azul, es el negro):  pantalla.fill( (0,0,0) )
  • Volcamos la imagen a la pantalla: pantalla.blit(imagen, rectanguloImagen)
  • Y hacemos que lo que hemos preparado en pantalla sea visible:  pygame.display.flip()
  • Todo eso se repetirá hasta que abandonemos el programa.

El resultado será pobre, pero es un comienzo:



¿Quieres más?  Deja un comentario... ;-)

(Ese fuente se basa en uno tomado de uno de los muchos tutoriales de Pygame disponibles en la red; en concreto, en uno de Pete Shinners; si quieres ver más detalles, aquí tienes un texto paso a paso).

10 agosto 2012

Raspberry Pi y SDL

Mi primer intento de recompilar para Raspberry Pi una aplicación basada en SDL (el emulador de Amstrad CPC llamado Caprice) no fue un éxito.

Resulta que en la instalación básica de Raspbian (al menos en la recopilación de 15-07-2012) no incluye SDLdev (la parte de SDL que es necesaria para compilar programas usando SDL). Pero no es grave, tampoco es difícil añadirlo. Los pasos son:

  • Actualizar (update) los componentes que ya están instalados.
  • Ampliar (dist-upgrade) la distribución con los nuevos paquetes que hayan decididos sus recopiladores.
  • Reiniciar el equipo.
  • Instalar SDLdev y el resto de herramientas de desarrollo.
  • Recompilar el fuente.
Los primeros cuatro pasos equivalen a las siguientes órdenes

sudo apt-get update
sudo apt-get dist-upgrade
sudo shutdown -r now
sudo apt-get install gcc build-essential libsdl1.2-dev

Y el último paso supone entrar a la carpeta en la que está el fuente (en mi caso, "cpc") y recompilarlo (en este caso con "make"):

cd cpc
make -f makefile.unix

Aparecerá algún mensaje de aviso si el fuente incluye construcciones que actualmente se consideren obsoletas (como en el caso de Caprice), pero aun así debería compilar correctamente, y aparecer un ejecutable llamado "cap32". Si lo lanzamos desde consola tecleando

./cap32

nos aparecerá la versión del emulador basada en consola:



Si lo lanzamos desde el entorno gráfico, usando el gestor ficheros ("file manager") que tenemos en la carpeta de accesorios ("accesories") del menú, aparecerá la versión del emulador para entorno gráfico:


Esto no lo he descubierto yo desde cero, sino gracias a la ayuda de conversaciones mantenidas en los propios foros de Raspberry Pi y también a partir de los esfuerzos de otros usuarios, que habían portado ya juegos como Quake3.

09 agosto 2012

Raspberry Pi, Geany y CPC

Tercer contacto... Ahora toca ampliar un poco el software de mi Raspberry Pi.

Vamos a empezar por lo fácil: el software que ya existe en los repositorios, en mi caso el editor Geany, que me gusta usar como entorno de desarrollo. Son muy pocos pasos y relativamente sencillos:

  • Asegurarnos de que el "router" o la red que nos da acceso a Internet está totalmente operativa, por ejemplo probando a conectar antes otro ordenador y navegando desde él.
  • Conectar el cable de red entre el Pi y el router, el HDMI entre el Pi y el monitor, introducir la tarjeta SD con el sistema operativo (Raspbian 2012-07-15), conectar el teclado y el ratón (yo lo haré usando un Hub, para dejar un conector USB libre, en el que luego pueda conectar un pendrive con más datos) y finalmente conectar el cable de alimentación.
  • Cuando termine el arranque, si el "router" nos ha asignado una dirección IP correctamente, ésta se nos dirá justo antes del login, algo como "My IP address is 192.168.0.101". Aun así, podemos entrar al entorno gráfico con "startx" y lanzar el navegador "Midori", para comprobar de una forma "más visual" que tenemos acceso a Internet.
  • Entonces ya podemos abrir un terminal (o cerrar el entorno gráfico) y usar "apt-get" para instalar el software que nos interese y que aún no tengamos disponible. Por ejemplo, para "geany" seria
sudo apt-get install geany

Eso es todo. Si lo reconoce, nos mostrará un resumen y nos pedirá confirmación. Ahora deberíamos tener en el menú Desarrollo una nueva opción que nos permita lanzar Geany para poder teclear y compilar nuestros fuentes con comodidad.

Eso sí, no siempre será tan fácil, porque hay paquetes de software que no se encuentran en los repositorios, y habrá que "recompilarlos" a partir de su código fuente. Es el caso del emulador de Amstrad CPC llamado Caprice y de otros muchos paquetes de software minoritarios. En este caso, los pasos serán:
  • Descargar el código fuente de la aplicación, desde su página oficial (muchos de estos proyectos de código abierto están alojados en sitios como Sourceforge, Google Code o GitHub).
  • Si la descarga la hemos hecho desde otro ordenador, tampoco será un problema llevarlo al Pi: podemos volcarlo a un pendrive y conectar después ese pendrive a uno de los conectores USB del Pi (por eso había usado antes un Hub para conectar el teclado y el ratón, de modo que me quedara un USB libre).
  • Creamos una carpeta (eso es sencillo, se puede hacer desde el entorno gráfico) y copiamos en ella el fichero descargado (ídem).
  • Descomprimimos el fichero. En mi caso, basta con abrir un terminal, entrar a la carpeta "cpc" que he creado (usando la orden "cd cpc") y descomprimir el fichero zip ("unzip caprice32-4.2.0-src.zip").
  • En la mayoría de proyectos de programación en C basados en Linux, existe un "makefile", que nos permitirá recomprimir simplemente tecleando "make".
  • En el caso del emulador Caprice, como se puede compilar tanto para Windows como para Linux, hay dos makefiles distintos, así que lo intentaremos recompilar con "make -f makefile.unix").  ¿Y cómo se pueden saber esos detalles? Pues básicamente mirando si hay varios ficheros llamados "makefile", o bien buscando un "readme.txt" que nos lo cuente (habitualmente en inglés).
  • Al cabo de un instante, nuestro programa debería estar listo para funcionar.
Por supuesto, puede haber problemas. En mi caso, este programa necesita la biblioteca de juegos conocida como SDL. Esta biblioteca viene preinstalada en Raspbian, pero sólo con los módulos de usuario, de modo que se puede jugar a juegos, pero no crearlos. Tenemos que instalar libsdl-dev, que son los módulos de desarrollo ("dev" es la abreviatura de "development"). La orden es la misma que la usada para instalar Geany:

sudo apt-get install libsdl1.2-dev

¿Y cómo sé que la biblioteca se llama exactamente así? Pues con una búsqueda sencilla: tecleando "sudo aptitude search sdl" y mirando cuales de los resultados contienen "sdl" y "dev". Incluso podría bastar con el paquete "libsdl-dev", que a su vez buscaría el que corresponde a la versión más reciente.

Nuevamente, hay problemas: en mi caso, recibo un error de que no encuentra la sub-biblioteca "pulse audio", de modo que no consigue completar la instalación. Tampoco es un problema insalvable: hay usuarios que han creado una "actualización de Raspbian" que soluciona ese problema. Pero por hoy es bastante, así que eso queda aplazado para la siguiente entrega...