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

30 de noviembre de 2008

Cómo usar fuentes TrueType en PDFLaTeX

El otro día estuve investigando el modo de poder utilizar fuentes tipográficas TrueType (con extensión de fichero .ttf) para los documentos PDF que genero desde LaTeX, mediante sus herramientas PDFLaTeX o PDFeLaTeX. Por cierto, mi distribución LaTeX es TeTeX, que está siendo sustituida hoy en día por TeX Live, puesto que su autor ha dejado de mantenerla.

La información que aparece al respecto en los primeros resultados de búsqueda de los buscadores web más conocidos está en gran parte obsoleta, puesto que fue redactada más de cinco años atrás y las herramientas que utilizaban en aquella época ya no funcionan del mismo modo (por ejemplo, aceptan distintos parámetros desde la línea de comandos).

Después de un buen rato probando distintos métodos antiguos en vano, al final encontré una página web que estaba más al día con respecto a las herramientas y versiones de LaTeX que existen actualmente (en inglés): http://tclab.kaist.ac.kr/ipe/pdftex.html

Gracias al tutorial 'Using a Truetype font in Pdflatex' sito en esa misma página, conseguí por fin utilizar fuentes TrueType desde LaTeX. Sin embardo, tuve que deducir a base de prueba y error el procedimiento preciso para conseguir esto, puesto que ese tutorial no muestra el suficiente detalle para poder reproducir la proeza. Por tanto, para que no se me olvide y por si a alguien más le resulta útil, redactaré aquí de un modo sencillo y paso por paso cómo hice para conseguir usar fuentes TTF con LaTeX.

