Está en la página 1de 24

Primera Programación Científica Avanzada en Python -

Latinoamérica (ASPP LATAM – 1st Advanced Scientific


Programming in Python)

Una instancia de la Escuela de Verano de la ASPP para el público latinoamericano.

Verano de 2023 en Ciudad de México

Para mas información y referencia desde el sitio web: https://latam.aspp.school/wiki/start

INTRODUCCIÓN

Los científicos dedican cada vez más tiempo a escribir, mantener y depurar software. Si bien las
técnicas para hacer esto de manera eficiente han evolucionado, solo unos pocos científicos han
sido capacitados para usarlas. Como resultado, en lugar de investigar, pasan demasiado tiempo
escribiendo código deficiente y reinventando la rueda. En esta escuela, presentaremos una
selección de técnicas de programación avanzadas y mejores prácticas que son estándar en la
industria, pero especialmente adaptadas a las necesidades de un científico de programación. Las
conferencias están diseñadas para ser interactivas y dar a los estudiantes suficiente tiempo para
adquirir experiencia práctica directa con los materiales. Los estudiantes trabajarán en parejas en
toda la escuela y se unirán para practicar las habilidades recién aprendidas en un proyecto de
programación real: un entretenido juego de computadora.

Usamos el lenguaje de programación Python para todo el curso. Python funciona como un
lenguaje de programación simple para principiantes, pero lo que es más importante, también
funciona muy bien en simulaciones científicas y análisis de datos. Mostramos cómo el diseño de
lenguaje limpio, la facilidad de extensibilidad y la gran cantidad de bibliotecas de código abierto
para computación científica y visualización de datos están impulsando a Python a convertirse en
una herramienta estándar para el científico de la programación.

Esta escuela está dirigida a estudiantes de maestría, doctorado y posdoctorados de todas las áreas
de la ciencia. Se requiere absolutamente competencia en Python o en otro lenguaje como Java,
C/C++, MATLAB o R. Se supone un conocimiento básico de Python y de un sistema de control de
versiones como git, subversion, mercurial o bazaar. Los participantes sin experiencia previa con
Python y/o git deben trabajar con el material introductorio propuesto antes del curso.
Nos esforzamos mucho para conseguir un grupo de estudiantes que sea internacional y con
equilibrio de género: ¡vea lo lejos que llegamos en años anteriores!

Preguntas frecuentes (sitio web en inglés) Archivos (sitio web en inglés)

ASSP – LATAM

ASPP-Latam es la primera instancia de la Escuela de Verano ASPP destinada al público de la región


latinoamericana del mundo. ASPP se lleva a cabo en el continente europeo desde hace más de 10
años con 14 instancias en 7 países diferentes. Una edición de la escuela de verano para el público
de la región de Asia-Pacífico del mundo, ASPP-APac, ya se lleva a cabo en el continente australiano
por dos años consecutivos. Puede ver los materiales de cada instancia de ambas ediciones de la
escuela de verano en los archivos.

Facultad (sitio web en inglés) Estudiantes (sitio web en inglés)

FECHA Y UBICACIÓN

Enero 26 – Julio 1, 2023 en la Ciudad de México, México

Fecha límite de aplicación: Marzo 12, 2023, 23:59 hrs UTC.

El proceso de aplicación para la edición 2023 del ASPP-LATAM ya esta cerrado.

Los 30 participantes han sido seleccionados.

Si no pudiste aplicar dentro de la fecha límite y estas interesado en aplicar en un futuro en


próximas ediciones en el ASSP-Latam, escribe al correo latam@aspp.school para ser considerado
en una lista para el anunciamiento de la próxima edición.

Lugar y viaje (sitio web en inglés)

PROGRAMA

Nota importante: El lenguaje oficial de la escuela será en Inglés.

 Control de versiones con git y cómo contribuir a proyectos de código abierto con GitHub.
 Mejores prácticas en visualización de datos.
 Prueba y depuración de código científico.
 Número Avanzado.
 Organizar, documentar y distribuir código científico.
 Python científico avanzado: gestores y generadores de contexto.
 Escribir aplicaciones paralelas en Python.
 Perfilado y aceleración de código científico con Cython y numba.
 Programación en equipos.
