Introducción

Ya que no hay demasiado documentación de Mono en la red y creo que es una alternativa muy válida para muchos proyectos, voy a seguir publicando más tutoriales y tips sobre este tema.

Mi intención hoy es comentar cómo referenciar el conector de MySQL dentro de un proyecto de Mono con MonoDevelop, de forma que podamos utilizarlo con la arquitectura y las funcionalidades de ADO.NET para manejar datos con un servidor de base de datos MySQL. El conector os valdrá tanto para aplicaciones web como locales.

Si no conocéis ADO.NET os recomiendo que os leáis el artículo al que os referencio de la Wikipedia porque realmente es una arquitectura muy útil para el manejo de datos, aunque los más puristas la rechazarán por venir de Microsoft.

Instalación

Lo primero será estar seguros de que tenemos instalados Mono, MonoDevelop y que tenemos a nuestro alcance un servidor de MySQL al que conectarnos. Si no lo tenéis instalados podéis instarlo prácticamente seguro desde vuestro gestor de paquetes y en todo caso, desde la web oficial del Proyecto Mono. Una vez hecho esto descargaremos el conector desde este enlace en la web de MySQL. Elegimos la plataforma: “.NET & Mono”. Se os descargará un fichero dll con los ensamblados correspondientes.

Referencia dentro de un proyecto