El sistema con el que he trabajado es una Gentoo Linux, con la distribución (de LaTeX) TeTeX, versión 3.0 (versión del ebuild de Gentoo: 3.0_p1-r6). Sin lugar a duda, la metodología que voy a describir servirá para otras versiones de TeTeX, posiblemente también sirva para otras distribuciones de LaTeX (si os funciona en otra, hacédmelo saber) y, por supuesto, será independiente de la distribución de Linux.
  1. Crea un carpeta de trabajo temporal, copia en ella el fichero con el tipo de letra TrueType que quieras utilizar con LaTeX. Desde ahora supondremos que este fichero se llama fuente.ttf
  2. Comprueba si tu sistema dispone de la herramienta ttf2tfm. Por ejemplo, intenta ejecutarla desde la línea de comandos, con la orden ttf2tfm. Si ya dispones de ella, descarga el fichero T1-WGL4.enc desde esta URL hasta la carpeta de trabajo temporal y salta al paso 12.
  3. Comprueba que tienes la herramienta de control de versiones CVS instalada, así como un entorno de desarrollo GCC funcional. Esto es un requisito, por lo que será necesario que instales lo que le falte a tu sistema.
  4. Desde la consola, cambia a un directorio de tu elección donde tengas permisos de escritura.
  5. Descarga el código fuente de la versión 1 de la librería FreeType desde su repositorio CVS, con el siguiente comando: cvs -z3 -d:pserver:anonymous@cvs.savannah.nongnu.org:/sources/freetype co freetype
  6. Accede al nuevo directorio freetype con: cd freetype
  7. Descarga el código fuente de las herramientas adicionales para la versión 1 de la librería FreeType desde su repositorio CVS, con el siguiente comando: cvs -z3 -d:pserver:anonymous@cvs.savannah.nongnu.org:/sources/freetype co freetype1-contrib
  8. Dale permisos de ejecución a los dos ficheros configure que utilizaremos, con la orden: chmod +x configure freetype1-contrib/ttf2pk/configure
  9. Compila la librería FreeType 1, con: ./configure y a continuación: make
  10. Compila la herramienta ttf2tfm, cambiando primero al directorio donde se encuentra: cd freetype1-contrib/ttf2pk y ejecutando: ./configure y a continuación: make. Si todo ha ido bien, el ejecutable de la herramienta ttf2tfm estará en esta carpeta.
  11. Copia a la carpeta de trabajo temporal el fichero T1-WGL4.enc, que estará en el directorio .../freetype/freetype1-contrib/ttf2pk/data
  12. Accede a la carpeta de trabajo temporal y convierte el fichero de tipo de letra TrueType al formato tfm, ejecutando la orden: ttf2tfm fuente.ttf -p T1-WGL4.enc (debes añadir la ruta al ejecutable ttf2tfm en caso necesario).
  13. Crea un fichero de texto con nombre t1fuente.fd (cambia fuente según corresponda), con el siguiente contenido:
    \DeclareFontFamily{T1}{fuente}{}
    \DeclareFontShape{T1}{fuente}{m}{n}{
    <-> lhandw
    }{}
    \DeclareFontShape{T1}{fuente}{bx}{n}{<->ssub * fuente/m/n}{}
    \DeclareFontShape{T1}{fuente}{m}{it}{<->ssub * ptm/m/it}{}
    \DeclareFontShape{T1}{fuente}{m}{sl}{<->ssub * ptm/m/sl}{}
    \DeclareFontShape{T1}{fuente}{m}{sc}{<->ssub * ptm/m/sc}{}
    \DeclareFontShape{T1}{fuente}{bx}{it}{<->ssub * ptm/b/it}{}
    \DeclareFontShape{T1}{fuente}{bx}{sl}{<->ssub * ptm/b/sl}{}
    \DeclareFontShape{T1}{fuente}{bx}{sc}{<->ssub * ptm/b/sc}{}
    \pdfmapline{+fuente\space
  14. Copia desde la carpeta de trabajo los ficheros fuente.ttf, fuente.tfm, t1fuente.fd y T1-WGL4.enc a la carpeta donde se encuentre el código fuente de tu documento LaTeX. El resto ficheros en la carpeta de trabajo temporal ya pueden eliminarse, así como también el código fuente de FreeType, a menos que quieras aplicar el proceso a más fuentes TrueType.
Con esto, ya podrás utilizar esta fuente TrueType como cualquier otra fuente incluida en tu distribución LaTeX, teniendo en cuenta que su codificación es T1. Por ejemplo, puedes usar la fuente temporalmente en una sola frase usando el siguiente código LaTeX:
{{\fontencoding{T1}\fontfamily{fuente}\selectfont Esto es una prueba tipográfica.}}

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

23 de noviembre de 2008

MUnDoCAAD MUD Engine: pasado y presente

Se ha notado muchísimo que he sido el único desarrollador del motor del MUD para nuestro 'MUnDoCAAD' (el MUnDoCAAD MUD Engine), así como que no tenía mucha idea de cómo implementar un MUD... muestra de ello ha sido el largo tiempo que me ha llevado programar algo funcional, elegante y potente.

MUnDoCAAD MUD Engine nació en enero de 2003 (edito: aunque partes de él fueron programadas en 2002), escrito en C++ y usando tanto sockets POSIX como WinSocks (que eran un churro, puesto que se comían toda la CPU con madalenas al esperar en las llamadas select), según la plataforma de compilación usada (UNIX o Windows, respectivamente). Más tarde descubrí que la librería Qt proporcionaba manejo de sockets y otras abstracciones del sistema operativo que harían el código compatible no sólo en sistemas UNIX y Windows sino también para Mac OS, así que reescribí parte del código para hacerlo más portable utilizando la Qt.

La pega de la Qt - versión 3 en aquél entonces - era que requería enlazar con las librerías de interfaz gráfica, y ejecutarse desde X Window en sistemas UNIX, a pesar de que el motor del MUD no era más que una aplicación de consola.

Luego salió la versión 4 de la librería Qt, que permitía por fin independizarse de las librerías de interfaz gráfica. Mejoró mucho el código del motor del MUD por aquél entonces, pero sobre todo mejoró mi comprensión de qué debería tener el motor funcionalmente para manejar un MUD. Gracias a la Qt, ya me despreocupaba en gran medida del aspecto de comunicaciones en red, y mis ideas de diseño giraban en torno al almacenamiento de la base de datos del MUD y su cacheo en memoria (para evitar tener en memoria toda la base de datos se utilice o no, y no tener que estar guardando a disco constantemente las modificaciones realizadas).

Desde los inicios, pensé usar XML para almacenar las entidades (objetos, localidades, personajes y demás) del MUD en la base de datos. Creo recordar que llegué a implementar completamente la carga y almacenamiento de entidades con la librería libxml2, aunque revisando el historial del repositorio CVS de nuestro proyecto en SourceForge no encuentro dicha evidencia. En cuanto empecé a usar la librería Qt para el motor, me aproveché de las clases para el manejo de documentos XML que trae esta, de manera bastante similar a como se hacía con la libxml2.

Sin embargo, era relativamente lento cargar y escribir documentos XML para el poco contenido que tenía cada uno (los datos propios de cada entidad del MUD, pues pensé en almacenar cada una en un fichero aparte). No obstante, al tener el sistema de caché ya implementado (de nombre Archivero, en memoria de El Viejo Archivero), este amortiguaba un poco este impacto de coste temporal.

Llegué al punto en que tuve que plantearme cómo implementar la librería base, también llamada el modelo de mundo. No podía implementarla como el resto del motor, usando C++, puesto que cualquier cambio implicaría tener que recompilar y reiniciar el motor del MUD para que surtiera efecto. Debía utilizar algún lenguaje interpretado, que fuera ejecutado desde el motor del MUD. Pero yo no sabía ni quería embarcarme en la costosa tarea de inventar un lenguaje para el MUD.

Más tarde, descubría la librería QSA: Qt Scripting for Applications. Esta me proporcionaba un lenguaje interpretado y un intérprete para ejecutar su código desde aplicaciones que usaran la librería Qt. "Genial" - pensé, y me puse a implementar la librería base del MUD con este lenguaje, muy similar a C++ (el lenguaje era un subconjunto de ECMAScript, íntimamente relacionado con JavaScript).

Pronto descubrí limitaciones en esta forma de implementación del motor del MUD. Al parecer, QSA por aquella época tenía ciertos fallos al convertir variables y objetos del lenguaje QSA a variables Qt, y tuve que hacer apaños para solventar dichos problemas. Para colmo, QSA hacía que tuviera que volver a enlazar con librerías de interfaz gráfica, aunque esta vez no me obligaba a ejecutar el motor del MUD desde X Window en mi entorno de desarrollo Linux.

Por todo esto, y por la infactibilidad de la ejecución de código almacenado en las entidades de la base de datos (código relacionado con la reacción de las entidades ante acciones de los personajes o del modelo de mundo) de manera elegante y potente, abandoné por completo el desarrollo del MUD.

Por suerte, durante los dos siguientes años a este abandono, he descubierto el lenguaje Python y lo fácil y rápido que es programar en él. Era cuestión de tiempo que me planteara intentar reescribir MUnDoCAAD MUD Engine por completo en Python, así como usar Python mismo como el lenguaje interpretado embebido en las entidades del MUD.

Y así fue, hace unos pocos meses atrás ya estaba implementando una caché LRU para almacenar las entidades. Después vino la implementación del módulo Archivero (reutilicé el nombre de su predecesor en C++/Qt), utilizando mi flamante caché LRU en Python. Esta vez descarté usar XML como formato de los ficheros de entidad, a pesar de tener buen soporte en Python, porque no quería que fuera costosa la lectura y escritura de cada entidad de la base de datos, y utilicé en su lugar las ventajas del módulo cPickle de Python.

Los resultados eran más que satisfactorios: código sencillo, funcional y rápido de desarrollar. El mismo código que empezaba a escribir como prueba (en plan chapucilla) de la funcionalidad que quería, terminaba convirtiéndose en poco tiempo en código correcto y completo funcionalmente.

Hace unas pocas semanas, empecé a escribir lo que sería el nuevo módulo Servidor del mud, usando la implementación de sockets que trae Python. Tan sencillo empezó siendo este módulo, que sólo permitía una conexión simultánea al MUD, y durante bastante tiempo siguió así, como un motor para aventuras conversacionales tradicionales (de un sólo jugador) que requería conectarse por Telnet para jugar.

Se me ocurrió implementar la aventura conversacional del tutorial 'La Torre - Contruye tu propia aventura' creado por Uto para NMP y adaptado a InformATE! por Zak, porque quería comprobar si el nuevo motor en Python era capaz de dar vida a algo jugable. Inicié una base de datos de MUD con las entidades de la aventura de este tutorial, así como un parser (analizador sintáctico) muy sencillo de tipo VERBO + NOMBRE, y una librería modelo de mundo con vistas a que el juego eventualmente pudiera ser utilizado por varios jugadores a la vez.

Estaba tan contento de ver que todo funcionaba bien y que el motor Python era perfectamente capaz, que quería enseñárselo a mis colegas del CAAD, y les hablé de él en el canal de IRC y de su posible futura evolución. Esto ocurría ya hace menos de una semana. Para poder enseñar mi creación tenía que hacer que pudiera conectarse más de un jugador a la vez, así que implementé un módulo Servidor que atendiera las conexiones de red del MUD, para lo cual utilicé el módulo asyncore de Python en lugar de trabajar con los sockets directamente.

Aumenté la librería base y el parser para que los jugadores pudieran ver cómo los personajes cambiaban de localidad y añadí el comando decir, para que pudieran hablar entre ellos. Hice una invitación en el IRC, y se apuntaron unos cuantos a probar el nuevo MUD. Inmediatamente relució un fallo en el código de la librería base, ya que nombraba a los personajes así: "Aquí está un Juan, un Pepe y un Jacinto", en lugar de decir: "Aquí está Juan, Pepe y Jacinto". Corregí este fallo en un periquete, y descubrí que conforme estaba implementado el motor, para que la corrección surtiera efecto sólo podía reiniciar el MUD.

Estando el MUD con jugadores conectados, no es una opción factible echarlos a todos cada vez que se haga una corrección a la librería del modelo de mundo o a alguna otra parte del motor. Así que investigué un poco e implementé un módulo (Restaurador) que recarga a petición del administrador los módulos del motor del MUD que se deseen, incluido él mismo. Desde entonces el MUD puede mejorarse dinámicamente, sin necesidad de reinicios.

Algunos jugadores tenían problemas para leer y escribir tildes y eñes en el MUD, debido a que ellos usan la codificación de caracteres UTF-8 y el motor trabaja con ISO-8859-15. Así que también añadí a MUnDoCAAD MUD Engine la capacidad de realizar conversión de código de caracteres para aquellos jugadores que así lo deseen.

Básicamente, el motor del MUD en Python cuenta con toda la funcionalidad de su predecesor en C++/Qt, además de tener nuevas características que difícilmente habría podido implementar en aquél (ahora obsoleto) motor. Podría decir que este es el mejor MUD que he creado nunca :)

