El blog personal de Morgul, donde escribe sobre sus aficiones, descubrimientos y actividades, compartiendo conocimientos.

28 de febrero de 2010

Función print compatible con Python 2.X y 3.X

Una de las características introducidas por el sencillo y potente lenguaje de programación Python, en su versión 3.0, es la sustitución de la orden interna print por una función de igual nombre. Esto supone algunas ventajas, pero también la desventaja de romper la portabilidad hacia atrás del código que haga uso de la orden print.

Como tengo varios proyectos de desarrollo en Python, como el motor de MUD de MUnDoCAAD (MUnDoCAAD MUD Engine, véase la entrada "MUnDoCAAD MUD Engine: pasado y presente") y mi intérprete de aventuras tipo-PAWS (véase la entrada "Mi intérprete de aventuras DAAD"), me interesa permitir que este código funcione tanto en versiones de Python 2.X como en las 3.X.

Es por ello que he desarrollado recientemente una solución, un conjunto de módulos Python, que permite tener la misma funcionalidad con independencia de la versión de Python de la que se disponga. Compartiré este código aquí, en mi blog, para quien le pueda servir.

El módulo principal de la solución se llama prn_func, recomiendo su uso con una orden como: from prn_func import prn, y después sustituir todos los usos de print por prn, usando esta función del mismo modo que la nueva función print de Python 3. Su código (a guardar como prn_func.py) es el siguiente:
# Función sustituta de print, compatible con Python 2.X y 3.X

from sys import version_info

if version_info[0] < 3:
  # La versión de Python es 2.X
  if version_info[1] < 6:
    # La versión de Python es menor que la 2.6
    try:
      from prn_2 import prn
    except SyntaxError:
      pass
  else
:
    # La versión de Python es mayor que la 2.5
    try:
      from prn_26 import prn
    except SyntaxError:
      pass
else
:
  # La versión de Python es 3.X
  try:
    from prn_3 import prn
  except SyntaxError:
    pass

Los otros módulos (prn_2, prn_26 y prn_3) son auxiliares a este. Cada uno de ellos ofrece el soporte de la función de impresión para un conjunto de versiones específico de Python.

El módulo prn_2 ofrece el soporte de la función de impresión para versiones de Python menores que la 2.6. Su código (a guardar como prn_2.py) es el siguiente:
# Exporta la función sustituta de print, en versiones de Python 2.X

from sys import stdout

def prn (*args, **keywords):
  textos = []
  for arg in args:
    textos.append (str (arg))
  fichero = keywords.get ('file', stdout)
  fichero.write (keywords.get ('sep', ' ').join (textos))
  fichero.write (keywords.get ('end', '\n'))

El módulo prn_26 ofrece el soporte de la función de impresión para versiones de Python 2.X mayores o iguales que la 2.6. Su código (a guardar como prn_26.py) es el siguiente:
# Exporta la función sustituta de print, en versiones de Python 2.6.X

from __future__ import print_function

prn = print

El módulo prn_3 ofrece el soporte de la función de impresión para versiones de Python 3.X. Su código (a guardar como prn_3.py) es el siguiente:
# Exporta la función sustituta de print, en versiones de Python 3.X

prn = print

¿Te ha gustado esta entrada? Vótala en Bitacoras.com: Votar

1 de febrero de 2010

Mi intérprete de aventuras DAAD

Últimamente, he estado desarrollando un intérprete tipo PAW con el lenguaje de programación Python, lenguaje que además de ser muy potente, permite programar aplicaciones de cualquier complejidad en muy poco tiempo (este proyecto es una buena prueba de esta afirmación).

Mi intención es hacer este intérprete genérico, de modo que pueda extenderse fácilmente para soportar cualquier sistema tipo PAW existente, añadiendo en módulos aparte los condactos adicionales (los de The PAWS estándar ya los implementará mi intérprete) y funciones para cargar o importar las bases de datos. Y también extensible en cuanto a poder incorporarlo en un sistema de creación integrado, partiendo convenientemente en módulos para aprovechar el código de buen modo, sin necesidad de duplicarlo.

