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

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:

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.

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:

    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:

    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):

    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 ~:

    cd ~
    
  2. Lista el contenido del subdirectorio Documentos sin cambiar al directorio:

    ls ~/Documentos
    

Ejercicio 5:

Navegar a la raíz del sistema y listar directorios importantes

  1. Cambia al directorio raíz del sistema:

    cd /
    
  2. Lista el contenido de los directorios /etc, /var y /bin usando una sola instrucción ls:

    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: 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: 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: 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: 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 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: 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: 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 cd ~/prueba_ssh y luego usen 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: touch nombre_de_archivo Este comando crea un archivo vacío si el archivo especificado no existe.

  • Borrar un archivo: rm nombre_de_archivo Este comando elimina el archivo especificado permanentemente.

  • Ejemplo: Usar touch temp.txt para crear un archivo llamado temp.txt, y luego 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: 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: 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`: 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.

    Advertencia

    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 rm -rf ~/prueba_ssh.

Advertencia

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.

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.