_________________________________________________________________________________
/*
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