sábado, 14 de julio de 2018

Finch vs Akka Http: Hola mundo en Scala


Hace varios días, buscando artículos sobre Scala en Medium, encontré un artículo sobre cómo crear una aplicación de lista de tareas utilizando Finch, que me llamó la atención. Este tenía un enlace a un artículo titutlado ¿Qué tan rápido es Finch?. En este artículo se mostraba el siguiente tweet con una gráfica comparativa de la velocidad de distintas librerías HTTP de Scala:



Siendo fanático de Scala, y estando acostumbrado a las herramientas más divulgadas para servicios web tales como Play Framework, Spray y Akka HTTP, me llamó bastante la atención que Finch mostrara por mucho un mejor desempeño que estas herramientas, a pesar de que la publicación tiene más de 2 años (publicada en febrero de 2016, vista por mí a principios de 2018). Así que me dio curiosidad de ver qué era Finch, hacer una pequeña prueba, y comparar el código con una aplicación similar con Akka HTTP.

¡Hola Finch!

Finch es una API de Scala para construir servicios HTTP sobre Finagle, la cual es un "sistema RPC extensible para la JVM, utilizado para la construcción de servidores de alta concurrencia", utilizando APIs uniformes de cliente y servidor agnósticas del protocolo (creo q podría describir a Finagle como el WCF para la JVM). En este sentido, Finch provee una delgada capa de bloques para construir APIs HTTP de forma tipada, utilizando conceptos de programación funcional. Esto convierte a Finch en una excelente herramienta para la creación de microservicios, ya que es más fácil integrarlos utilizando tipos compartidos. Cabe mencionar además que Finagle corre sobre Netty, por lo que no requiere de un servidor web separado.

Debido a que Scala es para mí más un pasatiempo, ya que no lo uso en mi trabajo, me costó un poco entender cómo se definía una API en Finch. Después de batallar un par de horas, pude crear el siguiente Hola Mundo, en un solo archivo:



Nótese que la API se compone de un solo endpoint, el cual es pasado como parámetro al servidor HTTP, para ser servido (valga la redundancia). Luego el programa queda en espera mientras el servicio se mantiene en ejecución. Las rutas se definen para cada endpoint, y los separadores utilizados en código son un par de dos puntos (::). Por otra parte, para la serialización de los datos desde y hacia JSON se usa Circe (antes llamada "JSON para gatos", vaya usted a saber por qué, jejeje).

El código completo pueden encontarlo acá: https://github.com/guillegr123/its-hellofinch

El proyecto se ejecuta utilizando SBT, con el siguiente comando:
sbt run
Luego, para probar el servicio, abrimos en el navegador la ruta: http://localhost:8080/api/v1/hello

Lo que más me gustó de Finch es que es que la creación de servicios web requiere poco código, y permite crear una API tipada desde el principio, pudiéndose definir los modelos de datos utilizados en el request y el response. Además, los endpoints son asíncronos, lo que permite una mayor concurrencia, razón de su excelente desempeño.

Pero... luego de algunas pruebas, y de investigar un poco, descubrí que Finch no hace uso de las clases estándares de Scala para programación asíncrona, sino que usa las implementaciones propias del ambiente de Twitter, por lo que obligatoriamente tendremos que hacer uso de sus librerías. Esto además, aunque no imposibilita, hace un poco más engorroso integrar librerías que hacen uso de las clases estándar de Scala. En este sentido, me parece mejor utilizar Finch para aplicaciones pequeñas, o aplicaciones de microservicios en las que hagamos uso extensivo de Finagle y las librerías de Twitter.

¡Hola Akka HTTP!

Descubiertos estos detalles de Finch, y habiendo saciado mi curiosidad de probar el framework, decidí volver a mis raíces con Akka HTTP. Akka HTTP es el reemplazo de Spray, y es considerada más como una librería en lugar de un framework, ya que su principal objetivo es solo proveer herramientas para cubrir las necesidades de integración de una o varias aplicaciones vía HTTP, en lugar de lineamientos sobre los cuáles construir la aplicación. Como tal no provee manejo de componentes como CSS/Javascript, plantillas para creación de vistas y otras herramientas orientadas a aplicaciones para navegadores web.

