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

13 de enero de 2012

Free coaching with Cory Skyy, in dreams

Hey guys. Receiving coaching in person with Cory Skyy is a truly priceless experience, that I highly recommend to anyone that wants to really be great with women. One of the advantages it has had for me, amongst other great ones, is that I've already had several free coaching sessions with Cory... in my dreams, hehehe.

Tonight I had one of those coaching sessions in a night dream. It was a group coaching one, and we were hanging out in a night club. An advantage for it happening in a dream is that, in dreams, subtle perceptions are super clear. Cory's energy was amazing: I could very vividly feel that he was a pristine chick magnet. He had all that really matters, and all of that openly exuding from him.

There were several lessons from him in the coaching session that I remember and still make sense in this reality:
  • We asked him about the times when we hit eye contact with a woman that we like, but it seems like there's no interest, she's for example just looking with a serious face... So, what do we do about it? His answer was simple, he just pointed out: "how it was when you found a great connection with a girl, did you had to do anything special to have it?"

    I immediately relived (another nice thing from dreams) one of those connections with a beautiful girl, where I was just checking the space around the room, and I automatically (without knowing why yet) stop my eyes on the girl, even she was looking partly away from me. A second later, she turns her head and looks directly at my eyes. And bam! We both know we're into each other, the connection is there and smiling more is inevitable :P Zero effort. That answers the question: no worries, it just happens, no need to go looking for it or doing anything special.
  • At some point in the club, someone asks Cory: "What if we go out some night but find no girl for us?". His answer was something like: "Don't go out with the purpose of meeting women, go out just to have a good time. If you have a good time that night, who cares if you meet any girl or not?". I think he told us also how it was for him if that happened to him, and from his energy, I knew he really didn't care at all, he was completely carefree about it.
  • The last interesting point to learn from, and the most bizarre one - but still can apply to this reality -, was when one of us mentioned that there was no comfortable space in the club to be with a girl, and the only interesting spot - long cushioned seating area attached to the wall - wasn't good enough for intimacy (the pictures of it I still have in my mind say otherwise, but he said that in the dream and it made sense). Cory showed him what he might do in there with her girl, actually doing it as he was saying it: lying down on his back completely, occupying what would be enough sitting space for at least four people... and he added that the girl would lay on him :D. That blew my mind, as it would certainly be out of my comfort zone, as I might be worried what other people in the club would think.
I realize now, that all of these lessons touched some of my sticking points, even ones I wasn't consciously aware of.

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

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