Por cierto, el código fuente del nuevo motor Python es GPL versión 2 (igual que el antiguo), y ya está disponible en el repositorio Subversion del proyecto en SourceForge: https://sourceforge.net/projects/mundocaad

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

31 de octubre de 2008

MiPDF 1.0 RC 2 liberado

Anoche mismo liberé una nueva versión de mi visor de documentos PDF para la consola portátil abierta GP2X, MiPDF versión 1.0 RC 2. La podéis encontrar en el siguiente enlace del magnífico repositorio de aplicaciones GP2X Archive: http://archive.gp2x.de/cgi-bin/cfiles.cgi?0,0,0,0,4,2593

Toda la documentación del programa sigue todavía en inglés (así como la descripción que hago de ella en el GP2X Archive), cosa que cambiaré seguramente con la próxima versión que libere, añadiendo un leeme.txt en castellano en el archivo ZIP.

Los cambios significativos en esta versión de MiPDF son los siguientes:
  • Reducido el consumo de las pilas cuando la aplicación está ociosa (cuando no está haciendo nada), porque ya no hace una espera activa de eventos.
  • Cambio de zoom ligeramente más rápido, ya que he quitado una carga de página redundante, que sólo era necesaria cuando se está cambiando de página.
  • El cambio de zoom ahora recuerda la posición de la página que estaba mostrando, por lo que ya no volverá a la esquina superior izquierda de la página con cada cambio de zoom.
