Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas

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.

¿Qué es un script?

Ante la noticia de que un "script" causó un error en la forma en la que se estaba presentando el listado de preferencias electorales de los candidatos a diputados para las elecciones 2018 de El Salvador, quería explicar un poco acerca de qué es un script. Pero iré paso a paso, así que empezaré por explicar el concepto más básico del que parte todo: qué es un programa de computadora.

Programa de computadora

Un programa de computadora es una lista de instrucciones que le dicen a una computadora qué tareas debe realizar y de cómo debe hacerlas, con el fin de obtener un resultado específico. Una buena analogía a un programa es una receta de cocina, en la que se nos dice qué ingredientes utilizar, y cómo prepararlos, siguiendo una lista de pasos, para obtener como resultado un platillo específico.

Ejemplos de programas de computadora son Microsoft Word, Photoshop, las aplicaciones de los teléfonos móviles, y el navegador web que usted está utilizando para ver esta página web. Los sinónimos más comunes de programa de computadora son aplicación y software.

Los programas son elaborados por programadores, también conocidos como desarrolladores de software. Los programadores usualmente escriben las instrucciones de los programas en forma de texto (similar al que usted estña leyendo ahorita) utilizando uno o más lenguajes de programación.

Lenguaje de programación

Un lenguaje de programación es, al igual que el lenguaje escrito que está leyendo ahorita, un conjunto de palabras (por lo general en inglés), números y símbolos, que permiten describir las instrucciones que un programa debe realizar. Estos lenguajes son una forma simplificada de un lenguaje humano, ya que su objetivo es facilitar a los humanos comunicarse con las computadoras para decirles qué deben hacer. El conjunto de instrucciones de un programa, escritas en un lenguaje de programación determinado, es conocido como código fuente.

El siguiente es un ejemplo de código fuente de un programa escrito en el lenguaje de programación COBOL:

SUBTRACT DISCOUNT FROM COST GIVING FINAL-COST.

En este caso esta instrucción es fácil de entender, ya que lo que realiza es su traducción literal del inglés: RESTAR DESCUENTO DEL COSTO DANDO COMO RESULTADO COSTO FINAL.

Compilación e interpretación

En términos generales, el código fuente de los programas debe ser traducido a una secuencia de unos y ceros, para que la computadora pueda comprenderlo. Esto es realizado por otros programas, y se puede hacer de dos formas, lo cual depende del momento en que se haga la traducción. La primera forma es llamada compilación, la cual consiste en que un programa llamado compilador traduce el código fuente y lo empaqueta en uno o más archivos. Uno de estos archivos es conocido como ejecutable, que es el encargado de iniciar el programa. Ejemplo de ello es el archivo que se utilizó para iniciar el navegador que está utilizando para ver esta página web, o el archivo que se utiliza para iniciar la aplicación de Facebook en su teléfono celular.

La otra forma de traducción se conoce como interpretación, que consiste en que el código fuente es leído instrucción por instrucción por un programa llamado intérprete. Cada instrucción que se lee es traducida e inmediatamente ejecutada (realizada o "corrida"). En resumen, la diferencia entre la compilación y la interpretación es que en el primer caso todo el programa es traducido al lenguaje de la máquina (unos y ceros) para poder ser ejecutado posteriormente; mientras que en el segundo, cada instrucción se lee, se traduce y se ejecuta, una por una.

Existen programas que combinan ambas formas de traducción, pero será tema para otra ocasión.

Script

Finalmente llegamos a nuestro objetivo: ¿qué es un script? La palabra script traducida literalmente del inglés significa guión. En el contexto informático, un script es una forma en la que se le conoce a un programa elaborado en un lenguaje de programación que puede ser interpretado. Es decir, es un programa que puede ser traducido al lenguaje de la máquina (unos y ceros) paso a paso, y cada paso o instrucción es ejecutado inmediatamente después de ser traducido.

¿A qué se refiere "script" en el contexto de los sitios web?

En esta sección se pretende dar una idea más especifica de a qué se pueden referir con el término "script" en el contexto de las llamadas aplicaciones web, que son sitios web que muestran información que no es estática, sino que puede cambiar a lo largo del tiempo. Un buen ejemplo de ello es el sitio web de Facebook.

