_________________________________________________________________________________

       /*
          ATDT MAGAZINE :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
          :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
          :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::[0x01-08]:
          NUMERO 0x01::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

                                        "programemos que hace bien" por littledeath
       */

       Dificultad: mínima
       Requisitos: Saber algo de bash/linux/bsd/wsl2.

                            ,----------------,              ,---------,
                       ,-----------------------,          ,"        ,"|
                     ,"                      ,"|        ,"        ,"  |
                    +-----------------------+  |      ,"        ,"    |
                    |  .-----------------.  |  |     +---------+      |
                    |  |                 |  |  |     | -==----'|      |
                    |  |  PROGRAMEMOS,   |  |  |     |         |      |
                    |  |  MDFK!          |  |  |/----|`---=    |      |
                    |  |                 |  |  |   ,/|==== ooo |      ;
                    |  |                 |  |  |  // |(((( [33]|    ,"
                    |  `-----------------'  |," .;'| |((((     |  ,"
                    +-----------------------+  ;;  | |         |,"
                       /_)______________(_/  //'   | +---------+
                  ___________________________/___
                 /  oooooooooooooooo  .o.  oooo /,
                / ==ooooooooooooooo==.o.  ooo= //
               /_==__==========__==_ooo__ooo=_/'


       La verdad, si me pongo a pensar, escribir en una ezine en modo
       vieja escuela, usando un editor de texto ascii, de consola,
       lanzado desde un shell bash que a su vez está contenido en algo
       llamado Windows Terminal, que resulta que existe gracias a que
       finalmente Microsoft dijo "PARÁ, esta gente la tiene mega clara"
       (en directa referencia a la comunidad open source en general,
       licencias y peleitas taradas aparte) y zás, defecó Windows
       Subsystem for Linux, cuya versión 2 es pre-orgásmica .... [toma
       aire] y que en cualquier momento va a permitir codear para la UI
       de Windows sin tener un X 3rd party instalado... [toma mas
       aire]... LA VERDAD QUE TODO ES CULPA DE LOS BBS.

       Y saben por qué? Porque conectarme a esos mundos, porque cada
       BBS era y es un mundo, y en mi caso desde MS-DOS, luego Linux
       (historia aparte)... es sin lugar a dudas la fuente inagotable
       de excelentes recuerdos que hoy me empuja a escribir acá.

       Pero, óh, que carajo tiene eso que ver con el título del
       artículo?

       Me pa que es bastante obvio... si pasaste por ese camino.

       Programar, BBS, programar más, Linux, Programar hasta el
       infinito. Programar hace bien, si te gusta HACER que pasen cosas
       (con los ataques que hay hoy...  eso de hacer explotar cosas por
       el aire te lo hace pensar dos veces, no?  y mirá, en los 80s y
       90s se discutia si podiamos afectar el hardware desde código
       [quemar pixels!]).


       Creeme, programar te va a hacer bien.  No importa la edad que
       tengas ni tu background técnico (si estás leyendo esto y no sos
       un autodenominado nerd/geek/etc, seguro sos hij@ de uno).

       Pretendo escribir una serie de artículos que los introduzcan en
       el mundo de la programación en Python, con la mirada puesta en
       la nostalgia por los BBS.

       Vamos a hacer un BBS, desde cero. (Sin la parte de modems, but
       who knows?)

       Empezamos?


       [=-------------------------------------------------------------------------=]


       A la hora de sentarse a programar algo, yo paso por un proceso
       de abstracción muy particular.

       Básicamente, diseño todo el sistema en la cabeza. Y cuando
       finalmente me siento a programar, lo hago con una relativa
       claridad, sabiendo para que lado quiero ir, y principalmente con
       orden.

       Y por esto es que todos los grandes proyectos de software
       comienzan con un deseo o necesidad, luego una etapa de analisis
       técnico-funcional que establece las tecnologías a utilizar,
       metodología, etapas, procesos adicionales requeridos (por
       ejemplo, en el caso de una migración de datos), etc.

       Tratemos de hacer algo así.


       Un BBS es un sistema que permite al usuario:

       * Conectarse
       * Registrarse/Identificarse
       * Interactuar con diversos modulos como foros, correo, chat, juegos,
         oneliners, etc.

       * Subir/bajar archivos a diversas áreas (si, esto podria ser
         otro módulo pero como implica una interacción específica del
         lado del usuario, lo describo aparte)

       * Visualmente, soportar ANSI para colorcitos, posicionamiento
         del cursor, limpiado de pantalla.

       Adicionalmente, el operador del sistema (Sysop), debe poder:

       * Configurar parámetros operativos del BBS [la registracion está
         abierta? que nivel se le da a los nuevos usuarios?  que
         permisos otorgan los niveles?
       * Comunicarse directamente con el usuario en tiempo real
       * Utilizar privilegios [moderación de mensajes/usuarios]
       * Ejecutar tareas de mantenimiento [limpieza, optimización,
         promoción de usuarios].

       ... entre otras cosas.

       No todas estas funciones son deber del software principal del
       BBS, más adelante veremos si vale la pena programar el servidor
       telnet o no.

       Teniendo esos requerimientos en la cabeza, podemos elejir o
       plantear diversas tecnologías que nos pueden ayudar.

       El primer paso es seleccionar el o los lenguajes de programación
       a utilizar en base al contexto de ejecución.  Al ser un BBS,
       asumimos que se va a ejecutar en un sistema operativo moderno,
       multiusuario/multitarea [a fin de cuentas, no vamos a programar
       para MS-DOS, aunque definitivamente seria interesante no?], que
       nos permita implementar el BBS en un server hogareño o incluso
       en la nube.

       * SISTEMA OPERATIVO: Linux, *BSD

       * TECNOLOGIAS: - No esperamos crecimiento desmedido, por lo cual
       multiples bases de datos sqlite podrian servir para almacenar
       sysops, usuarios, foros [una base por foro].  - Para la
       comunicación entre instancias del BBS [o sea, cada usuario
       conectado] podriamos utilizar algun tipo de Queue de mensajeria
       que soporte asincronicidad y señales.  - Necesitamos soportar
       telnet en modo 'servidor', dado que hoy día casi todos los BBS
       en existencia son accesibles via telnet.

       * LENGUAJE DE PROGRAMACION: Python 3 (podriamos usar go, C,
       rust, nim también, entre decenas de otras opciones geniales.

                                         ##   ###
                                        ##    ##
                       ######  ##  ## ######  #####   #### ## ###
                        ##  ## ##  ##   ##    #   ## ##  ## ##  ##
                        ##  ## ##  ##   ##    ##  ## ##  ## ##  ##
                        #####   #####   ##    ##  ## ##  ## ##  ##
                        ##         ##    ### #### ### #### #### ###
                       ####    #####

       No te preocupes si algo de esto no lo conocés, vamos a ir
       explicando de a poco.

       En esta primera entrega, vamos a codear algo que, al ejecutarlo,
       nos muestre algun mensaje en pantalla, usando secuencias ANSI.


       [=-------------------------------------------------------------------------=]

       NOTA IMPORTANTE: Python es un lenguaje de alto nivel, hermoso,
       con una comunidad genial y muchisimos modulos, librerias,
       ejemplos y aplicativos. Lógicamente, si buscamos vamos a
       encontrar incluso software de BBS, servers de telnet y todo lo
       que necesitemos.  Les dejo algunos links de ese estilo que, si
       ya saben python y tienen ganas de ponerse a hacer algo sin tener
       que ir 'de a poco', lo puedan hacer:

       * telserv:
         https://pypi.org/project/telserv/0.1/

       * Guia CodeProject:
         https://www.codeproject.com/Articles/173416/A-Simple-Telnet-Server-in-Python

       * telnetlib asyncio: https://pypi.org/project/telnetlib3/

       * Otra libreria de server telnet, piola:
         https://github.com/ianepperson/telnetsrvlib

       Si quieren ver como se desarrolla un BBS moderno usando Node.js
       por ejemplo, no dejen de revisar enigma 1/2:
       https://enigma-bbs.github.io/

       [=-------------------------------------------------------------------------=]


       Comencemos por crear la base de nuestro BBS. Sugiero utilicen
       Linux, *BSD. En mi caso estoy usando WSL2 desde Windows 10,
       donde tengo un Ubuntu.

       --> SOURCE: bbs01.py <------------------------------------------------------

       00 #!/usr/bin/env python3
       01
       02 def main():
       03     print('BBS01 - Tutorial Script Python de BBS - 0x01')
       04
       05
       06 # Ejecutar main() si este .py es ejecutado desde el shell
       07 if __name__ == '__main__':
       08     main()

       ----------------------------------------------------------------------------

       Ahora desde el shell:

       src $ chmod +x bbs01.py
       src $ ./bbs01.py
       BBS01 - Tutorial Script Python de BBS - 0x01
       src $


       Como ven, súper útil. :P - Que vemos allí?

       a) Linea 00: El código a partir de linea 1 se interpreta por
       python3 en un entorno modificado (es mejor usar /usr/bin/env
       python3 que /usr/bin/python3 directamente).  Este entorno
       modificado lo crea el aplicativo "env", y pueden revisar su
       breve página del manual con "man env".

       b) Linea 02: definicion de la función a la que le pusimos 'main'
       de nombre. Esta funcion tiene una única instrucción, que es un
       simple print.  Nótese que hay 4 espacios (o un TAB si es que
       prefieren usar tabs, yo prefiero espacios).  Todo lo que a
       partir de ese def continue con 4 espacios, (u 8, etc, ya verán)
       pertenece a main().

       c) Linea 06: un comentario - Siempre con # al comienzo de la
       linea.  Se pueden poner comentarios al final de una sentencia,
       ya veremos.

       d) Linea 07: se ejecutará la linea 08 (llamada a la funcion
       main()) siempre que la variable especial __name__ tenga el valor
       (tambien especial) '__main__'.  - Nótese otra vez el uso de los
       4 espacios en la línea 08.  Es igual que cuando definimos una
       función, solo que en este caso en vez "def" es un if.


       La verdad, nuestro primer script no hace nada útil, lo que nos
       lleva a investigar que cosas piolas nos da el ecosistema de
       Python.  Les dejo unos links:

       * Cosas que Python trae nativamente (apunto a la ultima version,
         pero lógico, si el python que tienen disponible es mas viejo,
         pueden ajustar directo desde la web).  Si UNICAMENTE usasemos
         funcionalidad de la Libreria Estándar, no seria necesario
         instalar nada más. https://docs.python.org/es/3/library/

       * Libreria SQLITE3, parte de la Libreria Estándar de Python:
         https://docs.python.org/es/3/library/sqlite3.html

       * Repositorio Pypi, permite buscar y con la tool pip instalar
       librerias adicionales, por ejemplo, alguna para servidor de
       telnet:

         https://pypi.org/search/?q=telnet+server

       Ahora, si nos ponemos a pensar, necesitamos verdaderamente un
       servidor telnet?  No es un BBS simplemente un tipo de shell
       especial?  Quizá valga la pena aprovechar alguno de los tantos
       telnet servers disponibles en sistemas tipo unix...

       Nota curiosa: Aquellos que hayan sido usuarios MP OnLine!
       recordarán que antes de ingresar el nombre de usuario y clave,
       se debia indicar el servicio, y uno ponia MP, o BBS o algo así.

       Esto es porque ese era un USUARIO sin clave, que ejecutaba el
       shell de BBS. Cuando nos podia el usuario, efectivamente ya
       estabamos ingresados en el sistema Unix remoto con el usuario
       "MP" (el del prompt Servicio:), y listo.

       Por tanto, y para simplificar el desarrollo y depuración,
       continuaremos desarrollando este script de BBS en Python
       asumiendo que será el SHELL con el que el o los usuarios
       (dependiendo del esquema de autenticación que usemos) se
       encontrarán al ingresar al sistema.

       Adicionalmente, esto nos permitiria, por ejemplo, tener un
       script para registración que se encuentre separado de los
       archivos y procesos del BBS (= usuarios registrados y
       autorizados).

       Para finalizar, modificaremos nuestro bbs01.py para que
       incorpore algunas secuencias ANSI:


       --> SOURCE: bbs01b.py <------------------------------------------------------

       #!/usr/bin/env python3


       def main():
           print('\033[2J\033[0;0H')  # limpiar pantalla
           print('\033[0;0H')  # ir a esquina superior izquierda
           print('\033[1;40;32m')  # Verde (32) brillante (1), negro de fondo (40)
           print('Bienvenido al BBS Pythonico ATDT!')
           print('\033[0;37m\n')  # Sacar brillo (0), gris (37)


       # Ejecutar main() si este .py es ejecutado desde el shell
       if __name__ == '__main__':
           main()

       ----------------------------------------------------------------------------

       Si ahora lo ejecutan, verán como se limpia la pantalla y aparece
       el mensaje en verde brillante.

       TAREA PARA EL HOGAR: Investigar como leer el contenido de un
       archivo y mostrarlo en pantalla. Usaremos esto para leer algún
       .ANS que actuará de "intro" para nuestro bbs. Invito al resto
       del equipo de ATDT y lectores a enviarnos intros .ans

       HINT: buscar ejemplos que utilicen el keyword "with" para el
       metodo open().


       PROXIMOS TEMAS:

       * Librerias de templating
       * Librerias para manejar cursores y poder armar menues
       * Criptografía

       A programar que hace bien!!!

       _________________________________________________________________________________
       !EOF -> atdt-zine-0x01-08.txt