================================================ Sesión 1 - Introducción al Curso de Programación ================================================ Descripción del Curso: Introducción a la Programación y Métodos Numéricos ========================================================================= Este curso está diseñado para introducir a los estudiantes en los fundamentos de la programación y los métodos numéricos utilizando Python en un entorno Linux. A lo largo de 14 semanas (28 sesiones presenciales), desarrollaremos habilidades desde comandos básicos de terminal hasta algoritmos avanzados de búsqueda aplicados a la robótica. Objetivos Generales ------------------- * Dominar los conceptos fundamentales de programación en Python * Familiarizarse con el entorno Linux y su sistema de archivos * Aplicar estructuras de datos y algoritmos a problemas prácticos * Desarrollar habilidades en programación orientada a objetos * Utilizar el simulador Webots para implementar soluciones robóticas Introducción a Linux ==================== .. role:: bash(code) :language: bash Linux es un sistema operativo basado en Unix que destaca por ser de código abierto y altamente personalizable. Desarrollado inicialmente por Linus Torvalds en 1991, Linux ha evolucionado gracias a contribuciones de programadores de todo el mundo, convirtiéndose en uno de los sistemas operativos más utilizados en servidores, sistemas embebidos, dispositivos móviles (a través de Android) y cada vez más en entornos de escritorio. La popularidad de Linux se debe a su robustez, seguridad y flexibilidad, además de su capacidad para adaptarse a una amplia variedad de hardware. Al ser un sistema de código abierto, los usuarios tienen la libertad de modificar y distribuir el código, lo que fomenta una comunidad activa y constante innovación. Existen múltiples distribuciones de Linux, conocidas como "distros", cada una adaptada a diferentes necesidades y preferencias, desde distribuciones orientadas a servidores (como CentOS y Ubuntu Server) hasta aquellas para usuarios de escritorio (como Ubuntu y Fedora). Sistema de Archivos de Linux ----------------------------- El sistema de archivos de Linux sigue una jerarquía de directorios única y bien estructurada, basada en el estándar Filesystem Hierarchy Standard (FHS). A diferencia de otros sistemas operativos, Linux organiza los archivos y directorios en una estructura en forma de árbol, en la que todos los archivos y directorios parten del directorio raíz, representado por `/`. A continuación, se presenta un diagrama que ilustra la jerarquía básica de un sistema de archivos en Linux: .. graphviz:: digraph filesystem { rankdir=LR; size="8,5" node [shape=folder]; "/" -> "/bin"; "/" -> "/etc"; "/" -> "/home"; "/" -> "/usr"; "/" -> "/var"; "/" -> "/lib"; "/home" -> "/home/usuario1"; "/home" -> "/home/usuario2"; "/usr" -> "/usr/bin"; "/usr" -> "/usr/lib"; "/usr" -> "/usr/local"; } Este diagrama ilustra la jerarquía estándar de directorios en un sistema Linux, incluyendo algunos directorios comunes y sus funciones principales: - **`/` (Raíz)**: El directorio raíz es el nivel más alto de la jerarquía. Todos los demás directorios y archivos en el sistema se encuentran dentro de él. - **`/bin`**: Contiene los binarios esenciales, es decir, los comandos básicos que pueden ser utilizados tanto por el sistema como por los usuarios. - **`/etc`**: Almacena archivos de configuración para el sistema y las aplicaciones. Incluye configuraciones para servicios de red, usuarios y dispositivos. - **`/home`**: Contiene los directorios personales de cada usuario. Cada usuario tiene un subdirectorio en `/home` que guarda sus archivos y configuraciones personales. - **`/usr`**: Este directorio contiene la mayoría de los archivos de usuario y programas instalados. Subdirectorios comunes dentro de `/usr` incluyen: - **`/usr/bin`**: Almacena binarios de aplicaciones y comandos que no son críticos para el sistema. - **`/usr/lib`**: Contiene bibliotecas compartidas usadas por los binarios de `/usr/bin`. - **`/usr/local`**: Se utiliza para almacenar programas que son instalados manualmente por el administrador del sistema. - - **`/var`**: Contiene archivos de datos variables, como registros (`/var/log`), archivos de caché y datos de aplicaciones en constante cambio. - **`/lib`**: Incluye bibliotecas esenciales compartidas por los binarios del sistema, principalmente para los ejecutables que se encuentran en `/bin` y `/sbin`. Esta estructura ayuda a mantener organizado el sistema de archivos y facilita la administración de permisos, la seguridad, y el acceso a los archivos y programas necesarios. La jerarquía de Linux permite una gestión eficiente de los archivos y directorios, lo que es crucial para su rendimiento y funcionalidad. Navegación en el Sistema de Archivos ------------------------------------- Aunque los entornos gráficos de Linux suelen incluir programas para navegar por los archivos (como el Explorador de Archivos en GNOME o Dolphin en KDE), es fundamental aprender a moverse dentro de la jerarquía de archivos utilizando la **consola** o **terminal**. La consola es una interfaz de línea de comandos que permite a los usuarios ejecutar instrucciones de texto para interactuar directamente con el sistema. A través de la consola, se pueden realizar tareas avanzadas, automatizar procesos, y administrar el sistema de forma más precisa y eficiente. Uno de los primeros pasos al navegar en la consola es saber **dónde estamos parados** en el sistema de archivos, es decir, conocer el directorio en el que nos encontramos actualmente. Esto nos ayuda a ubicarnos y a movernos en la jerarquía de directorios de Linux de manera precisa. ¿Dónde estamos parados? ^^^^^^^^^^^^^^^^^^^^^^^^ .. image:: imagenes/Donde.png :align: center Cuando abrimos una consola en Linux, veremos un **prompt** o indicador de comandos, que nos muestra información importante antes de escribir cualquier instrucción. En el ejemplo de la imagen, el prompt es: .. code-block:: bash richi@clasefis:~$ - **Desglose del Prompt**: - **`richi`**: Muestra el nombre de usuario actual, en este caso, "richi". - **`@`**: Separa el nombre de usuario del nombre del equipo. - **`clasefis`**: Indica el nombre del equipo (hostname) al que estamos conectados. - **`~`**: Representa el directorio actual; el símbolo `~` es una abreviatura para el directorio `/home/usuario`, es decir, el directorio personal del usuario. En este caso, significa que el usuario está ubicado en su directorio personal. - **`$`**: Indica que el usuario es un usuario normal (en lugar del símbolo `#`, que representaría al usuario root o superusuario). Este prompt nos proporciona información básica sobre el usuario, el equipo y la ubicación actual dentro del sistema de archivos. Para conocer la ubicación exacta en el sistema de archivos, usamos el comando ``pwd`` (print working directory), que muestra la ruta completa del directorio actual. - **Ejercicio:** Escribir en la consola el comando :bash:`pwd ` y observar la respuesta del sistema. La consola mostrará la ruta completa del directorio actual, permitiéndonos identificar nuestra ubicación dentro de la jerarquía de archivos. Comando cd (change directory) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ El comando `cd` se utiliza para cambiar el directorio en el que estamos trabajando dentro de la consola. Al cambiar de directorio, podemos acceder y gestionar archivos y carpetas en diferentes ubicaciones de la jerarquía del sistema de archivos de Linux. - **Uso básico:** :bash:`cd nombre_de_directorio` Este comando cambiará al directorio especificado, siempre y cuando exista y se tenga acceso a él. .. list-table:: :widths: 20 80 :header-rows: 1 * - Comando - Descripción * - :bash:`cd documentos` - Ir al directorio `documentos` que se encuentra dentro del directorio actual. * - :bash:`cd /usr` - Ir al directorio :bash:`usr`, que se encuentra en la raíz del sistema de archivos. * - :bash:`cd /usr/local` - Ir al directorio :bash:`local`, que se encuentra dentro del directorio :bash:`usr` en la raíz del sistema de archivos. * - :bash:`cd ..` - Subir un nivel en la jerarquía, es decir, ir al directorio padre del directorio actual. * - :bash:`cd ~` - Ir al directorio home del usuario actual. * - :bash:`cd -` - Regresar al directorio en el que se estaba antes de cambiar al directorio actual. Directorios de Atajo Comunes en Linux/Unix ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ En Linux y Unix, existen algunos atajos que facilitan la navegación entre directorios. Estos atajos permiten moverse rápidamente entre directorios comunes y agilizan el trabajo en la consola. .. list-table:: :widths: 10 90 :header-rows: 1 * - Atajo - Descripción * - ``.`` - Directorio actual. Se utiliza para referirse al directorio en el que te encuentras. Puede combinarse con otros comandos, como en `./programa`, que ejecuta el archivo `programa` en el directorio actual. * - ``..`` - Directorio padre del directorio actual. Se utiliza para navegar hacia arriba en la jerarquía del sistema de archivos. Por ejemplo, `cd ..` te lleva al directorio que contiene el directorio actual. * - ``~`` - Directorio home del usuario actual. Representa el directorio principal del usuario, usualmente ubicado en `/home/nombre_de_usuario`. Este atajo es útil para acceder rápidamente a los archivos personales. * - ``~/`` - Se utiliza para referirse a directorios específicos dentro del directorio home del usuario. Por ejemplo, `~/documentos` apunta al directorio `documentos` en el home del usuario. * - ``/`` - Directorio raíz del sistema de archivos. Es el punto más alto en la jerarquía del sistema de archivos de Linux/Unix, desde donde se despliegan todos los demás directorios y archivos. Comando `ls` ^^^^^^^^^^^^ El comando `ls` lista el contenido de un directorio en el sistema de archivos. Si no se especifica un nombre de directorio, muestra el contenido del directorio actual. Este comando es fundamental para visualizar archivos y carpetas en diferentes ubicaciones del sistema, y cuenta con opciones adicionales que permiten personalizar la información mostrada. - **Uso básico:** :bash:`ls nombre_de_directorio` Este comando mostrará el contenido del directorio especificado. .. list-table:: :widths: 20 80 :header-rows: 1 * - Comando - Descripción * - :bash:`ls` - Listar el contenido del directorio actual. * - :bash:`ls documentos` - Listar el contenido del directorio :bash:`documentos` que se encuentra dentro del directorio actual. * - :bash:`ls /usr/local` - Listar el contenido del directorio :bash:`local` que se encuentra dentro del directorio :bash:`usr`, que está en la raíz del sistema de archivos. Opciones Comunes de `ls` ^^^^^^^^^^^^^^^^^^^^^^^^ Existen varias opciones útiles para el comando `ls` que permiten mostrar más detalles sobre los archivos y directorios: - **`-l`**: Muestra una lista detallada, incluyendo permisos, número de enlaces, propietario, grupo, tamaño y fecha de última modificación. - **Ejemplo**: :bash:`ls -l` - **`-a`**: Muestra todos los archivos, incluyendo los archivos ocultos (que comienzan con `.`). - **Ejemplo**: :bash:`ls -a` - **`-h`**: Muestra los tamaños de los archivos en un formato legible para humanos (por ejemplo, KB, MB), útil junto con `-l`. - **Ejemplo**: :bash:`ls -lh` - **`-R`**: Lista el contenido de los subdirectorios de forma recursiva, mostrando todos los niveles de carpetas y archivos dentro del directorio. - **Ejemplo**: :bash:`ls -R` Estas opciones pueden combinarse para obtener información detallada y organizada sobre los archivos y carpetas. Por ejemplo, :bash:`ls -lha` muestra todos los archivos (incluidos los ocultos) en formato detallado y con tamaños legibles para humanos. Ejercicios de Navegación en el Sistema de Archivos -------------------------------------------------- A continuación, se presentan cinco ejercicios para practicar el uso de los comandos ``cd`` y ``ls``, utilizando tanto rutas absolutas como relativas: Ejercicio 1: ^^^^^^^^^^^^ Cambiar al directorio home usando una ruta absoluta. 1. Utiliza ``cd`` para cambiar al directorio home de tu usuario. Por ejemplo, si tu usuario es ``usuario``, escribe: .. code-block:: bash cd /home/usuario 2. Usa ``ls`` para listar el contenido de tu directorio home. Ejercicio 2: ^^^^^^^^^^^^ Navegar a un directorio utilizando una ruta relativa 1. Suponiendo que te encuentras en ``/home/usuario``, cambia al directorio ``Documentos`` utilizando una ruta relativa: .. code-block:: bash cd Documentos 2. Lista el contenido del directorio ``Documentos``. Ejercicio 3: ^^^^^^^^^^^^ Regresar al directorio padre y listar su contenido 1. Desde ``/home/usuario/Documentos``, utiliza una ruta relativa para regresar al directorio padre (``/home/usuario``): .. code-block:: bash cd .. 2. Lista el contenido del directorio padre. Ejercicio 4: ^^^^^^^^^^^^ Usar el atajo ``~`` para cambiar al directorio home y listar un subdirectorio 1. Cambia al directorio home utilizando el atajo ``~``: .. code-block:: bash cd ~ 2. Lista el contenido del subdirectorio ``Documentos`` sin cambiar al directorio: .. code-block:: bash ls ~/Documentos Ejercicio 5: ^^^^^^^^^^^^ Navegar a la raíz del sistema y listar directorios importantes 1. Cambia al directorio raíz del sistema: .. code-block:: bash cd / 2. Lista el contenido de los directorios ``/etc``, ``/var`` y ``/bin`` usando una sola instrucción ``ls``: .. code-block:: bash ls /etc /var /bin Usando `man` e `info` ---------------------- En Linux, los comandos `man` e `info` son herramientas para acceder a documentación sobre otros comandos: - **`man` (manual)**: Proporciona información detallada y técnica sobre un comando, incluidas sus opciones, sintaxis y ejemplos. Cada página de manual se organiza en secciones, facilitando la búsqueda de detalles específicos. - **Ejemplo de uso**: :bash:`man ls` - **`info`**: Ofrece documentación en un formato más legible, estructurada en secciones con enlaces navegables. Este formato permite una navegación más sencilla en comandos con documentación extensa. - **Ejemplo de uso**: :bash:`info ls` - **Ejercicio**: Usen `man ls` y `info ls` para explorar la documentación y las opciones del comando `ls`. Observen las diferencias entre ambos formatos. Creación de Carpetas con `mkdir` -------------------------------- El comando `mkdir` (make directory) permite crear nuevas carpetas o directorios en el sistema de archivos, lo cual es útil para organizar archivos según su propósito o proyecto. - **Uso básico**: :bash:`mkdir nombre_de_carpeta` Este comando creará un nuevo directorio con el nombre especificado en la ubicación actual, o se puede especificar una ruta para crearlo en otra ubicación. - **Ejemplo**: :bash:`mkdir nueva_carpeta` crea una carpeta llamada `nueva_carpeta` en el directorio actual. - **Ejercicio**: Crear una carpeta llamada `prueba_ssh` en su directorio de usuario. Para hacer esto, usen :bash:`mkdir ~/prueba_ssh`, lo que colocará la carpeta en el directorio home del usuario. Creación y Edición de Archivos con `nano` ----------------------------------------- `nano` es un editor de texto en línea de comandos, sencillo y fácil de usar, ideal para crear y editar archivos de texto directamente en la terminal. - **Uso básico**: :bash:`nano nombre_de_archivo` Este comando abrirá el archivo en `nano`, permitiendo que se edite. Si el archivo no existe, `nano` lo creará automáticamente. - **Ejemplo**: :bash:`nano nota.txt` abrirá (o creará) el archivo `nota.txt` para edición en el directorio actual. - **Ejercicio**: Crear y editar un archivo `nota.txt` dentro de la carpeta `prueba_ssh` creada previamente. Para hacer esto, naveguen a la carpeta con :bash:`cd ~/prueba_ssh` y luego usen :bash:`nano nota.txt` para crear y editar el archivo. Creación y Borrado de Archivos ------------------------------ En Linux, el comando `touch` se utiliza para crear archivos vacíos rápidamente, mientras que `rm` se emplea para borrarlos. - **Crear un archivo**: :bash:`touch nombre_de_archivo` Este comando crea un archivo vacío si el archivo especificado no existe. - **Borrar un archivo**: :bash:`rm nombre_de_archivo` Este comando elimina el archivo especificado permanentemente. - **Ejemplo**: Usar :bash:`touch temp.txt` para crear un archivo llamado `temp.txt`, y luego :bash:`rm temp.txt` para borrarlo. - **Ejercicio**: Crear un archivo llamado `temp.txt` en el directorio actual utilizando `touch`, y luego borrarlo con `rm`. Borrado de Carpetas -------------------- Para borrar carpetas en Linux, se utilizan los comandos `rmdir` y `rm`, cada uno con diferentes opciones y niveles de precaución: - **Borrar carpetas vacías**: :bash:`rmdir nombre_de_carpeta` Este comando elimina una carpeta únicamente si está vacía, lo que lo convierte en una opción segura cuando no hay archivos dentro. Es útil para mantener el orden eliminando directorios sin contenido. - **Borrar carpetas y su contenido**: :bash:`rm -r nombre_de_carpeta` Este comando elimina la carpeta especificada junto con todos sus archivos y subdirectorios. La opción `-r` (recursivo) permite borrar todo el contenido dentro de la carpeta, lo cual es útil para eliminar directorios completos. - **Forzar el borrado con `rm -rf`**: :bash:`rm -rf nombre_de_carpeta` El comando `rm -rf` combina las opciones recursiva (`-r`) y forzada (`-f`), eliminando la carpeta y todo su contenido sin pedir confirmación al usuario. Esto incluye subdirectorios, archivos de solo lectura y archivos protegidos. **Advertencia**: Este comando es extremadamente poderoso y debe usarse con mucho cuidado, ya que elimina permanentemente todo lo especificado sin posibilidad de recuperación. Un error en la ruta o en el nombre del directorio podría resultar en la pérdida de datos importantes. - **Borrar todo el contenido de un directorio con `rm -rf *`**: El comando `rm -rf *` se usa para eliminar todo el contenido del directorio actual, incluidos todos los archivos y subdirectorios. Es importante asegurarse de estar en el directorio correcto antes de ejecutar este comando, ya que un uso incorrecto podría eliminar archivos críticos del sistema. .. warning:: Si ejecutas `rm -rf *` en el directorio raíz `/`, puedes dañar gravemente el sistema eliminando archivos de sistema esenciales y posiblemente dejando el sistema inoperable. **Verifica siempre tu ubicación con `pwd` antes de usar este comando** y usa `rm -rf *` solo en directorios donde estés absolutamente seguro de que el contenido puede eliminarse sin consecuencias graves. - **Ejercicio**: Borrar la carpeta `prueba_ssh` y todo su contenido utilizando :bash:`rm -rf ~/prueba_ssh`. .. warning:: Antes de usar `rm -rf` o `rm -rf *`, verifica cuidadosamente la ruta del directorio que deseas eliminar. Estos comandos no pueden deshacerse, y un error podría afectar archivos o directorios importantes del sistema. Introducción a la Sala de Computo del departamento de Física ============================================================ Infraestructura de la Sala de Cómputo del Departamento de Física ------------------------------------------------------------------- La sala de cómputo del Departamento de Física cuenta con una infraestructura de red centralizada que facilita el trabajo académico. Esta infraestructura está organizada de la siguiente manera: 1. Conectividad a Internet: - La sala se conecta a internet a través de un gateway - Dirección IP externa: 168.176.35.111 - Proporciona acceso a internet a todos los equipos de la sala 2. Servidor Central (serversalafis): - IP interna: 192.168.10.1 - Funciona como el núcleo principal de la red - Administra la conectividad a internet y los recursos compartidos - Ofrece un entorno unificado para todos los computadores de la sala 3. Nodos de Cómputo: - Cada computador tiene una IP única en el rango 192.168.10.x - Entre los nodos se encuentran: * sala2 (192.168.10.2) * ... * sala15 (192.168.10.15) * .. * sala27 (192.168.10.27) 4. Características Principales: - Directorio home uniforme en todos los nodos - Credenciales de usuario consistentes - Gestión centralizada de recursos y accesos Esta configuración garantiza un entorno de cómputo estandarizado, seguro e interconectado para los usuarios de la sala de cómputo del Departamento de Física. .. graphviz:: digraph G { graph [dpi = 300]; graph [rankdir=LR]; node [shape=box, style=filled, fillcolor=lightyellow]; edge [color=blue]; // Definir nodos Internet [shape=cloud, fillcolor=lightblue, label="Internet\n168.176.35.111"]; Servidor [shape=ellipse, fillcolor=lightgreen, label="serversalafis\n192.168.10.1\n(168.176.35.111 externo)"]; subgraph cluster_sala { style=filled; graph [rankdir=TB]; color=lightgrey; label="Sala de Computo Física"; { rank=same; Sala2; Sala3; Sala27; } // Definir nodos de computadoras Sala2 [label="sala2\n192.168.10.2"]; Sala3 [label="sala...\n192.168.10..."]; Sala27 [label="sala27\n192.168.10.27"]; // Conectar computadoras invisiblemente para mantener el orden Sala2 -> Sala3 [style=invis]; Sala3 -> Sala27 [style=invis]; } // Conexiones Internet -> Servidor [label=" Gateway"]; Servidor -> Sala2 [style=invis]; Servidor -> Sala3 [label=" Comparte DD\ny conexión a Internet"]; // Conexión invisible para mantener la estructura; Servidor -> Sala27 [style=invis]; // Conexión invisible para mantener la estructura } Buenas Prácticas para el Sistema de Archivos Compartido ------------------------------------------------------- El sistema de archivos compartido de la sala de cómputo permite a todos los usuarios acceder a los mismos archivos y directorios desde cualquier computadora de la sala. Para aprovechar al máximo esta configuración y evitar problemas, es importante seguir algunas buenas prácticas: 1. **Organización de Directorios Personales**: * Crea una estructura de directorios clara en tu carpeta personal: ```bash mkdir -p ~/curso_python/{tareas,talleres,ejercicios,proyectos} ``` * Utiliza nombres descriptivos para tus carpetas y archivos, *evitando espacios y caracteres especiales*. * Establece una convención para nombrar archivos, por ejemplo: `taller1_grupo3.py` o `ejercicio_bucles_nombre.py`. 2. **Control de Versiones y Respaldos**: * Realiza copias de seguridad periódicas de tu trabajo: ```bash cp -r ~/curso_python ~/curso_python_backup_$(date +%Y%m%d) ``` * Para proyectos importantes, considera utilizar sistemas de control de versiones como Git. * No sobrescribas archivos funcionales; crea nuevas versiones (ejemplo: `robot_v1.py`, `robot_v2.py`). 3. **Seguridad**: * No almacenes información sensible en el sistema compartido. * Configura permisos adecuados para directorios que contengan código importante: ```bash chmod 700 ~/curso_python/proyectos/proyecto_final ``` * Recuerda que los administradores del sistema pueden acceder a todos los archivos. Estas prácticas te ayudarán a mantener tu trabajo organizado, facilitar la colaboración con otros estudiantes y aprovechar eficientemente el sistema de archivos compartido del laboratorio.