Cronograma (sitio web en inglés)

PATROCINADORES

Gracias al generoso apoyo de la SECTEI, podemos realizar la 1ra edición de la escuela de verano
ASPP-LatAm. Su contribución refleja su compromiso con la empresa social y su misión de promover
una cultura de cambio e innovación digital, con un enfoque particular en la integración, la
comunicación y el crecimiento económico y social.

Aplicar (sitio web en inglés, la edición 2023 por el momento se encuentra finalizada)

ASPP LATAM 2023, Mexico git and github

A partir del repositorio Git que funciona como recopilador de los elementos ocupados durante el
curso. A continuación, la traducción de los elementos que se alojan en la dirección:
https://github.com/aspp-latam/2023-mexico-git-and-github
UBICACIÓN

¡La participación en la escuela de verano es gratuita, es decir, no se cobra ninguna tasa ! Sin
embargo, los participantes deben hacerse cargo de los gastos de viaje, manutención y alojamiento
por sí mismos. Es posible que haya fondos limitados disponibles para apoyar el alojamiento de los
participantes, pero la participación de los solicitantes no debe estar condicionada a ello. Se
publicará más información en este sitio en el futuro.

Ciudad de México

Ciudad de México es la capital de México y es la ciudad más poblada de América del Norte con
aproximadamente una población de 9 millones de personas (21 millones de personas dentro del
área urbana total). Está ubicada en el Valle de México (“Valle de México”), un gran valle en las altas
mesetas del centro de México, a una altitud de 2,240 metros (7,350 pies) la ciudad es uno de los
centros culturales y financieros más importantes. centros en el mundo.

Visa

México permite que 69 países y jurisdicciones ingresen a México para estudios cortos (menos de 6
meses), los países enumerados aquí no requieren una visa de visitante mexicana para ingresar a
México por negocios, turismo, estudios cortos (menos de 6 meses) o tránsito. Por favor verifique si
necesita visa para ingresar a México, seleccionando una embajada mexicana en su país. En caso de
que lo haga, por favor notifíquenos durante la solicitud.

Viajar

Viajar a la Ciudad de México es sencillo en avión desde fuera del país y en autobús o avión desde el
interior de México. La ciudad tiene dos grandes aeropuertos (MEX y NLU). Dependiendo de la
aerolínea de tu preferencia podrás llegar en una u otra. El transporte desde el aeropuerto hasta el
lugar de alojamiento de las escuelas se puede realizar a través de autobuses públicos (Metrobus),
taxis o Uber.

Alojamiento

Se espera que los participantes se hagan cargo de su viaje seguro a la Ciudad de México y de su
llegada segura al lugar de alojamiento, así como del costo de su estadía. Los costos de participación
en la escuela de verano correrán a cargo de los organizadores de ASPP-LatAm.

Evento

Nuestras conferencias se llevarán a cabo en la “Unidad de Seminarios Dr. Ignacio Chávez”, el centro
de congresos de la UNAM ubicado en el campus principal dentro del jardín botánico y reserva
ecológica de la Ciudad Universitaria.

Ciudad Universitaria (“Ciudad Universitaria”) es el campus principal de la UNAM, ubicado dentro


de la delegación de Coyoacán en la parte sur de la Ciudad de México. Fue construido durante la
década de 1950 sobre un antiguo lecho de lava solidificada para reemplazar los edificios dispersos
en el centro de la Ciudad de México, donde se encontraba el campus principal de la universidad. Se
completó en 1954 y es casi una región separada dentro de la Ciudad de México, con sus propios
reglamentos, consejos y policía. Es autónoma e independiente de una manera más fundamental
que la mayoría de las universidades del mundo. En junio de 2007, la “Ciudad Universitaria” fue
declarada Patrimonio de la Humanidad por la UNESCO.
PREGUNTAS FRECUENTES

¿Qué tipo de perfil de estudiante estás buscando?

¿No te atreves a llamarte programador porque aprendiste a programar aprendiendo-haciendo?