Como ya había avanzado bastante en la comprensión y aprovechamiento de las bases de datos de algunas de las primeras versiones del parser DAAD, me aventuré a probar y adaptar mi intérprete para aventuras con este sistema (sobre todo, el 'Jabato'), sin perder de vista el aspecto de facilitar la compatibilidad hacia atrás (The Quill, The PAWS, SWAN) y hacia adelante (otros sistemas tipo PAW posteriores, como NMP, SINTAC, SKC, etc.). Esto me ha permitido avanzar aún más en mi descubrimiento arqueológico de los recovecos de DAAD (y sus precursores).

Ayer mismo, me puse tan contento cuando vi que lo que tenía hecho funcionaba tan bien, y de modo tan parecido ya al mismo intérprete DAAD original de el 'Jabato' (ejecutando esta aventura), que grabé un vídeo para compartir con vosotros, y que podáis ver que esto es más que puro vaporware:



En el vídeo (sobre todo en la versión con mayor calidad, la del enlace de descarga que indico en YouTube), si se presta suficiente atención, se aprecian algunos defectos. Unos cuantos de estos los he corregido ya hoy, como:
  • Mayor velocidad de ejecución. Mi intérprete, cuando tenía la traza de banderas activada (el mostrar cómo van cambiando estas), iba bastante lento. Esto me hizo tener que enlentecer enormemente la emulación de DOSBox, para poder comparar de modo visualmente más fácil la ejecución de ambos intérpretes a la vez. Lo he solucionado haciendo que sólo se redibujen las banderas que cambien de valor o color. En comparación, ahora vuela... deshabilitando la acción de espera de los condactos PAUSE y ANYKEY, la ejecución de lo que en el vídeo dura más de un minuto, ahora tarda unos cuatro segundos, permaneciendo totalmente funcional la traza de condactos por consola y de banderas en la ventana.
  • En los créditos, cuando aparece el texto "PRESENTAN" bajo la cara de Jabato, en la versión original Jabato guiña un ojo, mientras que en mi intérprete parpadea (cierra ambos ojos). Una misma versión, con distinto efecto, del mismo problema es cuando la cara de Jabato sube a la parte superior derecha de la pantalla, una vez descrita la localidad inicial. El problema era que mi intérprete dibujaba imágenes siempre completas, sin respetar los límites de dibujado que indicaba el código de la aventura. Ahora ya respeta estos límites invisibles.
  • Otro problemilla menor (en el vídeo) era que, al borrar partes de la pantalla, a veces se borraban también zonas de la sección de impresión del estado de las banderas de mi intérprete. Esto era un problema pequeño, hasta la corrección del problema del primer punto, que lo convertía en un problema grande. Pero la solución ha sido más rápida que la de los puntos anteriores, si bien similar a la del segundo.
Eso es todo, por ahora. Aprovecho para pediros que no dudéis en compartir conmigo cualquier información técnica que tengáis de DAAD o de su precursor inmediato SWAN. Sobre todo, me encantaría conseguir la documentación de DAAD que venía con las copias del parser que se entregaron a los siete ganadores del concurso de Aventuras AD-Microhobby.

¿Te ha gustado esta entrada? Vótala en Bitacoras.com: Votar

20 de enero de 2010

Cómo cambiar la fecha de una entrada de Blogger

Esta entrada responde a la pregunta: ¿cuál es la forma más sencilla de cambiar la fecha y/o la hora de una entrada de Blogger/Blogspot?

En un post mío anterior, 'Unificación de blogs con Blogger', comenté cómo había cambiado la fecha de varias entradas de este blog a través de las opciones de Blogger Exportar blog e Importar blog, editando a mano un fichero XML.

Pues hoy me he dado cuenta que hay una forma muchísimo más sencilla para hacer exactamente lo mismo. El procedimiento, que es válido sólo para entradas ya publicadas pero independientemente de si se utiliza el utiliza el editor nuevo de Blogger (del que hablaré en el futuro) o el antiguo, es el siguiente:


