Bajo un océano de bits, mes II

Por Javier Albizu, 7 Marzo, 2018
Decía (o al menos se le atribuye a) Bernardo de Chartres que caminamos sobre los hombros de los gigantes que nos precedieron. Le expresión me parece evocadora aunque, tratando de formar una imagen mental, esa me parece una posición se me hace un tanto incómoda para moverse durante mucho rato.
Haciendo mía esa analogía, y adecuándola a cómo decidí bautizar a este reto, me gusta pensar que navegamos sobre mares de información. Unas aguas que recorremos en pos del conocimiento.
Realizamos este viaje a bordo de las naves construidas sobre las ideas de esos gigantes que mencionaba el amigo Bernardo. Unas embarcaciones imperfectas que, en gran medida, no tenemos ni idea de cómo funcionan.
Subidos en ellos nos enfrentándonos a oleada tras oleada de información de todo tipo. Información que en ocasiones confundimos con conocimiento, cuando en multitud de ocasiones ambos conceptos no tienen mucho que ver. Esta información puede ser cierta o falsa, parcial o completa, desinteresada, egoista o una mezcla de todos estos factores.
Así pues, de nosotros depende el discernir qué es verdad, qué es mera especulación o qué , simplemente,, es. De nosotros depende comprender o equivocarnos, seguir adelante con nuestros errores o aprender de ellos y rectificar.
Será que hoy me he levantado algo existencialista pero, yo qué sé, nunca he leído a Kierkegaard.

Siguiendo la tradición de todo lo que me atañe, cuando busco el conocimiento este siempre termina resultado algo esquivo. Pero no lo es porque esté escondido o porque me tenga manía, lo es porque gran parte de aquello que me interesa no se encuentra en el horizonte sino bajo nuestros pies.
Pero estoy divagando, algo intrínseco a mi ser y, detrás de cada nueva palabra viene implícito lo mismo que os comentaba el mes pasado: Yo tenía un plan.

Cada vez que me sumerjo en este océano de bits la información me golpea. Alguna la desecho, otra trato de asimilarla y otra, a pesar de tenerla presente me digo "esto para más adelante"... mientras no la dejo para más adelante.
Nos movemos sobre los hombros de gigantes (me repito). Gigantes que definieron el binario y el hexadecimal. Viajamos a lomos del legado de los Titanes que poblaron la era heroica. Quienes para escribir una línea de código tenían que diseñar la electrónica que transformaría la lógica en bits, y los bits en algo a ser presentada sobre una tarjeta perforada o un tubo de rayos catódicos. Eso cuando no tenían que desentrañar qué es la lógica.
Cuando más sé del pasado de esta afición más admiro a los precursores. Cuando más trato de avanzar en el conocimiento más me veo abrumado por lo que no sé o no entiendo. Cuanto más tiempo permanezco bajo estas aguas más me expongo a perderme y no avanzar, a perecer asfixiado por la sobredosis de datos. Cuando más sé, más me siento un impostor.
La historia de mi vida.

Y sí, yo tenía un plan. Yo tenía montones de planes.
Hace tiempo que tengo pendiente el escribir algo acerca de aquellos Titanes, aquellos Precursores, aquellos a quienes debo tanto. Algo que ya traté de plasmar hace años de manera torpe en la charla que di sobre este asunto en la Navarparty1. Flaco favor que les hice.
Entre las notas de aquella charla aparecían los nombres de unos pocos de ellos, una lista que ha crecido desde entonces y que está cercana a alcanzar los doscientos nombres. Y siguen siendo pocos.
Muchas veces me pregunto qué puedo aportar yo. Qué puedo hacer para que este mundo sea un lugar un poco mejor y no, hacer un vídeo juego, un juego de rol, un libro o un tebeo no es la respuesta.
Lo único que se me ocurre que puedo hacer a ese respecto es hablar acerca de esas personas. En menor medida, también tengo pendiente el explicar por aquí el proceso y los productos de software libre gracias a los cuales esta web está disponible. Explicar las cosas que a diario aprendo en mi trabajo de una manera que puedan ser útiles para cualquiera. En definitiva, tratar de dar visibilidad a lo que han hecho otros más inteligentes que yo.
Porque ambas todas estas cosas están relacionadas. Hablar de lo segundo sin poner las cosas en su contexto me parecería una equivocación, más aún cuando mi objetivo es que esto vaya destinado a quienes carecen de una cierta base.