¿Sabe que, si pudiera dedicar una semana a tiempo completo a aprender las mejores prácticas,
podría mejorar significativamente la calidad y la eficiencia de sus esfuerzos de codificación? ¿Le
gustaría tener más confianza en la programación para poder ayudar a sus compañeros de
estudios/colegas a mejorar su programación? ¿Solo recibió una simple introducción a
C/Java/Python/Fortran en sus estudios curriculares que no incluyó ninguna experiencia práctica en
el desarrollo de software? ¿Alguien te dijo que las mujeres no son buenas programando y sientes
que eso no tiene ningún sentido? Eres el candidato perfecto para esta escuela. Esto, además de
releer la descripción de la escuela debería darle una idea clara de para qué tipo de audiencia
diseñamos la escuela.

Quiero aprender Python. ¿Es esta la escuela adecuada para mí?

No, y la razón es muy simple: hay toneladas de buenos tutoriales en línea sobre Python.
Simplemente elija uno, trabaje en él durante un par de semanas y comience a escribir pequeños
scripts en Python. Nuestra escuela no te ayudará con esto. Definitivamente una semana no es
suficiente para aprender un lenguaje de programación, ni siquiera uno simple como Python. Por
eso requerimos conocimientos previos de Python. Si no conoce Python, pero domina otro lenguaje
de programación y tiene la intención de cambiar a Python y su perfil coincide con el descrito en la
primera pregunta frecuente , puede postularse. Si es aceptado, tendrás que hacer el esfuerzo de
aprender Python antes. Viniendo a la escuela. Participar en la escuela sin conocimientos previos de
Python seguramente será una gran decepción.

Ya conozco la mayoría de las cosas del programa, pero realmente me vendría bien hablar con
expertos en el campo. ¿Es esta la escuela adecuada para mí?

No precisamente. Efectivamente la escuela tiene la palabra avanzado en el título, pero eso no


quiere decir que sea un taller para programadores expertos. La escuela está diseñada para ayudar
a los científicos cuyas habilidades de programación son básicas a volverse competentes con las
mejores prácticas de desarrollo de software. Si ya está familiarizado con la mayor parte del
programa, ya está avanzado . Esto significa que estás realmente sobre cualificado para participar:
te aburrirías.

¿Es segura la Ciudad de México?

Según el Índice de Paz Global , México se ubica en el lugar 137, lo cual no es lo ideal. La Ciudad de
México es un destino turístico que recibe más de 16 millones de turistas al año. Incluso cuando la
tasa de criminalidad no es alta, la mayor parte se localiza en áreas no turísticas. Sin embargo,
recomendamos tener cuidado ya que los hurtos y los hurtos menores son comunes.

No hablo inglés, ¿aun así puedo postular?

No. Hay muchas razones por las que elegimos el inglés como idioma oficial del colegio.

Estoy trabajando para una empresa privada. ¿Puedo aplicar?


La escuela no pretende ser una alternativa de formación gratuita a las muchas y excelentes ofertas
comerciales con las que no podemos ni queremos competir. Pero si estás haciendo algún tipo de
investigación en la empresa y estás cultivando tus habilidades de programación a nivel personal,
puedes postularte: ya tuvimos varios estudiantes de empresas.

No estoy estudiando nada relacionado con la neurociencia. ¿Puedo aplicar?

Seguro. Nos esforzamos por tener un grupo multidisciplinario de estudiantes, por lo que
fomentamos solicitudes de todas las áreas de la ciencia, incluso las más exóticas.

¿Por qué utilizas la programación por pares?

Entre las muchas cosas que enseñamos durante la escuela, la programación en pares es
definitivamente una de las que más impacta la calidad y eficiencia de las habilidades de
programación de los estudiantes. Si su compañero tiene menos habilidades que usted en un tema
determinado, aprenderá mucho ayudándolo a comprender. Si su compañero tiene más habilidades
que usted, aprenderá mucho escuchándolo y observándolo. Las parejas se cambian con
regularidad, lo que genera muchas interacciones sociales agradables y garantiza que no te quedes
atrapado con alguien con quien no puedes trabajar.

¿Por qué no enseñas programación orientada a objetos?