Para el funcionamiento de una aplicación web común, existen uno o más programas corriendo tanto en computadoras llamadas servidores, como en el navegador web que se está utilizando para ver el sitio web (Google Chrome, Mozilla Firefox, Microsoft Internet Explorer o Microsoft Edge, por ejemplo). Su navegador web solicita la información a un servidor enviando un mensaje a través del internet con una dirección específica (por ejemplo https://www.facebook.com). El mensaje llega al servidor, el cual ejecuta uno o más programas (los cuales podrían ser scripts), y luego responde con otro mensaje que lleva toda la información que se muestra en la página, así como uno o más scripts, los cuáles son interpretados por su navegador, para ubicar la información de la forma que usted la ve en la página web, o bien realizar otras tareas.

Por otra parte, en un servidor, la información requerida es usualmente almacenada en bases de datos, que son uno o más archivos, los cuáles son administrados por un programa llamado gestor de bases de datos. Para extraer la información de esta base de datos, en ocasiones se utilizan scripts que indican cuáles son los datos que se desean obtener y cómo se desean obtener. Los datos se comúnmente se obtienen en forma de listas o tablas, las cuales pueden ordenarse de una forma particular.

Esto sería todo, espero no haberlos aburrido, y de paso haberles compartido algo de lo que me gusta, aprovechando la ocasión :P

miércoles, 17 de septiembre de 2014

WP - Consejos de programación 1 - Don’t be WET, stay DRY

En esta ocasión quiero iniciar una serie de consejos de programación que considero importantes a nivel de eficiencia, orden y -por que no decirlo – estética. Estos consejos se basan en algunas prácticas que he observado durante los pocos años de mi carrera. Algunas de esas prácticas son buenas, mientras que otras son las que quisiera evitar. También se basan en cosas interesantes que he encontrado en uno que otro artículo por el Internet (de esos artículos donde la gente gustan hablar de temas con acrónimos de 3 o 4 letras).

Iniciaré la serie compartiendo algo acerca del principio de desarrollo de software conocido como DRY (inglés: seco), que significa Don’t Repeat Yourself. Creo que ya saben más o menos por donde va la cosa, pero antes de definir el término, haré una pequeña introducción.

Introducción

Algo que he visto muchas veces es que cuando se quieren añadir nuevos elementos a una aplicación (ventanas, controles de usuario, funciones), y estos son muy similares a elementos ya existentes, lo que hacen los programadores es copiar y pegar el código fuente correspondiente a dichos elementos, y hacer las modificaciones en la copia de acuerdo a los nuevos requerimientos. Esta técnica es vulgarmente conocida en nuestro medio como “copy-paste”, y también es aplicable a la técnica que usan los estudiantes cuando buscan sus tareas en Wikipedia, El Rincón del Vago, Taringa, o Yahoo respuestas, en el peor de los casos (aceptémoslo, todos hemos aplicado esta técnica alguna vez, jejeje…)

Considero que esta una práctica muy arraigada debido a que esto se considera la forma más rápida de incluir nuevos elementos en una aplicación. Pero si se analiza cuidadosamente, al final no resulta ser la forma más rápida, porque:
  • Al crear un nuevo elemento a partir de la copia de uno ya existente, implica que es necesario cambiar parte del código fuente, para cambiar o añadir la funcionalidad deseada. También hay que tener particular cuidado con aquellos parámetros que han sido “quemados” (hard-coded) dentro de la aplicación.
  • El resultado es una aplicación con una gran cantidad de código fuente, lo que también deriva en la existencia de varios archivos desorganizados y desperdigados en la carpeta que contiene el proyecto.
  • Si se requiere cambiar una funcionalidad principal que se ha repetido en todos los elementos copiados, esta modificación debe hacerse en cada uno de ellos.

Definición de DRY y WET

Basta de hacer catarsis, procederé a definir los conceptos más formalmente. En la “ingeniería de software”, el término DRY, o “Don’t Repeat Yourself”, se refiere a reducir la repetición de información de cualquier tipo. El principio DRY dicta: “Cada pieza de conocimiento debe tener una representación única, no ambigua y autoritaria dentro de un sistema”. El término fue acuñado por Andy Hunt y Dave Thomas en su libro “The Pragmatic Programmer”. Eric Raymond hace referencia a un término equivalente, llamado SPOT (“Single Point Of Truth”) en su libro “The Art Of Unix Programming”. Cabe destacar que el término no se limita a código fuente ni datos, sino a un sistema cualquiera. Tampoco se refiere necesariamente a no repetir código fuente en un sistema informático, sino que este tenga una fuente única dentro del sistema.

El término contrario a este es WET (inglés: mojado), al cual se le han dado muchos significados: “We Enjoy Typing”, “Write Everything Twice”, “We Edit Terribly”, etc. Obviamente, significa que existen “piezas de conocimiento” con múltiples representaciones, que podría traducirse como tener la misma información repetida varias veces.

Ventajas de DRY

Ustedes se preguntarán por qué tomarse la molestia de aplicar este principio, si han vivido felizmente con la técnica de copy-paste por mucho tiempo, a tal punto que ya tienen práctica con la mano izquierda para hacer las secuencias de teclas Ctrl+C y Ctrl+V. Pues bueno, las ventajas que yo he observado de primera mano en las aplicaciones que he visto son las siguientes:
  • Toda elemento (función, método, procedimiento, clase) e información dentro de la aplicación posee un origen único, por lo que si se requiere modificar la funcionalidad principal de alguno de ellos, debe hacerse en un solo punto.
  • La cantidad de código fuente se reduce.
  • El desglose de funcionalidades permite el manejo de múltiples capas. Esto también permite una organización más clara de los archivos de código fuente.
  • El trabajo de añadir nuevos elementos basados en elementos anteriores se reduce, ya que no implicará copiar y modificar código fuente para satisfacer los nuevos requerimientos, sino más bien reutilizar elementos y funcionalidades ya existentes. En el mejor de los casos, solo será necesario invocar los elementos ya existentes, con parámetros distintos, para obtener los resultados requeridos.

Desventajas de DRY

A pesar de todo, y como todo en esta vida, DRY posee algunas desventajas que hay que tener en cuenta:
  • Muchas veces se requerirá de análisis profundo para encontrar una forma aceptable de centralizar todos los elementos de un sistema. La construcción de este kernel para la aplicación puede tomar algo de tiempo.
  • En algunos casos, la solución centralizada será menos eficiente en tiempo de ejecución que la solución repetitiva. Un buen ejemplo de ello es cuando una consulta muy utilizada en una base de datos relacional (digamos de SQL Server) se coloca en una función de usuario para poderla usar varias veces. La función por si sola puede ser eficiente, pero al intentar utilizarla dentro de otras consultas, puede ser más lento y pesado que si la consulta no hiciera uso de ella.
  • Dejar de lado el hábito de copy-paste, jejeje…

Cómo implementar el principio DRY

Dicho lo anterior, ahora os describiré algunas técnicas que os pueden ayudar a implementar el concepto de DRY en vuestros programillas:
  • Refinamiento del sistema en partes individuales con funcionalidades específicas y diferenciadas (técnicas top-down y bottom-up). Como me decían en la materia Programación Estructurada, “hay que reducir el problema en problemas más pequeños” (o algo así).
  • Agrupar elementos y funcionalidades similares, a  nivel de archivos y directorios, así como a nivel de código fuente.
  • Si se observa que una funcionalidad o elemento se repite más de una vez, o bien que es son muy parecidos a otra funcionalidad o elemento existente, entonces centralizarlos en un solo lugar. Por ejemplo, en la programación orientada a objetos, si se tienen por ejemplo las clases Profesor y Estudiante con propiedades y métodos similares, lo mejor sería que los elementos comunes los heredaran de una clase padre (Persona, por ejemplo).
  • En el caso de programación orientada a objectos, hacer uso de la herencia, clases abstractas, interfaces, y otros elementos que nos permiten centralizar la funcionalidad e información en clases, y hacer uso extensivo de ellas.
  • Hacer uso de Frameworks, los cuáles brindan funcionalidades comunes a toda aplicación. También incluyen generadores de código fuente, que construyen automáticamente elementos de uso común en base a características específicas. Ejemplo de ello es el Generador de Formularios del Framework para PHP llamado Symfony, que genera formularios web a partir de la definición del modelo de una base de datos.

¿Generadores de código fuente?

En este momento podría surgir la duda de por qué usar un generador de código fuente, si estos podrían generar código repetitivo. Si bien esto es cierto, no se salen del principio de DRY, ya que en realidad el código fuente generado automáticamente ha sido construido a partir de un mismo origen: el generador de código fuente. Esto implica que si se hace uso del mismo generador, este construirá el mismo código fuente en cualquier momento si se proporcionan las mismas condiciones para su generación.

Observaciones finales

El principio DRY nos presenta facilidades y ventajas con respecto a WET, ya que a la larga pueden facilitarnos el trabajo al reducir el tiempo de programación reutilizando elementos y funcionalidades ya existentes. Sin embargo, el llevar un sistema a una estructura DRY puede llevar tiempo de análisis, y muchas veces no será perfecto. Pero a pesar de esta desventaja, considero que vale la pena hacer el intento, ya que a la larga nos facilitará el trabajo a nosotros mismos quienes desarrollamos una aplicación, así como a los colegas que se encargarán de extender nuestro sistema informático en un futuro.

Los invito a escribir sus comentarios y opiniones acerca de este tema.



Publicado originalmente el 16/08/2012, en http://itsouvenirs.wordpress.com/2012/08/16/consejos-de-programacion-1-dont-be-wet-stay-dry/.
Con la tecnología de Blogger.