Abrimos con el editor la entrada a la que queremos cambiar la fecha, seleccionndo Editar en la línea correspondiente a la entrada en el apartado Editar entradas. Una vez abierta la entrada en el editor, nos fijamos en lo que hay inmediatamente debajo del campo de edición del contenido, y veremos que a la izquierda de donde se escriben las etiquetas, está la opción Opciones de entrada. Si hacemos click ahí, se desplegarán unas cuantas opciones, según la versión del editor que estemos utilizando...

Con el editor viejo veremos:



Y con el editor nuevo veremos estas otras opciones:



Una de las opciones que aparecen, que he resaltado en las capturas de pantalla anteriores, es: Fecha y hora de la entrada. Pues ahí está lo que buscábamos, eso es lo que debemos editar para cambiar la fecha y/o la hora de una entrada de nuestro blog.

Esta funcionalidad puede usarse también para realizar un truco con Blogger, que consiste en poner la fecha en el futuro, para que una de nuestras entradas aparezca siempre la primera de nuestro blog, como explica el artículo 'Cómo dejar una entrada siempre arriba del blog' de Ciudad Blogger. En caso de usarlo yo, ya puesto, aprovecharía también lo que dice en su otro artículo 'Mostrar el primer post de forma diferente' sobre la condición isFirstPost de las plantillas Blogger, para que no se mostrara la fecha de ese primer artículo (ocultando la fecha futura).

¿Te ha gustado esta entrada? Vótala en Bitacoras.com: Votar

19 de enero de 2010

Código fuente de IMaZMor liberado

Así es, he liberado recientemente (hace un par de días) el código fuente de IMaZMor, cuyo nombre viene de 'Intérprete de Máquina-Z de Morgul'. Es decir, mi intérprete de Máquina-Z, el único que he hecho yo (hasta la fecha).

Para quien no lo sepa, la Máquina-Z es una máquina virtual diseñada por la compañía estadounidense Infocom, para soportar la ejecución de aventuras conversacionales (llamadas típicamente ficción interactiva por los angloparlantes) independientemente de la plataforma física, a través de intérpretes de esta máquina virtual para cada plataforma que se quiera soportar.

Pues bien, IMaZMor es un intérprete de Máquina-Z para dispositivos móviles, concretamente para la plataforma J2ME, para dispositivos que soporten el perfil MIDP 1.0 ó superior.

Aquí podéis ver un par de capturas de IMaZMor ejecutando 'Wishbringer: The Magick Stone of Dreams', aventura de Infocom:



De momento, está lejos de ser una implementación completa, soporta un subconjunto de las instrucciones de dicha máquina virtual, y sólo permite ejecutar aventuras de la versión 3 de la Máquina-Z. Esto limita bastante la actual utilidad de este intérprete, ya que la mayor parte de las aventuras conversacionales para Máquina-Z publicadas hoy en día, son para la versión 5 de la máquina.

La mayor fuente de aventuras para la versión 3 de la Máquina-Z que se puede encontrar, son las recopilaciones de antiguos clásicos (de la década de los 80) de Infocom, que todavía siguen comercializándose pero también pueden adquirirse de segunda mano, como: 'The Comedy Collection', 'The Fantasy Collection', 'The Mystery Collection' y 'The Sci-Fi Collection'.

El código fuente de IMaZMor lo he liberado bajo la licencia GNU General Public License versión 2, y lo he publicado en un repositorio Git en Gitorious, donde ya alojé otros proyectos. La dirección del repositorio de IMaZMor es: http://gitorious.org/imazmor

Con esta acción, ahora cualquiera tendrá libre acceso al código fuente de este intérprete de Máquina-Z, igual que ya se hizo con otros intérpretes anteriores para J2ME, como ZeeME o Z2me. Ahora ya no cabe la posibilidad de que pierda el código de esta creación mía, y a la vez otros podrán colaborar conmigo en su desarrollo, o simplemente divertirse mientras la prueban.

Las herramientas necesarias para que podáis compilar vosotros mismos IMaZMor son: el Java Wireless Toolkit versión 2, de Sun Microsystems; y el preprocesador de C de GNU: CPP. Como explicaré en otra entrada, CPP lo utilizo como preprocesador para el código Java, permitiendo el uso de constantes de preprocesador y de compilación condicional, lo cual resulta en un ejecutable del programa más pequeño y eficiente.