Quedo a la espera de alguna donación en mi cuenta PayPal que me motive a seguir mejorando este visor de PDF, el más rápido que existe hasta el momento para la GP2X. Me desilusiona que la gente lo utilice y lo aprecie pero nadie haya donado ni un mísero céntimo :'(

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

15 de octubre de 2008

Google Chrome (experimental) para Linux y Mac OS X

Mientras Google informa que Google Chrome para sistemas GNU/Linux y Mac OS X se está retrasando porque quieren adaptarlo convenientemente a las características únicas de estos sistemas operativos, los usuarios se están impacientando e intentan hacer funcionar de todos modos este navegador en su sistema operativo favorito. Actualmente, se ha conseguido resultados positivos al respecto de tres maneras distintas:

Compilando el estado actual del código fuente de Chromium (proyecto de código fuente abierto que hay detrás de Chrome) en su repositorio Subversion. Google ofrece instrucciones detalladas (en inglés) para realizar esta operación tanto en sistemas Linux como en Mac OS X. El principal defecto de esta aproximación es que el código de Google Chromium es más inmaduro para sistemas Linux y Mac de lo que es para Windows.

Ejecutando la versión de Google Chrome para Windows con la ayuda de Wine (implementación libre de la API de Windows). El proyecto Wine ha incluido correcciones y mejoras últimamente para soportar mejor este navegador, como muestra explícitamente el registro de cambios de su versión 1.1.4. No obstante, el funcionamiento de Chrome bajo Wine deja bastante que desear.

