Tanto tenía mi cabeza puesta en la informática y el desarrollo de software ya en mi primer año de Universidad, que prácticamente me centré más en facilitar el entretenimiento de los usuarios del aula de ordenadores que en las asignaturas de la propia carrera (Ingeniería Industrial).

En aquel momento ya existía un chat creado en años anteriores por un alumno, que funcionaba bien dentro de sus limitaciones, pues no era en tiempo real y requería presionar la tecla ‘Enter’ para actualizarlo con los nuevos mensajes que iba escribiendo la gente. Digamos que era un chat pasivo. Además carecía de interfaz de usuario, no se sabía qué usuarios había conectados en cada momento y tras cada dichosa pulsación de tecla se producía un parpadeo importante y molesto debido al método de refresco de pantalla basado en limpiar y escribir todo de nuevo.

Así pues se me ocurrió mejorar notablemente esta situación creando yo mismo y desde cero un nuevo chat que diera más comodidad. Así de paso aprendía un poco sobre Unix, sistema que hasta entonces conocía de oídas. Me hice con el que para mí está entre los mejores libros de programación en Unix: “Unix programación avanzada” de Francisco Manuel Márquez García (creo que prácticamente monopolicé el préstamo de dicho libro en la biblioteca de la escuela). Con él aprendí el funcionamiento elemental de Unix y los recursos que ofrecía de cara a mi objetivo. En concreto los métodos IPC del System V: colas de mensajes, semáforos y memoria compartida. También quería hacerlo bonito dentro de las limitaciones de los terminales de texto monocromo tipo VT100 con los que contaba la sala. Pero viendo la interfaz de usuario de la aplicación de correo que usábamos, intuí que debía existir alguna biblioteca de funciones del estilo a conio.h. Así descubrí la existencia de ncurses, cuyos recursos aprendí a usar a base de consultas intensivas al manual de Unix con el comando man.

Con todos estos nuevos conocimientos adquiridos y mi experiencia hasta el momento programando con el lenguaje C++, tenía las herramientas necesarias para lograr con éxito mi objetivo.

El resultado final fue un chat funcional y vistoso, inspirado en el IRC, cuyo ejecutable coloqué en un directorio compartido dentro del servidor para que cualquiera pudiera ejecutarlo. Su funcionamiento estaba basado en la comunicación entre procesos dentro de la misma máquina (el servidor), pues los PCs de la sala eran simples terminales. Cuando el primer usuario ejecutaba la aplicación del chat, creaba un espacio de memoria compartida y una cola de mensajes. En la memoria compartida escribía una estructura con su nick y privilegio dentro del chat, el cual era de operador al ser el primero en entrar, tal y como sucede en el IRC. Desde ese momento cualquier otra ejecución del chat en terminales distintos comprobaba la existencia de los citados recursos IPC, añadía los datos del usuario a la memoria compartida y colocaba un mensaje en la cola de mensajes destinado a todos los usuarios, informando de su entrada en el chat. Para saber si había nuevos mensajes, la aplicación ejecutaba un bucle infinito en el que continuamente se consultaba la cola de mensajes.

La interfaz de usuario me quedó similar a la de IRC, haciendo uso de ventanas de texto, texto en negrita y demás elementos que permitían estructurar la pantalla en 3 zonas: la zona de conversación donde se mostraba todo lo que escribían los usuarios, la zona de escritura donde uno escribía lo que quería enviar al resto y la zona con la lista de usuarios conectados, ordenada primero por los operadores del canal y después por orden alfabético.

Ahora ya se podían ver los mensajes en tiempo real sin nada más que mirar a la pantalla, en todo momento se visualizaban los usuarios conectados y sus privilegios, e incluso se podía conversar en privado con cualquier usuario del chat.

Todo el proyecto así contado ‘a posteriori’ parece fácil y lógico, pero puedo asegurar que no lo es cuando no sabes apenas nada de Unix ni de programación concurrente y comienzas a entrar en detalles según avanzas. Por suerte no me rindo cuando me propongo algo.

Anuncios