Porque si aún no lo sabes, una conferencia de un día no es suficiente para entenderlo y utilizarlo
eficientemente. La misma conferencia sería, por otro lado, terriblemente aburrida para aquellos
que ya conocen la programación orientada a objetos. Hay muchos paradigmas de programación
que valdría la pena enseñar: programación funcional, programación procedimental o imperativa,
programación alfabetizada, etc. Desafortunadamente sólo tenemos una semana y es mejor no
enseñar algo que enseñarlo descuidadamente. Además de todo eso, algunas personas piensan que
la programación orientada a objetos es dañina.

¿Por qué no puedo usar mi propia computadora portátil para la escuela?

Hay varias razones. Primero, al usar las computadoras portátiles que proporcionamos, podemos
asegurarnos de que todos los estudiantes trabajen en un entorno consistente y no perdamos
tiempo depurando problemas de configuración o instalación local. Si desea obtener ayuda para
configurar dicho entorno en su propio sistema, habrá mucho tiempo y tutores dispuestos a ayudar,
pero fuera de las conferencias. En segundo lugar, la programación en pareja con portátiles privados
se vuelve muy difícil. Las personas tienden a ser muy tímidas al escribir en la computadora portátil
de otra persona, es posible que no estén familiarizadas con la distribución del teclado y los atajos
de teclado, pueden estar acostumbrados a un sistema operativo diferente y pueden tener miedo
de "romperlo”.

¿Por qué utilizas un videojuego como proyecto de programación y no algunos proyectos científicos
o proyectos personales de estudiantes?

Queremos que los estudiantes vivan una experiencia real de desarrollo de software colaborativo.
Esto implica que tienen que trabajar en grupos. Dada la procedencia tan diversa de nuestros
estudiantes, elegir un proyecto científico significa tener un proyecto trivial o tener un proyecto en
el que la mayoría de las personas no conocen algunos conceptos muy básicos que se necesitan
para aportar algo relevante. Utilizar un proyecto “neutral”, como es el caso de nuestro videojuego,
significa que no se requieren conocimientos previos de un dominio específico y todos los
estudiantes pueden colaborar en igualdad de condiciones. Después de todo, queremos que los
estudiantes se centren en las cuestiones de programación y no que diseñen una solución
inteligente a un problema científico inventado. Por último, pero no menos importante, el proyecto
de programación de juegos ha sido muy divertido para nuestros estudiantes y profesores
anteriores.

¿Hay becas de viaje disponibles?

Lamentablemente no. Intentamos organizar alojamiento económico para los estudiantes y


tratamos de tener siempre opciones de comida económicas, pero no tenemos recursos para
apoyar económicamente a los estudiantes.
ESTUDIANTES

ESTADÍSTICAS

Solicitantes Participantes

Pool 135 30

Nacionalidades 14 4

Países de afiliación 13 2

Género: otro 1 (0,7%) 0 (0,0%)

Género femenino 40 (29,6%) 12 (40,0%)

Género masculino 94 (69,6%) 18 (60,0%)

Puesto: estudiante de 52 (38,5%) 13 (43,3%)


doctorado

Puesto: Profesor 31 (23,0%) 6 (20,0%)

Puesto:
Año de nacimiento Postdoctorado
/ Conteo 17 (12,6%) 3 (10,0%)
1968 1 Posición:
(3.3%) Otro 15 (11,1%) 2 (6,7%)
1977 1 Puesto:
(3.3%) Empleado 14 (10,4%) 3 (10,0%)
1979 1 Puesto:
(3.3%) Técnico 6 (4,4%) 3 (10,0%)
1983 1 (3.3%)

1984 5 (16.7%)

1985 1 (3.3%)

1986 3 (10.0%)

1987 3 (10.0%)

1988 2 (6.7%)

1989 1 (3.3%)

1990 1 (3.3%) POSICIÓN Conteo