La construcción del hola mundo utilizando Akka HTTP me costó menos que Finch, debido a que ya había hecho una prueba hace mucho tiempo (y el código fuente estaba en control de versiones). El servicio se creó en un solo archivo, al igual que el ejemplo anterior:



El código completo puede encontrarse acá: https://github.com/guillegr123/its-helloakkahttp

Al igual que con el proyecto de Finch, para ejecutar el servicio, basta ejecutar el comando:

sbt run

Y para probar el servicio, abrimos en el navegador la ruta: http://localhost:8080/api/v1/hello
 
A simple vista, el código es más grande. Esto se debe a que Akka HTTP usa los actores de Akka para el manejo de concurrencia, por lo que es necesario crear un sistema de actores, un materializador de actores, y obtener el contexto de ejecución. Además, para la serialización de los mensajes a JSON, es necesario definir un trait para el formateo del mensaje.

Aparte de eso, en esencia la definición de los endpoints es similar. Las rutas se establecen para cada enpoint, pero usando la barra diagonal (o pleca) como separador, lo que resulta un poco más natural que los dos puntos de Finch, pero que sirven al mismo propósito. Los enpoints son asíncronos, pero a diferencia de Finch, usa la implementación de Futures estándar de Scala.

De forma similar a Finch, la instancia de rutas de la API es pasada como parámetro a su propio servidor web, el cual es iniciado. Sin embargo, en este caso no utiliza una librería externa como Netty, sino que se ejecuta sobre los actores y los flujos de Akka, y activa un puerto para hacer uso directo del protocolo HTTP.

Por otra parte, a diferencia de Finch, al finalizar el servicio web, es necesario desconectar el servidor web explícitamente del puerto, y finalizar el sistema de actores.

Conclusiones

Luego de estas pequeñas pruebas, considero que ambas librerías son excelentes, pero poseen enfoques diferentes, así como implementaciones, por lo que pueden usarse de distintas formas. Akka HTTP parece ser la mejor opción cuando tenemos una aplicación creada utilizando las librerías estándar de Scala, o bien actores de Akka, y solo necesitamos integrar sus componentes u otras aplicaciones vía HTTP. Y Finch parece ser una buena elección cuando necesitamos crear interfaces web tipadas, o sistemas de microservicios que deseamos integrar de forma fácil, ya que también facilita la creación de clientes.

En cuanto al desempeño, según el workbench mostrado por Vladimir Kostyukov, Finch es mucho más rápido que Akka HTTP. Sin embargo, la comparativa fue realizada hace dos años, cuando Akka HTTP aún estaba en pañales, por lo que quedamos a la espera de una comparación más reciente. En lo personal espero más Akka HTTP por ser considerado el reemplazo de Spray.

sábado, 7 de julio de 2018

Cambiar la URL de repositorio GIT remoto

Hola, este es un pequeño snippet para cambiar la URL de un repositorio remoto de GIT, en un repositorio local.

Primero, para listar las URL actuales del repositorio remoto, ejecutamos el siguiente comando, dentro de la carpeta que contiene nuestro repositorio local:

$ git remote -v

Esto mostrará un resultado similar al siguiente:

origin    https://github.com/mi-usuario/mi-repositorio.git (fetch)
origin    https://github.com/mi-usuario/mi-repositorio.git (push)

Puede notarse que el único repositorio remoto referenciado es origin, que suele ser el nombre por defecto asignado al repositorio remoto al clonarlo.

Para asignar una nueva url a dicho remoto, basta ejecutar el siguiente comando:

$ git remote set-url origin https://github.com/mi-usuario/mi-repositorio-nueva-url.git

Para verificar el cambio, podemos listar nuevamente los repositorios remotos, obteniendo el siguiente resultado:

