class: center, middle, inverse, title-slide # Python I ### Licenciatura en Ciencias Genómicas, UNAM ### First version: 2022-01-31; Last update: 2026-02-13 --- <style type="text/css"> /* From https://github.com/yihui/xaringan/issues/147 */ .scroll-output { height: 80%; overflow-y: scroll; } /* https://stackoverflow.com/questions/50919104/horizontally-scrollable-output-on-xaringan-slides */ pre { max-width: 100%; overflow-x: scroll; } </style> ## Contenido 1. Introducción 2. Controlador de versiones 3. Git 4. Comenzando a trabajar con Git 5. Instalar y configurar Git 6. Esquema de trabajo de Git 7. Crear un repositorio 8. Inicializar repositorio 9. Crear archivos y agregarlos a git 10. Commit 11. Ignorando archivos 12. Licencias 13. Pull Request (PR) --- ## FAIR-BioRS guidelines Siguiendo las buenas prácticas.... <img src="img/biors-guidelines-1.png" width="650px" style="display: block; margin: auto;" /> --- ## Introducción __Vamos a comenzar a hacer software, pero… ¿qué queremos lograr con el desarrollo de software?__ - Resolver algún problema - Que nuestro código pueda ser utilizado por otras personas - Que el software sea fácil de entender por mi y por los demás - Que sea fácil realizar modificaciones - ¡Colaborar con más gente! --- ## Introducción __Para lograrlo necesito...__ - Utilizar estándares de codificación - PEP8 para Python - Guías de estilo de Google https://google.github.io/styleguide/ - Utilizar notaciones o estándares de nombrado **- Snake case: (snake_case) para Python (PEP8)** - Camel case: (camelCase) para JavaScript - Upper case: UPPER_CASE -> para constantes - Buenas prácticas - Encabezado de programas - Documentación interna - Nombrado adecuado de variables y métodos/funciones - Nombrado adecuado de los programas - Organización adecuada del código (carpetas y archivos) - Compartir el código con mis compañeros para obtener retroalimentación (REVISIÓN POR PARES) **- Control de versiones del código** --- ## Control de versiones <img src="img/versiones.png" width="750px" style="display: block; margin: auto;" /> --- ## Control de versiones <img src="img/documento.png" width="400px" style="display: block; margin: auto;" /> --- ## Control de versiones <img src="img/word.gif" width="550px" style="display: block; margin: auto;" /> --- ## ¿¿Qué pasa si no controlamos versiones? Situaciones comunes: - Perdemos cambios en scripts - No sabemos qué versión generó un resultado - Archivos duplicados ``` analisis_final_v2_ok_ahora_si.py ``` .full-width[.content-box-red[Sin control de versiones, la **reproducibilidad** se vuelve difícil.]] --- ## ¿Cómo puedo controlar mi código? __Forma manual__ El versionamiento está constituido por dos dígitos, versiones primarias y secundarias (X.Y). <img src="img/versionManual.png" width="150px" style="display: block; margin: auto 0 auto auto;" /> Reglas: <img src="img/reglas.png" width="650px" style="display: block; margin: auto auto auto 0;" /> --- ## ¿Cómo puedo controlar mi código? __Forma manual__ Aplicando las reglas... - Agregar línea de código (algunos print, comentarios internos): myScript_v0.**1**.py - Cambiar el nombre de una variable: myScript_v0.**2**.py - Borrar varias funciones del código: myScript_v**1**.0.py --- ## ¿Cómo puedo controlar mi código? __Forma automática__ por medio de un sistema de control de versiones. <img src="img/controladores.png" width="450px" style="display: block; margin: auto;" /> --- ## ¿Cómo puedo controlar mi código? Un sistema de control de versiones automático es una herramienta que se encarga por nosotros de __controlar__ todos los cambios que realicemos en nuestros programas, permitiendo: - Registrar los cambios que suceden en los archivos - Regresar a versiones anteriores - Guardar quién hizo cada cambio - Tener un “undo” o “deshacer” ilimitado <img src="img/admiracion.png" width="150px" style="display: block; margin: auto 0 auto auto;" /> --- ## Evolución de estas herramientas Antes: - CVS - Subversion Ahora: - Mercurial **- Git**: Surgió en abril de 2005, creado por Linus Torvalds, el creador de Linux. <img src="img/controladores.png" width="350px" style="display: block; margin: auto;" /> --- ## ¿Por qué Git domina actualmente? - Trabajo colaborativo: Permite que varias personas pueden trabajar en el mismo proyecto sin sobrescribir el trabajo de otros. - Distribuido: Que cada persona tiene una copia completa del repositorio (con todo el historial). - Muy eficiente con el manejo del código: Git está optimizado para manejar **archivos de texto** (como código). "Es el **Instagram** de los desarrolladores" Git es la herramienta estándar actual en investigación y desarrollo. <img src="img/logo_git.png" width="250px" style="display: block; margin: auto 0 auto auto;" /> --- ## ¿Cómo trabajo con Git? __Git de manera local:__ - Solo yo puedo tener acceso al código - Puedo controlar en mi computadora los cambios que haga al código - Mi software se vuelve solo de uso personal __Git + GitHub:__ - Permitiendo trabajar conjuntamente en una idea - Formar una comunidad de varias personas trabajando en un fin común - Contribuir a mejorar el código - Acceso al código, leerlo, estudiarlo y aprender de él, e incluso hacer cambios y experimentar sin afectar el código original --- ## Trabajando con Git y GitHub <img src="img/git-github.png" width="750px" style="display: block; margin: auto;" /> --- ## Comenzando a trabajar con Git 1. Introducción 2. Controlador de versiones 3. Git 4. Comenzando a trabajar con Git 5. Instalar y configurar Git 6. Esquema de trabajo de Git 7. Crear un repositorio 8. Inicializar repositorio 9. Crear archivos y agregarlos a git 10. Commit 11. Ignorando archivos 12. Licencias 13. Pull Request (PR) <img src="img/gitLocal.png" width="350px" style="display: block; margin: auto;" /> --- ## Instalación de Git Revisar si Git está instalado - Abrir una terminal (símbolo del sistema en windows): - Ejecutar el comando: `git --version` Si Git no está disponible... _Windows:_ <https://gitforwindows.org/> _MacOS:_ <https://git-scm.com/download/mac> _Linux:_ Debian/Ubuntu: `sudo apt-get install git` Fedora: `sudo dnf install git` --- ## Crear cuenta de usuario en GitHub - Ir a la dirección: <https://github.com> ----- Nombre de usuario ----- Correo electrónico ----- Contraseña **RECOMENDACIÓN**: [Activa la autenticación de 2 pasos.](https://docs.github.com/es/authentication/securing-your-account-with-two-factor-authentication-2fa/configuring-two-factor-authentication) --- ## Configuración de Git - Abrir una terminal (Git bash en Windows): `git --version` Definiendo mi nombre y correo electrónico: `git config --global user.name ”tuNombre”` `git config --global user.email "tuEmail"` Nota: usa las comillas para especificar los valores. El **user.name** e **user.email** estarán asociados a las siguientes actividades con Git, así como con la interacción _GitHub_, por lo que el email que se defina debe ser el mismo que el de nuestra cuenta de GitHub. Para ver los valores de configuración de Git: `git config --list` --- ## Esquema de trabajo de Git <img src="img/esquemaGit.png" width="650px" style="display: block; margin: auto;" /> _Repositorio_: carpeta que contiene el seguimiento de los cambios que se realicen en el código. --- ## Creando un repositorio controlado por Git - Crear una carpeta llamada python-class `uv init python-class` - Entrar a la carpeta python-class `cd python-class` - Listar el contenido de la carpeta `ls -la` o en Windows `dir /a:h` --- ## Repositorio Git - Inicializar el repositorio Git (SOLO EN CASO DE QUE NO SE HAYA CREADO POR DEFAULT) `git init` - Revisar el repositorio `ls -la` o en Windows `dir /a:h` - Comprobar repositorio `git status` - Indicar a Git que comience a controlar dichos archivos `git add .` - Confirmar los cambios realizados `git commit –m “Agregando los archivos default”` <img src="img/gitInit.png" width="350px" style="display: block; margin: auto;" /> --- ## Controlando los cambios con Git <img src="img/flujoGit.png" width="750px" style="display: block; margin: auto;" /> --- ## Actividad **Imaginemos** que dentro del directorio `python-class`: \# Tenemos el directorio template-repo y entramos a él `$ cd template-repo/` \# Inicializamos un repositorio Git `$ git init` __¿Les parece que esta sea una buena idea?__ <img src="img/pensando.png" width="200px" style="display: block; margin: auto auto auto 0;" /> --- ## Creando un repositorio controlado por Git `git init` inicializa un repositorio Git. En caso de que usemos la herramienta **uv** para gestionar proyectos en Python el repositorio git es creado por default. Git almacena y controla todos los cambios que se hagan en el contenido del repositorio mediante el **directorio `.git`** <img src="img/admiracion.png" width="150px" style="display: block; margin: auto;" /> --- ## Controlando los cambios con Git 1. Crear y entrar al directorio `mkdir templates` `cd templates` 2. Descargar de la plataforma de cursos las plantillas: README.md y casos_prueba.md 3. Mover los archivos a la carpeta *templates* 4. Indicar a Git que comience a controlar dichos archivos `git add README.md casos_prueba.md ` 5. Confirmar los cambios realizados `git commit –m “Agregar plantillas”` --- ## Resumen - Git: sistemas de control de versiones - Esquema de trabajo de Git <img src="img/esquemaGit2.png" width="450px" style="display: block; margin: auto;" /> __Comandos Git:__ `git init` inicializar repositorio Git `git add [archivo(s)]` agregar y dar seguimiento a los archivos del repositorio Git `git commit –m “Mensaje”` Formalizar/asegurar los cambios realizados en el repositorio --- ## Comandos adicionales `git log` lista todos los commits realizados en el repositorio en orden cronológico inverso. `git log --oneline` información reducida `git status` indica el estado de los archivos que pueden ser controlados por Git, o aquellos que ya están controlados pero se han modificado <img src="img/gitlog.png" width="550px" style="display: block; margin: auto;" /> --- ## Actividad - ¿Cuál de los siguientes comandos guardaría los cambios del archivo myfile.txt a mi repositorio local de Git? 1. `$ git commit -m "my recent changes”` 2. `$ git init myfile.txt` `$ git commit -m "my recent changes”` 3. `$ git add myfile.txt` `$ git commit -m "my recent changes”` 4. `$ git commit -m myfile.txt "my recent changes"` --- ## Ignorando archivos **¿Qué pasa si hay archivos que no quiero controlar?** Por ejemplo, archivos de respaldo creados automáticamente por nuestro editor, por el sistema operativo, o aquellos archivos de prueba creados durante el análisis de nuestros datos, archivos de configuración (passwords)... **Archivo: .gitignore** Ir a la raíz de la carpeta python-class y crear directorio y archivos de prueba `cd ..` `pwd` `mkdir results` `touch results/a.out results/b.out` Comprobando el estado de nuestro repositorio `git status` Abre el archivo .gitignore en el *directorio raíz* `nano .gitignore` O bien, puedes abrirlo desde un editor gráfico Agregar la línea y guardar los cambios: `results/` Comprobando el estado de nuestro repositorio `git status` --- Ahora, ¿qué debo hacer para que no tenga nada pendiente por confirmar en mi repositorio? --- Ahora, ¿qué debo hacer para que no tenga nada pendiente por confirmar en mi repositorio? Comprobando el estado de nuestro repositorio `git status` Indicar a Git que comience a controlar dicho archivo `git add .gitignore` Confirmar los cambios realizados `git commit –m “Agregar carpeta results a gitignore”` --- __Buenas prácticas__ Crear la siguiente estructura de organización de carpetas y archivos para nuestros proyectos/programas. <img src="img/estructuraDir.png" width="650px" style="display: block; margin: auto;" /> `mkdir doc lib src test` --- ## Servicios de Hosting <img src="img/hosting.png" width="600px" style="display: block; margin: auto;" /> --- ## GitHub **GitHub** es una plataforma web que permite alojar proyectos basados en Git, haciendo más fácil a los desarrolladores compartir el código. <img src="img/github.png" width="300px" style="display: block; margin: auto;" /> --- ## GitHub - Crear cuenta de usuario - Crear nuevo repositorio - Conectar dos repositorios - Push - Pull - Pull request --- ## Crear nuevo repositorio <img src="img/crearRepo.png" width="400px" style="display: block; margin: auto;" /> --- ## Conectar dos repositorios **¡Asegurate que no haya nada pendiente por confirmar en repositorio!** NOTA 1: Revisa el nombre de la rama por defecto en el repositorio local y el repositorio remoto, ambas deben coincidir. **master** o **main** `git branch` NOTA 2: Conservar el mismo nombre `git remote add origin https://github.com/shirleyah/python_class.git` `git branch -M main` `git remote -v` <img src="img/conectarRepos.png" width="300px" style="display: block; margin: auto;" /> --- ## _Push_ : llevando los cambios al servidor remoto `git push origin main` <img src="img/push.png" width="800px" style="display: block; margin: auto;" /> --- ## Hasta ahora hemos hecho ..... <img src="img/esquemaGeneral.png" width="800px" style="display: block; margin: auto;" /> --- ## Resumen Comando vistos: git init: Inicializa un repositorio git add: Agregar un archivo (o los cambios de este) al área de preparación git commit -m "MENSAJE": Confirma los cambios realizados en determinados archivos git status: Muestra el estado de nuestro repositorio git log: Despliega el listado de _commits_ realizados en el repositorio git push: Permite subir los cambios del repositorio local al repositorio remoto [Más comandos](https://education.github.com/git-cheat-sheet-education.pdf) --- ## _Pull_ : bajando los cambios del servidor remoto (GitHub) a mi repositorio local `git pull origin main` <img src="img/pull.png" width="600px" style="display: block; margin: auto;" /> --- ## Actividad - Selecciona un archivo y modificalo desde la interfaz web de GitHub - Usa el ícomo de "lápiz" y guarda los cambios haciendo "commit" - Descarga los cambios realizados a tu repositorio local usando el comando "pull" - Revisa que los cambios se hayan descargado - Revisa el log de commits en tu repositorio --- ## GitHub Desktop Interfaz gráfica que permite la interacción con GitHub desde nuestra computadora. <https://desktop.github.com/> <img src="img/githubDesktop.png" width="200px" style="display: block; margin: auto;" /> Disponible para: Windows y MacOS. GitHub Desktop para GNU/Linux no está oficialmente respaldada por GitHub, pero... existe un desarrollo independiente: (https://github.com/shiftkey/desktop) --- ## Actividad - Descargar GitHub Desktop en nuestra computadora e instalarlo <https://desktop.github.com/> - Conocer la interfaz de GitHub Desktop *ATENCIÓN: Debes tener instalado Git antes de utilizar GitHub Desktop* - Configura tu cuenta de GitHub `Menú GitHub Desktop -> Preferences -> Accounts` - Ingresar correo y contraseña de la cuenta creada en GitHub Desktop - Agregar nuestro repositorio ----> Quienes trabajaron de manera local seleccionar "File>Add Local Repository" o "Add an Existing Repository from your local drive ..." ----> Quienes trabajaron en el servidor deberán que *clonar* el repositorio, "File>Clone Repository" --- ## Hasta ahora hemos hecho ..... <img src="img/esquemaGeneraLicense.png" width="800px" style="display: block; margin: auto;" /> --- ## Pull request (PR) .full-width[.content-box-red[Un _pull request_ es una petición para integrar propuestas o cambios de código a un proyecto.]] Un _pull request_ nos sirve para _compartir cambios_ con el resto del equipo. También mediante un _pull request_ podremos enviar nuestras **propuestas** a un repositorio de acceso abierto. Antes de __aprobar__ un pull request se debe _analizar y revisar el código_ que ha sido modificado, y una vez validado se podrán fusionar los cambios a la *rama master/main*. <img src="img/githubflowPR.png" width="250px" style="display: block; margin: auto;" /> --- ## Pull request (PR) __¿Cómo puedo contribuir en un proyecto (repositorio en GitHub)?__ Para contribuir en un proyecto que está publicado en GitHub tendremos que hacer uso de un _Pull Request_. Nota: Para enviar nuestras observaciones/cambios __no es necesario ser colaborador del proyecto__. *Actividad:* 1. Localizar un repositorio de interés en GitHub 2. Seleccionar un archivo, intentar editarlo para realizar un "fork" (crear una copia de un repositorio en tu cuenta de GitHub) y hacer los cambios. 3. Realizar los cambios necesarios en el o los archivos y hacer commit: Commit changes... -> Propose changes. Revisar sección: "Comparando cambios" 4. Crear un pull request: título, descripción, menciones, formatos, etc. <img src="img/pull-requests.jpeg" width="90px" style="display: block; margin: auto;" /> --- ## Actividad 1. Registra en el archivo excel "Repositorios GitHub de Alumnos" tu repositorio en GitHub 2. Selecciona un repositorio de tus compañerxs y pon tu nombre enseguida 3. **Colaborador**: Ve al repositorio seleccionado e identifica un archivo en el que quieras colaborar 4. Realiza una modificación (utiliza el ícono de lapiz para editar), y realiza el *fork* del repositorio 5. Confirma los cambios 6. Realizar un pull request --- ## Pull request __¿Cómo revisar/aceptar un pull request?__ Por parte del propietario o propietaria del repositorio: 1. Recibirá una notificación por email del pull request. Ver también el ícono se "notificaciones" en la interfaz de GitHub (a un costado de la foto de perfil) 2. Revisar los cambios propuestos (commits, archivos modificados, etc.) 3. Escribir un mensaje sobre lo visto en el pull request 4. Hacer "Merge pull request" y confirmar pull request 5. Descargar los cambios al repositorio local Nota: En el paso 3 y 4 el contribuidor recibirá los mensajes de notificación por email. --- ## Formas de trabajar con Git/GitHub <img src="img/formasAccesoGit.png" width="800px" style="display: block; margin: auto;" /> --- ## Conectando git con Visual Studio Code (VS Code) 1. Abrir VS Code 2. Ir al menú _File_ > _Open folder_ y seleccionar nuestro repositorio _python-class_ 3. En VS Code, ir al menú izquierdo y ver el comportamiento del repositorio 4. Dar clic sobre el ícono de "Source Control" 5. Verificar que desde ahí se puede hacer de manera gráfica: *git add*, *git commit*, *git push*, *git pull* y más 6. También se puede seguir trabajando con línea de comandos: Menú *Terminal* > _New terminal_ --- ## Actividad 1. Edita el archivo README.md modificando el encabezado 2. Confirma los cambios realizados 3. Sube los cambios al repositorio remoto 4. Asegurate que las modificaciones se encuentran en GitHub 5. Edita desde GitHub el archivo y descarga los cambios al repositorio local --- ## FAIR-BioRS guidelines Siguiendo las buenas prácticas.... <img src="img/biors-guidelines-2.png" width="650px" style="display: block; margin: auto;" /> --- ## OpenScience - Intercambiar información libremente podría ser el ideal en ciencia... <img src="img/openScience.png" width="800px" style="display: block; margin: auto;" /> Cuanto más abierto es el trabajo, más ampliamente puede ser citado y reutilizado. --- ## OpenScience __Hosting__ - De manera local en servidores de nuestro lugar de trabajo - Contratando un servicio de hosting - Usando servicios de hosting gratuitos: GitHub, GitLab, BitBucket, o SourceForge - Repositorio como Zenodo, figshare __Licencia__ - Ofrece al autor de una obra una manera simple de otorgar permiso al público en general de compartir y usar su trabajo bajo los términos y condiciones de su elección. MTI, Apachev2.0 , GNU GPLv3 <https://choosealicense.com/licenses/> --- ## Actividad Analiza las diferentes licencias que existen y agrega una a tu repositorio. - Desde la interfaz de GitHub, agrega un archivo a tu repositorio: `Add file -> Create new file` - Nombra al archivo como: LICENSE.md - Selecciona una licencia - Da clic en Review and submit - Agrega un commit de este nuevo archivo - Descarga los cambios a tu repositorio local. Usa **GitHub Desktop, la terminal o VSC** --- ## Conclusión **GitHub** más que un lugar donde alojar nuestros proyectos es una "red social" donde podemos dar a conocer nuestro trabajo y ayudar a otros proyectos colaborando de forma activa, grandes proyectos siguen creciendo gracias a la colaboración de usuarios de la comunidad. _¡Colabora en otros proyectos y comparte tus conocimientos!_ --- ## ¡Gracias! ---