Detalles de los participantes
1991 1 (3.3%) Estudiante de doctorado 13 (43,3%)
Género Conteo Nacionalidad Conteo
1992 1 (3.3%) Profesor 6 (20,0%)
Hombres 18 (60.0%) México 27 (90.0%)
1993 2 (6.7%) Técnico 3 (10,0%)
Mujeres 12 (40.0%) Ecuador 1 (3.3%)
1994 4 (13.3%)
Afiliación Conteo Empleado 3 (10,0%)
1996 1 (3.3%) Colombia 1 (3.3%)
México 29 (96.7%) Post doctorado 3 (10,0%)
1997 1 (3.3%) Cuba 1 (3.3%)
Ecuador 1 (3.3%) Otro
FUENTE ABIERTA Conteo

Usuario 17
(56,7%)

Contribuciones menores (informes de errores, listas de correo, …) 10


(33,3%)

Contribuciones principales (corrección de errores, implementaciones de nuevas 2 (6,7%)


funciones, …)

Nunca usado/Nunca he oído hablar de él. 1 (3,3%)

PROGRAMACIÓN Conteo

Competente/Competente 21 (70,0%)

Principiante principiante/avanzado 9 (30,0%)

PYTHON Conteo

Competente/Competente 17 (56,7%)

Principiante principiante/avanzado 13 (43,3%)

VCS Conteo

git 19 (63,3%)

No, no uso habitualmente un VCS 11 (36,7%)


FACULTAD

 Carlos Cernuda , Análisis de Datos y Ciberseguridad, Facultad de Ingeniería, Mondragon


Unibertsitatea, Bilbao, España
 Carlos Echeverría , Instituto de Psicología, Humboldt-Universität zu Berlin
 Guillermo Aguilar , Departamento de Psicología Computacional, Technische Universität
Berlin
 Jakob Jordan , Departamento de Fisiología, Universidad de Berna, Suiza
 Jenni Rinker , Departamento de Sistemas Eólicos y Energéticos, Universidad Técnica de
Dinamarca
 Lisa Schwetlick , Psicología Experimental y Biológica, Universität Potsdam
 Pietro Berkes , NAGRA Kudelski, Lausana  ,
 Rike-Benjamin Schuppner , Instituto de Biología Teórica, Humboldt-Universität zu Berlin
Alemania
 Seetha Krishnan , Departamento de Neurobiología e Instituto de Neurociencia, Universidad
de Chicago, Chicago, EE. UU.
 Tiziano Zito , innoCampus, Universidad Técnica de Berlín
 Zbigniew Jędrzejewski-Szmek , Red Hat Inc., Varsovia Polonia

LISTA DE LOS ARCHIVOS DE ACUERDO CON SU ORDEN DE APARICIÓN A TRAVÉS DE LA LIGA

- SCENARIOS
- README.md
- Auth.py
- Exercise.md
- Git-commands-visualizations.pdf

ARCHIVO README (Link de acceso en el sitio web en inglés - https://github.com/aspp-latam/2023-


mexico-git-and-github/blob/main/README.md)

CONFIGURACIÓN

Siga las instrucciones para crear su propio par de claves SSH-key para usar durante la escuela:
https://latam.aspp.school/wiki/github-setup

Configuración de GitHub

1. Crear su SSH-Key-Pair
Abra una terminal e inicie la generación interactiva de un nuevo par de claves SSH.
Guarde la clave privada en la carpeta /tmp y asígnele el nombre con su nombre de pila
(sin espacios en blanco). Por ejemplo, si su nombre es Alice, guarde la clave privada
con la ruta /tmp/id_alice. Puede hacerlo así (cambiando el nombre del archivo clave
para que coincida con el suyo, por supuesto):

ssh-keygen -f /tmp/id_alice

El programa ssh-keygen le pedirá una frase de contraseña dos veces. Escriba una frase
de contraseña de su elección y recuérdela: tendrá que escribirla con bastante
frecuencia durante la escuela. IMPORTANTE: ¡No deje la frase de contraseña vacía! Si
la generación es exitosa, verá algo como esto:

ssh-keygen -f /tmp/id_alice
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /tmp/id_alice
Your public key has been saved in /tmp/id_alice.pub
The key fingerprint is:
SHA256:RJz6ek6B7z4QbUAYT0E1lbdVftsrA1khs/KUEUGxu5A student@aspp
The key’s randomart image is:
+---[RSA 3072]----+
| .==++ooX+. ..|
| .o..o.. O o. |
| .+.. * + o|
| ooo = = +|
| .+SE = ..|
| ..... o .|
| oo . o . |
| .oo o |
| ++. |
+----[SHA256]-----+