Hace un tiempo traté de sentar la base sobre la que construir esa narración. En aquel "Educando a los educadores"2 trataba de despertar esa curiosidad pero, una vez más, fracasé (o lo dejé para "más adelante" demasiado pronto).
Pero la toalla no está aún en el suelo y algún día volveré a la carga. Sólo tengo que encontrar el momento y dar con la estructura y el tono correctos. Algún día lograré encontrar la manera de agradecer a esos gigantes que nos precedieron el hecho de en la actualidad se me pueda leer desde cualquier rincón del mundo y su extrarradio.
Aunque a alguno que otro este hecho les parece algo por lo que culparles.
Hasta entonces, trataré de hacer de estos textos algo lo más didáctico y accesible que me sea posible.

En fin.
Mes dos. ¿Cómo ha ido la cosa?
Lenta, pero el tema avanza. Aunque, hasta el momento, no he tirado ni una línea de código no he avanzado en el planteamiento del resultado que quiero para cuando finalice.

Y va lenta, en parte, por lo que comento ahí arriba. A causa de la razón por la utilizo software libre y por la que este reto ha tomado los derroteros que ha tomado. Y eso es algo que me parece bueno.
Porque quiero entender lo que hago para ser capaz de explicarlo con mis propias palabras. Porque quiero que lo que hago pueda resultarle de utilidad a otros y porque quiero todos aquellos de cuyos esfuerzos me he beneficiado tengan su reconocimiento.
En resumidas cuentas: Porque me parece que es lo correcto (y porque me lo puedo permitir).
Y no, nada de esto es sencillo. Es más, en algún momento cercano tendré que poner el límite de hasta dónde quiero profundizar. Puede que no hayamos venido aquí a hacer las cosas de una manera sencilla, pero tampoco es cuestión de perdernos en los preparativos.
La cosa es que, dependiendo de hasta dónde quieras bajar, algunos se empeñan en convertirlo en algo complicado de narices. Basta que encuentres algo que te gusta para que su licenciamiento te lo reviente (lo explico un poco más adelante).
Así pues, preparaos para otro alud de enlaces.

Pues sí, Érase una vez que quería hacer un juego y decidí complicarme la vida.
Con lo sencillo que habría sido decantarme por instalar Unity o GameMaker en un ordenador Windows y ponerte al asunto, dirá alguno. Y tendrían toda la razón de ser esto una queja, pero no. No lo es. Complicado no tiene porqué ser sinónimo de malo.

Hace años que dejé de utilizar Windows en casa. Primero fue por una cuestión legal, económica y de ética personal, y después... ha seguido siéndolo, aunque el peso de cada uno de estos factores ha ido cambiando de una manera drástica. El sistema operativo que tenía instalado en mis ordenadores hasta entonces siempre había sido pirata, y sabía que existía una opción legal y gratuita para poder utilizar aquellas máquinas. Así comenzó mi historia de amor (y odio) con Linux.
Porque la cosa es y está complicada. Mucho. Pero durante los primeros pasos siempre es mucho peor.
A finales de los noventa, cuando traté de pasarme al mundo libre, no sabía ni lo que era aquello. Para mi era el mundo gratis, un error de concepto comúnmente propagado. Pero tenía estaba cómodo con el parche en el ojo y el esfuerzo que me comenzaba a suponer aquello me hizo desistir. No hubo manera.
No sólo se trataba de la complejidad implícita del asunto sino que, añadido a esto, tenía mucho que desaprender en cuanto a lo que yo había deducido que era un sistema operativo (o un programa).
Después de aquello realicé alguna que otra intentona más, siempre con el mismo resultado. No fue hasta que decidí realizar el salto sin red, hasta que no me quedó otra opción que aprender o morir (porque retroceder nunca, rendirse jamás) que las cosas comenzaron a tener sentido en mi cabeza.
Había asistido a un curso de cincuenta hora en la hoy desaparecida FOREM y leído (siempre en diagonal) toneladas de documentación. Había instalado distintas distros en equipos secundarios y en máquinas virtuales pero, no fue hasta que decidí instalarlo en el equipo que usaba a diario que la cosa despegó.
Y esto no me sirvió sólo para aprender acerca de los sistemas operativos, sino que me abrió los ojos al aberrante mundo de las licencias de software. Pero ese es un tema a tratar con mayor detenimiento en otro lado (aunque si que dejaré un pequeño avance más adelante).