$ git remote -v
origin    https://github.com/mi-usuario/mi-repositorio-nueva-url.git (fetch)
origin    https://github.com/mi-usuario/mi-repositorio-nueva-url.git (push)

Saludos.

Plantilla de Onsen UI para Vue CLI

Hola, en esta ocasión quería compartirles una plantilla de Vue CLI para crear un proyecto de aplicación web progresiva (PWA) con Onsen UI y Vue JS 2. Onsen UI es una librería de componentes para aplicaciones móviles híbridas, es decir, aplicaciones creadas con HTML y Javascript. Dicha librería está adaptada a 4 frameworks para la creación de aplicaciones web dinámicas: Angular JS (1), Angular 2+, React JS y Vue JS 2.

Vue JS 2 ofrece la herramienta de línea de comandos Vue CLI que permite crear la estructura básica de aplicaciones de una sola página (Single Page Applications, o SPA) de forma amigable. Para más detalles sobre la instalación y uso de esta herramienta recomiendo ver los siguientes enlaces:
La plantilla que he creado es un fork de la plantilla de Onsen UI para PWA con Webpack, la cual a su vez se basa en la plantilla para PWA de Vue JS. La plantilla de Onsen UI incluye:
  • Aplicación básica de ejemplo utilizando Onsen UI.
  • Webpack, para empaquetar los componentes del sitio web.
  • Recarga en caliente, para actualizar los cambios realizados en el código de forma inmediata en el navegador.
  • Verificador de sintaxis (lint).
  • Pruebas unitarias y de integración.
  • Extracción de CSS.
  • Manejo de estados utilizando Vuex.
Adicional a esto, he agregado las siguientes características en mi versión de la plantilla:
  • Soporte para TypeScript.
  • Uso de Vue Router para el manejo de rutas en aplicaciones de una sola página.
  • Integración de Vue Router y el componente Ons Navigator, mediante Vuex, para el cambio de páginas, basado en este ejemplo.
  • Axios como cliente HTTP para el consumo de servicios web.
  • La aplicación de ejemplo ha sido extendida para mostrar el manejo de rutas y la descarga de datos desde servicio web.
El código fuente de la plantilla está disponible acá: https://github.com/guillegr123/ons-vue-pwa-webpack-full

Para crear una aplicación utilizando la plantilla, basta ejecutar el siguiente comando, y contestar algunas preguntas:

$ vue init guillegr123/ons-vue-pwa-webpack-full mi-app

Luego, para instalar las dependencias:

$ cd mi-app
$ npm install

Y finalmente, para ejecutar en modo de desarrollo:

$ npm run dev

Con ello se muestra la siguiente aplicación de ejemplo:
Algunos puntos de interés:
  • En el menú lateral existe una sección llamada "internal links", que hace referencia a las páginas dentro de la app. El resto son enlaces externos. 
  • En la página de "Movies" se descarga un listado de películas desde un servicio web utilizando Axios.