La tercera opción consiste en utilizar una versión de Google Chrome que una lo mejor de las dos aproximaciones anteriores: CrossOver Chromium. CrossOver Chromium, desarrollado por CodeWeavers, es una versión del navegador de Google que utiliza el código fuente de Google Chromium para Windows (la plataforma soportada de forma más madura por Chrome a día de hoy), pero compilado con la API de Wine, con lo que queda una aplicación nativa de Linux o Mac OS X muy similar a la versión de Windows.

Esta última aproximación es la que considero la mejor para los impacientes, aunque reconozco que visualmente tiene ciertos defectos, como podréis comprobar en la captura que incluyo al final de la presente entrada. Si habéis probado Chrome en Windows, funcionalmente también notaréis alguna que otra deficiencia menor.

Yo, en cambio, tengo mucha paciencia; así que seguiré con mis navegadores habituales en Linux (Seamonkey y Konqueror) y esperaré a una versión oficial de Google Chrome para GNU/Linux. Mientras tanto, cuando ocasionalmente utilice Windows, utilizaré tanto Chrome como Firefox, con lo cual seguramente se cure mi alergia al Internet Explorer ;)


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

5 de octubre de 2008

Reparando MLDonkey 2.9.5

Al final he conseguido volver a hacer funcionar mi MLDonkey. Fallaba con una violación de segmento a los pocos segundos de arrancarlo, desde que lo actualicé a la versión 2.9.5. Llevaba ya unos cuantos meses sin poder usarlo por estos motivos, limitando mi uso del Peer to Peer (P2P) a la red Torrent, gracias a mi siempre fiel (y funcional) cliente KTorrent.

El sistema operativo que utilizo es una Gentoo Linux de 64 bits (tengo un procesador AMD64). Lo digo por si alguien tiene el mismo problema, que pruebe a hacer lo que cuento aquí para evitarlo (si te funciona, me alegrará que me lo hagas saber ;).

Ayer se me ocurrió probar a cambiarle el nombre al directorio de configuración de MLDonkey (originalmente .mldonkey en mi directiorio personal), y probar a arrancar de nuevo el ejecutable mlnet (el que arranca MLDonkey desde la consola), para que se iniciara con la configuración por defecto. Cuál fue mi sorpresa al comprobar que ya no daba ninguna violación de segmento, ni aun esperando varios minutos.

A continuación, fuí cambiando una por una las opciones de configuración (desde la interfaz web de MLDonkey), restaurando manualmente los valores que tenía antiguamente. Todo fue perfecto, hasta que llegué a modificar la opción max_upload_slots, que indica el número máximo de subidas simultáneas que quieres permitir. Anteriormente, tenía puesto el valor 3, y el valor por defecto es 5, así que lo cambié por 3 y pulsé Enter (así es como adopta MLDonkey los valores de configuración que cambias desde la interfaz web).

Pero esta vez no apareció ningún mensaje de confirmación en mi navegador web. De hecho, la interfaz web dejó de funcionar completamente. Eché un vistazo a la consola desde la que había lanzado mlnet, y me encontré de nuevo el mensaje de la violación de segmento (segmentation fault en inglés). Mmm... curioso - pensé.

Volví a repetir la operación de intentar cambiar el valor de max_upload_slots a 3, y de nuevo ocurrió la violación de segmento (pobre segmento, jejeje). Y en seguida se me ocurrió probar qué ocurría si cambiaba dicho parámetro de configuración a su valor por defecto (cinco) en la configuración original de MLDonkey que durante meses no me había servido para nada. Borre el recién creado .mldonkey, cambié el nombre del viejo a .mldonkey otra vez, y modifiqué a mano en el fichero downloads.ini dicho parámetro max_upload_slots al valor 5.