Volviendo al asunto de la programación, de la misma manera que yo he podido trabajar, aprender y divertirme gracias a las herramientas creadas y cedidas por otros de manera desinteresada, quiero que esto sea extensible a lo que hago. Es una cuestión de principios.
De utilizar herramientas que no son libres para este proyecto lo estaría desvirtuando. Como el lado oscuro, puede que sean más fáciles y atractivas, puede que sea el camino más fácil, quizás hasta el mejor de acuerdo a la lógica capitalista, pero no es el único.
Así pues, de la misma manera que el contenido de mis páginas se encuentra publicados bajo la licencia Creative Commons3, mi juego... o lo que termine saliendo de esto, lo hará bajo licencia GPL4.

Ciertamente para conseguir eso no es necesario que todas las herramientas sean libres pero, nuevamente, me parece el camino correcto.

¿Quiero decir con esto que el resto me parecen malos productos? ¿Que quienes no siguen este camino me parece que estén equivocados?
Nop. Simplemente este es el camino que he elegido yo.
Alguno de los tipos a cuya estela me encantaría acercarme5 no han compartido su código, y eso no disminuye mi fanboyismo por él y su obra.
Por la misma, y como ya comentaba antes, también estoy convencido de que de utilizar las herramientas que he mencionado antes mi trabajo mucho más sencillo. Y me parecen herramientas perfectamente válidas para quien “sólo” quiere hacer un juego y no quiere aprender a programar.
Otra gente6 sin las inquietudes (o sin el tiempo o las posibilidades) que me mueven a mi, sin necesidad de saber programación han creado gracias a estos motores proyectos de lo más interesante.

Pero, por más bonitos o atractivos que puedan ser, no tengo acceso a su código. No puedo aprender de ellos.
Por el contrario, sí que dispongo del código de todos estos otros7. Quizás no sean tan profesionales o tan bonitos, quizás no estén muy bien documentados. Quizás aún no haya sido capaz de compilar ninguno de ellos para que funcionen en mi ordenador, pero puedo mirar como se han devanado los sesos la gente que los ha creado, y ver cómo han solventado los problemas con los que me encontraré.
Y, ya que menciono a una de las bestias negras de la programación, voy a sacar a colación a los dos grandes misterios arcanos del desarrollo de software: Compilar8 y Buscar bichos9.

De cada programa cuyo código fuente me he descargado alguna vez, en primera instancia la compilación ha fallado en cerca de un noventa por ciento de ellos. Más adelante, en ocasiones gracias a la documentación que incluían, en ocasiones buscando en otras fuentes, he conseguido hacer funcionar a algunos de ellos... aunque sin terminar de entender lo que sucedía en segundo plano.
Uno (más) de mis objetivos para este resto es que esto no le pase a quien trate de compilar lo que yo haga. Digo esto desde la más completa ignorancia. A ver qué soy capaz de conseguir cuando termine.
El cuerpo me pide que empiece a explicar por aquí en qué consisten estas actividades, pero lo dejaré para alguna entrada posterior.

Por el momento, durante la última semana he estado probando distintos entornos de desarrollo10 sobre los que trabajar. Como en todo lo referente a casi cualquier terreno, en cuanto empiezas a bucear entre sus distintas especialidades, te encuentras en un nuevo mar en el que perderte, quedar paralizado o morir por sobredosis de datos.
Como podréis en los enlaces que acompañan a esto11, los hay como para aburrir, y eso que sólo estoy poniendo los que están disponibles para Linux y tienen una licencia "amistosa" (no, aún no he llegado a esa parte de las licencias).

Mientras los investigaba iban saliendo nuevos misterios por resolver. Algunas como GCC, G++ o Make me sonaban, pero otras como Cmake, Clang, pese a haber leído con anterioridad sus nombres, no tenía idea acerca de su cometido.
Algo similar pasaba con la cacería de bichos, el "Debug". Por más que había leído este palabro con anterioridad, no tenía ni idea de lo que implicaba.
Habiendo trabajado hasta ahora con lenguajes de scripting12 no había necesitado de ninguno de estos dos componentes y, como ya he comentado por ahí arriba, tengo la impresión de que van a ser mis bestias negras.