Tendrá dos archivos, uno para la clave privada /tmp/id_alice y otro para la clave
pública /tmp/id_alice.pub

2. Guardar su Public Key en el portapapeles del sistema


Mientras aún está en la terminal, guarde la clave pública en el portapapeles del
sistema para que podamos reutilizarla más tarde en GitHub. Escribe lo siguiente, por
supuesto usando tu propio nombre y no olvides la extensión .pub:

xclip -selection c /tmp/id_alice.pub

El contenido de ese archive esta ahora en el portapapeles.


3. Cargar la Public Key en su cuenta de Github
 Ahora desea que GitHub conozca su clave pública, de modo que pueda usarse
durante la escuela para una fácil autenticación en GitHub. Inicie sesión en
GitHub: https://github.com/login

 Después de iniciar sesión, haga clic en su avatar en la parte superior derecha


de la página y en el menú resultante, seleccione Configuración:

 Esto lo llevará a la página de configuración del perfil en


https://github.com/settings/profile. Allí, desde la barra lateral de navegación a
la izquierda, seleccione SSH and GPG keys:

 Esto lo llevará a https://github.com/settings/keys. Aquí presione el botón


verde a la derecha etiquetado como Nueva clave SSH:

 Esto lo llevará a https://github.com/settings/ssh/new. Aquí establezca el título


en ASPP. Deje el tipo de clave en key type de lo predeterminado en
Authentication key. Pegue la clave pública que guardó en el portapapeles del
sistema en el campo Key de esta página presionando Ctrl-V:

 Cuando haya terminado, presione el botón verde Add SSH Key que esta justo
debajo.

Ahora puede verificar que la clave haya sido agregada en la misma página:
https://github.com/settings/keys

4. Almacenamiento de la SSH Key-Pair en la memoria USB


Ahora inserte su memoria USB y cree en ella una nueva carpeta llamada ssh (todo en
minúsculas). Mueva las dos claves, la clave privada /tmp/id_alice y la clave pública
/tmp/id_alice.pub, por supuesto usando su propio nombre en esa carpeta en la
memoria USB. Asegúrese de que ambas claves estén en la carpeta. Expulse la memoria
USB del administrador de archivos.

5. Organización ASPP en Github


Si aún no lo ha hecho, acepte la invitación para unirse a la organización ASPP en
GitHub. Puedes hacerlo por:
 Inicie sesión en GitHub nuevamente https://github.com/login
 Vaya a la página de ASPP-Latam: https://github.com/aspp-latam
 Deberá ver un botón para aceptar la invitación justo en la parte superior de
esa página.
6. Verificación de autenticación en Github usando su clave pública
Para verificar que todo salió bien, vuelva a conectar la memoria USB. Debería aparecer
una ventana pidiéndole que escriba la frase de contraseña para su clave.

Abre una terminal e intenta lo siguiente:

ssh -T git@github.com

Si después de eso obtiene algo como:


Hi Alice! You've successfully authenticated, but GitHub does not provide
shell access

Todo habrá salido bien. Si al contrario obtuvo algo como:


git@github.com: Permission denied (publickey)

Algo salió mal.

CALENTAMIENTO

¿Cómo iniciar un repositorio desde scratch?

- git init metodo local


- en Github git clone y después git push --force or git pull como métodos

¿Cómo corregir errores?

- Para antes de cometer:


o git restore <file> [descartar cambios en el directorio de trabajo] cambia archivos
o git restore --staged <file> [cambios sin etapa ➔ opuesto de git add <file>, esto no
modifica el directorio de trabajo]
- Para cuando ya se cometió:
o git revert <commit> [crea una nueva entrada, modifica el directorio de trabajo]
o git reset <commit> [solo restablece el puntero HEAD, no modifica el directorio de
trabajo] reescribe la historia
o git reset --hard <commit> [restablece HEAD y modificar el directorio de trabajo]
reescribe el historial y cambia los archivos
- ¿Cómo mover todo el directorio de trabajo a un punto especifico dentro del histórico?
o git checkout <commit> -> DETACHED HEAD problema, cambia archivos
o Interacción con branches: git branch <branch_name> + git switch <branch_name>
- git gui: construye commits en el camino de forma interactiva (para el tipo de flujos de
trabajo desordenados)