Otra captura de IMaZMor en acción, esta vez mostrando el inicio de 'Ballyhoo':


Aprovechando que tengo otro teléfono móvil, uno que tiene pantalla táctil pero no tiene teclado ni botones, tengo en mente añadirle en un futuro próximo las siguientes características:
  • Soporte de impresión en modo gráfico (en principio, solamente con una fuente de tamaño fijo, ya que es más fácil de implementar), detectando la resolución de la pantalla. Hasta ahora, IMaZMor escribía los textos usando un formulario J2ME, pero esta característica de J2ME es tan limitada que no admite un scroll de texto adecuado y predecible, y tampoco permitía poner la línea de estado más que como título del formulario.
  • Scroll de texto funcional, que guarde las líneas de texto anteriores para poder verlas de nuevo y, sobre todo, que se espere en caso de llenarse la pantalla (de momento, lo que ocurre depende de cómo implementa Java cada teléfono, por lo general, o se queda al principio del todo siempre, o al final del todo en todo caso).
  • Soporte de pantallas táctiles. Al menos, mi intención es permitir que se pueda hacer scroll del texto de la aventura pulsando sobre la pantalla. Sobre permitir la entrada de órdenes de manera táctil también, ya veremos, lo haré según su dificultidad. Probablemente lo más sencillo sea implementar un teclado virtual, en caso de que no haya ninguna otra forma de entrada funcional para mi teléfono. Si implementara algo como T9, estaría bien utilizar el diccionario de la propia aventura para el completado.
Si hacéis alguna adaptación de este programa, haciendo cambios sobre el código, y queréis compartir vuestra versión modificada, agradecería que compartiérais el código primero conmigo, para así añadirlo al repositorio y que todos puedan aprovecharse de vuestras aportaciones.

¿Te ha gustado esta entrada? Vótala en Bitacoras.com: Votar

17 de enero de 2010

Unificación de blogs con Blogger

Después de haber metido la pata, por haber hecho la transferencia de entradas desde el blog 'El hombre imperfecto' hasta este blog de forma manual, copiando las entradas antiguas y pegándolas como entradas nuevas (en lugar de con su fecha original); he descubierto cuál era el modo correcto de realizar dicha labor con Blogger:

Blogger proporciona la opción de exportar e importar entradas, guardándolo todo (como las fechas y los comentarios) en un fichero xml. Esto permite hacer copias de seguridad de un blog, pero también lo que yo quería hacer: unificar mis dos blogs en uno. Esta opción se encuentra en el apartado Configuración del blog, en la primera pestaña: Básico, donde dice Herramientas de blog. Allí aparecen las opciones Importar blog, Exportar blog y Suprimir blog.

Precisamente esa última opción era la que iba buscando, para eliminar del todo mi antiguo blog, y entonces me he dado cuenta de que debería haber hecho la unificación de blogs de ese modo, con lo cual las entradas habrían aparecido en sus respectivas fechas de publicación original.

Por si a alguien le resulta útil, el modo correcto de unificar dos blogs con Blogger es el siguiente: usando las opciones que menciono antes, exportar las entradas del blog que queremos que desaparezca, e importar el fichero xml que se genere desde el blog que va a contener todas las entradas.

De todos modos, no todo estaba perdido para mí, ya que anoté la fecha original de las entradas de 'El hombre imperfecto' cuando las creé en 'El blog de Morgul', tecleando al principio de cada entrada su fecha original. Lo único que se ha perdido ha sido las horas de publicación, pero me las he inventado de forma creíble, así que nadie que no lea esto lo notará :-D

Sabiamente, he jugado con los ficheros xml exportados para modificar las fechas de las entradas, poniendo las fechas originales. Y tras eliminar las entradas nuevas, que aparecían con fecha de 8 de enero, he reimportado las entradas desde el fichero xml modificado a mano, con lo cual ahora las entradas del antiguo blog 'El hombre imperfecto' aparecen en su fecha original de publicación. Asunto solucionado.