Así pues, en este punto en el que me encuentro prima entender cada paso que voy a dar. Ser consciente del flujo de los datos y en qué estado se encuentra en cada momento, algo para eso un IDE con un buen degugger es esencial.
Pero, por otro lado, estos IDEs me ocultan otra serie de procesos. Principalmente el de compilado, linkado y la transformación final del código en un binario ejecutable.
Como consecuencia de todo esto, los IDEs acostumbran a ser programas que consumen muchos recursos al ordenador en el que se ejecutan, algo que tiene todo el sentido del mundo. Lo que pasa es que yo soy muy maniático con esas cosas. La herramienta con la que trabaje tiene que hacer sólo lo que tiene que hacer. Si hay algo de lo que pueda ocuparme yo prefiero no delegarlo a otros procesos que no lo harán "como a mi me gusta".

Con esto en mente, la lucha estaba servida. El primero en caer fue CodeBlocks por su alta inestabilidad, y no tardaron en seguirle Eclipse y Netbeans, ambos hechos en Java y muy pesados.
La pelea quedaba pues entre Atom (un proyecto que sigo desde que estaba en fase Beta y al que tengo especial aprecio), Visual Studio Code, KDVelop y QT-Creator.
Los dos últimos son IDEs puros, mientras que los primeros son editores de textos modulares. Así pues, en un primer momento son más ligeros y versátiles pero, en cuanto empiezas a añadirles módulos empiezan a hacerse más lentos y pesados.
Me habría encantado centrarme en Vim o EMACS, porque son tanto o más ligeros, minimalista y versátiles que los otros editores, pero la curva de aprendizaje que requieren ha provocado que esto quede aparcado para más adelante.

Pero, cuando la cosa estaba casi decidida por Visual Studio Code (a Atom, probrecico mío, hasta le cuesta mover el documento que tengo con los enlaces para esta entrada), me dio por mirar su licencia... y no es ni libre ni abierta. Al menos no la de la versión que te puedes instalar desde los repositorios de Microsoft13. Gracias Microsoft. Vete a paseo Microsoft.

En estos momentos tengo la versión con licencia abierta compilada en mi equipo pero, a pesar de todo, me están entrando ganar de mandarlos a paseo. Algo que no descarto hacer cuando ya me encuentre más suelto en estas lides.

Aparte de todo esto, también me he sumergido algo más en el mundo de la programación. Me encuentro cerca de terminar “Beginning C++ Through Game Programming”14 que, si bien adolece de lo mismo que otros libros, al menos hace un esfuerzo por acercarse a los terrenos en los que me quiero mover. Aún así, las constantes, las variables constantes, los punteros constantes a variables dinámicas, y punteros dinámicos a funciones constantes me siguen provocando pesadillas.

Y he seguido bajando más aún, acercándome al mundo del ensamblador en su vertiente más viejuna. Ensamblador para el Z80 y Moss 650215. Y, por más apasionante que sea (dicho esto sin ironía alguna) aún me duele la cabeza. Aunque volveré, ya lo creo que volveré.

Para hacerme una idea en cuanto a magnitud, también he sacado estadísticas de la cantidad de imágenes, líneas y palabras contenidas en el código de varios juegos que me he descargado. Que tampoco es que me digan gran cosa, pero me permiten hacerme una idea en cuanto a orden de magnitud general (y comenzar a asustarme).

uMario (Clon de Super Mario Bros con SDL)
20.949 líneas 122 archivos	417 assets	58.829 Palabras
SDLPoP (Clon de Prince of Persia con SDL)
24.888 líneas 38 archivos	1091 assets	88.685 Palabras
Mirror Magic (Clon de Deflektor)
27.760 líneas 46 archivos	201 assets	79.055 Palabras
Xarchon  (Clon de Archon)
24.008 líneas 81 archivos	519 assets	79.483 Palabras
Contra  (Clon de Contra, versión NES)
10.214 líneas 36 archivos	20 assets	28.565 Palabras
RickyD  (Clon de Rick Dangerous con SDL)
30.073 líneas 194 archivos	344 assets	80.202 Palabras
Xrick  (Otro clon de Rick Dangerous con SDL)
56.444(sources)+1.715 (includes) líneas 50+29 archivos  134.516 + 6.429 Palabras

Para recuperarme de estos traumas también me he dedicado a ver las charlas que han dado distintos autores de videojuegos en las charlas de la GDC16 y creo que por hoy ya vale.