Ahora nos dirigimos a Mono Develop y creamos una solución nueva (da igual si de consola o GTK#). Al crearse la solución nos dirigimos a las Referencias del proyecto y desde allí importamos el ensamblado. Para ello seleccionáis  “Editar referencias…”. De las tres opciones que aparecen en el diálogo entramos en “Ensamblado .NET”, elegimos el fichero dll que acabamos de descargar y lo añadimos.

Prueba

Para terminar vamos a probar que todo está bien. En el Main.cs vamos a implementar el típico ¡Hola Mundo!, añadiéndole al comienzo una referencia al conector. Si compila correctamente hemos llegado a nuestro objetivo.

using System;
using MySql.Data.MySqlClient; 

namespace ejemplo_mono_ado
{
	class MainClass
	{
		public static void Main(string[] args)
		{
			Console.WriteLine("Hello World!");
		}
	}
}

En un futuro post explicaré más sobre el uso y la potencia de esta herramienta.

Aunque en la entrada de la presentación de Django se habla de la instalación del framework, a través de dos métodos: script install.py e instalación de paquete desde el repositorio; vamos a explicar otro método más, algo más largo pero a la vez más compatible. Nos quita la limitación del paquete de que la versión no sea la más reciente (limitación que no tiene el método de instalación con install.py).

Doy por supuesto que tenéis instalado Python en vuestro equipo.

  1. Nos dirigimos a nuestro directorio $HOME
  2. Descargamos la última revisión del proyecto: svn co http://code.djangoproject.com/svn/django/trunk/ djtrunk
  3. Averiguamos cuál es el directorio en el que Python guarda los paquetes:  python -c “from distutils.sysconfig import get_python_lib; print get_python_lib()”
  4. Nos dirigimos al directorio que nos indique y creamos un fichero de nombre django.pth (el fichero podéis crearlo con nano mismo nano django.pth).
  5. En dicho fichero indicamos sólo una línea con el directorio en el que hemos descargado el código de Django (en nuestro caso será /home/miusuario/djtrunk).
  6. Añadimos a la variable PATH la ruta de los binarios de Django:
    1. Editamos el fichero con las variables de entorno /etc/environment
    2. Añadimos a la variable PATH la ruta: PATH=”lo_que_haya_antes: $HOME/djtrunk/djtrunk/django/bin”

Ya podemos probar la instalación de Django. Podéis probar a importar el módulo Django desde Python o podéis probar a crear un sitio y lanzar el servidor de prueba:

  1. django-admin.py startproject misitio
  2. python manage.py runserver
  3. Lanzamos el navegador para escuchar el puerto 8000 del host local: http://localhost:8000

Deberías ver algo así:

Y a partir de aquí seguid leyendo el ejemplo que colgamos ayer.

Si hace unos días hablábamos de la posibilidad de ejecutar aplicaciones ASP.NET en nuestro equipo Linux con XSP, hoy traemos la que podría ser la segunda parte de ese artículo: hacer esto mismo pero con Apache y mod_mono.

¿Por qué escoger este binomio en lugar de XSP? La respuesta es fácil: XSP es un servidor de pruebas, no de producción y si queremos tener un servicio o aplicación web ejecutando de forma decente en producción, mejor utilizar Apachemod_mono. Las razones no son sólo por la escalabilidad y eficiencia que permite Apache, sino que están relacionadas por la seguridad que provee el servidor más utilizado a nivel mundial y por la gran variedad de opciones que nos ofrece.

De todas maneras sigo pensando que al igual que el servidor de pruebas de Django es útil para las pruebas, XSP es un buen servidor de pruebas para practicar con nuestro PC cuando estemos aprendiendo ASP.NET. Cuando la aplicación se hace compleja y sobre todo queramos pasarla a producción, Apache.

Instalación y configuración

  1. Instalamos:
    1. Apache 2 (si utilizáis sistema de paquetería será algo así como apache2).
    2. Módulo para multiproceso: apache2-mpm-worker.
    3. Módulo de Monolibapache2-mod-mono.
    4. Interfaz entre Mono y servidormono-apache-server.
  2. Reiniciamos el servicio de Apache para que recargue la configuración: sudo /etc/init.d/apache2 restart
  3. Activamos el módulo (a2enmod significa apache2 enable module): sudo a2enmod mod_mono
  4. Vemos qué versión de ASP.NET está activada (lo recomendable es que sea la 2 y no la 1). Para comprobarlo nos dirigimos a: /etc/apache2/mods-available y vemos el fichero mod_mono.conf, debería estar así (comentada con # la primera):
    #Include /etc/mono-server/mono-server-hosts.conf
    Include /etc/mono-server2/mono-server2-hosts.conf

En definitiva, una forma simple de tener un servidor ASP.NET corriendo en nuestro equipo Linux, con software libre y en sólo cuatro pasos. Para tenerlo perfectamente preparado para producción, deberéis de tener en cuenta algunos detalles más propios de Apache, pero la parte específica de Mono es ésta.

Ya me contaréis vuestras impresiones con esta tecnología.

Parece que la noticia ha gustado y lo han colgado de Menéame. Si queréis ya sabéis: menead.

Logo Proyecto Mono

A través de esta entrada vamos a introducirnos en el mundo del desarrollo de aplicaciones gráficas usando una librería llamada pygame que nos proporciona las herramientas necesarias para crear de forma relativamente sencilla nuestros juegos en el lenguaje de programación Python.

¿Qué es Pygame?

Pygame es un conjunto de módulos que nos ayudan a crear videojuegos o aplicaciones gráficas (no necesariamente videojuegos) en dos dimensiones. Pygame incluye gráficos y bibliotecas de sonido diseñados para ser utilizados directamente bajo Python. Está construido bajo Simple DirectMedia Layer (SDL), que a su vez son un conjunto de bibliotecas desarrolladas en lenguaje C, proporcionando las funciones básicas para realizar operaciones de dibujado 2D, gestión de efectos de sonido y música, y carga y gestión de imágenes. De esta manera, a través de Pygame podemos abstraernos de la lógica del juego (o aplicación) en si mismo, haciendo posible el uso de un lenguaje de alto nivel como Python para estructurar el juego.

Pygame fue contruido como sustituto de pySDL, después del poco éxito del mismo, ya que la forma de interactuar no llegó a recoger tantas opciones y tan simples como las del entorno de Pygame.

Escrito originalmente por Shinners Pete se distribuye bajo la GNU Lesser General Public License. Desde 2004 se trata de un proyecto de código abierto de la comunidad de software libre.

Instalando Pygame y el entorno

Antes de comenzar a ver una serie de ejemplos generales a modo de introducción en el mundo de Pygame vamos a configurar nuestro sistema para poder importar los módulos de Pygame desde Python, como cualquier otra librería.

La instalación es bastante simple. Suponiendo que nuestro sistema corre una distribución basada en Debian y que ya corre la versión más reciente de Python, de tal forma bastará con usar un gestor de paquetes e instalar el paquete python-pygame y satisfacer todas sus dependencias. Así, y de la forma más intuitiva usaremos las dos vías principales, usando el adminstrador de paquetes en modo texto APT y su versión gráfica Synaptic.

En el primero de los casos la instalación es bastante sencilla, abrimos un terminal y ejecutando como superusuario (root) lanzamos la herramienta apt-get como se indica a continuación y cómo se observa en la figura 1.

$ sudo apt-get install python-pygame

Y nos preguntará si deseamos instalar todos los paquetes anexos y dependencias, a lo que responderemos afirmativamente.

Figura 1 Instalación mediante el gestor de paquetes APT

Usando el gestor de paquetes Synaptic la operación es similar, nos dirigimos a System → Administration → Synaptic Package Manager, localizamos el paquete python-pygame y lo marcamos para instalar, cómo se muestra en la figura 2. Aplicamos los cambios aceptando todas las dependencias y listo, ya tenemos nuestro entorno preparado nuestro entornor para empezar a trabajar con Pygame.

Figura 2 Instalación mediante el gestor de paquetes Synaptic

Uno de mis entornos de programación preferidos es Geany, un IDE desarrollado en GTK y que se define así mismo como: A fast and lightweight IDE. Aconsejo su uso ya que nos resultará bastante sencillo probar los ejemplos planteados.

Para su instalación, y de forma análoga a Pygame, localizaremos el paquete geany y satisfaceremos sus dependencias si se precisan, así con APT y cómo se muestra en la figura 3:

$ sudo apt-get install geany

Figura 3: Instalación del IDE Geany

Nuestro primer programa…

Vamos a proceder con un ejemplo muy básico de uso. Abrimos nuestro IDE de Python (Geany) y probamos con el siguiente código, en este se dibujará un fondo sobre una ventana y dos lineas diagonales que cruzarán los extremos de izquierdas a derechas y de arriba a abajo y al contrario. Así, el código comentado:

# -*- coding: utf-8 -*-

# Importamos las librería de Pygame y las del sistema, necesarias para forzar el cierre
import pygame, sys
from pygame.locals import *

# Inicializamos Pygame
pygame.init()

# Definimos el color de fondo y el de la diagonal
COLOR_FONDO = (50, 150, 200)
COLOR_LINEA1 = (255, 0, 0)
COLOR_LINEA2 = (0, 0, 255)

# Definimos el tamaño de la aplicación y la tasa de refresco
pantalla = pygame.display.set_mode((800, 600))
refresco = pygame.time.Clock()

while True:
time_passed = refresco.tick(30)
# Comprobamos el cierre de la aplicación y en caso afirmativo lanzamos la función salir
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()

# Fijamos el color de fondo y las lineas de diferentes colores, y lo sacamos por display
pantalla.fill(COLOR_FONDO)
pygame.draw.aaline(pantalla, COLOR_LINEA1, (1, 1), (799, 599))
pygame.draw.aaline(pantalla, COLOR_LINEA2, (799, 1), (1, 599))
pygame.display.flip()

NOTA: Para lanzar directamente la aplicación desde el IDE Geany podemos hacerlo pulsando F5 o desde el icono designado para esta operación.

De esta forma, el resultado que obtenemos tras ejecutar nuestra primera aplicación es el mostrado en la figura 4.

Figura 4: Ejecutando nuestro primer programa

Controlando los eventos

Es posible que al empezar en la programación de aplicaciones gráficas mediante Pygame nos surjan dudas acerca del manejo de eventos a través del programa desarrollado. Es por ello que vamos a dedicar este pequeño apartado a tratar de aclarar las diferentes maneras que tenemos para registrar los eventos que se suceden en nuestra aplicación.

Será importante diferenciar los métodos que pueden ayudarnos a registrarlos a guardarlos de una forma temporal antes de ser analizados. Así:

  • pygame.event.get: Obtenemos los eventos mediante una cola. Esta función es la usada en el ejemplo anterior, de forma que definimos un tiempo de refresco a partir del cual recorremos los eventos registrados y ejecutamos sus acciones asociadas. Esta es quizás la forma más común de registro de eventos no forzado, y de esta manera no nos obliga a realizar una pulsación o control del flujo del programa en un punto.
  • pygame.event.poll: Obtenemos un evento simple de la cola. Simplemente es capaz de guardar el último evento sucedido. Resulta práctica cuando únicamente queremos dejar constancia de un evento registrado en un intervalo de tiempo definido.
  • pygame.event.wait: Espera un evento de la cola. Este lo he usado en el ejemplo planteado a continuación, de forma que podamos ir viendo algunos de los eventos que podemos controlar así como estudiar las posibilidades que nos ofrece esta vía de registrar eventos.

Podemos ver el resto de eventos accesibles por teclado en el siguiente enlace: Documentación oficial de Python.

El ejemplo que muestra su uso, a continuación:

# -*- coding: utf-8 -*-

import pygame
from pygame.locals import *

pygame.init()
pygame.display.set_mode((200, 200))
pygame.display.flip()
event = pygame.event.poll()

while True:
cursor = pygame.mouse.get_pos()
evento = pygame.event.wait()
if evento.type == QUIT or evento.type == K_ESCAPE:
print ”Has abandonado la aplicación”
raise SystemExit
if pygame.mouse.get_pressed()[0]:
print ”Has usado el botón izquierdo del ratón”
if pygame.mouse.get_pressed()[1]:
print ”Has usado el botón central del ratón”
if pygame.mouse.get_pressed()[2]:
print ”Has usado el botón derecho del ratón”
if evento.type == KEYDOWN and evento.key == K_SPACE:
print ”Has pulsado espacio”
if evento.type == KEYDOWN and evento.key == K_BACKSPACE:
print ”Has pulsado backspace”

La figura 5 muestra su ejecución:

Figura 5: Controlando los eventos de la aplicación

Más figuras e imágenes

Al estar basado en SDL, Pygame tiene la capacidad de poder mostrar imágenes así como formas básica de una forma casi trivial, las primitivas que se encargan de realizar estas operaciones las comentamos en el siguiente ejemplo y vemos su resultado:

# -*- coding: utf-8 -*-

# Importamos las librería de Pygame y las del sistema, necesarias para forzar el cierre
import pygame
from pygame.locals import *

# Inicializamos Pygame
pygame.init()

# Definimos el color de fondo y el de las figuras
COLOR_FONDO = (50, 100, 50)
COLOR_CUADRADO = (255, 0, 0)
COLOR_CIRCULO = (0, 0, 255)
# Cargamos la imagen y hacemos transparente el fondo (antes verde)
imagen_nave = pygame.image.load(‘nave.bmp’)
imagen_nave.set_colorkey((0, 255, 0))

# Definimos el tamaño de la aplicación y la tasa de refresco
pantalla = pygame.display.set_mode((800, 600))

while True:
time_passed = pygame.time.Clock().tick(30)
# Comprobamos el cierre de la aplicación y en caso afirmativo lanzamos la función salir
for event in pygame.event.get():
if event.type == QUIT:
raise SystemExit

# Fijamos el color de fondo y dibujamos las figuras y la imagen
pantalla.fill(COLOR_FONDO)
pygame.draw.rect(pantalla, COLOR_CUADRADO, (50, 50, 100, 100))
pygame.draw.circle(pantalla, COLOR_CIRCULO, (400, 300), 75 )
pantalla.blit(imagen_nave, (500, 400))
# Actualizamos la pantalla
pygame.display.flip()

NOTA: Podemos ver cómo al no disponer de transparencia la imagen de la nave se la fijamos mediante el método set_colorkey().

Y el resultado lo podemos ver en la figura 6.

Figura 6: Ejemplo con figuras e imágenes

Y el sonido

Para terminar con esta introducción a Pygame vamos a realizar un test de sonido, para lo cual usaremos la el módulo mixer. El ejemplo:

# -*- coding: utf-8 -*-

import pygame, os
from pygame.locals import*

# Iniciamos el módulo mixer
pygame.mixer.init()
# Cargamos la pista de audio haciendo uso del sistema, mediante el cual podemos indicar rutas relativas sin dependencia del sistema operativo
pygame.mixer.music.load(os.path.join(“1vs0_JuniorGroove.ogg”))
# Y reproducimos la pista cargada de forma continua, valor -1.
pygame.mixer.music.play(-1)

Podéis consultar el resto de opciones desde la documentación de Python.

NOTA: La pista de audio utilizada tiene licencia Creative Commons, 1vs0 – Junior Groove.

Bibliografía

Es un problema con el que cualquier persona que utilice PHP y MySQL se encuentra muy a menudo. Hasta que PHP no trate directamente esos datos y se sobrecarguen internamente los operadores de comparación para que todo sea directo, tendremos que valernos de métodos como el que os muestro para poder comparar dos fechas en formato MySQL con PHP (formato MySQL, es decir fecha en formato inglés con guiones y el orden invertido respecto al nuestro).

La siguiente función devuelve:

  • 1 si la fecha a es mayor que la fecha b
  • 0 si son iguales
  • -1 si la fecha a es menor que la fecha b
function comparar_fechas_mysql($a, $b)
	{
		$a_v=explode("-",$a);
		$anyo_a = $a_v[0];
		$mes_a = $a_v[1];
		$dia_a = $a_v[2];

		$b_v=explode("-",$b);
		$anyo_b = $b_v[0];
		$mes_b = $b_v[1];
		$dia_b = $b_v[2];

		if($anyo_a > $anyo_b)
			return 1;
		else
		{
			if($anyo_a < $anyo_b)
				return -1;
			else
			{
				if($mes_a > $mes_b)
					return 1;
				else
				{
					if($mes_a < $mes_b)
						return -1;
					else
					{
						if($dia_a > $dia_b)
							return 1;
						else
						{
							if($dia_a < $dia_b)
								return -1;
							else
								return 0;
						}
					}
				}
			}
		}
	}

Esperamos vuestras sugerencias, mejoras y rectificaciones de este y todos los tips de programación que vayamos incorporando.