Ejecuté de nuevo mlnet. Y... voilà: ¡MLDonkey completamente funcional de nuevo!

En resumen, que MLDonkey (en mi sistema y desde la versión 2.9.5) petaba por no admitir un valor 3 en su parámetro de configuración max_upload_slots. Ya he informado al equipo de desarrollo con un informe de error (donde comento todo esto en inglés), en su bugtracker (sistema de recopilación y manejo de informes de error).

Espero que lo corrijan para su próxima versión 2.9.7.

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

Presentando mi blog

Hola a todos. Este es el comienzo de 'El blog de Morgul', un blog donde iré publicando cosas que me interesan a mí, y que seguramente interesen a muchas personas más ;) Probablemente, este blog sustituirá a mi caduca web 'La página web de Morgul', con más diversidad y contenido que nunca ha tenido esta.

Con esta breve introducción, un servidor se despide hasta la próxima entrada.

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

15 de septiembre de 2008

Adiós buen chico

Me encanta tener momentos de inspiración como este. Acabo de estar otra vez en la cama, tumbado boca arriba, los ojos abiertos, sin sueño... pero con una gran sonrisa dibujada en mi cara.

Me he regalado una visualización, la cual relataré a continuación. Podéis seguirla con vuestra imaginación, disfrutando como yo lo he hecho, y como vuelvo a hacer ahora, añadiendo todavía más detalles.

Estoy estudiando en la biblioteca, sentado en una buena posición: tengo a la vista a (y estoy a la vista de) una chica que me gustaba hace tiempo... cuando era tan buen chico y no sabía sino estropear las situaciones habidas y por haber, con mis enamoramientos inoportunos y mi afición de informar de dichos sentimientos precipitados.

Estoy disfrutando de mi estudio, me encanta aprender, no puedo evitar tener una medio sonrisa en mi cara. Levanto un rato la vista, observo a mi alrededor. Fantástico cruce de miradas entre los dos. Ella aparta la mirada primero. Yo sonrío para mí mismo.

En un pestañeo, una idea pasa por mi cabeza. No dudo de ella ni pienso nada más. La pongo en práctica al instante...

Me levanto, me dirijo hacia ella, ella me ve, sabe que me acerco, con paso firme, momento de tensión. Pero no me paro, paso junto a ella.

Sé lo que hago. Voy a los servicios, pero no para hacer un uso convencional de ellos. Me miro ante el espejo, a los ojos, luego sólo a mi ojo derecho. Me gusta lo que veo, no puedo sino sonreír a mi propia imagen. No existe nadie más en esos servicios, sólo yo y mi imagen del espejo. Me digo en voz alta: pero qué bueno que estoy.

Salgo de los servicios, me paso por la fuente y bebo un trago. Subo de nuevo a la zona de la biblioteca donde estaba estudiando. Paso por detrás de la chica que me gusta. Me paro a un escaso medio metro de ella, a su lado, sigo encarando al sitio donde voy: mi sitio de estudio.

Ella sabe que estoy ahí, ha dejado de estudiar, no sabe si mirarme o no. Giro la cabeza, no puedo evitar sonreír. La chica levanta la mirada, nuestros ojos se cruzan. El tiempo se para, nadie más existe, sólo ella y yo. Ambos nos maravillamos de la otra persona.

Le digo: "me gustaría decirte una cosa". Ella pone cara de curiosidad, abre los labios, está a punto de preguntar. No le doy tiempo. Vuelvo la mirada y continúo caminando hacia mi sitio.

Me siento, vuelvo a mis estudios. Otra idea pasa por mi cabeza. De nuevo, actúo. Cojo un trozo de papel, me dispongo a escribir algo en él. Arranco ese trozo de papel y lo pliego sobre sí mismo.

Camino de nuevo hacia ella. Sin pararme, le dejo el papel sobre sus apuntes. No espero su reacción. Me dirijo hacia las escaleras. Sonrío más que nunca, casi evitando reírme... no había escrito nada en el papel.

Esta vez me voy fuera, a tomar un poco el aire y descansar. Me tomo mi tiempo.