Me he dejado en el tintero otro montón de cosas. Más sobre las librerías de funciones, cobre SDL, y SFML, sobre Bennugd y Allegro, PyGame y PySDL2, sobre ISTQB e ITIL (de las que ya pondré enlaces el mes que viene), pero ya toca dejaros. Tengo retos que retomar.

Enlaces:
1. Conferencias Navarparty 9 - Historia de la ínformática (Ver sólo si se cuenta con apoyo psicológico, que la di yo)
2. Educando a los educadores
- El pueblo (no) quiere saber
- ¡LOS ESTÁNDARES!
- ¡LAS LICENCIAS I (Glosando)
3. Creative Commons
4. GNU (General Public License)
5. Con ustedes: Brian Provinciano
Retro City Rampage
Entrevista a Brian Provnciano en Gamasutra
Port de Retro City Rampage para NES
AMA a Brian Provinciano en Reddit
Charla Brian Provinciano en GDC de 2016
6. Los otros
- Locomalito
- Diego Sanches
- Science Kombat
7. Juegos con código fuente
- Open Source Game Clones
- Listado de juegos en Github
- Super Mario en SDL2
- Código original de Prince of Persia para Apple II
- Prince of Persia con SDL
- Prince of Persia con JavaScript
- Prince of Persia con Roku Brightscript
- Xrick (Clon de Rick Dangerous)
- Xrick para XCode (Mac)
- RickD (Clon de Rick Dangerous)
- Contra (NES)
- Mirror Magic (Deflektor)
- XArchon
8. Compilar en Linux
- Compilar
- GCC / G++
- Make
- Cmake
- Clang
- Tutorial Cmake I
- Tutorial Cmake I
- Configurar Visual Studio para Torque 3d
9. Debug en Linux
- Safari binario
- The GNU Project Debugger (GDB)
- GDB Debugger Command Cheat Sheet
- GDB front ends and other tools
- DDD
- Valgrind
- Zerobugs
10. IDE (Integrated development environment)
11. IDEs para Linux
- Atom
- Codeblocks
- Eclipse
- EMACS
- Kdevelop
- Netbeans
- QT-Creator
- Visual Studio Code
- Vim
Comparativas IDEs / Debuggers para Linux
- I
- II
- III
Módulos para Visual Studio Code
- C++ en Visual Studio Code I
- C++ en Visual Studio Code II
- Creación de tareas en VSCode
- Proyectos en Visual Studio Code
- Code Runner para VSCode
- Ensamblador para C64 en Visual Studio Code
- Charla VSCode para programar C++ 1 (Video)
- Charla VSCode para programar C++ 2 (Video)
Módulos para Atom
- C y C++ para Atom
- Compilación de C y C++ en Atom
- Compilación y ejecución de C y C++ en Atom
- Lint
- Linter para GCC en Atom
- Depencia para Linter para GCC I (Intentions)
- Depencia para Linter para GCC II (linter UI default)
- Depencia para Linter para GCC I (linter)
- Compilación en Atom
- Herramientas de compilación para C++ en Atom
- CMake para Atom
- Proyectos en Atom
12. Scripting language
13. Licencias de Visual Studio Code
- Binarios oficiales
- Código sin compilar
14. Libro Beginning C++ Through Game Programming
15. El Ensamblador, ha llegado el Ensamblador
- El lenguaje ensamblador
Profesor Retroman
- Nivel 0 - Presentación (Videos)
- Nivel 1 - Teoría (Videos)
- Nivel 1 - Práctica (Videos)
- Nivel 2 - Teoría (Videos)
- Nivel 2 - Teoría (Videos)
- Nivel 2 - Práctica (Videos)
C64 assember programming
- Debugger para C64
- An x86 to 6502 Re-Assembler (Video)
- Part 1: How The Memory Map Worked (Video)
- Part 2: Intro to 6502 Machine Language (Video)
- Part 3: Intro to 6502 Assembly (Video)
- Pacman Clone for C64 (Vídeo)
16. Charlas GDC - Postmortem
- Prince of persia
- Another world
- Another world Director Commentary by Eric Chahi
- Marble Madness
- Pitfall
- Diablo
- Doom

El contenido de este campo se mantiene privado y no se mostrará públicamente.

Plain text

  • No se permiten etiquetas HTML.
  • Las direcciones de correos electrónicos y páginas web se convierten en enlaces automáticamente.
  • Saltos automáticos de líneas y de párrafos.