EL MODELO DE CÓDIGO ABIERTO


 Remotos: git pull <from_where> <what> , git push <where> <what> , git fetch
<from_where> <what> , git merge <another_branch>
 GitHub: bifurcaciones, ramas y relaciones públicas: importante ➔ ¡¡¡explica bifurcación
versus clonación!!!
 Estrategias para mantener tu bifurcación actualizada: main y nuevamente main, ramas
temáticas de corta y larga duración.
 Puede encontrar una explicación más completa y detallada en la Guía del colaborador de
Numpy. Esta guía se puede adaptar a sus propias necesidades, consulte gitwash.
 Dejar claro que GitHub es sólo una opción (git≠GitHub)

Escenarios

1. Científico solitario trabajando solo en el sótano sin internet (git local)


2. Científico solitario que sube su software a internet con esperanza de que pueda ser útil
para otras personas (git local + un repositorio personal de GitHub)
3. Científico solitario que comparte un proyecto de software con otro científico solitario
amigo que trabaja en un lugar diferente (git local + o.p.G.r + permisos)
4. Grupo de investigación que comparte software entre miembros (git local + varios
repositorios de GitHub + permisos + sucursales + PR[opcional])

5. Desarrollo de software totalmente distribuido utilizando los flujos de trabajo de software


de código abierto más típicos como los utilizados por numpy, scipy, sklearn, etc. (como
arriba + no confiamos en nuestros contribuyentes, es decir, trabajamos estrictamente con
bifurcaciones)
Archivo auth.py

import getpass
import json
import pathlib
import random
import string
import tempfile

# nombre del archive donde almacenamos la base de datos pw


PWDB_FLNAME = pathlib.Path('pwdb.json')

# la base de datos pw se almacenará en un directorio temporal


PWDB_DEFAULTPATH = PWDB_FLNAME

# lista de caracteres válidos para salt(solo letras ASCII + dígitos + puntuación)


CHARS = string.ascii_letters + string.digits + string.punctuation

# longitud de salt
SALT_LENGTH = 5

def get_credentials():
# obtener entrada desde la terminal
username = input('Enter your username: ')
# obtener la contraseña utilizando el módulo apropiado, de modo que los caracteres
#escritos no se repitan en el terminal
password = getpass.getpass('Enter your password: ')
return (username, password)

def authenticate(username, pass_text, pwdb):


status = False
if username in pwdb:
# obtener la salt de la base de datos
salt = pwdb[username][1]
# calcular el hash y compararlo con el hash almacenado
if pwhash(pass_text, salt) == pwdb[username][0]:
status = True
return status

def add_user(username, password, salt, pwdb, pwdb_path):


# no intentes agregar un nombre de usuario dos veces
if username in pwdb:
raise Exception('Username already exists [%s]' %username)
else:
pwdb[username] = (pwhash(password,salt), salt)
write_pwdb(pwdb, pwdb_path)

def read_pwdb(pwdb_path):
# intenta leer desde la base de datos
# si algo ocurre, reportarlo!
try:
with open(pwdb_path, 'rt') as pwdb_file:
pwdb = json.load(pwdb_file)
except json.decoder.JSONDecodeError as exc:
# esto sucede cuando los datos json no son válidos
raise Exception(f'Invalid database {pwdb_path}: {exc}')
except Exception as exc:
# esta es una condición general
raise Exception(f'Unkown error reading {pwdb_path}: {exc}')
return pwdb

def write_pwdb(pwdb, pwdb_path):


with open(pwdb_path, 'wt') as pwdb_file:
json.dump(pwdb, pwdb_file)

def pwhash(pass_text, salt):


# hash aditivo simple -> muy inseguro!
hash_ = 0
full_pass_text = pass_text + salt
for idx, char in enumerate(full_pass_text):
# use idx como multiplicador, de modo que al mezclar los caracteres se obtenga
#un hash diferente
hash_ += (idx+1)*ord(char)
return hash_