Cualquier comentario/sugerencia con respecto a la plantilla, así como cualquier contribución, es bienvenida.
Saludos.

    lunes, 18 de junio de 2018

    Leer N caracteres en C/C++ con scanf + vaciar buffer

    Hola, en esta ocasión quería compartirles un pequeño snippet de código de C/C++ que encontré un día de estos: Como leer una cadena de N caracteres con scanf.

    Supongamos que queremos leer como máximo los primeros 8 caracteres que ingrese el usuario en la entrada estándar (stdin), y guardaremos el resultado en un arreglo de caracteres. Para ello, primero declaramos el arreglo con una longitud de 9 posiciones, que corresponderán a los 8 caracteres que deseamos leer, más una posición más para el caracter nulo, que marcará el fin de la cadena.

    char cadena[9];
    

    Luego procedemos a leer con scanf los 8 caracteres desde la entrada estandar:

    scanf("%8s",cadena); 
    

    Lo importante a notar es el especificador de formato s, que indica que lo que se leerá es una cadena de caracteres (string). La entrada se termina con un espacio en blanco, pero el número 8 indica que solamente se tomarán los primeros 8 caracteres que se encuentran en el buffer de la entrada estándar. Además, un caracter nulo es guardado al final de la cadena de caracteres. Es por ello que el arreglo utilizado debe ser por lo menos un caracter más grande que la longitud de entrada especificada. De no ser así podría darse el caso que se sobrescriban porciones de memorias adyacentes, generando resultados inesperados.

    Finalmente, para limpiar el buffer de la entrada estándar: leer mientras se encuentre el caracter de salto de línea (\n) o el caracter de finalización.

    char c;
    while ((c = getchar()) != '\n' && c != EOF) { }
    

    El código completo es el siguiente:



    Saludos.

    miércoles, 6 de junio de 2018

    Requisitos para trabajadores independientes y de servicio doméstico para cotizar en el ISSS

    Actualmente es posible para trabajadores independientes, así como empleados del servicio doméstico, cotizar en el Instituto Salvadoreño del Seguro Social, para poder acceder a los servicios de salud que brinda.

    Afiliación del trabajador de servicio doméstico

    Los trabajadores del servicio doméstico pueden afiliarse al ISSS desde el 1 de julio de 2010. Las consideraciones son los siguientes:

    Tipo de trabajo

    • Las personas beneficiadas serán aquellas que laboran en los hogares salvadoreños desempeñándose en cargos como cocinera, personal de limpieza, niñera, ama de llaves, mayordomo, jardinero y similares.
    • Estos empleados no deben generar ganancia económica a su empleador, así como lo establece el Artículo 77 del Código de Trabajo de El Salvador.

    Salario

    • El salario mínimo para poder cotizar en el ISSS es de $300 para 30 días, y $310 para 31 días.

    Porcentajes de contribución

    • 3.0% del salario, por parte del trabajador.
    • 7.5% del salario, por parte del patrono.

    Documentación a presentar

    • Por parte del trabajador:
      • Formulario “Aviso de Inscripción de Trabajador” debidamente completado y firmado por empleador y trabajador (puede encontrarse acá).
      • Fotografía reciente de frente tamaño cédula*.
      • Documento Único de Identidad (para el menor de edad Carné de Minoridad extendido por la Alcaldía de su municipio y para extranjero Documento de Identidad del país de origen, Carné de Residente o Pasaporte).
      • Número de Identificación Tributaria (NIT).
    • Por parte del patrono:
      • Formulario “Aviso de Inscripción de Empleador” debidamente completo y firmado por empleador y trabajador.
      • Documento Único de Identidad (para extranjero Documento de Identidad del país de origen, Carné de Residente o Pasaporte).
      • Número de Identificación Tributaria (NIT).
    • Para afiliar a beneficiario:
      • Tarjeta de afiliación del trabajador.
      • Documento Único de Identidad (para extranjero Documento de Identidad del país de origen, Carné de Residente o Pasaporte).
      • Partida de Nacimiento del menor.
      • Fotografía (si es mayor de 2 años)*.
    * No estoy seguro si las fotografías aún son requeridas, pues esta información se extrajo de un artículo del año 2010.

      Edad

      • De14 a 60 años para el trabajador.

      Afiliación del trabajador independiente

      Los trabajadores independientes pueden afiliarse al seguro social desde el 2 de mayo del 2018. Es posible hacerlo en dos modalidades: INDIVIDUAL (sin beneficiarios) y FAMILIAR (con beneficiarios). Es necesario tomar en cuenta las siguientes consideraciones:

      Tipo de trabajo

      • Profesiones libres o realice de forma habitual, personal y directa, una actividad económica, física o intelectual, sin sujeción por ella a contrato de trabajo, ni con trabajadores a su cargo.
      • Que no se encuentre sujeto al régimen general u a ningún de los otros regímenes especiales (no estoy muy seguro a qué se refiere esto, las disculpas del caso). 

      Montos de contribución

      • Cobertura INDIVIDUAL: $40
      • Cobertura FAMILIAR: $56

      Documentación a presentar

      • Documento Único de Identidad.
      • Número de Identificación Tributaria (NIT).
      • Formulario de inscripción según la modalidad: INDIVIDUAL o FAMILIAR (pueden encontrarse al final de esta página).
      • Declaración jurada de Actividad Económica que realiza (NOTARIADA).
      • Declaración jurada no notariada, en caso de inscribir a compañera o compañero de vida.

      Edad

      • De 18 a 60 años de edad.

        ¿Dónde solicitar el servicio?

        Las oficinas de Aseguramiento a nivel nacional, están habilitadas para la inscripción de los trabajadores:
        • Oficinas Administrativas del ISSS San Salvador: Alameda Juan Pablo II y 39 avenida norte, Condominio El Salvador, costado sur de Metrocentro, San Salvador. Horario: De lunes a viernes de 7:00 a.m. a 4:00 p.m.
        • Sucursal Plaza Mundo: Centro Comercial plaza Mundo 1er. nivel parqueo sur local #88, Boulevard del Ejercito Nacional Km 5 1/2, calle Montecarmelo, Soyapango. Horario: De lunes a viernes de 8:00 a.m. a 4:00 p.m. (sin cerrar al mediodía)
        • Sucursal Plaza Merliot: Centro Comercial Plaza Merliot 3a. Planta, local 394, contiguo a Maxi Efectivos, calle Chiltiupán, Ciudad Merliot. Correo electrónico: aseg.merliot@isss.gob.sv. Horario: De lunes a viernes de 8:00 a.m. a 4:00 p.m. (sin cerrar al mediodía).
        • Sucursal San Miguel: 2a. Avenida Norte y 8a Calle oriente, antiguo local del Banco Central de Reserva. Horario: De lunes a viernes de 8:00 a.m. a 4:00 p.m.
        • Sucursal Usulután: 3ra. Av. Norte, Número 9, Barrio la Merced, Usulután. Horario: De lunes a viernes de 7:00 a.m. a 4:00 p.m.
        • Sucursal Santa Ana: Final 10a. Avenida sur, El Palmar. Horario: De lunes a viernes de 7:00 a.m. a 4:00 p.m.
        • Sucursal Sonsonate: Carretera a Acajutla Km 66, contiguo a Metrocentro Sonsonate. Horario: De lunes a viernes de 7:00 a.m. a 4:00 p.m.

        Fuentes

        La presente información fue recopilada a inicios de junio de 2018. Las fuentes de la información mostrada acá son las siguientes:
        Se agradecerá mucho informar mediante comentario si la información acá presentada está desactualizada o es incorrecta.

        martes, 15 de mayo de 2018

        Tutorial de Vue.js 2 - 2. Creación de proyecto desde plantilla

        Índice:

        Hola nuevamente, en esta ocasión continuaré con la segunda entrega del tutorial de Vue.js 2. En esta ocasión trataremos los siguientes puntos:
        • Definición general del ejemplo
        • Descarga de plantilla WebPack.
        • Ejecución de proyecto de ejemplo.
        • Introducción a la estructura del proyecto

        Definición del ejemplo

        Para este tutorial, como ejemplo se elaborará una lista de contactos telefónicos, que permita hacer las operaciones ACME con ellos: Añadir, Consultar, Modificar o Eliminar. Los requerimientos específicos se irán describiendo a medida se vaya avanzando en el tutorial.

        Descarga de plantilla WebPack

        Asumiendo que se instalaron los componentes necesarios indicados en la primera parte del tutorial, podemos proceder a crear la carpeta que contendrá nuestro proyecto en el lugar que deseemos. Luego, abrimos la consola en dicha carpeta, y procedemos a generar el nuevo proyecto a partir de la plantilla de webpack, haciendo uso de la herramienta de línea de comandos de Vue (vue-cli), para ejecutar el siguiente comando:

        $ vue init webpack vue2-tutorial-contactos

        Con ese comando, le indicamos a la línea de comandos de Vue que deseamos iniciar un nuevo proyecto, a partir de la plantilla webpack, y cuyo nombre será vue2-tutorial-contactos. Luego de ello, para completar la creación del proyecto, la herramienta interactiva preguntará al usuario la información necesaria para generarlo:


        En algunos casos, la herramienta mostrará los valores por defecto a un lado del dato requerido, en un tono más claro, y entre paréntesis. Tal es el caso del nombre del proyecto, que como puede notarse es el mismo que le enviamos como tercer parámetro al comando para generar el proyecto. Si deseamos utilizar el valor por defecto, solamente presionamos ENTER. Si no, digitamos el nuevo valor, y presionamos ENTER.

        Luego de ello nos solicita la descripción del proyecto. En este caso, ingresamos una pequeña sinopsis de nuestro proyecto de prueba:


        El siguiente dato solicitado es el autor del proyecto, el cual se obtiene de la configuración global de GIT:


        Seguidamente el asistente nos indica que elijamos el tipo de compilación a utilizar con Vue. En este ejemplo utilizaremos la recomendada, la cual es más fácil de utilizar, pero levemente más pesada (de acuerdo a la descripción, no he probado la segunda opción, jejeje):


        Luego debemos elegir si instalar o no el vue-router en nuestro proyecto, el cual se utiliza para navegar entre distintas partes de la aplicación. Si bien no es necesario poseer un componente de enrutamiento elaborado para este proyecto, ya que no tendremos una gran cantidad de "páginas", lo utilizaremos a modo de ejemplo, ya que puede ser de utilidad para proyectos de mayor envergadura. Para instalarlo ingresamos la letra Y, o bien presionamos ENTER solamente, ya que esta es la opción por defecto.


        Después se solicita indicar si se utilizará la herramienta ESLint para analizar el código fuente (linter). Si bien no es necesario, ya que Vetur lo hará dentro del Visual Studio Code, dejaremos que el asistente lo instale, para ver cómo se ejecuta y muestra esta herramienta al momento de correr el proyecto.


        Luego elegimos la configuración estándar de reglas de ESLint (he aquí una comparación de las configuraciones de lint):


        En el siguiente paso, se nos pide indicar si deseamos que el asistente prepare pruebas unitarias para el proyecto. Indicaremos que sí (Y), y seguidamente elegiremos a Karma y Mocha como herramientas para la creación y ejecución de las pruebas.


        Como penúltimo paso, se nos pregunta si deseamos que se preparen las pruebas de extremo a extremo (end-to-end) utilizando Nightwatch. Indicaremos que sí.


        Y finalmente, el asistente nos consulta si deseamos que se ejecute el comando npm install, una vez creado el proyecto, para instalar todas las librerías y componentes necesarios para poderlo ejecutar. Seleccionaremos que sí, utilizando la herramienta NPM:


        Una vez completados estos pasos, el asistente procede a crear el proyecto, e instalar los paquetes necesarios:


        Y nos indica cuando el proceso ha finalizado:


        Ejecución del proyecto de ejemplo

        Allí, en color mostaza, nos indica como podemos ejecutar el proyecto. Tal como dice allí, basta con ingresar a la carpeta vue2-tutorial-contactos, que es la que contiene el proyecto (nótese que el nombre de la carpeta es el mismo que indicamos al iniciar el asistente de vue-cli), y ejecutar el comando npm run dev. Con ello se procede a construir el proyecto.


        Una vez finalizada la construcción, se nos indica que se puede ver la aplicación en la URL: http://localhost:8080


        Al abrir la ruta en el navegador, vemos el resultado:


        Introducción a la estructura del proyecto

        Ahora que el proyecto ya esta listo, podemos abrir la carpeta que lo contiene utilizando Visual Studio Code, con la opción de menú File > Open Folder:


        En este punto las partes de la estructura del proyecto que más nos interesan son las siguientes:
        • src: contiene el código fuente de Vue del proyecto.
        • index.html: es la página de inicio de la aplicación.
        Una gran ventaja de que este proyecto haya sido generado con WebPack es que posee la característica de hot-reload, lo cual quiere decir que luego de modificar un archivo, este es recompilado, y la página web es refrescada automáticamente para ver los cambios. Para probar esto, podemos modificar el mensaje dentro archivo src/components/HelloWorld.vue, así:


        Al guardar el archivo, WebPack detecta el cambio, y recompila el archivo modificado, lo cual puede observarse en la terminal donde está corriendo la aplicación:


        Y una vez finalizada la compilación, la página es refrescada automáticamente en nuestro navegador (y si no es el caso, basta que la refresquemos nosotros mismos). Nótese el cambio en el texto del mensaje:


        Esto es todo en esta ocasión. Pueden encontrar el código fuente de esta parte del tutorial acá: https://github.com/guillegr123/vue2-tutorial-contactos/tree/tutorial-parte-02. Espero próximamente poder mostrar como crear nuestra lista inicial de contactos. Saludos.

        martes, 6 de marzo de 2018

        Baúl de los recuerdos: Gravity Well 2



        Saludos a todos. En esta ocasión quería compartirles acerca de un viejo juego que de casualidad recordé un día de estos, de la nada. O bueno, no tan de la nada: hablando con un compañero del trabajo, estaba recordando las cosas que solía hacer cuando al regresar de la escuela, y recordé que en 8o o 9o grado, luego de almorzar, jugaba un rato en la computadora (una Compaq Presario con Pentium 4 y Windows XP, que fué la segunda computadora que compraron mis papás, la cual todavía está guardada en mi cuarto). Uno de esos juegos era Gravity Well, un juego Shareware que venía incluido en un disco llamado The House of Games for Windows 95.


        Este disco venía incluido con la primera computadora que compraron mis papás, por allá por 1998 (hace casi 20 años, y creo que aún tengo el disco por allí), la cual era una clon que traía Windows 95. Este disco traía un montón de mini juegos en la modalidad Shareware, lo que quiere decir que eran más que todo demostraciones o juegos completos con limitaciones de tiempo. Muchos de ellos no los comprendía, pero entre los pocos que logré comprender estaba el juego tema de esta entrada.

        Gravity Well es un juego arcade y de estrategia, de combate espacial, desarrollado por Cactus Software Productions (Colorado, EE.UU.), en el año 1995. La descripción del juego dice:
        The age old conflict rages onward, spreading into another previously uncharted region of space. The race is on once again to establish strategic footholds and vital supply lines. Four separate races struggle for dominance in a continuing battle for the stars. Planet by planet, sector by sector, the galaxy is claimed by those who can take it.

        Traducido:
        El viejo conflicto se continúa y se extiende a otra región del espacio anteriormente desconocida. La carrera es una vez más para establecer puntos de apoyo estratégicos y líneas de suministro vitales. Cuatro razas separadas luchan por el dominio en una batalla continua por las estrellas. Planeta por planeta, sector por sector, la galaxia es reclamada por aquellos que pueden tomarla.

        Suena bastante épico, ¿verdad?. Esta sinopsis da una idea de qué se trata el juego, la cual extenderé a continuación con mis experiencias. Diría que Gravity Well es una especie de combinación entre el clásico Asteroides con Aterrizaje Lunar, en esteroides. En este juego formas parte del equipo azul, y conduces una nave de combate, la cual aparece estacionada en el "puerto espacial" que orbita tu planeta. Tu misión es explorar y conquistar otros planetas en el sector del espacio que estás asignado. Para ello, debes aterrizar en los planetas, para "marcarlos" como sitios de aterrizaje. Luego de ello, naves de carga son enviadas desde tu planeta hacia el nuevo, para completar su colonización. Sin embargo, el sector no está solo, ya que hay otras razas (roja, morada y amarilla), las cuales también lucharán por poder conquistar los planetas, e incluso podrían destruir toda tu presencia en el sector. Pierdes el juego si todas tus naves y colonias son destruidas.



        Para los estándares actuales, el juego parece bastante simple, pero examinándolo detenidamente, creo que es un bonito ejemplo de los programas de su época, por las siguientes características:
        • Poseía varios ejecutables, que dependían de la versión de Windows que se usara, y las características de la computadora: si tenía o no co-procesador de punto flotante, si la computadora poseía Win32 en la instalación de Windows, etc. En estos tiempos, al menos a un alto nivel, solo nos preocupamos en saber si el procesador es de 32 o 64 bits. Cabe mencionar que el ejecutable para Windows de 32 bits aun funciona en Windows 10, aunque no del todo bien, al menos en lo que pude probar yo.
        • Es un juego vectorial. Cada objeto se define por un conjunto de puntos, incluidos en un archivo llamado SYMBOLS.DAT, que no es mas que texto plano con un formato particular para listar los elementos y los puntos. Esto quiere decir que no sería muy difícil modificar la forma de los objetos en la pantalla.
        • Cada objeto en el juego se maneja de forma individual, y posee características distintas. El desarrollador afirma en sus notas haber probado hasta 300 objetos en una sesión de juego en la versión de Windows de 32 bits. Cabe mencionar también que la posición de los planetas se determina de forma aleatoria, y estos no son estáticos, sino que orbitan alrededor de alguna estrella.
        • Todos los planetas y estrellas poseen gravedad, por lo que tu nave es atraída hacia ellos. Las estrellas poseen mayor fuerza de gravedad que los planetas, por lo que su atracción es mayor. Controlando la propulsión de la nave, es posible orbitar los planetas, y aterrizar en ellos.
        • El juego posee manejo de colisiones. Tu nave es destruida si tocas una estrella, o te acercas demasiado rápido a un planeta. Si intentas aterrizar con un planeta en una posición incorrecta, tu nave es dañada. También, aunque puedes atravesar otras naves espaciales, tu nave sufre un porcentaje de daño al hacerlo. Por otra parte, tu disparas y tus enemigos también, así que los contactos de los proyectiles también son tomados en cuenta. Con un motor gráfico no ha de ser tan difícil manejar esto, pero codificarlo a mano, aunque sea en 2 dimensiones, no ha de ser una tarea tan sencilla.
        • El ratón es opcional, pero si se tenía uno, se permitía seleccionar los objetos en el sector, para ver qué estaba pasando cerca de ellos.
        • El juego soporta múltiples resoluciones, y parece ser que ajusta el tamaño de los objetos de acuerdo a la resolución.
        • Posee una especie de inteligencia artifical básica, ya que uno puede escoger el caracter de las razas contrincates, y esto determina la forma en que estos se comportan: agresivo, cobarde, tenaz, etc.
        • Todos los archivos en conjunto utilizan un espacio de solamente 273 Kb, siendo solamente el ejecutable 170.5 Kb. El resto de archivos incluyen los sonidos (en formato WAV), el archivo de objetos, el archivo leéme, y un archivo de ayuda de Windows.
        Estuve intentando correr el programa en Windows 10, en modo de compatibilidad con Windows 95, pero parece ser que el fondo negro no se pinta, sino solo los objetos. Solamente cuando se mueven estos objetos, se pinta de negro los píxeles donde antes estaban, produciéndose el siguiente efecto:



        Por otra parte, lo intenté correr también en Linux (una distro basada en Arch) utilizando Wine, pero corre demasiado rápido. Creo que se puede deber a que usa el procesador para dibujar la pantalla, basado en las notas y debido a que intenté reducir los frames por segundo con strangle, pero no obtuve ninguna reducción. Así que ni modo, tal vez pueda en otra ocasión.

        Sin embargo, es sorprendente que a pesar de tener más de 20 años, ¡aún corre! Aunque puede ser un poco corto, es bastante entretenido, y cada sesión de juego será diferente gracias a su AI y los elementos aleatorios. Lo recomiendo bastante.

        Si alguien sabe como correrlo agradecería mucho sus comentarios. Saludos, y hasta la proxima.
        Con la tecnología de Blogger.