Como ya no está tan clara la diferencia entre esas entradas que formaban parte de mi alter blog, y las entradas que siempre han sido de este blog, indicaré aquí los enlaces de las inmigrantes:
Ahora ya puedo decir adiós para siempre a 'El hombre imperfecto'.

¿Te ha gustado esta entrada? Vótala en Bitacoras.com: Votar

8 de enero de 2010

"Merge" de blogs

He decidido hacer un merge de mis dos blogs, es decir, fundir los dos blogs que tenía en uno solo. El blog que quedará será este mismo, y el otro desaparecerá una vez haya transferido sus entradas al blog que estás leyendo ahora.

El blog que desaparece se llamaba 'El hombre imperfecto', era el blog donde iba añadiendo entradas sobre mi desarrollo personal, tanto como hombre, ser humano y a nivel espiritual. Lo del desarrollo espiritual es algo que no había previsto y que me ha venido automáticamente, casi sin darme cuenta. De hecho, creo que en ese blog no llegué a comentar sobre ello.

Hay varios motivos para esta decisión de unificación. A grandes rasgos, podríamos decir que mi mentalidad y punto de vista respecto al otro blog ha cambiado en gran medida, y esto efectivamente se manifiesta ahora como un cambio palpable. Paso a detallar los cambios que me parecen importantes mencionar (al menos, para dejar constancia de ellos para mí):

  • Inicialmente, quería mantener mi identidad en el anonimato, dentro de lo posible, como autor del blog 'El hombre imperfecto'. Por eso creé dos blogs separados, uno para autosuperación y el otro (este mismo) para todo lo demás, donde en el primero me cubría en anonimato y en el otro me daba igual. Pues bien, ahora veo que no tiene ningún sentido ocultar mi identidad de ningún modo, no hay nada de vergonzoso ni de malo en superarse a uno mismo, y tampoco lo hay en reconocer mis defectos, tanto pasados como presentes.
  • El título del blog: ya no lo siento como algo que me identifique. Reconozco que aunque pueda parecer imperfecto en apariencia, de hecho puedo observarme como imperfecto en muchas ocasiones, esta no es la realidad a un nivel elemental. Aprovechando la jerga informática, diría que a bajo nivel, a nivel de Código Original (podría entenderse también como el código fuente de la Creación) soy absolutamente perfecto en todos los aspectos, sin excepción. La imperfección que veo en mí (o en cualquier otra cosa), es código imperfecto que oculta el código original (volviendo a la jerga informática, digamos que lo encapsula), causándome efectivamente (y a otros) la percepción de imperfección. Pero este código imperfecto puede eliminarse, cosa que no puede hacerse con el código original. Por tanto, entiendo que es contraproducente decir que soy imperfecto cuando en el fondo todo, absolutamente todo, es divinamente perfecto en esencia, y tengo intención y decisión de eliminar el código erróneo que oculta el Original en mi experiencia.
  • Ha habido varios cambios importantes en mí que me han proporcionado esta nueva perspectiva, como una mayor autoaceptación, mayor respeto y amor de mí hacia mí mismo, en general una mayor autoestima; y la aceptación, desapego y trascendencia de mi pasado (no soy mi pasado, no soy un cúmulo de experiencias, soy mucho más que eso, siempre lo he sido aunque no siempre fuera consciente de ello), además de otros avances a nivel espiritual (soy uno más de los muchos que están despertando actualmente, que son cada vez más y más), como la trascendencia progresiva del ego y una mayor consciencia y responsabilidad aplicada.
Es posible que en el futuro escriba alguna entrada en inglés, e incluso haga alguna bilingüe, puesto que una gran parte de mis fuentes de influencia por escrito son en inglés, y sería para mí absurdo limitarme a usar sólo el castellano, cuando con el inglés estoy dando bastante más por un poco de esfuerzo extra.

Dicho esto, comienzo a portar entradas antiguas del blog que eliminaré en breve, indicando la fecha de publicación original de cada una.

¿Te ha gustado esta entrada? Vótala en Bitacoras.com: Votar