def get_salt():
salt_chars = random.choices(CHARS, k=SALT_LENGTH)
return ''.join(salt_chars)

if __name__ == '__main__':
# preguntar por las credenciales
username, password = get_credentials()

# si la base de datos aún no existe, cree una vacía de forma predeterminada


if not PWDB_DEFAULTPATH.exists():
write_pwdb({}, PWDB_DEFAULTPATH)

# cargar la base de datos de contraseñas desde el archivo


pwdb = read_pwdb(PWDB_DEFAULTPATH)

# trate de autenticar
if authenticate(username, password, pwdb):
print('Successfully authenticated!')
elif username not in pwdb:
# si el usuario no es conocido, preguntar si se debe agregar un nuevo usuario
ans = input('Create new user [y/n]? ')
if ans == 'y':
salt = get_salt()
add_user(username, password, salt, pwdb, PWDB_DEFAULTPATH)
else:
# reporte contraseña incorrecta
print('Wrong password!')

Archivo exercise.md

Crear un sistema de autenticación simple

Una alternativa a los irremediablemente aburridos ejemplos de “Hola mundo” para una
introducción a git.

Comience a crear un script llamado auth.py

USO ESPERADO:

- Ejecutar el script
- El script pide nombre de usuario y contraseña
- Si el usuario es conocido y la contraseña es correcta  imprima “¡Autenticado
exitosamente!”
- Si el usuario es conocido y la contraseña es incorrecta  imprima “¡Contraseña
incorrecta!”
- Si el usuario no es conocido  solicite agregar el usuario a la base de datos de contraseñas
- Si se ha agregado un usuario  almacenar la base de datos actualizada en el disco

API BASICA:

- Una función get_credentials que pregunte por nombre de usuario y contraseña


- Una función authenticate que cheque si el usuario está en la base de datos de contraseñas
y si la contraseña es correcta
- Una función add_user para añadir un usuario nuevo agregando la contraseña a la base de
datos
- Una función read_pwdb para leer la base de datos de contraseñas desde el disco
- Una función write_pwdb para escribir una contraseña en la base de datos en el disco

SUGERENCIAS:

- La base de datos puede ser un diccionario simple {username: password}


- La base de datos puede ser serializada al disco con json
- Para experimentar puedes almacenar la base de datos en un directorio temporal
- Recuerda escribir la base de datos en el disco cada vez que añades un usuario nuevo

MÁS ADELANTE, PIENSE EN LOS SIGUIENTES PROBLEMAS:

- Estamos filtrando nombres de usuario válidos  devolvemos un error genérico si el


nombre de usuario no existe o la contraseña es incorrecta
- Password hashing  no almacene contraseñas en texto claro (la base de datos podría ser
robada, los administradores son entrometidos). Solución: No almacene contraseñas en
absoluto, solo sus hashes (la base de datos podría ser robada)
- Password salting  descifrar uno no descifra todos: mitiga los ataques de diccionario, ver
más abajo

ADICIÓN A LA API BÁSICA:

- Una función pwhash que dada una contraseña y un salto devuelve un hash
- Una función get_salt que retorne un salto único

INTENTA DESCIFRARLO (AVANZADO)

- ¿Puedes adivinar el riesgo de colisión de hash para la solución propuesta?


- Pruebe primero un ataque de fuerza bruta: ¿es factible?
- Pruebe un ataque de diccionario (puede utilizar esta lista de contraseñas probables: ¿es
factible?
- Piense en las tablas de búsqueda y los ataques a las tablas arcoíris
- ¿Cuáles son las ventajas y desventajas de los diferentes ataques?

NOTAS:

Para hacerlo real:

- Archivo temporal inseguro (ataque de carrera de enlace simbólico)  tempfile y sus


administradores de contexto
- Mejor forma de generar contraseñas o tokens aleatorios: el módulo de secretos
- Descifrar una base de datos de contraseñas es una forma de arte, consulte por ejemplo, el
descifrador de contraseñas de John the Ripper o Hashcat o Brutus

También podría gustarte