Al rato vuelvo a la biblioteca. Me aseguro de que ella sigue en su sitio, pero voy directo al mío. Me siento, y empiezo a recoger mis cosas. Sé que me está mirando. Termino de recogerlo todo. Levanto la mirada, y le pillo mirándome. Sonrío más. Voy hacia ella.

Le digo: "me voy". Ella me dice: "¿qué querías decirme?". Le digo, lo sabrás a su debido momento. Entonces, hago lo que acababa de decirle, me voy.

¿Continuará?

Sí, esto tiene muy buena pinta. Sé exactamente qué quería decirle, pero no os lo diré todavía ;)

Adiós buen chico. Siempre te recordaré. Me caías bien, igual que a casi todo el mundo. Te doy las gracias por el drama que has ido añadiendo a mi vida... sí, gracias de corazón. Me has ayudado a madurar. Unas lagrimillas se forman inevitablemente en mis ojos al releer esto.

Hola tío bueno. Me gustas. Me gusto. Me quiero.

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

13 de septiembre de 2008

Aquí estoy

Hace unas dos horas que estoy despierto, mucho antes de la hora a la que había puesto el despertador. Tras un sueño cargado emocionalmente, que ha terminado en mini-pesadilla, me he quedado en la cama con los ojos abiertos, sin poder ni querer dormir. Tenía uno de mis momentos de lucidez creativa, donde todos mis problemas se ven desde una perspectiva maravillosamente simple.

Ahí ha aparecido en mi cabeza la idea, una pequeña e imprecisa visión de mí mismo expresando mis pensamientos en un blog, abriendo las ventanas de mi mundo a todo aquél que quiera mirar qué hay dentro. Me gusta la idea, y agradezco la ocurrencia. Ahora aquí estoy convirtiéndola en realidad.

¿Quién soy? Esa es una pregunta muy grande. Podría escribir miles de páginas sobre mí mismo: mi personalidad, mi mentalidad, mis defectos, mis virtudes, mis experiencias, mis objetivos, mis deseos; con total honestidad y desinhibición... y aun aquella persona que las leyera por completo, no sería capaz de saber más que una pequeña parte de quién soy en realidad. Entre otras causas, esto es porque no hay palabras para describir ciertas cosas, no hay siquiera imágenes para mostrarlas... sólo se conocen al sentirlas, al vivirlas.

Llevo ya unos cuantos años realizando grandes cambios en mi persona. Soy de los que sonríen en disentimiento cuando alguien dice que las personas (o los hombres, desde ciertos puntos de vista femeninos) no cambian o que no pueden cambiar. Claro que sí que se puede, negarlo sería negar mi propia existencia. Desde luego, ninguno de mis cambios ha surgido de la noche a la mañana, sino que ha requerido mucho esfuerzo por mi parte.

Ahora bien, mi camino de ningún modo ha concluido aquí. El camino de la autosuperación es un camino infinito, pero que siempre merece la pena tomar. Por supuesto, durante mi trayecto he tomado senderos equivocados (no me arrepiento ni avergüenzo de ello, acepto mi pasado, además he aprendido mucho de él). Pero mi propósito final, mi meta última, ha sido siempre firme: quiero cambiar, quiero mejorar, quiero ser el mejor hombre que he sido nunca, quiero ser el mejor hombre que puedo ser. Esto me ha permitido descubrir que iba por caminos que se alejaban de mi destino y trazar nuevas rutas mejor encaminadas.

A vosotros este blog os puede resultar entretenido. Para mí, este blog será mucho más que simple diversión. Sé que me va a resultar muy útil: me ayudará a darme cuenta de los progresos que voy realizando en mi vida, los cambios que aplico sobre mi mentalidad y los resultados que voy obteniendo a partir de estos.

A mi ego le encanta recibir montones de atención, por lo que el blog le vendrá de perlas. En el fondo, soy un hombre modesto, por esto reconozco que es un poco egoísta por mi parte mostrar mis virtudes por aquí... Pero está bien ser egoísta a veces, como en este caso. Además, también pienso comentar mis defectos, eso me forzará a mejorar en algunos aspectos y a aceptarme tal y como soy.

Sé que os he dejado a medias ;-D, pero tiempo habrá para que me conozcáis mejor.

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